• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

alkem-io / client-web / #9048

11 Oct 2024 01:42PM UTC coverage: 5.943%. First build
#9048

Pull #7022

travis-ci

Pull Request #7022: [v0.74.0] Roles API + Unauthenticated Explore page

202 of 10241 branches covered (1.97%)

Branch coverage included in aggregate %.

63 of 431 new or added lines in 60 files covered. (14.62%)

1468 of 17861 relevant lines covered (8.22%)

0.19 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/topLevelPages/myDashboard/myMemberships/ExpandableSpaceTree.tsx
1
import { useState } from 'react';
2

3
import { useTranslation } from 'react-i18next';
4
import { ParseKeys } from 'i18next';
5
import { Button } from '@mui/material';
6

7
import Avatar from '@/core/ui/avatar/Avatar';
8
import Gutters from '@/core/ui/grid/Gutters';
9
import GridItem from '@/core/ui/grid/GridItem';
10
import RouterLink from '@/core/ui/link/RouterLink';
11
import BadgeCardView from '@/core/ui/list/BadgeCardView';
12
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
13
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
14
import { Caption, BlockTitle, BlockSectionTitle } from '@/core/ui/typography';
15

16
import { gutters } from '@/core/ui/grid/utils';
17
import { useScreenSize } from '@/core/ui/grid/constants';
18
import { MembershipProps } from './MyMembershipsDialog.model';
19
import { useColumns } from '@/core/ui/grid/GridContext';
20
import webkitLineClamp from '@/core/ui/utils/webkitLineClamp';
21
import { SpaceLevel, RoleName, VisualType } from '@/core/apollo/generated/graphql-schema';
22

23
import { getDefaultSpaceVisualUrl } from '@/domain/space/icons/defaultVisualUrls';
24

25
const VISIBLE_COMMUNITY_ROLES = [RoleName.Admin, RoleName.Lead];
26

27
export const ExpandableSpaceTree = ({ membership }: { membership: MembershipProps }) => {
28
  const [isExpanded, setIsExpanded] = useState(false);
29

30
  const columns = useColumns();
31

32
  const { t } = useTranslation();
33

34
  const { isSmallScreen } = useScreenSize();
35

36
  const toggleExpanded = () => setIsExpanded(wasExpanded => !wasExpanded);
37

38
  const paddingLeftMap = {
39
    [SpaceLevel.L0]: 0,
40
    [SpaceLevel.L1]: 5,
41
    [SpaceLevel.L2]: 10,
42
  };
NEW
43
  const {
×
44
    childMemberships,
45
    space: {
×
46
      id,
47
      level,
48
      community,
×
49
      about: {
50
        profile: { url, tagline, cardBanner, displayName },
×
51
      },
52
    },
×
53
  } = membership;
54
  const avatar = cardBanner?.uri;
55
  const roles = community?.roleSet?.myRoles;
×
56
  const paddingLeft = paddingLeftMap[level] ?? 0;
57
  const verticalOffset = level === SpaceLevel.L0 ? 1 : 0.5;
×
58
  const communityRoles = roles?.filter(role => VISIBLE_COMMUNITY_ROLES.includes(role)).sort();
×
59

60
  return (
×
61
    <>
62
      <GridItem columns={columns}>
×
63
        <Gutters
64
          marginY={0}
×
65
          paddingRight={0}
66
          flexDirection="row"
×
67
          paddingLeft={paddingLeft}
68
          paddingY={gutters(verticalOffset)}
×
69
        >
×
70
          <BadgeCardView
71
            to={url}
72
            sx={{ flexGrow: 1 }}
×
73
            component={RouterLink}
74
            visual={
75
              <Avatar
76
                src={avatar || getDefaultSpaceVisualUrl(VisualType.Card, id)}
77
                alt={displayName ? t('common.avatar-of', { user: displayName }) : t('common.avatar')}
78
              >
79
                {displayName[0] ?? '?'}
80
              </Avatar>
81
            }
82
          >
83
            <BlockTitle sx={isSmallScreen ? webkitLineClamp(2) : undefined}>{displayName}</BlockTitle>
84

85
            {tagline ? (
×
86
              <BlockSectionTitle sx={isSmallScreen ? webkitLineClamp(2) : undefined}>{tagline}</BlockSectionTitle>
87
            ) : null}
88

89
            {isSmallScreen && (
90
              <Caption color="primary">
91
                {communityRoles?.map(role => t(`common.roles.${role}` as ParseKeys)).join(', ')}
92
              </Caption>
93
            )}
94
          </BadgeCardView>
95

96
          <Gutters flexDirection="row" disableGap padding={0}>
×
97
            {!isSmallScreen && (
×
98
              <Caption color="primary" display="flex" alignItems="center">
×
99
                {communityRoles?.map(role => t(`common.roles.${role}` as ParseKeys)).join(', ')}
100
              </Caption>
×
101
            )}
102

103
            <Button
104
              sx={{ visibility: childMemberships?.length ? 'visible' : 'hidden' }}
105
              endIcon={isExpanded ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
×
106
              onClick={toggleExpanded}
107
              aria-expanded={isExpanded}
×
108
              aria-label={isExpanded ? t('buttons.collapse') : t('buttons.expand')}
109
            />
110
          </Gutters>
111
        </Gutters>
112
      </GridItem>
×
113

×
114
      {isExpanded &&
×
115
        childMemberships?.map((childMembership: MembershipProps) => (
116
          <ExpandableSpaceTree key={childMembership.space.id} membership={childMembership} />
117
        ))}
118
    </>
119
  );
×
120
};
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc