diff --git a/designer/client/field-edit.tsx b/designer/client/field-edit.tsx
index e9d16d2b88..bded117a09 100644
--- a/designer/client/field-edit.tsx
+++ b/designer/client/field-edit.tsx
@@ -26,6 +26,7 @@ export function FieldEdit({
required = true,
exposeToContext = false,
allowPrePopulation = false,
+ allowPrePopulationOverwrite = false,
disableChangingFromSummary = false,
} = options;
const isFileUploadField = selectedComponent.type === "FileUploadField";
@@ -228,37 +229,71 @@ export function FieldEdit({
{isListField && (
-
-
-
- dispatch({
- type: Actions.EDIT_OPTIONS_ALLOW_PRE_POPULATION,
- payload: e.target.checked,
- })
- }
- />
-
-
- {i18n("common.allowPrePopulationOption.helpText")}
-
+ <>
+
-
+
+
+
+ dispatch({
+ type:
+ Actions.EDIT_OPTIONS_ALLOW_OVERWRITE_FROM_QUERY_PARAM,
+ payload: e.target.checked,
+ })
+ }
+ />
+
+
+ {i18n("common.allowPrePopulationOverwriteOption.helpText")}
+
+
+
+ >
)}
;
};
diff --git a/runner/src/server/plugins/engine/components/ComponentCollection.ts b/runner/src/server/plugins/engine/components/ComponentCollection.ts
index d17c82b085..42354efb0e 100644
--- a/runner/src/server/plugins/engine/components/ComponentCollection.ts
+++ b/runner/src/server/plugins/engine/components/ComponentCollection.ts
@@ -71,7 +71,18 @@ export class ComponentCollection {
getPrePopulatedItems() {
return this.formItems
.filter((item) => item.options?.allowPrePopulation)
- .map((item) => item.getStateSchemaKeys())
+ .map((item) => {
+ // to access the schema we need to use the component name to retrieve the value from getStateSchemaKeys
+ const schema = item.getStateSchemaKeys()[item.name];
+
+ return {
+ [item.name]: {
+ schema,
+ allowPrePopulationOverwrite:
+ item.options.allowPrePopulationOverwrite,
+ },
+ };
+ })
.reduce((acc, curr) => merge(acc, curr), {});
}
diff --git a/runner/src/server/plugins/engine/helpers.ts b/runner/src/server/plugins/engine/helpers.ts
index 2f3cfe93c5..456ffd4f07 100644
--- a/runner/src/server/plugins/engine/helpers.ts
+++ b/runner/src/server/plugins/engine/helpers.ts
@@ -89,11 +89,16 @@ export function getValidStateFromQueryParameters(
) {
return Object.entries(queryParameters).reduce>(
(acc, [key, value]) => {
- if (reach(prePopFields, key) === undefined || reach(state, key)) {
+ const prePopField = reach(prePopFields, key);
+ const stateValue = reach(state, key);
+ if (
+ !prePopField ||
+ (stateValue && !prePopField.allowPrePopulationOverwrite)
+ ) {
return acc;
}
- const result = reach(prePopFields, key).validate(value);
+ const result = prePopField.schema.validate(value);
if (result.error) {
return acc;
}
diff --git a/runner/test/cases/server/plugins/engine/helpers.test.ts b/runner/test/cases/server/plugins/engine/helpers.test.ts
index fcca01e967..50bf201013 100644
--- a/runner/test/cases/server/plugins/engine/helpers.test.ts
+++ b/runner/test/cases/server/plugins/engine/helpers.test.ts
@@ -307,7 +307,9 @@ suite("Helpers", () => {
aBadQueryParam: "A value",
};
const prePopFields = {
- eggType: Joi.string().required(),
+ eggType: {
+ schema: Joi.string().required(),
+ },
};
expect(
Object.keys(getValidStateFromQueryParameters(prePopFields, query))
@@ -321,7 +323,9 @@ suite("Helpers", () => {
eggType: "Hard boiled",
};
const prePopFields = {
- eggType: Joi.string().required(),
+ eggType: {
+ schema: Joi.string().required(),
+ },
};
const state = {
eggType: "Fried",
@@ -334,13 +338,34 @@ suite("Helpers", () => {
).to.equal(0);
});
+ test("Should allow the value to be overwritten if allowPrePopulationOverwrite is true", () => {
+ const query = {
+ eggType: "Hard boiled",
+ };
+ const prePopFields = {
+ eggType: {
+ schema: Joi.string().required(),
+ allowPrePopulationOverwrite: true,
+ },
+ };
+ const state = {
+ eggType: "Fried",
+ };
+
+ expect(
+ getValidStateFromQueryParameters(prePopFields, query, state)
+ ).to.equal({ eggType: "Hard boiled" });
+ });
+
test("Should be able to update nested object values", () => {
const query = {
"yourEggs.eggType": "Fried egg",
};
const prePopFields = {
yourEggs: {
- eggType: Joi.string().required(),
+ eggType: {
+ schema: Joi.string().required(),
+ },
},
};
expect(
@@ -354,7 +379,9 @@ suite("Helpers", () => {
};
const prePopFields = {
yourEggs: {
- eggType: Joi.string().valid("boiled", "fried", "poached"),
+ eggType: {
+ schema: Joi.string().valid("boiled", "fried", "poached"),
+ },
},
};
expect(