@backstage/plugin-org 0.6.49-next.1 → 0.6.49
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 +30 -0
- package/dist/alpha.d.ts +14 -13
- package/dist/components/Cards/Group/MembersList/MembersListCard.esm.js +34 -5
- package/dist/components/Cards/Group/MembersList/MembersListCard.esm.js.map +1 -1
- package/dist/package.json.esm.js +4 -3
- package/dist/package.json.esm.js.map +1 -1
- package/package.json +19 -18
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @backstage/plugin-org
|
|
2
2
|
|
|
3
|
+
## 0.6.49
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ac9bead: Added `@backstage/frontend-test-utils` dev dependency.
|
|
8
|
+
- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions.
|
|
9
|
+
- 4183614: Updated usage of deprecated APIs in the new frontend system.
|
|
10
|
+
- a7e0d50: Updated `react-router-dom` peer dependency to `^6.30.2` and explicitly disabled v7 future flags to suppress deprecation warnings.
|
|
11
|
+
- 1dee6de: Add search functionality in MembersListCard
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @backstage/plugin-catalog-react@2.0.0
|
|
14
|
+
- @backstage/core-components@0.18.7
|
|
15
|
+
- @backstage/frontend-plugin-api@0.14.0
|
|
16
|
+
- @backstage/core-plugin-api@1.12.3
|
|
17
|
+
- @backstage/plugin-catalog-common@1.1.8
|
|
18
|
+
|
|
19
|
+
## 0.6.49-next.2
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- ac9bead: Added `@backstage/frontend-test-utils` dev dependency.
|
|
24
|
+
- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions.
|
|
25
|
+
- 4183614: Updated usage of deprecated APIs in the new frontend system.
|
|
26
|
+
- a7e0d50: Prepare for React Router v7 migration by updating to v6.30.2 across all NFS packages and enabling v7 future flags. Convert routes from splat paths to parent/child structure with Outlet components.
|
|
27
|
+
- Updated dependencies
|
|
28
|
+
- @backstage/plugin-catalog-react@2.0.0-next.2
|
|
29
|
+
- @backstage/frontend-plugin-api@0.14.0-next.2
|
|
30
|
+
- @backstage/core-components@0.18.7-next.2
|
|
31
|
+
- @backstage/core-plugin-api@1.12.3-next.1
|
|
32
|
+
|
|
3
33
|
## 0.6.49-next.1
|
|
4
34
|
|
|
5
35
|
### Patch Changes
|
package/dist/alpha.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import * as _backstage_plugin_catalog_react_alpha from '@backstage/plugin-catalog-react/alpha';
|
|
1
2
|
import * as _backstage_catalog_model from '@backstage/catalog-model';
|
|
2
3
|
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
3
4
|
import * as react from 'react';
|
|
4
|
-
import * as
|
|
5
|
+
import * as _backstage_filter_predicates from '@backstage/filter-predicates';
|
|
5
6
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -44,11 +45,11 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
44
45
|
kind: "entity-card";
|
|
45
46
|
name: "group-profile";
|
|
46
47
|
config: {
|
|
47
|
-
filter:
|
|
48
|
+
filter: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
48
49
|
type: "content" | "info" | undefined;
|
|
49
50
|
};
|
|
50
51
|
configInput: {
|
|
51
|
-
filter?:
|
|
52
|
+
filter?: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
52
53
|
type?: "content" | "info" | undefined;
|
|
53
54
|
};
|
|
54
55
|
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
@@ -61,7 +62,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
61
62
|
inputs: {};
|
|
62
63
|
params: {
|
|
63
64
|
loader: () => Promise<JSX.Element>;
|
|
64
|
-
filter?: string |
|
|
65
|
+
filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
65
66
|
type?: _backstage_plugin_catalog_react_alpha.EntityCardType;
|
|
66
67
|
};
|
|
67
68
|
}>;
|
|
@@ -69,13 +70,13 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
69
70
|
config: {
|
|
70
71
|
initialRelationAggregation: "direct" | "aggregated" | undefined;
|
|
71
72
|
showAggregateMembersToggle: boolean | undefined;
|
|
72
|
-
filter:
|
|
73
|
+
filter: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
73
74
|
type: "content" | "info" | undefined;
|
|
74
75
|
};
|
|
75
76
|
configInput: {
|
|
76
77
|
showAggregateMembersToggle?: boolean | undefined;
|
|
77
78
|
initialRelationAggregation?: "direct" | "aggregated" | undefined;
|
|
78
|
-
filter?:
|
|
79
|
+
filter?: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
79
80
|
type?: "content" | "info" | undefined;
|
|
80
81
|
};
|
|
81
82
|
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
@@ -90,7 +91,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
90
91
|
name: "members-list";
|
|
91
92
|
params: {
|
|
92
93
|
loader: () => Promise<JSX.Element>;
|
|
93
|
-
filter?: string |
|
|
94
|
+
filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
94
95
|
type?: _backstage_plugin_catalog_react_alpha.EntityCardType;
|
|
95
96
|
};
|
|
96
97
|
}>;
|
|
@@ -99,14 +100,14 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
99
100
|
initialRelationAggregation: "direct" | "aggregated" | undefined;
|
|
100
101
|
showAggregateMembersToggle: boolean | undefined;
|
|
101
102
|
ownedKinds: string[] | undefined;
|
|
102
|
-
filter:
|
|
103
|
+
filter: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
103
104
|
type: "content" | "info" | undefined;
|
|
104
105
|
};
|
|
105
106
|
configInput: {
|
|
106
107
|
showAggregateMembersToggle?: boolean | undefined;
|
|
107
108
|
initialRelationAggregation?: "direct" | "aggregated" | undefined;
|
|
108
109
|
ownedKinds?: string[] | undefined;
|
|
109
|
-
filter?:
|
|
110
|
+
filter?: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
110
111
|
type?: "content" | "info" | undefined;
|
|
111
112
|
};
|
|
112
113
|
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
@@ -121,7 +122,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
121
122
|
name: "ownership";
|
|
122
123
|
params: {
|
|
123
124
|
loader: () => Promise<JSX.Element>;
|
|
124
|
-
filter?: string |
|
|
125
|
+
filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
125
126
|
type?: _backstage_plugin_catalog_react_alpha.EntityCardType;
|
|
126
127
|
};
|
|
127
128
|
}>;
|
|
@@ -129,13 +130,13 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
129
130
|
config: {
|
|
130
131
|
maxRelations: number | undefined;
|
|
131
132
|
hideIcons: boolean;
|
|
132
|
-
filter:
|
|
133
|
+
filter: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
133
134
|
type: "content" | "info" | undefined;
|
|
134
135
|
};
|
|
135
136
|
configInput: {
|
|
136
137
|
hideIcons?: boolean | undefined;
|
|
137
138
|
maxRelations?: number | undefined;
|
|
138
|
-
filter?:
|
|
139
|
+
filter?: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
139
140
|
type?: "content" | "info" | undefined;
|
|
140
141
|
};
|
|
141
142
|
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
@@ -150,7 +151,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
150
151
|
name: "user-profile";
|
|
151
152
|
params: {
|
|
152
153
|
loader: () => Promise<JSX.Element>;
|
|
153
|
-
filter?: string |
|
|
154
|
+
filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
154
155
|
type?: _backstage_plugin_catalog_react_alpha.EntityCardType;
|
|
155
156
|
};
|
|
156
157
|
}>;
|
|
@@ -7,13 +7,14 @@ import Switch from '@material-ui/core/Switch';
|
|
|
7
7
|
import Typography from '@material-ui/core/Typography';
|
|
8
8
|
import { makeStyles, createStyles } from '@material-ui/core/styles';
|
|
9
9
|
import Pagination from '@material-ui/lab/Pagination';
|
|
10
|
-
import { useState } from 'react';
|
|
10
|
+
import { useState, useEffect } from 'react';
|
|
11
11
|
import useAsync from 'react-use/esm/useAsync';
|
|
12
12
|
import { Progress, ResponseErrorPanel, InfoCard, Avatar, Link, OverflowTooltip } from '@backstage/core-components';
|
|
13
13
|
import { useApi } from '@backstage/core-plugin-api';
|
|
14
14
|
import { getAllDesendantMembersForGroupEntity, removeDuplicateEntitiesFrom } from '../../../../helpers/helpers.esm.js';
|
|
15
15
|
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
16
16
|
import { orgTranslationRef } from '../../../../translation.esm.js';
|
|
17
|
+
import TextField from '@material-ui/core/TextField';
|
|
17
18
|
|
|
18
19
|
const useStyles = makeStyles(
|
|
19
20
|
(theme) => createStyles({
|
|
@@ -127,6 +128,10 @@ const MembersListCard = (props) => {
|
|
|
127
128
|
const [showAggregateMembers, setShowAggregateMembers] = useState(
|
|
128
129
|
relationAggregation === "aggregated"
|
|
129
130
|
);
|
|
131
|
+
const [searchTerm, setSearchTerm] = useState("");
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
setPage(1);
|
|
134
|
+
}, [searchTerm]);
|
|
130
135
|
const { loading: loadingDescendantMembers, value: descendantMembers } = useAsync(async () => {
|
|
131
136
|
if (!showAggregateMembers) {
|
|
132
137
|
return [];
|
|
@@ -184,16 +189,28 @@ const MembersListCard = (props) => {
|
|
|
184
189
|
showLastButton: true
|
|
185
190
|
}
|
|
186
191
|
);
|
|
192
|
+
const filteredMembers = members.filter((member) => {
|
|
193
|
+
const fields = [
|
|
194
|
+
member.metadata.name,
|
|
195
|
+
member.metadata.title,
|
|
196
|
+
member.spec?.profile?.displayName,
|
|
197
|
+
member.spec?.profile?.email
|
|
198
|
+
];
|
|
199
|
+
return fields.some(
|
|
200
|
+
(val) => val?.toLocaleLowerCase("en-US").includes(searchTerm.toLocaleLowerCase("en-US"))
|
|
201
|
+
);
|
|
202
|
+
});
|
|
203
|
+
const membersToRender = searchTerm ? filteredMembers : members;
|
|
187
204
|
let memberList;
|
|
188
|
-
if (
|
|
189
|
-
memberList = /* @__PURE__ */ jsx(Box, { className: classes.memberList, children:
|
|
205
|
+
if (membersToRender && membersToRender.length > 0) {
|
|
206
|
+
memberList = /* @__PURE__ */ jsx(Box, { className: classes.memberList, children: membersToRender.slice(pageSize * (page - 1), pageSize * page).map((member) => /* @__PURE__ */ jsx(MemberComponent, { member }, stringifyEntityRef(member))) });
|
|
190
207
|
} else {
|
|
191
208
|
memberList = /* @__PURE__ */ jsx(Box, { p: 2, children: /* @__PURE__ */ jsx(Typography, { children: t("membersListCard.noMembersDescription") }) });
|
|
192
209
|
}
|
|
193
210
|
return /* @__PURE__ */ jsx(Grid, { item: true, className: classes.root, children: /* @__PURE__ */ jsxs(
|
|
194
211
|
InfoCard,
|
|
195
212
|
{
|
|
196
|
-
title: `${memberDisplayTitle} (${
|
|
213
|
+
title: `${memberDisplayTitle} (${filteredMembers.length} of ${members.length}${paginationLabel})`,
|
|
197
214
|
subheader: t("membersListCard.subtitle", {
|
|
198
215
|
groupName: displayName
|
|
199
216
|
}),
|
|
@@ -220,7 +237,19 @@ const MembersListCard = (props) => {
|
|
|
220
237
|
),
|
|
221
238
|
t("membersListCard.aggregateMembersToggle.aggregatedMembers")
|
|
222
239
|
] }),
|
|
223
|
-
showAggregateMembers && loadingDescendantMembers ? /* @__PURE__ */ jsx(Progress, {}) :
|
|
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
|
+
] })
|
|
224
253
|
]
|
|
225
254
|
}
|
|
226
255
|
) });
|
|
@@ -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, 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';\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 { 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 let memberList: JSX.Element;\n if (members && members.length > 0) {\n memberList = (\n <Box className={classes.memberList}>\n {members.slice(pageSize * (page - 1), pageSize * page).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} (${\n members?.length || 0\n }${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 memberList\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 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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"}
|
package/dist/package.json.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var name = "@backstage/plugin-org";
|
|
2
|
-
var version = "0.6.49
|
|
2
|
+
var version = "0.6.49";
|
|
3
3
|
var description = "A Backstage plugin that helps you create entity pages for your organization";
|
|
4
4
|
var backstage = {
|
|
5
5
|
role: "frontend-plugin",
|
|
@@ -70,6 +70,7 @@ var devDependencies = {
|
|
|
70
70
|
"@backstage/cli": "workspace:^",
|
|
71
71
|
"@backstage/core-app-api": "workspace:^",
|
|
72
72
|
"@backstage/dev-utils": "workspace:^",
|
|
73
|
+
"@backstage/frontend-test-utils": "workspace:^",
|
|
73
74
|
"@backstage/plugin-catalog": "workspace:^",
|
|
74
75
|
"@backstage/plugin-permission-common": "workspace:^",
|
|
75
76
|
"@backstage/plugin-permission-react": "workspace:^",
|
|
@@ -82,13 +83,13 @@ var devDependencies = {
|
|
|
82
83
|
"@types/react": "^18.0.0",
|
|
83
84
|
react: "^18.0.2",
|
|
84
85
|
"react-dom": "^18.0.2",
|
|
85
|
-
"react-router-dom": "^6.
|
|
86
|
+
"react-router-dom": "^6.30.2"
|
|
86
87
|
};
|
|
87
88
|
var peerDependencies = {
|
|
88
89
|
"@types/react": "^17.0.0 || ^18.0.0",
|
|
89
90
|
react: "^17.0.0 || ^18.0.0",
|
|
90
91
|
"react-dom": "^17.0.0 || ^18.0.0",
|
|
91
|
-
"react-router-dom": "^6.
|
|
92
|
+
"react-router-dom": "^6.30.2"
|
|
92
93
|
};
|
|
93
94
|
var peerDependenciesMeta = {
|
|
94
95
|
"@types/react": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-org",
|
|
3
|
-
"version": "0.6.49
|
|
3
|
+
"version": "0.6.49",
|
|
4
4
|
"description": "A Backstage plugin that helps you create entity pages for your organization",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
@@ -63,12 +63,12 @@
|
|
|
63
63
|
"test": "backstage-cli package test"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@backstage/catalog-model": "1.7.6",
|
|
67
|
-
"@backstage/core-components": "0.18.7
|
|
68
|
-
"@backstage/core-plugin-api": "1.12.3
|
|
69
|
-
"@backstage/frontend-plugin-api": "0.14.0
|
|
70
|
-
"@backstage/plugin-catalog-common": "1.1.8
|
|
71
|
-
"@backstage/plugin-catalog-react": "
|
|
66
|
+
"@backstage/catalog-model": "^1.7.6",
|
|
67
|
+
"@backstage/core-components": "^0.18.7",
|
|
68
|
+
"@backstage/core-plugin-api": "^1.12.3",
|
|
69
|
+
"@backstage/frontend-plugin-api": "^0.14.0",
|
|
70
|
+
"@backstage/plugin-catalog-common": "^1.1.8",
|
|
71
|
+
"@backstage/plugin-catalog-react": "^2.0.0",
|
|
72
72
|
"@material-ui/core": "^4.12.2",
|
|
73
73
|
"@material-ui/icons": "^4.9.1",
|
|
74
74
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
@@ -79,15 +79,16 @@
|
|
|
79
79
|
"react-use": "^17.2.4"
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
82
|
-
"@backstage/catalog-client": "1.
|
|
83
|
-
"@backstage/cli": "0.35.4
|
|
84
|
-
"@backstage/core-app-api": "1.19.5
|
|
85
|
-
"@backstage/dev-utils": "1.1.20
|
|
86
|
-
"@backstage/
|
|
87
|
-
"@backstage/plugin-
|
|
88
|
-
"@backstage/plugin-permission-
|
|
89
|
-
"@backstage/
|
|
90
|
-
"@backstage/
|
|
82
|
+
"@backstage/catalog-client": "^1.13.0",
|
|
83
|
+
"@backstage/cli": "^0.35.4",
|
|
84
|
+
"@backstage/core-app-api": "^1.19.5",
|
|
85
|
+
"@backstage/dev-utils": "^1.1.20",
|
|
86
|
+
"@backstage/frontend-test-utils": "^0.5.0",
|
|
87
|
+
"@backstage/plugin-catalog": "^1.33.0",
|
|
88
|
+
"@backstage/plugin-permission-common": "^0.9.6",
|
|
89
|
+
"@backstage/plugin-permission-react": "^0.4.40",
|
|
90
|
+
"@backstage/test-utils": "^1.7.15",
|
|
91
|
+
"@backstage/types": "^1.2.2",
|
|
91
92
|
"@testing-library/dom": "^10.0.0",
|
|
92
93
|
"@testing-library/jest-dom": "^6.0.0",
|
|
93
94
|
"@testing-library/react": "^16.0.0",
|
|
@@ -95,13 +96,13 @@
|
|
|
95
96
|
"@types/react": "^18.0.0",
|
|
96
97
|
"react": "^18.0.2",
|
|
97
98
|
"react-dom": "^18.0.2",
|
|
98
|
-
"react-router-dom": "^6.
|
|
99
|
+
"react-router-dom": "^6.30.2"
|
|
99
100
|
},
|
|
100
101
|
"peerDependencies": {
|
|
101
102
|
"@types/react": "^17.0.0 || ^18.0.0",
|
|
102
103
|
"react": "^17.0.0 || ^18.0.0",
|
|
103
104
|
"react-dom": "^17.0.0 || ^18.0.0",
|
|
104
|
-
"react-router-dom": "^6.
|
|
105
|
+
"react-router-dom": "^6.30.2"
|
|
105
106
|
},
|
|
106
107
|
"peerDependenciesMeta": {
|
|
107
108
|
"@types/react": {
|