From 7c6e1463b924b44ea24ee2db0f68a23036a04261 Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Mon, 29 Mar 2021 11:47:02 -0400 Subject: [PATCH 1/2] fix(org-plugin): correctly route to namespaced members Signed-off-by: Phil Kuang --- .changeset/cuddly-buses-complain.md | 5 +++++ .../Cards/Group/MembersList/MembersListCard.test.tsx | 6 +++--- .../components/Cards/Group/MembersList/MembersListCard.tsx | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .changeset/cuddly-buses-complain.md diff --git a/.changeset/cuddly-buses-complain.md b/.changeset/cuddly-buses-complain.md new file mode 100644 index 0000000000..4780734b83 --- /dev/null +++ b/.changeset/cuddly-buses-complain.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Correctly route to namespaced group members diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx index 28c55b376b..c846aec69f 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx @@ -47,10 +47,10 @@ describe('MemberTab Test', () => { items: [ { apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', + kind: 'User', metadata: { name: 'tara.macgovern', - namespace: 'default', + namespace: 'foo-bar', uid: 'a5gerth56', }, relations: [ @@ -99,7 +99,7 @@ describe('MemberTab Test', () => { ).toBeInTheDocument(); expect(rendered.getByText('Tara MacGovern')).toHaveAttribute( 'href', - '/catalog/default/user/tara.macgovern', + '/catalog/foo-bar/user/tara.macgovern', ); }); }); diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx index 852f2a9e98..97938d91de 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx @@ -97,7 +97,7 @@ const MemberComponent = ({ component={RouterLink} to={generatePath( `/catalog/:namespace/user/${metaName}`, - entityRouteParams(groupEntity), + entityRouteParams(member), )} > {displayName} From 87171d57d7e1b16851d673876d00aa1f7194f370 Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Mon, 29 Mar 2021 12:52:55 -0400 Subject: [PATCH 2/2] fix(org-plugin): filter group members respecting namespaces Signed-off-by: Phil Kuang --- .changeset/flat-meals-behave.md | 5 ++++ .github/styles/vocab.txt | 1 + .../MembersList/MembersListCard.test.tsx | 29 +++++++++++++++++++ .../Group/MembersList/MembersListCard.tsx | 24 ++++++--------- 4 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 .changeset/flat-meals-behave.md diff --git a/.changeset/flat-meals-behave.md b/.changeset/flat-meals-behave.md new file mode 100644 index 0000000000..cb2af69de6 --- /dev/null +++ b/.changeset/flat-meals-behave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Correctly include group members via matching namespace relation diff --git a/.github/styles/vocab.txt b/.github/styles/vocab.txt index 3ef44009a0..a5af7cd07d 100644 --- a/.github/styles/vocab.txt +++ b/.github/styles/vocab.txt @@ -164,6 +164,7 @@ monorepo monorepos msw namespace +namespaced namespaces namespacing neuro diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx index c846aec69f..a97237fad6 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx @@ -72,6 +72,33 @@ describe('MemberTab Test', () => { memberOf: ['team-d'], }, }, + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: 'sara.macgovern', + namespace: 'default', + uid: 'a5gerth57', + }, + relations: [ + { + type: 'memberOf', + target: { + kind: 'group', + name: 'team-d', + namespace: 'foo-bar', + }, + }, + ], + spec: { + profile: { + displayName: 'Sara MacGovern', + email: 'sara-macgovern@example.com', + picture: 'https://example.com/staff/sara.jpeg', + }, + memberOf: ['foo-bar/team-d'], + }, + }, ] as Entity[], }), }; @@ -101,5 +128,7 @@ describe('MemberTab Test', () => { 'href', '/catalog/foo-bar/user/tara.macgovern', ); + + expect(rendered.getByText('Members (1)')).toBeInTheDocument(); }); }); diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx index 97938d91de..d68328ef1a 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import { - Entity, + ENTITY_DEFAULT_NAMESPACE, GroupEntity, RELATION_MEMBER_OF, UserEntity, @@ -59,13 +59,7 @@ const useStyles = makeStyles((theme: Theme) => }), ); -const MemberComponent = ({ - member, - groupEntity, -}: { - member: UserEntity; - groupEntity: Entity; -}) => { +const MemberComponent = ({ member }: { member: UserEntity }) => { const classes = useStyles(); const { metadata: { name: metaName }, @@ -117,13 +111,15 @@ export const MembersListCard = (_props: { }) => { const { entity: groupEntity } = useEntity(); const { - metadata: { name: groupName }, + metadata: { name: groupName, namespace: grpNamespace }, spec: { profile }, } = groupEntity; const catalogApi = useApi(catalogApiRef); const displayName = profile?.displayName ?? groupName; + const groupNamespace = grpNamespace || ENTITY_DEFAULT_NAMESPACE; + const { loading, error, value: members } = useAsync(async () => { const membersList = await catalogApi.getEntities({ filter: { kind: 'User' }, @@ -134,7 +130,9 @@ export const MembersListCard = (_props: { r => r.type === RELATION_MEMBER_OF && r.target.name.toLocaleLowerCase('en-US') === - groupName.toLocaleLowerCase('en-US'), + groupName.toLocaleLowerCase('en-US') && + r.target.namespace.toLocaleLowerCase('en-US') === + groupNamespace.toLocaleLowerCase('en-US'), ), ); return groupMembersList; @@ -155,11 +153,7 @@ export const MembersListCard = (_props: { {members && members.length > 0 ? ( members.map(member => ( - + )) ) : (