From 83f2b3886ef204639cbf98bf4b2f035b9eb6f18e Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Tue, 15 Jul 2025 13:14:41 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(frontend)=20add=20duplicate=20action?= =?UTF-8?q?=20to=20doc=20tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We added a duplicate action to the document tree. --- CHANGELOG.md | 4 ++++ .../__tests__/app-impress/doc-header.spec.ts | 17 +++++++++----- .../components/DocTreeItemActions.tsx | 22 +++++++++++++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba9d3d6f..8d16acc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to ## [Unreleased] +### Added + +- ✨(frontend) add duplicate action to doc tree #1175 + ### Changed - ♻️(frontend) redirect to doc after duplicate #1175 diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts index 9539dff0..ed7486cd 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts @@ -471,14 +471,19 @@ test.describe('Doc Header', () => { await editor.click(); await editor.fill('Hello Duplicated World'); - await page.getByLabel('Open the document options').click(); + const duplicateTitle = 'Copy of ' + childTitle; + const docTree = page.getByTestId('doc-tree'); + + const child = docTree + .getByRole('treeitem') + .locator('.--docs-sub-page-item') + .filter({ + hasText: childTitle, + }); + await child.hover(); + await child.getByText(`more_horiz`).click(); await page.getByRole('menuitem', { name: 'Duplicate' }).click(); - await expect( - page.getByText('Document duplicated successfully!'), - ).toBeVisible(); - - const duplicateTitle = 'Copy of ' + childTitle; await verifyDocName(page, duplicateTitle); diff --git a/src/frontend/apps/impress/src/features/docs/doc-tree/components/DocTreeItemActions.tsx b/src/frontend/apps/impress/src/features/docs/doc-tree/components/DocTreeItemActions.tsx index 37fe8199..1d8d8a92 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-tree/components/DocTreeItemActions.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-tree/components/DocTreeItemActions.tsx @@ -10,13 +10,14 @@ import { useTranslation } from 'react-i18next'; import { css } from 'styled-components'; import { Box, BoxButton, Icon } from '@/components'; - import { Doc, ModalRemoveDoc, Role, useCopyDocLink, -} from '../../doc-management'; + useDuplicateDoc, +} from '@/docs/doc-management'; + import { useCreateChildrenDoc } from '../api/useCreateChildren'; import { useDetachDoc } from '../api/useDetach'; import MoveDocIcon from '../assets/doc-extract-bold.svg'; @@ -45,6 +46,11 @@ export const DocTreeItemActions = ({ const { isCurrentParent } = useTreeUtils(doc); const { mutate: detachDoc } = useDetachDoc(); const treeContext = useTreeContext(); + const { mutate: duplicateDoc } = useDuplicateDoc({ + onSuccess: (data) => { + void router.push(`/docs/${data.id}`); + }, + }); const handleDetachDoc = () => { if (!treeContext?.root) { @@ -89,6 +95,18 @@ export const DocTreeItemActions = ({ }, ] : []), + { + label: t('Duplicate'), + icon: , + isDisabled: !doc.abilities.duplicate, + callback: () => { + duplicateDoc({ + docId: doc.id, + with_accesses: false, + canSave: doc.abilities.partial_update, + }); + }, + }, { label: t('Delete'), isDisabled: !doc.abilities.destroy,