(frontend) add duplicate action to doc tree

We added a duplicate action to the document tree.
This commit is contained in:
Anthony LC
2025-07-15 13:14:41 +02:00
parent 966e514c5a
commit 83f2b3886e
3 changed files with 35 additions and 8 deletions

View File

@@ -8,6 +8,10 @@ and this project adheres to
## [Unreleased] ## [Unreleased]
### Added
- ✨(frontend) add duplicate action to doc tree #1175
### Changed ### Changed
- ♻️(frontend) redirect to doc after duplicate #1175 - ♻️(frontend) redirect to doc after duplicate #1175

View File

@@ -471,14 +471,19 @@ test.describe('Doc Header', () => {
await editor.click(); await editor.click();
await editor.fill('Hello Duplicated World'); 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 page.getByRole('menuitem', { name: 'Duplicate' }).click();
await expect(
page.getByText('Document duplicated successfully!'),
).toBeVisible();
const duplicateTitle = 'Copy of ' + childTitle;
await verifyDocName(page, duplicateTitle); await verifyDocName(page, duplicateTitle);

View File

@@ -10,13 +10,14 @@ import { useTranslation } from 'react-i18next';
import { css } from 'styled-components'; import { css } from 'styled-components';
import { Box, BoxButton, Icon } from '@/components'; import { Box, BoxButton, Icon } from '@/components';
import { import {
Doc, Doc,
ModalRemoveDoc, ModalRemoveDoc,
Role, Role,
useCopyDocLink, useCopyDocLink,
} from '../../doc-management'; useDuplicateDoc,
} from '@/docs/doc-management';
import { useCreateChildrenDoc } from '../api/useCreateChildren'; import { useCreateChildrenDoc } from '../api/useCreateChildren';
import { useDetachDoc } from '../api/useDetach'; import { useDetachDoc } from '../api/useDetach';
import MoveDocIcon from '../assets/doc-extract-bold.svg'; import MoveDocIcon from '../assets/doc-extract-bold.svg';
@@ -45,6 +46,11 @@ export const DocTreeItemActions = ({
const { isCurrentParent } = useTreeUtils(doc); const { isCurrentParent } = useTreeUtils(doc);
const { mutate: detachDoc } = useDetachDoc(); const { mutate: detachDoc } = useDetachDoc();
const treeContext = useTreeContext<Doc>(); const treeContext = useTreeContext<Doc>();
const { mutate: duplicateDoc } = useDuplicateDoc({
onSuccess: (data) => {
void router.push(`/docs/${data.id}`);
},
});
const handleDetachDoc = () => { const handleDetachDoc = () => {
if (!treeContext?.root) { if (!treeContext?.root) {
@@ -89,6 +95,18 @@ export const DocTreeItemActions = ({
}, },
] ]
: []), : []),
{
label: t('Duplicate'),
icon: <Icon $variation="600" iconName="content_copy" />,
isDisabled: !doc.abilities.duplicate,
callback: () => {
duplicateDoc({
docId: doc.id,
with_accesses: false,
canSave: doc.abilities.partial_update,
});
},
},
{ {
label: t('Delete'), label: t('Delete'),
isDisabled: !doc.abilities.destroy, isDisabled: !doc.abilities.destroy,