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/.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 28c55b376b..a97237fad6 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: [ @@ -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[], }), }; @@ -99,7 +126,9 @@ describe('MemberTab Test', () => { ).toBeInTheDocument(); expect(rendered.getByText('Tara MacGovern')).toHaveAttribute( 'href', - '/catalog/default/user/tara.macgovern', + '/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 852f2a9e98..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 }, @@ -97,7 +91,7 @@ const MemberComponent = ({ component={RouterLink} to={generatePath( `/catalog/:namespace/user/${metaName}`, - entityRouteParams(groupEntity), + entityRouteParams(member), )} > {displayName} @@ -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 => ( - + )) ) : (