mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-21 08:17:10 +08:00
fix: collection-list pin icon not changed (#3625)
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
import { style } from '@vanilla-extract/css';
|
import { style } from '@vanilla-extract/css';
|
||||||
|
|
||||||
|
import { viewMenu } from './collection-list.css';
|
||||||
|
|
||||||
export const view = style({
|
export const view = style({
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
@@ -36,6 +38,9 @@ export const pinedIcon = style({
|
|||||||
[`${option}:hover &`]: {
|
[`${option}:hover &`]: {
|
||||||
display: 'none',
|
display: 'none',
|
||||||
},
|
},
|
||||||
|
[`${viewMenu}:hover &`]: {
|
||||||
|
display: 'none',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
export const pinIcon = style({
|
export const pinIcon = style({
|
||||||
@@ -44,5 +49,8 @@ export const pinIcon = style({
|
|||||||
[`${option}:hover &`]: {
|
[`${option}:hover &`]: {
|
||||||
display: 'block',
|
display: 'block',
|
||||||
},
|
},
|
||||||
|
[`${viewMenu}:hover &`]: {
|
||||||
|
display: 'block',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,21 +3,14 @@ import { EditCollectionModel } from '@affine/component/page-list';
|
|||||||
import type { PropertiesMeta } from '@affine/env/filter';
|
import type { PropertiesMeta } from '@affine/env/filter';
|
||||||
import type { GetPageInfoById } from '@affine/env/page-info';
|
import type { GetPageInfoById } from '@affine/env/page-info';
|
||||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||||
import {
|
import { ViewLayersIcon } from '@blocksuite/icons';
|
||||||
DeleteIcon,
|
|
||||||
FilterIcon,
|
|
||||||
PinedIcon,
|
|
||||||
PinIcon,
|
|
||||||
UnpinIcon,
|
|
||||||
ViewLayersIcon,
|
|
||||||
} from '@blocksuite/icons';
|
|
||||||
import { Button } from '@toeverything/components/button';
|
import { Button } from '@toeverything/components/button';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import type { ReactNode } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
|
||||||
|
|
||||||
import { useCollectionManager } from '../use-collection-manager';
|
import { useCollectionManager } from '../use-collection-manager';
|
||||||
import * as styles from './collection-bar.css';
|
import * as styles from './collection-bar.css';
|
||||||
|
import { useActions } from './use-action';
|
||||||
|
|
||||||
interface CollectionBarProps {
|
interface CollectionBarProps {
|
||||||
getPageInfo: GetPageInfoById;
|
getPageInfo: GetPageInfoById;
|
||||||
@@ -26,74 +19,17 @@ interface CollectionBarProps {
|
|||||||
workspaceId: string;
|
workspaceId: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface CollectionBarAction {
|
|
||||||
icon: ReactNode;
|
|
||||||
click: () => void;
|
|
||||||
className?: string;
|
|
||||||
name: string;
|
|
||||||
tooltip: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const CollectionBar = (props: CollectionBarProps) => {
|
export const CollectionBar = (props: CollectionBarProps) => {
|
||||||
const { getPageInfo, propertiesMeta, columnsCount, workspaceId } = props;
|
const { getPageInfo, propertiesMeta, columnsCount, workspaceId } = props;
|
||||||
const t = useAFFiNEI18N();
|
const t = useAFFiNEI18N();
|
||||||
const setting = useCollectionManager(workspaceId);
|
const setting = useCollectionManager(workspaceId);
|
||||||
const collection = setting.currentCollection;
|
const collection = setting.currentCollection;
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const actions = useMemo<CollectionBarAction[]>(
|
const actions = useActions({
|
||||||
() => [
|
collection,
|
||||||
{
|
setting,
|
||||||
icon: (
|
openEdit: () => setOpen(true),
|
||||||
<>
|
});
|
||||||
{collection.pinned ? (
|
|
||||||
<PinedIcon className={styles.pinedIcon}></PinedIcon>
|
|
||||||
) : (
|
|
||||||
<PinIcon className={styles.pinedIcon}></PinIcon>
|
|
||||||
)}
|
|
||||||
{collection.pinned ? (
|
|
||||||
<UnpinIcon className={styles.pinIcon}></UnpinIcon>
|
|
||||||
) : (
|
|
||||||
<PinIcon className={styles.pinIcon}></PinIcon>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
),
|
|
||||||
name: 'pin',
|
|
||||||
tooltip: collection.pinned
|
|
||||||
? t['com.affine.collection-bar.action.tooltip.unpin']()
|
|
||||||
: t['com.affine.collection-bar.action.tooltip.pin'](),
|
|
||||||
className: styles.pin,
|
|
||||||
click: () => {
|
|
||||||
setting
|
|
||||||
.updateCollection({
|
|
||||||
...collection,
|
|
||||||
pinned: !collection.pinned,
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: <FilterIcon />,
|
|
||||||
name: 'edit',
|
|
||||||
tooltip: t['com.affine.collection-bar.action.tooltip.edit'](),
|
|
||||||
click: () => {
|
|
||||||
setOpen(true);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: <DeleteIcon style={{ color: 'var(--affine-error-color)' }} />,
|
|
||||||
name: 'delete',
|
|
||||||
tooltip: t['com.affine.collection-bar.action.tooltip.delete'](),
|
|
||||||
click: () => {
|
|
||||||
setting.deleteCollection(collection.id).catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[collection, t, setting]
|
|
||||||
);
|
|
||||||
const onClose = useCallback(() => setOpen(false), []);
|
const onClose = useCallback(() => setOpen(false), []);
|
||||||
|
|
||||||
return !setting.isDefault ? (
|
return !setting.isDefault ? (
|
||||||
|
|||||||
@@ -3,19 +3,12 @@ import type { Collection, Filter } from '@affine/env/filter';
|
|||||||
import type { PropertiesMeta } from '@affine/env/filter';
|
import type { PropertiesMeta } from '@affine/env/filter';
|
||||||
import type { GetPageInfoById } from '@affine/env/page-info';
|
import type { GetPageInfoById } from '@affine/env/page-info';
|
||||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||||
import {
|
import { FilteredIcon, FolderIcon, ViewLayersIcon } from '@blocksuite/icons';
|
||||||
DeleteIcon,
|
|
||||||
FilteredIcon,
|
|
||||||
FilterIcon,
|
|
||||||
FolderIcon,
|
|
||||||
PinIcon,
|
|
||||||
ViewLayersIcon,
|
|
||||||
} from '@blocksuite/icons';
|
|
||||||
import { Button } from '@toeverything/components/button';
|
import { Button } from '@toeverything/components/button';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import { useAtom } from 'jotai';
|
import { useAtom } from 'jotai';
|
||||||
import type { MouseEvent, ReactNode } from 'react';
|
import type { MouseEvent } from 'react';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
|
|
||||||
import { MenuItem, Tooltip } from '../../..';
|
import { MenuItem, Tooltip } from '../../..';
|
||||||
import Menu from '../../../ui/menu/menu';
|
import Menu from '../../../ui/menu/menu';
|
||||||
@@ -23,6 +16,7 @@ import { appSidebarOpenAtom } from '../../app-sidebar';
|
|||||||
import { CreateFilterMenu } from '../filter/vars';
|
import { CreateFilterMenu } from '../filter/vars';
|
||||||
import type { useCollectionManager } from '../use-collection-manager';
|
import type { useCollectionManager } from '../use-collection-manager';
|
||||||
import * as styles from './collection-list.css';
|
import * as styles from './collection-list.css';
|
||||||
|
import { useActions } from './use-action';
|
||||||
|
|
||||||
const CollectionOption = ({
|
const CollectionOption = ({
|
||||||
collection,
|
collection,
|
||||||
@@ -33,46 +27,12 @@ const CollectionOption = ({
|
|||||||
setting: ReturnType<typeof useCollectionManager>;
|
setting: ReturnType<typeof useCollectionManager>;
|
||||||
updateCollection: (view: Collection) => void;
|
updateCollection: (view: Collection) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const actions: {
|
const actions = useActions({
|
||||||
icon: ReactNode;
|
collection,
|
||||||
click: () => void;
|
setting,
|
||||||
className?: string;
|
openEdit: updateCollection,
|
||||||
name: string;
|
});
|
||||||
}[] = useMemo(
|
|
||||||
() => [
|
|
||||||
{
|
|
||||||
icon: <PinIcon />,
|
|
||||||
name: 'pin',
|
|
||||||
click: () => {
|
|
||||||
setting
|
|
||||||
.updateCollection({
|
|
||||||
...collection,
|
|
||||||
pinned: !collection.pinned,
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: <FilterIcon />,
|
|
||||||
name: 'edit',
|
|
||||||
click: () => {
|
|
||||||
updateCollection(collection);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: <DeleteIcon style={{ color: 'var(--affine-error-color)' }} />,
|
|
||||||
name: 'delete',
|
|
||||||
click: () => {
|
|
||||||
setting.deleteCollection(collection.id).catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[setting, updateCollection, collection]
|
|
||||||
);
|
|
||||||
const selectCollection = useCallback(
|
const selectCollection = useCallback(
|
||||||
() => setting.selectCollection(collection.id),
|
() => setting.selectCollection(collection.id),
|
||||||
[setting, collection.id]
|
[setting, collection.id]
|
||||||
@@ -112,20 +72,21 @@ const CollectionOption = ({
|
|||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{actions.map((v, i) => {
|
{actions.map((action, i) => {
|
||||||
const onClick = (e: MouseEvent<HTMLDivElement>) => {
|
const onClick = (e: MouseEvent<HTMLDivElement>) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
v.click();
|
action.click();
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
data-testid={`collection-select-option-${v.name}`}
|
data-testid={`collection-select-option-${action.name}`}
|
||||||
key={i}
|
key={i}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
style={{ marginLeft: i === 0 ? 28 : undefined }}
|
style={{ marginLeft: i === 0 ? 28 : undefined }}
|
||||||
className={clsx(styles.viewOption, v.className)}
|
className={clsx(styles.viewOption, action.className)}
|
||||||
>
|
>
|
||||||
{v.icon}
|
{action.icon}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import type { Collection } from '@affine/env/filter';
|
||||||
|
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||||
|
import {
|
||||||
|
DeleteIcon,
|
||||||
|
FilterIcon,
|
||||||
|
PinedIcon,
|
||||||
|
PinIcon,
|
||||||
|
UnpinIcon,
|
||||||
|
} from '@blocksuite/icons';
|
||||||
|
import { type ReactNode, useMemo } from 'react';
|
||||||
|
|
||||||
|
import type { useCollectionManager } from '../use-collection-manager';
|
||||||
|
import * as styles from './collection-bar.css';
|
||||||
|
|
||||||
|
interface CollectionBarAction {
|
||||||
|
icon: ReactNode;
|
||||||
|
click: () => void;
|
||||||
|
className?: string;
|
||||||
|
name: string;
|
||||||
|
tooltip: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useActions = ({
|
||||||
|
collection,
|
||||||
|
setting,
|
||||||
|
openEdit,
|
||||||
|
}: {
|
||||||
|
collection: Collection;
|
||||||
|
setting: ReturnType<typeof useCollectionManager>;
|
||||||
|
openEdit: (open: Collection) => void;
|
||||||
|
}) => {
|
||||||
|
const t = useAFFiNEI18N();
|
||||||
|
return useMemo<CollectionBarAction[]>(() => {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
icon: (
|
||||||
|
<>
|
||||||
|
{collection.pinned ? (
|
||||||
|
<PinedIcon className={styles.pinedIcon}></PinedIcon>
|
||||||
|
) : (
|
||||||
|
<PinIcon className={styles.pinedIcon}></PinIcon>
|
||||||
|
)}
|
||||||
|
{collection.pinned ? (
|
||||||
|
<UnpinIcon className={styles.pinIcon}></UnpinIcon>
|
||||||
|
) : (
|
||||||
|
<PinIcon className={styles.pinIcon}></PinIcon>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
name: 'pin',
|
||||||
|
tooltip: collection.pinned
|
||||||
|
? t['com.affine.collection-bar.action.tooltip.unpin']()
|
||||||
|
: t['com.affine.collection-bar.action.tooltip.pin'](),
|
||||||
|
className: styles.pin,
|
||||||
|
click: () => {
|
||||||
|
setting
|
||||||
|
.updateCollection({
|
||||||
|
...collection,
|
||||||
|
pinned: !collection.pinned,
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: <FilterIcon />,
|
||||||
|
name: 'edit',
|
||||||
|
tooltip: t['com.affine.collection-bar.action.tooltip.edit'](),
|
||||||
|
click: () => {
|
||||||
|
openEdit(collection);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: <DeleteIcon style={{ color: 'var(--affine-error-color)' }} />,
|
||||||
|
name: 'delete',
|
||||||
|
tooltip: t['com.affine.collection-bar.action.tooltip.delete'](),
|
||||||
|
click: () => {
|
||||||
|
setting.deleteCollection(collection.id).catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}, [collection, t, setting, openEdit]);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user