UNPKG

@grafana/ui

Version:
1 lines • 18.7 kB
{"version":3,"file":"RelativeTimeRangePicker.mjs","sources":["../../../../../src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { autoUpdate, flip, shift, useClick, useDismiss, useFloating, useInteractions } from '@floating-ui/react';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport { FormEvent, useCallback, useRef, useState } from 'react';\n\nimport { RelativeTimeRange, GrafanaTheme2, TimeOption } from '@grafana/data';\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 { getInputStyles, Input } from '../../Input/Input';\nimport { ScrollContainer } from '../../ScrollContainer/ScrollContainer';\nimport { TimePickerTitle } from '../TimeRangePicker/TimePickerTitle';\nimport { TimeRangeList } from '../TimeRangePicker/TimeRangeList';\nimport { quickOptions } from '../options';\n\nimport {\n isRangeValid,\n isRelativeFormat,\n mapOptionToRelativeTimeRange,\n mapRelativeTimeRangeToOption,\n RangeValidation,\n} from './utils';\n\n/**\n * @internal\n */\nexport interface RelativeTimeRangePickerProps {\n timeRange: RelativeTimeRange;\n onChange: (timeRange: RelativeTimeRange) => void;\n}\n\ntype InputState = {\n value: string;\n validation: RangeValidation;\n};\n\nconst validOptions = quickOptions.filter((o) => isRelativeFormat(o.from));\n\n/**\n * @internal\n */\nexport function RelativeTimeRangePicker(props: RelativeTimeRangePickerProps) {\n const { timeRange, onChange } = props;\n const [isOpen, setIsOpen] = useState(false);\n const onClose = useCallback(() => setIsOpen(false), []);\n const timeOption = mapRelativeTimeRangeToOption(timeRange);\n const [from, setFrom] = useState<InputState>({ value: timeOption.from, validation: isRangeValid(timeOption.from) });\n const [to, setTo] = useState<InputState>({ value: timeOption.to, validation: isRangeValid(timeOption.to) });\n const ref = useRef<HTMLDivElement>(null);\n const { overlayProps, underlayProps } = useOverlay(\n { onClose: () => setIsOpen(false), isDismissable: true, isOpen },\n ref\n );\n const { dialogProps } = useDialog({}, ref);\n\n // the order of middleware is important!\n // see https://floating-ui.com/docs/arrow#order\n const middleware = [\n flip({\n // see https://floating-ui.com/docs/flip#combining-with-shift\n crossAxis: false,\n boundary: document.body,\n }),\n shift(),\n ];\n\n const { context, refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n onOpenChange: setIsOpen,\n middleware,\n whileElementsMounted: autoUpdate,\n strategy: 'fixed',\n });\n\n const click = useClick(context);\n const dismiss = useDismiss(context);\n\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, click]);\n\n const styles = useStyles2(getStyles(from.validation.errorMessage, to.validation.errorMessage));\n\n const onChangeTimeOption = (option: TimeOption) => {\n const relativeTimeRange = mapOptionToRelativeTimeRange(option);\n if (!relativeTimeRange) {\n return;\n }\n onClose();\n setFrom({ ...from, value: option.from });\n setTo({ ...to, value: option.to });\n onChange(relativeTimeRange);\n };\n\n const onOpen = useCallback(\n (event: FormEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n event.preventDefault();\n setIsOpen(!isOpen);\n },\n [isOpen]\n );\n\n const onApply = (event: FormEvent<HTMLButtonElement>) => {\n event.preventDefault();\n\n if (!to.validation.isValid || !from.validation.isValid) {\n return;\n }\n\n const timeRange = mapOptionToRelativeTimeRange({\n from: from.value,\n to: to.value,\n display: '',\n });\n\n if (!timeRange) {\n return;\n }\n\n onChange(timeRange);\n setIsOpen(false);\n };\n\n const { from: timeOptionFrom, to: timeOptionTo } = timeOption;\n\n return (\n <div className={styles.container}>\n <button\n ref={refs.setReference}\n className={styles.pickerInput}\n type=\"button\"\n onClick={onOpen}\n {...getReferenceProps()}\n >\n <span className={styles.clockIcon}>\n <Icon name=\"clock-nine\" />\n </span>\n <span>\n <Trans i18nKey=\"time-picker.time-range.from-to\">\n {{ timeOptionFrom }} to {{ timeOptionTo }}\n </Trans>\n </span>\n <span className={styles.caretIcon}>\n <Icon name={isOpen ? 'angle-up' : 'angle-down'} size=\"lg\" />\n </span>\n </button>\n {isOpen && (\n <div>\n <div role=\"presentation\" className={styles.backdrop} {...underlayProps} />\n <FocusScope contain autoFocus restoreFocus>\n <div ref={ref} {...overlayProps} {...dialogProps}>\n <div className={styles.content} ref={refs.setFloating} style={floatingStyles} {...getFloatingProps()}>\n <div className={styles.body}>\n <div className={styles.leftSide}>\n <ScrollContainer showScrollIndicators>\n <TimeRangeList\n title={t('time-picker.time-range.example-title', 'Example time ranges')}\n options={validOptions}\n onChange={onChangeTimeOption}\n value={timeOption}\n />\n </ScrollContainer>\n </div>\n <div className={styles.rightSide}>\n <div className={styles.title}>\n <TimePickerTitle>\n <Trans i18nKey=\"time-picker.time-range.specify\">Specify time range</Trans>\n </TimePickerTitle>\n </div>\n <Field\n label={t('time-picker.time-range.from-label', 'From')}\n invalid={!from.validation.isValid}\n error={from.validation.errorMessage}\n >\n <Input\n onClick={(event) => event.stopPropagation()}\n onBlur={() => setFrom({ ...from, validation: isRangeValid(from.value) })}\n onChange={(event) => setFrom({ ...from, value: event.currentTarget.value })}\n value={from.value}\n />\n </Field>\n <Field\n label={t('time-picker.time-range.to-label', 'To')}\n invalid={!to.validation.isValid}\n error={to.validation.errorMessage}\n >\n <Input\n onClick={(event) => event.stopPropagation()}\n onBlur={() => setTo({ ...to, validation: isRangeValid(to.value) })}\n onChange={(event) => setTo({ ...to, value: event.currentTarget.value })}\n value={to.value}\n />\n </Field>\n <Button\n aria-label={t('time-picker.time-range.submit-button-label', 'TimePicker submit button')}\n onClick={onApply}\n >\n <Trans i18nKey=\"time-picker.time-range.apply\">Apply time range</Trans>\n </Button>\n </div>\n </div>\n </div>\n </div>\n </FocusScope>\n </div>\n )}\n </div>\n );\n}\n\nconst getStyles = (fromError?: string, toError?: string) => (theme: GrafanaTheme2) => {\n const inputStyles = getInputStyles({ theme, invalid: false });\n const bodyMinimumHeight = 250;\n const bodyHeight = bodyMinimumHeight + calculateErrorHeight(theme, fromError) + calculateErrorHeight(theme, toError);\n\n return {\n backdrop: css({\n position: 'fixed',\n zIndex: theme.zIndex.modalBackdrop,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n }),\n container: css({\n display: 'flex',\n position: 'relative',\n }),\n pickerInput: cx(\n inputStyles.input,\n inputStyles.wrapper,\n css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n paddingRight: 0,\n paddingLeft: 0,\n lineHeight: `${theme.spacing.gridSize * theme.components.height.md - 2}px`,\n })\n ),\n caretIcon: cx(\n inputStyles.suffix,\n css({\n position: 'relative',\n marginLeft: theme.spacing(0.5),\n })\n ),\n clockIcon: cx(\n inputStyles.prefix,\n css({\n position: 'relative',\n marginRight: theme.spacing(0.5),\n })\n ),\n content: css({\n background: theme.colors.background.primary,\n boxShadow: theme.shadows.z3,\n position: 'absolute',\n zIndex: theme.zIndex.modal,\n width: '500px',\n top: '100%',\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n left: 0,\n whiteSpace: 'normal',\n }),\n body: css({\n display: 'flex',\n height: `${bodyHeight}px`,\n }),\n description: css({\n color: theme.colors.text.secondary,\n fontSize: theme.typography.size.sm,\n }),\n leftSide: css({\n width: '50% !important',\n borderRight: `1px solid ${theme.colors.border.medium}`,\n }),\n rightSide: css({\n width: '50%',\n padding: theme.spacing(1),\n }),\n title: css({\n marginBottom: theme.spacing(1),\n }),\n };\n};\n\nfunction calculateErrorHeight(theme: GrafanaTheme2, errorMessage?: string): number {\n if (!errorMessage) {\n return 0;\n }\n\n if (errorMessage.length > 34) {\n return theme.spacing.gridSize * 6.5;\n }\n\n return theme.spacing.gridSize * 4;\n}\n"],"names":["timeRange"],"mappings":"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"}