fix(core): database backlink row visibility (#11706)

fix AF-2507

do not show the db backlink row if
- the row does not have any properties (excluding `title` column)
- the target doc is a template page
This commit is contained in:
pengx17
2025-04-15 13:21:49 +00:00
parent b2694003c9
commit db2a8fd509

View File

@@ -6,11 +6,12 @@ import {
} from '@affine/component'; } from '@affine/component';
import { AffinePageReference } from '@affine/core/components/affine/reference-link'; import { AffinePageReference } from '@affine/core/components/affine/reference-link';
import { DocService } from '@affine/core/modules/doc'; import { DocService } from '@affine/core/modules/doc';
import { TemplateDocService } from '@affine/core/modules/template-doc';
import { useI18n } from '@affine/i18n'; import { useI18n } from '@affine/i18n';
import type { DatabaseBlockDataSource } from '@blocksuite/affine/blocks/database'; import type { DatabaseBlockDataSource } from '@blocksuite/affine/blocks/database';
import { DatabaseTableViewIcon, PageIcon } from '@blocksuite/icons/rc'; import { DatabaseTableViewIcon, PageIcon } from '@blocksuite/icons/rc';
import { LiveData, useLiveData, useService } from '@toeverything/infra'; import { LiveData, useLiveData, useService } from '@toeverything/infra';
import { Fragment, useMemo } from 'react'; import { useMemo } from 'react';
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import { DocDatabaseBacklinksService } from '../../services/doc-database-backlinks'; import { DocDatabaseBacklinksService } from '../../services/doc-database-backlinks';
@@ -96,13 +97,24 @@ const DatabaseBacklinkRow = ({
useMemo(() => LiveData.from(row$, undefined), [row$]) useMemo(() => LiveData.from(row$, undefined), [row$])
); );
const sortedCells = useMemo(() => { const sortedCells = useMemo(() => {
return row?.cells.toSorted((a, b) => { return row?.cells
.filter(cell => cell.property.id !== 'title')
.toSorted((a, b) => {
return (a.property.name$.value ?? '').localeCompare( return (a.property.name$.value ?? '').localeCompare(
b.property.name$.value ?? '' b.property.name$.value ?? ''
); );
}); });
}, [row?.cells]); }, [row?.cells]);
const t = useI18n(); const t = useI18n();
const templateDocService = useService(TemplateDocService);
const isTemplateDoc = useLiveData(
useMemo(
() =>
row?.docId ? templateDocService.list.isTemplate$(row.docId) : undefined,
[row?.docId, templateDocService.list]
)
);
const pageRefParams = useMemo(() => { const pageRefParams = useMemo(() => {
const params = new URLSearchParams(); const params = new URLSearchParams();
@@ -112,11 +124,12 @@ const DatabaseBacklinkRow = ({
return params; return params;
}, [row]); }, [row]);
if (!row || !sortedCells) { if (!row || !sortedCells || sortedCells.length === 0 || isTemplateDoc) {
return null; return null;
} }
return ( return (
<>
<PropertyCollapsibleSection <PropertyCollapsibleSection
title={ title={
<span className={styles.databaseNameWrapper}> <span className={styles.databaseNameWrapper}>
@@ -158,6 +171,8 @@ const DatabaseBacklinkRow = ({
})} })}
</PropertyCollapsibleContent> </PropertyCollapsibleContent>
</PropertyCollapsibleSection> </PropertyCollapsibleSection>
<Divider size="thinner" className={styles.divider} />
</>
); );
}; };
@@ -196,8 +211,8 @@ export const DocDatabaseBacklinkInfo = ({
return ( return (
<div className={styles.root}> <div className={styles.root}>
{rows.map(({ docId, databaseBlockId, rowId, row$ }) => ( {rows.map(({ docId, databaseBlockId, rowId, row$ }) => (
<Fragment key={`${docId}-${rowId}`}>
<DatabaseBacklinkRow <DatabaseBacklinkRow
key={`${docId}-${rowId}`}
defaultOpen={ defaultOpen={
defaultOpen?.some( defaultOpen?.some(
backlink => backlink =>
@@ -209,8 +224,6 @@ export const DocDatabaseBacklinkInfo = ({
row$={row$} row$={row$}
onChange={onChange} onChange={onChange}
/> />
<Divider size="thinner" className={styles.divider} />
</Fragment>
))} ))}
</div> </div>
); );