UNPKG

@grafana/ui

Version:
1 lines • 16.9 kB
{"version":3,"file":"TimeRangeContent.mjs","sources":["../../../../../src/components/DateTimePickers/TimeRangePicker/TimeRangeContent.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { FormEvent, useCallback, useEffect, useId, useState } from 'react';\nimport * as React from 'react';\n\nimport {\n DateTime,\n dateTimeFormat,\n dateTimeParse,\n GrafanaTheme2,\n isDateTime,\n rangeUtil,\n RawTimeRange,\n TimeRange,\n TimeZone,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\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 { 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 InputState {\n value: string;\n invalid: boolean;\n errorMessage: string;\n}\n\nconst ERROR_MESSAGES = {\n default: () => t('time-picker.range-content.default-error', 'Please enter a past date or \"{{now}}\"', { now: 'now' }),\n range: () => t('time-picker.range-content.range-error', '\"From\" can\\'t be after \"To\"'),\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 [fromValue, toValue] = valueToState(value.raw.from, value.raw.to, timeZone);\n const style = useStyles2(getStyles);\n\n const [from, setFrom] = useState<InputState>(fromValue);\n const [to, setTo] = useState<InputState>(toValue);\n const [isOpen, setOpen] = useState(false);\n\n const fromFieldId = useId();\n const toFieldId = useId();\n\n // Synchronize internal state with external value\n useEffect(() => {\n const [fromValue, toValue] = valueToState(value.raw.from, value.raw.to, timeZone);\n setFrom(fromValue);\n setTo(toValue);\n }, [value.raw.from, value.raw.to, timeZone]);\n\n const onOpen = useCallback(\n (event: FormEvent<HTMLElement>) => {\n event.preventDefault();\n setOpen(true);\n },\n [setOpen]\n );\n\n const onApply = useCallback(() => {\n if (to.invalid || from.invalid) {\n return;\n }\n\n const raw: RawTimeRange = { from: from.value, to: to.value };\n const timeRange = rangeUtil.convertRawToRange(raw, timeZone, fiscalYearStartMonth);\n\n onApplyFromProps(timeRange);\n }, [from.invalid, from.value, onApplyFromProps, timeZone, to.invalid, to.value, fiscalYearStartMonth]);\n\n const onChange = useCallback(\n (from: DateTime | string, to: DateTime | string) => {\n const [fromValue, toValue] = valueToState(from, to, timeZone);\n setFrom(fromValue);\n setTo(toValue);\n },\n [timeZone]\n );\n\n const submitOnEnter = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n onApply();\n }\n };\n\n const onCopy = () => {\n const raw: RawTimeRange = { from: from.value, to: to.value };\n navigator.clipboard.writeText(JSON.stringify(raw));\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 const [fromValue, toValue] = valueToState(range.from, range.to, timeZone);\n setFrom(fromValue);\n setTo(toValue);\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={from.invalid}\n error={from.errorMessage}\n >\n <Input\n id={fromFieldId}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => onChange(event.currentTarget.value, to.value)}\n addonAfter={icon}\n onKeyDown={submitOnEnter}\n data-testid={selectors.components.TimePicker.fromField}\n value={from.value}\n />\n </Field>\n {fyTooltip}\n </div>\n <div className={style.fieldContainer}>\n <Field label={t('time-picker.range-content.to-input', 'To')} invalid={to.invalid} error={to.errorMessage}>\n <Input\n id={toFieldId}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => onChange(from.value, event.currentTarget.value)}\n addonAfter={icon}\n onKeyDown={submitOnEnter}\n data-testid={selectors.components.TimePicker.toField}\n value={to.value}\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(from.value, { timeZone })}\n to={dateTimeParse(to.value, { 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 valueToState(\n rawFrom: DateTime | string,\n rawTo: DateTime | string,\n timeZone?: TimeZone\n): [InputState, InputState] {\n const fromValue = valueAsString(rawFrom, timeZone);\n const toValue = valueAsString(rawTo, timeZone);\n const fromInvalid = !isValid(fromValue, false, timeZone);\n const toInvalid = !isValid(toValue, true, timeZone);\n // If \"To\" is invalid, we should not check the range anyways\n const rangeInvalid = isRangeInvalid(fromValue, toValue, timeZone) && !toInvalid;\n\n return [\n {\n value: fromValue,\n invalid: fromInvalid || rangeInvalid,\n errorMessage: rangeInvalid && !fromInvalid ? ERROR_MESSAGES.range() : ERROR_MESSAGES.default(),\n },\n { value: toValue, invalid: toInvalid, errorMessage: ERROR_MESSAGES.default() },\n ];\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":["fromValue","toValue","from","to"],"mappings":"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"}