fieldFromConfig.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import {Scope} from 'sentry/types';
  2. import BlankField from './blankField';
  3. import BooleanField, {BooleanFieldProps} from './booleanField';
  4. import ChoiceMapperField, {ChoiceMapperFieldProps} from './choiceMapperField';
  5. import DateTimeField, {DateTimeFieldProps} from './dateTimeField';
  6. import EmailField, {EmailFieldProps} from './emailField';
  7. import {FieldProps} from './field';
  8. import FieldSeparator from './fieldSeparator';
  9. import FileField, {FileFieldProps} from './fileField';
  10. import HiddenField, {HiddenFieldProps} from './hiddenField';
  11. import InputField, {InputFieldProps} from './inputField';
  12. import NumberField from './numberField';
  13. import ProjectMapperField from './projectMapperField';
  14. import RadioField, {RadioFieldProps} from './radioField';
  15. import RangeField, {RangeFieldProps} from './rangeField';
  16. import SelectAsyncField, {SelectAsyncFieldProps} from './selectAsyncField';
  17. import SelectField, {SelectFieldProps} from './selectField';
  18. import SentryProjectSelectorField, {RenderFieldProps} from './sentryProjectSelectorField';
  19. import TableField from './tableField';
  20. import TextareaField, {TextareaFieldProps} from './textareaField';
  21. import TextField from './textField';
  22. import {Field} from './type';
  23. interface FieldFromConfigProps {
  24. field: Field;
  25. access?: Set<Scope>;
  26. disabled?: boolean | ((props) => boolean);
  27. flexibleControlStateSize?: boolean;
  28. getData?: (data) => any;
  29. highlighted?: boolean;
  30. inline?: boolean;
  31. noOptionsMessage?: () => string;
  32. onBlur?: (value, event) => void;
  33. stacked?: boolean;
  34. }
  35. function FieldFromConfig(props: FieldFromConfigProps): React.ReactElement | null {
  36. const {field, ...otherProps} = props;
  37. const componentProps = {
  38. ...otherProps,
  39. ...field,
  40. };
  41. switch (field.type) {
  42. case 'separator':
  43. return <FieldSeparator />;
  44. case 'secret':
  45. return <InputField {...(componentProps as InputFieldProps)} type="password" />;
  46. case 'range':
  47. return <RangeField {...(componentProps as RangeFieldProps)} />;
  48. case 'blank':
  49. return <BlankField {...(componentProps as FieldProps)} />;
  50. case 'bool':
  51. case 'boolean':
  52. return <BooleanField {...(componentProps as BooleanFieldProps)} />;
  53. case 'email':
  54. return <EmailField {...(componentProps as EmailFieldProps)} />;
  55. case 'hidden':
  56. return <HiddenField {...(componentProps as HiddenFieldProps)} />;
  57. case 'string':
  58. case 'text':
  59. case 'url':
  60. if (componentProps.multiline) {
  61. return <TextareaField {...(componentProps as TextareaFieldProps)} />;
  62. }
  63. return <TextField {...componentProps} />;
  64. case 'number':
  65. return <NumberField {...componentProps} />;
  66. case 'textarea':
  67. return <TextareaField {...(componentProps as TextareaFieldProps)} />;
  68. case 'choice':
  69. case 'select':
  70. case 'array':
  71. return <SelectField {...(componentProps as SelectFieldProps<any>)} />;
  72. case 'choice_mapper':
  73. return <ChoiceMapperField {...(componentProps as ChoiceMapperFieldProps)} />;
  74. case 'radio':
  75. if (Array.isArray(componentProps.choices)) {
  76. return <RadioField {...(componentProps as RadioFieldProps)} />;
  77. }
  78. throw new Error('Invalid `choices` type. Use an array of options');
  79. case 'table':
  80. return <TableField {...(componentProps as InputFieldProps)} />;
  81. case 'project_mapper':
  82. return <ProjectMapperField {...(componentProps as InputFieldProps)} />;
  83. case 'sentry_project_selector':
  84. return <SentryProjectSelectorField {...(componentProps as RenderFieldProps)} />;
  85. case 'select_async':
  86. return <SelectAsyncField {...(componentProps as SelectAsyncFieldProps)} />;
  87. case 'file':
  88. return <FileField {...(componentProps as FileFieldProps)} />;
  89. case 'datetime':
  90. return <DateTimeField {...(componentProps as DateTimeFieldProps)} />;
  91. case 'custom':
  92. return field.Component(field);
  93. default:
  94. return null;
  95. }
  96. }
  97. export default FieldFromConfig;