diff --git a/changelog/unreleased/enhancement-admin-settings-groups-add-members-panel b/changelog/unreleased/enhancement-admin-settings-groups-add-members-panel
new file mode 100644
index 00000000000..a95356ca04c
--- /dev/null
+++ b/changelog/unreleased/enhancement-admin-settings-groups-add-members-panel
@@ -0,0 +1,6 @@
+Enhancement: Admin settings groups members panel
+
+We've added the members panel to the groups page in admin settings.
+
+https://github.com/owncloud/web/pull/8826
+https://github.com/owncloud/web/issues/8596
diff --git a/packages/web-app-admin-settings/src/components/Groups/SideBar/MembersPanel.vue b/packages/web-app-admin-settings/src/components/Groups/SideBar/MembersPanel.vue
new file mode 100644
index 00000000000..0ea5b6e7f1c
--- /dev/null
+++ b/packages/web-app-admin-settings/src/components/Groups/SideBar/MembersPanel.vue
@@ -0,0 +1,81 @@
+
+
+
+
diff --git a/packages/web-app-admin-settings/src/components/Groups/SideBar/MembersRoleSection.vue b/packages/web-app-admin-settings/src/components/Groups/SideBar/MembersRoleSection.vue
new file mode 100644
index 00000000000..d9aaeee2ed8
--- /dev/null
+++ b/packages/web-app-admin-settings/src/components/Groups/SideBar/MembersRoleSection.vue
@@ -0,0 +1,27 @@
+
+
+ -
+
+ {{ member.displayName }}
+
+
+
+
diff --git a/packages/web-app-admin-settings/src/views/Groups.vue b/packages/web-app-admin-settings/src/views/Groups.vue
index 29937f35210..965531d2db1 100644
--- a/packages/web-app-admin-settings/src/views/Groups.vue
+++ b/packages/web-app-admin-settings/src/views/Groups.vue
@@ -84,6 +84,7 @@ import { useClientService, useStore } from 'web-pkg/src/composables'
import AppTemplate from '../components/AppTemplate.vue'
import { useSideBar } from 'web-pkg/src/composables/sideBar'
import { useGroupActionsDelete } from '../composables/actions/groups'
+import MembersPanel from '../components/Groups/SideBar/MembersPanel.vue'
export default defineComponent({
components: {
@@ -93,6 +94,11 @@ export default defineComponent({
CreateGroupModal,
ContextActions
},
+ provide() {
+ return {
+ group: computed(() => this.selectedGroups[0])
+ }
+ },
setup() {
const store = useStore()
const groups = ref([])
@@ -192,6 +198,14 @@ export default defineComponent({
group: this.selectedGroups.length === 1 ? this.selectedGroups[0] : null,
onConfirm: this.editGroup
}
+ },
+ {
+ app: 'GroupMembers',
+ icon: 'group',
+ title: this.$gettext('Members'),
+ component: MembersPanel,
+ default: false,
+ enabled: this.selectedGroups.length === 1
}
].filter((p) => p.enabled)
}
diff --git a/packages/web-app-admin-settings/tests/unit/components/Groups/SideBar/MembersPanel.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Groups/SideBar/MembersPanel.spec.ts
new file mode 100644
index 00000000000..c566816b524
--- /dev/null
+++ b/packages/web-app-admin-settings/tests/unit/components/Groups/SideBar/MembersPanel.spec.ts
@@ -0,0 +1,47 @@
+import MembersPanel from '../../../../../src/components/Groups/SideBar/MembersPanel.vue'
+import { defaultPlugins, shallowMount } from 'web-test-helpers'
+import { mock } from 'jest-mock-extended'
+import { Group } from 'web-client/src/generated'
+
+const groupMock = mock({
+ id: '1',
+ groupTypes: [],
+ members: [{ displayName: 'Albert Einstein' }]
+})
+const selectors = {
+ membersRolePanelStub: 'members-role-section-stub'
+}
+
+describe('MembersPanel', () => {
+ it('should render all members accordingly to their role assignments', () => {
+ const { wrapper } = getWrapper()
+ expect(wrapper.html()).toMatchSnapshot()
+ })
+ it('should filter members accordingly to the entered search term', async () => {
+ const { wrapper } = getWrapper()
+ wrapper.vm.filterTerm = 'ein'
+ await wrapper.vm.$nextTick
+ expect(wrapper.findAll(selectors.membersRolePanelStub).length).toBe(1)
+ expect(
+ wrapper.findComponent(selectors.membersRolePanelStub).props().groupMembers[0].displayName
+ ).toEqual('Albert Einstein')
+ })
+ it('should display an empty result if no matching members found', async () => {
+ const { wrapper } = getWrapper()
+ wrapper.vm.filterTerm = 'no-match'
+ await wrapper.vm.$nextTick
+ expect(wrapper.findAll(selectors.membersRolePanelStub).length).toBe(0)
+ expect(wrapper.html()).toMatchSnapshot()
+ })
+})
+
+function getWrapper({ group = groupMock } = {}) {
+ return {
+ wrapper: shallowMount(MembersPanel, {
+ global: {
+ plugins: [...defaultPlugins()],
+ provide: { group: group }
+ }
+ })
+ }
+}
diff --git a/packages/web-app-admin-settings/tests/unit/components/Groups/SideBar/__snapshots__/MembersPanel.spec.ts.snap b/packages/web-app-admin-settings/tests/unit/components/Groups/SideBar/__snapshots__/MembersPanel.spec.ts.snap
new file mode 100644
index 00000000000..2d09187d029
--- /dev/null
+++ b/packages/web-app-admin-settings/tests/unit/components/Groups/SideBar/__snapshots__/MembersPanel.spec.ts.snap
@@ -0,0 +1,26 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`MembersPanel should display an empty result if no matching members found 1`] = `
+
+
+
+
+
No members found
+
+
+
+
+`;
+
+exports[`MembersPanel should render all members accordingly to their role assignments 1`] = `
+
+`;