diff --git a/plugins/text-editor-resources/src/components/extension/table/actions/OriginalTableDataViewer.svelte b/plugins/text-editor-resources/src/components/extension/table/actions/OriginalTableDataViewer.svelte new file mode 100644 index 0000000000..71e96895c3 --- /dev/null +++ b/plugins/text-editor-resources/src/components/extension/table/actions/OriginalTableDataViewer.svelte @@ -0,0 +1,93 @@ + + + + +
+ {#if viewletComponent} + + {:else} + + {/if} +
+
+ + diff --git a/plugins/text-editor-resources/src/components/extension/table/actions/seeOriginalTableData.ts b/plugins/text-editor-resources/src/components/extension/table/actions/seeOriginalTableData.ts index 4d09bfedcc..1eddf467b1 100644 --- a/plugins/text-editor-resources/src/components/extension/table/actions/seeOriginalTableData.ts +++ b/plugins/text-editor-resources/src/components/extension/table/actions/seeOriginalTableData.ts @@ -13,17 +13,93 @@ // import { type Editor } from '@tiptap/core' +import type { Class, Doc, Ref } from '@hcengineering/core' +import { getClient } from '@hcengineering/presentation' +import { showPopup } from '@hcengineering/ui' +import view, { type Viewlet } from '@hcengineering/view' import { findTable } from '../utils' import { getTableMetadata } from '../tableMetadata' +import OriginalTableDataViewer from './OriginalTableDataViewer.svelte' /** * Show original table data from when it was first created */ export async function seeOriginalTableData (editor: Editor): Promise { const table = findTable(editor.state.selection) - if (table === undefined) return + if (table === undefined) { + console.warn('No table found to show original data') + return + } + const metadata = getTableMetadata(table.node) - if (metadata === null || metadata === undefined) return - // Empty handler for now - console.log('See original data:', metadata) + if (metadata === null || metadata === undefined) { + console.warn('Table has no metadata to show original data') + return + } + + try { + const client = getClient() + const hierarchy = client.getHierarchy() + + // Convert string cardClass to Ref> and validate + const cardClassRef = metadata.cardClass as any + const cardClass = hierarchy.getClass(cardClassRef) + if (cardClass == null) { + console.warn('Invalid cardClass in table metadata:', metadata.cardClass) + return + } + + // Validate that we have documentIds or query to fetch original data + if ( + (metadata.documentIds === undefined || metadata.documentIds.length === 0) && + (metadata.query === null || metadata.query === undefined) + ) { + console.warn('Table metadata has no documentIds or query to show original data') + return + } + + // Load viewlet with descriptor lookup if viewletId is provided (to get config and component) + // RelationshipTable has viewletId: undefined (as per buildRelationshipTableMetadata) + let viewlet: Viewlet | undefined + let viewletWithLookup: any | undefined + if (metadata.viewletId !== undefined) { + const viewlets = await client.findAll( + view.class.Viewlet, + { _id: metadata.viewletId as Ref }, + { lookup: { descriptor: view.class.ViewletDescriptor } } + ) + viewlet = viewlets[0] + viewletWithLookup = viewlets[0] + } else { + // For RelationshipTable (no viewletId), load Table descriptor as fallback + // Table component can display both regular and relationship tables + const descriptors = await client.findAll(view.class.ViewletDescriptor, { + _id: view.viewlet.Table + }) + if (descriptors.length > 0) { + viewletWithLookup = { $lookup: { descriptor: descriptors[0] } } + } + } + + // Use documentIds if available (preserves original order), otherwise use query + const documentIds = metadata.documentIds ?? [] + + // Show original data in popup + // Note: Component is resolved from viewlet descriptor or Table descriptor as fallback + // RelationshipTable metadata has viewletId: undefined, so config comes from metadata.config + showPopup( + OriginalTableDataViewer, + { + _class: cardClassRef as Ref>, + config: metadata.config, + documentIds: documentIds.length > 0 ? documentIds : [], + query: documentIds.length === 0 ? metadata.query : undefined, + viewlet, + viewletWithLookup + }, + 'center' + ) + } catch (error) { + console.error('Failed to show original table data:', error) + } } diff --git a/plugins/view-resources/src/copyAsMarkdownTable.ts b/plugins/view-resources/src/copyAsMarkdownTable.ts index ba3e2b09f4..d16ff6a240 100644 --- a/plugins/view-resources/src/copyAsMarkdownTable.ts +++ b/plugins/view-resources/src/copyAsMarkdownTable.ts @@ -496,12 +496,24 @@ export interface TableMetadata { /** * Build metadata object from props and documents + * If viewlet is not provided, tries to find a default viewlet for the class */ -function buildTableMetadata (props: CopyAsMarkdownTableProps, docs: Doc[]): TableMetadata { +async function buildTableMetadata ( + props: CopyAsMarkdownTableProps, + docs: Doc[], + client?: Client +): Promise { + // If viewlet is not provided, try to find a default viewlet for the class + let viewletId: Ref | undefined = props.viewlet?._id + if (viewletId === undefined && client !== undefined) { + const { viewlet } = await loadViewletConfig(client, client.getHierarchy(), props.cardClass, undefined, props.config) + viewletId = viewlet?._id + } + return { version: '1.0', cardClass: props.cardClass, - viewletId: props.viewlet?._id, + viewletId, config: props.config, query: props.query, documentIds: docs.map((d) => d._id), @@ -689,7 +701,7 @@ export async function CopyAsMarkdownTable ( } // Build metadata for table refresh/diff functionality - const metadata = buildTableMetadata(props, docs) + const metadata = await buildTableMetadata(props, docs, client) await copyMarkdown(markdown, metadata) const language = getCurrentLanguage()