mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 04:18:54 +00:00
fix: collections should be unique for workspaces (#3213)
This commit is contained in:
@@ -187,7 +187,6 @@ export const BlockSuitePageList: React.FC<BlockSuitePageListProps> = ({
|
||||
const pageList: ListData[] = list.map(pageMeta => {
|
||||
const page = blockSuiteWorkspace.getPage(pageMeta.id);
|
||||
const preview = page ? getPagePreviewText(page) : undefined;
|
||||
|
||||
return {
|
||||
icon: isPreferredEdgeless(pageMeta.id) ? <EdgelessIcon /> : <PageIcon />,
|
||||
pageId: pageMeta.id,
|
||||
@@ -230,6 +229,7 @@ export const BlockSuitePageList: React.FC<BlockSuitePageListProps> = ({
|
||||
});
|
||||
return (
|
||||
<PageList
|
||||
workspaceId={blockSuiteWorkspace.id}
|
||||
propertiesMeta={blockSuiteWorkspace.meta.properties}
|
||||
getPageInfo={getPageInfo}
|
||||
onCreateNewPage={createPage}
|
||||
|
||||
@@ -130,7 +130,7 @@ const CollectionRenderer = ({
|
||||
getPageInfo: GetPageInfoById;
|
||||
}) => {
|
||||
const [collapsed, setCollapsed] = React.useState(true);
|
||||
const setting = useCollectionManager();
|
||||
const setting = useCollectionManager(workspace.id);
|
||||
const router = useRouter();
|
||||
const clickCollection = useCallback(() => {
|
||||
router
|
||||
@@ -255,7 +255,7 @@ const CollectionRenderer = ({
|
||||
};
|
||||
export const CollectionsList = ({ currentWorkspace }: CollectionsListProps) => {
|
||||
const metas = useBlockSuitePageMeta(currentWorkspace.blockSuiteWorkspace);
|
||||
const { savedCollections } = useSavedCollections();
|
||||
const { savedCollections } = useSavedCollections(currentWorkspace.id);
|
||||
const getPageInfo = useGetPageInfoById();
|
||||
return (
|
||||
<div data-testid="collections" className={styles.wrapper}>
|
||||
|
||||
@@ -23,7 +23,7 @@ export function WorkspaceHeader({
|
||||
currentWorkspaceId,
|
||||
currentEntry,
|
||||
}: WorkspaceHeaderProps<WorkspaceFlavour>): ReactElement {
|
||||
const setting = useCollectionManager();
|
||||
const setting = useCollectionManager(currentWorkspaceId);
|
||||
const t = useAFFiNEI18N();
|
||||
const saveToCollection = useCallback(
|
||||
async (collection: Collection) => {
|
||||
@@ -73,6 +73,7 @@ export function WorkspaceHeader({
|
||||
id: uuidv4(),
|
||||
name: '',
|
||||
filterList: setting.currentCollection.filterList,
|
||||
workspaceId: currentWorkspaceId,
|
||||
}}
|
||||
onConfirm={saveToCollection}
|
||||
></SaveCollectionButton>
|
||||
|
||||
@@ -27,7 +27,7 @@ const WorkspaceDetail: React.FC = () => {
|
||||
assertExists(currentWorkspace);
|
||||
assertExists(currentPageId);
|
||||
const blockSuiteWorkspace = currentWorkspace.blockSuiteWorkspace;
|
||||
const collectionManager = useCollectionManager();
|
||||
const collectionManager = useCollectionManager(currentWorkspace.id);
|
||||
const onLoad = useCallback(
|
||||
(page: Page, editor: EditorContainer) => {
|
||||
const dispose = editor.slots.pageLinkClicked.on(({ pageId }) => {
|
||||
|
||||
@@ -15,9 +15,9 @@ import type { NextPageWithLayout } from '../../../shared';
|
||||
|
||||
const AllPage: NextPageWithLayout = () => {
|
||||
const router = useRouter();
|
||||
const setting = useCollectionManager();
|
||||
const { jumpToPage } = useRouterHelper(router);
|
||||
const [currentWorkspace] = useCurrentWorkspace();
|
||||
const setting = useCollectionManager(currentWorkspace.id);
|
||||
const t = useAFFiNEI18N();
|
||||
const onClickPage = useCallback(
|
||||
(pageId: string, newTab?: boolean) => {
|
||||
|
||||
@@ -12,12 +12,13 @@ import { useCollectionManager } from '../use-collection-manager';
|
||||
const defaultMeta = { tags: { options: [] } };
|
||||
|
||||
test('useAllPageSetting', async () => {
|
||||
const settingHook = renderHook(() => useCollectionManager());
|
||||
const settingHook = renderHook(() => useCollectionManager('test'));
|
||||
const prevCollection = settingHook.result.current.currentCollection;
|
||||
expect(settingHook.result.current.savedCollections).toEqual([]);
|
||||
await settingHook.result.current.updateCollection({
|
||||
...settingHook.result.current.currentCollection,
|
||||
filterList: [createDefaultFilter(vars[0], defaultMeta)],
|
||||
workspaceId: 'test',
|
||||
});
|
||||
settingHook.rerender();
|
||||
const nextCollection = settingHook.result.current.currentCollection;
|
||||
|
||||
@@ -36,6 +36,7 @@ const AllPagesHead = ({
|
||||
importFile,
|
||||
getPageInfo,
|
||||
propertiesMeta,
|
||||
workspaceId,
|
||||
}: {
|
||||
isPublicWorkspace: boolean;
|
||||
sorter: ReturnType<typeof useSorter<ListData>>;
|
||||
@@ -44,6 +45,7 @@ const AllPagesHead = ({
|
||||
importFile: () => void;
|
||||
getPageInfo: GetPageInfoById;
|
||||
propertiesMeta: PropertiesMeta;
|
||||
workspaceId: string;
|
||||
}) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const titleList = useMemo(
|
||||
@@ -143,6 +145,7 @@ const AllPagesHead = ({
|
||||
<TableHead>
|
||||
<TableHeadRow>{tableItem}</TableHeadRow>
|
||||
<CollectionBar
|
||||
workspaceId={workspaceId}
|
||||
columnsCount={titleList.length}
|
||||
getPageInfo={getPageInfo}
|
||||
propertiesMeta={propertiesMeta}
|
||||
@@ -153,6 +156,7 @@ const AllPagesHead = ({
|
||||
|
||||
export const PageList = ({
|
||||
isPublicWorkspace = false,
|
||||
workspaceId,
|
||||
list,
|
||||
onCreateNewPage,
|
||||
onCreateNewEdgeless,
|
||||
@@ -197,6 +201,7 @@ export const PageList = ({
|
||||
<StyledTableContainer ref={ref}>
|
||||
<Table showBorder={hasScrollTop} style={{ maxHeight: '100%' }}>
|
||||
<AllPagesHead
|
||||
workspaceId={workspaceId}
|
||||
propertiesMeta={propertiesMeta}
|
||||
isPublicWorkspace={isPublicWorkspace}
|
||||
sorter={sorter}
|
||||
|
||||
@@ -45,6 +45,7 @@ export type TrashListData = {
|
||||
|
||||
export type PageListProps = {
|
||||
isPublicWorkspace?: boolean;
|
||||
workspaceId: string;
|
||||
list: ListData[];
|
||||
fallback?: React.ReactNode;
|
||||
onCreateNewPage: () => void;
|
||||
|
||||
@@ -35,6 +35,7 @@ const defaultCollection = {
|
||||
id: NIL,
|
||||
name: 'All',
|
||||
filterList: [],
|
||||
workspaceId: 'temporary',
|
||||
};
|
||||
const collectionAtom = atomWithReset<{
|
||||
currentId: string;
|
||||
@@ -44,14 +45,15 @@ const collectionAtom = atomWithReset<{
|
||||
defaultCollection: defaultCollection,
|
||||
});
|
||||
|
||||
export const useSavedCollections = () => {
|
||||
export const useSavedCollections = (workspaceId: string) => {
|
||||
const { data: savedCollections, mutate } = useSWRImmutable<Collection[]>(
|
||||
['affine', 'page-collection'],
|
||||
['affine', 'page-collection', workspaceId],
|
||||
{
|
||||
fetcher: async () => {
|
||||
const db = await pageCollectionDBPromise;
|
||||
const t = db.transaction('view').objectStore('view');
|
||||
return await t.getAll();
|
||||
const all = await t.getAll();
|
||||
return all.filter(v => v.workspaceId === workspaceId);
|
||||
},
|
||||
suspense: true,
|
||||
fallbackData: [],
|
||||
@@ -103,9 +105,9 @@ export const useSavedCollections = () => {
|
||||
};
|
||||
};
|
||||
|
||||
export const useCollectionManager = () => {
|
||||
export const useCollectionManager = (workspaceId: string) => {
|
||||
const { savedCollections, saveCollection, deleteCollection, addPage } =
|
||||
useSavedCollections();
|
||||
useSavedCollections(workspaceId);
|
||||
const [collectionData, setCollectionData] = useAtom(collectionAtom);
|
||||
|
||||
const updateCollection = useCallback(
|
||||
|
||||
@@ -22,12 +22,14 @@ export const CollectionBar = ({
|
||||
getPageInfo,
|
||||
propertiesMeta,
|
||||
columnsCount,
|
||||
workspaceId,
|
||||
}: {
|
||||
getPageInfo: GetPageInfoById;
|
||||
propertiesMeta: PropertiesMeta;
|
||||
columnsCount: number;
|
||||
workspaceId: string;
|
||||
}) => {
|
||||
const setting = useCollectionManager();
|
||||
const setting = useCollectionManager(workspaceId);
|
||||
const collection = setting.currentCollection;
|
||||
const [open, setOpen] = useState(false);
|
||||
const actions: {
|
||||
|
||||
1
packages/env/src/filter.ts
vendored
1
packages/env/src/filter.ts
vendored
@@ -29,6 +29,7 @@ export type Filter = {
|
||||
|
||||
export type Collection = {
|
||||
id: string;
|
||||
workspaceId: string;
|
||||
name: string;
|
||||
pinned?: boolean;
|
||||
filterList: Filter[];
|
||||
|
||||
Reference in New Issue
Block a user