commit cd4302880e99c6200822a6069863c99546b361ad
parent 27ae504ed714be9f715daa6867d2e545bc67bc22
Author: Florian Dold <florian@dold.me>
Date: Mon, 24 Mar 2025 22:59:32 +0100
forms: implement preferred choices
Diffstat:
4 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/packages/web-util/src/forms/fields/InputSelectOne.tsx b/packages/web-util/src/forms/fields/InputSelectOne.tsx
@@ -5,10 +5,13 @@ import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
import { ChoiceS } from "./InputChoiceStacked.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
+export interface InputSelectOneProps<Choices> {
+ preferredChoiceVals?: Choices[];
+ choices: ChoiceS<Choices>[];
+}
+
export function InputSelectOne<Choices>(
- props: {
- choices: ChoiceS<Choices>[];
- } & UIFormProps<Choices>,
+ props: InputSelectOneProps<Choices> & UIFormProps<Choices>,
): VNode {
const { label, choices, placeholder, tooltip, required, help, hidden } =
props;
@@ -28,10 +31,23 @@ export function InputSelectOne<Choices>(
return <Fragment />;
}
- const filteredChoices =
+ const prefChoices = choices.filter(
+ (x) =>
+ props.preferredChoiceVals && props.preferredChoiceVals.includes(x.value),
+ );
+ const normalChoices = choices.filter(
+ (x) =>
+ !(
+ props.preferredChoiceVals && props.preferredChoiceVals.includes(x.value)
+ ),
+ );
+
+ const sortedChoices = [...prefChoices, ...normalChoices];
+
+ let filteredChoices =
filter === undefined
? undefined
- : choices.filter((v) => {
+ : sortedChoices.filter((v) => {
return regex.test(v.label);
});
return (
diff --git a/packages/web-util/src/forms/forms-types.ts b/packages/web-util/src/forms/forms-types.ts
@@ -220,6 +220,7 @@ type UIFormFieldDurationText = {
type UIFormFieldSelectOne = {
type: "selectOne";
choices: Array<SelectUiChoice>;
+ preferredChoiceVals?: string[];
} & UIFormFieldBaseConfig;
type UIFormFieldText = { type: "text" } & UIFormFieldBaseConfig;
diff --git a/packages/web-util/src/forms/forms-utils.ts b/packages/web-util/src/forms/forms-utils.ts
@@ -277,6 +277,7 @@ export function convertFormConfigToUiField(
config,
getConverterByFieldType(config.type, config),
),
+ preferredChoiceVals: config.preferredChoiceVals,
hidden,
choices: config.choices,
},
diff --git a/packages/web-util/src/forms/gana/VQF_902_1_customer.ts b/packages/web-util/src/forms/gana/VQF_902_1_customer.ts
@@ -152,6 +152,7 @@ export function design_VQF_902_1_customer(
label: i18n.str`Nationality`,
type: "selectOne",
choices: countryNationalityList(i18n),
+ preferredChoiceVals: ["CH"],
required: true,
},
fieldPersonalId(i18n),