Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): adjust the display settings to be independent for each workspace #6502

Merged
merged 1 commit into from
Apr 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -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;
Expand All @@ -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[] = [
Expand Down Expand Up @@ -87,8 +93,12 @@ export const PageDisplayMenu = () => {
<MenuItem
key={option.value}
onSelect={() => handleSelect(option.value)}
data-active={group === option.value}
endFix={group === option.value ? <DoneIcon fontSize={'20px'} /> : null}
data-active={workspaceProperties.groupBy === option.value}
endFix={
workspaceProperties.groupBy === option.value ? (
<DoneIcon fontSize={'20px'} />
) : null
}
className={styles.subMenuItem}
data-testid={`group-by-${option.value}`}
>
Expand All @@ -97,7 +107,7 @@ export const PageDisplayMenu = () => {
));

const currentGroupType = groupOptions.find(
option => option.value === group
option => option.value === workspaceProperties.groupBy
)?.label;

return (
Expand Down Expand Up @@ -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}
Expand All @@ -140,7 +150,13 @@ export const PageDisplayMenu = () => {
</div>
</>
);
}, [group, handleSelect, properties, propertyOptions, t]);
}, [
handleSelect,
propertyOptions,
t,
workspaceProperties.displayProperties,
workspaceProperties.groupBy,
]);
return (
<Menu
items={items}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { useCallback, useMemo } from 'react';
import { WorkbenchLink } from '../../../modules/workbench/view/workbench-link';
import { selectionStateAtom, useAtom } from '../scoped-atoms';
import type { DraggableTitleCellData, PageListItemProps } from '../types';
import { usePageDisplayProperties } from '../use-page-display-properties';
import { useAllDocDisplayProperties } from '../use-all-doc-display-properties';
import { ColWrapper, formatDate, stopPropagation } from '../utils';
import * as styles from './page-list-item.css';
import { PageTags } from './page-tags';
Expand All @@ -18,7 +18,7 @@ const ListTitleCell = ({
title,
preview,
}: Pick<PageListItemProps, 'title' | 'preview'>) => {
const [displayProperties] = usePageDisplayProperties();
const [displayProperties] = useAllDocDisplayProperties();
return (
<div data-testid="page-list-item-title" className={styles.titleCell}>
<div
Expand All @@ -27,7 +27,7 @@ const ListTitleCell = ({
>
{title}
</div>
{preview && displayProperties['bodyNotes'] ? (
{preview && displayProperties.displayProperties.bodyNotes ? (
<div
data-testid="page-list-item-preview-text"
className={styles.titleCellPreview}
Expand Down Expand Up @@ -127,7 +127,7 @@ const PageListOperationsCell = ({
};

export const PageListItem = (props: PageListItemProps) => {
const [displayProperties] = usePageDisplayProperties();
const [displayProperties] = useAllDocDisplayProperties();
const pageTitleElement = useMemo(() => {
return (
<div className={styles.dragPageItemOverlay}>
Expand Down Expand Up @@ -190,7 +190,7 @@ export const PageListItem = (props: PageListItemProps) => {
flex={4}
alignment="end"
style={{ overflow: 'visible' }}
hidden={!displayProperties['tags']}
hidden={!displayProperties.displayProperties.tags}
>
<PageTagsCell pageId={props.pageId} />
</ColWrapper>
Expand All @@ -199,15 +199,15 @@ export const PageListItem = (props: PageListItemProps) => {
flex={1}
alignment="end"
hideInSmallContainer
hidden={!displayProperties['createDate']}
hidden={!displayProperties.displayProperties.createDate}
>
<PageCreateDateCell createDate={props.createDate} />
</ColWrapper>
<ColWrapper
flex={1}
alignment="end"
hideInSmallContainer
hidden={!displayProperties['updatedDate']}
hidden={!displayProperties.displayProperties.updatedDate}
>
<PageUpdatedDateCell updatedDate={props.updatedDate} />
</ColWrapper>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>(
'pageGroupByType',
'updatedDate'
);

const GroupLabel = ({
label,
count,
Expand Down Expand Up @@ -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');
Expand All @@ -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,
]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -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(
() => [
{
Expand All @@ -20,7 +21,7 @@ export const usePageHeaderColsDef = (): HeaderColDef[] => {
content: <Trans i18nKey="Tags" />,
flex: 3,
alignment: 'end',
hidden: !displayProperties['tags'],
hidden: !displayProperties.displayProperties.tags,
},
{
key: 'createDate',
Expand All @@ -29,7 +30,7 @@ export const usePageHeaderColsDef = (): HeaderColDef[] => {
sortable: true,
alignment: 'end',
hideInSmallContainer: true,
hidden: !displayProperties['createDate'],
hidden: !displayProperties.displayProperties.createDate,
},
{
key: 'updatedDate',
Expand All @@ -38,7 +39,7 @@ export const usePageHeaderColsDef = (): HeaderColDef[] => {
sortable: true,
alignment: 'end',
hideInSmallContainer: true,
hidden: !displayProperties['updatedDate'],
hidden: !displayProperties.displayProperties.updatedDate,
},
{
key: 'actions',
Expand Down
2 changes: 1 addition & 1 deletion packages/frontend/core/src/components/page-list/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
5 changes: 5 additions & 0 deletions packages/frontend/core/src/components/page-list/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,3 +168,8 @@ export type PageDisplayProperties = {
createDate: boolean;
updatedDate: boolean;
};

export type DisplayProperties = {
groupBy: PageGroupByType;
displayProperties: PageDisplayProperties;
};
Original file line number Diff line number Diff line change
@@ -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];
};

This file was deleted.