@backstage/plugin-org 0.3.26 → 0.3.30
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
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# @backstage/plugin-org
|
|
2
2
|
|
|
3
|
+
## 0.3.30
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- cd450844f6: Moved React dependencies to `peerDependencies` and allow both React v16 and v17 to be used.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/core-components@0.8.0
|
|
10
|
+
- @backstage/core-plugin-api@0.3.0
|
|
11
|
+
- @backstage/plugin-catalog-react@0.6.5
|
|
12
|
+
|
|
13
|
+
## 0.3.29
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 2f4a686411: Use email links in the catalog's members list instead of text to display a member's email
|
|
18
|
+
- Updated dependencies
|
|
19
|
+
- @backstage/core-plugin-api@0.2.1
|
|
20
|
+
- @backstage/core-components@0.7.5
|
|
21
|
+
|
|
22
|
+
## 0.3.28
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- Updated dependencies
|
|
27
|
+
- @backstage/catalog-model@0.9.7
|
|
28
|
+
- @backstage/plugin-catalog-react@0.6.4
|
|
29
|
+
- @backstage/core-components@0.7.4
|
|
30
|
+
- @backstage/core-plugin-api@0.2.0
|
|
31
|
+
|
|
32
|
+
## 0.3.27
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- Updated dependencies
|
|
37
|
+
- @backstage/plugin-catalog-react@0.6.0
|
|
38
|
+
- @backstage/core-components@0.7.0
|
|
39
|
+
- @backstage/theme@0.2.11
|
|
40
|
+
|
|
3
41
|
## 0.3.26
|
|
4
42
|
|
|
5
43
|
### Patch Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-63f79db1.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { createPlugin, createComponentExtension, useApi, useRouteRef } from '@backstage/core-plugin-api';
|
|
2
2
|
import { RELATION_MEMBER_OF, ENTITY_DEFAULT_NAMESPACE, RELATION_PARENT_OF, RELATION_CHILD_OF } from '@backstage/catalog-model';
|
|
3
3
|
import { useEntity, catalogApiRef, entityRouteParams, getEntityRelations, getEntityMetadataEditUrl, EntityRefLinks, catalogRouteRef, isOwnerOf, formatEntityRefTitle } from '@backstage/plugin-catalog-react';
|
|
4
|
-
import { makeStyles, createStyles, Grid, Box, Typography,
|
|
4
|
+
import { makeStyles, createStyles, Grid, Box, Typography, List, ListItem, ListItemIcon, Tooltip, ListItemText, IconButton, Link as Link$1 } from '@material-ui/core';
|
|
5
5
|
import Pagination from '@material-ui/lab/Pagination';
|
|
6
6
|
import React from 'react';
|
|
7
|
-
import {
|
|
7
|
+
import { generatePath } from 'react-router-dom';
|
|
8
8
|
import { useAsync } from 'react-use';
|
|
9
|
-
import { Progress, ResponseErrorPanel, InfoCard, Avatar, Link
|
|
9
|
+
import { Progress, ResponseErrorPanel, InfoCard, Avatar, Link } from '@backstage/core-components';
|
|
10
10
|
import AccountTreeIcon from '@material-ui/icons/AccountTree';
|
|
11
11
|
import EmailIcon from '@material-ui/icons/Email';
|
|
12
12
|
import GroupIcon from '@material-ui/icons/Group';
|
|
@@ -21,25 +21,25 @@ const orgPlugin = createPlugin({
|
|
|
21
21
|
const EntityGroupProfileCard = orgPlugin.provide(createComponentExtension({
|
|
22
22
|
name: "EntityGroupProfileCard",
|
|
23
23
|
component: {
|
|
24
|
-
lazy: () => import('./esm/index-
|
|
24
|
+
lazy: () => import('./esm/index-63f79db1.esm.js').then((m) => m.GroupProfileCard)
|
|
25
25
|
}
|
|
26
26
|
}));
|
|
27
27
|
const EntityMembersListCard = orgPlugin.provide(createComponentExtension({
|
|
28
28
|
name: "EntityMembersListCard",
|
|
29
29
|
component: {
|
|
30
|
-
lazy: () => import('./esm/index-
|
|
30
|
+
lazy: () => import('./esm/index-63f79db1.esm.js').then((m) => m.MembersListCard)
|
|
31
31
|
}
|
|
32
32
|
}));
|
|
33
33
|
const EntityOwnershipCard = orgPlugin.provide(createComponentExtension({
|
|
34
34
|
name: "EntityOwnershipCard",
|
|
35
35
|
component: {
|
|
36
|
-
lazy: () => import('./esm/index-
|
|
36
|
+
lazy: () => import('./esm/index-63f79db1.esm.js').then((m) => m.OwnershipCard)
|
|
37
37
|
}
|
|
38
38
|
}));
|
|
39
39
|
const EntityUserProfileCard = orgPlugin.provide(createComponentExtension({
|
|
40
40
|
name: "EntityUserProfileCard",
|
|
41
41
|
component: {
|
|
42
|
-
lazy: () => import('./esm/index-
|
|
42
|
+
lazy: () => import('./esm/index-63f79db1.esm.js').then((m) => m.UserProfileCard)
|
|
43
43
|
}
|
|
44
44
|
}));
|
|
45
45
|
|
|
@@ -55,12 +55,12 @@ const useStyles$1 = makeStyles((theme) => createStyles({
|
|
|
55
55
|
minWidth: "0px"
|
|
56
56
|
}
|
|
57
57
|
}));
|
|
58
|
-
const MemberComponent = ({member}) => {
|
|
58
|
+
const MemberComponent = ({ member }) => {
|
|
59
59
|
var _a;
|
|
60
60
|
const classes = useStyles$1();
|
|
61
61
|
const {
|
|
62
|
-
metadata: {name: metaName},
|
|
63
|
-
spec: {profile}
|
|
62
|
+
metadata: { name: metaName },
|
|
63
|
+
spec: { profile }
|
|
64
64
|
} = member;
|
|
65
65
|
const displayName = (_a = profile == null ? void 0 : profile.displayName) != null ? _a : metaName;
|
|
66
66
|
return /* @__PURE__ */ React.createElement(Grid, {
|
|
@@ -91,18 +91,17 @@ const MemberComponent = ({member}) => {
|
|
|
91
91
|
}, /* @__PURE__ */ React.createElement(Typography, {
|
|
92
92
|
variant: "h5"
|
|
93
93
|
}, /* @__PURE__ */ React.createElement(Link, {
|
|
94
|
-
component: Link$1,
|
|
95
94
|
to: generatePath(`/catalog/:namespace/user/${metaName}`, entityRouteParams(member))
|
|
96
|
-
}, displayName)), /* @__PURE__ */ React.createElement(
|
|
97
|
-
|
|
98
|
-
}, profile
|
|
95
|
+
}, displayName)), (profile == null ? void 0 : profile.email) && /* @__PURE__ */ React.createElement(Link, {
|
|
96
|
+
to: `mailto:${profile.email}`
|
|
97
|
+
}, profile.email)))));
|
|
99
98
|
};
|
|
100
99
|
const MembersListCard = (_props) => {
|
|
101
100
|
var _a;
|
|
102
|
-
const {entity: groupEntity} = useEntity();
|
|
101
|
+
const { entity: groupEntity } = useEntity();
|
|
103
102
|
const {
|
|
104
|
-
metadata: {name: groupName, namespace: grpNamespace},
|
|
105
|
-
spec: {profile}
|
|
103
|
+
metadata: { name: groupName, namespace: grpNamespace },
|
|
104
|
+
spec: { profile }
|
|
106
105
|
} = groupEntity;
|
|
107
106
|
const catalogApi = useApi(catalogApiRef);
|
|
108
107
|
const displayName = (_a = profile == null ? void 0 : profile.displayName) != null ? _a : groupName;
|
|
@@ -118,7 +117,7 @@ const MembersListCard = (_props) => {
|
|
|
118
117
|
value: members
|
|
119
118
|
} = useAsync(async () => {
|
|
120
119
|
const membersList = await catalogApi.getEntities({
|
|
121
|
-
filter: {kind: "User"}
|
|
120
|
+
filter: { kind: "User" }
|
|
122
121
|
});
|
|
123
122
|
const groupMembersList = membersList.items.filter((member) => {
|
|
124
123
|
var _a2;
|
|
@@ -147,7 +146,7 @@ const MembersListCard = (_props) => {
|
|
|
147
146
|
}, /* @__PURE__ */ React.createElement(InfoCard, {
|
|
148
147
|
title: `Members (${(members == null ? void 0 : members.length) || 0}${paginationLabel})`,
|
|
149
148
|
subheader: `of ${displayName}`,
|
|
150
|
-
...nbPages <= 1 ? {} : {actions: pagination}
|
|
149
|
+
...nbPages <= 1 ? {} : { actions: pagination }
|
|
151
150
|
}, /* @__PURE__ */ React.createElement(Grid, {
|
|
152
151
|
container: true,
|
|
153
152
|
spacing: 3
|
|
@@ -159,7 +158,7 @@ const MembersListCard = (_props) => {
|
|
|
159
158
|
}, /* @__PURE__ */ React.createElement(Typography, null, "This group has no members.")))));
|
|
160
159
|
};
|
|
161
160
|
|
|
162
|
-
const CardTitle$1 = ({title}) => /* @__PURE__ */ React.createElement(Box, {
|
|
161
|
+
const CardTitle$1 = ({ title }) => /* @__PURE__ */ React.createElement(Box, {
|
|
163
162
|
display: "flex",
|
|
164
163
|
alignItems: "center"
|
|
165
164
|
}, /* @__PURE__ */ React.createElement(GroupIcon, {
|
|
@@ -171,15 +170,15 @@ const GroupProfileCard = ({
|
|
|
171
170
|
variant
|
|
172
171
|
}) => {
|
|
173
172
|
var _a;
|
|
174
|
-
const {entity: group} = useEntity();
|
|
173
|
+
const { entity: group } = useEntity();
|
|
175
174
|
if (!group) {
|
|
176
175
|
return /* @__PURE__ */ React.createElement(Alert, {
|
|
177
176
|
severity: "error"
|
|
178
177
|
}, "Group not found");
|
|
179
178
|
}
|
|
180
179
|
const {
|
|
181
|
-
metadata: {name, description},
|
|
182
|
-
spec: {profile}
|
|
180
|
+
metadata: { name, description },
|
|
181
|
+
spec: { profile }
|
|
183
182
|
} = group;
|
|
184
183
|
const childRelations = getEntityRelations(group, RELATION_PARENT_OF, {
|
|
185
184
|
kind: "Group"
|
|
@@ -193,7 +192,7 @@ const GroupProfileCard = ({
|
|
|
193
192
|
const infoCardAction = entityMetadataEditUrl ? /* @__PURE__ */ React.createElement(IconButton, {
|
|
194
193
|
"aria-label": "Edit",
|
|
195
194
|
title: "Edit Metadata",
|
|
196
|
-
component: Link
|
|
195
|
+
component: Link,
|
|
197
196
|
to: entityMetadataEditUrl
|
|
198
197
|
}, /* @__PURE__ */ React.createElement(EditIcon, null)) : /* @__PURE__ */ React.createElement(IconButton, {
|
|
199
198
|
"aria-label": "Edit",
|
|
@@ -224,7 +223,7 @@ const GroupProfileCard = ({
|
|
|
224
223
|
xl: 11
|
|
225
224
|
}, /* @__PURE__ */ React.createElement(List, null, (profile == null ? void 0 : profile.email) && /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(Tooltip, {
|
|
226
225
|
title: "Email"
|
|
227
|
-
}, /* @__PURE__ */ React.createElement(EmailIcon, null))), /* @__PURE__ */ React.createElement(ListItemText, null, /* @__PURE__ */ React.createElement(Link
|
|
226
|
+
}, /* @__PURE__ */ React.createElement(EmailIcon, null))), /* @__PURE__ */ React.createElement(ListItemText, null, /* @__PURE__ */ React.createElement(Link, {
|
|
228
227
|
to: emailHref
|
|
229
228
|
}, profile.email))), parentRelations.length ? /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(Tooltip, {
|
|
230
229
|
title: "Parent Group"
|
|
@@ -239,7 +238,7 @@ const GroupProfileCard = ({
|
|
|
239
238
|
}))) : null))));
|
|
240
239
|
};
|
|
241
240
|
|
|
242
|
-
const CardTitle = ({title}) => title ? /* @__PURE__ */ React.createElement(Box, {
|
|
241
|
+
const CardTitle = ({ title }) => title ? /* @__PURE__ */ React.createElement(Box, {
|
|
243
242
|
display: "flex",
|
|
244
243
|
alignItems: "center"
|
|
245
244
|
}, /* @__PURE__ */ React.createElement(PersonIcon, {
|
|
@@ -251,15 +250,15 @@ const UserProfileCard = ({
|
|
|
251
250
|
variant
|
|
252
251
|
}) => {
|
|
253
252
|
var _a;
|
|
254
|
-
const {entity: user} = useEntity();
|
|
253
|
+
const { entity: user } = useEntity();
|
|
255
254
|
if (!user) {
|
|
256
255
|
return /* @__PURE__ */ React.createElement(Alert, {
|
|
257
256
|
severity: "error"
|
|
258
257
|
}, "User not found");
|
|
259
258
|
}
|
|
260
259
|
const {
|
|
261
|
-
metadata: {name: metaName},
|
|
262
|
-
spec: {profile}
|
|
260
|
+
metadata: { name: metaName },
|
|
261
|
+
spec: { profile }
|
|
263
262
|
} = user;
|
|
264
263
|
const displayName = (_a = profile == null ? void 0 : profile.displayName) != null ? _a : metaName;
|
|
265
264
|
const emailHref = (profile == null ? void 0 : profile.email) ? `mailto:${profile.email}` : void 0;
|
|
@@ -289,7 +288,7 @@ const UserProfileCard = ({
|
|
|
289
288
|
xl: 11
|
|
290
289
|
}, /* @__PURE__ */ React.createElement(List, null, (profile == null ? void 0 : profile.email) && /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(Tooltip, {
|
|
291
290
|
title: "Email"
|
|
292
|
-
}, /* @__PURE__ */ React.createElement(EmailIcon, null))), /* @__PURE__ */ React.createElement(ListItemText, null, /* @__PURE__ */ React.createElement(Link, {
|
|
291
|
+
}, /* @__PURE__ */ React.createElement(EmailIcon, null))), /* @__PURE__ */ React.createElement(ListItemText, null, /* @__PURE__ */ React.createElement(Link$1, {
|
|
293
292
|
href: emailHref
|
|
294
293
|
}, profile.email))), /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(Tooltip, {
|
|
295
294
|
title: "Member of"
|
|
@@ -315,7 +314,7 @@ const useStyles = makeStyles((theme) => createStyles({
|
|
|
315
314
|
fontWeight: theme.typography.fontWeightBold
|
|
316
315
|
},
|
|
317
316
|
entityTypeBox: {
|
|
318
|
-
background: (props) => theme.getPageTheme({themeId: props.type}).backgroundImage
|
|
317
|
+
background: (props) => theme.getPageTheme({ themeId: props.type }).backgroundImage
|
|
319
318
|
}
|
|
320
319
|
}));
|
|
321
320
|
const EntityCountTile = ({
|
|
@@ -324,8 +323,8 @@ const EntityCountTile = ({
|
|
|
324
323
|
name,
|
|
325
324
|
url
|
|
326
325
|
}) => {
|
|
327
|
-
const classes = useStyles({type});
|
|
328
|
-
return /* @__PURE__ */ React.createElement(Link
|
|
326
|
+
const classes = useStyles({ type });
|
|
327
|
+
return /* @__PURE__ */ React.createElement(Link, {
|
|
329
328
|
to: url,
|
|
330
329
|
variant: "body2"
|
|
331
330
|
}, /* @__PURE__ */ React.createElement(Box, {
|
|
@@ -342,8 +341,8 @@ const EntityCountTile = ({
|
|
|
342
341
|
}, name)));
|
|
343
342
|
};
|
|
344
343
|
const getQueryParams = (owner, selectedEntity) => {
|
|
345
|
-
const ownerName = formatEntityRefTitle(owner, {defaultKind: "group"});
|
|
346
|
-
const {kind, type} = selectedEntity;
|
|
344
|
+
const ownerName = formatEntityRefTitle(owner, { defaultKind: "group" });
|
|
345
|
+
const { kind, type } = selectedEntity;
|
|
347
346
|
const filters = {
|
|
348
347
|
kind,
|
|
349
348
|
type,
|
|
@@ -362,7 +361,7 @@ const getQueryParams = (owner, selectedEntity) => {
|
|
|
362
361
|
const OwnershipCard = ({
|
|
363
362
|
variant
|
|
364
363
|
}) => {
|
|
365
|
-
const {entity} = useEntity();
|
|
364
|
+
const { entity } = useEntity();
|
|
366
365
|
const catalogApi = useApi(catalogApiRef);
|
|
367
366
|
const catalogLink = useRouteRef(catalogRouteRef);
|
|
368
367
|
const {
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/plugin.ts","../src/components/Cards/Group/MembersList/MembersListCard.tsx","../src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx","../src/components/Cards/User/UserProfileCard/UserProfileCard.tsx","../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 */\nimport {\n createComponentExtension,\n createPlugin,\n} from '@backstage/core-plugin-api';\n\nexport const orgPlugin = createPlugin({\n id: 'org',\n});\n\nexport const EntityGroupProfileCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityGroupProfileCard',\n component: {\n lazy: () => import('./components').then(m => m.GroupProfileCard),\n },\n }),\n);\nexport const EntityMembersListCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityMembersListCard',\n component: {\n lazy: () => import('./components').then(m => m.MembersListCard),\n },\n }),\n);\nexport const EntityOwnershipCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityOwnershipCard',\n component: {\n lazy: () => import('./components').then(m => m.OwnershipCard),\n },\n }),\n);\nexport const EntityUserProfileCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityUserProfileCard',\n component: {\n lazy: () => import('./components').then(m => m.UserProfileCard),\n },\n }),\n);\n","/*\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 */\nimport {\n ENTITY_DEFAULT_NAMESPACE,\n GroupEntity,\n RELATION_MEMBER_OF,\n UserEntity,\n} from '@backstage/catalog-model';\nimport {\n catalogApiRef,\n entityRouteParams,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport {\n Box,\n createStyles,\n Grid,\n Link,\n makeStyles,\n Theme,\n Typography,\n} from '@material-ui/core';\nimport Pagination from '@material-ui/lab/Pagination';\nimport React from 'react';\nimport { generatePath, Link as RouterLink } from 'react-router-dom';\nimport { useAsync } from 'react-use';\n\nimport {\n Avatar,\n InfoCard,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nconst useStyles = makeStyles((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 }),\n);\n\nconst MemberComponent = ({ member }: { member: UserEntity }) => {\n const classes = useStyles();\n const {\n metadata: { name: metaName },\n spec: { profile },\n } = member;\n const displayName = profile?.displayName ?? metaName;\n\n return (\n <Grid item container xs={12} sm={6} md={4} xl={2}>\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 customStyles={{\n position: 'absolute',\n top: '-2rem',\n }}\n />\n <Box pt={2} textAlign=\"center\">\n <Typography variant=\"h5\">\n <Link\n component={RouterLink}\n to={generatePath(\n `/catalog/:namespace/user/${metaName}`,\n entityRouteParams(member),\n )}\n >\n {displayName}\n </Link>\n </Typography>\n <Typography variant=\"caption\">{profile?.email}</Typography>\n </Box>\n </Box>\n </Box>\n </Grid>\n );\n};\n\nexport const MembersListCard = (_props: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: GroupEntity;\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 || ENTITY_DEFAULT_NAMESPACE;\n\n const [page, setPage] = React.useState(1);\n const pageChange = (_: React.ChangeEvent<unknown>, pageIndex: number) => {\n setPage(pageIndex);\n };\n const pageSize = 50;\n\n const {\n loading,\n error,\n value: members,\n } = useAsync(async () => {\n const membersList = await catalogApi.getEntities({\n filter: { kind: 'User' },\n });\n const groupMembersList = (membersList.items as UserEntity[]).filter(\n member =>\n member?.relations?.some(\n r =>\n r.type === RELATION_MEMBER_OF &&\n r.target.name.toLocaleLowerCase('en-US') ===\n groupName.toLocaleLowerCase('en-US') &&\n r.target.namespace.toLocaleLowerCase('en-US') ===\n groupNamespace.toLocaleLowerCase('en-US'),\n ),\n );\n return groupMembersList;\n }, [catalogApi, groupEntity]);\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 = nbPages < 2 ? '' : `, page ${page} of ${nbPages}`;\n\n const pagination = (\n <Pagination\n count={nbPages}\n page={page}\n onChange={pageChange}\n showFirstButton\n showLastButton\n />\n );\n\n return (\n <Grid item>\n <InfoCard\n title={`Members (${members?.length || 0}${paginationLabel})`}\n subheader={`of ${displayName}`}\n {...(nbPages <= 1 ? {} : { actions: pagination })}\n >\n <Grid container spacing={3}>\n {members && members.length > 0 ? (\n members\n .slice(pageSize * (page - 1), pageSize * page)\n .map(member => (\n <MemberComponent member={member} key={member.metadata.uid} />\n ))\n ) : (\n <Box p={2}>\n <Typography>This group has no members.</Typography>\n </Box>\n )}\n </Grid>\n </InfoCard>\n </Grid>\n );\n};\n","/*\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 GroupEntity,\n RELATION_CHILD_OF,\n RELATION_PARENT_OF,\n} from '@backstage/catalog-model';\nimport {\n EntityRefLinks,\n getEntityRelations,\n useEntity,\n getEntityMetadataEditUrl,\n} from '@backstage/plugin-catalog-react';\nimport {\n Box,\n Grid,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Tooltip,\n IconButton,\n} from '@material-ui/core';\nimport AccountTreeIcon from '@material-ui/icons/AccountTree';\nimport EmailIcon from '@material-ui/icons/Email';\nimport GroupIcon from '@material-ui/icons/Group';\nimport EditIcon from '@material-ui/icons/Edit';\nimport Alert from '@material-ui/lab/Alert';\nimport React from 'react';\nimport {\n Avatar,\n InfoCard,\n InfoCardVariants,\n Link,\n} from '@backstage/core-components';\n\nconst CardTitle = ({ title }: { title: string }) => (\n <Box display=\"flex\" alignItems=\"center\">\n <GroupIcon fontSize=\"inherit\" />\n <Box ml={1}>{title}</Box>\n </Box>\n);\n\nexport const GroupProfileCard = ({\n variant,\n}: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: GroupEntity;\n variant?: InfoCardVariants;\n}) => {\n const { entity: group } = useEntity<GroupEntity>();\n if (!group) {\n return <Alert severity=\"error\">Group not found</Alert>;\n }\n\n const {\n metadata: { name, description },\n spec: { profile },\n } = group;\n\n const childRelations = getEntityRelations(group, RELATION_PARENT_OF, {\n kind: 'Group',\n });\n const parentRelations = getEntityRelations(group, RELATION_CHILD_OF, {\n kind: 'group',\n });\n\n const entityMetadataEditUrl = getEntityMetadataEditUrl(group);\n\n const displayName = profile?.displayName ?? name;\n const emailHref = profile?.email ? `mailto:${profile.email}` : '#';\n const infoCardAction = entityMetadataEditUrl ? (\n <IconButton\n aria-label=\"Edit\"\n title=\"Edit Metadata\"\n component={Link}\n to={entityMetadataEditUrl}\n >\n <EditIcon />\n </IconButton>\n ) : (\n <IconButton aria-label=\"Edit\" disabled title=\"Edit Metadata\">\n <EditIcon />\n </IconButton>\n );\n\n return (\n <InfoCard\n title={<CardTitle title={displayName} />}\n subheader={description}\n variant={variant}\n action={infoCardAction}\n >\n <Grid container spacing={3}>\n <Grid item xs={12} sm={2} xl={1}>\n <Avatar displayName={displayName} picture={profile?.picture} />\n </Grid>\n <Grid item md={10} xl={11}>\n <List>\n {profile?.email && (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Email\">\n <EmailIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <Link to={emailHref}>{profile.email}</Link>\n </ListItemText>\n </ListItem>\n )}\n\n {parentRelations.length ? (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Parent Group\">\n <AccountTreeIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <EntityRefLinks\n entityRefs={parentRelations}\n defaultKind=\"Group\"\n />\n </ListItemText>\n </ListItem>\n ) : null}\n\n {childRelations.length ? (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Child Groups\">\n <GroupIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <EntityRefLinks\n entityRefs={childRelations}\n defaultKind=\"Group\"\n />\n </ListItemText>\n </ListItem>\n ) : null}\n </List>\n </Grid>\n </Grid>\n </InfoCard>\n );\n};\n","/*\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 */\nimport { RELATION_MEMBER_OF, UserEntity } from '@backstage/catalog-model';\nimport {\n EntityRefLinks,\n getEntityRelations,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport {\n Box,\n Grid,\n Link,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Tooltip,\n} from '@material-ui/core';\nimport EmailIcon from '@material-ui/icons/Email';\nimport GroupIcon from '@material-ui/icons/Group';\nimport PersonIcon from '@material-ui/icons/Person';\nimport Alert from '@material-ui/lab/Alert';\nimport React from 'react';\nimport { Avatar, InfoCard, InfoCardVariants } from '@backstage/core-components';\n\nconst CardTitle = ({ title }: { title?: string }) =>\n title ? (\n <Box display=\"flex\" alignItems=\"center\">\n <PersonIcon fontSize=\"inherit\" />\n <Box ml={1}>{title}</Box>\n </Box>\n ) : null;\n\nexport const UserProfileCard = ({\n variant,\n}: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: UserEntity;\n variant?: InfoCardVariants;\n}) => {\n const { entity: user } = useEntity<UserEntity>();\n if (!user) {\n return <Alert severity=\"error\">User not found</Alert>;\n }\n\n const {\n metadata: { name: metaName },\n spec: { profile },\n } = user;\n const displayName = profile?.displayName ?? metaName;\n const emailHref = profile?.email ? `mailto:${profile.email}` : undefined;\n const memberOfRelations = getEntityRelations(user, RELATION_MEMBER_OF, {\n kind: 'Group',\n });\n\n return (\n <InfoCard title={<CardTitle title={displayName} />} variant={variant}>\n <Grid container spacing={3} alignItems=\"flex-start\">\n <Grid item xs={12} sm={2} xl={1}>\n <Avatar displayName={displayName} picture={profile?.picture} />\n </Grid>\n\n <Grid item md={10} xl={11}>\n <List>\n {profile?.email && (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Email\">\n <EmailIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <Link href={emailHref}>{profile.email}</Link>\n </ListItemText>\n </ListItem>\n )}\n\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Member of\">\n <GroupIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <EntityRefLinks\n entityRefs={memberOfRelations}\n defaultKind=\"Group\"\n />\n </ListItemText>\n </ListItem>\n </List>\n </Grid>\n </Grid>\n </InfoCard>\n );\n};\n","/*\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 { Entity, UserEntity } from '@backstage/catalog-model';\nimport {\n InfoCard,\n InfoCardVariants,\n Link,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n catalogRouteRef,\n formatEntityRefTitle,\n isOwnerOf,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Box,\n createStyles,\n Grid,\n makeStyles,\n Typography,\n} from '@material-ui/core';\nimport qs from 'qs';\nimport React from 'react';\nimport { useAsync } from 'react-use';\n\ntype EntityTypeProps = {\n kind: string;\n type: string;\n count: number;\n};\n\nconst useStyles = makeStyles((theme: BackstageTheme) =>\n createStyles({\n card: {\n border: `1px solid ${theme.palette.divider}`,\n boxShadow: theme.shadows[2],\n borderRadius: '4px',\n padding: theme.spacing(2),\n color: '#fff',\n transition: `${theme.transitions.duration.standard}ms`,\n '&:hover': {\n boxShadow: theme.shadows[4],\n },\n },\n bold: {\n fontWeight: theme.typography.fontWeightBold,\n },\n entityTypeBox: {\n background: (props: { type: string }) =>\n theme.getPageTheme({ themeId: props.type }).backgroundImage,\n },\n }),\n);\n\nconst EntityCountTile = ({\n counter,\n type,\n name,\n url,\n}: {\n counter: number;\n type: string;\n name: string;\n url: string;\n}) => {\n const classes = useStyles({ type });\n\n return (\n <Link to={url} variant=\"body2\">\n <Box\n className={`${classes.card} ${classes.entityTypeBox}`}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n >\n <Typography className={classes.bold} variant=\"h6\">\n {counter}\n </Typography>\n <Typography className={classes.bold} variant=\"h6\">\n {name}\n </Typography>\n </Box>\n </Link>\n );\n};\n\nconst getQueryParams = (\n owner: Entity,\n selectedEntity: EntityTypeProps,\n): string => {\n const ownerName = formatEntityRefTitle(owner, { defaultKind: 'group' });\n const { kind, type } = selectedEntity;\n const filters = {\n kind,\n type,\n owners: [ownerName],\n user: 'all',\n };\n if (owner.kind === 'User') {\n const user = owner as UserEntity;\n filters.owners = [...filters.owners, ...user.spec.memberOf];\n }\n const queryParams = qs.stringify({\n filters,\n });\n\n return queryParams;\n};\n\nexport const OwnershipCard = ({\n variant,\n}: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: Entity;\n variant?: InfoCardVariants;\n}) => {\n const { entity } = useEntity();\n const catalogApi = useApi(catalogApiRef);\n const catalogLink = useRouteRef(catalogRouteRef);\n\n const {\n loading,\n error,\n value: componentsWithCounters,\n } = useAsync(async () => {\n const kinds = ['Component', 'API'];\n const entitiesList = await catalogApi.getEntities({\n filter: {\n kind: kinds,\n },\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.type',\n 'relations',\n ],\n });\n\n const ownedEntitiesList = entitiesList.items.filter(component =>\n isOwnerOf(entity, component),\n );\n\n const counts = ownedEntitiesList.reduce(\n (acc: EntityTypeProps[], ownedEntity) => {\n if (typeof ownedEntity.spec?.type !== 'string') return acc;\n\n const match = acc.find(\n x => x.kind === ownedEntity.kind && x.type === ownedEntity.spec?.type,\n );\n if (match) {\n match.count += 1;\n } else {\n acc.push({\n kind: ownedEntity.kind,\n type: ownedEntity.spec?.type,\n count: 1,\n });\n }\n return acc;\n },\n [],\n );\n\n // Return top N (six) entities to be displayed in ownership boxes\n const topN = counts.sort((a, b) => b.count - a.count).slice(0, 6);\n\n return topN.map(topOwnedEntity => ({\n counter: topOwnedEntity.count,\n type: topOwnedEntity.type,\n name: topOwnedEntity.type.toLocaleUpperCase('en-US'),\n queryParams: getQueryParams(entity, topOwnedEntity),\n })) as Array<{\n counter: number;\n type: string;\n name: string;\n queryParams: string;\n }>;\n }, [catalogApi, entity]);\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n return (\n <InfoCard title=\"Ownership\" variant={variant}>\n <Grid container>\n {componentsWithCounters?.map(c => (\n <Grid item xs={6} md={6} lg={4} key={c.name}>\n <EntityCountTile\n counter={c.counter}\n type={c.type}\n name={c.name}\n url={`${catalogLink()}/?${c.queryParams}`}\n />\n </Grid>\n ))}\n </Grid>\n </InfoCard>\n );\n};\n"],"names":["useStyles","RouterLink","CardTitle","Link"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/plugin.ts","../src/components/Cards/Group/MembersList/MembersListCard.tsx","../src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx","../src/components/Cards/User/UserProfileCard/UserProfileCard.tsx","../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 */\nimport {\n createComponentExtension,\n createPlugin,\n} from '@backstage/core-plugin-api';\n\nexport const orgPlugin = createPlugin({\n id: 'org',\n});\n\nexport const EntityGroupProfileCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityGroupProfileCard',\n component: {\n lazy: () => import('./components').then(m => m.GroupProfileCard),\n },\n }),\n);\nexport const EntityMembersListCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityMembersListCard',\n component: {\n lazy: () => import('./components').then(m => m.MembersListCard),\n },\n }),\n);\nexport const EntityOwnershipCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityOwnershipCard',\n component: {\n lazy: () => import('./components').then(m => m.OwnershipCard),\n },\n }),\n);\nexport const EntityUserProfileCard = orgPlugin.provide(\n createComponentExtension({\n name: 'EntityUserProfileCard',\n component: {\n lazy: () => import('./components').then(m => m.UserProfileCard),\n },\n }),\n);\n","/*\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 */\nimport {\n ENTITY_DEFAULT_NAMESPACE,\n GroupEntity,\n RELATION_MEMBER_OF,\n UserEntity,\n} from '@backstage/catalog-model';\nimport {\n catalogApiRef,\n entityRouteParams,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport {\n Box,\n createStyles,\n Grid,\n makeStyles,\n Theme,\n Typography,\n} from '@material-ui/core';\nimport Pagination from '@material-ui/lab/Pagination';\nimport React from 'react';\nimport { generatePath } from 'react-router-dom';\nimport { useAsync } from 'react-use';\n\nimport {\n Avatar,\n InfoCard,\n Progress,\n ResponseErrorPanel,\n Link,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nconst useStyles = makeStyles((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 }),\n);\n\nconst MemberComponent = ({ member }: { member: UserEntity }) => {\n const classes = useStyles();\n const {\n metadata: { name: metaName },\n spec: { profile },\n } = member;\n const displayName = profile?.displayName ?? metaName;\n\n return (\n <Grid item container xs={12} sm={6} md={4} xl={2}>\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 customStyles={{\n position: 'absolute',\n top: '-2rem',\n }}\n />\n <Box pt={2} textAlign=\"center\">\n <Typography variant=\"h5\">\n <Link\n to={generatePath(\n `/catalog/:namespace/user/${metaName}`,\n entityRouteParams(member),\n )}\n >\n {displayName}\n </Link>\n </Typography>\n {profile?.email && (\n <Link to={`mailto:${profile.email}`}>{profile.email}</Link>\n )}\n </Box>\n </Box>\n </Box>\n </Grid>\n );\n};\n\nexport const MembersListCard = (_props: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: GroupEntity;\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 || ENTITY_DEFAULT_NAMESPACE;\n\n const [page, setPage] = React.useState(1);\n const pageChange = (_: React.ChangeEvent<unknown>, pageIndex: number) => {\n setPage(pageIndex);\n };\n const pageSize = 50;\n\n const {\n loading,\n error,\n value: members,\n } = useAsync(async () => {\n const membersList = await catalogApi.getEntities({\n filter: { kind: 'User' },\n });\n const groupMembersList = (membersList.items as UserEntity[]).filter(\n member =>\n member?.relations?.some(\n r =>\n r.type === RELATION_MEMBER_OF &&\n r.target.name.toLocaleLowerCase('en-US') ===\n groupName.toLocaleLowerCase('en-US') &&\n r.target.namespace.toLocaleLowerCase('en-US') ===\n groupNamespace.toLocaleLowerCase('en-US'),\n ),\n );\n return groupMembersList;\n }, [catalogApi, groupEntity]);\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 = nbPages < 2 ? '' : `, page ${page} of ${nbPages}`;\n\n const pagination = (\n <Pagination\n count={nbPages}\n page={page}\n onChange={pageChange}\n showFirstButton\n showLastButton\n />\n );\n\n return (\n <Grid item>\n <InfoCard\n title={`Members (${members?.length || 0}${paginationLabel})`}\n subheader={`of ${displayName}`}\n {...(nbPages <= 1 ? {} : { actions: pagination })}\n >\n <Grid container spacing={3}>\n {members && members.length > 0 ? (\n members\n .slice(pageSize * (page - 1), pageSize * page)\n .map(member => (\n <MemberComponent member={member} key={member.metadata.uid} />\n ))\n ) : (\n <Box p={2}>\n <Typography>This group has no members.</Typography>\n </Box>\n )}\n </Grid>\n </InfoCard>\n </Grid>\n );\n};\n","/*\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 GroupEntity,\n RELATION_CHILD_OF,\n RELATION_PARENT_OF,\n} from '@backstage/catalog-model';\nimport {\n EntityRefLinks,\n getEntityRelations,\n useEntity,\n getEntityMetadataEditUrl,\n} from '@backstage/plugin-catalog-react';\nimport {\n Box,\n Grid,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Tooltip,\n IconButton,\n} from '@material-ui/core';\nimport AccountTreeIcon from '@material-ui/icons/AccountTree';\nimport EmailIcon from '@material-ui/icons/Email';\nimport GroupIcon from '@material-ui/icons/Group';\nimport EditIcon from '@material-ui/icons/Edit';\nimport Alert from '@material-ui/lab/Alert';\nimport React from 'react';\nimport {\n Avatar,\n InfoCard,\n InfoCardVariants,\n Link,\n} from '@backstage/core-components';\n\nconst CardTitle = ({ title }: { title: string }) => (\n <Box display=\"flex\" alignItems=\"center\">\n <GroupIcon fontSize=\"inherit\" />\n <Box ml={1}>{title}</Box>\n </Box>\n);\n\nexport const GroupProfileCard = ({\n variant,\n}: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: GroupEntity;\n variant?: InfoCardVariants;\n}) => {\n const { entity: group } = useEntity<GroupEntity>();\n if (!group) {\n return <Alert severity=\"error\">Group not found</Alert>;\n }\n\n const {\n metadata: { name, description },\n spec: { profile },\n } = group;\n\n const childRelations = getEntityRelations(group, RELATION_PARENT_OF, {\n kind: 'Group',\n });\n const parentRelations = getEntityRelations(group, RELATION_CHILD_OF, {\n kind: 'group',\n });\n\n const entityMetadataEditUrl = getEntityMetadataEditUrl(group);\n\n const displayName = profile?.displayName ?? name;\n const emailHref = profile?.email ? `mailto:${profile.email}` : '#';\n const infoCardAction = entityMetadataEditUrl ? (\n <IconButton\n aria-label=\"Edit\"\n title=\"Edit Metadata\"\n component={Link}\n to={entityMetadataEditUrl}\n >\n <EditIcon />\n </IconButton>\n ) : (\n <IconButton aria-label=\"Edit\" disabled title=\"Edit Metadata\">\n <EditIcon />\n </IconButton>\n );\n\n return (\n <InfoCard\n title={<CardTitle title={displayName} />}\n subheader={description}\n variant={variant}\n action={infoCardAction}\n >\n <Grid container spacing={3}>\n <Grid item xs={12} sm={2} xl={1}>\n <Avatar displayName={displayName} picture={profile?.picture} />\n </Grid>\n <Grid item md={10} xl={11}>\n <List>\n {profile?.email && (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Email\">\n <EmailIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <Link to={emailHref}>{profile.email}</Link>\n </ListItemText>\n </ListItem>\n )}\n\n {parentRelations.length ? (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Parent Group\">\n <AccountTreeIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <EntityRefLinks\n entityRefs={parentRelations}\n defaultKind=\"Group\"\n />\n </ListItemText>\n </ListItem>\n ) : null}\n\n {childRelations.length ? (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Child Groups\">\n <GroupIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <EntityRefLinks\n entityRefs={childRelations}\n defaultKind=\"Group\"\n />\n </ListItemText>\n </ListItem>\n ) : null}\n </List>\n </Grid>\n </Grid>\n </InfoCard>\n );\n};\n","/*\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 */\nimport { RELATION_MEMBER_OF, UserEntity } from '@backstage/catalog-model';\nimport {\n EntityRefLinks,\n getEntityRelations,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport {\n Box,\n Grid,\n Link,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Tooltip,\n} from '@material-ui/core';\nimport EmailIcon from '@material-ui/icons/Email';\nimport GroupIcon from '@material-ui/icons/Group';\nimport PersonIcon from '@material-ui/icons/Person';\nimport Alert from '@material-ui/lab/Alert';\nimport React from 'react';\nimport { Avatar, InfoCard, InfoCardVariants } from '@backstage/core-components';\n\nconst CardTitle = ({ title }: { title?: string }) =>\n title ? (\n <Box display=\"flex\" alignItems=\"center\">\n <PersonIcon fontSize=\"inherit\" />\n <Box ml={1}>{title}</Box>\n </Box>\n ) : null;\n\nexport const UserProfileCard = ({\n variant,\n}: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: UserEntity;\n variant?: InfoCardVariants;\n}) => {\n const { entity: user } = useEntity<UserEntity>();\n if (!user) {\n return <Alert severity=\"error\">User not found</Alert>;\n }\n\n const {\n metadata: { name: metaName },\n spec: { profile },\n } = user;\n const displayName = profile?.displayName ?? metaName;\n const emailHref = profile?.email ? `mailto:${profile.email}` : undefined;\n const memberOfRelations = getEntityRelations(user, RELATION_MEMBER_OF, {\n kind: 'Group',\n });\n\n return (\n <InfoCard title={<CardTitle title={displayName} />} variant={variant}>\n <Grid container spacing={3} alignItems=\"flex-start\">\n <Grid item xs={12} sm={2} xl={1}>\n <Avatar displayName={displayName} picture={profile?.picture} />\n </Grid>\n\n <Grid item md={10} xl={11}>\n <List>\n {profile?.email && (\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Email\">\n <EmailIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <Link href={emailHref}>{profile.email}</Link>\n </ListItemText>\n </ListItem>\n )}\n\n <ListItem>\n <ListItemIcon>\n <Tooltip title=\"Member of\">\n <GroupIcon />\n </Tooltip>\n </ListItemIcon>\n <ListItemText>\n <EntityRefLinks\n entityRefs={memberOfRelations}\n defaultKind=\"Group\"\n />\n </ListItemText>\n </ListItem>\n </List>\n </Grid>\n </Grid>\n </InfoCard>\n );\n};\n","/*\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 { Entity, UserEntity } from '@backstage/catalog-model';\nimport {\n InfoCard,\n InfoCardVariants,\n Link,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n catalogRouteRef,\n formatEntityRefTitle,\n isOwnerOf,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Box,\n createStyles,\n Grid,\n makeStyles,\n Typography,\n} from '@material-ui/core';\nimport qs from 'qs';\nimport React from 'react';\nimport { useAsync } from 'react-use';\n\ntype EntityTypeProps = {\n kind: string;\n type: string;\n count: number;\n};\n\nconst useStyles = makeStyles((theme: BackstageTheme) =>\n createStyles({\n card: {\n border: `1px solid ${theme.palette.divider}`,\n boxShadow: theme.shadows[2],\n borderRadius: '4px',\n padding: theme.spacing(2),\n color: '#fff',\n transition: `${theme.transitions.duration.standard}ms`,\n '&:hover': {\n boxShadow: theme.shadows[4],\n },\n },\n bold: {\n fontWeight: theme.typography.fontWeightBold,\n },\n entityTypeBox: {\n background: (props: { type: string }) =>\n theme.getPageTheme({ themeId: props.type }).backgroundImage,\n },\n }),\n);\n\nconst EntityCountTile = ({\n counter,\n type,\n name,\n url,\n}: {\n counter: number;\n type: string;\n name: string;\n url: string;\n}) => {\n const classes = useStyles({ type });\n\n return (\n <Link to={url} variant=\"body2\">\n <Box\n className={`${classes.card} ${classes.entityTypeBox}`}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n >\n <Typography className={classes.bold} variant=\"h6\">\n {counter}\n </Typography>\n <Typography className={classes.bold} variant=\"h6\">\n {name}\n </Typography>\n </Box>\n </Link>\n );\n};\n\nconst getQueryParams = (\n owner: Entity,\n selectedEntity: EntityTypeProps,\n): string => {\n const ownerName = formatEntityRefTitle(owner, { defaultKind: 'group' });\n const { kind, type } = selectedEntity;\n const filters = {\n kind,\n type,\n owners: [ownerName],\n user: 'all',\n };\n if (owner.kind === 'User') {\n const user = owner as UserEntity;\n filters.owners = [...filters.owners, ...user.spec.memberOf];\n }\n const queryParams = qs.stringify({\n filters,\n });\n\n return queryParams;\n};\n\nexport const OwnershipCard = ({\n variant,\n}: {\n /** @deprecated The entity is now grabbed from context instead */\n entity?: Entity;\n variant?: InfoCardVariants;\n}) => {\n const { entity } = useEntity();\n const catalogApi = useApi(catalogApiRef);\n const catalogLink = useRouteRef(catalogRouteRef);\n\n const {\n loading,\n error,\n value: componentsWithCounters,\n } = useAsync(async () => {\n const kinds = ['Component', 'API'];\n const entitiesList = await catalogApi.getEntities({\n filter: {\n kind: kinds,\n },\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.type',\n 'relations',\n ],\n });\n\n const ownedEntitiesList = entitiesList.items.filter(component =>\n isOwnerOf(entity, component),\n );\n\n const counts = ownedEntitiesList.reduce(\n (acc: EntityTypeProps[], ownedEntity) => {\n if (typeof ownedEntity.spec?.type !== 'string') return acc;\n\n const match = acc.find(\n x => x.kind === ownedEntity.kind && x.type === ownedEntity.spec?.type,\n );\n if (match) {\n match.count += 1;\n } else {\n acc.push({\n kind: ownedEntity.kind,\n type: ownedEntity.spec?.type,\n count: 1,\n });\n }\n return acc;\n },\n [],\n );\n\n // Return top N (six) entities to be displayed in ownership boxes\n const topN = counts.sort((a, b) => b.count - a.count).slice(0, 6);\n\n return topN.map(topOwnedEntity => ({\n counter: topOwnedEntity.count,\n type: topOwnedEntity.type,\n name: topOwnedEntity.type.toLocaleUpperCase('en-US'),\n queryParams: getQueryParams(entity, topOwnedEntity),\n })) as Array<{\n counter: number;\n type: string;\n name: string;\n queryParams: string;\n }>;\n }, [catalogApi, entity]);\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n return (\n <InfoCard title=\"Ownership\" variant={variant}>\n <Grid container>\n {componentsWithCounters?.map(c => (\n <Grid item xs={6} md={6} lg={4} key={c.name}>\n <EntityCountTile\n counter={c.counter}\n type={c.type}\n name={c.name}\n url={`${catalogLink()}/?${c.queryParams}`}\n />\n </Grid>\n ))}\n </Grid>\n </InfoCard>\n );\n};\n"],"names":["useStyles","CardTitle","Link"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-org",
|
|
3
3
|
"description": "A Backstage plugin that helps you create entity pages for your organization",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.30",
|
|
5
5
|
"main": "dist/index.esm.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -21,36 +21,37 @@
|
|
|
21
21
|
"clean": "backstage-cli clean"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@backstage/catalog-model": "^0.9.
|
|
25
|
-
"@backstage/core-components": "^0.
|
|
26
|
-
"@backstage/core-plugin-api": "^0.
|
|
27
|
-
"@backstage/plugin-catalog-react": "^0.5
|
|
28
|
-
"@backstage/theme": "^0.2.
|
|
24
|
+
"@backstage/catalog-model": "^0.9.7",
|
|
25
|
+
"@backstage/core-components": "^0.8.0",
|
|
26
|
+
"@backstage/core-plugin-api": "^0.3.0",
|
|
27
|
+
"@backstage/plugin-catalog-react": "^0.6.5",
|
|
28
|
+
"@backstage/theme": "^0.2.14",
|
|
29
29
|
"@material-ui/core": "^4.12.2",
|
|
30
30
|
"@material-ui/icons": "^4.9.1",
|
|
31
31
|
"@material-ui/lab": "4.0.0-alpha.57",
|
|
32
32
|
"qs": "^6.10.1",
|
|
33
|
-
"react": "^16.13.1",
|
|
34
|
-
"react-dom": "^16.13.1",
|
|
35
33
|
"react-router": "6.0.0-beta.0",
|
|
36
34
|
"react-router-dom": "6.0.0-beta.0",
|
|
37
35
|
"react-use": "^17.2.4"
|
|
38
36
|
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": "^16.13.1 || ^17.0.0"
|
|
39
|
+
},
|
|
39
40
|
"devDependencies": {
|
|
40
|
-
"@backstage/cli": "^0.
|
|
41
|
-
"@backstage/core-app-api": "^0.
|
|
42
|
-
"@backstage/dev-utils": "^0.2.
|
|
43
|
-
"@backstage/test-utils": "^0.1.
|
|
41
|
+
"@backstage/cli": "^0.10.1",
|
|
42
|
+
"@backstage/core-app-api": "^0.2.0",
|
|
43
|
+
"@backstage/dev-utils": "^0.2.14",
|
|
44
|
+
"@backstage/test-utils": "^0.1.24",
|
|
44
45
|
"@testing-library/jest-dom": "^5.10.1",
|
|
45
46
|
"@testing-library/react": "^11.2.5",
|
|
46
47
|
"@testing-library/user-event": "^13.1.8",
|
|
47
48
|
"@types/jest": "^26.0.7",
|
|
48
49
|
"@types/node": "^14.14.32",
|
|
49
50
|
"cross-fetch": "^3.0.6",
|
|
50
|
-
"msw": "^0.
|
|
51
|
+
"msw": "^0.35.0"
|
|
51
52
|
},
|
|
52
53
|
"files": [
|
|
53
54
|
"dist"
|
|
54
55
|
],
|
|
55
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "562be0b43016294e27af3ad024191bb86b13b1c1"
|
|
56
57
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-b0365569.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
|