sidebarOrgSummary.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import styled from '@emotion/styled';
  2. import OrganizationAvatar from 'sentry/components/avatar/organizationAvatar';
  3. import {IconWarning} from 'sentry/icons';
  4. import {tn} from 'sentry/locale';
  5. import {space} from 'sentry/styles/space';
  6. import type {OrganizationSummary} from 'sentry/types/organization';
  7. type Props = {
  8. organization: OrganizationSummary;
  9. className?: string;
  10. /**
  11. * Show the project count under the organization name.
  12. */
  13. projectCount?: number;
  14. };
  15. const SidebarOrgSummary = styled(({organization, projectCount, ...props}: Props) => (
  16. <div {...props}>
  17. {organization.status.id === 'pending_deletion' ? (
  18. <PendingDeletionAvatar data-test-id="pending-deletion-icon">
  19. <IconWarning size="sm" color="gray200" />
  20. </PendingDeletionAvatar>
  21. ) : (
  22. <OrganizationAvatar organization={organization} size={36} />
  23. )}
  24. <div>
  25. <Name pendingDeletion={organization.status.id === 'pending_deletion'}>
  26. {organization.name}
  27. </Name>
  28. {!!projectCount && (
  29. <ProjectCount>{tn('%s project', '%s projects', projectCount)}</ProjectCount>
  30. )}
  31. </div>
  32. </div>
  33. ))`
  34. display: grid;
  35. grid-template-columns: max-content minmax(0, 1fr);
  36. gap: ${space(1)};
  37. align-items: center;
  38. padding: ${space(1)} ${p => p.theme.sidebar.menuSpacing};
  39. `;
  40. const Name = styled('div')<{pendingDeletion: boolean}>`
  41. color: ${p => (p.pendingDeletion ? p.theme.subText : p.theme.textColor)};
  42. font-size: ${p => p.theme.fontSizeLarge};
  43. line-height: 1.1;
  44. font-weight: ${p => p.theme.fontWeightBold};
  45. ${p => p.theme.overflowEllipsis};
  46. `;
  47. const ProjectCount = styled('div')`
  48. color: ${p => p.theme.subText};
  49. font-size: ${p => p.theme.fontSizeMedium};
  50. line-height: 1;
  51. margin-top: ${space(0.5)};
  52. ${p => p.theme.overflowEllipsis};
  53. `;
  54. const PendingDeletionAvatar = styled('div')`
  55. height: 36px;
  56. width: 36px;
  57. display: flex;
  58. align-items: center;
  59. justify-content: center;
  60. border: 2px dashed ${p => p.theme.gray200};
  61. border-radius: 4px;
  62. `;
  63. export default SidebarOrgSummary;