feat(core): add new doc button to collection item (#6521)

https://github.com/toeverything/AFFiNE/assets/102217452/3da65392-cee8-4f51-a05d-82e27027fa78
This commit is contained in:
JimmFly
2024-04-12 06:19:10 +00:00
parent d40052c748
commit 9c38acf081
3 changed files with 86 additions and 2 deletions

View File

@@ -6,6 +6,7 @@ import {
MenuItem, MenuItem,
toast, toast,
Tooltip, Tooltip,
useConfirmModal,
} from '@affine/component'; } from '@affine/component';
import { useAppSettingHelper } from '@affine/core/hooks/affine/use-app-setting-helper'; import { useAppSettingHelper } from '@affine/core/hooks/affine/use-app-setting-helper';
import { useBlockSuiteMetaHelper } from '@affine/core/hooks/affine/use-block-suite-meta-helper'; import { useBlockSuiteMetaHelper } from '@affine/core/hooks/affine/use-block-suite-meta-helper';
@@ -25,6 +26,7 @@ import {
FilterMinusIcon, FilterMinusIcon,
MoreVerticalIcon, MoreVerticalIcon,
OpenInNewIcon, OpenInNewIcon,
PlusIcon,
ResetIcon, ResetIcon,
SplitViewIcon, SplitViewIcon,
} from '@blocksuite/icons'; } from '@blocksuite/icons';
@@ -34,6 +36,7 @@ import { useCallback, useState } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import type { CollectionService } from '../../modules/collection'; import type { CollectionService } from '../../modules/collection';
import { usePageHelper } from '../blocksuite/block-suite-page-list/utils';
import { FavoriteTag } from './components/favorite-tag'; import { FavoriteTag } from './components/favorite-tag';
import * as styles from './list.css'; import * as styles from './list.css';
import { DisablePublicSharing, MoveToTrash } from './operation-menu-items'; import { DisablePublicSharing, MoveToTrash } from './operation-menu-items';
@@ -285,7 +288,10 @@ export const CollectionOperationCell = ({
info, info,
}: CollectionOperationCellProps) => { }: CollectionOperationCellProps) => {
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const favAdapter = useService(FavoriteItemsAdapter); const favAdapter = useService(FavoriteItemsAdapter);
const { createPage } = usePageHelper(config.docCollection);
const { openConfirmModal } = useConfirmModal();
const favourite = useLiveData( const favourite = useLiveData(
favAdapter.isFavorite$(collection.id, 'collection') favAdapter.isFavorite$(collection.id, 'collection')
); );
@@ -336,6 +342,24 @@ export const CollectionOperationCell = ({
); );
}, [favAdapter, collection.id, t]); }, [favAdapter, collection.id, t]);
const createAndAddDocument = useCallback(() => {
const newDoc = createPage();
service.addPageToCollection(collection.id, newDoc.id);
}, [collection.id, createPage, service]);
const onConfirmAddDocToCollection = useCallback(() => {
openConfirmModal({
title: t['com.affine.collection.add-doc.confirm.title'](),
description: t['com.affine.collection.add-doc.confirm.description'](),
cancelText: t['Cancel'](),
confirmButtonOptions: {
type: 'primary',
children: t['Confirm'](),
},
onConfirm: createAndAddDocument,
});
}, [createAndAddDocument, openConfirmModal, t]);
return ( return (
<> <>
{editModal} {editModal}
@@ -380,6 +404,16 @@ export const CollectionOperationCell = ({
? t['com.affine.favoritePageOperation.remove']() ? t['com.affine.favoritePageOperation.remove']()
: t['com.affine.favoritePageOperation.add']()} : t['com.affine.favoritePageOperation.add']()}
</MenuItem> </MenuItem>
<MenuItem
onClick={onConfirmAddDocToCollection}
preFix={
<MenuIcon>
<PlusIcon />
</MenuIcon>
}
>
{t['New Page']()}
</MenuItem>
<MenuItem <MenuItem
onClick={handleDelete} onClick={handleDelete}
preFix={ preFix={

View File

@@ -12,6 +12,7 @@ import {
FavoritedIcon, FavoritedIcon,
FavoriteIcon, FavoriteIcon,
FilterIcon, FilterIcon,
PlusIcon,
SplitViewIcon, SplitViewIcon,
} from '@blocksuite/icons'; } from '@blocksuite/icons';
import { useLiveData, useService } from '@toeverything/infra'; import { useLiveData, useService } from '@toeverything/infra';
@@ -30,11 +31,13 @@ export const CollectionOperations = ({
collection, collection,
config, config,
openRenameModal, openRenameModal,
onAddDocToCollection,
children, children,
}: PropsWithChildren<{ }: PropsWithChildren<{
collection: Collection; collection: Collection;
config: AllPageListConfig; config: AllPageListConfig;
openRenameModal?: () => void; openRenameModal?: () => void;
onAddDocToCollection?: () => void;
}>) => { }>) => {
const deleteInfo = useDeleteCollectionInfo(); const deleteInfo = useDeleteCollectionInfo();
const { appSettings } = useAppSettingHelper(); const { appSettings } = useAppSettingHelper();
@@ -125,6 +128,19 @@ export const CollectionOperations = ({
name: t['com.affine.collection.menu.edit'](), name: t['com.affine.collection.menu.edit'](),
click: showEdit, click: showEdit,
}, },
...(onAddDocToCollection
? [
{
icon: (
<MenuIcon>
<PlusIcon />
</MenuIcon>
),
name: t['New Page'](),
click: onAddDocToCollection,
},
]
: []),
{ {
icon: ( icon: (
<MenuIcon> <MenuIcon>
@@ -173,6 +189,7 @@ export const CollectionOperations = ({
t, t,
showEditName, showEditName,
showEdit, showEdit,
onAddDocToCollection,
favorite, favorite,
onToggleFavoritePage, onToggleFavoritePage,
appSettings.enableMultiView, appSettings.enableMultiView,

View File

@@ -1,6 +1,11 @@
import { AnimatedCollectionsIcon, toast } from '@affine/component'; import {
AnimatedCollectionsIcon,
toast,
useConfirmModal,
} from '@affine/component';
import { RenameModal } from '@affine/component/rename-modal'; import { RenameModal } from '@affine/component/rename-modal';
import { Button, IconButton } from '@affine/component/ui/button'; import { Button, IconButton } from '@affine/component/ui/button';
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
import { import {
CollectionOperations, CollectionOperations,
filterPage, filterPage,
@@ -16,7 +21,11 @@ import { CollectionService } from '@affine/core/modules/collection';
import { FavoriteItemsAdapter } from '@affine/core/modules/workspace'; import { FavoriteItemsAdapter } from '@affine/core/modules/workspace';
import type { Collection } from '@affine/env/filter'; import type { Collection } from '@affine/env/filter';
import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { MoreHorizontalIcon, ViewLayersIcon } from '@blocksuite/icons'; import {
MoreHorizontalIcon,
PlusIcon,
ViewLayersIcon,
} from '@blocksuite/icons';
import type { DocCollection } from '@blocksuite/store'; import type { DocCollection } from '@blocksuite/store';
import { type AnimateLayoutChanges, useSortable } from '@dnd-kit/sortable'; import { type AnimateLayoutChanges, useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities'; import { CSS } from '@dnd-kit/utilities';
@@ -56,6 +65,8 @@ export const CollectionSidebarNavItem = ({
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const collectionService = useService(CollectionService); const collectionService = useService(CollectionService);
const favAdapter = useService(FavoriteItemsAdapter); const favAdapter = useService(FavoriteItemsAdapter);
const { createPage } = usePageHelper(docCollection);
const { openConfirmModal } = useConfirmModal();
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const favourites = useLiveData(favAdapter.favorites$); const favourites = useLiveData(favAdapter.favorites$);
@@ -138,6 +149,24 @@ export const CollectionSidebarNavItem = ({
setOpen(true); setOpen(true);
}, []); }, []);
const createAndAddDocument = useCallback(() => {
const newDoc = createPage();
collectionService.addPageToCollection(collection.id, newDoc.id);
}, [collection.id, collectionService, createPage]);
const onConfirmAddDocToCollection = useCallback(() => {
openConfirmModal({
title: t['com.affine.collection.add-doc.confirm.title'](),
description: t['com.affine.collection.add-doc.confirm.description'](),
cancelText: t['Cancel'](),
confirmButtonOptions: {
type: 'primary',
children: t['Confirm'](),
},
onConfirm: createAndAddDocument,
});
}, [createAndAddDocument, openConfirmModal, t]);
return ( return (
<Collapsible.Root <Collapsible.Root
open={!collapsed} open={!collapsed}
@@ -168,10 +197,14 @@ export const CollectionSidebarNavItem = ({
}} }}
style={{ display: 'flex', alignItems: 'center' }} style={{ display: 'flex', alignItems: 'center' }}
> >
<IconButton onClick={onConfirmAddDocToCollection} size="small">
<PlusIcon />
</IconButton>
<CollectionOperations <CollectionOperations
collection={collection} collection={collection}
config={config} config={config}
openRenameModal={handleOpen} openRenameModal={handleOpen}
onAddDocToCollection={onConfirmAddDocToCollection}
> >
<IconButton <IconButton
data-testid="collection-options" data-testid="collection-options"