From 5550efa093eebde2fff85a2f74185f1c0f43c4e9 Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Wed, 1 Oct 2025 11:26:24 +0200 Subject: [PATCH 1/6] fix(admin-settings): only show relevant groups in user-group assignment For removing groups, only show groups the user(s) are assigned to. For adding groups for one user, only show groups the uses is not already assigned to. For multiple users, we just show all groups because computing the intersection feels a bit overkill. --- .../src/components/Users/AddToGroupsModal.vue | 15 ++++++++-- .../Users/RemoveFromGroupsModal.vue | 11 +++++-- .../users/useUserActionsRemoveFromGroups.ts | 4 +++ .../components/Users/AddToGroupsModal.spec.ts | 29 ++++++++++++++++++- .../Users/RemoveFromGroupsModal.spec.ts | 14 ++++++++- .../useUserActionsRemoveFromGroups.spec.ts | 7 +++-- 6 files changed, 71 insertions(+), 9 deletions(-) diff --git a/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue b/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue index d756aa70dd..01cef2e93f 100644 --- a/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue +++ b/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue @@ -1,7 +1,7 @@ - diff --git a/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts index a979caa0b6..63403b0033 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts @@ -35,8 +35,7 @@ describe('RemoveFromGroupsModal', () => { mocks.$clientService.graphAuthenticated.users.getUser.mockResolvedValue( mock({ id: 'e3515ffb-d264-4dfc-8506-6c239f6673b5' }) ) - - wrapper.vm.selectedOptions = groups + ;(wrapper.vm as any).selectedOptions = groups await wrapper.vm.onConfirm() const { showMessage } = useMessages() @@ -56,8 +55,7 @@ describe('RemoveFromGroupsModal', () => { const { wrapper, mocks } = getWrapper({ users, groups }) mocks.$clientService.graphAuthenticated.groups.deleteMember.mockRejectedValue(new Error('')) mocks.$clientService.graphAuthenticated.users.getUser.mockRejectedValue(new Error('')) - - wrapper.vm.selectedOptions = groups + ;(wrapper.vm as any).selectedOptions = groups await wrapper.vm.onConfirm() const { showErrorMessage } = useMessages() From 20c86e43771984c826e2df5763589a0e9e7ce0dd Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Wed, 1 Oct 2025 13:24:17 +0200 Subject: [PATCH 4/6] fix(admin-settings): user details panel alignment --- .../src/components/Users/SideBar/DetailsPanel.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue b/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue index 9f759e55f7..6f0e74f389 100644 --- a/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue +++ b/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue @@ -6,7 +6,7 @@

{{ multipleUsersSelectedText }}

From 45fa14e5489b6769e4425497596cbf3cd3aab55d Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Wed, 1 Oct 2025 13:29:43 +0200 Subject: [PATCH 5/6] refactor: Users DetailsPanel to script setup --- .../components/Users/SideBar/DetailsPanel.vue | 122 +++++++----------- .../Users/SideBar/DetailsPanel.spec.ts | 10 +- 2 files changed, 54 insertions(+), 78 deletions(-) diff --git a/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue b/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue index 6f0e74f389..301625f4b3 100644 --- a/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue +++ b/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue @@ -1,5 +1,9 @@ - diff --git a/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts index c1ad32a5ac..5b76afec3a 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts @@ -29,28 +29,28 @@ describe('DetailsPanel', () => { const { wrapper } = getWrapper({ props: { user: null, users: [] } }) - expect(wrapper.vm.noUsers).toBeTruthy() + expect(wrapper.find('[data-testid="no-users-selected"]').exists()).toBeTruthy() }) it('should be false if users are given', () => { const { wrapper } = getWrapper({ props: { user: defaultUser, users: [defaultUser] } }) - expect(wrapper.vm.noUsers).toBeFalsy() + expect(wrapper.find('[data-testid="no-users-selected"]').exists()).toBeFalsy() }) }) describe('computed method "multipleUsers"', () => { it('should be false if no users are given', () => { const { wrapper } = getWrapper({ props: { user: null, users: [] } }) - expect(wrapper.vm.multipleUsers).toBeFalsy() + expect(wrapper.find('#oc-users-details-multiple-sidebar').exists()).toBeFalsy() }) it('should be false if one user is given', () => { const { wrapper } = getWrapper({ props: { user: defaultUser, users: [defaultUser] } }) - expect(wrapper.vm.multipleUsers).toBeFalsy() + expect(wrapper.find('#oc-users-details-multiple-sidebar').exists()).toBeFalsy() }) it('should be true if multiple users are given', () => { const { wrapper } = getWrapper({ props: { user: null, users: [defaultUser, { displayName: 'user2' } as User] } }) - expect(wrapper.vm.multipleUsers).toBeTruthy() + expect(wrapper.find('#oc-users-details-multiple-sidebar').exists()).toBeTruthy() }) }) }) From 1f7a4b7c199bd221193ef6a2b4f43f2d3c3eb84a Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Thu, 2 Oct 2025 06:55:16 +0200 Subject: [PATCH 6/6] test: add unit test for adding multiple users to groups --- .../components/Users/RemoveFromGroupsModal.spec.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts index 63403b0033..1c334bf982 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts @@ -21,6 +21,18 @@ describe('RemoveFromGroupsModal', () => { const input = wrapper.findComponent('group-select-stub') expect(input.props('groupOptions').length).toBe(1) }) + it('lists a sum of all assigned groups when multiple users are selected', () => { + const assignedGroup = mock({ id: '1' }) + const assignedGroup2 = mock({ id: '2' }) + const users = [ + mock({ memberOf: [assignedGroup] }), + mock({ memberOf: [assignedGroup, assignedGroup2] }) + ] + const groups = [assignedGroup, assignedGroup2, mock()] + const { wrapper } = getWrapper({ users, groups }) + const input = wrapper.findComponent('group-select-stub') + expect(input.props('groupOptions').length).toBe(2) + }) }) describe('method "onConfirm"', () => {