rangeField.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import RangeSlider from 'sentry/components/forms/controls/rangeSlider';
  2. import FormField from 'sentry/components/forms/formField';
  3. // XXX(epurkhiser): This is wrong, it should not be inheriting these props
  4. import {InputFieldProps, OnEvent} from './inputField';
  5. type DisabledFunction = (props: Omit<RangeFieldProps, 'formatMessageValue'>) => boolean;
  6. type PlaceholderFunction = (props: any) => React.ReactNode;
  7. export interface RangeFieldProps
  8. extends Omit<
  9. React.ComponentProps<typeof RangeSlider>,
  10. 'value' | 'disabled' | 'placeholder' | 'css'
  11. >,
  12. Omit<
  13. InputFieldProps,
  14. | 'disabled'
  15. | 'field'
  16. | 'step'
  17. | 'onChange'
  18. | 'max'
  19. | 'min'
  20. | 'onBlur'
  21. | 'css'
  22. | 'formatMessageValue'
  23. > {
  24. disabled?: boolean | DisabledFunction;
  25. formatMessageValue?: false | Function;
  26. placeholder?: string | PlaceholderFunction;
  27. }
  28. function onChange(
  29. fieldOnChange: OnEvent,
  30. value: number | '',
  31. e: React.FormEvent<HTMLInputElement>
  32. ) {
  33. fieldOnChange(value, e);
  34. }
  35. function defaultFormatMessageValue(value: number | '', {formatLabel}: RangeFieldProps) {
  36. return formatLabel?.(value) ?? value;
  37. }
  38. function RangeField({
  39. formatMessageValue = defaultFormatMessageValue,
  40. disabled,
  41. ...otherProps
  42. }: RangeFieldProps) {
  43. const resolvedDisabled =
  44. typeof disabled === 'function' ? disabled(otherProps) : disabled;
  45. const props: InputFieldProps = {
  46. ...otherProps,
  47. disabled: resolvedDisabled,
  48. formatMessageValue,
  49. };
  50. return (
  51. <FormField {...props}>
  52. {({children: _children, onChange: fieldOnChange, onBlur, value, ...fieldProps}) => (
  53. <RangeSlider
  54. {...fieldProps}
  55. value={value}
  56. onBlur={onBlur}
  57. onChange={(val, event) => onChange(fieldOnChange, val, event)}
  58. />
  59. )}
  60. </FormField>
  61. );
  62. }
  63. export default RangeField;