settings-menu-select.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. export type Option = {
  2. value: string
  3. label: string
  4. ariaHidden?: 'true' | 'false'
  5. disabled?: boolean
  6. }
  7. export type Optgroup = {
  8. label: string
  9. options: Array<Option>
  10. }
  11. type SettingsMenuSelectProps = {
  12. label: string
  13. name: string
  14. options: Array<Option>
  15. optgroup?: Optgroup
  16. loading?: boolean
  17. }
  18. export default function SettingsMenuSelect({
  19. label,
  20. name,
  21. options,
  22. optgroup,
  23. loading,
  24. }: SettingsMenuSelectProps) {
  25. return (
  26. <div className="form-group left-menu-setting">
  27. <label htmlFor={name}>{label}</label>
  28. {loading ? (
  29. <p className="loading pull-right">
  30. <i className="fa fa-fw fa-spin fa-refresh" />
  31. </p>
  32. ) : (
  33. <select name={name} className="form-control">
  34. {options.map(option => (
  35. <option
  36. key={`${name}-${option.value}`}
  37. value={option.value}
  38. aria-hidden={option.ariaHidden}
  39. disabled={option.disabled}
  40. >
  41. {option.label}
  42. </option>
  43. ))}
  44. {optgroup ? (
  45. <optgroup label={optgroup.label}>
  46. {optgroup.options.map(option => (
  47. <option value={option.value} key={option.value}>
  48. {option.label}
  49. </option>
  50. ))}
  51. </optgroup>
  52. ) : null}
  53. </select>
  54. )}
  55. </div>
  56. )
  57. }