From 9499a03668b2d7899d832e15c0901f1c3f6e7f97 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Tue, 25 Feb 2025 13:48:27 +0000 Subject: [PATCH] fix: improve checkbox field rendering and interaction --- .../document-signing-checkbox-field.tsx | 58 ++++++++++--------- .../advanced-fields/checkbox.tsx | 30 +++++----- .../checkbox-field.tsx | 1 + 3 files changed, 49 insertions(+), 40 deletions(-) diff --git a/apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx b/apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx index 6ba6b8fef..dfe6d2014 100644 --- a/apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx +++ b/apps/remix/app/components/general/document-signing/document-signing-checkbox-field.tsx @@ -52,12 +52,19 @@ export const DocumentSigningCheckboxField = ({ value: item.value.length > 0 ? item.value : `empty-value-${item.id}`, })); + const parsedCheckedValues = useMemo( + () => fromCheckboxValue(field.customText), + [field.customText], + ); + const [checkedValues, setCheckedValues] = useState( - values - ?.map((item) => - item.checked ? (item.value.length > 0 ? item.value : `empty-value-${item.id}`) : '', - ) - .filter(Boolean) || [], + field.inserted && parsedCheckedValues.length > 0 + ? parsedCheckedValues + : values + ?.map((item) => + item.checked ? (item.value.length > 0 ? item.value : `empty-value-${item.id}`) : '', + ) + .filter(Boolean) || [], ); const isReadOnly = parsedFieldMeta.readOnly; @@ -172,19 +179,13 @@ export const DocumentSigningCheckboxField = ({ let updatedValues: string[] = []; try { - const isChecked = checkedValues.includes( - item.value.length > 0 ? item.value : `empty-value-${item.id}`, - ); + const itemValue = item.value.length > 0 ? item.value : `empty-value-${item.id}`; + const isChecked = checkedValues.includes(itemValue); if (!isChecked) { - updatedValues = [ - ...checkedValues, - item.value.length > 0 ? item.value : `empty-value-${item.id}`, - ]; + updatedValues = [...checkedValues, itemValue]; } else { - updatedValues = checkedValues.filter( - (v) => v !== item.value && v !== `empty-value-${item.id}`, - ); + updatedValues = checkedValues.filter((v) => v !== itemValue); } setCheckedValues(updatedValues); @@ -215,6 +216,12 @@ export const DocumentSigningCheckboxField = ({ } }; + useEffect(() => { + if (field.inserted && parsedCheckedValues.length > 0) { + setCheckedValues(parsedCheckedValues); + } + }, [field.inserted, parsedCheckedValues]); + useEffect(() => { if (shouldAutoSignField) { void executeActionAuthProcedure({ @@ -224,11 +231,6 @@ export const DocumentSigningCheckboxField = ({ } }, [checkedValues, isLengthConditionMet, field.inserted]); - const parsedCheckedValues = useMemo( - () => fromCheckboxValue(field.customText), - [field.customText], - ); - return ( {values?.map((item: { id: number; value: string; checked: boolean }, index: number) => { const itemValue = item.value || `empty-value-${item.id}`; + const checkboxId = `checkbox-field-${field.id}-${index}`; return (
handleCheckboxChange(item.value, item.id)} /> -
@@ -272,20 +275,21 @@ export const DocumentSigningCheckboxField = ({ )} {field.inserted && ( -
+
{values?.map((item: { id: number; value: string; checked: boolean }, index: number) => { const itemValue = item.value || `empty-value-${item.id}`; + const checkboxId = `checkbox-field-${field.id}-${index}-inserted`; return (
void handleCheckboxOptionClick(item)} /> -
diff --git a/packages/ui/primitives/document-flow/advanced-fields/checkbox.tsx b/packages/ui/primitives/document-flow/advanced-fields/checkbox.tsx index d0ff41e5f..3fcf6ea1d 100644 --- a/packages/ui/primitives/document-flow/advanced-fields/checkbox.tsx +++ b/packages/ui/primitives/document-flow/advanced-fields/checkbox.tsx @@ -1,5 +1,5 @@ -import { ZCheckboxFieldMeta } from '@documenso/lib/types/field-meta'; import type { TCheckboxFieldMeta } from '@documenso/lib/types/field-meta'; +import { ZCheckboxFieldMeta } from '@documenso/lib/types/field-meta'; import { Checkbox } from '@documenso/ui/primitives/checkbox'; import { Label } from '@documenso/ui/primitives/label'; @@ -28,18 +28,22 @@ export const CheckboxField = ({ field }: CheckboxFieldProps) => { {!parsedFieldMeta?.values ? ( ) : ( - parsedFieldMeta.values.map((item: { value: string; checked: boolean }, index: number) => ( -
- - -
- )) + parsedFieldMeta.values.map((item: { value: string; checked: boolean }, index: number) => { + const checkboxId = `checkbox-field-${field.formId}-${index}`; + + return ( +
+ + +
+ ); + }) )}
); diff --git a/packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx b/packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx index 1e929d69d..a9fe3f24c 100644 --- a/packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx +++ b/packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx @@ -205,6 +205,7 @@ export const CheckboxFieldAdvancedSettings = ({
handleCheckboxValue(index, 'checked', checked)} />