aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorChristopher Ng <chrng8@gmail.com>2024-07-11 11:19:09 -0700
committerChristopher Ng <chrng8@gmail.com>2024-07-11 11:19:09 -0700
commit07319a118bb60ec067ad71c20098e4eba2a95b7a (patch)
tree8ac4fa69b0a83266d43d8d21248225fb9303699b /apps
parent19c8c63f3204da0e1feb7c2c832c66fd1a477bd2 (diff)
downloadnextcloud-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.php8
-rw-r--r--apps/settings/src/components/UserList.vue10
-rw-r--r--apps/settings/src/components/Users/NewUserDialog.vue4
-rw-r--r--apps/settings/src/composables/useGroupsNavigation.ts9
-rw-r--r--apps/settings/src/store/users.js32
-rw-r--r--apps/settings/src/views/UserManagementNavigation.vue19
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)