@grafana/ui
Version:
Grafana Components Library
1 lines • 17.3 kB
Source Map (JSON)
{"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 { commonFormat } from '../commonFormat';\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, commonFormat);\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 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 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, undefined, commonFormat);\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, format: commonFormat });\n }\n\n if (value.endsWith('Z')) {\n const dt = dateTimeParse(value);\n return dateTimeFormat(dt, { timeZone, format: commonFormat });\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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"}