@grafana/ui
Version:
Grafana Components Library
1 lines • 18.7 kB
Source Map (JSON)
{"version":3,"file":"TimeRangePicker.mjs","sources":["../../../../src/components/DateTimePickers/TimeRangePicker.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport { memo, createRef, useState, useEffect } from 'react';\n\nimport {\n rangeUtil,\n GrafanaTheme2,\n dateTimeFormat,\n timeZoneFormatUserFriendly,\n TimeOption,\n TimeRange,\n TimeZone,\n dateMath,\n getTimeZoneInfo,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { ButtonGroup } from '../Button/ButtonGroup';\nimport { getModalStyles } from '../Modal/getModalStyles';\nimport { getPortalContainer } from '../Portal/Portal';\nimport { ToolbarButton } from '../ToolbarButton/ToolbarButton';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nimport { TimePickerContent } from './TimeRangePicker/TimePickerContent';\nimport { TimeZoneDescription } from './TimeZonePicker/TimeZoneDescription';\nimport { WeekStart } from './WeekStartPicker';\nimport { getQuickOptions } from './options';\nimport { useTimeSync } from './utils/useTimeSync';\n\n/** @public */\nexport interface TimeRangePickerProps {\n hideText?: boolean;\n value: TimeRange;\n timeZone?: TimeZone;\n fiscalYearStartMonth?: number;\n\n /**\n * If you handle sync state between pickers yourself use this prop to pass the sync button component.\n * Otherwise, a default one will show automatically if sync is possible.\n */\n timeSyncButton?: JSX.Element;\n\n // Use to manually set the synced styles for the time range picker if you need to control the sync state yourself.\n isSynced?: boolean;\n\n // Use to manually set the initial sync state for the time range picker. It will use the current value to sync.\n initialIsSynced?: boolean;\n\n onChange: (timeRange: TimeRange) => void;\n onChangeTimeZone: (timeZone: TimeZone) => void;\n onChangeFiscalYearStartMonth?: (month: number) => void;\n onMoveBackward: () => void;\n onMoveForward: () => void;\n moveForwardTooltip?: string;\n moveBackwardTooltip?: string;\n onZoom: () => void;\n onError?: (error?: string) => void;\n history?: TimeRange[];\n quickRanges?: TimeOption[];\n hideQuickRanges?: boolean;\n widthOverride?: number;\n isOnCanvas?: boolean;\n onToolbarTimePickerClick?: () => void;\n /** Which day of the week the calendar should start on. Possible values: \"saturday\", \"sunday\" or \"monday\" */\n weekStart?: WeekStart;\n}\n\nexport interface State {\n isOpen: boolean;\n}\n\n/**\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/date-time-pickers-timerangepicker--docs\n */\nexport function TimeRangePicker(props: TimeRangePickerProps) {\n const [isOpen, setOpen] = useState(false);\n\n const {\n value,\n onMoveBackward,\n onMoveForward,\n moveForwardTooltip,\n moveBackwardTooltip,\n onZoom,\n onError,\n timeZone,\n fiscalYearStartMonth,\n history,\n onChangeTimeZone,\n onChangeFiscalYearStartMonth,\n quickRanges,\n hideQuickRanges,\n widthOverride,\n isOnCanvas,\n onToolbarTimePickerClick,\n weekStart,\n initialIsSynced,\n } = props;\n\n const { onChangeWithSync, isSynced, timeSyncButton } = useTimeSync({\n initialIsSynced,\n value,\n onChangeProp: props.onChange,\n isSyncedProp: props.isSynced,\n timeSyncButtonProp: props.timeSyncButton,\n });\n\n const onChange = (timeRange: TimeRange) => {\n onChangeWithSync(timeRange);\n setOpen(false);\n };\n\n useEffect(() => {\n if (isOpen && onToolbarTimePickerClick) {\n onToolbarTimePickerClick();\n }\n }, [isOpen, onToolbarTimePickerClick]);\n\n const onToolbarButtonSwitch = () => {\n setOpen((prevState) => !prevState);\n };\n\n const onClose = () => {\n setOpen(false);\n };\n\n const overlayRef = createRef<HTMLElement>();\n const buttonRef = createRef<HTMLElement>();\n const { overlayProps, underlayProps } = useOverlay(\n {\n onClose,\n isDismissable: true,\n isOpen,\n shouldCloseOnInteractOutside: (element) => {\n const portalContainer = getPortalContainer();\n return !buttonRef.current?.contains(element) && !portalContainer.contains(element);\n },\n },\n overlayRef\n );\n const { dialogProps } = useDialog({}, overlayRef);\n\n const styles = useStyles2(getStyles);\n const { modalBackdrop } = useStyles2(getModalStyles);\n\n const variant = isSynced ? 'active' : isOnCanvas ? 'canvas' : 'default';\n\n const isFromAfterTo = value?.to?.isBefore(value.from);\n const timePickerIcon = isFromAfterTo ? 'exclamation-triangle' : 'clock-nine';\n\n const currentTimeRange = formattedRange(value, timeZone, quickRanges);\n\n return (\n <ButtonGroup className={styles.container}>\n <ToolbarButton\n variant={variant}\n onClick={onMoveBackward}\n icon=\"angle-double-left\"\n type=\"button\"\n iconSize=\"xl\"\n tooltip={\n moveBackwardTooltip ?? t('time-picker.range-picker.backwards-time-aria-label', 'Move time range backwards')\n }\n narrow\n />\n\n <Tooltip\n ref={buttonRef}\n content={<TimePickerTooltip timeRange={value} timeZone={timeZone} />}\n placement=\"bottom\"\n interactive\n >\n <ToolbarButton\n data-testid={selectors.components.TimePicker.openButton}\n aria-label={t('time-picker.range-picker.current-time-selected', 'Time range selected: {{currentTimeRange}}', {\n currentTimeRange,\n })}\n aria-controls=\"TimePickerContent\"\n onClick={onToolbarButtonSwitch}\n icon={timePickerIcon}\n isOpen={isOpen}\n type=\"button\"\n variant={variant}\n >\n <TimePickerButtonLabel {...props} />\n </ToolbarButton>\n </Tooltip>\n {isOpen && (\n <div data-testid={selectors.components.TimePicker.overlayContent}>\n <div role=\"presentation\" className={cx(modalBackdrop, styles.backdrop)} {...underlayProps} />\n <FocusScope contain autoFocus restoreFocus>\n <section className={styles.content} ref={overlayRef} {...overlayProps} {...dialogProps}>\n <TimePickerContent\n timeZone={timeZone}\n fiscalYearStartMonth={fiscalYearStartMonth}\n value={value}\n onChange={onChange}\n quickOptions={quickRanges || getQuickOptions()}\n history={history}\n showHistory\n widthOverride={widthOverride}\n onChangeTimeZone={onChangeTimeZone}\n onChangeFiscalYearStartMonth={onChangeFiscalYearStartMonth}\n hideQuickRanges={hideQuickRanges}\n onError={onError}\n weekStart={weekStart}\n />\n </section>\n </FocusScope>\n </div>\n )}\n\n {timeSyncButton}\n\n <ToolbarButton\n onClick={onMoveForward}\n icon=\"angle-double-right\"\n type=\"button\"\n variant={variant}\n iconSize=\"xl\"\n tooltip={\n moveForwardTooltip ?? t('time-picker.range-picker.forwards-time-aria-label', 'Move time range forwards')\n }\n narrow\n />\n\n <Tooltip content={ZoomOutTooltip} placement=\"bottom\">\n <ToolbarButton\n aria-label={t('time-picker.range-picker.zoom-out-button', 'Zoom out time range')}\n onClick={onZoom}\n icon=\"search-minus\"\n type=\"button\"\n variant={variant}\n />\n </Tooltip>\n </ButtonGroup>\n );\n}\n\nTimeRangePicker.displayName = 'TimeRangePicker';\n\nconst ZoomOutTooltip = () => (\n <>\n <Trans i18nKey=\"time-picker.range-picker.zoom-out-tooltip\">\n Time range zoom out <br /> CTRL+Z\n </Trans>\n </>\n);\n\nexport const TimePickerTooltip = ({ timeRange, timeZone }: { timeRange: TimeRange; timeZone?: TimeZone }) => {\n const styles = useStyles2(getLabelStyles);\n const now = Date.now();\n\n // Get timezone info only if timeZone is provided\n const timeZoneInfo = timeZone ? getTimeZoneInfo(timeZone, now) : undefined;\n\n return (\n <>\n <div className=\"text-center\">\n {dateTimeFormat(timeRange.from, { timeZone })}\n <div className=\"text-center\">\n <Trans i18nKey=\"time-picker.range-picker.to\">to</Trans>\n </div>\n {dateTimeFormat(timeRange.to, { timeZone })}\n </div>\n <div className={styles.container}>\n <span className={styles.utc}>{timeZoneFormatUserFriendly(timeZone)}</span>\n <TimeZoneDescription info={timeZoneInfo} />\n </div>\n </>\n );\n};\n\ntype LabelProps = Pick<TimeRangePickerProps, 'hideText' | 'value' | 'timeZone' | 'quickRanges'>;\n\nexport const TimePickerButtonLabel = memo<LabelProps>(({ hideText, value, timeZone, quickRanges }) => {\n const styles = useStyles2(getLabelStyles);\n\n if (hideText) {\n return null;\n }\n\n return (\n <span className={styles.container} aria-live=\"polite\" aria-atomic=\"true\">\n <span>{formattedRange(value, timeZone, quickRanges)}</span>\n <span className={styles.utc}>{rangeUtil.describeTimeRangeAbbreviation(value, timeZone)}</span>\n </span>\n );\n});\n\nTimePickerButtonLabel.displayName = 'TimePickerButtonLabel';\n\nconst formattedRange = (value: TimeRange, timeZone?: TimeZone, quickRanges?: TimeOption[]) => {\n const adjustedTimeRange = {\n to: dateMath.isMathString(value.raw.to) ? value.raw.to : value.to,\n from: dateMath.isMathString(value.raw.from) ? value.raw.from : value.from,\n };\n return rangeUtil.describeTimeRange(adjustedTimeRange, timeZone, quickRanges);\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n position: 'relative',\n display: 'flex',\n verticalAlign: 'middle',\n }),\n backdrop: css({\n display: 'none',\n [theme.breakpoints.down('sm')]: {\n display: 'block',\n },\n }),\n content: css({\n position: 'absolute',\n right: 0,\n top: '116%',\n zIndex: theme.zIndex.dropdown,\n\n [theme.breakpoints.down('sm')]: {\n position: 'fixed',\n right: '50%',\n top: '50%',\n transform: 'translate(50%, -50%)',\n zIndex: theme.zIndex.modal,\n },\n }),\n };\n};\n\nconst getLabelStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n display: 'flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n columnGap: theme.spacing(0.5),\n }),\n utc: css({\n color: theme.v1.palette.orange,\n fontSize: theme.typography.size.sm,\n paddingLeft: '6px',\n lineHeight: '28px',\n verticalAlign: 'bottom',\n fontWeight: theme.typography.fontWeightMedium,\n }),\n };\n};\n"],"names":["_a"],"mappings":"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"}