From 3676f3b7691077e53d3c74248c664069279f9601 Mon Sep 17 00:00:00 2001 From: EYHN Date: Tue, 27 May 2025 04:08:56 +0000 Subject: [PATCH] feat(core): add default group and order (#12526) ## Summary by CodeRabbit - **New Features** - Added default sorting and grouping by "Last Updated" for document views. - Introduced clearer group headers for documents grouped by creation or update date, displaying relative dates or appropriate fallback text. - **Improvements** - Enhanced date grouping headers with capitalized, user-friendly text and improved handling of missing dates. - Added a new localization for "Never updated" to improve clarity in document groupings. - Initialized document update timestamps at creation to improve date accuracy. --- .../core/src/components/explorer/context.ts | 9 +++++ .../components/page-list/docs/select-page.tsx | 7 ++++ .../created-updated-at.tsx | 36 ++++++++++++++++--- .../dialogs/collection-editor/rules-mode.tsx | 7 ++++ .../desktop/pages/workspace/trash-page.tsx | 2 ++ .../core/src/mobile/pages/workspace/all.tsx | 6 ++-- .../views/all-docs/collection/detail.tsx | 2 ++ .../src/mobile/views/all-docs/tag/detail.tsx | 6 ++-- .../core/src/modules/doc/services/docs.ts | 1 + packages/frontend/i18n/src/i18n.gen.ts | 4 +++ packages/frontend/i18n/src/resources/en.json | 1 + 11 files changed, 73 insertions(+), 8 deletions(-) diff --git a/packages/frontend/core/src/components/explorer/context.ts b/packages/frontend/core/src/components/explorer/context.ts index 12599145d..424697d90 100644 --- a/packages/frontend/core/src/components/explorer/context.ts +++ b/packages/frontend/core/src/components/explorer/context.ts @@ -11,6 +11,15 @@ const DefaultDisplayPreference: ExplorerDisplayPreference = { 'system:createdBy', 'system:tags', ], + orderBy: { + type: 'system', + key: 'updatedAt', + desc: true, + }, + groupBy: { + type: 'system', + key: 'updatedAt', + }, showDocIcon: true, showDocPreview: true, quickFavorite: true, diff --git a/packages/frontend/core/src/components/page-list/docs/select-page.tsx b/packages/frontend/core/src/components/page-list/docs/select-page.tsx index f5b681092..e3cf12e94 100644 --- a/packages/frontend/core/src/components/page-list/docs/select-page.tsx +++ b/packages/frontend/core/src/components/page-list/docs/select-page.tsx @@ -49,6 +49,8 @@ export const SelectPage = memo(function SelectPage({ quickFavorite: true, showMoreOperation: false, showDragHandle: false, + groupBy: undefined, + orderBy: undefined, }); }); @@ -132,6 +134,11 @@ export const SelectPage = memo(function SelectPage({ value: 'false', }, ], + orderBy: { + type: 'system', + key: 'updatedAt', + desc: true, + }, }) .subscribe(result => { docExplorerContextValue.groups$.next(result.groups); diff --git a/packages/frontend/core/src/components/workspace-property-types/created-updated-at.tsx b/packages/frontend/core/src/components/workspace-property-types/created-updated-at.tsx index e1000b4cb..c419dbca2 100644 --- a/packages/frontend/core/src/components/workspace-property-types/created-updated-at.tsx +++ b/packages/frontend/core/src/components/workspace-property-types/created-updated-at.tsx @@ -11,6 +11,7 @@ const toRelativeDate = (time: string | number) => { return i18nTime(time, { relative: { max: [1, 'day'], + accuracy: 'day', }, absolute: { accuracy: 'day', @@ -54,12 +55,39 @@ export const UpdatedAtValue = MetaDateValueFactory({ type: 'updatedDate', }); -export const CreatedAtGroupHeader = (props: GroupHeaderProps) => { - return ; +export const CreatedAtGroupHeader = ({ + groupId, + docCount, +}: GroupHeaderProps) => { + const date = groupId ? toRelativeDate(groupId) : 'No Date'; + return ( + + {date} + + ); }; -export const UpdatedAtGroupHeader = (props: GroupHeaderProps) => { - return ; +export const UpdatedAtGroupHeader = ({ + groupId, + docCount, +}: GroupHeaderProps) => { + const t = useI18n(); + const date = groupId + ? toRelativeDate(groupId) + : t['com.affine.all-docs.group.updated-at.never-updated'](); + return ( + + {date} + + ); }; export const CreateAtDocListProperty = ({ doc }: { doc: DocRecord }) => { diff --git a/packages/frontend/core/src/desktop/dialogs/collection-editor/rules-mode.tsx b/packages/frontend/core/src/desktop/dialogs/collection-editor/rules-mode.tsx index d48bdcdc8..f293c912e 100644 --- a/packages/frontend/core/src/desktop/dialogs/collection-editor/rules-mode.tsx +++ b/packages/frontend/core/src/desktop/dialogs/collection-editor/rules-mode.tsx @@ -55,6 +55,8 @@ export const RulesMode = ({ showDragHandle: false, showMoreOperation: false, quickFavorite: true, + groupBy: undefined, + orderBy: undefined, }) ); @@ -76,6 +78,11 @@ export const RulesMode = ({ value: 'false', }, ], + orderBy: { + type: 'system', + key: 'updatedAt', + desc: true, + }, }) .subscribe(rules => { setRulesPageIds(rules.groups.flatMap(group => group.items)); diff --git a/packages/frontend/core/src/desktop/pages/workspace/trash-page.tsx b/packages/frontend/core/src/desktop/pages/workspace/trash-page.tsx index c4bb8cf46..80dfcc21e 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/trash-page.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/trash-page.tsx @@ -60,6 +60,8 @@ export const TrashPage = () => { quickFavorite: false, quickDeletePermanently: true, quickRestore: true, + groupBy: undefined, + orderBy: undefined, }) ); diff --git a/packages/frontend/core/src/mobile/pages/workspace/all.tsx b/packages/frontend/core/src/mobile/pages/workspace/all.tsx index c96cafeef..9cf6b20aa 100644 --- a/packages/frontend/core/src/mobile/pages/workspace/all.tsx +++ b/packages/frontend/core/src/mobile/pages/workspace/all.tsx @@ -19,6 +19,8 @@ const AllDocs = () => { displayProperties: ['createdAt', 'updatedAt', 'tags'], view: 'masonry', showDragHandle: false, + groupBy: undefined, + orderBy: undefined, }) ); const collectionRulesService = useService(CollectionRulesService); @@ -43,8 +45,8 @@ const AllDocs = () => { }, ], orderBy: { - type: 'property', - key: 'createdAt', + type: 'system', + key: 'updatedAt', desc: true, }, }) diff --git a/packages/frontend/core/src/mobile/views/all-docs/collection/detail.tsx b/packages/frontend/core/src/mobile/views/all-docs/collection/detail.tsx index 85ad5ffe7..b81010130 100644 --- a/packages/frontend/core/src/mobile/views/all-docs/collection/detail.tsx +++ b/packages/frontend/core/src/mobile/views/all-docs/collection/detail.tsx @@ -36,6 +36,8 @@ const CollectionDocs = ({ collection }: { collection: Collection }) => { displayProperties: ['createdAt', 'updatedAt', 'tags'], view: 'masonry', showDragHandle: false, + groupBy: undefined, + orderBy: undefined, }) ); const groups = useLiveData(explorerContextValue.groups$); diff --git a/packages/frontend/core/src/mobile/views/all-docs/tag/detail.tsx b/packages/frontend/core/src/mobile/views/all-docs/tag/detail.tsx index 403b029e1..0eaf4981b 100644 --- a/packages/frontend/core/src/mobile/views/all-docs/tag/detail.tsx +++ b/packages/frontend/core/src/mobile/views/all-docs/tag/detail.tsx @@ -20,6 +20,8 @@ const TagDocs = ({ tag }: { tag: Tag }) => { displayProperties: ['createdAt', 'updatedAt', 'tags'], view: 'masonry', showDragHandle: false, + groupBy: undefined, + orderBy: undefined, }) ); const collectionRulesService = useService(CollectionRulesService); @@ -50,8 +52,8 @@ const TagDocs = ({ tag }: { tag: Tag }) => { }, ], orderBy: { - type: 'property', - key: 'createdAt', + type: 'system', + key: 'updatedAt', desc: true, }, }) diff --git a/packages/frontend/core/src/modules/doc/services/docs.ts b/packages/frontend/core/src/modules/doc/services/docs.ts index b0c6e0948..d63820635 100644 --- a/packages/frontend/core/src/modules/doc/services/docs.ts +++ b/packages/frontend/core/src/modules/doc/services/docs.ts @@ -164,6 +164,7 @@ export class DocsService extends Service { middleware.afterCreate?.(docRecord, options); } docRecord.setCreatedAt(Date.now()); + docRecord.setUpdatedAt(Date.now()); this.eventBus.emit(DocCreated, { doc: docRecord, docCreateOptions: options, diff --git a/packages/frontend/i18n/src/i18n.gen.ts b/packages/frontend/i18n/src/i18n.gen.ts index 2141448cd..0dc2db5e7 100644 --- a/packages/frontend/i18n/src/i18n.gen.ts +++ b/packages/frontend/i18n/src/i18n.gen.ts @@ -7144,6 +7144,10 @@ export function useAFFiNEI18N(): { * `Unchecked` */ ["com.affine.all-docs.group.is-not-checked"](): string; + /** + * `Never updated` + */ + ["com.affine.all-docs.group.updated-at.never-updated"](): string; /** * `core` */ diff --git a/packages/frontend/i18n/src/resources/en.json b/packages/frontend/i18n/src/resources/en.json index b30c37e8a..6b76b76cf 100644 --- a/packages/frontend/i18n/src/resources/en.json +++ b/packages/frontend/i18n/src/resources/en.json @@ -1782,6 +1782,7 @@ "com.affine.all-docs.group.is-not-journal": "Not Journal", "com.affine.all-docs.group.is-checked": "Checked", "com.affine.all-docs.group.is-not-checked": "Unchecked", + "com.affine.all-docs.group.updated-at.never-updated": "Never updated", "core": "core", "dark": "Dark", "invited you to join": "invited you to join",