From f4f798b1b4bae3073b669a562fd2b3a7880dffc3 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 15 May 2023 11:45:23 -0300 Subject: second form --- .../src/handlers/InputSelectMultiple.tsx | 147 +++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 packages/exchange-backoffice-ui/src/handlers/InputSelectMultiple.tsx (limited to 'packages/exchange-backoffice-ui/src/handlers/InputSelectMultiple.tsx') diff --git a/packages/exchange-backoffice-ui/src/handlers/InputSelectMultiple.tsx b/packages/exchange-backoffice-ui/src/handlers/InputSelectMultiple.tsx new file mode 100644 index 000000000..05733fe19 --- /dev/null +++ b/packages/exchange-backoffice-ui/src/handlers/InputSelectMultiple.tsx @@ -0,0 +1,147 @@ +import { Fragment, VNode, h } from "preact"; +import { Choice } from "./InputChoice.js"; +import { LabelWithTooltipMaybeRequired, UIFormProps } from "./InputLine.js"; +import { useField } from "./useField.js"; +import { useState } from "preact/hooks"; + +export function InputSelectMultiple( + props: { + choices: Choice[]; + unique?: boolean; + } & UIFormProps>, +): VNode { + const { name, label, choices, placeholder, tooltip, required, unique } = + props; + const { value, onChange } = useField<{ [s: string]: Array }>(name); + + const [filter, setFilter] = useState(undefined); + const regex = new RegExp(`.*${filter}.*`, "i"); + const choiceMap = choices.reduce((prev, curr) => { + return { ...prev, [curr.value]: curr.label }; + }, {} as Record); + + const list = value ?? []; + const filteredChoices = + filter === undefined + ? undefined + : choices.filter((v) => { + return regex.test(v.label); + }); + return ( +
+ + {list.map((v, idx) => { + return ( + + {choiceMap[v]} + + + ); + })} + +
+ { + setFilter(e.currentTarget.value); + }} + placeholder={placeholder} + class="w-full rounded-md border-0 bg-white py-1.5 pl-3 pr-12 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" + role="combobox" + aria-controls="options" + aria-expanded="false" + /> + + + {filteredChoices !== undefined && ( +
    + {filteredChoices.map((v, idx) => { + return ( +
  • { + setFilter(undefined); + if (unique && list.indexOf(v.value) !== -1) { + return; + } + const newValue = [...list]; + newValue.splice(0, 0, v.value); + onChange(newValue); + }} + + // tabindex="-1" + > + {/* */} + {v.label} + + {/* */} +
  • + ); + })} + + {/* */} + + {/* */} +
+ )} +
+
+ ); +} -- cgit v1.2.3