From 6112e977cc7f757c98cc00197918496de1001e15 Mon Sep 17 00:00:00 2001 From: JimmFly <447268514@qq.com> Date: Fri, 12 Apr 2024 06:32:30 +0000 Subject: [PATCH] feat(core): adjust the display settings to be independent for each workspace (#6502) close TOV-793 --- .../components/page-display-menu.tsx | 50 +++++++++++------ .../page-list/docs/page-list-item.tsx | 14 ++--- .../page-list/group-definitions.tsx | 21 ++----- .../components/page-list/header-col-def.tsx | 11 ++-- .../core/src/components/page-list/index.tsx | 2 +- .../core/src/components/page-list/types.ts | 5 ++ .../use-all-doc-display-properties.ts | 55 +++++++++++++++++++ .../page-list/use-page-display-properties.ts | 29 ---------- 8 files changed, 112 insertions(+), 75 deletions(-) create mode 100644 packages/frontend/core/src/components/page-list/use-all-doc-display-properties.ts delete mode 100644 packages/frontend/core/src/components/page-list/use-page-display-properties.ts diff --git a/packages/frontend/core/src/components/page-list/components/page-display-menu.tsx b/packages/frontend/core/src/components/page-list/components/page-display-menu.tsx index ce422efb7e..6c91cfedfc 100644 --- a/packages/frontend/core/src/components/page-list/components/page-display-menu.tsx +++ b/packages/frontend/core/src/components/page-list/components/page-display-menu.tsx @@ -7,12 +7,10 @@ import { } from '@affine/component'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { ArrowDownSmallIcon, DoneIcon } from '@blocksuite/icons'; -import { useAtom } from 'jotai'; import { useCallback, useMemo } from 'react'; -import { pageGroupByTypeAtom } from '../group-definitions'; import type { PageDisplayProperties, PageGroupByType } from '../types'; -import { usePageDisplayProperties } from '../use-page-display-properties'; +import { useAllDocDisplayProperties } from '../use-all-doc-display-properties'; import * as styles from './page-display-menu.css'; type GroupOption = { @@ -22,13 +20,21 @@ type GroupOption = { export const PageDisplayMenu = () => { const t = useAFFiNEI18N(); - const [group, setGroup] = useAtom(pageGroupByTypeAtom); - const [properties, setProperties] = usePageDisplayProperties(); + const [workspaceProperties, setProperties] = useAllDocDisplayProperties(); const handleSelect = useCallback( (value: PageGroupByType) => { - setGroup(value); + setProperties('groupBy', value); }, - [setGroup] + [setProperties] + ); + const handleSetDocDisplayProperties = useCallback( + (key: keyof PageDisplayProperties) => { + setProperties('displayProperties', { + ...workspaceProperties.displayProperties, + [key]: !workspaceProperties.displayProperties[key], + }); + }, + [setProperties, workspaceProperties.displayProperties] ); const propertyOptions: Array<{ key: keyof PageDisplayProperties; @@ -38,26 +44,26 @@ export const PageDisplayMenu = () => { return [ { key: 'bodyNotes', - onClick: () => setProperties('bodyNotes', !properties['bodyNotes']), + onClick: () => handleSetDocDisplayProperties('bodyNotes'), label: t['com.affine.page.display.display-properties.body-notes'](), }, { key: 'tags', - onClick: () => setProperties('tags', !properties['tags']), + onClick: () => handleSetDocDisplayProperties('tags'), label: t['Tags'](), }, { key: 'createDate', - onClick: () => setProperties('createDate', !properties['createDate']), + onClick: () => handleSetDocDisplayProperties('createDate'), label: t['Created'](), }, { key: 'updatedDate', - onClick: () => setProperties('updatedDate', !properties['updatedDate']), + onClick: () => handleSetDocDisplayProperties('updatedDate'), label: t['Updated'](), }, ]; - }, [properties, setProperties, t]); + }, [handleSetDocDisplayProperties, t]); const items = useMemo(() => { const groupOptions: GroupOption[] = [ @@ -87,8 +93,12 @@ export const PageDisplayMenu = () => { handleSelect(option.value)} - data-active={group === option.value} - endFix={group === option.value ? : null} + data-active={workspaceProperties.groupBy === option.value} + endFix={ + workspaceProperties.groupBy === option.value ? ( + + ) : null + } className={styles.subMenuItem} data-testid={`group-by-${option.value}`} > @@ -97,7 +107,7 @@ export const PageDisplayMenu = () => { )); const currentGroupType = groupOptions.find( - option => option.value === group + option => option.value === workspaceProperties.groupBy )?.label; return ( @@ -131,7 +141,7 @@ export const PageDisplayMenu = () => { key={option.label} className={styles.propertyButton} onClick={option.onClick} - data-active={properties[option.key]} + data-active={!!workspaceProperties.displayProperties[option.key]} data-testid={`property-${option.key}`} > {option.label} @@ -140,7 +150,13 @@ export const PageDisplayMenu = () => { ); - }, [group, handleSelect, properties, propertyOptions, t]); + }, [ + handleSelect, + propertyOptions, + t, + workspaceProperties.displayProperties, + workspaceProperties.groupBy, + ]); return ( ) => { - const [displayProperties] = usePageDisplayProperties(); + const [displayProperties] = useAllDocDisplayProperties(); return (
{title}
- {preview && displayProperties['bodyNotes'] ? ( + {preview && displayProperties.displayProperties.bodyNotes ? (
{ - const [displayProperties] = usePageDisplayProperties(); + const [displayProperties] = useAllDocDisplayProperties(); const pageTitleElement = useMemo(() => { return (
@@ -190,7 +190,7 @@ export const PageListItem = (props: PageListItemProps) => { flex={4} alignment="end" style={{ overflow: 'visible' }} - hidden={!displayProperties['tags']} + hidden={!displayProperties.displayProperties.tags} > @@ -199,7 +199,7 @@ export const PageListItem = (props: PageListItemProps) => { flex={1} alignment="end" hideInSmallContainer - hidden={!displayProperties['createDate']} + hidden={!displayProperties.displayProperties.createDate} > @@ -207,7 +207,7 @@ export const PageListItem = (props: PageListItemProps) => { flex={1} alignment="end" hideInSmallContainer - hidden={!displayProperties['updatedDate']} + hidden={!displayProperties.displayProperties.updatedDate} > diff --git a/packages/frontend/core/src/components/page-list/group-definitions.tsx b/packages/frontend/core/src/components/page-list/group-definitions.tsx index 0483580436..40290e759e 100644 --- a/packages/frontend/core/src/components/page-list/group-definitions.tsx +++ b/packages/frontend/core/src/components/page-list/group-definitions.tsx @@ -5,24 +5,13 @@ import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { FavoritedIcon, FavoriteIcon } from '@blocksuite/icons'; import type { DocMeta } from '@blocksuite/store'; import { useLiveData, useService } from '@toeverything/infra'; -import { useAtomValue } from 'jotai'; -import { atomWithStorage } from 'jotai/utils'; import { type ReactNode, useMemo } from 'react'; import * as styles from './group-definitions.css'; -import type { - DateKey, - ItemGroupDefinition, - ListItem, - PageGroupByType, -} from './types'; +import type { DateKey, ItemGroupDefinition, ListItem } from './types'; +import { useAllDocDisplayProperties } from './use-all-doc-display-properties'; import { betweenDaysAgo, withinDaysAgo } from './utils'; -export const pageGroupByTypeAtom = atomWithStorage( - 'pageGroupByType', - 'updatedDate' -); - const GroupLabel = ({ label, count, @@ -189,7 +178,7 @@ export const useFavoriteGroupDefinitions = < }; export const usePageItemGroupDefinitions = () => { - const key = useAtomValue(pageGroupByTypeAtom); + const [workspaceProperties] = useAllDocDisplayProperties(); const tagGroupDefinitions = useTagGroupDefinitions(); const createDateGroupDefinitions = useDateGroupDefinitions('createDate'); const updatedDateGroupDefinitions = useDateGroupDefinitions('updatedDate'); @@ -206,12 +195,12 @@ export const usePageItemGroupDefinitions = () => { // add more here later // todo: some page group definitions maybe dynamic }; - return itemGroupDefinitions[key]; + return itemGroupDefinitions[workspaceProperties.groupBy]; }, [ createDateGroupDefinitions, favouriteGroupDefinitions, - key, tagGroupDefinitions, updatedDateGroupDefinitions, + workspaceProperties.groupBy, ]); }; diff --git a/packages/frontend/core/src/components/page-list/header-col-def.tsx b/packages/frontend/core/src/components/page-list/header-col-def.tsx index bf9abe1146..85535ccd79 100644 --- a/packages/frontend/core/src/components/page-list/header-col-def.tsx +++ b/packages/frontend/core/src/components/page-list/header-col-def.tsx @@ -3,9 +3,10 @@ import { useMemo } from 'react'; import { ListHeaderTitleCell } from './page-header'; import type { HeaderColDef } from './types'; -import { usePageDisplayProperties } from './use-page-display-properties'; +import { useAllDocDisplayProperties } from './use-all-doc-display-properties'; export const usePageHeaderColsDef = (): HeaderColDef[] => { - const [displayProperties] = usePageDisplayProperties(); + const [displayProperties] = useAllDocDisplayProperties(); + return useMemo( () => [ { @@ -20,7 +21,7 @@ export const usePageHeaderColsDef = (): HeaderColDef[] => { content: , flex: 3, alignment: 'end', - hidden: !displayProperties['tags'], + hidden: !displayProperties.displayProperties.tags, }, { key: 'createDate', @@ -29,7 +30,7 @@ export const usePageHeaderColsDef = (): HeaderColDef[] => { sortable: true, alignment: 'end', hideInSmallContainer: true, - hidden: !displayProperties['createDate'], + hidden: !displayProperties.displayProperties.createDate, }, { key: 'updatedDate', @@ -38,7 +39,7 @@ export const usePageHeaderColsDef = (): HeaderColDef[] => { sortable: true, alignment: 'end', hideInSmallContainer: true, - hidden: !displayProperties['updatedDate'], + hidden: !displayProperties.displayProperties.updatedDate, }, { key: 'actions', diff --git a/packages/frontend/core/src/components/page-list/index.tsx b/packages/frontend/core/src/components/page-list/index.tsx index 0bd64b16b6..789e704257 100644 --- a/packages/frontend/core/src/components/page-list/index.tsx +++ b/packages/frontend/core/src/components/page-list/index.tsx @@ -16,9 +16,9 @@ export * from './page-group'; export * from './page-header'; export * from './tags'; export * from './types'; +export * from './use-all-doc-display-properties'; export * from './use-collection-manager'; export * from './use-filtered-page-metas'; -export * from './use-page-display-properties'; export * from './utils'; export * from './view'; export * from './virtualized-list'; diff --git a/packages/frontend/core/src/components/page-list/types.ts b/packages/frontend/core/src/components/page-list/types.ts index fa1969033d..211de0ec5c 100644 --- a/packages/frontend/core/src/components/page-list/types.ts +++ b/packages/frontend/core/src/components/page-list/types.ts @@ -168,3 +168,8 @@ export type PageDisplayProperties = { createDate: boolean; updatedDate: boolean; }; + +export type DisplayProperties = { + groupBy: PageGroupByType; + displayProperties: PageDisplayProperties; +}; diff --git a/packages/frontend/core/src/components/page-list/use-all-doc-display-properties.ts b/packages/frontend/core/src/components/page-list/use-all-doc-display-properties.ts new file mode 100644 index 0000000000..02aeb81dcc --- /dev/null +++ b/packages/frontend/core/src/components/page-list/use-all-doc-display-properties.ts @@ -0,0 +1,55 @@ +import { useService, Workspace } from '@toeverything/infra'; +import { useAtom } from 'jotai'; +import { atomWithStorage } from 'jotai/utils'; +import { useCallback } from 'react'; + +import type { + DisplayProperties, + PageDisplayProperties, + PageGroupByType, +} from './types'; + +export const displayPropertiesAtom = atomWithStorage<{ + [workspaceId: string]: DisplayProperties; +}>('allDocDisplayProperties', {}); + +const defaultProps: DisplayProperties = { + groupBy: 'updatedDate', + displayProperties: { + bodyNotes: true, + tags: true, + createDate: true, + updatedDate: true, + }, +}; + +export const useAllDocDisplayProperties = (): [ + DisplayProperties, + ( + key: keyof DisplayProperties, + value: PageGroupByType | PageDisplayProperties + ) => void, +] => { + const workspace = useService(Workspace); + const [properties, setProperties] = useAtom(displayPropertiesAtom); + + const workspaceProperties = properties[workspace.id] || defaultProps; + + const onChange = useCallback( + ( + key: keyof DisplayProperties, + value: PageGroupByType | PageDisplayProperties + ) => { + setProperties(prev => ({ + ...prev, + [workspace.id]: { + ...(prev[workspace.id] || defaultProps), + [key]: value, + }, + })); + }, + [setProperties, workspace.id] + ); + + return [workspaceProperties, onChange]; +}; diff --git a/packages/frontend/core/src/components/page-list/use-page-display-properties.ts b/packages/frontend/core/src/components/page-list/use-page-display-properties.ts deleted file mode 100644 index 56bf606537..0000000000 --- a/packages/frontend/core/src/components/page-list/use-page-display-properties.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useAtom } from 'jotai'; -import { atomWithStorage } from 'jotai/utils'; -import { useCallback } from 'react'; - -import type { PageDisplayProperties } from './types'; - -export const pageDisplayPropertiesAtom = atomWithStorage( - 'pageDisplayProperties', - { - bodyNotes: true, - tags: true, - createDate: true, - updatedDate: true, - } -); - -export const usePageDisplayProperties = (): [ - PageDisplayProperties, - (key: keyof PageDisplayProperties, value: boolean) => void, -] => { - const [properties, setProperties] = useAtom(pageDisplayPropertiesAtom); - const onChange = useCallback( - (key: keyof PageDisplayProperties, value: boolean) => { - setProperties(prev => ({ ...prev, [key]: value })); - }, - [setProperties] - ); - return [properties, onChange]; -};