feat: rework number input handlers and add proper step props

master
Katja Lutz 2 years ago
parent a9d34cb17e
commit 32635cf69e

@ -325,6 +325,8 @@ const SettingsOverlay: Component = () => {
required required
type="number" type="number"
label="Standard Einzelpreis" label="Standard Einzelpreis"
min="0"
step="0.01"
value={state.defaultItemPrice} value={state.defaultItemPrice}
onInput={(evt) => onInput={(evt) =>
setState( setState(
@ -332,6 +334,7 @@ const SettingsOverlay: Component = () => {
parseFloat(evt.currentTarget.value) || 0 parseFloat(evt.currentTarget.value) || 0
) )
} }
onBlur={resetInput(0)}
/> />
<div class="col-span-2"> <div class="col-span-2">

@ -22,8 +22,8 @@ import DeleteIcon from "~icons/carbon/trash-can";
import DragVerticalIcon from "~icons/carbon/drag-vertical"; import DragVerticalIcon from "~icons/carbon/drag-vertical";
import PositionSettingsIcon from "~icons/carbon/settings-adjust"; import PositionSettingsIcon from "~icons/carbon/settings-adjust";
import { Checkbox, TextArea, TextInput } from "../Form"; import { Checkbox, TextArea, TextInput } from "../Form";
import { parseOptionalFloat } from "~/util";
import { MarkdownHelpLabel } from "../Markdown"; import { MarkdownHelpLabel } from "../Markdown";
import { createOptionalNumberInputHandler } from "~/util";
export const PositionsSettings: Component = () => { export const PositionsSettings: Component = () => {
const [state, setState] = useContext(StoreContext)!; const [state, setState] = useContext(StoreContext)!;
@ -295,25 +295,19 @@ export const PositionsSettings: Component = () => {
</div> </div>
<TextInput <TextInput
size="xs" size="xs"
value={ value={position.itemPrice}
position.itemPrice === 0 ? "" : position.itemPrice
}
label="Einzelpreis" label="Einzelpreis"
placeholder={ placeholder={
state.defaultItemPrice state.defaultItemPrice
? state.defaultItemPrice + "" ? state.defaultItemPrice + ""
: undefined : undefined
} }
step="0.01"
min="0" min="0"
type="number" type="number"
onInput={(e) => { onInput={createOptionalNumberInputHandler((v) =>
setState( setState("positions", idx(), "itemPrice", v)
"positions", )}
idx(),
"itemPrice",
parseOptionalFloat(e.currentTarget.value)
);
}}
/> />
<div <div
use:autoAnimate use:autoAnimate
@ -357,15 +351,17 @@ export const PositionsSettings: Component = () => {
<TextInput <TextInput
label="Aktionspreis" label="Aktionspreis"
type="number" type="number"
step="0.01"
min="0"
value={position.fixedDiscountPrice} value={position.fixedDiscountPrice}
onInput={(e) => onInput={createOptionalNumberInputHandler((v) =>
setState( setState(
"positions", "positions",
idx(), idx(),
"fixedDiscountPrice", "fixedDiscountPrice",
parseOptionalFloat(e.currentTarget.value) v
) )
} )}
/> />
</div> </div>
<div class="col-span-2"> <div class="col-span-2">

@ -5,13 +5,6 @@ import { JSX } from "solid-js";
export const sleep = (timeout: number) => export const sleep = (timeout: number) =>
new Promise((res) => setTimeout(res, timeout)); new Promise((res) => setTimeout(res, timeout));
export const parseOptionalFloat = (text: string) => {
const result = parseFloat(text);
if (Number.isNaN(result)) return undefined;
return result;
};
// Source: https://stackoverflow.com/a/34591063 // Source: https://stackoverflow.com/a/34591063
export const roundToStep = (value: number, step = 1.0) => { export const roundToStep = (value: number, step = 1.0) => {
const inv = new Big(1.0).div(step); const inv = new Big(1.0).div(step);
@ -88,3 +81,18 @@ export const onClickFocus: JSX.EventHandlerUnion<
}; };
export const externalLink = { target: "_blank", rel: "noopener" }; export const externalLink = { target: "_blank", rel: "noopener" };
export const createOptionalNumberInputHandler = (
onInput: (v: number | undefined) => void
) => {
return (e: InputEvent & { currentTarget: HTMLInputElement }) => {
if (e.currentTarget.validity.badInput) {
return;
}
const value =
e.currentTarget.value == "" ? undefined : e.currentTarget.valueAsNumber;
onInput(value);
};
};

Loading…
Cancel
Save