From fdbe623e1060efc4b074d213a96e8f5a2ab7498b Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 20 Sep 2023 15:16:28 -0300 Subject: more ui stuff, moved forms to util --- packages/web-util/src/forms/InputSelectOne.tsx | 134 +++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 packages/web-util/src/forms/InputSelectOne.tsx (limited to 'packages/web-util/src/forms/InputSelectOne.tsx') diff --git a/packages/web-util/src/forms/InputSelectOne.tsx b/packages/web-util/src/forms/InputSelectOne.tsx new file mode 100644 index 000000000..7bef1058b --- /dev/null +++ b/packages/web-util/src/forms/InputSelectOne.tsx @@ -0,0 +1,134 @@ +import { Fragment, VNode, h } from "preact"; +import { useState } from "preact/hooks"; +import { Choice } from "./InputChoiceStacked.js"; +import { LabelWithTooltipMaybeRequired, UIFormProps } from "./InputLine.js"; +import { useField } from "./useField.js"; + +export function InputSelectOne( + props: { + choices: Choice[]; + } & UIFormProps, +): VNode { + const { name, label, choices, placeholder, tooltip, required } = props; + const { value, onChange } = useField(name); + + const [filter, setFilter] = useState(undefined); + const regex = new RegExp(`.*${filter}.*`, "i"); + const choiceMap = choices.reduce((prev, curr) => { + return { ...prev, [curr.value as string]: curr.label }; + }, {} as Record); + + const filteredChoices = + filter === undefined + ? undefined + : choices.filter((v) => { + return regex.test(v.label); + }); + return ( +
+ + {value ? ( + + {choiceMap[value as string]} + + + ) : ( +
+ { + 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); + onChange(v.value as T[K]); + }} + + // tabindex="-1" + > + {/* */} + {v.label} + + {/* */} +
  • + ); + })} + + {/* */} + + {/* */} +
+ )} +
+ )} +
+ ); +} -- cgit v1.2.3