From de4d11732f25d86e1175d50cb788702be7dd5704 Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Fri, 3 Oct 2025 12:45:55 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(frontend)=20can=20restore=20from=20tr?= =?UTF-8?q?ashbin=20list=20actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We can now restore a doc from the trashbin list actions. --- .../app-impress/doc-trashbin.spec.ts | 22 +++++ .../impress/src/components/TextErrors.tsx | 54 +++++++----- .../components/dropdown-menu/DropdownMenu.tsx | 8 +- .../apps/impress/src/components/index.ts | 3 +- .../src/components/modal/ButtonCloseModal.tsx | 4 +- .../impress/src/components/modal/index.ts | 2 + .../doc-export/components/ModalExport.tsx | 3 +- .../features/docs/doc-management/api/index.ts | 3 +- .../docs/doc-management/api/useDocs.tsx | 16 ++-- .../docs/doc-management/api/useRemoveDoc.tsx | 16 ++-- .../docs/doc-management/api/useRestoreDoc.tsx | 55 ++++++++++++ .../components/ModalRemoveDoc.tsx | 51 +++++++---- .../doc-search/components/DocSearchModal.tsx | 3 +- .../doc-share/components/DocShareModal.tsx | 3 +- .../components/ModalSelectVersion.tsx | 3 +- .../src/features/docs/docs-grid/api/index.ts | 1 + .../docs/docs-grid/api/useDocsTrashbin.tsx | 60 +++++++++++++ .../components/DocsGridTrashbinActions.tsx | 88 +++++++++++++++++++ .../src/features/docs/docs-grid/index.ts | 1 + 19 files changed, 332 insertions(+), 64 deletions(-) create mode 100644 src/frontend/apps/impress/src/components/modal/index.ts create mode 100644 src/frontend/apps/impress/src/features/docs/doc-management/api/useRestoreDoc.tsx create mode 100644 src/frontend/apps/impress/src/features/docs/docs-grid/api/index.ts create mode 100644 src/frontend/apps/impress/src/features/docs/docs-grid/api/useDocsTrashbin.tsx create mode 100644 src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGridTrashbinActions.tsx diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-trashbin.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-trashbin.spec.ts index 6f1a56da..3b723404 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-trashbin.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-trashbin.spec.ts @@ -29,10 +29,12 @@ test.describe('Doc Trashbin', () => { const row1 = await getGridRow(page, title1); await clickInGridMenu(page, row1, 'Delete'); await page.getByRole('button', { name: 'Delete document' }).click(); + await expect(row1.getByText(title1)).toBeHidden(); const row2 = await getGridRow(page, title2); await clickInGridMenu(page, row2, 'Delete'); await page.getByRole('button', { name: 'Delete document' }).click(); + await expect(row2.getByText(title2)).toBeHidden(); await page.getByRole('link', { name: 'Trashbin' }).click(); @@ -51,5 +53,25 @@ test.describe('Doc Trashbin', () => { name: 'Open the sharing settings for the document', }), ).toBeDisabled(); + + await clickInGridMenu(page, row2, 'Restore'); + + await expect(row2.getByText(title2)).toBeHidden(); + await page.getByRole('link', { name: 'All docs' }).click(); + const row2Restored = await getGridRow(page, title2); + await expect(row2Restored.getByText(title2)).toBeVisible(); + await row2Restored.getByRole('link', { name: /Open document/ }).click(); + + await verifyDocName(page, title2); + await page.getByRole('button', { name: 'Back to homepage' }).click(); + await expect(row2.getByText(title2)).toBeVisible(); + await expect( + row2.getByRole('button', { + name: 'Open the sharing settings for the document', + }), + ).toBeEnabled(); + + await page.getByRole('link', { name: 'Trashbin' }).click(); + await expect(row2.getByText(title2)).toBeHidden(); }); }); diff --git a/src/frontend/apps/impress/src/components/TextErrors.tsx b/src/frontend/apps/impress/src/components/TextErrors.tsx index baf22a2d..9bfa6453 100644 --- a/src/frontend/apps/impress/src/components/TextErrors.tsx +++ b/src/frontend/apps/impress/src/components/TextErrors.tsx @@ -25,8 +25,6 @@ export const TextErrors = ({ canClose = false, ...textProps }: TextErrorsProps) => { - const { t } = useTranslation(); - return ( - - {causes && - causes.map((cause, i) => ( - - {cause} - - ))} + + + ); +}; - {!causes && ( +export const TextOnlyErrors = ({ + causes, + defaultMessage, + ...textProps +}: TextErrorsProps) => { + const { t } = useTranslation(); + + return ( + + {causes && + causes.map((cause, i) => ( - {defaultMessage || t('Something bad happens, please retry.')} + {cause} - )} - - + ))} + + {!causes && ( + + {defaultMessage || t('Something bad happens, please retry.')} + + )} + ); }; diff --git a/src/frontend/apps/impress/src/components/dropdown-menu/DropdownMenu.tsx b/src/frontend/apps/impress/src/components/dropdown-menu/DropdownMenu.tsx index 4df80cc7..f0af724d 100644 --- a/src/frontend/apps/impress/src/components/dropdown-menu/DropdownMenu.tsx +++ b/src/frontend/apps/impress/src/components/dropdown-menu/DropdownMenu.tsx @@ -2,6 +2,7 @@ import { HorizontalSeparator } from '@gouvfr-lasuite/ui-kit'; import { Fragment, PropsWithChildren, + ReactNode, useCallback, useEffect, useRef, @@ -15,7 +16,7 @@ import { useCunninghamTheme } from '@/cunningham'; import { useDropdownKeyboardNav } from './hook/useDropdownKeyboardNav'; export type DropdownMenuOption = { - icon?: string; + icon?: ReactNode; label: string; testId?: string; value?: string; @@ -220,7 +221,7 @@ export const DropdownMenu = ({ $align="center" $gap={spacingsTokens['base']} > - {option.icon && ( + {option.icon && typeof option.icon === 'string' && (