index.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import * as React from 'react';
  2. import {withRouter, WithRouterProps} from 'react-router';
  3. import partition from 'lodash/partition';
  4. import ConfigStore from 'app/stores/configStore';
  5. import {Organization, Project} from 'app/types';
  6. import withOrganization from 'app/utils/withOrganization';
  7. import withProjects from 'app/utils/withProjects';
  8. import GlobalSelectionHeader from './globalSelectionHeader';
  9. import InitializeGlobalSelectionHeader from './initializeGlobalSelectionHeader';
  10. type GlobalSelectionHeaderProps = Omit<
  11. React.ComponentPropsWithoutRef<typeof GlobalSelectionHeader>,
  12. 'router' | 'nonMemberProjects' | 'memberProjects' | 'selection'
  13. >;
  14. type Props = {
  15. organization: Organization;
  16. projects: Project[];
  17. } & WithRouterProps &
  18. GlobalSelectionHeaderProps &
  19. Partial<
  20. Pick<React.ComponentProps<typeof InitializeGlobalSelectionHeader>, 'skipLoadLastUsed'>
  21. >;
  22. function GlobalSelectionHeaderContainer({
  23. organization,
  24. projects,
  25. loadingProjects,
  26. location,
  27. router,
  28. routes,
  29. defaultSelection,
  30. forceProject,
  31. shouldForceProject,
  32. skipLoadLastUsed,
  33. specificProjectSlugs,
  34. showAbsolute,
  35. ...props
  36. }: Props) {
  37. const {isSuperuser} = ConfigStore.get('user');
  38. const isOrgAdmin = organization.access.includes('org:admin');
  39. const specifiedProjects = specificProjectSlugs
  40. ? projects.filter(project => specificProjectSlugs.includes(project.slug))
  41. : projects;
  42. const [memberProjects, otherProjects] = partition(
  43. specifiedProjects,
  44. project => project.isMember
  45. );
  46. const nonMemberProjects = isSuperuser || isOrgAdmin ? otherProjects : [];
  47. const enforceSingleProject = !organization.features.includes('global-views');
  48. // We can initialize before ProjectsStore is fully loaded if we don't need to enforce single project.
  49. return (
  50. <React.Fragment>
  51. {(!loadingProjects || (!shouldForceProject && !enforceSingleProject)) && (
  52. <InitializeGlobalSelectionHeader
  53. location={location}
  54. skipLoadLastUsed={!!skipLoadLastUsed}
  55. router={router}
  56. organization={organization}
  57. defaultSelection={defaultSelection}
  58. forceProject={forceProject}
  59. shouldForceProject={!!shouldForceProject}
  60. shouldEnforceSingleProject={enforceSingleProject}
  61. memberProjects={memberProjects}
  62. showAbsolute={showAbsolute}
  63. />
  64. )}
  65. <GlobalSelectionHeader
  66. {...props}
  67. loadingProjects={loadingProjects}
  68. location={location}
  69. organization={organization}
  70. router={router}
  71. routes={routes}
  72. projects={projects}
  73. shouldForceProject={!!shouldForceProject}
  74. defaultSelection={defaultSelection}
  75. forceProject={forceProject}
  76. memberProjects={memberProjects}
  77. nonMemberProjects={nonMemberProjects}
  78. showAbsolute={showAbsolute}
  79. />
  80. </React.Fragment>
  81. );
  82. }
  83. export default withOrganization(withProjects(withRouter(GlobalSelectionHeaderContainer)));