UNPKG

@grafana/ui

Version:
1 lines • 21.9 kB
{"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 { TextLink } from '../../Link/TextLink';\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 <TextLink href=\"https://grafana.com/docs/grafana/latest/dashboards/time-range-controls\" external>\n Read the documentation\n </TextLink>\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});\n"],"names":["timeOption"],"mappings":"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"}