diff options
author | Christopher Ng <chrng8@gmail.com> | 2024-07-11 11:19:09 -0700 |
---|---|---|
committer | Christopher Ng <chrng8@gmail.com> | 2024-07-11 11:19:09 -0700 |
commit | 07319a118bb60ec067ad71c20098e4eba2a95b7a (patch) | |
tree | 8ac4fa69b0a83266d43d8d21248225fb9303699b /apps | |
parent | 19c8c63f3204da0e1feb7c2c832c66fd1a477bd2 (diff) | |
download | nextcloud-server-07319a118bb60ec067ad71c20098e4eba2a95b7a.tar.gz nextcloud-server-07319a118bb60ec067ad71c20098e4eba2a95b7a.zip |
feat: Add Recent accounts section
Signed-off-by: Christopher Ng <chrng8@gmail.com>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/settings/lib/Controller/UsersController.php | 8 | ||||
-rw-r--r-- | apps/settings/src/components/UserList.vue | 10 | ||||
-rw-r--r-- | apps/settings/src/components/Users/NewUserDialog.vue | 4 | ||||
-rw-r--r-- | apps/settings/src/composables/useGroupsNavigation.ts | 9 | ||||
-rw-r--r-- | apps/settings/src/store/users.js | 32 | ||||
-rw-r--r-- | apps/settings/src/views/UserManagementNavigation.vue | 19 |
6 files changed, 71 insertions, 11 deletions
diff --git a/apps/settings/lib/Controller/UsersController.php b/apps/settings/lib/Controller/UsersController.php index 82024340eaf..b6a5738a021 100644 --- a/apps/settings/lib/Controller/UsersController.php +++ b/apps/settings/lib/Controller/UsersController.php @@ -164,6 +164,12 @@ class UsersController extends Controller { $userCount -= $disabledUsers; } + $recentUsersGroup = [ + 'id' => '__nc_internal_recent', + 'name' => 'Recent accounts', + 'usercount' => $userCount, + ]; + $disabledUsersGroup = [ 'id' => 'disabled', 'name' => 'Disabled accounts', @@ -192,7 +198,7 @@ class UsersController extends Controller { /* 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 4fc9ee5b70f..1fcfe8e6e1b 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 !== '__nc_internal_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 === '__nc_internal_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 f7dc0d21a34..29bfc277e18 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 !== '__nc_internal_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 fc4e71bb6b2..6235088f944 100644 --- a/apps/settings/src/composables/useGroupsNavigation.ts +++ b/apps/settings/src/composables/useGroupsNavigation.ts @@ -34,7 +34,7 @@ export const useFormatGroups = (groups: Ref<IGroup[]>|ComputedRef<IGroup[]>) => 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 !== '__nc_internal_recent' && group.id !== 'admin') // format group .map(group => formatGroupMenu(group)) // remove invalid @@ -52,5 +52,10 @@ export const useFormatGroups = (groups: Ref<IGroup[]>|ComputedRef<IGroup[]>) => */ 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 === '__nc_internal_recent'))) + + return { adminGroup, recentGroup, disabledGroup, userGroups } } diff --git a/apps/settings/src/store/users.js b/apps/settings/src/store/users.js index 03a10b04b5d..8b60b3ab328 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 === '__nc_internal_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 !== '__nc_internal_recent' && group.id !== 'disabled') }, getSortedGroups(state) { const groups = [...state.groups] @@ -384,6 +388,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<number>} + */ + 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 * * @param {object} context store context diff --git a/apps/settings/src/views/UserManagementNavigation.vue b/apps/settings/src/views/UserManagementNavigation.vue index 0c98784135b..3d32d9319af 100644 --- a/apps/settings/src/views/UserManagementNavigation.vue +++ b/apps/settings/src/views/UserManagementNavigation.vue @@ -46,6 +46,21 @@ </template> </NcAppNavigationItem> + <NcAppNavigationItem id="recent" + :exact="true" + :name="t('settings', 'Recent accounts')" + :to="{ name: 'group', params: { selectedGroup: '__nc_internal_recent' } }"> + <template #icon> + <NcIconSvgWrapper :path="mdiHistory" /> + </template> + <template #counter> + <NcCounterBubble v-if="recentGroup?.usercount > 0" + :type="selectedGroupDecoded === '__nc_internal_recent' ? 'highlighted' : undefined"> + {{ recentGroup.usercount }} + </NcCounterBubble> + </template> + </NcAppNavigationItem> + <!-- Hide the disabled if none, if we don't have the data (-1) show it --> <NcAppNavigationItem v-if="disabledGroup && (disabledGroup.usercount > 0 || disabledGroup.usercount === -1)" id="disabled" @@ -115,7 +130,7 @@ </template> <script setup lang="ts"> -import { mdiAccount, mdiAccountOff, mdiCog, mdiPlus, mdiShieldAccount } from '@mdi/js' +import { mdiAccount, mdiAccountOff, mdiCog, mdiPlus, mdiShieldAccount, mdiHistory } from '@mdi/js' import { showError } from '@nextcloud/dialogs' import { translate as t } from '@nextcloud/l10n' import { computed, ref } from 'vue' @@ -154,7 +169,7 @@ const selectedGroupDecoded = computed(() => selectedGroup.value ? decodeURICompo const userCount = computed(() => store.getters.getUserCount) /** All available groups */ const groups = computed(() => store.getters.getSortedGroups) -const { adminGroup, disabledGroup, userGroups } = useFormatGroups(groups) +const { adminGroup, recentGroup, disabledGroup, userGroups } = useFormatGroups(groups) /** True if the current user is an administrator */ const isAdmin = computed(() => store.getters.getServerData.isAdmin) |