From eed95366c98842e13da79cbda1ba5b1d76f5456e Mon Sep 17 00:00:00 2001 From: EYHN Date: Tue, 27 May 2025 15:06:55 +0900 Subject: [PATCH] fix(core): fix all docs permissions check (#12538) --- .../explorer/docs-view/docs-list.tsx | 4 +++- .../explorer/docs-view/more-menu.tsx | 5 +++++ .../explorer/docs-view/quick-actions.tsx | 19 ++++++++++++++++--- .../components/page-list/docs/select-page.tsx | 2 +- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/frontend/core/src/components/explorer/docs-view/docs-list.tsx b/packages/frontend/core/src/components/explorer/docs-view/docs-list.tsx index 30964f73b..6c0c8366a 100644 --- a/packages/frontend/core/src/components/explorer/docs-view/docs-list.tsx +++ b/packages/frontend/core/src/components/explorer/docs-view/docs-list.tsx @@ -95,12 +95,14 @@ export const DocListItemComponent = memo(function DocListItemComponent({ export const DocsExplorer = ({ className, + disableMultiSelectToolbar, disableMultiDelete, masonryItemWidthMin, onRestore, onDelete, }: { className?: string; + disableMultiSelectToolbar?: boolean; disableMultiDelete?: boolean; masonryItemWidthMin?: number; onRestore?: (ids: string[]) => void; @@ -244,7 +246,7 @@ export const DocsExplorer = ({ paddingY={BUILD_CONFIG.isMobileEdition ? 12 : 0} paddingX={BUILD_CONFIG.isMobileEdition ? 16 : responsivePaddingX} /> - {!disableMultiDelete || onRestore ? ( + {!disableMultiSelectToolbar || onRestore ? ( { const docsService = useService(DocsService); const { openConfirmModal } = useConfirmModal(); const doc = useLiveData(docsService.list.doc$(docId)); + const guardService = useService(GuardService); + + const canTrash = useLiveData(guardService.can$('Doc_Trash', docId)); const onMoveToTrash = useCallback(() => { if (!doc) { @@ -170,6 +174,7 @@ const MoveToTrash = ({ docId }: DocOperationProps) => { prefixIcon={} data-testid="doc-list-operation-trash" onClick={onMoveToTrash} + disabled={!canTrash} > {t['com.affine.moveToTrash.title']()} diff --git a/packages/frontend/core/src/components/explorer/docs-view/quick-actions.tsx b/packages/frontend/core/src/components/explorer/docs-view/quick-actions.tsx index 677ed83d7..46dadc5a7 100644 --- a/packages/frontend/core/src/components/explorer/docs-view/quick-actions.tsx +++ b/packages/frontend/core/src/components/explorer/docs-view/quick-actions.tsx @@ -9,6 +9,7 @@ import type { DocRecord } from '@affine/core/modules/doc'; import { CompatibleFavoriteItemsAdapter } from '@affine/core/modules/favorite'; import { GuardService } from '@affine/core/modules/permissions'; import { WorkbenchService } from '@affine/core/modules/workbench'; +import { UserFriendlyError } from '@affine/error'; import { useI18n } from '@affine/i18n'; import track from '@affine/track'; import { @@ -135,6 +136,7 @@ export const QuickDelete = memo(function QuickDelete({ const t = useI18n(); const { openConfirmModal } = useConfirmModal(); const contextValue = useContext(DocExplorerContext); + const guardService = useService(GuardService); const quickTrash = useLiveData(contextValue.quickTrash$); const onMoveToTrash = useCallback( @@ -157,12 +159,23 @@ export const QuickDelete = memo(function QuickDelete({ confirmButtonOptions: { variant: 'error', }, - onConfirm: () => { - doc.moveToTrash(); + onConfirm: async () => { + try { + const canTrash = await guardService.can('Doc_Trash', doc.id); + if (!canTrash) { + toast(t['com.affine.no-permission']()); + return; + } + doc.moveToTrash(); + } catch (error) { + console.error(error); + const userFriendlyError = UserFriendlyError.fromAny(error); + toast(t[`error.${userFriendlyError.name}`](userFriendlyError.data)); + } }, }); }, - [doc, onClick, openConfirmModal, t] + [doc, guardService, onClick, openConfirmModal, t] ); if (!quickTrash) { diff --git a/packages/frontend/core/src/components/page-list/docs/select-page.tsx b/packages/frontend/core/src/components/page-list/docs/select-page.tsx index e3cf12e94..6478ba083 100644 --- a/packages/frontend/core/src/components/page-list/docs/select-page.tsx +++ b/packages/frontend/core/src/components/page-list/docs/select-page.tsx @@ -189,7 +189,7 @@ export const SelectPage = memo(function SelectPage({ ) : null} {!isEmpty ? ( - + ) : (