{"version":3,"file":"RelativeTimeRangePicker.cjs","sources":["../../../../../src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { autoUpdate, 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 { getPositioningMiddleware } from '../../../utils/floating';\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 { getQuickOptions } 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\n/**\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/date-time-pickers-relativetimerangepicker--docs\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  const validOptions = getQuickOptions().filter((o) => isRelativeFormat(o.from));\n  const placement = 'bottom-start';\n\n  // the order of middleware is important!\n  // see https://floating-ui.com/docs/arrow#order\n  const middleware = getPositioningMiddleware(placement);\n\n  const { context, refs, floatingStyles } = useFloating({\n    open: isOpen,\n    placement,\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":["useState","useCallback","mapRelativeTimeRangeToOption","isRangeValid","useRef","useOverlay","useDialog","getQuickOptions","isRelativeFormat","getPositioningMiddleware","useFloating","autoUpdate","useClick","useDismiss","useInteractions","useStyles2","mapOptionToRelativeTimeRange","timeRange","jsxs","jsx","Icon","Trans","FocusScope","ScrollContainer","TimeRangeList","t","TimePickerTitle","Field","Input","Button","getInputStyles","css","cx"],"mappings":"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"}