@grafana/ui
Version:
Grafana Components Library
1 lines • 22.9 kB
Source Map (JSON)
{"version":3,"file":"DateTimePicker.mjs","sources":["../../../../../src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { autoUpdate, useFloating } from '@floating-ui/react';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport { FormEvent, ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport * as React from 'react';\nimport Calendar from 'react-calendar';\nimport { useMedia } from 'react-use';\n\nimport {\n dateTimeFormat,\n DateTime,\n dateTime,\n GrafanaTheme2,\n isDateTime,\n dateTimeForTimeZone,\n getTimeZone,\n TimeZone,\n} from '@grafana/data';\nimport { Components } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useStyles2, useTheme2 } from '../../../themes/ThemeContext';\nimport { getPositioningMiddleware } from '../../../utils/floating';\nimport { Button } from '../../Button/Button';\nimport { InlineField } from '../../Forms/InlineField';\nimport { Icon } from '../../Icon/Icon';\nimport { Input } from '../../Input/Input';\nimport { Stack } from '../../Layout/Stack/Stack';\nimport { getModalStyles } from '../../Modal/getModalStyles';\nimport { Portal } from '../../Portal/Portal';\nimport { TimeOfDayPicker, POPUP_CLASS_NAME } from '../TimeOfDayPicker';\nimport { getBodyStyles } from '../TimeRangePicker/CalendarBody';\nimport { isValid } from '../utils';\nimport { adjustDateForReactCalendar } from '../utils/adjustDateForReactCalendar';\n\nexport interface Props {\n /** Input date for the component */\n date?: DateTime;\n /** Callback for returning the selected date */\n onChange: (date?: DateTime) => void;\n /** label for the input field */\n label?: ReactNode;\n /** Set the latest selectable date */\n maxDate?: Date;\n /** Set the minimum selectable date */\n minDate?: Date;\n /** Display seconds on the time picker */\n showSeconds?: boolean;\n /** Set the hours that can't be selected */\n disabledHours?: () => number[];\n /** Set the minutes that can't be selected */\n disabledMinutes?: () => number[];\n /** Set the seconds that can't be selected */\n disabledSeconds?: () => number[];\n /** Can input be cleared/have empty values */\n clearable?: boolean;\n /** Custom timezone for the date/time display */\n timeZone?: TimeZone;\n}\n\n/**\n * A component for selecting a date *and* time.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/date-time-pickers-datetimepicker--docs\n */\nexport const DateTimePicker = ({\n date,\n maxDate,\n minDate,\n label,\n onChange,\n disabledHours,\n disabledMinutes,\n disabledSeconds,\n timeZone,\n showSeconds = true,\n clearable = false,\n}: Props) => {\n const [isOpen, setOpen] = useState(false);\n\n const ref = useRef<HTMLDivElement>(null);\n const { overlayProps, underlayProps } = useOverlay(\n {\n onClose: () => setOpen(false),\n isDismissable: true,\n isOpen,\n shouldCloseOnInteractOutside: (element) => {\n const popupElement = document.getElementsByClassName(POPUP_CLASS_NAME)[0];\n return !(popupElement && popupElement.contains(element));\n },\n },\n ref\n );\n const { dialogProps } = useDialog({}, ref);\n\n const theme = useTheme2();\n const { modalBackdrop } = useStyles2(getModalStyles);\n const isFullscreen = useMedia(`(min-width: ${theme.breakpoints.values.lg}px)`);\n const placement = 'bottom-start';\n const styles = useStyles2(getStyles);\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 { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement,\n onOpenChange: setOpen,\n middleware,\n whileElementsMounted: autoUpdate,\n strategy: 'fixed',\n });\n\n const onApply = useCallback(\n (date: DateTime) => {\n setOpen(false);\n onChange(date);\n },\n [onChange]\n );\n\n const onOpen = useCallback(\n (event: FormEvent<HTMLElement>) => {\n event.preventDefault();\n setOpen(true);\n },\n [setOpen]\n );\n\n return (\n <div data-testid=\"date-time-picker\" style={{ position: 'relative' }}>\n <DateTimeInput\n date={date}\n onChange={onChange}\n isFullscreen={isFullscreen}\n onOpen={onOpen}\n label={label}\n ref={refs.setReference}\n showSeconds={showSeconds}\n clearable={clearable}\n timeZone={timeZone}\n />\n {isOpen ? (\n isFullscreen ? (\n <Portal>\n <FocusScope contain autoFocus restoreFocus>\n <div ref={ref} {...overlayProps} {...dialogProps}>\n <DateTimeCalendar\n date={date}\n onChange={onApply}\n isFullscreen={true}\n onClose={() => setOpen(false)}\n maxDate={maxDate}\n minDate={minDate}\n ref={refs.setFloating}\n style={floatingStyles}\n showSeconds={showSeconds}\n disabledHours={disabledHours}\n disabledMinutes={disabledMinutes}\n disabledSeconds={disabledSeconds}\n timeZone={timeZone}\n />\n </div>\n </FocusScope>\n </Portal>\n ) : (\n <Portal>\n <div className={modalBackdrop} {...underlayProps} />\n <FocusScope contain autoFocus restoreFocus>\n <div ref={ref} {...overlayProps} {...dialogProps}>\n <div className={styles.modal}>\n <DateTimeCalendar\n date={date}\n maxDate={maxDate}\n minDate={minDate}\n onChange={onApply}\n isFullscreen={false}\n onClose={() => setOpen(false)}\n showSeconds={showSeconds}\n disabledHours={disabledHours}\n disabledMinutes={disabledMinutes}\n disabledSeconds={disabledSeconds}\n timeZone={timeZone}\n />\n </div>\n </div>\n </FocusScope>\n </Portal>\n )\n ) : null}\n </div>\n );\n};\n\ninterface DateTimeCalendarProps extends Omit<Props, 'label' | 'clearable' | 'onChange'> {\n onChange: (date: DateTime) => void;\n onClose: () => void;\n isFullscreen: boolean;\n style?: React.CSSProperties;\n}\n\ntype InputProps = Pick<Props, 'onChange' | 'label' | 'date' | 'showSeconds' | 'clearable' | 'timeZone'> & {\n isFullscreen: boolean;\n onOpen: (event: FormEvent<HTMLElement>) => void;\n};\n\ntype InputState = {\n value: string;\n invalid: boolean;\n};\n\nconst DateTimeInput = React.forwardRef<HTMLInputElement, InputProps>(\n ({ date, label, onChange, onOpen, timeZone, showSeconds = true, clearable = false }, ref) => {\n const styles = useStyles2(getStyles);\n const format = showSeconds ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm';\n const [internalDate, setInternalDate] = useState<InputState>(() => {\n return {\n value: date ? dateTimeFormat(date, { timeZone }) : !clearable ? dateTimeFormat(dateTime(), { timeZone }) : '',\n invalid: false,\n };\n });\n\n useEffect(() => {\n if (date) {\n const formattedDate = dateTimeFormat(date, { format, timeZone });\n setInternalDate({\n invalid: !isValid(formattedDate),\n value: isDateTime(date) ? formattedDate : date,\n });\n }\n }, [date, format, timeZone]);\n\n const onChangeDate = useCallback((event: FormEvent<HTMLInputElement>) => {\n const isInvalid = !isValid(event.currentTarget.value);\n setInternalDate({\n value: event.currentTarget.value,\n invalid: isInvalid,\n });\n }, []);\n\n const onBlur = useCallback(() => {\n if (!internalDate.invalid && internalDate.value) {\n const date = dateTimeForTimeZone(getTimeZone({ timeZone }), internalDate.value);\n onChange(date);\n }\n }, [internalDate, onChange, timeZone]);\n\n const clearInternalDate = useCallback(() => {\n setInternalDate({ value: '', invalid: false });\n onChange();\n }, [onChange]);\n\n const icon = (\n <Button\n aria-label={t('grafana-ui.date-time-picker.calendar-icon-label', 'Time picker')}\n icon=\"calendar-alt\"\n variant=\"secondary\"\n onClick={onOpen}\n />\n );\n return (\n <InlineField label={label} invalid={!!(internalDate.value && internalDate.invalid)} className={styles.field}>\n <Input\n onChange={onChangeDate}\n addonAfter={icon}\n value={internalDate.value}\n onBlur={onBlur}\n data-testid={Components.DateTimePicker.input}\n placeholder={t('grafana-ui.date-time-picker.select-placeholder', 'Select date/time')}\n ref={ref}\n suffix={\n clearable &&\n internalDate.value && <Icon name=\"times\" className={styles.clearIcon} onClick={clearInternalDate} />\n }\n />\n </InlineField>\n );\n }\n);\n\nDateTimeInput.displayName = 'DateTimeInput';\n\nconst DateTimeCalendar = React.forwardRef<HTMLDivElement, DateTimeCalendarProps>(\n (\n {\n date,\n onClose,\n onChange,\n isFullscreen,\n maxDate,\n minDate,\n style,\n showSeconds = true,\n disabledHours,\n disabledMinutes,\n disabledSeconds,\n timeZone,\n },\n ref\n ) => {\n const calendarStyles = useStyles2(getBodyStyles);\n const styles = useStyles2(getStyles);\n\n // need to keep these 2 separate in state since react-calendar doesn't support different timezones\n const [timeOfDayDateTime, setTimeOfDayDateTime] = useState(() => {\n if (date && date.isValid()) {\n return dateTimeForTimeZone(getTimeZone({ timeZone }), date);\n }\n\n return dateTimeForTimeZone(getTimeZone({ timeZone }), new Date());\n });\n const [reactCalendarDate, setReactCalendarDate] = useState<Date>(() => {\n if (date && date.isValid()) {\n return adjustDateForReactCalendar(date.toDate(), getTimeZone({ timeZone }));\n }\n\n return adjustDateForReactCalendar(new Date(), getTimeZone({ timeZone }));\n });\n\n const onChangeDate = useCallback<NonNullable<React.ComponentProps<typeof Calendar>['onChange']>>((date) => {\n if (date && !Array.isArray(date)) {\n setReactCalendarDate(date);\n }\n }, []);\n\n const onChangeTime = useCallback((date: DateTime) => {\n setTimeOfDayDateTime(date);\n }, []);\n\n // here we need to stitch the 2 date objects back together\n const handleApply = () => {\n // we take the date that's set by TimeOfDayPicker\n const newDate = dateTime(timeOfDayDateTime);\n\n // and apply the date/month/year set by react-calendar\n newDate.set('date', reactCalendarDate.getDate());\n newDate.set('month', reactCalendarDate.getMonth());\n newDate.set('year', reactCalendarDate.getFullYear());\n\n onChange(newDate);\n };\n\n return (\n <div className={cx(styles.container, { [styles.fullScreen]: isFullscreen })} style={style} ref={ref}>\n <Calendar\n next2Label={null}\n prev2Label={null}\n value={reactCalendarDate}\n nextLabel={<Icon name=\"angle-right\" />}\n nextAriaLabel={t('grafana-ui.date-time-picker.next-label', 'Next month')}\n prevLabel={<Icon name=\"angle-left\" />}\n prevAriaLabel={t('grafana-ui.date-time-picker.previous-label', 'Previous month')}\n onChange={onChangeDate}\n locale=\"en\"\n className={calendarStyles.body}\n tileClassName={calendarStyles.title}\n maxDate={maxDate}\n minDate={minDate}\n />\n <div className={styles.time}>\n <TimeOfDayPicker\n showSeconds={showSeconds}\n onChange={onChangeTime}\n value={timeOfDayDateTime}\n disabledHours={disabledHours}\n disabledMinutes={disabledMinutes}\n disabledSeconds={disabledSeconds}\n />\n </div>\n <Stack>\n <Button type=\"button\" onClick={handleApply}>\n <Trans i18nKey=\"grafana-ui.date-time-picker.apply\">Apply</Trans>\n </Button>\n <Button variant=\"secondary\" type=\"button\" onClick={onClose}>\n <Trans i18nKey=\"grafana-ui.date-time-picker.cancel\">Cancel</Trans>\n </Button>\n </Stack>\n </div>\n );\n }\n);\n\nDateTimeCalendar.displayName = 'DateTimeCalendar';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css({\n padding: theme.spacing(1),\n border: `1px ${theme.colors.border.weak} solid`,\n borderRadius: theme.shape.radius.default,\n backgroundColor: theme.colors.background.primary,\n zIndex: theme.zIndex.modal,\n }),\n fullScreen: css({\n position: 'absolute',\n }),\n time: css({\n marginBottom: theme.spacing(2),\n }),\n modal: css({\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: theme.zIndex.modal,\n maxWidth: '280px',\n }),\n clearIcon: css({\n cursor: 'pointer',\n }),\n field: css({\n marginBottom: 0,\n width: '100%',\n }),\n});\n"],"names":["date"],"mappings":"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"}