feat(core): doc database properties (#8520)

fix AF-1454

1. move inline tags editor to components
2. add progress component
3. adjust doc properties styles for desktop
4. subscribe bs database links and display in doc info
5. move update/create dates to doc info
6. a trivial e2e test

<div class='graphite__hidden'>
          <div>🎥 Video uploaded on Graphite:</div>
            <a href="https://app.graphite.dev/media/video/T2klNLEk0wxLh4NRDzhk/eed266c1-fdac-4f0e-baa9-4aa00d14a2e8.mp4">
              <img src="https://app.graphite.dev/api/v1/graphite/video/thumbnail/T2klNLEk0wxLh4NRDzhk/eed266c1-fdac-4f0e-baa9-4aa00d14a2e8.mp4">
            </a>
          </div>
<video src="https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/T2klNLEk0wxLh4NRDzhk/eed266c1-fdac-4f0e-baa9-4aa00d14a2e8.mp4">10月23日.mp4</video>
This commit is contained in:
pengx17
2024-10-24 07:38:45 +00:00
parent f7dc65e170
commit 4b6c4ed546
67 changed files with 3166 additions and 941 deletions

View File

@@ -8,7 +8,8 @@ import {
WorkspaceEngineBeforeStart,
} from '@toeverything/infra';
import { isEmpty, omit } from 'lodash-es';
import { type Observable, switchMap } from 'rxjs';
import { map, type Observable, switchMap } from 'rxjs';
import { z } from 'zod';
import { DocsIndexer } from '../entities/docs-indexer';
@@ -509,6 +510,76 @@ export class DocsSearchService extends Service {
);
}
watchDatabasesTo(docId: string) {
const DatabaseAdditionalSchema = z.object({
databaseName: z.string().optional(),
});
return this.indexer.blockIndex
.search$(
{
type: 'boolean',
occur: 'must',
queries: [
{
type: 'match',
field: 'refDocId',
match: docId,
},
{
type: 'match',
field: 'parentFlavour',
match: 'affine:database',
},
// Ignore if it is a link to the current document.
{
type: 'boolean',
occur: 'must_not',
queries: [
{
type: 'match',
field: 'docId',
match: docId,
},
],
},
],
},
{
fields: ['docId', 'blockId', 'parentBlockId', 'additional'],
pagination: {
limit: 100,
},
}
)
.pipe(
map(({ nodes }) => {
return nodes.map(node => {
const additional =
typeof node.fields.additional === 'string'
? node.fields.additional
: node.fields.additional[0];
return {
docId:
typeof node.fields.docId === 'string'
? node.fields.docId
: node.fields.docId[0],
rowId:
typeof node.fields.blockId === 'string'
? node.fields.blockId
: node.fields.blockId[0],
databaseBlockId:
typeof node.fields.parentBlockId === 'string'
? node.fields.parentBlockId
: node.fields.parentBlockId[0],
databaseName: DatabaseAdditionalSchema.safeParse(additional).data
?.databaseName as string | undefined,
};
});
})
);
}
async getDocTitle(docId: string) {
const doc = await this.indexer.docIndex.get(docId);
const title = doc?.get('title');