From 3ef28ed19bb26ebb4013bf8cc50188feb7d986e9 Mon Sep 17 00:00:00 2001 From: pengx17 Date: Fri, 6 Dec 2024 10:02:22 +0000 Subject: [PATCH] fix(core): peek db row should always show the related db row property (#8942) fix BS-1963 depends on https://github.com/toeverything/blocksuite/pull/8818 --- .../src/components/doc-properties/table.tsx | 4 ++- .../services/doc-database-backlinks.ts | 36 +++++++++++++++---- .../doc-database-backlink-info.tsx | 15 +++++--- .../src/modules/editor/entities/editor.ts | 11 ------ .../modules/peek-view/entities/peek-view.ts | 1 + .../view/doc-preview/doc-peek-view.tsx | 15 ++++++-- .../i18n/src/i18n-completenesses.json | 2 +- 7 files changed, 57 insertions(+), 27 deletions(-) diff --git a/packages/frontend/core/src/components/doc-properties/table.tsx b/packages/frontend/core/src/components/doc-properties/table.tsx index 04c9b36121..81dc3eb6b5 100644 --- a/packages/frontend/core/src/components/doc-properties/table.tsx +++ b/packages/frontend/core/src/components/doc-properties/table.tsx @@ -44,6 +44,7 @@ export type DefaultOpenProperty = } | { type: 'database'; + docId: string; databaseId: string; databaseRowId: string; }; @@ -385,8 +386,9 @@ const DocPropertiesTableInner = ({ defaultOpenProperty?.type === 'database' ? [ { - databaseId: defaultOpenProperty.databaseId, + databaseBlockId: defaultOpenProperty.databaseId, rowId: defaultOpenProperty.databaseRowId, + docId: defaultOpenProperty.docId, }, ] : [] diff --git a/packages/frontend/core/src/modules/doc-info/services/doc-database-backlinks.ts b/packages/frontend/core/src/modules/doc-info/services/doc-database-backlinks.ts index f261a2e196..6ed370db1d 100644 --- a/packages/frontend/core/src/modules/doc-info/services/doc-database-backlinks.ts +++ b/packages/frontend/core/src/modules/doc-info/services/doc-database-backlinks.ts @@ -72,7 +72,6 @@ export class DocDatabaseBacklinksService extends Service { docId: string; rowId: string; databaseBlockId: string; - databaseName: string | undefined; }) { return new Observable(subscriber => { let disposed = false; @@ -128,7 +127,14 @@ export class DocDatabaseBacklinksService extends Service { // backlinks (docid:blockid:databaseBlockId) // -> related db rows (DatabaseRow[]) - watchDbBacklinkRows$(docId: string) { + watchDbBacklinkRows$( + docId: string, + defaultItems?: { + docId: string; + databaseBlockId: string; + rowId: string; + }[] + ) { return this.docsSearchService.watchDatabasesTo(docId).pipe( distinctUntilChanged(equalComparator), map(rows => @@ -136,14 +142,32 @@ export class DocDatabaseBacklinksService extends Service { (a, b) => a.databaseName?.localeCompare(b.databaseName ?? '') ?? 0 ) ), - map(backlinks => - backlinks.map(backlink => { + map(backlinks => { + // merge default items with backlinks in indexer + const merged = [...(defaultItems ?? [])]; + + backlinks.forEach(backlink => { + // if the backlink is already in the merged list, skip it + if ( + merged.some( + item => + item.databaseBlockId === backlink.databaseBlockId && + item.rowId === backlink.rowId && + item.docId === backlink.docId + ) + ) { + return; + } + merged.push(backlink); + }); + + return merged.map(backlink => { return { ...backlink, row$: this.watchDatabaseRow$(backlink), }; - }) - ) + }); + }) ); } } diff --git a/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx b/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx index d7bba354b9..db5918fe18 100644 --- a/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx +++ b/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx @@ -170,8 +170,9 @@ export const DocDatabaseBacklinkInfo = ({ onChange, }: { defaultOpen?: { - databaseId: string; + databaseBlockId: string; rowId: string; + docId: string; }[]; onChange?: ( row: DatabaseRow, @@ -184,8 +185,11 @@ export const DocDatabaseBacklinkInfo = ({ const rows = useLiveData( useMemo( () => - LiveData.from(docDatabaseBacklinks.watchDbBacklinkRows$(doc.id), []), - [docDatabaseBacklinks, doc.id] + LiveData.from( + docDatabaseBacklinks.watchDbBacklinkRows$(doc.id, defaultOpen), + [] + ), + [docDatabaseBacklinks, doc.id, defaultOpen] ) ); @@ -200,8 +204,9 @@ export const DocDatabaseBacklinkInfo = ({ - backlink.databaseId === databaseBlockId && - backlink.rowId === rowId + backlink.databaseBlockId === databaseBlockId && + backlink.rowId === rowId && + backlink.docId === docId )} row$={row$} onChange={onChange} diff --git a/packages/frontend/core/src/modules/editor/entities/editor.ts b/packages/frontend/core/src/modules/editor/entities/editor.ts index 7955e196ce..78daa1f08a 100644 --- a/packages/frontend/core/src/modules/editor/entities/editor.ts +++ b/packages/frontend/core/src/modules/editor/entities/editor.ts @@ -153,17 +153,6 @@ export class Editor extends Entity { if (!isEqual(selector, omit(editorParams, ['mode']))) { this.setSelector(selector); } - - if (params.databaseId && params.databaseRowId) { - const defaultOpenProperty: DefaultOpenProperty = { - type: 'database', - databaseId: params.databaseId, - databaseRowId: params.databaseRowId, - }; - if (!isEqual(defaultOpenProperty, this.defaultOpenProperty$.value)) { - this.setDefaultOpenProperty(defaultOpenProperty); - } - } } finally { updating = false; } diff --git a/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts b/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts index 763041e486..4bbab3a550 100644 --- a/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts +++ b/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts @@ -24,6 +24,7 @@ export type DocReferenceInfo = { blockIds?: string[]; elementIds?: string[]; databaseId?: string; + databaseDocId?: string; databaseRowId?: string; /** * viewport in edgeless mode diff --git a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx index 878de8c916..6cba72caee 100644 --- a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx +++ b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx @@ -169,8 +169,16 @@ function DocPeekPreviewEditor({ } export function DocPeekPreview({ docRef }: { docRef: DocReferenceInfo }) { - const { docId, blockIds, elementIds, mode, xywh, databaseId, databaseRowId } = - docRef; + const { + docId, + blockIds, + elementIds, + mode, + xywh, + databaseId, + databaseDocId, + databaseRowId, + } = docRef; const { doc, editor, loading } = useEditor( docId, mode, @@ -178,8 +186,9 @@ export function DocPeekPreview({ docRef }: { docRef: DocReferenceInfo }) { blockIds, elementIds, }, - databaseId && databaseRowId + databaseId && databaseRowId && databaseDocId ? { + docId: databaseDocId, databaseId, databaseRowId, type: 'database', diff --git a/packages/frontend/i18n/src/i18n-completenesses.json b/packages/frontend/i18n/src/i18n-completenesses.json index a840973c70..53aa1d3876 100644 --- a/packages/frontend/i18n/src/i18n-completenesses.json +++ b/packages/frontend/i18n/src/i18n-completenesses.json @@ -21,4 +21,4 @@ "ur": 3, "zh-Hans": 99, "zh-Hant": 98 -} \ No newline at end of file +}