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
This commit is contained in:
pengx17
2024-12-06 10:02:22 +00:00
parent aadc978357
commit 3ef28ed19b
7 changed files with 57 additions and 27 deletions

View File

@@ -44,6 +44,7 @@ export type DefaultOpenProperty =
} }
| { | {
type: 'database'; type: 'database';
docId: string;
databaseId: string; databaseId: string;
databaseRowId: string; databaseRowId: string;
}; };
@@ -385,8 +386,9 @@ const DocPropertiesTableInner = ({
defaultOpenProperty?.type === 'database' defaultOpenProperty?.type === 'database'
? [ ? [
{ {
databaseId: defaultOpenProperty.databaseId, databaseBlockId: defaultOpenProperty.databaseId,
rowId: defaultOpenProperty.databaseRowId, rowId: defaultOpenProperty.databaseRowId,
docId: defaultOpenProperty.docId,
}, },
] ]
: [] : []

View File

@@ -72,7 +72,6 @@ export class DocDatabaseBacklinksService extends Service {
docId: string; docId: string;
rowId: string; rowId: string;
databaseBlockId: string; databaseBlockId: string;
databaseName: string | undefined;
}) { }) {
return new Observable<DatabaseRow | undefined>(subscriber => { return new Observable<DatabaseRow | undefined>(subscriber => {
let disposed = false; let disposed = false;
@@ -128,7 +127,14 @@ export class DocDatabaseBacklinksService extends Service {
// backlinks (docid:blockid:databaseBlockId) // backlinks (docid:blockid:databaseBlockId)
// -> related db rows (DatabaseRow[]) // -> related db rows (DatabaseRow[])
watchDbBacklinkRows$(docId: string) { watchDbBacklinkRows$(
docId: string,
defaultItems?: {
docId: string;
databaseBlockId: string;
rowId: string;
}[]
) {
return this.docsSearchService.watchDatabasesTo(docId).pipe( return this.docsSearchService.watchDatabasesTo(docId).pipe(
distinctUntilChanged(equalComparator), distinctUntilChanged(equalComparator),
map(rows => map(rows =>
@@ -136,14 +142,32 @@ export class DocDatabaseBacklinksService extends Service {
(a, b) => a.databaseName?.localeCompare(b.databaseName ?? '') ?? 0 (a, b) => a.databaseName?.localeCompare(b.databaseName ?? '') ?? 0
) )
), ),
map(backlinks => map(backlinks => {
backlinks.map(backlink => { // 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 { return {
...backlink, ...backlink,
row$: this.watchDatabaseRow$(backlink), row$: this.watchDatabaseRow$(backlink),
}; };
}) });
) })
); );
} }
} }

View File

@@ -170,8 +170,9 @@ export const DocDatabaseBacklinkInfo = ({
onChange, onChange,
}: { }: {
defaultOpen?: { defaultOpen?: {
databaseId: string; databaseBlockId: string;
rowId: string; rowId: string;
docId: string;
}[]; }[];
onChange?: ( onChange?: (
row: DatabaseRow, row: DatabaseRow,
@@ -184,8 +185,11 @@ export const DocDatabaseBacklinkInfo = ({
const rows = useLiveData( const rows = useLiveData(
useMemo( useMemo(
() => () =>
LiveData.from(docDatabaseBacklinks.watchDbBacklinkRows$(doc.id), []), LiveData.from(
[docDatabaseBacklinks, doc.id] docDatabaseBacklinks.watchDbBacklinkRows$(doc.id, defaultOpen),
[]
),
[docDatabaseBacklinks, doc.id, defaultOpen]
) )
); );
@@ -200,8 +204,9 @@ export const DocDatabaseBacklinkInfo = ({
<DatabaseBacklinkRow <DatabaseBacklinkRow
defaultOpen={defaultOpen?.some( defaultOpen={defaultOpen?.some(
backlink => backlink =>
backlink.databaseId === databaseBlockId && backlink.databaseBlockId === databaseBlockId &&
backlink.rowId === rowId backlink.rowId === rowId &&
backlink.docId === docId
)} )}
row$={row$} row$={row$}
onChange={onChange} onChange={onChange}

View File

@@ -153,17 +153,6 @@ export class Editor extends Entity {
if (!isEqual(selector, omit(editorParams, ['mode']))) { if (!isEqual(selector, omit(editorParams, ['mode']))) {
this.setSelector(selector); 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 { } finally {
updating = false; updating = false;
} }

View File

@@ -24,6 +24,7 @@ export type DocReferenceInfo = {
blockIds?: string[]; blockIds?: string[];
elementIds?: string[]; elementIds?: string[];
databaseId?: string; databaseId?: string;
databaseDocId?: string;
databaseRowId?: string; databaseRowId?: string;
/** /**
* viewport in edgeless mode * viewport in edgeless mode

View File

@@ -169,8 +169,16 @@ function DocPeekPreviewEditor({
} }
export function DocPeekPreview({ docRef }: { docRef: DocReferenceInfo }) { export function DocPeekPreview({ docRef }: { docRef: DocReferenceInfo }) {
const { docId, blockIds, elementIds, mode, xywh, databaseId, databaseRowId } = const {
docRef; docId,
blockIds,
elementIds,
mode,
xywh,
databaseId,
databaseDocId,
databaseRowId,
} = docRef;
const { doc, editor, loading } = useEditor( const { doc, editor, loading } = useEditor(
docId, docId,
mode, mode,
@@ -178,8 +186,9 @@ export function DocPeekPreview({ docRef }: { docRef: DocReferenceInfo }) {
blockIds, blockIds,
elementIds, elementIds,
}, },
databaseId && databaseRowId databaseId && databaseRowId && databaseDocId
? { ? {
docId: databaseDocId,
databaseId, databaseId,
databaseRowId, databaseRowId,
type: 'database', type: 'database',

View File

@@ -21,4 +21,4 @@
"ur": 3, "ur": 3,
"zh-Hans": 99, "zh-Hans": 99,
"zh-Hant": 98 "zh-Hant": 98
} }