import { css, cx } from '@emotion/css'; import { isString } from 'lodash'; import React, { PropsWithChildren, RefCallback } from 'react'; import { GrafanaTheme2, SelectableValue, getTimeZoneInfo } from '@grafana/data'; import { useStyles2 } from '../../../themes'; import { Icon } from '../../Icon/Icon'; import { TimeZoneDescription } from './TimeZoneDescription'; import { TimeZoneOffset } from './TimeZoneOffset'; import { TimeZoneTitle } from './TimeZoneTitle'; interface Props { isFocused: boolean; isSelected: boolean; innerProps: JSX.IntrinsicElements['div']; innerRef: RefCallback; data: SelectableZone; } const offsetClassName = 'tz-utc-offset'; export interface SelectableZone extends SelectableValue { searchIndex: string; } export const WideTimeZoneOption = (props: PropsWithChildren) => { const { children, innerProps, innerRef, data, isSelected, isFocused } = props; const styles = useStyles2(getStyles); const timestamp = Date.now(); const containerStyles = cx(styles.container, isFocused && styles.containerFocused); if (!isString(data.value)) { return null; } const timeZoneInfo = getTimeZoneInfo(data.value, timestamp); return (
{isSelected && ( )}
); }; export const CompactTimeZoneOption = (props: React.PropsWithChildren) => { const { children, innerProps, innerRef, data, isSelected, isFocused } = props; const styles = useStyles2(getStyles); const timestamp = Date.now(); const containerStyles = cx(styles.container, isFocused && styles.containerFocused); if (!isString(data.value)) { return null; } const timeZoneInfo = getTimeZoneInfo(data.value, timestamp); return (
{isSelected && ( )}
); }; const getStyles = (theme: GrafanaTheme2) => ({ container: css({ display: 'flex', alignItems: 'center', flexDirection: 'row', flexShrink: 0, whiteSpace: 'nowrap', cursor: 'pointer', padding: '6px 8px 4px', '&:hover': { background: theme.colors.action.hover, }, }), containerFocused: css({ background: theme.colors.action.hover, }), body: css({ display: 'flex', fontWeight: theme.typography.fontWeightMedium, flexDirection: 'column', flexGrow: 1, }), row: css({ display: 'flex', flexDirection: 'row', }), leftColumn: css({ flexGrow: 1, textOverflow: 'ellipsis', }), rightColumn: css({ justifyContent: 'flex-end', alignItems: 'center', }), wideRow: css({ display: 'flex', flexDirection: 'row', alignItems: 'baseline', }), spacer: css({ marginLeft: '6px', }), });