mirror of https://github.com/grafana/grafana
Chore: Replace `rc-time-picker` with `rc-picker` (#99022)
* replace rc-time-picker with rc-picker * remove unnecessary stack * remove TimePickerInput * make props stricter * fix type assertions * remove outdated comment * fix types * fix clear icon * fix styling * fix z-index and 6 tests * fix remaining unit tests * betterer results * styling tweaks * don't show/hide scrollbars on hoverpull/99042/head
parent
106af5d0ee
commit
cff07c9fb6
@ -1,43 +0,0 @@ |
|||||||
import { css } from '@emotion/react'; |
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data'; |
|
||||||
|
|
||||||
export function getRcTimePickerStyles(theme: GrafanaTheme2) { |
|
||||||
return css({ |
|
||||||
'.rc-time-picker-input,.rc-time-picker-panel-input-wrap,.rc-time-picker-panel-inner': { |
|
||||||
backgroundColor: theme.components.input.background, |
|
||||||
color: theme.colors.text.secondary, |
|
||||||
borderColor: theme.components.input.borderColor, |
|
||||||
fontSize: theme.typography.body.fontSize, |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-input': { |
|
||||||
padding: theme.spacing(0, 1), |
|
||||||
height: theme.spacing(4), |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-panel': { |
|
||||||
width: '176px', |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-panel-select': { |
|
||||||
width: '50%', |
|
||||||
|
|
||||||
'&:only-child': { |
|
||||||
width: '100%', |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-panel-select-option-selected': { |
|
||||||
backgroundColor: theme.colors.background.secondary, |
|
||||||
}, |
|
||||||
|
|
||||||
'li:hover': { |
|
||||||
backgroundColor: theme.colors.background.secondary, |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-panel-narrow': { |
|
||||||
maxWidth: 'none', |
|
||||||
}, |
|
||||||
}); |
|
||||||
} |
|
@ -1,185 +0,0 @@ |
|||||||
import { css, cx } from '@emotion/css'; |
|
||||||
import { Moment } from 'moment'; |
|
||||||
import TimePicker from 'rc-time-picker'; |
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data'; |
|
||||||
import { FormInputSize, Icon, useStyles2 } from '@grafana/ui'; |
|
||||||
import { inputSizes } from '@grafana/ui/src/components/Forms/commonStyles'; |
|
||||||
import { getFocusStyles } from '@grafana/ui/src/themes/mixins'; |
|
||||||
|
|
||||||
export interface Props { |
|
||||||
onChange: (value: Moment) => void; |
|
||||||
value?: Moment; |
|
||||||
defaultValue?: Moment; |
|
||||||
showHour?: boolean; |
|
||||||
showSeconds?: boolean; |
|
||||||
minuteStep?: number; |
|
||||||
size?: FormInputSize; |
|
||||||
disabled?: boolean; |
|
||||||
disabledHours?: () => number[]; |
|
||||||
disabledMinutes?: () => number[]; |
|
||||||
disabledSeconds?: () => number[]; |
|
||||||
placeholder?: string; |
|
||||||
format?: string; |
|
||||||
allowEmpty?: boolean; |
|
||||||
width?: number; |
|
||||||
} |
|
||||||
|
|
||||||
export const POPUP_CLASS_NAME = 'time-of-day-picker-panel'; |
|
||||||
|
|
||||||
// @TODO fix TimeOfDayPicker and switch?
|
|
||||||
export const TimePickerInput = ({ |
|
||||||
minuteStep = 1, |
|
||||||
showHour = true, |
|
||||||
showSeconds = false, |
|
||||||
onChange, |
|
||||||
value, |
|
||||||
size = 'auto', |
|
||||||
disabled, |
|
||||||
disabledHours, |
|
||||||
disabledMinutes, |
|
||||||
disabledSeconds, |
|
||||||
placeholder, |
|
||||||
format = 'HH:mm', |
|
||||||
defaultValue = undefined, |
|
||||||
allowEmpty = false, |
|
||||||
width, |
|
||||||
}: Props) => { |
|
||||||
const styles = useStyles2(getStyles); |
|
||||||
|
|
||||||
const getWidth = () => { |
|
||||||
if (width) { |
|
||||||
return css({ |
|
||||||
width: `${width}px`, |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
return inputSizes()[size]; |
|
||||||
}; |
|
||||||
|
|
||||||
return ( |
|
||||||
<TimePicker |
|
||||||
value={value} |
|
||||||
defaultValue={defaultValue} |
|
||||||
onChange={(v) => onChange(v)} |
|
||||||
showHour={showHour} |
|
||||||
showSecond={showSeconds} |
|
||||||
format={format} |
|
||||||
allowEmpty={allowEmpty} |
|
||||||
className={cx(getWidth(), styles.input)} |
|
||||||
popupClassName={cx(styles.picker, POPUP_CLASS_NAME)} |
|
||||||
minuteStep={minuteStep} |
|
||||||
inputIcon={<Caret wrapperStyle={styles.caretWrapper} />} |
|
||||||
disabled={disabled} |
|
||||||
disabledHours={disabledHours} |
|
||||||
disabledMinutes={disabledMinutes} |
|
||||||
disabledSeconds={disabledSeconds} |
|
||||||
placeholder={placeholder} |
|
||||||
/> |
|
||||||
); |
|
||||||
}; |
|
||||||
|
|
||||||
interface CaretProps { |
|
||||||
wrapperStyle?: string; |
|
||||||
} |
|
||||||
|
|
||||||
const Caret = ({ wrapperStyle = '' }: CaretProps) => { |
|
||||||
return ( |
|
||||||
<div className={wrapperStyle}> |
|
||||||
<Icon name="angle-down" /> |
|
||||||
</div> |
|
||||||
); |
|
||||||
}; |
|
||||||
|
|
||||||
const getStyles = (theme: GrafanaTheme2) => { |
|
||||||
const bgColor = theme.components.input.background; |
|
||||||
const menuShadowColor = theme.v1.palette.black; |
|
||||||
const optionBgHover = theme.colors.background.secondary; |
|
||||||
const borderRadius = theme.shape.radius.default; |
|
||||||
const borderColor = theme.components.input.borderColor; |
|
||||||
|
|
||||||
return { |
|
||||||
caretWrapper: css({ |
|
||||||
position: 'absolute', |
|
||||||
right: '8px', |
|
||||||
top: '50%', |
|
||||||
transform: 'translateY(-50%)', |
|
||||||
display: 'inline-block', |
|
||||||
textAlign: 'right', |
|
||||||
color: theme.colors.text.secondary, |
|
||||||
}), |
|
||||||
picker: css({ |
|
||||||
'.rc-time-picker-panel-select': { |
|
||||||
fontSize: '14px', |
|
||||||
backgroundColor: bgColor, |
|
||||||
borderColor: borderColor, |
|
||||||
li: { |
|
||||||
outlineWidth: '2px', |
|
||||||
'&.rc-time-picker-panel-select-option-selected': { |
|
||||||
backgroundColor: 'inherit', |
|
||||||
border: `1px solid ${theme.v1.palette.orange}`, |
|
||||||
borderRadius: borderRadius, |
|
||||||
}, |
|
||||||
|
|
||||||
'&:hover': { |
|
||||||
background: optionBgHover, |
|
||||||
}, |
|
||||||
|
|
||||||
'&.rc-time-picker-panel-select-option-disabled': { |
|
||||||
color: theme.colors.action.disabledText, |
|
||||||
}, |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-panel-inner': { |
|
||||||
boxShadow: `0px 4px 4px ${menuShadowColor}`, |
|
||||||
backgroundColor: bgColor, |
|
||||||
borderColor: borderColor, |
|
||||||
borderRadius: borderRadius, |
|
||||||
marginTop: '3px', |
|
||||||
|
|
||||||
'.rc-time-picker-panel-input-wrap': { |
|
||||||
marginRight: '2px', |
|
||||||
|
|
||||||
'&, .rc-time-picker-panel-input': { |
|
||||||
backgroundColor: bgColor, |
|
||||||
paddingTop: '2px', |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-panel-combobox': { |
|
||||||
display: 'flex', |
|
||||||
}, |
|
||||||
}, |
|
||||||
}), |
|
||||||
input: css({ |
|
||||||
'.rc-time-picker-input': { |
|
||||||
backgroundColor: bgColor, |
|
||||||
borderRadius: borderRadius, |
|
||||||
borderColor: borderColor, |
|
||||||
height: theme.spacing(4), |
|
||||||
|
|
||||||
'&:focus': getFocusStyles(theme), |
|
||||||
|
|
||||||
'&:disabled': { |
|
||||||
backgroundColor: theme.colors.action.disabledBackground, |
|
||||||
color: theme.colors.action.disabledText, |
|
||||||
border: `1px solid ${theme.colors.action.disabledBackground}`, |
|
||||||
'&:focus': { |
|
||||||
boxShadow: 'none', |
|
||||||
}, |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
'.rc-time-picker-clear': { |
|
||||||
position: 'absolute', |
|
||||||
right: '20px', |
|
||||||
top: '50%', |
|
||||||
cursor: 'pointer', |
|
||||||
overflow: 'hidden', |
|
||||||
transform: 'translateY(-50%)', |
|
||||||
color: theme.colors.text.secondary, |
|
||||||
}, |
|
||||||
}), |
|
||||||
}; |
|
||||||
}; |
|
Loading…
Reference in new issue