✨(frontend) add duplicate action to doc tree
We added a duplicate action to the document tree.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user