Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions widgets/appbuilder/lib/mergeFormExportParameterValues.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import {
createFormExportParameterValue,
mergeFormExportParameterValues,
} from "./mergeFormExportParameterValues";

describe("createFormExportParameterValue", () => {
it("uses the parameter id rather than its display name as the export key", () => {
const value = createFormExportParameterValue(
"8c03f4ca-cc79-4f14-9a17-6ae1a1e5c1e1",
"default",
"default",
"make it funny",
);

expect(value).toEqual({
name: "8c03f4ca-cc79-4f14-9a17-6ae1a1e5c1e1",
value: "make it funny",
});
});

it("keeps a non-default parameter namespace", () => {
expect(
createFormExportParameterValue(
"parameter-id",
"other",
"default",
"value",
),
).toEqual({name: "parameter-id", sessionId: "other", value: "value"});
});
});

describe("mergeFormExportParameterValues", () => {
it("includes form values with their stable parameter ids", () => {
expect(
mergeFormExportParameterValues(undefined, [
createFormExportParameterValue(
"parameter-id",
"default",
"default",
"make it funny",
),
]),
).toEqual([
{parameter: {name: "parameter-id"}, value: "make it funny"},
]);
});
});
21 changes: 21 additions & 0 deletions widgets/appbuilder/lib/mergeFormExportParameterValues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,27 @@ export interface FormWidgetParameterValue {
readonly value: string;
}

/**
* Builds an export parameter value from a form field.
*
* Export requests use parameter ids as keys. A display name can contain spaces
* and is not a stable request identifier, so it must not be used here.
*/
export function createFormExportParameterValue(
parameterId: string,
parameterNamespace: string,
formNamespace: string,
value: string,
): FormWidgetParameterValue {
return {
name: parameterId,
...(parameterNamespace !== formNamespace
? {sessionId: parameterNamespace}
: {}),
value,
};
}

/**
* Merges export-control parameter values with form field values for form submit.
* Export values are applied first; form values add missing parameters or override by name.
Expand Down
20 changes: 11 additions & 9 deletions widgets/appbuilder/ui/AppBuilderFormWidgetComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,10 @@ import {
useMemo,
useState,
} from "react";
import {mergeFormExportParameterValues} from "../lib/mergeFormExportParameterValues";
import {
createFormExportParameterValue,
mergeFormExportParameterValues,
} from "../lib/mergeFormExportParameterValues";

/**
* @docAttached
Expand Down Expand Up @@ -206,14 +209,13 @@ export default function AppBuilderFormWidgetComponent(props: Props) {
return undefined;
}
const ref = parameterProps[index];
const sessionId =
ref.namespace !== namespace ? ref.namespace : undefined;

return {
name: param.definition.name,
sessionId,
value: String(values[param.definition.id] ?? ""),
};

return createFormExportParameterValue(
param.definition.id,
ref.namespace,
namespace,
String(values[param.definition.id] ?? ""),
);
})
.filter((entry) => entry !== undefined);
}, [parameters, parameterProps, values, namespace]);
Expand Down