diff --git a/packages/web-app-admin-settings/src/components/Spaces/SpacesList.vue b/packages/web-app-admin-settings/src/components/Spaces/SpacesList.vue index eb581aa01ae..66a99160e92 100644 --- a/packages/web-app-admin-settings/src/components/Spaces/SpacesList.vue +++ b/packages/web-app-admin-settings/src/components/Spaces/SpacesList.vue @@ -263,16 +263,6 @@ onBeforeUnmount(() => { eventBus.unsubscribe('app.files.spaces.uploaded-image', uploadedImageToken) }) -// e.g. after deleting all spaces of the last page: show the new last page instead of an empty one -watch(totalPages, async (pageCount) => { - if (pageCount > 0 && unref(currentPage) > pageCount) { - await router.push({ - ...unref(route), - query: { ...unref(route).query, page: String(pageCount) } - }) - } -}) - // the selection is kept across pages, so only the spaces of the current page count const allSpacesSelected = computed( () => unref(paginatedItems).length > 0 && unref(paginatedItems).every(isSpaceSelected) diff --git a/packages/web-app-admin-settings/src/composables/actions/groups/useGroupActionsDelete.ts b/packages/web-app-admin-settings/src/composables/actions/groups/useGroupActionsDelete.ts index 8cf0a713017..5b47b7d2e17 100644 --- a/packages/web-app-admin-settings/src/composables/actions/groups/useGroupActionsDelete.ts +++ b/packages/web-app-admin-settings/src/composables/actions/groups/useGroupActionsDelete.ts @@ -1,9 +1,7 @@ -import { computed, unref } from 'vue' +import { computed } from 'vue' import { - queryItemAsString, useMessages, useModals, - useRouteQuery, isPromiseFulfilled, isPromiseRejected } from '@opencloud-eu/web-pkg' @@ -20,16 +18,6 @@ export function useGroupActionsDelete() { const { dispatchModal } = useModals() const groupSettingsStore = useGroupSettingsStore() - const currentPageQuery = useRouteQuery('page', '1') - const currentPage = computed(() => { - return parseInt(queryItemAsString(unref(currentPageQuery))) - }) - - const itemsPerPageQuery = useRouteQuery('items-per-page', '1') - const itemsPerPage = computed(() => { - return parseInt(queryItemAsString(unref(itemsPerPageQuery))) - }) - async function deleteGroups(groups: Group[]) { const graphClient = clientService.graphAuthenticated const promises = groups.map((group) => graphClient.groups.deleteGroup(group.id)) @@ -70,12 +58,6 @@ export function useGroupActionsDelete() { groupSettingsStore.removeGroups(groups.filter((_, i) => isPromiseFulfilled(results[i]))) groupSettingsStore.setSelectedGroups([]) - - const pageCount = Math.ceil(groupSettingsStore.groups.length / unref(itemsPerPage)) - if (unref(currentPage) > 1 && unref(currentPage) > pageCount) { - // reset pagination to avoid empty lists (happens when deleting all items on the last page) - currentPageQuery.value = pageCount.toString() - } } function handler({ resources }: GroupActionOptions) { diff --git a/packages/web-app-admin-settings/tests/unit/components/Groups/GroupsList.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Groups/GroupsList.spec.ts index fe474ecde01..98900fc9b9a 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Groups/GroupsList.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Groups/GroupsList.spec.ts @@ -11,6 +11,7 @@ import { Group } from '@opencloud-eu/web-client/graph/generated' import { SortDir } from '@opencloud-eu/design-system/helpers' import { OcCheckbox, OcTable } from '@opencloud-eu/design-system/components' import { RouteLocationNormalizedLoaded } from 'vue-router' +import { nextTick } from 'vue' const getGroupMocks = () => [ @@ -72,6 +73,27 @@ describe('GroupsList', () => { }) }) + describe('pagination', () => { + it('shows the last page when the current page runs out of filtered groups', async () => { + const { wrapper } = getWrapper({ + groups: [ + { id: '1', displayName: 'admins' }, + { id: '2', displayName: 'admins2' }, + { id: '3', displayName: 'users' } + ] as Group[], + filterTerm: 'admins', + query: { page: '2', 'items-per-page': '1' } + }) + expect(getTableData(wrapper).map((g) => g.displayName)).toEqual(['admins2']) + + const groupSettingsStore = useGroupSettingsStore() + groupSettingsStore.groups = groupSettingsStore.groups.filter((g) => g.id !== '2') + await nextTick() + + expect(getTableData(wrapper).map((g) => g.displayName)).toEqual(['admins']) + }) + }) + it('should show the group details on details button click', async () => { const groups = getGroupMocks() const { wrapper } = getWrapper({ mountType: mount, groups }) diff --git a/packages/web-app-admin-settings/tests/unit/components/Spaces/SpacesList.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Spaces/SpacesList.spec.ts index d939d5e8500..0a1e8938db9 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Spaces/SpacesList.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Spaces/SpacesList.spec.ts @@ -127,23 +127,16 @@ describe('SpacesList', () => { describe('pagination', () => { it('shows the new last page if the current page gets empty, e.g. after deleting spaces', async () => { - const { mocks } = getWrapper({ - mountType: shallowMount, - stubActions: false, - page: '2', - perPage: '1' - }) + const { wrapper } = getWrapper({ stubActions: false, page: '2', perPage: '1' }) const spacesStore = useSpacesStore() spacesStore.setAllProjectSpaces(spaceMocks.map((space) => ({ ...space })) as SpaceResource[]) await flushPromises() - expect(mocks.$router.push).not.toHaveBeenCalled() + expect(getColumn(wrapper, 'name')).toEqual(['2 Another space']) spacesStore.removeSpace(spaceMocks[1]) await flushPromises() - expect(mocks.$router.push).toHaveBeenCalledWith( - expect.objectContaining({ query: expect.objectContaining({ page: '1' }) }) - ) + expect(getColumn(wrapper, 'name')).toEqual(['1 Some space']) }) }) diff --git a/packages/web-app-files/src/views/spaces/GenericTrash.vue b/packages/web-app-files/src/views/spaces/GenericTrash.vue index 991c24cfa45..d37af183195 100644 --- a/packages/web-app-files/src/views/spaces/GenericTrash.vue +++ b/packages/web-app-files/src/views/spaces/GenericTrash.vue @@ -10,7 +10,7 @@