From 9d9c8ad72379500b2df75d97703b57b9e3308170 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Mon, 13 Apr 2026 15:31:31 +0200 Subject: [PATCH] - form field label setting is reuqired when at least one validation setting is defined for a form field; --- .../components/ElementSetting/index.js | 11 ++++++-- .../BuilderElementSettings/index.js | 28 +++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js index 5b817c8..8ae0fbc 100644 --- a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js +++ b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js @@ -26,7 +26,7 @@ import getTokens from '../../../../../../helpers/getTokens'; const ElementSettingSpreadsheet = React.lazy(() => import('../ElementSettingSpreadsheet')); -const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus, context }) => { +const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus, context, required, hasError }) => { const [existingVars, setExistingVars] = useState([]); const documentCategories = useStoreValue('documentCategories'); @@ -176,6 +176,7 @@ const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus, context } else { return changeFn(e.target.value, setting.name)}/> } @@ -199,8 +200,14 @@ const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus, context }, []); return
- + {getProperField(setting)} + {setting.name === 'label' && hasError + ? {__('Label è obbligatoria quando è impostata una validazione.', 'gepafin')} + : null} {setting.name === 'formula' && !isEmpty(existingVars) ?

Existing variables: {existingVars.map(v => {`{${v}}`})}

diff --git a/src/pages/BandoFormsEdit/components/BuilderElementSettings/index.js b/src/pages/BandoFormsEdit/components/BuilderElementSettings/index.js index fcea81b..6bf790f 100644 --- a/src/pages/BandoFormsEdit/components/BuilderElementSettings/index.js +++ b/src/pages/BandoFormsEdit/components/BuilderElementSettings/index.js @@ -29,6 +29,7 @@ const BuilderElementSettings = ({ closeSettingsFn, callStatus, context }) => { const [validators, setValidators] = useState({}); const [dynamicData, setDynamicData] = useState([]); const [criteria, setCriteria] = useState([]); + const [labelError, setLabelError] = useState(false); const numberBasedValidatorFields = ['min', 'max', 'minLength', 'maxLength']; const customValidationOptions = [ { value: 'isPIVA', label: 'isPIVA' }, @@ -44,7 +45,18 @@ const BuilderElementSettings = ({ closeSettingsFn, callStatus, context }) => { { value: 'nonEmptyTables', label: 'nonEmptyTables' } ] + const hasAnyValidation = !isEmpty(validators) && ( + validators.isRequired === true || + Object.entries(validators) + .filter(([k]) => k !== 'isRequired') + .some(([, v]) => !isNil(v)) + ); + const onChange = (value, name) => { + if (name === 'label' && labelError) { + setLabelError(false); + } + const newSettings = settings .map(o => { if (o.name === name) { @@ -73,11 +85,21 @@ const BuilderElementSettings = ({ closeSettingsFn, callStatus, context }) => { } const saveSettings = () => { + const latestSettings = storeGet('chosenFieldSettings') || settings; + + if (hasAnyValidation) { + const labelSetting = head(latestSettings.filter(o => o.name === 'label')); + if (labelSetting && isEmpty(labelSetting.value.trim())) { + setLabelError(true); + return; + } + } + setLabelError(false); + let newActiveElementData = klona(activeElementData); // Prefer the store value over React state: child components (e.g. ElementSettingSpreadsheet) // write to the store synchronously, but React state updates are batched and may lag behind // when saveSettings is called in the same event as the last setDataFn call. - const latestSettings = storeGet('chosenFieldSettings') || settings; newActiveElementData = wrap(newActiveElementData).set(['settings'], latestSettings).value(); newActiveElementData = wrap(newActiveElementData).set(['validators'], validators).value(); newActiveElementData = wrap(newActiveElementData).set(['dynamicData'], dynamicData).value(); @@ -167,7 +189,9 @@ const BuilderElementSettings = ({ closeSettingsFn, callStatus, context }) => { context={context} callStatus={callStatus} changeFn={onChange} - updateDataFn={onUpdateOptions}/>) + updateDataFn={onUpdateOptions} + required={o.name === 'label' && hasAnyValidation} + hasError={o.name === 'label' && labelError && hasAnyValidation}/>) : null} {!isNil(dynamicDataOptions[activeElementData.name]) && context === 'application' ?