sentryProjectSelectorField.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {Component} from 'react';
  2. import SelectControl from 'sentry/components/forms/controls/selectControl';
  3. import FormField from 'sentry/components/forms/formField';
  4. import IdBadge from 'sentry/components/idBadge';
  5. import {t} from 'sentry/locale';
  6. import {Project} from 'sentry/types';
  7. // XXX(epurkhiser): This is wrong, it should not be inheriting these props
  8. import {InputFieldProps} from './inputField';
  9. const defaultProps = {
  10. avatarSize: 20,
  11. placeholder: t('Choose Sentry project'),
  12. };
  13. // projects can be passed as a direct prop as well
  14. export interface RenderFieldProps extends InputFieldProps {
  15. projects?: Project[];
  16. }
  17. interface RenderProps
  18. extends Omit<Partial<Readonly<typeof defaultProps>>, 'placeholder'>,
  19. RenderFieldProps {
  20. projects: Project[]; // can't use AvatarProject since we need the ID
  21. }
  22. class RenderField extends Component<RenderProps> {
  23. static defaultProps = defaultProps;
  24. // need to map the option object to the value
  25. handleChange = (
  26. onBlur: RenderFieldProps['onBlur'],
  27. onChange: RenderFieldProps['onChange'],
  28. optionObj: {value: any},
  29. event: React.MouseEvent
  30. ) => {
  31. const {value} = optionObj;
  32. onChange?.(value, event);
  33. onBlur?.(value, event);
  34. };
  35. render() {
  36. const {
  37. children: _children,
  38. projects,
  39. avatarSize,
  40. onChange,
  41. onBlur,
  42. ...rest
  43. } = this.props;
  44. const projectOptions = projects.map(project => ({
  45. value: project.id,
  46. label: project.slug,
  47. leadingItems: (
  48. <IdBadge
  49. project={project}
  50. avatarSize={avatarSize}
  51. avatarProps={{consistentWidth: true}}
  52. hideName
  53. />
  54. ),
  55. }));
  56. return (
  57. <SelectControl
  58. options={projectOptions}
  59. onChange={this.handleChange.bind(this, onBlur, onChange)}
  60. {...rest}
  61. />
  62. );
  63. }
  64. }
  65. const SentryProjectSelectorField = (props: RenderFieldProps) => (
  66. <FormField {...props}>{fieldProps => <RenderField {...fieldProps} />}</FormField>
  67. );
  68. export default SentryProjectSelectorField;