Skip to content

Commit

Permalink
🐛 [#4727] Transform initialValue on user variable dataType change
Browse files Browse the repository at this point in the history
Backport-of: #4797
  • Loading branch information
robinmolen authored and sergei-maertens committed Nov 8, 2024
1 parent 01fe378 commit 3f955b6
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 54 deletions.
30 changes: 6 additions & 24 deletions src/openforms/js/compiled-lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -923,12 +923,6 @@
"value": "The text that will be displayed in the form step to save the current information. Leave blank to get value from global configuration."
}
],
"8M403q": [
{
"type": 0,
"value": "Soft required fields should be filled out, but empty values don't block the users' progress. Sometimes this is needed for legal reasons. A component cannot be hard and soft required at the same time."
}
],
"8NbOpb": [
{
"type": 0,
Expand Down Expand Up @@ -2715,12 +2709,6 @@
"value": "Select existing form definition"
}
],
"QL4SGQ": [
{
"type": 0,
"value": "Soft required"
}
],
"QLTh2N": [
{
"type": 0,
Expand Down Expand Up @@ -3793,6 +3781,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,
Expand Down Expand Up @@ -4801,12 +4795,6 @@
"value": "Session will expire"
}
],
"jtWzSW": [
{
"type": 0,
"value": "option 2: € 15,99"
}
],
"k1+ljn": [
{
"type": 0,
Expand Down Expand Up @@ -5521,12 +5509,6 @@
"value": "Regular expression for city"
}
],
"sxdJ/8": [
{
"type": 0,
"value": "option 1: € 10,99"
}
],
"t5fg/K": [
{
"type": 0,
Expand Down
30 changes: 6 additions & 24 deletions src/openforms/js/compiled-lang/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -927,12 +927,6 @@
"value": "De tekst op de knop om de gegevens van de huidige stap op te slaan en het formulier te onderbreken. Laat dit veld leeg om de standaardinstelling te gebruiken."
}
],
"8M403q": [
{
"type": 0,
"value": "Aangeraden velden moeten in principe ingevuld worden, maar ontbrekende waarden blokkeren de voortgang niet. Dit is soms nodig voor juridische redenen. Een component kan niet tegelijk verplicht en aangeraden zijn."
}
],
"8NbOpb": [
{
"type": 0,
Expand Down Expand Up @@ -2732,12 +2726,6 @@
"value": "Selecteer een bestaande formulierdefinitie"
}
],
"QL4SGQ": [
{
"type": 0,
"value": "Aangeraden (niet-blokkerend verplicht)"
}
],
"QLTh2N": [
{
"type": 0,
Expand Down Expand Up @@ -3811,6 +3799,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,
Expand Down Expand Up @@ -4823,12 +4817,6 @@
"value": "Sessie gaat vervallen"
}
],
"jtWzSW": [
{
"type": 0,
"value": "optie 2: € 15,99"
}
],
"k1+ljn": [
{
"type": 0,
Expand Down Expand Up @@ -5543,12 +5531,6 @@
"value": "Reguliere expressie"
}
],
"sxdJ/8": [
{
"type": 0,
"value": "optie 1: € 10,99"
}
],
"t5fg/K": [
{
"type": 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ import {
getUniqueKey,
parseValidationErrors,
slugify,
transformInitialValue,
updateKeyReferencesInLogic,
updateRemovedKeyInLogic,
} from './utils';
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -1229,6 +1238,42 @@ const FormCreationForm = ({formUuid, formUrl, formHistoryUrl}) => {
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 <Loader />;
Expand Down Expand Up @@ -1496,12 +1541,7 @@ const FormCreationForm = ({formUuid, formUrl, formHistoryUrl}) => {
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}
/>
</TabPanel>
Expand Down
25 changes: 25 additions & 0 deletions src/openforms/js/components/admin/form_design/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -219,6 +243,7 @@ export {
getFormComponents,
findComponent,
checkKeyChange,
transformInitialValue,
updateKeyReferencesInLogic,
updateRemovedKeyInLogic,
getUniqueKey,
Expand Down
5 changes: 5 additions & 0 deletions src/openforms/js/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1704,6 +1704,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",
Expand Down
5 changes: 5 additions & 0 deletions src/openforms/js/lang/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -1719,6 +1719,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",
Expand Down

0 comments on commit 3f955b6

Please sign in to comment.