UNPKG

@grafana/ui

Version:
1 lines • 17.8 kB
{"version":3,"file":"TimeRangeContent.cjs","sources":["../../../../../src/components/DateTimePickers/TimeRangePicker/TimeRangeContent.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { type KeyboardEvent, useCallback, useEffect, useId, useState } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport {\n type DateTime,\n dateTimeFormat,\n dateTimeParse,\n type GrafanaTheme2,\n isDateTime,\n rangeUtil,\n type RawTimeRange,\n type TimeRange,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { type TimeZone } from '@grafana/schema';\n\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { Button } from '../../Button/Button';\nimport { Field } from '../../Forms/Field';\nimport { Icon } from '../../Icon/Icon';\nimport { Input } from '../../Input/Input';\nimport { Tooltip } from '../../Tooltip/Tooltip';\nimport { type WeekStart } from '../WeekStartPicker';\nimport { isValid } from '../utils';\n\nimport TimePickerCalendar from './TimePickerCalendar';\n\ninterface Props {\n isFullscreen: boolean;\n value: TimeRange;\n onApply: (range: TimeRange) => void;\n timeZone?: TimeZone;\n fiscalYearStartMonth?: number;\n roundup?: boolean;\n isReversed?: boolean;\n onError?: (error?: string) => void;\n weekStart?: WeekStart;\n}\n\ninterface FormState {\n from: string;\n to: string;\n}\n\nconst ERROR_MESSAGES = {\n default: () =>\n t(\n 'time-picker.range-content.default-error',\n 'Enter a date ({{dateExample}}) or relative time ({{relativeTimeExample1}}, {{relativeTimeExample2}})',\n {\n dateExample: 'YYYY-MM-DD HH:mm:ss',\n relativeTimeExample1: 'now',\n relativeTimeExample2: 'now-1h',\n }\n ),\n range: () => t('time-picker.range-content.range-error', '\"From\" date must be before \"To\" date'),\n};\n\nexport const TimeRangeContent = (props: Props) => {\n const {\n value,\n isFullscreen = false,\n timeZone,\n onApply: onApplyFromProps,\n isReversed,\n fiscalYearStartMonth,\n onError,\n weekStart,\n } = props;\n const style = useStyles2(getStyles);\n const [isOpen, setOpen] = useState(false);\n\n const {\n handleSubmit,\n register,\n formState: { errors },\n setValue,\n watch,\n } = useForm<FormState>({\n defaultValues: {\n from: valueAsString(value.raw.from, timeZone),\n to: valueAsString(value.raw.to, timeZone),\n },\n });\n\n const fromFieldId = useId();\n const toFieldId = useId();\n\n // Synchronize internal state with external value\n useEffect(() => {\n setValue('from', valueAsString(value.raw.from, timeZone));\n setValue('to', valueAsString(value.raw.to, timeZone));\n }, [value.raw.from, value.raw.to, setValue, timeZone]);\n\n const onOpen = () => setOpen(true);\n\n const onApply = useCallback(() => {\n handleSubmit((data) => {\n const raw: RawTimeRange = { from: data.from, to: data.to };\n const timeRange = rangeUtil.convertRawToRange(raw, timeZone, fiscalYearStartMonth);\n onApplyFromProps(timeRange);\n })();\n }, [handleSubmit, timeZone, fiscalYearStartMonth, onApplyFromProps]);\n\n const onChange = useCallback(\n (from: DateTime | string, to: DateTime | string) => {\n setValue('from', valueAsString(from, timeZone));\n setValue('to', valueAsString(to, timeZone));\n },\n [setValue, timeZone]\n );\n\n const submitOnEnter = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n onApply();\n }\n };\n\n const onCopy = () => {\n const rawSource: RawTimeRange = value.raw;\n const clipboardPayload = rangeUtil.formatRawTimeRange(rawSource);\n navigator.clipboard.writeText(JSON.stringify(clipboardPayload));\n };\n\n const onPaste = async () => {\n const raw = await navigator.clipboard.readText();\n let range;\n\n try {\n range = JSON.parse(raw);\n } catch (error) {\n if (onError) {\n onError(raw);\n }\n return;\n }\n\n setValue('from', valueAsString(range.from, timeZone));\n setValue('to', valueAsString(range.to, timeZone));\n };\n\n const fiscalYear = rangeUtil.convertRawToRange({ from: 'now/fy', to: 'now/fy' }, timeZone, fiscalYearStartMonth);\n\n const fyTooltip = (\n <div className={style.tooltip}>\n {rangeUtil.isFiscal(value) ? (\n <Tooltip\n content={t('time-picker.range-content.fiscal-year', 'Fiscal year: {{from}} - {{to}}', {\n from: fiscalYear.from.format('MMM-DD'),\n to: fiscalYear.to.format('MMM-DD'),\n })}\n >\n <Icon name=\"info-circle\" />\n </Tooltip>\n ) : null}\n </div>\n );\n\n const icon = (\n <Button\n aria-label={t('time-picker.range-content.open-input-calendar', 'Open calendar')}\n data-testid={selectors.components.TimePicker.calendar.openButton}\n icon=\"calendar-alt\"\n variant=\"secondary\"\n type=\"button\"\n onClick={onOpen}\n />\n );\n\n return (\n <div>\n <div className={style.fieldContainer}>\n <Field\n label={t('time-picker.range-content.from-input', 'From')}\n invalid={!!errors.from}\n error={errors.from?.message}\n >\n <Input\n {...register('from', {\n required: ERROR_MESSAGES.default(),\n\n validate: (value, formValues) => {\n if (!isValid(value, false, timeZone)) {\n return ERROR_MESSAGES.default();\n }\n if (\n !!formValues.to &&\n isValid(formValues.to, true, timeZone) &&\n isRangeInvalid(value, formValues.to, timeZone)\n ) {\n return ERROR_MESSAGES.range();\n }\n return true;\n },\n })}\n id={fromFieldId}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={submitOnEnter}\n addonAfter={icon}\n data-testid={selectors.components.TimePicker.fromField}\n />\n </Field>\n {fyTooltip}\n </div>\n <div className={style.fieldContainer}>\n <Field label={t('time-picker.range-content.to-input', 'To')} invalid={!!errors.to} error={errors.to?.message}>\n <Input\n {...register('to', {\n required: ERROR_MESSAGES.default(),\n validate: (value, formValues) => {\n if (!isValid(value, true, timeZone)) {\n return ERROR_MESSAGES.default();\n }\n if (\n !!formValues.from &&\n isValid(formValues.from, false, timeZone) &&\n isRangeInvalid(formValues.from, value, timeZone)\n ) {\n return ERROR_MESSAGES.range();\n }\n return true;\n },\n })}\n id={toFieldId}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={submitOnEnter}\n addonAfter={icon}\n data-testid={selectors.components.TimePicker.toField}\n />\n </Field>\n {fyTooltip}\n </div>\n <div className={style.buttonsContainer}>\n <Button\n data-testid={selectors.components.TimePicker.copyTimeRange}\n icon=\"copy\"\n variant=\"secondary\"\n tooltip={t('time-picker.copy-paste.tooltip-copy', 'Copy time range to clipboard')}\n type=\"button\"\n onClick={onCopy}\n />\n <Button\n data-testid={selectors.components.TimePicker.pasteTimeRange}\n icon=\"clipboard-alt\"\n variant=\"secondary\"\n tooltip={t('time-picker.copy-paste.tooltip-paste', 'Paste time range')}\n type=\"button\"\n onClick={onPaste}\n />\n <Button data-testid={selectors.components.TimePicker.applyTimeRange} type=\"button\" onClick={onApply}>\n <Trans i18nKey=\"time-picker.range-content.apply-button\">Apply time range</Trans>\n </Button>\n </div>\n\n <TimePickerCalendar\n isFullscreen={isFullscreen}\n isOpen={isOpen}\n from={dateTimeParse(watch('from'), { timeZone })}\n to={dateTimeParse(watch('to'), { timeZone })}\n onApply={onApply}\n onClose={() => setOpen(false)}\n onChange={onChange}\n timeZone={timeZone}\n isReversed={isReversed}\n weekStart={weekStart}\n />\n </div>\n );\n};\n\nfunction isRangeInvalid(from: string, to: string, timezone?: string): boolean {\n const raw: RawTimeRange = { from, to };\n const timeRange = rangeUtil.convertRawToRange(raw, timezone);\n const valid = timeRange.from.isSame(timeRange.to) || timeRange.from.isBefore(timeRange.to);\n\n return !valid;\n}\n\nfunction valueAsString(value: DateTime | string, timeZone?: TimeZone): string {\n if (isDateTime(value)) {\n return dateTimeFormat(value, { timeZone });\n }\n\n if (value.endsWith('Z')) {\n const dt = dateTimeParse(value);\n return dateTimeFormat(dt, { timeZone });\n }\n\n return value;\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n fieldContainer: css({\n display: 'flex',\n }),\n buttonsContainer: css({\n display: 'flex',\n gap: theme.spacing(0.5),\n marginTop: theme.spacing(1),\n }),\n tooltip: css({\n paddingLeft: theme.spacing(1),\n paddingTop: theme.spacing(3),\n }),\n };\n}\n"],"names":["t","useStyles2","useState","useForm","useId","useEffect","useCallback","data","rangeUtil","jsx","Tooltip","Icon","Button","selectors","jsxs","Field","Input","value","isValid","Trans","dateTimeParse","isDateTime","dateTimeFormat","css"],"mappings":"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"}