new-project-button.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { useState } from 'react'
  2. import { Dropdown, MenuItem } from 'react-bootstrap'
  3. import { useTranslation } from 'react-i18next'
  4. import { ExposedSettings } from '../../../../../types/exposed-settings'
  5. import type { PortalTemplate } from '../../../../../types/portal-template'
  6. import ControlledDropdown from '../../../shared/components/controlled-dropdown'
  7. import getMeta from '../../../utils/meta'
  8. import NewProjectButtonModal, {
  9. NewProjectButtonModalVariant,
  10. } from './new-project-button/new-project-button-modal'
  11. import { Nullable } from '../../../../../types/utils'
  12. type NewProjectButtonProps = {
  13. id: string
  14. buttonText?: string
  15. className?: string
  16. }
  17. function NewProjectButton({
  18. id,
  19. buttonText,
  20. className,
  21. }: NewProjectButtonProps) {
  22. const { t } = useTranslation()
  23. const { templateLinks } = getMeta('ol-ExposedSettings') as ExposedSettings
  24. const [modal, setModal] =
  25. useState<Nullable<NewProjectButtonModalVariant>>(null)
  26. const portalTemplates = getMeta('ol-portalTemplates') as PortalTemplate[]
  27. return (
  28. <>
  29. <ControlledDropdown id={id} className={className}>
  30. <Dropdown.Toggle
  31. noCaret
  32. className="new-project-button"
  33. bsStyle="primary"
  34. >
  35. {buttonText || t('new_project')}
  36. </Dropdown.Toggle>
  37. <Dropdown.Menu>
  38. <MenuItem onClick={() => setModal('blank_project')}>
  39. {t('blank_project')}
  40. </MenuItem>
  41. <MenuItem onClick={() => setModal('example_project')}>
  42. {t('example_project')}
  43. </MenuItem>
  44. <MenuItem onClick={() => setModal('upload_project')}>
  45. {t('upload_project')}
  46. </MenuItem>
  47. <MenuItem onClick={() => setModal('import_from_github')}>
  48. {t('import_from_github')}
  49. </MenuItem>
  50. {portalTemplates?.length > 0 ? (
  51. <>
  52. <MenuItem divider />
  53. <MenuItem header>
  54. {`${t('institution')} ${t('templates')}`}
  55. </MenuItem>
  56. {portalTemplates.map((portalTemplate, index) => (
  57. <MenuItem
  58. key={`portal-template-${index}`}
  59. href={`${portalTemplate.url}#templates`}
  60. >
  61. {portalTemplate.name}
  62. </MenuItem>
  63. ))}
  64. </>
  65. ) : null}
  66. <MenuItem divider />
  67. <MenuItem header>{t('templates')}</MenuItem>
  68. {templateLinks.map((templateLink, index) => (
  69. <MenuItem
  70. key={`new-project-button-template-${index}`}
  71. href={templateLink.url}
  72. >
  73. {templateLink.name === 'view_all'
  74. ? t('view_all')
  75. : templateLink.name}
  76. </MenuItem>
  77. ))}
  78. </Dropdown.Menu>
  79. </ControlledDropdown>
  80. <NewProjectButtonModal modal={modal} onHide={() => setModal(null)} />
  81. </>
  82. )
  83. }
  84. export default NewProjectButton