builderBreadCrumbs.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import {browserHistory} from 'react-router';
  2. import styled from '@emotion/styled';
  3. import {Location} from 'history';
  4. import Breadcrumbs, {Crumb, CrumbDropdown} from 'app/components/breadcrumbs';
  5. import IdBadge from 'app/components/idBadge';
  6. import {t} from 'app/locale';
  7. import space from 'app/styles/space';
  8. import {Project} from 'app/types';
  9. import {isActiveSuperuser} from 'app/utils/isActiveSuperuser';
  10. import recreateRoute from 'app/utils/recreateRoute';
  11. import withProjects from 'app/utils/withProjects';
  12. import MenuItem from 'app/views/settings/components/settingsBreadcrumb/menuItem';
  13. import {RouteWithName} from 'app/views/settings/components/settingsBreadcrumb/types';
  14. type Props = {
  15. orgSlug: string;
  16. title: string;
  17. projectSlug: string;
  18. projects: Project[];
  19. routes: RouteWithName[];
  20. location: Location;
  21. alertName?: string;
  22. canChangeProject?: boolean;
  23. };
  24. function BuilderBreadCrumbs(props: Props) {
  25. const {
  26. orgSlug,
  27. title,
  28. alertName,
  29. projectSlug,
  30. projects,
  31. routes,
  32. canChangeProject,
  33. location,
  34. } = props;
  35. const project = projects.find(({slug}) => projectSlug === slug);
  36. const isSuperuser = isActiveSuperuser();
  37. const projectCrumbLink = {
  38. to: `/organizations/${orgSlug}/alerts/rules/?project=${project?.id}`,
  39. label: <IdBadge project={project} avatarSize={18} disableLink />,
  40. preserveGlobalSelection: true,
  41. };
  42. const projectCrumbDropdown = {
  43. onSelect: ({value}) => {
  44. browserHistory.push(
  45. recreateRoute('', {
  46. routes,
  47. params: {orgId: orgSlug, projectId: value},
  48. location,
  49. })
  50. );
  51. },
  52. label: <IdBadge project={project} avatarSize={18} disableLink />,
  53. items: projects
  54. .filter(proj => proj.isMember || isSuperuser)
  55. .map((proj, index) => ({
  56. index,
  57. value: proj.slug,
  58. label: (
  59. <MenuItem>
  60. <IdBadge
  61. project={proj}
  62. avatarProps={{consistentWidth: true}}
  63. avatarSize={18}
  64. disableLink
  65. />
  66. </MenuItem>
  67. ),
  68. searchKey: proj.slug,
  69. })),
  70. };
  71. const projectCrumb = canChangeProject ? projectCrumbDropdown : projectCrumbLink;
  72. const crumbs: (Crumb | CrumbDropdown)[] = [
  73. {
  74. to: `/organizations/${orgSlug}/alerts/rules/`,
  75. label: t('Alerts'),
  76. preserveGlobalSelection: true,
  77. },
  78. projectCrumb,
  79. {
  80. label: title,
  81. ...(alertName
  82. ? {
  83. to: `/organizations/${orgSlug}/alerts/${projectSlug}/wizard`,
  84. preserveGlobalSelection: true,
  85. }
  86. : {}),
  87. },
  88. ];
  89. if (alertName) {
  90. crumbs.push({label: alertName});
  91. }
  92. return <StyledBreadcrumbs crumbs={crumbs} />;
  93. }
  94. const StyledBreadcrumbs = styled(Breadcrumbs)`
  95. font-size: 18px;
  96. margin-bottom: ${space(3)};
  97. `;
  98. export default withProjects(BuilderBreadCrumbs);