From 6376189a63950ca2e12efbed8181da40d31a1682 Mon Sep 17 00:00:00 2001 From: James Brunton Date: Thu, 4 Sep 2025 13:57:19 +0100 Subject: [PATCH] Data-drive remaining simple tools --- .../tooltips/useChangePermissionsTips.ts | 21 ------- frontend/src/tools/ChangePermissions.tsx | 59 ++----------------- frontend/src/tools/RemoveCertificateSign.tsx | 43 ++------------ frontend/src/tools/SingleLargePage.tsx | 43 ++------------ frontend/src/tools/UnlockPdfForms.tsx | 43 ++------------ .../changePermissionsDefinition.ts | 42 +++++++++++++ .../removeCertificateSignDefinition.ts | 21 +++++++ .../definitions/singleLargePageDefinition.ts | 21 +++++++ .../definitions/unlockPdfFormsDefinition.ts | 21 +++++++ 9 files changed, 125 insertions(+), 189 deletions(-) delete mode 100644 frontend/src/components/tooltips/useChangePermissionsTips.ts create mode 100644 frontend/src/tools/definitions/changePermissionsDefinition.ts create mode 100644 frontend/src/tools/definitions/removeCertificateSignDefinition.ts create mode 100644 frontend/src/tools/definitions/singleLargePageDefinition.ts create mode 100644 frontend/src/tools/definitions/unlockPdfFormsDefinition.ts diff --git a/frontend/src/components/tooltips/useChangePermissionsTips.ts b/frontend/src/components/tooltips/useChangePermissionsTips.ts deleted file mode 100644 index 39c6fc299..000000000 --- a/frontend/src/components/tooltips/useChangePermissionsTips.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useTranslation } from 'react-i18next'; -import { TooltipContent } from '../../types/tips'; - -export const useChangePermissionsTips = (): TooltipContent => { - const { t } = useTranslation(); - - return { - header: { - title: t("changePermissions.tooltip.header.title", "Change Permissions") - }, - tips: [ - { - description: t("changePermissions.tooltip.description.text", "Changes document permissions, allowing/disallowing access to different features in PDF readers.") - }, - { - title: t("warning.tooltipTitle", "Warning"), - description: t("changePermissions.tooltip.warning.text", "To make these permissions unchangeable, use the Add Password tool to set an owner password.") - } - ] - }; -}; diff --git a/frontend/src/tools/ChangePermissions.tsx b/frontend/src/tools/ChangePermissions.tsx index 3982d1520..b4b2d7138 100644 --- a/frontend/src/tools/ChangePermissions.tsx +++ b/frontend/src/tools/ChangePermissions.tsx @@ -1,61 +1,12 @@ -import { useTranslation } from "react-i18next"; -import { createToolFlow } from "../components/tools/shared/createToolFlow"; -import ChangePermissionsSettings from "../components/tools/changePermissions/ChangePermissionsSettings"; -import { useChangePermissionsParameters } from "../hooks/tools/changePermissions/useChangePermissionsParameters"; -import { useChangePermissionsOperation } from "../hooks/tools/changePermissions/useChangePermissionsOperation"; -import { useChangePermissionsTips } from "../components/tooltips/useChangePermissionsTips"; -import { useBaseTool } from "../hooks/tools/shared/useBaseTool"; -import { BaseToolProps, ToolComponent } from "../types/tool"; +import GenericTool from '../components/tools/shared/GenericTool'; +import { changePermissionsDefinition } from './definitions/changePermissionsDefinition'; +import { BaseToolProps, ToolComponent } from '../types/tool'; const ChangePermissions = (props: BaseToolProps) => { - const { t } = useTranslation(); - const changePermissionsTips = useChangePermissionsTips(); - - const base = useBaseTool( - 'changePermissions', - useChangePermissionsParameters, - useChangePermissionsOperation, - props - ); - - return createToolFlow({ - files: { - selectedFiles: base.selectedFiles, - isCollapsed: base.hasResults, - }, - steps: [ - { - title: t("changePermissions.title", "Document Permissions"), - isCollapsed: base.settingsCollapsed, - onCollapsedClick: base.settingsCollapsed ? base.handleSettingsReset : undefined, - tooltip: changePermissionsTips, - content: ( - - ), - }, - ], - executeButton: { - text: t("changePermissions.submit", "Change Permissions"), - isVisible: !base.hasResults, - loadingText: t("loading"), - onClick: base.handleExecute, - disabled: !base.params.validateParameters() || !base.hasFiles || !base.endpointEnabled, - }, - review: { - isVisible: base.hasResults, - operation: base.operation, - title: t("changePermissions.results.title", "Modified PDFs"), - onFileClick: base.handleThumbnailClick, - onUndo: base.handleUndo, - }, - }); + return ; }; // Static method to get the operation hook for automation -ChangePermissions.tool = () => useChangePermissionsOperation; +ChangePermissions.tool = () => changePermissionsDefinition.useOperation; export default ChangePermissions as ToolComponent; diff --git a/frontend/src/tools/RemoveCertificateSign.tsx b/frontend/src/tools/RemoveCertificateSign.tsx index 195fc11f1..ae35a6772 100644 --- a/frontend/src/tools/RemoveCertificateSign.tsx +++ b/frontend/src/tools/RemoveCertificateSign.tsx @@ -1,45 +1,12 @@ -import { useTranslation } from "react-i18next"; -import { createToolFlow } from "../components/tools/shared/createToolFlow"; -import { useRemoveCertificateSignParameters } from "../hooks/tools/removeCertificateSign/useRemoveCertificateSignParameters"; -import { useRemoveCertificateSignOperation } from "../hooks/tools/removeCertificateSign/useRemoveCertificateSignOperation"; -import { useBaseTool } from "../hooks/tools/shared/useBaseTool"; -import { BaseToolProps, ToolComponent } from "../types/tool"; +import GenericTool from '../components/tools/shared/GenericTool'; +import { removeCertificateSignDefinition } from './definitions/removeCertificateSignDefinition'; +import { BaseToolProps, ToolComponent } from '../types/tool'; const RemoveCertificateSign = (props: BaseToolProps) => { - const { t } = useTranslation(); - - const base = useBaseTool( - 'removeCertificateSign', - useRemoveCertificateSignParameters, - useRemoveCertificateSignOperation, - props - ); - - return createToolFlow({ - files: { - selectedFiles: base.selectedFiles, - isCollapsed: base.hasResults, - placeholder: t("removeCertSign.files.placeholder", "Select a PDF file in the main view to get started"), - }, - steps: [], - executeButton: { - text: t("removeCertSign.submit", "Remove Signature"), - isVisible: !base.hasResults, - loadingText: t("loading"), - onClick: base.handleExecute, - disabled: !base.params.validateParameters() || !base.hasFiles || !base.endpointEnabled, - }, - review: { - isVisible: base.hasResults, - operation: base.operation, - title: t("removeCertSign.results.title", "Certificate Removal Results"), - onFileClick: base.handleThumbnailClick, - onUndo: base.handleUndo, - }, - }); + return ; }; // Static method to get the operation hook for automation -RemoveCertificateSign.tool = () => useRemoveCertificateSignOperation; +RemoveCertificateSign.tool = () => removeCertificateSignDefinition.useOperation; export default RemoveCertificateSign as ToolComponent; diff --git a/frontend/src/tools/SingleLargePage.tsx b/frontend/src/tools/SingleLargePage.tsx index 095428e70..74da8a628 100644 --- a/frontend/src/tools/SingleLargePage.tsx +++ b/frontend/src/tools/SingleLargePage.tsx @@ -1,45 +1,12 @@ -import { useTranslation } from "react-i18next"; -import { createToolFlow } from "../components/tools/shared/createToolFlow"; -import { useSingleLargePageParameters } from "../hooks/tools/singleLargePage/useSingleLargePageParameters"; -import { useSingleLargePageOperation } from "../hooks/tools/singleLargePage/useSingleLargePageOperation"; -import { useBaseTool } from "../hooks/tools/shared/useBaseTool"; -import { BaseToolProps, ToolComponent } from "../types/tool"; +import GenericTool from '../components/tools/shared/GenericTool'; +import { singleLargePageDefinition } from './definitions/singleLargePageDefinition'; +import { BaseToolProps, ToolComponent } from '../types/tool'; const SingleLargePage = (props: BaseToolProps) => { - const { t } = useTranslation(); - - const base = useBaseTool( - 'singleLargePage', - useSingleLargePageParameters, - useSingleLargePageOperation, - props - ); - - return createToolFlow({ - files: { - selectedFiles: base.selectedFiles, - isCollapsed: base.hasResults, - placeholder: t("pdfToSinglePage.files.placeholder", "Select a PDF file in the main view to get started"), - }, - steps: [], - executeButton: { - text: t("pdfToSinglePage.submit", "Convert To Single Page"), - isVisible: !base.hasResults, - loadingText: t("loading"), - onClick: base.handleExecute, - disabled: !base.params.validateParameters() || !base.hasFiles || !base.endpointEnabled, - }, - review: { - isVisible: base.hasResults, - operation: base.operation, - title: t("pdfToSinglePage.results.title", "Single Page Results"), - onFileClick: base.handleThumbnailClick, - onUndo: base.handleUndo, - }, - }); + return ; }; // Static method to get the operation hook for automation -SingleLargePage.tool = () => useSingleLargePageOperation; +SingleLargePage.tool = () => singleLargePageDefinition.useOperation; export default SingleLargePage as ToolComponent; diff --git a/frontend/src/tools/UnlockPdfForms.tsx b/frontend/src/tools/UnlockPdfForms.tsx index 332af5163..55bec879e 100644 --- a/frontend/src/tools/UnlockPdfForms.tsx +++ b/frontend/src/tools/UnlockPdfForms.tsx @@ -1,45 +1,12 @@ -import { useTranslation } from "react-i18next"; -import { createToolFlow } from "../components/tools/shared/createToolFlow"; -import { useUnlockPdfFormsParameters } from "../hooks/tools/unlockPdfForms/useUnlockPdfFormsParameters"; -import { useUnlockPdfFormsOperation } from "../hooks/tools/unlockPdfForms/useUnlockPdfFormsOperation"; -import { useBaseTool } from "../hooks/tools/shared/useBaseTool"; -import { BaseToolProps, ToolComponent } from "../types/tool"; +import GenericTool from '../components/tools/shared/GenericTool'; +import { unlockPdfFormsDefinition } from './definitions/unlockPdfFormsDefinition'; +import { BaseToolProps, ToolComponent } from '../types/tool'; const UnlockPdfForms = (props: BaseToolProps) => { - const { t } = useTranslation(); - - const base = useBaseTool( - 'unlockPdfForms', - useUnlockPdfFormsParameters, - useUnlockPdfFormsOperation, - props - ); - - return createToolFlow({ - files: { - selectedFiles: base.selectedFiles, - isCollapsed: base.hasFiles || base.hasResults, - placeholder: t("unlockPDFForms.files.placeholder", "Select a PDF file in the main view to get started"), - }, - steps: [], - executeButton: { - text: t("unlockPDFForms.submit", "Unlock Forms"), - isVisible: !base.hasResults, - loadingText: t("loading"), - onClick: base.handleExecute, - disabled: !base.params.validateParameters() || !base.hasFiles || !base.endpointEnabled, - }, - review: { - isVisible: base.hasResults, - operation: base.operation, - title: t("unlockPDFForms.results.title", "Unlocked Forms Results"), - onFileClick: base.handleThumbnailClick, - onUndo: base.handleUndo, - }, - }); + return ; }; // Static method to get the operation hook for automation -UnlockPdfForms.tool = () => useUnlockPdfFormsOperation; +UnlockPdfForms.tool = () => unlockPdfFormsDefinition.useOperation; export default UnlockPdfForms as ToolComponent; diff --git a/frontend/src/tools/definitions/changePermissionsDefinition.ts b/frontend/src/tools/definitions/changePermissionsDefinition.ts new file mode 100644 index 000000000..2f7be98f9 --- /dev/null +++ b/frontend/src/tools/definitions/changePermissionsDefinition.ts @@ -0,0 +1,42 @@ +import { ToolDefinition } from '../../components/tools/shared/toolDefinition'; +import { ChangePermissionsParameters, useChangePermissionsParameters } from '../../hooks/tools/changePermissions/useChangePermissionsParameters'; +import { useChangePermissionsOperation } from '../../hooks/tools/changePermissions/useChangePermissionsOperation'; +import ChangePermissionsSettings from '../../components/tools/changePermissions/ChangePermissionsSettings'; + +export const changePermissionsDefinition: ToolDefinition = { + id: 'changePermissions', + + useParameters: useChangePermissionsParameters, + useOperation: useChangePermissionsOperation, + + steps: [ + { + key: 'settings', + title: (t) => t("changePermissions.title", "Document Permissions"), + component: ChangePermissionsSettings, + tooltip: (t) => ({ + header: { + title: t("changePermissions.tooltip.header.title", "Change Permissions") + }, + tips: [ + { + description: t("changePermissions.tooltip.description.text", "Changes document permissions, allowing/disallowing access to different features in PDF readers.") + }, + { + title: t("warning.tooltipTitle", "Warning"), + description: t("changePermissions.tooltip.warning.text", "To make these permissions unchangeable, use the Add Password tool to set an owner password.") + } + ] + }), + }, + ], + + executeButton: { + text: (t) => t("changePermissions.submit", "Change Permissions"), + loadingText: (t) => t("loading"), + }, + + review: { + title: (t) => t("changePermissions.results.title", "Modified PDFs"), + }, +}; diff --git a/frontend/src/tools/definitions/removeCertificateSignDefinition.ts b/frontend/src/tools/definitions/removeCertificateSignDefinition.ts new file mode 100644 index 000000000..937fb0291 --- /dev/null +++ b/frontend/src/tools/definitions/removeCertificateSignDefinition.ts @@ -0,0 +1,21 @@ +import { ToolDefinition } from '../../components/tools/shared/toolDefinition'; +import { RemoveCertificateSignParameters, useRemoveCertificateSignParameters } from '../../hooks/tools/removeCertificateSign/useRemoveCertificateSignParameters'; +import { useRemoveCertificateSignOperation } from '../../hooks/tools/removeCertificateSign/useRemoveCertificateSignOperation'; + +export const removeCertificateSignDefinition: ToolDefinition = { + id: 'removeCertificateSign', + + useParameters: useRemoveCertificateSignParameters, + useOperation: useRemoveCertificateSignOperation, + + steps: [], + + executeButton: { + text: (t) => t("removeCertSign.submit", "Remove Signature"), + loadingText: (t) => t("loading"), + }, + + review: { + title: (t) => t("removeCertSign.results.title", "Certificate Removal Results"), + }, +}; diff --git a/frontend/src/tools/definitions/singleLargePageDefinition.ts b/frontend/src/tools/definitions/singleLargePageDefinition.ts new file mode 100644 index 000000000..c5f9ff705 --- /dev/null +++ b/frontend/src/tools/definitions/singleLargePageDefinition.ts @@ -0,0 +1,21 @@ +import { ToolDefinition } from '../../components/tools/shared/toolDefinition'; +import { SingleLargePageParameters, useSingleLargePageParameters } from '../../hooks/tools/singleLargePage/useSingleLargePageParameters'; +import { useSingleLargePageOperation } from '../../hooks/tools/singleLargePage/useSingleLargePageOperation'; + +export const singleLargePageDefinition: ToolDefinition = { + id: 'singleLargePage', + + useParameters: useSingleLargePageParameters, + useOperation: useSingleLargePageOperation, + + steps: [], + + executeButton: { + text: (t) => t("pdfToSinglePage.submit", "Convert To Single Page"), + loadingText: (t) => t("loading"), + }, + + review: { + title: (t) => t("pdfToSinglePage.results.title", "Single Page Results"), + }, +}; diff --git a/frontend/src/tools/definitions/unlockPdfFormsDefinition.ts b/frontend/src/tools/definitions/unlockPdfFormsDefinition.ts new file mode 100644 index 000000000..e765fb0b6 --- /dev/null +++ b/frontend/src/tools/definitions/unlockPdfFormsDefinition.ts @@ -0,0 +1,21 @@ +import { ToolDefinition } from '../../components/tools/shared/toolDefinition'; +import { UnlockPdfFormsParameters, useUnlockPdfFormsParameters } from '../../hooks/tools/unlockPdfForms/useUnlockPdfFormsParameters'; +import { useUnlockPdfFormsOperation } from '../../hooks/tools/unlockPdfForms/useUnlockPdfFormsOperation'; + +export const unlockPdfFormsDefinition: ToolDefinition = { + id: 'unlockPdfForms', + + useParameters: useUnlockPdfFormsParameters, + useOperation: useUnlockPdfFormsOperation, + + steps: [], + + executeButton: { + text: (t) => t("unlockPDFForms.submit", "Unlock Forms"), + loadingText: (t) => t("loading"), + }, + + review: { + title: (t) => t("unlockPDFForms.results.title", "Unlocked Forms Results"), + }, +};