]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(files): Fix legacy files list sorting 39919/head
authorFerdinand Thiessen <opensource@fthiessen.de>
Wed, 16 Aug 2023 18:11:31 +0000 (20:11 +0200)
committerFerdinand Thiessen <opensource@fthiessen.de>
Sat, 19 Aug 2023 13:08:39 +0000 (15:08 +0200)
The sorting was not saved since files2vue changes in Nextcloud 27, as a new API endpoint
was introduced and the old one was dropped without adjusting the legacy file list to use it.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
apps/files/js/filelist.js
apps/files/lib/Controller/ViewController.php
apps/files/tests/js/filelistSpec.js
cypress/e2e/files.cy.ts

index cfc21e909c06639bb92f4d46f417544f0a4a36fd..af776cb8cd52b922698f2fa4d557935d001042f1 100644 (file)
                        }
 
                        if (persist && OC.getCurrentUser().uid) {
-                               $.post(OC.generateUrl('/apps/files/api/v1/sorting'), {
-                                       // Compatibility with new files-to-vue API
-                                       mode: sort === 'name' ? 'basename' : sort,
-                                       direction: direction,
-                                       view: 'files'
+                               $.ajax({
+                                       type: 'PUT',
+                                       url: OC.generateUrl('apps/files/api/v1/views/files/sorting_mode'),
+                                       contentType: 'application/json',
+                                       data: JSON.stringify({
+                                               // Compatibility with new files-to-vue API
+                                               value: sort === 'name' ? 'basename' : sort,
+                                       })
+                               });
+                               $.ajax({
+                                       type: 'PUT',
+                                       url: OC.generateUrl('apps/files/api/v1/views/files/sorting_direction'),
+                                       contentType: 'application/json',
+                                       data: JSON.stringify({
+                                               value: direction,
+                                       })
                                });
                        }
                },
index 70e0fd4845654cc5271757708ca43f9f37f80b6d..d06ea49ed17487775c3b8e617c231e5ef45fa2d0 100644 (file)
@@ -255,7 +255,7 @@ class ViewController extends Controller {
                $this->initialState->provideInitialState('viewConfigs', $this->viewConfig->getConfigs());
 
                // File sorting user config
-               $filesSortingConfig = json_decode($this->config->getUserValue($userId, 'files', 'files_sorting_configs', '{}'), true);
+               $filesSortingConfig = $this->viewConfig->getConfigs();
                $this->initialState->provideInitialState('filesSortingConfig', $filesSortingConfig);
 
                // render the container content for every navigation item
@@ -301,8 +301,8 @@ class ViewController extends Controller {
                $params['ownerDisplayName'] = $storageInfo['ownerDisplayName'] ?? '';
                $params['isPublic'] = false;
                $params['allowShareWithLink'] = $this->shareManager->shareApiAllowLinks() ? 'yes' : 'no';
-               $params['defaultFileSorting'] = $filesSortingConfig['files']['mode'] ?? 'basename';
-               $params['defaultFileSortingDirection'] = $filesSortingConfig['files']['direction'] ?? 'asc';
+               $params['defaultFileSorting'] = $filesSortingConfig['files']['sorting_mode'] ?? 'basename';
+               $params['defaultFileSortingDirection'] = $filesSortingConfig['files']['sorting_direction'] ?? 'asc';
                $params['showgridview'] = $this->config->getUserValue($userId, 'files', 'show_grid', false);
                $showHidden = (bool) $this->config->getUserValue($userId, 'files', 'show_hidden', false);
                $params['showHiddenFiles'] = $showHidden ? 1 : 0;
index f2caa176973295ddb04f853e6033be437bef9099..b7f9fb2ff39d21436d218cf371153dd930d03eeb 100644 (file)
@@ -2561,10 +2561,11 @@ describe('OCA.Files.FileList tests', function() {
                });
 
                it('Toggles the sort indicator when clicking on a column header', function() {
-                       var ASC_CLASS = fileList.SORT_INDICATOR_ASC_CLASS;
-                       var DESC_CLASS = fileList.SORT_INDICATOR_DESC_CLASS;
+                       const ASC_CLASS = fileList.SORT_INDICATOR_ASC_CLASS;
+                       const DESC_CLASS = fileList.SORT_INDICATOR_DESC_CLASS;
                        var request;
-                       var sortingUrl = OC.generateUrl('/apps/files/api/v1/sorting');
+                       const sortingDirectionUrl = OC.generateUrl('/apps/files/api/v1/views/files/sorting_direction');
+                       const sortingModeUrl = OC.generateUrl('/apps/files/api/v1/views/files/sorting_mode');
                        fileList.$el.find('.column-size .columntitle').click();
                        // moves triangle to size column, check indicator on name is hidden
                        expect(
@@ -2578,9 +2579,9 @@ describe('OCA.Files.FileList tests', function() {
                                fileList.$el.find('.column-size .sort-indicator').hasClass(DESC_CLASS)
                        ).toEqual(true);
                        // check if changes are persisted
-                       expect(fakeServer.requests.length).toEqual(1);
-                       request = fakeServer.requests[0];
-                       expect(request.url).toEqual(sortingUrl);
+                       expect(fakeServer.requests.length).toEqual(2);
+                       expect(fakeServer.requests.some((request) => request.url === sortingDirectionUrl)).toBe(true)
+                       expect(fakeServer.requests.some((request) => request.url === sortingModeUrl)).toBe(true)
 
                        // click again on size column, reverses direction
                        fileList.$el.find('.column-size .columntitle').click();
@@ -2591,9 +2592,9 @@ describe('OCA.Files.FileList tests', function() {
                                fileList.$el.find('.column-size .sort-indicator').hasClass(ASC_CLASS)
                        ).toEqual(true);
                        // check if changes are persisted
-                       expect(fakeServer.requests.length).toEqual(2);
-                       request = fakeServer.requests[1];
-                       expect(request.url).toEqual(sortingUrl);
+                       expect(fakeServer.requests.length).toEqual(4);
+                       expect(fakeServer.requests.slice(2).some((request) => request.url === sortingDirectionUrl)).toBe(true)
+                       expect(fakeServer.requests.slice(2).some((request) => request.url === sortingModeUrl)).toBe(true)
 
                        // click again on size column, reverses direction
                        fileList.$el.find('.column-size .columntitle').click();
@@ -2603,9 +2604,9 @@ describe('OCA.Files.FileList tests', function() {
                        expect(
                                fileList.$el.find('.column-size .sort-indicator').hasClass(DESC_CLASS)
                        ).toEqual(true);
-                       expect(fakeServer.requests.length).toEqual(3);
-                       request = fakeServer.requests[2];
-                       expect(request.url).toEqual(sortingUrl);
+                       expect(fakeServer.requests.length).toEqual(6);
+                       expect(fakeServer.requests.slice(4).some((request) => request.url === sortingDirectionUrl)).toBe(true)
+                       expect(fakeServer.requests.slice(4).some((request) => request.url === sortingModeUrl)).toBe(true)
 
                        // click on mtime column, moves indicator there
                        fileList.$el.find('.column-mtime .columntitle').click();
@@ -2618,10 +2619,11 @@ describe('OCA.Files.FileList tests', function() {
                        expect(
                                fileList.$el.find('.column-mtime .sort-indicator').hasClass(DESC_CLASS)
                        ).toEqual(true);
-                       expect(fakeServer.requests.length).toEqual(4);
-                       request = fakeServer.requests[3];
-                       expect(request.url).toEqual(sortingUrl);
+                       expect(fakeServer.requests.length).toEqual(8);
+                       expect(fakeServer.requests.slice(6).some((request) => request.url === sortingDirectionUrl)).toBe(true)
+                       expect(fakeServer.requests.slice(6).some((request) => request.url === sortingModeUrl)).toBe(true)
                });
+
                it('Uses correct sort comparator when inserting files', function() {
                        testFiles.sort(OCA.Files.FileList.Comparators.size);
                        testFiles.reverse();    //default is descending
index ab2c22a8776e84489bb5548e39579dd92ac0e0a0..381d83912b81c2793c430908f04c90c6361c5d08 100644 (file)
@@ -30,18 +30,12 @@ const startCopyMove = (file: string) => {
 }
 
 describe('Login with a new user and open the files app', function() {
-       let currentUser: User
-       beforeEach(function() {
+       before(function() {
                cy.createRandomUser().then((user) => {
-                       currentUser = user
                        cy.login(user)
                })
        })
 
-       afterEach(function() {
-               cy.deleteUser(currentUser)
-       })
-
        Cypress.on('uncaught:exception', (err) => {
                // This can happen because of blink engine & skeleton animation, its not a bug just engine related.
                if (err.message.includes('ResizeObserver loop limit exceeded')) {
@@ -54,6 +48,40 @@ describe('Login with a new user and open the files app', function() {
                cy.get('.files-fileList tr').should('contain', 'welcome.txt')
        })
 
+       it('See the file list sorting order is saved', function() {
+               cy.intercept('PUT', /api\/v1\/views\/files\/sorting_direction$/).as('sorting_direction')
+
+               cy.visit('/apps/files')
+               // default to sorting by name
+               cy.get('.files-filestable th.column-name .sort-indicator').should('be.visible')
+               // change to size
+               cy.get('.files-filestable th').contains('Size').click()
+               // size sorting should be active
+               cy.get('.files-filestable th.column-name .sort-indicator').should('not.be.visible')
+               cy.get('.files-filestable th.column-size .sort-indicator').should('be.visible')
+               cy.wait('@sorting_direction')
+
+               // Re-visit
+               cy.visit('/apps/files')
+               // now sorting by name should be disabled and sorting by size should be enabled
+               cy.get('.files-filestable th.column-name .sort-indicator').should('not.be.visible')
+               cy.get('.files-filestable th.column-size .sort-indicator').should('be.visible')
+       })
+})
+
+describe('Testing the copy move action (FilePicker)', () => {
+       let currentUser: User
+       beforeEach(function() {
+               cy.createRandomUser().then((user) => {
+                       currentUser = user
+                       cy.login(user)
+               })
+       })
+
+       afterEach(function() {
+               cy.deleteUser(currentUser)
+       })
+
        it('Copy a file in its same folder', () => {
                cy.visit('/apps/files')
                // When I start the move or copy operation for "welcome.txt"