inputField.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import * as React from 'react';
  2. import Input, {InputProps} from 'sentry/components/forms/controls/input';
  3. import FormField, {FormFieldProps} from 'sentry/components/forms/formField';
  4. export interface InputFieldProps
  5. extends Omit<FormFieldProps, 'children'>,
  6. Omit<
  7. InputProps,
  8. | 'value'
  9. | 'placeholder'
  10. | 'disabled'
  11. | 'onBlur'
  12. | 'onKeyDown'
  13. | 'onChange'
  14. | 'children'
  15. | 'name'
  16. | 'defaultValue'
  17. > {
  18. // TODO(ts) Add base types for this. Each input field
  19. // has different props, but we could use have a base type that contains
  20. // the common properties.
  21. field?: (props) => React.ReactNode;
  22. value?: any;
  23. }
  24. export type onEvent = (value, event?: React.FormEvent<HTMLInputElement>) => void;
  25. function defaultField({
  26. onChange,
  27. onBlur,
  28. onKeyDown,
  29. ...rest
  30. }: {
  31. onBlur: onEvent;
  32. onChange: onEvent;
  33. onKeyDown: onEvent;
  34. }) {
  35. return (
  36. <Input
  37. onBlur={e => onBlur(e.target.value, e)}
  38. onKeyDown={e => onKeyDown((e.target as any).value, e)}
  39. onChange={e => onChange(e.target.value, e)}
  40. {...rest}
  41. />
  42. );
  43. }
  44. function InputField(props: InputFieldProps) {
  45. return (
  46. <FormField className={props.className} {...props}>
  47. {formFieldProps => {
  48. const {children: _children, ...otherFieldProps} = formFieldProps;
  49. return props.field ? props.field(otherFieldProps) : defaultField(otherFieldProps);
  50. }}
  51. </FormField>
  52. );
  53. }
  54. export default InputField;