From fcf42c4f8623592b5c8a7c63c1a8ff482d71ee43 Mon Sep 17 00:00:00 2001 From: Christopher Ng Date: Tue, 25 Mar 2025 14:31:44 -0700 Subject: [PATCH] fix(settings): Fix infinitely loading account management page with pagination of groups - Includes searching Signed-off-by: Christopher Ng --- .../src/components/AppNavigationGroupList.vue | 212 ++++++++++++++++++ .../settings/src/components/GroupListItem.vue | 1 + apps/settings/src/store/users.js | 62 +++-- apps/settings/src/views/UserManagement.vue | 5 - .../src/views/UserManagementNavigation.vue | 90 +------- apps/settings/src/views/user-types.d.ts | 17 ++ 6 files changed, 282 insertions(+), 105 deletions(-) create mode 100644 apps/settings/src/components/AppNavigationGroupList.vue diff --git a/apps/settings/src/components/AppNavigationGroupList.vue b/apps/settings/src/components/AppNavigationGroupList.vue new file mode 100644 index 00000000000..d5362d6cf4c --- /dev/null +++ b/apps/settings/src/components/AppNavigationGroupList.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/apps/settings/src/components/GroupListItem.vue b/apps/settings/src/components/GroupListItem.vue index 19786507b48..65d46136ec1 100644 --- a/apps/settings/src/components/GroupListItem.vue +++ b/apps/settings/src/components/GroupListItem.vue @@ -29,6 +29,7 @@ Object.assign({}, defaults.group, group)) - state.orderBy = orderBy - state.userCount = userCount - }, - addGroup(state, { gid, displayName }) { + /** + * @param {object} state store state + * @param {import('../views/user-types.js').IGroup} newGroup new group + */ + addGroup(state, newGroup) { try { - if (typeof state.groups.find((group) => group.id === gid) !== 'undefined') { + if (typeof state.groups.find((group) => group.id === newGroup.id) !== 'undefined') { return } // extend group to default values - const group = Object.assign({}, defaults.group, { - id: gid, - name: displayName, - }) + const group = Object.assign({}, defaults.group, newGroup) state.groups.unshift(group) } catch (e) { console.error('Can\'t create group', e) @@ -215,6 +217,15 @@ const mutations = { state.disabledUsersOffset = 0 }, + /** + * Reset group list + * + * @param {object} state the store state + */ + resetGroups(state) { + state.groups = [...usersSettings.systemGroups] + }, + setShowConfig(state, { key, value }) { localStorage.setItem(`account_settings__${key}`, JSON.stringify(value)) state.showConfig[key] = value @@ -312,6 +323,25 @@ const actions = { }) }, + /** + * search groups + * + * @param {object} context Store context + * @param {object} options Options + * @param {string} options.search Search query + * @param {number} options.offset List offset + * @param {number} options.limit List limit + * @return {Promise} + */ + searchGroups(context, { search, offset, limit }) { + return api.get(generateOcsUrl('cloud/groups/details?search={search}&offset={offset}&limit={limit}', { search, offset, limit })) + .catch((error) => { + if (!axios.isCancel(error)) { + context.commit('API_FAILURE', error) + } + }) + }, + /** * Get user details * @@ -444,7 +474,7 @@ const actions = { .then((response) => { if (Object.keys(response.data.ocs.data.groups).length > 0) { response.data.ocs.data.groups.forEach(function(group) { - context.commit('addGroup', { gid: group, displayName: group }) + context.commit('addGroup', { id: group, name: group }) }) return true } @@ -511,7 +541,7 @@ const actions = { return api.requireAdmin().then((response) => { return api.post(generateOcsUrl('cloud/groups'), { groupid: gid }) .then((response) => { - context.commit('addGroup', { gid, displayName: gid }) + context.commit('addGroup', { id: gid, name: gid }) return { gid, displayName: gid } }) .catch((error) => { throw error }) diff --git a/apps/settings/src/views/UserManagement.vue b/apps/settings/src/views/UserManagement.vue index d09f0a76f81..9ab76f921a0 100644 --- a/apps/settings/src/views/UserManagement.vue +++ b/apps/settings/src/views/UserManagement.vue @@ -55,11 +55,6 @@ export default defineComponent({ }, beforeMount() { - this.$store.commit('initGroups', { - groups: this.$store.getters.getServerData.groups, - orderBy: this.$store.getters.getServerData.sortGroups, - userCount: this.$store.getters.getServerData.userCount, - }) this.$store.dispatch('getPasswordPolicyMinLength') }, diff --git a/apps/settings/src/views/UserManagementNavigation.vue b/apps/settings/src/views/UserManagementNavigation.vue index f4c8c646ae2..7588429fbce 100644 --- a/apps/settings/src/views/UserManagementNavigation.vue +++ b/apps/settings/src/views/UserManagementNavigation.vue @@ -79,42 +79,7 @@ - - - - - - +