diff --git a/src/components/Form.tsx b/src/components/Form.tsx index 3b29f6c..f98c8c0 100644 --- a/src/components/Form.tsx +++ b/src/components/Form.tsx @@ -1,7 +1,6 @@ import { formatISO9075, fromUnixTime, getUnixTime } from "date-fns"; import { Component, - JSX, Show, mergeProps, splitProps, @@ -14,6 +13,11 @@ import AsteriskIcon from "~icons/ph/asterisk-bold"; import MaximizeIcon from "~icons/carbon/maximize"; import MinimizeIcon from "~icons/carbon/minimize"; import autosize from "autosize"; +import type { JSX } from "solid-js"; +import { + createNativeInputValue, + createOptionalNumberInputHandler, +} from "~/util"; export const TextInput: Component< { @@ -90,7 +94,6 @@ export const TextInput: Component< [props.class || ""]: true, }} type="text" - lang={rest.type === "number" ? "en" : undefined} placeholder={props.placeholder} {...rest} /> @@ -218,3 +221,27 @@ export const UnixDateInput: Component< /> ); }; + +export const NumberInput: Component< + { value?: number; onInput: (v: number | undefined) => void } & Omit< + Parameters[0], + "onInput" + > +> = (p) => { + let el: HTMLInputElement = undefined!; + const [props, rest] = splitProps(p, ["value", "onInput"]); + const value = createNativeInputValue( + () => el, + () => props.value + ); + + return ( + + ); +}; diff --git a/src/components/Settings/Overlay.tsx b/src/components/Settings/Overlay.tsx index f43907d..1104683 100644 --- a/src/components/Settings/Overlay.tsx +++ b/src/components/Settings/Overlay.tsx @@ -19,7 +19,13 @@ import { generate } from "node-iso11649"; import { customAlphabet } from "nanoid"; import createAccordion from "../Accordion"; -import { Checkbox, TextArea, TextInput, UnixDateInput } from "../Form"; +import { + Checkbox, + NumberInput, + TextArea, + TextInput, + UnixDateInput, +} from "../Form"; import { autoAnimate } from "~/directives/autoAnimate"; import { LocalStoreContext, @@ -322,21 +328,18 @@ const SettingsOverlay: Component = () => { - - setState( - "defaultItemPrice", - parseFloat(evt.currentTarget.value) || 0 - ) - } - onBlur={resetInput(0)} - /> +
+ + v != null && setState("defaultItemPrice", v) + } + onBlur={resetInput(0)} + /> +