diff --git a/plugins/view-resources/src/components/CopyTableActionButton.svelte b/plugins/view-resources/src/components/CopyTableActionButton.svelte
new file mode 100644
index 0000000000..1fd18ffe95
--- /dev/null
+++ b/plugins/view-resources/src/components/CopyTableActionButton.svelte
@@ -0,0 +1,87 @@
+
+
+
+{#if canCopy}
+
+
+{/if}
diff --git a/plugins/view-resources/src/components/RelationshipTable.svelte b/plugins/view-resources/src/components/RelationshipTable.svelte
index 398877a95f..4033e27df4 100644
--- a/plugins/view-resources/src/components/RelationshipTable.svelte
+++ b/plugins/view-resources/src/components/RelationshipTable.svelte
@@ -42,7 +42,14 @@
resizeObserver,
showPopup
} from '@hcengineering/ui'
- import { AttributeModel, BuildModelKey, BuildModelOptions, ViewOptionModel, ViewOptions } from '@hcengineering/view'
+ import {
+ AttributeModel,
+ BuildModelKey,
+ BuildModelOptions,
+ ViewOptionModel,
+ ViewOptions,
+ Viewlet
+ } from '@hcengineering/view'
import { deepEqual } from 'fast-equals'
import { createEventDispatcher, onMount } from 'svelte'
import { Readable } from 'svelte/store'
@@ -67,6 +74,7 @@
export let showFooter = false
export let viewOptionsConfig: ViewOptionModel[] | undefined = undefined
export let viewOptions: ViewOptions | undefined = undefined
+ export let viewlet: Viewlet | undefined = undefined
export let totalQuery: DocumentQuery | undefined = undefined
@@ -541,11 +549,20 @@
async function handleCopyAsMarkdown (e: MouseEvent): Promise {
if (model === undefined || viewModel.length === 0) return
+
+ // Compute the actual query with viewOptions/filters applied
+ const p = await getResultQuery(hierarchy, query, viewOptionsConfig, viewOptions)
+ const resultQuery = mergeQueries(p, query)
+
await CopyRelationshipTableAsMarkdown(e, {
viewModel,
model,
objects,
- cardClass: _class
+ cardClass: _class,
+ query: resultQuery,
+ viewlet,
+ config,
+ viewOptions
})
}
diff --git a/plugins/view-resources/src/components/RelationshipTableBrowser.svelte b/plugins/view-resources/src/components/RelationshipTableBrowser.svelte
index 01ff6cede2..100c312f83 100644
--- a/plugins/view-resources/src/components/RelationshipTableBrowser.svelte
+++ b/plugins/view-resources/src/components/RelationshipTableBrowser.svelte
@@ -31,6 +31,8 @@
export let viewlet: Viewlet | undefined = undefined
export let readonly = false
+ let table: RelationshipTable
+
onMount(() => {
;(document.activeElement as HTMLElement)?.blur()
})
@@ -46,6 +48,7 @@
diff --git a/plugins/view-resources/src/components/Table.svelte b/plugins/view-resources/src/components/Table.svelte
index 995f127b8b..3160f936f4 100644
--- a/plugins/view-resources/src/components/Table.svelte
+++ b/plugins/view-resources/src/components/Table.svelte
@@ -42,7 +42,14 @@
mouseAttractor,
resizeObserver
} from '@hcengineering/ui'
- import { AttributeModel, BuildModelKey, BuildModelOptions, ViewOptionModel, ViewOptions } from '@hcengineering/view'
+ import {
+ AttributeModel,
+ BuildModelKey,
+ BuildModelOptions,
+ ViewOptionModel,
+ ViewOptions,
+ Viewlet
+ } from '@hcengineering/view'
import { deepEqual } from 'fast-equals'
import { createEventDispatcher, onMount } from 'svelte'
import { showMenu } from '../actions'
@@ -55,6 +62,7 @@
import { Readable } from 'svelte/store'
import { getResource } from '@hcengineering/platform'
import { canChangeAttribute } from '../permissions'
+ import { CopyAsMarkdownTable, type CopyAsMarkdownTableProps } from '../copyAsMarkdownTable'
export let _class: Ref>
export let query: DocumentQuery
@@ -70,6 +78,7 @@
export let showFooter = false
export let viewOptionsConfig: ViewOptionModel[] | undefined = undefined
export let viewOptions: ViewOptions | undefined = undefined
+ export let viewlet: Viewlet | undefined = undefined
export let totalQuery: DocumentQuery | undefined = undefined
@@ -365,6 +374,26 @@
}
return true
}
+
+ export async function copyTableAsMarkdown (evt: Event): Promise {
+ if (objects.length === 0) {
+ return
+ }
+
+ // Compute the actual query with viewOptions/filters applied
+ const p = await getResultQuery(hierarchy, query, viewOptionsConfig, viewOptions)
+ const resultQuery = mergeQueries(p, query)
+
+ const props: CopyAsMarkdownTableProps = {
+ cardClass: _class,
+ viewlet,
+ config,
+ query: resultQuery,
+ valueFormatter: undefined
+ }
+
+ await CopyAsMarkdownTable(objects, evt, props)
+ }
{#if !model || isBuildingModel}
diff --git a/plugins/view-resources/src/components/TableBrowser.svelte b/plugins/view-resources/src/components/TableBrowser.svelte
index c7870cc746..2a3bbe86d9 100644
--- a/plugins/view-resources/src/components/TableBrowser.svelte
+++ b/plugins/view-resources/src/components/TableBrowser.svelte
@@ -85,6 +85,7 @@
{tableId}
{viewOptions}
viewOptionsConfig={viewOptionsConfig ?? viewlet?.viewOptions?.other}
+ {viewlet}
selection={listProvider.current($focusStore)}
{readonly}
on:row-focus={(evt) => {
diff --git a/plugins/view-resources/src/copyAsMarkdownTable.ts b/plugins/view-resources/src/copyAsMarkdownTable.ts
index d16ff6a240..6dfb1aec93 100644
--- a/plugins/view-resources/src/copyAsMarkdownTable.ts
+++ b/plugins/view-resources/src/copyAsMarkdownTable.ts
@@ -32,7 +32,8 @@ import viewPlugin, {
type Viewlet,
type AttributeModel,
type BuildModelKey,
- type BuildMarkdownTableMetadata
+ type BuildMarkdownTableMetadata,
+ type ViewOptions
} from '@hcengineering/view'
import presentation, { getClient } from '@hcengineering/presentation'
import { getName, getPersonByPersonId } from '@hcengineering/contact'
@@ -476,7 +477,10 @@ export interface CopyRelationshipTableAsMarkdownProps {
objects: Doc[]
cardClass: Ref>
valueFormatter?: ValueFormatter
- query?: DocumentQuery // Original query used to fetch documents
+ query?: DocumentQuery // Actual query with filters applied
+ viewlet?: Viewlet // The viewlet being used (if any)
+ config?: Array // The actual config from viewlet/preferences
+ viewOptions?: ViewOptions // View options including filters
}
/**