diff --git a/apps/settings/lib/Controller/UsersController.php b/apps/settings/lib/Controller/UsersController.php index 82024340eaf8c..e5699f0bf0333 100644 --- a/apps/settings/lib/Controller/UsersController.php +++ b/apps/settings/lib/Controller/UsersController.php @@ -164,6 +164,12 @@ public function usersList(): TemplateResponse { $userCount -= $disabledUsers; } + $recentUsersGroup = [ + 'id' => 'recent', + 'name' => 'Recent accounts', + 'usercount' => $userCount, + ]; + $disabledUsersGroup = [ 'id' => 'disabled', 'name' => 'Disabled accounts', @@ -192,7 +198,7 @@ public function usersList(): TemplateResponse { /* FINAL DATA */ $serverData = []; // groups - $serverData['groups'] = array_merge_recursive($adminGroup, [$disabledUsersGroup], $groups); + $serverData['groups'] = array_merge_recursive($adminGroup, [$recentUsersGroup, $disabledUsersGroup], $groups); // Various data $serverData['isAdmin'] = $isAdmin; $serverData['sortGroups'] = $forceSortGroupByName diff --git a/apps/settings/src/components/UserList.vue b/apps/settings/src/components/UserList.vue index 4fc9ee5b70f48..6afb83fc00e93 100644 --- a/apps/settings/src/components/UserList.vue +++ b/apps/settings/src/components/UserList.vue @@ -177,9 +177,9 @@ export default { }, groups() { - // data provided php side + remove the disabled group + // data provided php side + remove the recent and disabled groups return this.$store.getters.getGroups - .filter(group => group.id !== 'disabled') + .filter(group => group.id !== 'recent' && group.id !== 'disabled') .sort((a, b) => a.name.localeCompare(b.name)) }, @@ -298,6 +298,12 @@ export default { limit: this.disabledUsersLimit, search: this.searchQuery, }) + } else if (this.selectedGroup === 'recent') { + await this.$store.dispatch('getRecentUsers', { + offset: this.usersOffset, + limit: this.usersLimit, + search: this.searchQuery, + }) } else { await this.$store.dispatch('getUsers', { offset: this.usersOffset, diff --git a/apps/settings/src/components/Users/NewUserDialog.vue b/apps/settings/src/components/Users/NewUserDialog.vue index f7dc0d21a34a1..62fbfd5832f6b 100644 --- a/apps/settings/src/components/Users/NewUserDialog.vue +++ b/apps/settings/src/components/Users/NewUserDialog.vue @@ -200,9 +200,9 @@ export default { }, groups() { - // data provided php side + remove the disabled group + // data provided php side + remove the recent and disabled groups return this.$store.getters.getGroups - .filter(group => group.id !== 'disabled') + .filter(group => group.id !== 'recent' && group.id !== 'disabled') .sort((a, b) => a.name.localeCompare(b.name)) }, diff --git a/apps/settings/src/composables/useGroupsNavigation.ts b/apps/settings/src/composables/useGroupsNavigation.ts index fc4e71bb6b2cc..a0de33294caf1 100644 --- a/apps/settings/src/composables/useGroupsNavigation.ts +++ b/apps/settings/src/composables/useGroupsNavigation.ts @@ -34,7 +34,7 @@ export const useFormatGroups = (groups: Ref|ComputedRef) => const userGroups = computed(() => { const formatted = groups.value // filter out disabled and admin - .filter(group => group.id !== 'disabled' && group.id !== 'admin') + .filter(group => group.id !== 'disabled' && group.id !== 'recent' && group.id !== 'admin') // format group .map(group => formatGroupMenu(group)) // remove invalid @@ -52,5 +52,10 @@ export const useFormatGroups = (groups: Ref|ComputedRef) => */ const disabledGroup = computed(() => formatGroupMenu(groups.value.find(group => group.id === 'disabled'))) - return { adminGroup, disabledGroup, userGroups } + /** + * The group of recent users + */ + const recentGroup = computed(() => formatGroupMenu(groups.value.find(group => group.id === 'recent'))) + + return { adminGroup, recentGroup, disabledGroup, userGroups } } diff --git a/apps/settings/src/store/users.js b/apps/settings/src/store/users.js index 03a10b04b5dd5..edce8b8570a6a 100644 --- a/apps/settings/src/store/users.js +++ b/apps/settings/src/store/users.js @@ -146,11 +146,13 @@ const mutations = { return } + const recentGroup = state.groups.find(group => group.id === 'recent') const disabledGroup = state.groups.find(group => group.id === 'disabled') switch (actionType) { case 'enable': case 'disable': disabledGroup.usercount += user.enabled ? -1 : 1 // update Disabled Users count + recentGroup.usercount += user.enabled ? 1 : -1 state.userCount += user.enabled ? 1 : -1 // update Active Users count user.groups.forEach(userGroup => { const group = state.groups.find(groupSearch => groupSearch.id === userGroup) @@ -158,6 +160,7 @@ const mutations = { }) break case 'create': + recentGroup.usercount++ state.userCount++ // increment Active Users count user.groups.forEach(userGroup => { @@ -168,6 +171,7 @@ const mutations = { break case 'remove': if (user.enabled) { + recentGroup.usercount-- state.userCount-- // decrement Active Users count user.groups.forEach(userGroup => { const group = state.groups.find(groupSearch => groupSearch.id === userGroup) @@ -241,8 +245,8 @@ const getters = { return state.groups }, getSubadminGroups(state) { - // Can't be subadmin of admin or disabled - return state.groups.filter(group => group.id !== 'admin' && group.id !== 'disabled') + // Can't be subadmin of admin, recent, or disabled + return state.groups.filter(group => group.id !== 'admin' && group.id !== 'recent' && group.id !== 'disabled') }, getSortedGroups(state) { const groups = [...state.groups] @@ -383,6 +387,30 @@ const actions = { }) }, + /** + * Get recent users with full details + * + * @param {object} context store context + * @param {object} options destructuring object + * @param {number} options.offset List offset to request + * @param {number} options.limit List number to return from offset + * @param {string} options.search Search query + * @return {Promise} + */ + async getRecentUsers(context, { offset, limit, search }) { + const url = generateOcsUrl('cloud/users/recent?offset={offset}&limit={limit}&search={search}', { offset, limit, search }) + try { + const response = await api.get(url) + const usersCount = Object.keys(response.data.ocs.data.users).length + if (usersCount > 0) { + context.commit('appendUsers', response.data.ocs.data.users) + } + return usersCount + } catch (error) { + context.commit('API_FAILURE', error) + } + }, + /** * Get disabled users with full details * diff --git a/apps/settings/src/views/UserManagementNavigation.vue b/apps/settings/src/views/UserManagementNavigation.vue index 0c98784135b60..54849bf1de9be 100644 --- a/apps/settings/src/views/UserManagementNavigation.vue +++ b/apps/settings/src/views/UserManagementNavigation.vue @@ -46,6 +46,21 @@ + + + + +