@grafana/ui
Version:
Grafana Components Library
1 lines • 22.1 kB
Source Map (JSON)
{"version":3,"file":"TimePickerContent.mjs","sources":["../../../../../src/components/DateTimePickers/TimeRangePicker/TimePickerContent.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { memo, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, isDateTime, rangeUtil, RawTimeRange, TimeOption, TimeRange, TimeZone } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useStyles2, useTheme2 } from '../../../themes/ThemeContext';\nimport { getFocusStyles } from '../../../themes/mixins';\nimport { FilterInput } from '../../FilterInput/FilterInput';\nimport { Icon } from '../../Icon/Icon';\nimport { WeekStart } from '../WeekStartPicker';\n\nimport { TimePickerFooter } from './TimePickerFooter';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { TimeRangeContent } from './TimeRangeContent';\nimport { TimeRangeList } from './TimeRangeList';\nimport { mapOptionToTimeRange, mapRangeToTimeOption } from './mapper';\n\ninterface Props {\n value: TimeRange;\n onChange: (timeRange: TimeRange) => void;\n onChangeTimeZone: (timeZone: TimeZone) => void;\n onChangeFiscalYearStartMonth?: (month: number) => void;\n onError?: (error?: string) => void;\n timeZone?: TimeZone;\n fiscalYearStartMonth?: number;\n quickOptions?: TimeOption[];\n history?: TimeRange[];\n showHistory?: boolean;\n className?: string;\n hideTimeZone?: boolean;\n /** Reverse the order of relative and absolute range pickers. Used to left align the picker in forms */\n isReversed?: boolean;\n hideQuickRanges?: boolean;\n widthOverride?: number;\n weekStart?: WeekStart;\n}\n\nexport interface PropsWithScreenSize extends Props {\n isFullscreen: boolean;\n}\n\ninterface FormProps extends Omit<Props, 'history'> {\n historyOptions?: TimeOption[];\n}\n\nexport const TimePickerContentWithScreenSize = (props: PropsWithScreenSize) => {\n const {\n quickOptions = [],\n isReversed,\n isFullscreen,\n hideQuickRanges,\n timeZone,\n fiscalYearStartMonth,\n value,\n onChange,\n history,\n showHistory,\n className,\n hideTimeZone,\n onChangeTimeZone,\n onChangeFiscalYearStartMonth,\n } = props;\n const isHistoryEmpty = !history?.length;\n const isContainerTall =\n (isFullscreen && showHistory) || (!isFullscreen && ((showHistory && !isHistoryEmpty) || !hideQuickRanges));\n const styles = useStyles2(getStyles, isReversed, hideQuickRanges, isContainerTall, isFullscreen);\n const historyOptions = mapToHistoryOptions(history, timeZone);\n const timeOption = useTimeOption(value.raw, quickOptions);\n const [searchTerm, setSearchQuery] = useState('');\n\n const filteredQuickOptions = quickOptions.filter((o) => o.display.toLowerCase().includes(searchTerm.toLowerCase()));\n\n const onChangeTimeOption = (timeOption: TimeOption) => {\n return onChange(mapOptionToTimeRange(timeOption));\n };\n\n return (\n <div id=\"TimePickerContent\" className={cx(styles.container, className)}>\n <div className={styles.body}>\n {(!isFullscreen || !hideQuickRanges) && (\n <div className={styles.rightSide}>\n <div className={styles.timeRangeFilter}>\n <FilterInput\n width={0}\n value={searchTerm}\n onChange={setSearchQuery}\n placeholder={t('time-picker.content.filter-placeholder', 'Search quick ranges')}\n />\n </div>\n <div className={styles.scrollContent}>\n {!isFullscreen && <NarrowScreenForm {...props} historyOptions={historyOptions} />}\n {!hideQuickRanges && (\n <TimeRangeList options={filteredQuickOptions} onChange={onChangeTimeOption} value={timeOption} />\n )}\n </div>\n </div>\n )}\n {isFullscreen && (\n <div className={styles.leftSide}>\n <FullScreenForm {...props} historyOptions={historyOptions} />\n </div>\n )}\n </div>\n {!hideTimeZone && isFullscreen && (\n <TimePickerFooter\n timeZone={timeZone}\n fiscalYearStartMonth={fiscalYearStartMonth}\n onChangeTimeZone={onChangeTimeZone}\n onChangeFiscalYearStartMonth={onChangeFiscalYearStartMonth}\n />\n )}\n </div>\n );\n};\n\nexport const TimePickerContent = (props: Props) => {\n const { widthOverride } = props;\n const theme = useTheme2();\n const isFullscreen = (widthOverride || window.innerWidth) >= theme.breakpoints.values.lg;\n return <TimePickerContentWithScreenSize {...props} isFullscreen={isFullscreen} />;\n};\n\nconst NarrowScreenForm = (props: FormProps) => {\n const { value, hideQuickRanges, onChange, timeZone, historyOptions = [], showHistory, onError, weekStart } = props;\n const styles = useStyles2(getNarrowScreenStyles);\n const isAbsolute = isDateTime(value.raw.from) || isDateTime(value.raw.to);\n const [collapsedFlag, setCollapsedFlag] = useState(!isAbsolute);\n const collapsed = hideQuickRanges ? false : collapsedFlag;\n\n const onChangeTimeOption = (timeOption: TimeOption) => {\n return onChange(mapOptionToTimeRange(timeOption, timeZone));\n };\n\n return (\n <fieldset>\n <div className={styles.header}>\n <button\n type={'button'}\n className={styles.expandButton}\n onClick={() => {\n if (!hideQuickRanges) {\n setCollapsedFlag(!collapsed);\n }\n }}\n data-testid={selectors.components.TimePicker.absoluteTimeRangeTitle}\n aria-expanded={!collapsed}\n aria-controls=\"expanded-timerange\"\n >\n <TimePickerTitle>\n <Trans i18nKey=\"time-picker.absolute.title\">Absolute time range</Trans>\n </TimePickerTitle>\n {!hideQuickRanges && <Icon name={!collapsed ? 'angle-up' : 'angle-down'} />}\n </button>\n </div>\n {!collapsed && (\n <div className={styles.body} id=\"expanded-timerange\">\n <div className={styles.form}>\n <TimeRangeContent\n value={value}\n onApply={onChange}\n timeZone={timeZone}\n isFullscreen={false}\n onError={onError}\n weekStart={weekStart}\n />\n </div>\n {showHistory && (\n <TimeRangeList\n title={t('time-picker.absolute.recent-title', 'Recently used absolute ranges')}\n options={historyOptions}\n onChange={onChangeTimeOption}\n placeholderEmpty={null}\n />\n )}\n </div>\n )}\n </fieldset>\n );\n};\n\nconst FullScreenForm = (props: FormProps) => {\n const { onChange, value, timeZone, fiscalYearStartMonth, isReversed, historyOptions, onError, weekStart } = props;\n const styles = useStyles2(getFullScreenStyles, props.hideQuickRanges);\n const onChangeTimeOption = (timeOption: TimeOption) => {\n return onChange(mapOptionToTimeRange(timeOption, timeZone));\n };\n\n return (\n <>\n <div className={styles.container}>\n <div className={styles.title} data-testid={selectors.components.TimePicker.absoluteTimeRangeTitle}>\n <TimePickerTitle>\n <Trans i18nKey=\"time-picker.absolute.title\">Absolute time range</Trans>\n </TimePickerTitle>\n </div>\n <TimeRangeContent\n value={value}\n timeZone={timeZone}\n fiscalYearStartMonth={fiscalYearStartMonth}\n onApply={onChange}\n isFullscreen={true}\n isReversed={isReversed}\n onError={onError}\n weekStart={weekStart}\n />\n </div>\n {props.showHistory && (\n <div className={styles.recent}>\n <TimeRangeList\n title={t('time-picker.absolute.recent-title', 'Recently used absolute ranges')}\n options={historyOptions || []}\n onChange={onChangeTimeOption}\n placeholderEmpty={<EmptyRecentList />}\n />\n </div>\n )}\n </>\n );\n};\n\nconst EmptyRecentList = memo(() => {\n const styles = useStyles2(getEmptyListStyles);\n const emptyRecentListText = t(\n 'time-picker.content.empty-recent-list-info',\n \"It looks like you haven't used this time picker before. As soon as you enter some time intervals, recently used intervals will appear here.\"\n );\n\n return (\n <div className={styles.container}>\n <div>\n <span>{emptyRecentListText}</span>\n </div>\n <Trans i18nKey=\"time-picker.content.empty-recent-list-docs\">\n <div>\n <a\n className={styles.link}\n href=\"https://grafana.com/docs/grafana/latest/dashboards/time-range-controls\"\n target=\"_new\"\n >\n Read the documentation\n </a>\n <span> to find out more about how to enter custom time ranges.</span>\n </div>\n </Trans>\n </div>\n );\n});\n\nfunction mapToHistoryOptions(ranges?: TimeRange[], timeZone?: TimeZone): TimeOption[] {\n if (!Array.isArray(ranges) || ranges.length === 0) {\n return [];\n }\n\n return ranges.map((range) => mapRangeToTimeOption(range, timeZone));\n}\n\nEmptyRecentList.displayName = 'EmptyRecentList';\n\nconst useTimeOption = (raw: RawTimeRange, quickOptions: TimeOption[]): TimeOption | undefined => {\n return useMemo(() => {\n if (!rangeUtil.isRelativeTimeRange(raw)) {\n return;\n }\n return quickOptions.find((option) => {\n return option.from === raw.from && option.to === raw.to;\n });\n }, [raw, quickOptions]);\n};\n\nconst getStyles = (\n theme: GrafanaTheme2,\n isReversed?: boolean,\n hideQuickRanges?: boolean,\n isContainerTall?: boolean,\n isFullscreen?: boolean\n) => ({\n container: css({\n background: theme.colors.background.elevated,\n boxShadow: theme.shadows.z3,\n width: `${isFullscreen ? '546px' : '262px'}`,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n [`${isReversed ? 'left' : 'right'}`]: 0,\n display: 'flex',\n flexDirection: 'column',\n }),\n body: css({\n display: 'flex',\n flexDirection: 'row-reverse',\n height: `${isContainerTall ? '381px' : '217px'}`,\n maxHeight: '100vh',\n }),\n leftSide: css({\n display: 'flex',\n flexDirection: 'column',\n borderRight: `${isReversed ? 'none' : `1px solid ${theme.colors.border.weak}`}`,\n width: `${!hideQuickRanges ? '60%' : '100%'}`,\n overflow: 'auto',\n scrollbarWidth: 'thin',\n order: isReversed ? 1 : 0,\n }),\n rightSide: css({\n width: `${isFullscreen ? '40%' : '100%'}; !important`,\n borderRight: isReversed ? `1px solid ${theme.colors.border.weak}` : 'none',\n display: 'flex',\n flexDirection: 'column',\n }),\n timeRangeFilter: css({\n padding: theme.spacing(1),\n }),\n spacing: css({\n marginTop: '16px',\n }),\n scrollContent: css({\n overflowY: 'auto',\n scrollbarWidth: 'thin',\n }),\n});\n\nconst getNarrowScreenStyles = (theme: GrafanaTheme2) => ({\n header: css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n padding: '7px 9px 7px 9px',\n }),\n expandButton: css({\n backgroundColor: 'transparent',\n border: 'none',\n display: 'flex',\n width: '100%',\n\n '&:focus-visible': getFocusStyles(theme),\n }),\n body: css({\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n }),\n form: css({\n padding: '7px 9px 7px 9px',\n }),\n});\n\nconst getFullScreenStyles = (theme: GrafanaTheme2, hideQuickRanges?: boolean) => ({\n container: css({\n paddingTop: '9px',\n paddingLeft: '11px',\n paddingRight: !hideQuickRanges ? '20%' : '11px',\n }),\n title: css({\n marginBottom: '11px',\n }),\n recent: css({\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'flex-end',\n paddingTop: theme.spacing(1),\n }),\n});\n\nconst getEmptyListStyles = (theme: GrafanaTheme2) => ({\n container: css({\n padding: '12px',\n margin: '12px',\n\n 'a, span': {\n fontSize: '13px',\n },\n }),\n link: css({\n color: theme.colors.text.link,\n }),\n});\n"],"names":["timeOption"],"mappings":"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"}