/* This file is part of GNU Anastasis (C) 2021-2022 Anastasis SARL GNU Anastasis is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Anastasis is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with GNU Anastasis; see the file COPYING. If not, see */ /** * * @author Sebastian Javier Marchano (sebasjm) */ import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import { useTranslationContext } from "../../context/translation.js"; import "../../scss/DurationPicker.scss"; export interface Props { hours?: boolean; minutes?: boolean; seconds?: boolean; days?: boolean; onChange: (value: number) => void; value: number; } // inspiration taken from https://github.com/flurmbo/react-duration-picker export function DurationPicker({ days, hours, minutes, seconds, onChange, value, }: Props): VNode { const ss = 1000; const ms = ss * 60; const hs = ms * 60; const ds = hs * 24; const { i18n } = useTranslationContext(); return (
{days && ( = ds ? () => onChange(value - ds) : undefined} onIncrease={value < 99 * ds ? () => onChange(value + ds) : undefined} onChange={(diff) => onChange(value + diff * ds)} /> )} {hours && ( = hs ? () => onChange(value - hs) : undefined} onIncrease={value < 99 * ds ? () => onChange(value + hs) : undefined} onChange={(diff) => onChange(value + diff * hs)} /> )} {minutes && ( = ms ? () => onChange(value - ms) : undefined} onIncrease={value < 99 * ds ? () => onChange(value + ms) : undefined} onChange={(diff) => onChange(value + diff * ms)} /> )} {seconds && ( = ss ? () => onChange(value - ss) : undefined} onIncrease={value < 99 * ds ? () => onChange(value + ss) : undefined} onChange={(diff) => onChange(value + diff * ss)} /> )}
); } interface ColProps { unit: string; min?: number; max: number; value: number; onIncrease?: () => void; onDecrease?: () => void; onChange?: (diff: number) => void; } function InputNumber({ initial, onChange, }: { initial: number; onChange: (n: number) => void; }) { const [value, handler] = useState<{ v: string }>({ v: toTwoDigitString(initial), }); return ( onChange(parseInt(value.v, 10))} onInput={(e) => { e.preventDefault(); const n = Number.parseInt(e.currentTarget.value, 10); if (isNaN(n)) return handler({ v: toTwoDigitString(initial) }); return handler({ v: toTwoDigitString(n) }); }} style={{ width: 50, border: "none", fontSize: "inherit", background: "inherit", }} /> ); } function DurationColumn({ unit, min = 0, max, value, onIncrease, onDecrease, onChange, }: ColProps): VNode { const cellHeight = 35; return (


{onDecrease && ( )}
{value > min ? toTwoDigitString(value - 1) : ""}
{onChange ? ( onChange(n - value)} /> ) : ( toTwoDigitString(value) )}
{unit}
{value < max ? toTwoDigitString(value + 1) : ""}
{onIncrease && ( )}
); } function toTwoDigitString(n: number) { if (n < 10) { return `0${n}`; } return `${n}`; }