UNPKG

@grafana/ui

Version:
1 lines • 18.1 kB
{"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 { quickOptions } 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 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\nexport function TimeRangePicker(props: TimeRangePickerProps) {\n const [isOpen, setOpen] = useState(false);\n\n const {\n value,\n onMoveBackward,\n onMoveForward,\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 aria-label={t('time-picker.range-picker.backwards-time-aria-label', 'Move time range backwards')}\n variant={variant}\n onClick={onMoveBackward}\n icon=\"angle-left\"\n type=\"button\"\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 || quickOptions}\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 aria-label={t('time-picker.range-picker.forwards-time-aria-label', 'Move time range forwards')}\n onClick={onMoveForward}\n icon=\"angle-right\"\n narrow\n type=\"button\"\n variant={variant}\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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"}