From 596088b2fe19332eafd74e7b83e26368589ecf1b Mon Sep 17 00:00:00 2001 From: Damien Trouillet Date: Thu, 24 Sep 2020 22:33:57 +0200 Subject: [PATCH] Add support to explore directory tree (#47) * Add support to explore directory tree * explore sub directory and download files * Upload to subdir * Add cypress test * edit unit test titles * Add i18n --- .../integration/ebad/explore-files.spec.js | 102 ++++++++++++++++ .../ebad/manage-application.spec.js | 10 +- cypress/support/application.commands.js | 24 +++- cypress/support/files.commands.js | 111 ++++++++++++++++++ cypress/support/index.js | 1 + cypress/support/norme.commands.js | 14 ++- .../admin-norms/admin-norms.component.html | 4 +- src/app/core/models/directory.model.ts | 1 + src/app/core/models/file.model.ts | 2 + src/app/core/services/files.service.ts | 13 +- src/app/files/files.component.html | 13 +- src/app/files/files.component.ts | 32 ++++- .../manage-directories.component.html | 12 +- .../manage-directories.component.ts | 2 +- .../modal-directory-deletion.component.html | 4 +- .../modal-directory.component.html | 12 +- .../modal-directory.component.ts | 1 + .../shared/layout/aside/aside.component.html | 12 +- src/assets/i18n/en.json | 5 +- src/assets/i18n/fr.json | 5 +- 20 files changed, 340 insertions(+), 40 deletions(-) create mode 100644 cypress/integration/ebad/explore-files.spec.js create mode 100644 cypress/support/files.commands.js diff --git a/cypress/integration/ebad/explore-files.spec.js b/cypress/integration/ebad/explore-files.spec.js new file mode 100644 index 000000000..b53a88def --- /dev/null +++ b/cypress/integration/ebad/explore-files.spec.js @@ -0,0 +1,102 @@ +context('Folders', () => { + before(function () { + cy.server(); + // cy.route({ + // method: 'GET', + // url: '/ebad/applications/gestion*', + // }).as('searchApplication'); + }); + + beforeEach(function () { + cy.visit('http://localhost:4200'); + cy.fixture('login.json').then((login) => { + this.login = login; + }); + }); + + it('Add a folder', function () { + cy.login({login: this.login.admin.login, password: this.login.admin.password}) + .addNorme({name: 'myNorme', interpreteur: '$1', shellFolder: 'shell', fileDate: 'date.txt'}) + .addApplication({codeAppli: 'AA0', name: 'APP0', parmPattern: 'yyyyMMdd', filePattern: 'yyyyMMdd'}) + .addUserToApplication({codeAppli: 'AA0', nameAppli: 'APP0',firstname: this.login.admin.firstname, login: this.login.admin.login}) + .addManagerToApplication({codeAppli: 'AA0', nameAppli: 'APP0',firstname: this.login.admin.firstname, login: this.login.admin.login}) + .addEnvironnement({applicationName: 'APP0', name:'myEnv', host:'localhost', login:'root', homePath:'/root', prefix:'P', norme: 'myNorme'}) + .addFolder({appliName:'APP0', envName: 'myEnv', directoryName: 'myFolder', path: 'myPath'}); + cy.get('.toast-body').should('contains.text', 'Le répertoire myFolder a bien été ajouté'); + }); + + it('Show content folder', function(){ + cy.login({login: this.login.admin.login, password: this.login.admin.password}) + .selectFolder({appliName: 'APP0', envName: 'myEnv', directoryName: 'myFolder'}); + }); + + it('Delete folder', function(){ + cy.login({login: this.login.admin.login, password: this.login.admin.password}) + .deleteFolder({appliName: 'APP0', envName: 'myEnv', directoryName: 'myFolder'}) + .deleteApplication({codeAppli: 'AA0', name: 'APP0'}) + .deleteNorme({name: 'myNorme'}); + }); + + // it('Supprimer une application', function () { + // cy.login({login: this.login.admin.login, password: this.login.admin.password}) + // .deleteApplication({codeAppli: 'AT1', name: 'ApplicationTest1'}); + // cy.get('.toast-body').should('have.text', '\nL\'application a été supprimée\n'); + // }); + // + // it('Lister les applications', function () { + // cy.server(); + // cy.route({ + // method: 'GET', + // url: '/ebad/applications/gestion?page=0&size=10&sort=name,asc&name=ApplicationTest', + // }).as('searchApplicationTest'); + // + // cy.login({login: this.login.admin.login, password: this.login.admin.password}); + // cy.addApplication({codeAppli: 'AT1', name: 'ApplicationTest1', parmPattern: 'yyyyMMdd', filePattern: 'yyyyMMdd'}); + // cy.addApplication({codeAppli: 'AT2', name: 'ApplicationTest2', parmPattern: 'ddMMyyyy', filePattern: 'ddMMyyyy'}); + // + // cy.visit('http://localhost:4200'); + // cy.get('#administrationMenu').click(); + // cy.get('#applicationMenu').click(); + // cy.get('input[type="search"]').type('ApplicationTest'); + // + // cy.wait('@searchApplicationTest'); + // + // cy.get('#listApplications > tbody > tr').not('.odd').as('lines'); + // cy.get('@lines').should('have.length', 2); + // + // cy.get('@lines').eq(0).children('td').as('line1'); + // cy.get('@line1').eq(0).should('contain.text', 'AT1'); + // cy.get('@line1').eq(1).should('contain.text', 'ApplicationTest1'); + // cy.get('@line1').eq(2).should('contain.text', 'yyyyMMdd'); + // cy.get('@line1').eq(3).should('contain.text', 'yyyyMMdd'); + // + // cy.get('@lines').eq(1).children('td').as('line2'); + // cy.get('@line2').eq(0).should('contain.text', 'AT2'); + // cy.get('@line2').eq(1).should('contain.text', 'ApplicationTest2'); + // cy.get('@line2').eq(2).should('contain.text', 'ddMMyyyy'); + // cy.get('@line2').eq(3).should('contain.text', 'ddMMyyyy'); + // + // + // cy.deleteApplication({codeAppli: 'AT1', name: 'ApplicationTest1'}); + // cy.deleteApplication({codeAppli: 'AT2', name: 'ApplicationTest2'}); + // + // }); + // + // it('Modifier une application', function () { + // cy.login({login: this.login.admin.login, password: this.login.admin.password}) + // .addApplication({codeAppli: 'AT1', name: 'ApplicationTest1', parmPattern: 'yyyyMMdd', filePattern: 'yyyyMMdd'}); + // + // cy.updateApplication({ + // codeAppliToUpdate: 'AT1', + // nameToUpdate: 'ApplicationTest1', + // codeAppli: 'AT2', + // name: 'ApplicationTest2', + // parmPattern: 'yyyyMMdd', + // filePattern: 'yyyyMMdd' + // }); + // cy.getAttached('.toast-body').should('contains.text', 'L\'application ApplicationTest2 a bien été modifiée'); + // + // cy.deleteApplication({codeAppli: 'AT2', name: 'ApplicationTest2'}); + // cy.getAttached('.toast-body').should('contains.text', 'L\'application a été supprimée'); + // }); +}); diff --git a/cypress/integration/ebad/manage-application.spec.js b/cypress/integration/ebad/manage-application.spec.js index 1e69f5413..2a112f0df 100644 --- a/cypress/integration/ebad/manage-application.spec.js +++ b/cypress/integration/ebad/manage-application.spec.js @@ -1,4 +1,4 @@ -context('Gestion Application', () => { +context('Applications', () => { before(function () { cy.server(); cy.route({ @@ -14,19 +14,19 @@ context('Gestion Application', () => { }); }); - it('Ajouter une application', function () { + it('Add application', function () { cy.login({login: this.login.admin.login, password: this.login.admin.password}) .addApplication({codeAppli: 'AT1', name: 'ApplicationTest1', parmPattern: 'yyyyMMdd', filePattern: 'yyyyMMdd'}); cy.get('.toast-body').should('contains.text', 'L\'application ApplicationTest1 a bien été ajoutée'); }); - it('Supprimer une application', function () { + it('Delete application', function () { cy.login({login: this.login.admin.login, password: this.login.admin.password}) .deleteApplication({codeAppli: 'AT1', name: 'ApplicationTest1'}); cy.get('.toast-body').should('have.text', '\nL\'application a été supprimée\n'); }); - it('Lister les applications', function () { + it('List applications', function () { cy.server(); cy.route({ method: 'GET', @@ -65,7 +65,7 @@ context('Gestion Application', () => { }); - it('Modifier une application', function () { + it('Edit application', function () { cy.login({login: this.login.admin.login, password: this.login.admin.password}) .addApplication({codeAppli: 'AT1', name: 'ApplicationTest1', parmPattern: 'yyyyMMdd', filePattern: 'yyyyMMdd'}); diff --git a/cypress/support/application.commands.js b/cypress/support/application.commands.js index a7f5135bc..70b9a14f4 100644 --- a/cypress/support/application.commands.js +++ b/cypress/support/application.commands.js @@ -79,9 +79,14 @@ Cypress.Commands.add("addUserToApplication", ({codeAppli, nameAppli,firstname, l cy.server(); cy.route({ method: 'GET', - url: '/ebad/applications/gestion*', + url: '/ebad/applications/gestion?page=0&size=10&sort=name,asc&name='+nameAppli, }).as('searchApplication'); + cy.route({ + method: 'GET', + url: '/ebad/users?page=0&size=20&login='+firstname, + }).as('searchUser'); + cy.get('#administrationMenu').click(); cy.get('#applicationMenu').click(); cy.get('input[type="search"]').clear(); @@ -90,18 +95,24 @@ Cypress.Commands.add("addUserToApplication", ({codeAppli, nameAppli,firstname, l cy.get('#actionUser-' + codeAppli).click(); cy.get('#user').type(firstname); - cy.get('button').find('('+login+')').click(); + cy.wait('@searchUser'); + cy.get('button').contains(login).click(); cy.get('#addUserBtn').click(); cy.get('#closeBtn').click(); }); -Cypress.Commands.add("addManagerToApplication", ({codeAppli, nameAppli,user}) => { +Cypress.Commands.add("addManagerToApplication", ({codeAppli, nameAppli, firstname, login}) => { cy.server(); cy.route({ method: 'GET', - url: '/ebad/applications/gestion*', + url: '/ebad/applications/gestion?page=0&size=10&sort=name,asc&name='+nameAppli, }).as('searchApplication'); + cy.route({ + method: 'GET', + url: '/ebad/managers?page=0&size=20&login='+firstname, + }).as('searchUser'); + cy.get('#administrationMenu').click(); cy.get('#applicationMenu').click(); cy.get('input[type="search"]').clear(); @@ -109,8 +120,9 @@ Cypress.Commands.add("addManagerToApplication", ({codeAppli, nameAppli,user}) => cy.wait('@searchApplication'); cy.get('#actionManager-' + codeAppli).click(); - cy.get('#user').type(user.firstname); - cy.get('[ng-reflect-result="'+user.firstname+' '+user.lastname+' ('+user.login+')"]').click(); + cy.get('#user').type(firstname); + cy.wait('@searchUser'); + cy.get('button').contains(login).click(); cy.get('#addUserBtn').click(); cy.get('#closeBtn').click(); }); diff --git a/cypress/support/files.commands.js b/cypress/support/files.commands.js new file mode 100644 index 000000000..5f5682926 --- /dev/null +++ b/cypress/support/files.commands.js @@ -0,0 +1,111 @@ +/////////// FOLDER /////////////// +Cypress.Commands.add("selectFolder", ({appliName, envName, directoryName}) => { + cy.server(); + cy.route({ + method: 'GET', + url: '/ebad/applications?page=0&size=100', + }).as('getApplications'); + + cy.route({ + method: 'GET', + url: '/ebad/environments?applicationId=**&page=0&size=100&sort=name,asc', + }).as('getEnvironments'); + + cy.route({ + method: 'GET', + url: '/ebad/directories/env/**', + }).as('getDirectories'); + + cy.get('#functionMenu').click(); + cy.get('#functionFolderMenu').click(); + cy.wait('@getApplications'); + + cy.get('#selectApplication').select(appliName); + cy.wait('@getEnvironments'); + + cy.get('#selectEnvironnement').select(envName); + cy.wait('@getDirectories'); + + cy.get("#selectDirectory").type(directoryName); + +}); + +Cypress.Commands.add("addFolder", ({appliName, envName, directoryName, path}) => { + cy.server(); + cy.route({ + method: 'GET', + url: '/ebad/applications/write?page=0&size=100', + }).as('getApplications'); + + cy.route({ + method: 'GET', + url: '/ebad/environments?applicationId=**&page=0&size=100&sort=name,asc', + }).as('getEnvironments'); + + cy.route({ + method: 'PUT', + url: '/ebad/directories', + }).as('addFolder'); + + cy.get('#managementMenu').click(); + cy.get('#folderManageMenu').click(); + cy.wait('@getApplications'); + + cy.get('#selectApplication').select(appliName); + cy.wait('@getEnvironments'); + + cy.get('#selectEnvironnement').select(envName); + + cy.get('#addFolder').click(); + cy.get('#name').type(directoryName) + cy.get('#path').type(path) + cy.get('#addDirectoryForm').submit(); + + cy.wait('@addFolder'); +}); + +Cypress.Commands.add("deleteFolder", ({appliName, envName, directoryName}) => { + cy.server(); + cy.route({ + method: 'GET', + url: '/ebad/applications/write?page=0&size=100', + }).as('getApplications'); + + cy.route({ + method: 'GET', + url: '/ebad/environments?applicationId=**&page=0&size=100&sort=name,asc', + }).as('getEnvironments'); + + cy.route({ + method: 'GET', + url: '/ebad/directories/env/**', + }).as('getDirectories'); + + cy.route({ + method: 'POST', + url: '/ebad/directories/delete', + }).as('deleteFolder'); + + cy.route({ + method: 'GET', + url: '/ebad/directories/env/**?page=0&size=10&sort=id,asc&name='+directoryName, + }).as('searchFolder'); + + cy.get('#managementMenu').click(); + cy.get('#folderManageMenu').click(); + cy.wait('@getApplications'); + + cy.get('#selectApplication').select(appliName); + cy.wait('@getEnvironments'); + + cy.get('#selectEnvironnement').select(envName); + cy.wait('@getDirectories'); + + cy.get('input[type="search"]').clear(); + cy.get('input[type="search"]').type(directoryName); + cy.wait('@searchFolder'); + + cy.get('#actionDelete-' + directoryName).click(); + cy.get('#deleteBtn').click(); + cy.wait('@deleteFolder'); +}); diff --git a/cypress/support/index.js b/cypress/support/index.js index f8bd5e00b..9a87eb567 100644 --- a/cypress/support/index.js +++ b/cypress/support/index.js @@ -19,6 +19,7 @@ import './application.commands' import './norme.commands' import './environnement.commands' import './batch.commands' +import './files.commands' // Alternatively you can use CommonJS syntax: // require('./commands') diff --git a/cypress/support/norme.commands.js b/cypress/support/norme.commands.js index 0eeb616d9..8415940b8 100644 --- a/cypress/support/norme.commands.js +++ b/cypress/support/norme.commands.js @@ -11,11 +11,19 @@ Cypress.Commands.add("addNorme", ({name, interpreteur, shellFolder, fileDate}) = }); Cypress.Commands.add("deleteNorme", ({name}) => { + cy.server(); + cy.route({ + method: 'GET', + url: '/ebad/norms?page=0&size=10&sort=name,asc&name='+name, + }).as('searchNorme'); + cy.get('#administrationMenu').click(); cy.get('#normMenu').click(); - cy.get('tr').contains('td > span', name).parent('td').parent('tr').within(() => { - cy.get('button[name="actionDelete"]').click(); - }); + cy.get('input[type="search"]').clear(); + cy.get('input[type="search"]').type(name); + cy.wait('@searchNorme'); + + cy.get('#actionDelete-'+name).click(); cy.get('#deleteBtn').click(); }); diff --git a/src/app/admin-norms/admin-norms.component.html b/src/app/admin-norms/admin-norms.component.html index 6191d0a70..6c0b75a5f 100644 --- a/src/app/admin-norms/admin-norms.component.html +++ b/src/app/admin-norms/admin-norms.component.html @@ -59,8 +59,8 @@

{{norm.ctrlMDate}} - Edit - Delete + Edit + Delete diff --git a/src/app/core/models/directory.model.ts b/src/app/core/models/directory.model.ts index e3bf30de9..fd4337d0d 100644 --- a/src/app/core/models/directory.model.ts +++ b/src/app/core/models/directory.model.ts @@ -6,5 +6,6 @@ export interface Directory extends Audit { name: string; path: string; canWrite: boolean; + canExplore: boolean; environnement: Environment; } diff --git a/src/app/core/models/file.model.ts b/src/app/core/models/file.model.ts index 3b1e1ee3c..cdd600ba7 100644 --- a/src/app/core/models/file.model.ts +++ b/src/app/core/models/file.model.ts @@ -6,4 +6,6 @@ export interface File { name: string; updateDate: Date; createDate: Date; + folder: boolean; + subDirectory: string; } diff --git a/src/app/core/services/files.service.ts b/src/app/core/services/files.service.ts index df45a8a50..49d347156 100644 --- a/src/app/core/services/files.service.ts +++ b/src/app/core/services/files.service.ts @@ -29,8 +29,12 @@ export class FilesService { return this.apiService.post(`/directories/delete`, directory); } - getAllFilesFromDirectory(slug): Observable { - return this.apiService.get(`/directories/files/${slug}`); + getAllFilesFromDirectory(slug, subDir?: string): Observable { + let param; + if(subDir && subDir != ''){ + param = {'subDirectory': subDir} + } + return this.apiService.get(`/directories/files/${slug}`, param); } deleteFile(file): Observable { @@ -41,10 +45,13 @@ export class FilesService { return this.apiService.postFile(`/directories/files/read`, file, {responseType: 'arraybuffer'}); } - uploadFile(file, name, idDirectory): Observable { + uploadFile(file, name, idDirectory, subDirectory?): Observable { const formData = new FormData(); formData.append('directory', idDirectory); formData.append('file', file, name); + if(subDirectory) { + formData.append('subDirectory', subDirectory); + } return this.apiService.postFile(`/directories/files/upload`, formData); } } diff --git a/src/app/files/files.component.html b/src/app/files/files.component.html index b4f914cee..ea4706862 100644 --- a/src/app/files/files.component.html +++ b/src/app/files/files.component.html @@ -91,6 +91,14 @@ {{'FILE.NO_REMOTE_FILE' | translate}} + + + {{'FILE.YOU_ARE_HERE' | translate}} {{directorySelected.path}}/{{subDir.join('/')}} + + + {{'FILE.EXPLORE_UP' | translate}} + + {{remotefile.name}} @@ -102,8 +110,9 @@ {{remotefile.createDate | date : 'dd/MM/yyyy hh:mm:ss'}} - {{'FILE.DOWNLOAD' | translate}} - {{'FILE.DELETE' | translate}} + {{'FILE.DOWNLOAD' | translate}} + {{'FILE.DELETE' | translate}} + {{'FILE.EXPLORE' | translate}} diff --git a/src/app/files/files.component.ts b/src/app/files/files.component.ts index 1797bc84d..0dca2a4d1 100644 --- a/src/app/files/files.component.ts +++ b/src/app/files/files.component.ts @@ -24,6 +24,7 @@ export class FilesComponent implements OnInit { title = 'Fichiers'; localFiles: any[] = []; remoteFiles: File[]; + subDir: string[] = []; directorySelected: Directory = null; @@ -47,7 +48,11 @@ export class FilesComponent implements OnInit { refreshRemoteFiles() { - this.filesService.getAllFilesFromDirectory(this.directorySelected.id).subscribe((files) => this.remoteFiles=files); + let subDirectoryParam = ""; + this.subDir.forEach(dir => { + subDirectoryParam += "/" + dir; + }); + this.filesService.getAllFilesFromDirectory(this.directorySelected.id, subDirectoryParam).subscribe((files) => this.remoteFiles = files); } constructSelect() { @@ -193,9 +198,12 @@ export class FilesComponent implements OnInit { } upload() { - + let subDirectoryParam = ""; + this.subDir.forEach(dir => { + subDirectoryParam += "/" + dir; + }); for (const file of this.localFiles) { - this.filesService.uploadFile(file, file.customName, this.directorySelected.id).subscribe( + this.filesService.uploadFile(file, file.customName, this.directorySelected.id, subDirectoryParam).subscribe( () => { this.localFiles.splice(this.localFiles.indexOf(file), 1); this.refreshRemoteFiles(); @@ -207,4 +215,22 @@ export class FilesComponent implements OnInit { } } + + exploreParentDirectory(): void { + this.subDir.pop(); + this.explore() + } + + exploreChildDirectory(remoteDir: File): void { + this.subDir.push(remoteDir.name) + this.explore() + } + + explore(): void { + let subDirectoryParam = ""; + this.subDir.forEach(dir => { + subDirectoryParam += "/" + dir; + }); + this.filesService.getAllFilesFromDirectory(this.directorySelected.id, subDirectoryParam).subscribe((files) => this.remoteFiles = files); + } } diff --git a/src/app/manage-directories/manage-directories.component.html b/src/app/manage-directories/manage-directories.component.html index 85dc62d16..7011ac025 100644 --- a/src/app/manage-directories/manage-directories.component.html +++ b/src/app/manage-directories/manage-directories.component.html @@ -1,6 +1,6 @@ - Nouveau répertoire @@ -26,6 +26,9 @@ Droit d'écriture + + Droit d'explorer + @@ -44,9 +47,12 @@ {{directory.canWrite | yesno}} + + {{directory.canExplore | yesno}} + - Edit - Delete + Edit + Delete diff --git a/src/app/manage-directories/manage-directories.component.ts b/src/app/manage-directories/manage-directories.component.ts index 3bff0b348..6ea004746 100644 --- a/src/app/manage-directories/manage-directories.component.ts +++ b/src/app/manage-directories/manage-directories.component.ts @@ -60,7 +60,7 @@ export class ManageDirectoriesComponent implements AfterViewInit, OnDestroy, OnI }, columns: [{ data: 'id' - }, {data: 'name'}, {data: 'path'}, {data: 'canWrite'}, { + }, {data: 'name'}, {data: 'path'}, {data: 'canWrite'},{data: 'canExplore'}, { data: '', orderable: false }] diff --git a/src/app/manage-directories/modal-directory-deletion/modal-directory-deletion.component.html b/src/app/manage-directories/modal-directory-deletion/modal-directory-deletion.component.html index 587cb0005..d8735528f 100644 --- a/src/app/manage-directories/modal-directory-deletion/modal-directory-deletion.component.html +++ b/src/app/manage-directories/modal-directory-deletion/modal-directory-deletion.component.html @@ -8,6 +8,6 @@