diff --git a/apps/remix/app/components/embed/authoring/configure-fields-view.tsx b/apps/remix/app/components/embed/authoring/configure-fields-view.tsx index 524eda381..60b732a76 100644 --- a/apps/remix/app/components/embed/authoring/configure-fields-view.tsx +++ b/apps/remix/app/components/embed/authoring/configure-fields-view.tsx @@ -173,34 +173,59 @@ export const ConfigureFieldsView = ({ }); const onFieldCopy = useCallback( - (event?: KeyboardEvent | null, options?: { duplicate?: boolean }) => { - const { duplicate = false } = options ?? {}; + (event?: KeyboardEvent | null, options?: { duplicate?: boolean; duplicateAll?: boolean }) => { + const { duplicate = false, duplicateAll = false } = options ?? {}; if (lastActiveField) { event?.preventDefault(); - if (!duplicate) { - setFieldClipboard(lastActiveField); + if (duplicate) { + const newField: TConfigureFieldsFormSchema['fields'][0] = { + ...structuredClone(lastActiveField), + nativeId: undefined, + formId: nanoid(12), + signerEmail: selectedRecipient?.email ?? lastActiveField.signerEmail, + recipientId: selectedRecipient?.id ?? lastActiveField.recipientId, + pageX: lastActiveField.pageX + 3, + pageY: lastActiveField.pageY + 3, + }; - toast({ - title: 'Copied field', - description: 'Copied field to clipboard', + append(newField); + + return; + } + + if (duplicateAll) { + const pages = Array.from(document.querySelectorAll(PDF_VIEWER_PAGE_SELECTOR)); + + pages.forEach((_, index) => { + const pageNumber = index + 1; + + if (pageNumber === lastActiveField.pageNumber) { + return; + } + + const newField: TConfigureFieldsFormSchema['fields'][0] = { + ...structuredClone(lastActiveField), + nativeId: undefined, + formId: nanoid(12), + signerEmail: selectedRecipient?.email ?? lastActiveField.signerEmail, + recipientId: selectedRecipient?.id ?? lastActiveField.recipientId, + pageNumber, + }; + + append(newField); }); return; } - const newField: TConfigureFieldsFormSchema['fields'][0] = { - ...structuredClone(lastActiveField), - nativeId: undefined, - formId: nanoid(12), - signerEmail: selectedRecipient?.email ?? lastActiveField.signerEmail, - recipientId: selectedRecipient?.id ?? lastActiveField.recipientId, - pageX: lastActiveField.pageX + 3, - pageY: lastActiveField.pageY + 3, - }; + setFieldClipboard(lastActiveField); - append(newField); + toast({ + title: 'Copied field', + description: 'Copied field to clipboard', + }); } }, [append, lastActiveField, selectedRecipient?.email, selectedRecipient?.id, toast], @@ -533,6 +558,7 @@ export const ConfigureFieldsView = ({ onMove={(node) => onFieldMove(node, index)} onRemove={() => remove(index)} onDuplicate={() => onFieldCopy(null, { duplicate: true })} + onDuplicateAllPages={() => onFieldCopy(null, { duplicateAll: true })} onFocus={() => setLastActiveField(field)} onBlur={() => setLastActiveField(null)} onAdvancedSettings={() => { diff --git a/apps/remix/app/components/tables/templates-table-action-dropdown.tsx b/apps/remix/app/components/tables/templates-table-action-dropdown.tsx index ff33a0c53..f52b9967b 100644 --- a/apps/remix/app/components/tables/templates-table-action-dropdown.tsx +++ b/apps/remix/app/components/tables/templates-table-action-dropdown.tsx @@ -69,8 +69,6 @@ export const TemplatesTableActionDropdown = ({ ? `${templateRootPath}/f/${row.folderId}/${row.id}/edit` : `${templateRootPath}/${row.id}/edit`; - - return ( diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx index 145e9a89c..83cfc363e 100644 --- a/packages/ui/primitives/document-flow/add-fields.tsx +++ b/packages/ui/primitives/document-flow/add-fields.tsx @@ -400,35 +400,60 @@ export const AddFieldsFormPartial = ({ ); const onFieldCopy = useCallback( - (event?: KeyboardEvent | null, options?: { duplicate?: boolean }) => { - const { duplicate = false } = options ?? {}; + (event?: KeyboardEvent | null, options?: { duplicate?: boolean; duplicateAll?: boolean }) => { + const { duplicate = false, duplicateAll = false } = options ?? {}; if (lastActiveField) { event?.preventDefault(); - if (!duplicate) { - setFieldClipboard(lastActiveField); + if (duplicate) { + const newField: TAddFieldsFormSchema['fields'][0] = { + ...structuredClone(lastActiveField), + nativeId: undefined, + formId: nanoid(12), + signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail, + pageX: lastActiveField.pageX + 3, + pageY: lastActiveField.pageY + 3, + }; - toast({ - title: 'Copied field', - description: 'Copied field to clipboard', + append(newField); + + return; + } + + if (duplicateAll) { + const pages = Array.from(document.querySelectorAll(PDF_VIEWER_PAGE_SELECTOR)); + + pages.forEach((_, index) => { + const pageNumber = index + 1; + + if (pageNumber === lastActiveField.pageNumber) { + return; + } + + const newField: TAddFieldsFormSchema['fields'][0] = { + ...structuredClone(lastActiveField), + nativeId: undefined, + formId: nanoid(12), + signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail, + pageNumber, + }; + + append(newField); }); return; } - const newField: TAddFieldsFormSchema['fields'][0] = { - ...structuredClone(lastActiveField), - formId: nanoid(12), - signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail, - pageX: lastActiveField.pageX + 3, - pageY: lastActiveField.pageY + 3, - }; + setFieldClipboard(lastActiveField); - append(newField); + toast({ + title: 'Copied field', + description: 'Copied field to clipboard', + }); } }, - [append, lastActiveField, selectedSigner?.email, toast], + [append, lastActiveField, selectedSigner?.email, selectedSigner?.id, toast], ); const onFieldPaste = useCallback( @@ -641,6 +666,7 @@ export const AddFieldsFormPartial = ({ onMove={(options) => onFieldMove(options, index)} onRemove={() => remove(index)} onDuplicate={() => onFieldCopy(null, { duplicate: true })} + onDuplicateAllPages={() => onFieldCopy(null, { duplicateAll: true })} onAdvancedSettings={() => { setCurrentField(field); handleAdvancedSettings(); diff --git a/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx b/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx index 37d194210..fdfd87c32 100644 --- a/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx +++ b/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx @@ -311,6 +311,7 @@ export const FieldAdvancedSettings = forwardRef )) .otherwise(() => null)} + {errors.length > 0 && (
    @@ -323,6 +324,7 @@ export const FieldAdvancedSettings = forwardRef )} + void; onRemove?: () => void; onDuplicate?: () => void; + onDuplicateAllPages?: () => void; onAdvancedSettings?: () => void; onFocus?: () => void; onBlur?: () => void; @@ -55,15 +58,18 @@ export const FieldItem = ({ onMove, onRemove, onDuplicate, + onDuplicateAllPages, + onAdvancedSettings, onFocus, onBlur, - onAdvancedSettings, recipientIndex = 0, hasErrors, active, onFieldActivate, onFieldDeactivate, }: FieldItemProps) => { + const { _ } = useLingui(); + const [coords, setCoords] = useState({ pageX: 0, pageY: 0, @@ -304,6 +310,7 @@ export const FieldItem = ({
    {advancedField && ( + +