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:
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user