@backstage/plugin-org 0.6.50-next.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +105 -0
- package/README.md +27 -3
- package/dist/alpha.d.ts +29 -32
- package/dist/alpha.esm.js +3 -2
- package/dist/alpha.esm.js.map +1 -1
- package/dist/components/Cards/Group/GroupProfile/GroupProfileCard.esm.js +25 -18
- package/dist/components/Cards/Group/GroupProfile/GroupProfileCard.esm.js.map +1 -1
- package/dist/components/Cards/Group/MembersList/MembersListCard.esm.js +127 -142
- package/dist/components/Cards/Group/MembersList/MembersListCard.esm.js.map +1 -1
- package/dist/components/Cards/OwnershipCard/OwnershipCard.esm.js +25 -111
- package/dist/components/Cards/OwnershipCard/OwnershipCard.esm.js.map +1 -1
- package/dist/components/Cards/User/UserProfileCard/UserProfileCard.esm.js +49 -49
- package/dist/components/Cards/User/UserProfileCard/UserProfileCard.esm.js.map +1 -1
- package/dist/index.d.ts +33 -16
- package/dist/index.esm.js +1 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/package.json.esm.js +2 -1
- package/dist/package.json.esm.js.map +1 -1
- package/dist/translation.esm.js +5 -9
- package/dist/translation.esm.js.map +1 -1
- package/package.json +18 -17
|
@@ -1,104 +1,100 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { stringifyEntityRef, DEFAULT_NAMESPACE } from '@backstage/catalog-model';
|
|
3
|
-
import { useEntity, catalogApiRef,
|
|
4
|
-
import
|
|
5
|
-
import Grid from '@material-ui/core/Grid';
|
|
6
|
-
import Switch from '@material-ui/core/Switch';
|
|
7
|
-
import Typography from '@material-ui/core/Typography';
|
|
8
|
-
import { makeStyles, createStyles } from '@material-ui/core/styles';
|
|
9
|
-
import Pagination from '@material-ui/lab/Pagination';
|
|
3
|
+
import { useEntity, catalogApiRef, EntityInfoCard, useEntityRefLink } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import { makeStyles } from '@material-ui/core/styles';
|
|
10
5
|
import { useState, useEffect } from 'react';
|
|
11
6
|
import useAsync from 'react-use/esm/useAsync';
|
|
12
|
-
import { Progress, ResponseErrorPanel
|
|
7
|
+
import { Progress, ResponseErrorPanel } from '@backstage/core-components';
|
|
13
8
|
import { useApi } from '@backstage/core-plugin-api';
|
|
14
9
|
import { getAllDesendantMembersForGroupEntity, removeDuplicateEntitiesFrom } from '../../../../helpers/helpers.esm.js';
|
|
15
10
|
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
16
11
|
import { orgTranslationRef } from '../../../../translation.esm.js';
|
|
17
|
-
import
|
|
12
|
+
import { Box, Text, SearchField, Switch, Card, Avatar, Flex, Link, TablePagination } from '@backstage/ui';
|
|
18
13
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
14
|
+
const useMemberStyles = makeStyles({
|
|
15
|
+
card: {
|
|
16
|
+
display: "flex",
|
|
17
|
+
gap: "var(--bui-space-3)",
|
|
18
|
+
padding: "var(--bui-space-3)",
|
|
19
|
+
alignItems: "flex-start",
|
|
20
|
+
flexDirection: "row",
|
|
21
|
+
height: 140,
|
|
22
|
+
overflow: "hidden"
|
|
23
|
+
},
|
|
24
|
+
avatar: {
|
|
25
|
+
flexShrink: 0
|
|
26
|
+
},
|
|
27
|
+
cardTextContainer: {
|
|
28
|
+
overflow: "hidden"
|
|
29
|
+
},
|
|
30
|
+
singlelineEllipsis: {
|
|
31
|
+
overflow: "hidden",
|
|
32
|
+
textOverflow: "ellipsis",
|
|
33
|
+
whiteSpace: "nowrap"
|
|
34
|
+
},
|
|
35
|
+
multilineEllipsis: {
|
|
36
|
+
display: "-webkit-box",
|
|
37
|
+
"-webkit-line-clamp": "3",
|
|
38
|
+
"-webkit-box-orient": "vertical",
|
|
39
|
+
overflow: "hidden"
|
|
40
|
+
}
|
|
41
|
+
});
|
|
38
42
|
const MemberComponent = (props) => {
|
|
39
|
-
const
|
|
43
|
+
const { t } = useTranslationRef(orgTranslationRef);
|
|
44
|
+
const classes = useMemberStyles();
|
|
40
45
|
const {
|
|
41
46
|
metadata: { name: metaName, description },
|
|
42
47
|
spec: { profile }
|
|
43
48
|
} = props.member;
|
|
44
49
|
const displayName = profile?.displayName ?? metaName;
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
const entityLink = useEntityRefLink();
|
|
51
|
+
return /* @__PURE__ */ jsxs(
|
|
52
|
+
Card,
|
|
47
53
|
{
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
alignItems: "center",
|
|
52
|
-
justifyContent: "center",
|
|
54
|
+
className: classes.card,
|
|
55
|
+
href: entityLink(props.member),
|
|
56
|
+
label: t("membersListCard.cardLabel", { memberName: displayName }),
|
|
53
57
|
children: [
|
|
54
58
|
/* @__PURE__ */ jsx(
|
|
55
59
|
Avatar,
|
|
56
60
|
{
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
className: classes.avatar,
|
|
62
|
+
name: displayName,
|
|
63
|
+
src: profile?.picture ?? "",
|
|
64
|
+
purpose: "decoration",
|
|
65
|
+
size: "x-large"
|
|
60
66
|
}
|
|
61
67
|
),
|
|
62
|
-
/* @__PURE__ */ jsxs(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"data-testid": "user-link",
|
|
75
|
-
entityRef: props.member,
|
|
76
|
-
title: displayName
|
|
77
|
-
}
|
|
78
|
-
) }),
|
|
79
|
-
profile?.email && /* @__PURE__ */ jsx(Link, { to: `mailto:${profile.email}`, children: /* @__PURE__ */ jsx(OverflowTooltip, { text: profile.email }) }),
|
|
80
|
-
description && /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", children: /* @__PURE__ */ jsx(OverflowTooltip, { text: description, line: 5 }) })
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
)
|
|
68
|
+
/* @__PURE__ */ jsxs(Flex, { className: classes.cardTextContainer, direction: "column", gap: "1", children: [
|
|
69
|
+
/* @__PURE__ */ jsx(Text, { variant: "body-large", as: "h4", children: displayName }),
|
|
70
|
+
profile?.email && /* @__PURE__ */ jsx(
|
|
71
|
+
Link,
|
|
72
|
+
{
|
|
73
|
+
className: classes.singlelineEllipsis,
|
|
74
|
+
href: `mailto:${profile.email}`,
|
|
75
|
+
children: profile.email
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
description && /* @__PURE__ */ jsx(Text, { className: classes.multilineEllipsis, children: description })
|
|
79
|
+
] })
|
|
84
80
|
]
|
|
85
81
|
}
|
|
86
|
-
)
|
|
82
|
+
);
|
|
87
83
|
};
|
|
88
84
|
const useListStyles = makeStyles(
|
|
89
|
-
(
|
|
90
|
-
root: {
|
|
91
|
-
height: "100%"
|
|
92
|
-
},
|
|
93
|
-
cardContent: {
|
|
94
|
-
overflow: "auto"
|
|
95
|
-
},
|
|
85
|
+
() => ({
|
|
96
86
|
memberList: {
|
|
97
87
|
display: "grid",
|
|
98
|
-
gap:
|
|
99
|
-
gridTemplateColumns: `repeat(auto-fit, minmax(
|
|
100
|
-
|
|
101
|
-
|
|
88
|
+
gap: "var(--bui-space-3)",
|
|
89
|
+
gridTemplateColumns: `repeat(auto-fit, minmax(275px, 1fr))`,
|
|
90
|
+
gridAutoRows: "1fr",
|
|
91
|
+
margin: 0,
|
|
92
|
+
padding: 0,
|
|
93
|
+
paddingTop: "var(--bui-space-3)",
|
|
94
|
+
listStyle: "none"
|
|
95
|
+
},
|
|
96
|
+
memberListItem: {
|
|
97
|
+
display: "contents"
|
|
102
98
|
}
|
|
103
99
|
}),
|
|
104
100
|
{ name: "PluginOrgMembersListCardComponent" }
|
|
@@ -106,7 +102,7 @@ const useListStyles = makeStyles(
|
|
|
106
102
|
const MembersListCard = (props) => {
|
|
107
103
|
const { t } = useTranslationRef(orgTranslationRef);
|
|
108
104
|
const {
|
|
109
|
-
memberDisplayTitle
|
|
105
|
+
memberDisplayTitle,
|
|
110
106
|
pageSize = 50,
|
|
111
107
|
showAggregateMembersToggle,
|
|
112
108
|
relationType = "memberof"
|
|
@@ -120,18 +116,16 @@ const MembersListCard = (props) => {
|
|
|
120
116
|
} = groupEntity;
|
|
121
117
|
const catalogApi = useApi(catalogApiRef);
|
|
122
118
|
const displayName = profile?.displayName ?? groupName;
|
|
119
|
+
const cardTitle = memberDisplayTitle ?? t("membersListCard.title", { groupName: displayName });
|
|
123
120
|
const groupNamespace = grpNamespace || DEFAULT_NAMESPACE;
|
|
124
|
-
const [
|
|
125
|
-
const pageChange = (_, pageIndex) => {
|
|
126
|
-
setPage(pageIndex);
|
|
127
|
-
};
|
|
121
|
+
const [offset, setOffset] = useState(0);
|
|
128
122
|
const [showAggregateMembers, setShowAggregateMembers] = useState(
|
|
129
123
|
relationAggregation === "aggregated"
|
|
130
124
|
);
|
|
131
125
|
const [searchTerm, setSearchTerm] = useState("");
|
|
132
126
|
useEffect(() => {
|
|
133
|
-
|
|
134
|
-
}, [searchTerm]);
|
|
127
|
+
setOffset(0);
|
|
128
|
+
}, [searchTerm, showAggregateMembers]);
|
|
135
129
|
const { loading: loadingDescendantMembers, value: descendantMembers } = useAsync(async () => {
|
|
136
130
|
if (!showAggregateMembers) {
|
|
137
131
|
return [];
|
|
@@ -174,21 +168,6 @@ const MembersListCard = (props) => {
|
|
|
174
168
|
} else if (error) {
|
|
175
169
|
return /* @__PURE__ */ jsx(ResponseErrorPanel, { error });
|
|
176
170
|
}
|
|
177
|
-
const nbPages = Math.ceil((members?.length || 0) / pageSize);
|
|
178
|
-
const paginationLabel = nbPages < 2 ? "" : t("membersListCard.paginationLabel", {
|
|
179
|
-
page: String(page),
|
|
180
|
-
nbPages: String(nbPages)
|
|
181
|
-
});
|
|
182
|
-
const pagination = /* @__PURE__ */ jsx(
|
|
183
|
-
Pagination,
|
|
184
|
-
{
|
|
185
|
-
count: nbPages,
|
|
186
|
-
page,
|
|
187
|
-
onChange: pageChange,
|
|
188
|
-
showFirstButton: true,
|
|
189
|
-
showLastButton: true
|
|
190
|
-
}
|
|
191
|
-
);
|
|
192
171
|
const filteredMembers = members.filter((member) => {
|
|
193
172
|
const fields = [
|
|
194
173
|
member.metadata.name,
|
|
@@ -201,58 +180,64 @@ const MembersListCard = (props) => {
|
|
|
201
180
|
);
|
|
202
181
|
});
|
|
203
182
|
const membersToRender = searchTerm ? filteredMembers : members;
|
|
183
|
+
const totalCount = membersToRender.length;
|
|
184
|
+
const hasNextPage = offset + pageSize < totalCount;
|
|
185
|
+
const hasPreviousPage = offset > 0;
|
|
186
|
+
const pagination = totalCount > pageSize ? /* @__PURE__ */ jsx(
|
|
187
|
+
TablePagination,
|
|
188
|
+
{
|
|
189
|
+
showPageSizeOptions: false,
|
|
190
|
+
pageSizeOptions: [pageSize],
|
|
191
|
+
pageSize,
|
|
192
|
+
offset,
|
|
193
|
+
totalCount,
|
|
194
|
+
hasNextPage,
|
|
195
|
+
hasPreviousPage,
|
|
196
|
+
onNextPage: () => setOffset((prev) => prev + pageSize),
|
|
197
|
+
onPreviousPage: () => setOffset((prev) => Math.max(0, prev - pageSize))
|
|
198
|
+
}
|
|
199
|
+
) : void 0;
|
|
204
200
|
let memberList;
|
|
205
|
-
if (membersToRender
|
|
206
|
-
memberList = /* @__PURE__ */ jsx(
|
|
201
|
+
if (membersToRender.length > 0) {
|
|
202
|
+
memberList = /* @__PURE__ */ jsx("ul", { className: classes.memberList, children: membersToRender.slice(offset, offset + pageSize).map((member) => /* @__PURE__ */ jsx(
|
|
203
|
+
"li",
|
|
204
|
+
{
|
|
205
|
+
className: classes.memberListItem,
|
|
206
|
+
children: /* @__PURE__ */ jsx(MemberComponent, { member })
|
|
207
|
+
},
|
|
208
|
+
stringifyEntityRef(member)
|
|
209
|
+
)) });
|
|
207
210
|
} else {
|
|
208
|
-
memberList = /* @__PURE__ */ jsx(Box, { p: 2, children: /* @__PURE__ */ jsx(
|
|
211
|
+
memberList = /* @__PURE__ */ jsx(Box, { p: "2", children: /* @__PURE__ */ jsx(Text, { as: "p", children: searchTerm ? t("membersListCard.noSearchResult", { searchTerm }) : t("membersListCard.noMembersDescription") }) });
|
|
209
212
|
}
|
|
210
|
-
return /* @__PURE__ */ jsx(
|
|
211
|
-
|
|
213
|
+
return /* @__PURE__ */ jsx(
|
|
214
|
+
EntityInfoCard,
|
|
212
215
|
{
|
|
213
|
-
title: `${
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
),
|
|
238
|
-
t("membersListCard.aggregateMembersToggle.aggregatedMembers")
|
|
239
|
-
] }),
|
|
240
|
-
showAggregateMembers && loadingDescendantMembers ? /* @__PURE__ */ jsx(Progress, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
241
|
-
/* @__PURE__ */ jsx(
|
|
242
|
-
TextField,
|
|
243
|
-
{
|
|
244
|
-
fullWidth: true,
|
|
245
|
-
margin: "dense",
|
|
246
|
-
placeholder: "Search members...",
|
|
247
|
-
value: searchTerm,
|
|
248
|
-
onChange: (e) => setSearchTerm(e.target.value)
|
|
249
|
-
}
|
|
250
|
-
),
|
|
251
|
-
/* @__PURE__ */ jsx(Box, { sx: { mt: 2 }, children: memberList })
|
|
252
|
-
] })
|
|
253
|
-
]
|
|
216
|
+
title: `${cardTitle} (${filteredMembers.length} of ${members.length})`,
|
|
217
|
+
headerActions: showAggregateMembersToggle && /* @__PURE__ */ jsx(
|
|
218
|
+
Switch,
|
|
219
|
+
{
|
|
220
|
+
isSelected: showAggregateMembers,
|
|
221
|
+
onChange: setShowAggregateMembers,
|
|
222
|
+
label: t("membersListCard.aggregateMembersToggle.label")
|
|
223
|
+
}
|
|
224
|
+
),
|
|
225
|
+
footerActions: pagination,
|
|
226
|
+
children: showAggregateMembers && loadingDescendantMembers ? /* @__PURE__ */ jsx(Progress, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
227
|
+
/* @__PURE__ */ jsx(
|
|
228
|
+
SearchField,
|
|
229
|
+
{
|
|
230
|
+
"aria-label": "Search members",
|
|
231
|
+
placeholder: "Search members...",
|
|
232
|
+
value: searchTerm,
|
|
233
|
+
onChange: setSearchTerm,
|
|
234
|
+
onClear: () => setSearchTerm("")
|
|
235
|
+
}
|
|
236
|
+
),
|
|
237
|
+
memberList
|
|
238
|
+
] })
|
|
254
239
|
}
|
|
255
|
-
)
|
|
240
|
+
);
|
|
256
241
|
};
|
|
257
242
|
|
|
258
243
|
export { MembersListCard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MembersListCard.esm.js","sources":["../../../../../src/components/Cards/Group/MembersList/MembersListCard.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DEFAULT_NAMESPACE,\n GroupEntity,\n UserEntity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n catalogApiRef,\n useEntity,\n EntityRefLink,\n} from '@backstage/plugin-catalog-react';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Switch from '@material-ui/core/Switch';\nimport Typography from '@material-ui/core/Typography';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Pagination from '@material-ui/lab/Pagination';\nimport { useState, useEffect, ChangeEvent } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\n\nimport {\n Avatar,\n InfoCard,\n Progress,\n ResponseErrorPanel,\n Link,\n OverflowTooltip,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n getAllDesendantMembersForGroupEntity,\n removeDuplicateEntitiesFrom,\n} from '../../../../helpers/helpers';\nimport { EntityRelationAggregation } from '../../types';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { orgTranslationRef } from '../../../../translation';\nimport TextField from '@material-ui/core/TextField';\n\n/** @public */\nexport type MemberComponentClassKey = 'card' | 'avatar';\n\nconst useStyles = makeStyles(\n (theme: Theme) =>\n createStyles({\n card: {\n border: `1px solid ${theme.palette.divider}`,\n boxShadow: theme.shadows[2],\n borderRadius: '4px',\n overflow: 'visible',\n position: 'relative',\n margin: theme.spacing(4, 1, 1),\n flex: '1',\n minWidth: '0px',\n },\n avatar: {\n position: 'absolute',\n top: '-2rem',\n },\n }),\n { name: 'PluginOrgMemberComponent' },\n);\n\nconst MemberComponent = (props: { member: UserEntity }) => {\n const classes = useStyles();\n const {\n metadata: { name: metaName, description },\n spec: { profile },\n } = props.member;\n const displayName = profile?.displayName ?? metaName;\n\n return (\n <Box className={classes.card}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n m={3}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Avatar\n displayName={displayName}\n picture={profile?.picture}\n classes={classes}\n />\n <Box\n pt={2}\n sx={{\n width: '100%',\n }}\n textAlign=\"center\"\n >\n <Typography variant=\"h6\">\n <EntityRefLink\n data-testid=\"user-link\"\n entityRef={props.member}\n title={displayName}\n />\n </Typography>\n {profile?.email && (\n <Link to={`mailto:${profile.email}`}>\n <OverflowTooltip text={profile.email} />\n </Link>\n )}\n {description && (\n <Typography variant=\"subtitle2\">\n <OverflowTooltip text={description} line={5} />\n </Typography>\n )}\n </Box>\n </Box>\n </Box>\n );\n};\n\n/** @public */\nexport type MembersListCardClassKey = 'root' | 'cardContent' | 'memberList';\n\nconst useListStyles = makeStyles(\n theme => ({\n root: {\n height: '100%',\n },\n cardContent: {\n overflow: 'auto',\n },\n memberList: {\n display: 'grid',\n gap: theme.spacing(1.5),\n gridTemplateColumns: `repeat(auto-fit, minmax(auto, ${theme.spacing(\n 34,\n )}px))`,\n },\n }),\n { name: 'PluginOrgMembersListCardComponent' },\n);\n\n/** @public */\nexport const MembersListCard = (props: {\n memberDisplayTitle?: string;\n pageSize?: number;\n showAggregateMembersToggle?: boolean;\n relationType?: string;\n /** @deprecated Please use `relationAggregation` instead */\n relationsType?: EntityRelationAggregation;\n relationAggregation?: EntityRelationAggregation;\n}) => {\n const { t } = useTranslationRef(orgTranslationRef);\n const {\n memberDisplayTitle = t('membersListCard.title'),\n pageSize = 50,\n showAggregateMembersToggle,\n relationType = 'memberof',\n } = props;\n const relationAggregation =\n props.relationAggregation ?? props.relationsType ?? 'direct';\n const classes = useListStyles();\n\n const { entity: groupEntity } = useEntity<GroupEntity>();\n const {\n metadata: { name: groupName, namespace: grpNamespace },\n spec: { profile },\n } = groupEntity;\n const catalogApi = useApi(catalogApiRef);\n\n const displayName = profile?.displayName ?? groupName;\n\n const groupNamespace = grpNamespace || DEFAULT_NAMESPACE;\n\n const [page, setPage] = useState(1);\n const pageChange = (_: ChangeEvent<unknown>, pageIndex: number) => {\n setPage(pageIndex);\n };\n\n const [showAggregateMembers, setShowAggregateMembers] = useState(\n relationAggregation === 'aggregated',\n );\n\n const [searchTerm, setSearchTerm] = useState('');\n\n useEffect(() => {\n setPage(1);\n }, [searchTerm]);\n\n const { loading: loadingDescendantMembers, value: descendantMembers } =\n useAsync(async () => {\n if (!showAggregateMembers) {\n return [] as UserEntity[];\n }\n\n return await getAllDesendantMembersForGroupEntity(\n groupEntity,\n catalogApi,\n relationType,\n );\n }, [catalogApi, groupEntity, showAggregateMembers]);\n const {\n loading,\n error,\n value: directMembers,\n } = useAsync(async () => {\n const membersList = await catalogApi.getEntities({\n filter: {\n kind: 'User',\n [`relations.${relationType.toLocaleLowerCase('en-US')}`]: [\n stringifyEntityRef({\n kind: 'group',\n namespace: groupNamespace.toLocaleLowerCase('en-US'),\n name: groupName.toLocaleLowerCase('en-US'),\n }),\n ],\n },\n });\n\n return membersList.items as UserEntity[];\n }, [catalogApi, groupEntity]);\n\n const members = removeDuplicateEntitiesFrom(\n [\n ...(directMembers ?? []),\n ...(descendantMembers && showAggregateMembers ? descendantMembers : []),\n ].sort((a, b) =>\n stringifyEntityRef(a).localeCompare(stringifyEntityRef(b)),\n ),\n ) as UserEntity[];\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n const nbPages = Math.ceil((members?.length || 0) / pageSize);\n const paginationLabel =\n nbPages < 2\n ? ''\n : t('membersListCard.paginationLabel', {\n page: String(page),\n nbPages: String(nbPages),\n });\n\n const pagination = (\n <Pagination\n count={nbPages}\n page={page}\n onChange={pageChange}\n showFirstButton\n showLastButton\n />\n );\n\n const filteredMembers = members.filter(member => {\n const fields = [\n member.metadata.name,\n member.metadata.title,\n member.spec?.profile?.displayName,\n member.spec?.profile?.email,\n ];\n return fields.some(val =>\n val\n ?.toLocaleLowerCase('en-US')\n .includes(searchTerm.toLocaleLowerCase('en-US')),\n );\n });\n\n const membersToRender = searchTerm ? filteredMembers : members;\n\n let memberList: JSX.Element;\n if (membersToRender && membersToRender.length > 0) {\n memberList = (\n <Box className={classes.memberList}>\n {membersToRender\n .slice(pageSize * (page - 1), pageSize * page)\n .map(member => (\n <MemberComponent member={member} key={stringifyEntityRef(member)} />\n ))}\n </Box>\n );\n } else {\n memberList = (\n <Box p={2}>\n <Typography>{t('membersListCard.noMembersDescription')}</Typography>\n </Box>\n );\n }\n\n return (\n <Grid item className={classes.root}>\n <InfoCard\n title={`${memberDisplayTitle} (${filteredMembers.length} of ${members.length}${paginationLabel})`}\n subheader={t('membersListCard.subtitle', {\n groupName: displayName,\n })}\n {...(nbPages <= 1 ? {} : { actions: pagination })}\n className={classes.root}\n cardClassName={classes.cardContent}\n >\n {showAggregateMembersToggle && (\n <>\n {t('membersListCard.aggregateMembersToggle.directMembers')}\n <Switch\n color=\"primary\"\n checked={showAggregateMembers}\n onChange={() => {\n setShowAggregateMembers(!showAggregateMembers);\n }}\n inputProps={{\n 'aria-label': t(\n 'membersListCard.aggregateMembersToggle.ariaLabel',\n ),\n }}\n />\n {t('membersListCard.aggregateMembersToggle.aggregatedMembers')}\n </>\n )}\n {showAggregateMembers && loadingDescendantMembers ? (\n <Progress />\n ) : (\n <>\n <TextField\n fullWidth\n margin=\"dense\"\n placeholder=\"Search members...\"\n value={searchTerm}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearchTerm(e.target.value)\n }\n />\n <Box sx={{ mt: 2 }}>{memberList}</Box>\n </>\n )}\n </InfoCard>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MembersListCard.esm.js","sources":["../../../../../src/components/Cards/Group/MembersList/MembersListCard.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DEFAULT_NAMESPACE,\n GroupEntity,\n UserEntity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n catalogApiRef,\n useEntity,\n EntityInfoCard,\n useEntityRefLink,\n} from '@backstage/plugin-catalog-react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useState, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\n\nimport { Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n getAllDesendantMembersForGroupEntity,\n removeDuplicateEntitiesFrom,\n} from '../../../../helpers/helpers';\nimport { EntityRelationAggregation } from '../../types';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { orgTranslationRef } from '../../../../translation';\nimport {\n Avatar,\n Box,\n Card,\n Flex,\n Link,\n SearchField,\n Switch,\n TablePagination,\n Text,\n} from '@backstage/ui';\n\nconst useMemberStyles = makeStyles({\n card: {\n display: 'flex',\n gap: 'var(--bui-space-3)',\n padding: 'var(--bui-space-3)',\n alignItems: 'flex-start',\n flexDirection: 'row',\n height: 140,\n overflow: 'hidden',\n },\n avatar: {\n flexShrink: 0,\n },\n cardTextContainer: {\n overflow: 'hidden',\n },\n singlelineEllipsis: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n multilineEllipsis: {\n display: '-webkit-box',\n '-webkit-line-clamp': '3',\n '-webkit-box-orient': 'vertical',\n overflow: 'hidden',\n },\n});\n\nconst MemberComponent = (props: { member: UserEntity }) => {\n const { t } = useTranslationRef(orgTranslationRef);\n const classes = useMemberStyles();\n const {\n metadata: { name: metaName, description },\n spec: { profile },\n } = props.member;\n const displayName = profile?.displayName ?? metaName;\n const entityLink = useEntityRefLink();\n\n return (\n <Card\n className={classes.card}\n href={entityLink(props.member)}\n label={t('membersListCard.cardLabel', { memberName: displayName })}\n >\n <Avatar\n className={classes.avatar}\n name={displayName}\n src={profile?.picture ?? ''}\n purpose=\"decoration\"\n size=\"x-large\"\n />\n <Flex className={classes.cardTextContainer} direction=\"column\" gap=\"1\">\n <Text variant=\"body-large\" as=\"h4\">\n {displayName}\n </Text>\n {profile?.email && (\n <Link\n className={classes.singlelineEllipsis}\n href={`mailto:${profile.email}`}\n >\n {profile.email}\n </Link>\n )}\n {description && (\n <Text className={classes.multilineEllipsis}>{description}</Text>\n )}\n </Flex>\n </Card>\n );\n};\n\n/** @public */\nexport type MembersListCardClassKey = 'memberList';\n\nconst useListStyles = makeStyles(\n () => ({\n memberList: {\n display: 'grid',\n gap: 'var(--bui-space-3)',\n gridTemplateColumns: `repeat(auto-fit, minmax(275px, 1fr))`,\n gridAutoRows: '1fr',\n margin: 0,\n padding: 0,\n paddingTop: 'var(--bui-space-3)',\n listStyle: 'none',\n },\n memberListItem: {\n display: 'contents',\n },\n }),\n { name: 'PluginOrgMembersListCardComponent' },\n);\n\n/** @public */\nexport const MembersListCard = (props: {\n memberDisplayTitle?: string;\n pageSize?: number;\n showAggregateMembersToggle?: boolean;\n relationType?: string;\n /** @deprecated Please use `relationAggregation` instead */\n relationsType?: EntityRelationAggregation;\n relationAggregation?: EntityRelationAggregation;\n}) => {\n const { t } = useTranslationRef(orgTranslationRef);\n const {\n memberDisplayTitle,\n pageSize = 50,\n showAggregateMembersToggle,\n relationType = 'memberof',\n } = props;\n const relationAggregation =\n props.relationAggregation ?? props.relationsType ?? 'direct';\n const classes = useListStyles();\n\n const { entity: groupEntity } = useEntity<GroupEntity>();\n const {\n metadata: { name: groupName, namespace: grpNamespace },\n spec: { profile },\n } = groupEntity;\n const catalogApi = useApi(catalogApiRef);\n\n const displayName = profile?.displayName ?? groupName;\n const cardTitle =\n memberDisplayTitle ??\n t('membersListCard.title', { groupName: displayName });\n\n const groupNamespace = grpNamespace || DEFAULT_NAMESPACE;\n\n const [offset, setOffset] = useState(0);\n\n const [showAggregateMembers, setShowAggregateMembers] = useState(\n relationAggregation === 'aggregated',\n );\n\n const [searchTerm, setSearchTerm] = useState('');\n\n useEffect(() => {\n setOffset(0);\n }, [searchTerm, showAggregateMembers]);\n\n const { loading: loadingDescendantMembers, value: descendantMembers } =\n useAsync(async () => {\n if (!showAggregateMembers) {\n return [] as UserEntity[];\n }\n\n return await getAllDesendantMembersForGroupEntity(\n groupEntity,\n catalogApi,\n relationType,\n );\n }, [catalogApi, groupEntity, showAggregateMembers]);\n const {\n loading,\n error,\n value: directMembers,\n } = useAsync(async () => {\n const membersList = await catalogApi.getEntities({\n filter: {\n kind: 'User',\n [`relations.${relationType.toLocaleLowerCase('en-US')}`]: [\n stringifyEntityRef({\n kind: 'group',\n namespace: groupNamespace.toLocaleLowerCase('en-US'),\n name: groupName.toLocaleLowerCase('en-US'),\n }),\n ],\n },\n });\n\n return membersList.items as UserEntity[];\n }, [catalogApi, groupEntity]);\n\n const members = removeDuplicateEntitiesFrom(\n [\n ...(directMembers ?? []),\n ...(descendantMembers && showAggregateMembers ? descendantMembers : []),\n ].sort((a, b) =>\n stringifyEntityRef(a).localeCompare(stringifyEntityRef(b)),\n ),\n ) as UserEntity[];\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n const filteredMembers = members.filter(member => {\n const fields = [\n member.metadata.name,\n member.metadata.title,\n member.spec?.profile?.displayName,\n member.spec?.profile?.email,\n ];\n return fields.some(val =>\n val\n ?.toLocaleLowerCase('en-US')\n .includes(searchTerm.toLocaleLowerCase('en-US')),\n );\n });\n\n const membersToRender = searchTerm ? filteredMembers : members;\n const totalCount = membersToRender.length;\n const hasNextPage = offset + pageSize < totalCount;\n const hasPreviousPage = offset > 0;\n\n const pagination =\n totalCount > pageSize ? (\n <TablePagination\n showPageSizeOptions={false}\n pageSizeOptions={[pageSize]}\n pageSize={pageSize}\n offset={offset}\n totalCount={totalCount}\n hasNextPage={hasNextPage}\n hasPreviousPage={hasPreviousPage}\n onNextPage={() => setOffset(prev => prev + pageSize)}\n onPreviousPage={() => setOffset(prev => Math.max(0, prev - pageSize))}\n />\n ) : undefined;\n\n let memberList: JSX.Element;\n if (membersToRender.length > 0) {\n memberList = (\n <ul className={classes.memberList}>\n {membersToRender.slice(offset, offset + pageSize).map(member => (\n <li\n className={classes.memberListItem}\n key={stringifyEntityRef(member)}\n >\n <MemberComponent member={member} />\n </li>\n ))}\n </ul>\n );\n } else {\n memberList = (\n <Box p=\"2\">\n <Text as=\"p\">\n {searchTerm\n ? t('membersListCard.noSearchResult', { searchTerm })\n : t('membersListCard.noMembersDescription')}\n </Text>\n </Box>\n );\n }\n\n return (\n <EntityInfoCard\n title={`${cardTitle} (${filteredMembers.length} of ${members.length})`}\n headerActions={\n showAggregateMembersToggle && (\n <Switch\n isSelected={showAggregateMembers}\n onChange={setShowAggregateMembers}\n label={t('membersListCard.aggregateMembersToggle.label')}\n />\n )\n }\n footerActions={pagination}\n >\n {showAggregateMembers && loadingDescendantMembers ? (\n <Progress />\n ) : (\n <>\n <SearchField\n aria-label=\"Search members\"\n placeholder=\"Search members...\"\n value={searchTerm}\n onChange={setSearchTerm}\n onClear={() => setSearchTerm('')}\n />\n {memberList}\n </>\n )}\n </EntityInfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,57 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import List from '@material-ui/core/List';
|
|
5
|
-
import ListItem from '@material-ui/core/ListItem';
|
|
6
|
-
import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';
|
|
7
|
-
import ListItemText from '@material-ui/core/ListItemText';
|
|
8
|
-
import Switch from '@material-ui/core/Switch';
|
|
9
|
-
import Tooltip from '@material-ui/core/Tooltip';
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useEntity, EntityInfoCard } from '@backstage/plugin-catalog-react';
|
|
3
|
+
import { Switch } from '@backstage/ui';
|
|
10
4
|
import { makeStyles, createStyles } from '@material-ui/core/styles';
|
|
11
5
|
import { useState, useEffect } from 'react';
|
|
12
6
|
import { ComponentsGrid } from './ComponentsGrid.esm.js';
|
|
13
7
|
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
14
8
|
import { orgTranslationRef } from '../../../translation.esm.js';
|
|
15
|
-
import Box from '@material-ui/core/Box';
|
|
16
9
|
|
|
17
10
|
const useStyles = makeStyles(
|
|
18
|
-
(
|
|
19
|
-
card: {
|
|
20
|
-
maxHeight: "100%"
|
|
21
|
-
},
|
|
22
|
-
cardContent: {
|
|
23
|
-
display: "flex",
|
|
24
|
-
flexDirection: "column",
|
|
25
|
-
overflow: "hidden"
|
|
26
|
-
},
|
|
27
|
-
list: {
|
|
28
|
-
[theme.breakpoints.down("xs")]: {
|
|
29
|
-
padding: `0 0 12px`
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
listItemText: {
|
|
33
|
-
[theme.breakpoints.down("xs")]: {
|
|
34
|
-
paddingRight: 0,
|
|
35
|
-
paddingLeft: 0
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
listItemSecondaryAction: {
|
|
39
|
-
[theme.breakpoints.down("xs")]: {
|
|
40
|
-
width: "100%",
|
|
41
|
-
top: "auto",
|
|
42
|
-
right: "auto",
|
|
43
|
-
position: "relative",
|
|
44
|
-
transform: "unset"
|
|
45
|
-
}
|
|
46
|
-
},
|
|
11
|
+
() => createStyles({
|
|
47
12
|
grid: {
|
|
48
13
|
overflowY: "auto",
|
|
49
14
|
marginTop: 0
|
|
50
|
-
},
|
|
51
|
-
box: {
|
|
52
|
-
overflowY: "auto",
|
|
53
|
-
padding: theme.spacing(0, 1, 1),
|
|
54
|
-
margin: theme.spacing(0, -1)
|
|
55
15
|
}
|
|
56
16
|
}),
|
|
57
17
|
{
|
|
@@ -59,16 +19,9 @@ const useStyles = makeStyles(
|
|
|
59
19
|
}
|
|
60
20
|
);
|
|
61
21
|
const OwnershipCard = (props) => {
|
|
62
|
-
const {
|
|
63
|
-
variant,
|
|
64
|
-
entityFilterKind,
|
|
65
|
-
hideRelationsToggle,
|
|
66
|
-
entityLimit = 6,
|
|
67
|
-
maxScrollHeight: propMaxScrollHeight
|
|
68
|
-
} = props;
|
|
22
|
+
const { entityFilterKind, hideRelationsToggle, entityLimit = 6 } = props;
|
|
69
23
|
const relationAggregation = props.relationAggregation ?? props.relationsType;
|
|
70
24
|
const relationsToggle = hideRelationsToggle === void 0 ? false : hideRelationsToggle;
|
|
71
|
-
const maxScrollHeight = variant !== "fullHeight" ? propMaxScrollHeight : void 0;
|
|
72
25
|
const classes = useStyles();
|
|
73
26
|
const { entity } = useEntity();
|
|
74
27
|
const { t } = useTranslationRef(orgTranslationRef);
|
|
@@ -81,67 +34,28 @@ const OwnershipCard = (props) => {
|
|
|
81
34
|
setRelationAggregation(defaultRelationAggregation);
|
|
82
35
|
}
|
|
83
36
|
}, [setRelationAggregation, defaultRelationAggregation, relationAggregation]);
|
|
84
|
-
return /* @__PURE__ */
|
|
85
|
-
|
|
37
|
+
return /* @__PURE__ */ jsx(
|
|
38
|
+
EntityInfoCard,
|
|
86
39
|
{
|
|
87
40
|
title: t("ownershipCard.title"),
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
"ownershipCard.aggregateRelationsToggle.directRelations"
|
|
107
|
-
) : t(
|
|
108
|
-
"ownershipCard.aggregateRelationsToggle.aggregatedRelations"
|
|
109
|
-
),
|
|
110
|
-
children: /* @__PURE__ */ jsx(
|
|
111
|
-
Switch,
|
|
112
|
-
{
|
|
113
|
-
color: "primary",
|
|
114
|
-
checked: getRelationAggregation !== "direct",
|
|
115
|
-
onChange: () => {
|
|
116
|
-
const updatedRelationAggregation = getRelationAggregation === "direct" ? "aggregated" : "direct";
|
|
117
|
-
setRelationAggregation(updatedRelationAggregation);
|
|
118
|
-
},
|
|
119
|
-
name: "pin",
|
|
120
|
-
inputProps: {
|
|
121
|
-
"aria-label": t(
|
|
122
|
-
"ownershipCard.aggregateRelationsToggle.ariaLabel"
|
|
123
|
-
)
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
)
|
|
127
|
-
}
|
|
128
|
-
),
|
|
129
|
-
t("ownershipCard.aggregateRelationsToggle.aggregatedRelations")
|
|
130
|
-
]
|
|
131
|
-
}
|
|
132
|
-
)
|
|
133
|
-
] }) }),
|
|
134
|
-
/* @__PURE__ */ jsx(Box, { maxHeight: maxScrollHeight, className: classes.box, children: /* @__PURE__ */ jsx(
|
|
135
|
-
ComponentsGrid,
|
|
136
|
-
{
|
|
137
|
-
className: classes.grid,
|
|
138
|
-
entity,
|
|
139
|
-
entityLimit,
|
|
140
|
-
relationAggregation: getRelationAggregation,
|
|
141
|
-
entityFilterKind
|
|
142
|
-
}
|
|
143
|
-
) })
|
|
144
|
-
]
|
|
41
|
+
headerActions: !relationsToggle && /* @__PURE__ */ jsx(
|
|
42
|
+
Switch,
|
|
43
|
+
{
|
|
44
|
+
isSelected: getRelationAggregation !== "direct",
|
|
45
|
+
onChange: (isSelected) => setRelationAggregation(isSelected ? "aggregated" : "direct"),
|
|
46
|
+
label: t("ownershipCard.aggregateRelationsToggle.label")
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
children: /* @__PURE__ */ jsx(
|
|
50
|
+
ComponentsGrid,
|
|
51
|
+
{
|
|
52
|
+
className: classes.grid,
|
|
53
|
+
entity,
|
|
54
|
+
entityLimit,
|
|
55
|
+
relationAggregation: getRelationAggregation,
|
|
56
|
+
entityFilterKind
|
|
57
|
+
}
|
|
58
|
+
)
|
|
145
59
|
}
|
|
146
60
|
);
|
|
147
61
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OwnershipCard.esm.js","sources":["../../../../src/components/Cards/OwnershipCard/OwnershipCard.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {
|
|
1
|
+
{"version":3,"file":"OwnershipCard.esm.js","sources":["../../../../src/components/Cards/OwnershipCard/OwnershipCard.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EntityInfoCard, useEntity } from '@backstage/plugin-catalog-react';\nimport { Switch } from '@backstage/ui';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport { useEffect, useState } from 'react';\nimport { ComponentsGrid } from './ComponentsGrid';\nimport { EntityRelationAggregation } from '../types';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { orgTranslationRef } from '../../../translation';\n\n/** @public */\nexport type OwnershipCardClassKey = 'grid';\n\nconst useStyles = makeStyles(\n () =>\n createStyles({\n grid: {\n overflowY: 'auto',\n marginTop: 0,\n },\n }),\n {\n name: 'PluginOrgOwnershipCard',\n },\n);\n\n/** @public */\nexport const OwnershipCard = (props: {\n entityFilterKind?: string[];\n hideRelationsToggle?: boolean;\n /** @deprecated Please use relationAggregation instead */\n relationsType?: EntityRelationAggregation;\n relationAggregation?: EntityRelationAggregation;\n entityLimit?: number;\n}) => {\n const { entityFilterKind, hideRelationsToggle, entityLimit = 6 } = props;\n const relationAggregation = props.relationAggregation ?? props.relationsType;\n const relationsToggle =\n hideRelationsToggle === undefined ? false : hideRelationsToggle;\n const classes = useStyles();\n const { entity } = useEntity();\n const { t } = useTranslationRef(orgTranslationRef);\n\n const defaultRelationAggregation =\n entity.kind === 'User' ? 'aggregated' : 'direct';\n const [getRelationAggregation, setRelationAggregation] = useState(\n relationAggregation ?? defaultRelationAggregation,\n );\n\n useEffect(() => {\n if (!relationAggregation) {\n setRelationAggregation(defaultRelationAggregation);\n }\n }, [setRelationAggregation, defaultRelationAggregation, relationAggregation]);\n\n return (\n <EntityInfoCard\n title={t('ownershipCard.title')}\n headerActions={\n !relationsToggle && (\n <Switch\n isSelected={getRelationAggregation !== 'direct'}\n onChange={isSelected =>\n setRelationAggregation(isSelected ? 'aggregated' : 'direct')\n }\n label={t('ownershipCard.aggregateRelationsToggle.label')}\n />\n )\n }\n >\n <ComponentsGrid\n className={classes.grid}\n entity={entity}\n entityLimit={entityLimit}\n relationAggregation={getRelationAggregation}\n entityFilterKind={entityFilterKind}\n />\n </EntityInfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AA4BA,MAAM,SAAA,GAAY,UAAA;AAAA,EAChB,MACE,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,MAAA;AAAA,MACX,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AAAA,EACH;AAAA,IACE,IAAA,EAAM;AAAA;AAEV,CAAA;AAGO,MAAM,aAAA,GAAgB,CAAC,KAAA,KAOxB;AACJ,EAAA,MAAM,EAAE,gBAAA,EAAkB,mBAAA,EAAqB,WAAA,GAAc,GAAE,GAAI,KAAA;AACnE,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,mBAAA,IAAuB,KAAA,CAAM,aAAA;AAC/D,EAAA,MAAM,eAAA,GACJ,mBAAA,KAAwB,MAAA,GAAY,KAAA,GAAQ,mBAAA;AAC9C,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,iBAAiB,CAAA;AAEjD,EAAA,MAAM,0BAAA,GACJ,MAAA,CAAO,IAAA,KAAS,MAAA,GAAS,YAAA,GAAe,QAAA;AAC1C,EAAA,MAAM,CAAC,sBAAA,EAAwB,sBAAsB,CAAA,GAAI,QAAA;AAAA,IACvD,mBAAA,IAAuB;AAAA,GACzB;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,sBAAA,CAAuB,0BAA0B,CAAA;AAAA,IACnD;AAAA,EACF,CAAA,EAAG,CAAC,sBAAA,EAAwB,0BAAA,EAA4B,mBAAmB,CAAC,CAAA;AAE5E,EAAA,uBACE,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,MAC9B,aAAA,EACE,CAAC,eAAA,oBACC,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAY,sBAAA,KAA2B,QAAA;AAAA,UACvC,QAAA,EAAU,CAAA,UAAA,KACR,sBAAA,CAAuB,UAAA,GAAa,eAAe,QAAQ,CAAA;AAAA,UAE7D,KAAA,EAAO,EAAE,8CAA8C;AAAA;AAAA,OACzD;AAAA,MAIJ,QAAA,kBAAA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,WAAW,OAAA,CAAQ,IAAA;AAAA,UACnB,MAAA;AAAA,UACA,WAAA;AAAA,UACA,mBAAA,EAAqB,sBAAA;AAAA,UACrB;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;;"}
|