@grafana/ui
Version:
Grafana Components Library
1 lines • 5.09 kB
Source Map (JSON)
{"version":3,"file":"TimeOfDayPicker.mjs","sources":["../../../../src/components/DateTimePickers/TimeOfDayPicker.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\n\nimport { dateTime, type DateTime } from '@grafana/data';\n\nimport { Combobox } from '../Combobox/Combobox';\nimport { type ComboboxOption } from '../Combobox/types';\n\ninterface BaseProps {\n onChange: (value: DateTime) => void | ((value?: DateTime) => void);\n value?: DateTime;\n showSeconds?: boolean;\n minuteStep?: 5 | 10 | 15 | 20 | 30;\n disabled?: boolean;\n disabledHours?: () => number[];\n placeholder?: string;\n allowEmpty?: boolean;\n id?: string;\n}\n\ninterface AllowEmptyProps extends BaseProps {\n allowEmpty: true;\n onChange: (value?: DateTime) => void;\n}\n\ninterface NoAllowEmptyProps extends BaseProps {\n allowEmpty?: false;\n onChange: (value: DateTime) => void;\n}\n\nexport type Props = AllowEmptyProps | NoAllowEmptyProps;\n\nexport const TimeOfDayPicker = ({\n minuteStep = 15,\n showSeconds = false,\n value,\n disabled,\n disabledHours,\n id,\n placeholder,\n allowEmpty = false,\n onChange,\n}: Props) => {\n const opts = useMemo(() => {\n // technically not correct to only call this on callback identity change, but unlikely to matter in practice\n const skipHours = new Set(disabledHours?.());\n\n const opts: Array<ComboboxOption<string>> = [];\n\n for (let h = 0; h < 24; h++) {\n if (!skipHours.has(h)) {\n for (let m = 0; m < 60; m += minuteStep) {\n opts.push({ value: `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}` });\n }\n }\n }\n\n return opts;\n }, [minuteStep, disabledHours]);\n\n const initValue = useMemo(\n () => (value ? value.format(showSeconds ? 'HH:mm:ss' : 'HH:mm') : null),\n [value, showSeconds]\n );\n\n const [selected, setSelected] = useState<string | null>(initValue);\n\n return (\n <Combobox\n id={id}\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n placeholder={placeholder ?? (showSeconds ? 'HH:mm:ss' : 'HH:mm')}\n disabled={disabled}\n createCustomValue={true}\n options={opts}\n value={selected}\n isClearable={allowEmpty}\n width={showSeconds ? 14 : 12}\n onChange={(option?: ComboboxOption<string> | null) => {\n // todo: ensure valid format\n\n const optVal = option?.value ?? '00:00:00';\n\n const [HH, mm, ss] = optVal.split(':').map(Number);\n\n // copy original or create new dateTime\n const newValue = value != null ? dateTime(value) : dateTime();\n\n newValue.set('hour', HH ?? 0);\n newValue.set('minute', mm ?? 0);\n newValue.set('second', ss ?? 0);\n\n // always show as selected or entered\n setSelected(option?.value ?? null);\n\n onChange(newValue);\n }}\n />\n );\n};\n"],"names":["opts"],"mappings":"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"}