diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index cfc21e909c066..af776cb8cd52b 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -2185,11 +2185,22 @@ } 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, + }) }); } }, diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index 70e0fd4845654..d06ea49ed1748 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -255,7 +255,7 @@ public function index($dir = '', $view = '', $fileid = null, $fileNotFound = fal $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 @@ public function index($dir = '', $view = '', $fileid = null, $fileNotFound = fal $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; diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index f2caa17697329..b7f9fb2ff39d2 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -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 diff --git a/cypress/e2e/files.cy.ts b/cypress/e2e/files.cy.ts index ab2c22a8776e8..3fb308d4e50f0 100644 --- a/cypress/e2e/files.cy.ts +++ b/cypress/e2e/files.cy.ts @@ -30,18 +30,13 @@ 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 +49,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"