From 29d669470b63c3b024bd01511b83fba573bd46ae Mon Sep 17 00:00:00 2001 From: robinvandermolen Date: Thu, 24 Oct 2024 12:48:50 +0200 Subject: [PATCH 1/2] :bug: [#4727] Transform initialValue on user variable dataType change --- .../admin/form_design/form-creation-form.js | 56 ++++++++++++++++--- .../js/components/admin/form_design/utils.js | 25 +++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/src/openforms/js/components/admin/form_design/form-creation-form.js b/src/openforms/js/components/admin/form_design/form-creation-form.js index adc7b4f178..4fdd86bbc9 100644 --- a/src/openforms/js/components/admin/form_design/form-creation-form.js +++ b/src/openforms/js/components/admin/form_design/form-creation-form.js @@ -70,6 +70,7 @@ import { getUniqueKey, parseValidationErrors, slugify, + transformInitialValue, updateKeyReferencesInLogic, updateRemovedKeyInLogic, } from './utils'; @@ -784,6 +785,14 @@ function reducer(draft, action) { draft.formVariables[index][propertyName] = propertyValue; } + // When dataType changes, a data transformation is needed + if (propertyName === 'dataType') { + draft.formVariables[index]['initialValue'] = transformInitialValue( + propertyValue, + originalVariable.initialValue + ); + } + // Check if there are errors that need to be reset if (draft.formVariables[index].errors) { const errorKeys = propertyName === '' ? Object.keys(propertyValue) : [propertyName]; @@ -1229,6 +1238,42 @@ const FormCreationForm = ({formUuid, formUrl, formHistoryUrl, outgoingRequestsUr payload: pluginId, }); }; + const onUserDefinedVariableChange = async (key, propertyName, propertyValue) => { + const originalVariable = state.formVariables.find(variable => variable.key === key); + // Just dispatch if anything other than dataType changes + // or if the initialValue is null/undefined + if ( + propertyName !== 'dataType' || + originalVariable?.initialValue == null || + originalVariable?.initialValue === '' + ) { + dispatch({ + type: 'CHANGE_USER_DEFINED_VARIABLE', + payload: {key, propertyName, propertyValue}, + }); + return; + } + + // Check if the dataType change is intentional. + if ( + propertyName === 'dataType' && + !window.confirm( + intl.formatMessage({ + description: + 'Changing user variable data type and transforming initial value confirmation message', + defaultMessage: + 'Changing the data type requires the initial value to be changed. This will reset the initial value back to the empty value. Are you sure that you want to do this?', + }) + ) + ) { + return; + } + + dispatch({ + type: 'CHANGE_USER_DEFINED_VARIABLE', + payload: {key, propertyName, propertyValue}, + }); + }; if (loading || state.submitting) { return ; @@ -1268,8 +1313,8 @@ const FormCreationForm = ({formUuid, formUrl, formHistoryUrl, outgoingRequestsUr

Contact your - technical administrator to investigate, or perhaps more information is + defaultMessage={`Sorry! Something unexpected went wrong.

Contact your + technical administrator to investigate, or perhaps more information is available in the outgoing request logs.`} values={{ br: () =>
, @@ -1506,12 +1551,7 @@ const FormCreationForm = ({formUuid, formUrl, formHistoryUrl, outgoingRequestsUr variables={state.formVariables} onAdd={() => dispatch({type: 'ADD_USER_DEFINED_VARIABLE'})} onDelete={key => dispatch({type: 'DELETE_USER_DEFINED_VARIABLE', payload: key})} - onChange={(key, propertyName, propertyValue) => - dispatch({ - type: 'CHANGE_USER_DEFINED_VARIABLE', - payload: {key, propertyName, propertyValue}, - }) - } + onChange={onUserDefinedVariableChange} onFieldChange={onFieldChange} /> diff --git a/src/openforms/js/components/admin/form_design/utils.js b/src/openforms/js/components/admin/form_design/utils.js index 683d0892b6..8ada4cddb1 100644 --- a/src/openforms/js/components/admin/form_design/utils.js +++ b/src/openforms/js/components/admin/form_design/utils.js @@ -57,6 +57,30 @@ const checkKeyChange = (mutationType, newComponent, oldComponent) => { return newComponent.key !== oldComponent.key; }; +const transformInitialValue = (newType, originalValue) => { + switch (newType) { + case 'array': + return []; + + case 'boolean': + case 'int': + case 'float': + return undefined; + + case 'object': + return {}; + + case 'string': + case 'datetime': + case 'date': + case 'time': + return ''; + + default: + return originalValue; + } +}; + const updateKeyReferencesInLogic = (existingLogicRules, originalKey, newKey) => { for (const rule of existingLogicRules) { if (!JSON.stringify(rule).includes(originalKey)) continue; @@ -219,6 +243,7 @@ export { getFormComponents, findComponent, checkKeyChange, + transformInitialValue, updateKeyReferencesInLogic, updateRemovedKeyInLogic, getUniqueKey, From 1352126d4070bc432001d47c34c2132c4dc447ee Mon Sep 17 00:00:00 2001 From: robinvandermolen Date: Mon, 28 Oct 2024 09:17:12 +0100 Subject: [PATCH 2/2] :globe_with_meridians: [#4727] DataType change confirmation translations --- src/openforms/js/compiled-lang/en.json | 6 ++++++ src/openforms/js/compiled-lang/nl.json | 6 ++++++ src/openforms/js/lang/en.json | 5 +++++ src/openforms/js/lang/nl.json | 5 +++++ 4 files changed, 22 insertions(+) diff --git a/src/openforms/js/compiled-lang/en.json b/src/openforms/js/compiled-lang/en.json index e2f7fe336b..f0fd88ca93 100644 --- a/src/openforms/js/compiled-lang/en.json +++ b/src/openforms/js/compiled-lang/en.json @@ -3909,6 +3909,12 @@ "value": "Login required?" } ], + "af22yB": [ + { + "type": 0, + "value": "Changing the data type requires the initial value to be changed. This will reset the initial value back to the empty value. Are you sure that you want to do this?" + } + ], "aqYeqv": [ { "type": 0, diff --git a/src/openforms/js/compiled-lang/nl.json b/src/openforms/js/compiled-lang/nl.json index 7354935a39..b440c28c3a 100644 --- a/src/openforms/js/compiled-lang/nl.json +++ b/src/openforms/js/compiled-lang/nl.json @@ -3927,6 +3927,12 @@ "value": "Vereist authenticatie" } ], + "af22yB": [ + { + "type": 0, + "value": "Het veranderen van het datatype vereist een verandering aan de beginwaarde. Dit zal de beginwaarde terugbrengen naar de standaardwaarde. Weet je zeker dat je dit wilt doen?" + } + ], "aqYeqv": [ { "type": 0, diff --git a/src/openforms/js/lang/en.json b/src/openforms/js/lang/en.json index f9ff2fbcde..d88e1efb15 100644 --- a/src/openforms/js/lang/en.json +++ b/src/openforms/js/lang/en.json @@ -1804,6 +1804,11 @@ "description": "Form step login required label", "originalDefault": "Login required?" }, + "af22yB": { + "defaultMessage": "Changing the data type requires the initial value to be changed. This will reset the initial value back to the empty value. Are you sure that you want to do this?", + "description": "Changing user variable data type and transforming initial value confirmation message", + "originalDefault": "Changing the data type requires the initial value to be changed. This will reset the initial value back to the empty value. Are you sure that you want to do this?" + }, "auZOcD": { "defaultMessage": "Mapping expression", "description": "Service fetch configuration modal form mapping expression field label", diff --git a/src/openforms/js/lang/nl.json b/src/openforms/js/lang/nl.json index 55c66a44be..0875de7a11 100644 --- a/src/openforms/js/lang/nl.json +++ b/src/openforms/js/lang/nl.json @@ -1819,6 +1819,11 @@ "description": "Form step login required label", "originalDefault": "Login required?" }, + "af22yB": { + "defaultMessage": "Het veranderen van het datatype vereist een verandering aan de beginwaarde. Dit zal de beginwaarde terugbrengen naar de standaardwaarde. Weet je zeker dat je dit wilt doen?", + "description": "Changing user variable data type and transforming initial value confirmation message", + "originalDefault": "Changing the data type requires the initial value to be changed. This will reset the initial value back to the empty value. Are you sure that you want to do this?" + }, "auZOcD": { "defaultMessage": "Mappingexpressie", "description": "Service fetch configuration modal form mapping expression field label",