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';
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,
},
]
: []

View File

@@ -72,7 +72,6 @@ export class DocDatabaseBacklinksService extends Service {
docId: string;
rowId: string;
databaseBlockId: string;
databaseName: string | undefined;
}) {
return new Observable<DatabaseRow | undefined>(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),
};
})
)
});
})
);
}
}

View File

@@ -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 = ({
<DatabaseBacklinkRow
defaultOpen={defaultOpen?.some(
backlink =>
backlink.databaseId === databaseBlockId &&
backlink.rowId === rowId
backlink.databaseBlockId === databaseBlockId &&
backlink.rowId === rowId &&
backlink.docId === docId
)}
row$={row$}
onChange={onChange}

View File

@@ -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;
}

View File

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

View File

@@ -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',

View File

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