From 13c4c948b5c26f16248ae3c1ccb3e927fb29255a Mon Sep 17 00:00:00 2001 From: Alex ORLUC <alex.orluc@maarch.org> Date: Wed, 15 Apr 2020 11:04:03 +0200 Subject: [PATCH] FEAT #13670 TIME 1:20 add doc viewer standalone + fix err auth failed --- .../resource/controllers/ResController.php | 30 +++-- src/frontend/app/app-routing.module.ts | 52 ++++---- src/frontend/app/app.module.ts | 4 +- .../app/viewer/document-viewer.component.ts | 112 +++++++++++------- .../page/document-viewer-page.component.html | 5 + .../page/document-viewer-page.component.scss | 7 ++ .../page/document-viewer-page.component.ts | 48 ++++++++ src/frontend/service/app.guard.ts | 6 +- src/frontend/service/header.service.ts | 2 +- 9 files changed, 181 insertions(+), 85 deletions(-) create mode 100644 src/frontend/app/viewer/page/document-viewer-page.component.html create mode 100644 src/frontend/app/viewer/page/document-viewer-page.component.scss create mode 100644 src/frontend/app/viewer/page/document-viewer-page.component.ts diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php index ab967835753..61faf131ac6 100755 --- a/src/app/resource/controllers/ResController.php +++ b/src/app/resource/controllers/ResController.php @@ -430,11 +430,14 @@ class ResController extends ResourceControlController ]); $data = $request->getQueryParams(); + + $finfo = new \finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->buffer($fileContent); + if ($data['mode'] == 'base64') { - return $response->withJson(['encodedDocument' => base64_encode($fileContent), 'originalFormat' => $originalFormat, 'originalCreatorId' => $creatorId]); + return $response->withJson(['encodedDocument' => base64_encode($fileContent), 'originalFormat' => $originalFormat, 'mimeType' => $mimeType,'originalCreatorId' => $creatorId]); } else { - $finfo = new \finfo(FILEINFO_MIME_TYPE); - $mimeType = $finfo->buffer($fileContent); + $pathInfo = pathinfo($pathToDocument); $response->write($fileContent); @@ -593,13 +596,6 @@ class ResController extends ResourceControlController return $response->withStatus(404)->withJson(['errors' => 'Document not found on docserver']); } - $finfo = new \finfo(FILEINFO_MIME_TYPE); - $mimeType = $finfo->buffer($fileContent); - $pathInfo = pathinfo($pathToDocument); - - $response->write($fileContent); - $response = $response->withAddedHeader('Content-Disposition', "attachment; filename=maarch.{$pathInfo['extension']}"); - HistoryController::add([ 'tableName' => 'res_letterbox', 'recordId' => $args['resId'], @@ -609,7 +605,19 @@ class ResController extends ResourceControlController 'eventId' => 'resview', ]); - return $response->withHeader('Content-Type', $mimeType); + $finfo = new \finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->buffer($fileContent); + $data = $request->getQueryParams(); + + if ($data['mode'] == 'base64') { + return $response->withJson(['encodedDocument' => base64_encode($fileContent), 'mimeType' => $mimeType]); + } else { + $pathInfo = pathinfo($pathToDocument); + + $response->write($fileContent); + $response = $response->withAddedHeader('Content-Disposition', "attachment; filename=maarch.{$pathInfo['extension']}"); + return $response->withHeader('Content-Type', $mimeType); + } } public function getThumbnailContent(Request $request, Response $response, array $args) diff --git a/src/frontend/app/app-routing.module.ts b/src/frontend/app/app-routing.module.ts index d17fe923bca..a80d41e79ac 100755 --- a/src/frontend/app/app-routing.module.ts +++ b/src/frontend/app/app-routing.module.ts @@ -1,49 +1,51 @@ -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; -import { ActivateUserComponent } from './activate-user.component'; -import { PasswordModificationComponent } from './password-modification.component'; -import { ProfileComponent } from './profile.component'; -import { AboutUsComponent } from './about-us.component'; -import { HomeComponent } from './home/home.component'; -import { BasketListComponent } from './list/basket-list.component'; -import { SignatureBookComponent } from './signature-book.component'; -import { SaveNumericPackageComponent } from './save-numeric-package.component'; -import { PrintSeparatorComponent } from './separator/print-separator/print-separator.component'; -import { AppGuard, AfterProcessGuard } from '../service/app.guard'; -import { FolderDocumentListComponent } from './folder/document-list/folder-document-list.component'; -import { IndexationComponent } from './indexation/indexation.component'; -import { ForgotPasswordComponent } from './login/forgotPassword/forgotPassword.component'; -import { UpdatePasswordComponent } from './login/updatePassword/updatePassword.component'; -import { ProcessComponent } from './process/process.component'; -import { FollowedDocumentListComponent } from "./home/followed-list/followed-document-list.component"; +import { ActivateUserComponent } from './activate-user.component'; +import { PasswordModificationComponent } from './password-modification.component'; +import { ProfileComponent } from './profile.component'; +import { AboutUsComponent } from './about-us.component'; +import { HomeComponent } from './home/home.component'; +import { BasketListComponent } from './list/basket-list.component'; +import { SignatureBookComponent } from './signature-book.component'; +import { SaveNumericPackageComponent } from './save-numeric-package.component'; +import { PrintSeparatorComponent } from './separator/print-separator/print-separator.component'; +import { AppGuard, AfterProcessGuard } from '../service/app.guard'; +import { FolderDocumentListComponent } from './folder/document-list/folder-document-list.component'; +import { IndexationComponent } from './indexation/indexation.component'; +import { ForgotPasswordComponent } from './login/forgotPassword/forgotPassword.component'; +import { UpdatePasswordComponent } from './login/updatePassword/updatePassword.component'; +import { ProcessComponent } from './process/process.component'; +import { FollowedDocumentListComponent } from './home/followed-list/followed-document-list.component'; import { LoginComponent } from './login/login.component'; +import { DocumentViewerPageComponent } from './viewer/page/document-viewer-page.component'; @NgModule({ imports: [ RouterModule.forRoot([ - { path: 'login', component: LoginComponent}, - { path: 'activate-user', component: ActivateUserComponent}, + { path: 'login', component: LoginComponent }, + { path: 'activate-user', component: ActivateUserComponent }, { path: 'password-modification', component: PasswordModificationComponent }, { path: 'profile', canActivate: [AppGuard], component: ProfileComponent }, { path: 'about-us', canActivate: [AppGuard], component: AboutUsComponent }, - { path: 'home', canActivate: [AppGuard], component: HomeComponent }, + { path: 'home', canActivate: [AppGuard], component: HomeComponent }, { path: 'basketList/users/:userSerialId/groups/:groupSerialId/baskets/:basketId', canActivate: [AppGuard], component: BasketListComponent }, { path: 'process/users/:userSerialId/groups/:groupSerialId/baskets/:basketId/resId/:resId', canActivate: [AppGuard], canDeactivate: [AfterProcessGuard], component: ProcessComponent }, { path: 'folders/:folderId', canActivate: [AppGuard], component: FolderDocumentListComponent }, { path: 'saveNumericPackage', canActivate: [AppGuard], component: SaveNumericPackageComponent }, { path: 'separators/print', canActivate: [AppGuard], component: PrintSeparatorComponent }, - { path: 'signatureBook/users/:userId/groups/:groupId/baskets/:basketId/resources/:resId', canActivate: [AppGuard],component: SignatureBookComponent }, - { path: 'indexing/:groupId', canActivate: [AppGuard],component: IndexationComponent }, + { path: 'signatureBook/users/:userId/groups/:groupId/baskets/:basketId/resources/:resId', canActivate: [AppGuard], component: SignatureBookComponent }, + { path: 'indexing/:groupId', canActivate: [AppGuard], component: IndexationComponent }, { path: 'forgot-password', component: ForgotPasswordComponent }, { path: 'update-password', component: UpdatePasswordComponent }, { path: 'followed', canActivate: [AppGuard], component: FollowedDocumentListComponent }, { path: 'resources/:detailResId', canActivate: [AppGuard], canDeactivate: [AfterProcessGuard], component: ProcessComponent }, - { path: '**', redirectTo: 'login', pathMatch: 'full' }, + { path: 'resources/:resId/content', canActivate: [AppGuard], component: DocumentViewerPageComponent }, + { path: '**', redirectTo: 'login', pathMatch: 'full' }, ], { useHash: true }), ], exports: [ RouterModule ] }) -export class AppRoutingModule {} +export class AppRoutingModule { } diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts index df3fc42ba38..40b68c57a10 100755 --- a/src/frontend/app/app.module.ts +++ b/src/frontend/app/app.module.ts @@ -113,6 +113,7 @@ import { SentResourceListComponent } from './sentResource/sent-resource-list.com import { SentResourcePageComponent } from './sentResource/sent-resource-page/sent-resource-page.component'; import { SentNumericPackagePageComponent } from './sentResource/sent-numeric-package-page/sent-numeric-package-page.component'; import { FolderCreateModalComponent } from './folder/folder-create-modal/folder-create-modal.component'; +import { DocumentViewerPageComponent } from './viewer/page/document-viewer-page.component'; @@ -214,7 +215,8 @@ import { FolderCreateModalComponent } from './folder/folder-create-modal/folder- PrintedFolderModalComponent, SentNumericPackagePageComponent, FolderCreateModalComponent, - ReconcileActionComponent + ReconcileActionComponent, + DocumentViewerPageComponent ], entryComponents: [ InfoChangePasswordModalComponent, diff --git a/src/frontend/app/viewer/document-viewer.component.ts b/src/frontend/app/viewer/document-viewer.component.ts index 428d5e0102b..d9ff3c6553f 100755 --- a/src/frontend/app/viewer/document-viewer.component.ts +++ b/src/frontend/app/viewer/document-viewer.component.ts @@ -5,7 +5,6 @@ import { NotificationService } from '../notification.service'; import { HeaderService } from '../../service/header.service'; import { AppService } from '../../service/app.service'; import { tap, catchError, filter, map, exhaustMap } from 'rxjs/operators'; -import { of, Subject } from 'rxjs'; import { ConfirmComponent } from '../../plugins/modal/confirm.component'; import { MatDialogRef, MatDialog } from '@angular/material/dialog'; import { AlertComponent } from '../../plugins/modal/alert.component'; @@ -16,12 +15,13 @@ import { EcplOnlyofficeViewerComponent } from '../../plugins/onlyoffice-api-js/o import { FunctionsService } from '../../service/functions.service'; import { DocumentViewerModalComponent } from './modal/document-viewer-modal.component'; import { PrivilegeService } from '../../service/privileges.service'; -import { VisaWorkflowModalComponent } from "../visa/modal/visa-workflow-modal.component"; +import { VisaWorkflowModalComponent } from '../visa/modal/visa-workflow-modal.component'; +import { of } from 'rxjs/internal/observable/of'; @Component({ selector: 'app-document-viewer', - templateUrl: "document-viewer.component.html", + templateUrl: 'document-viewer.component.html', styleUrls: [ 'document-viewer.component.scss', '../indexation/indexing-form/indexing-form.component.scss', @@ -34,50 +34,50 @@ export class DocumentViewerComponent implements OnInit { /** * document name stored in server (in tmp folder) */ - @Input('tmpFilename') tmpFilename: string; + @Input() tmpFilename: string; /** * base64 of document (@format is required!) */ - @Input('base64') base64: any = null; - @Input('format') format: string = null; + @Input() base64: any = null; + @Input() format: string = null; /** * Target of resource (document or attachment) */ - @Input('mode') mode: 'mainDocument' | 'attachment' = 'mainDocument'; + @Input() mode: 'mainDocument' | 'attachment' = 'mainDocument'; /** * Resource of document or attachment (based on @mode) */ - @Input('resId') resId: number = null; + @Input() resId: number = null; /** * Resource of document link to attachment (@mode = 'attachment' required!) */ - @Input('resIdMaster') resIdMaster: number = null; + @Input() resIdMaster: number = null; /** * Can manage document ? (create, delete, update) */ - @Input('editMode') editMode: boolean = false; + @Input() editMode: boolean = false; /** * Title of new tab when open document in external tab */ - @Input('title') title: string = ''; + @Input() title: string = ''; /** * To load specific attachment type in template list (to create document) */ - @Input('attachType') attachType: string = null; + @Input() attachType: string = null; /** * Event emitter */ - @Output('triggerEvent') triggerEvent = new EventEmitter<string>(); + @Output() triggerEvent = new EventEmitter<string>(); lang: any = LANG; @@ -260,7 +260,7 @@ export class DocumentViewerComponent implements OnInit { if (fileInput.target.files && fileInput.target.files[0] && this.isExtensionAllowed(fileInput.target.files[0])) { this.initUpload(); - var reader = new FileReader(); + const reader = new FileReader(); this.file.name = fileInput.target.files[0].name; this.file.type = fileInput.target.files[0].type; this.file.format = this.file.name.split('.').pop(); @@ -297,7 +297,7 @@ export class DocumentViewerComponent implements OnInit { } getBase64Document(buffer: ArrayBuffer) { - let TYPED_ARRAY = new Uint8Array(buffer); + const TYPED_ARRAY = new Uint8Array(buffer); const STRING_CHAR = TYPED_ARRAY.reduce((data, byte) => { return data + String.fromCharCode(byte); }, ''); @@ -306,10 +306,10 @@ export class DocumentViewerComponent implements OnInit { } base64ToArrayBuffer(base64: string) { - var binary_string = window.atob(base64); - var len = binary_string.length; - var bytes = new Uint8Array(len); - for (var i = 0; i < len; i++) { + const binary_string = window.atob(base64); + const len = binary_string.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); } return bytes.buffer; @@ -355,13 +355,13 @@ export class DocumentViewerComponent implements OnInit { ); } else { this.noConvertedFound = true; - this.loading = false + this.loading = false; } } upload(data: any) { - let uploadURL = `../rest/convertedFile`; + const uploadURL = `../rest/convertedFile`; return this.http.post<any>(uploadURL, data, { reportProgress: true, @@ -521,27 +521,49 @@ export class DocumentViewerComponent implements OnInit { } downloadOriginalFile() { - let downloadLink = document.createElement('a'); + const downloadLink = document.createElement('a'); if (this.file.contentMode === 'base64') { downloadLink.href = `data:${this.file.type};base64,${this.file.content}`; + downloadLink.setAttribute('download', this.file.name); + document.body.appendChild(downloadLink); + downloadLink.click(); } else { - downloadLink.href = this.file.content; + this.http.get(this.file.content).pipe( + tap((data: any) => { + downloadLink.href = `data:${data.mimeType};base64,${data.encodedDocument}`; + downloadLink.setAttribute('download', this.file.name); + document.body.appendChild(downloadLink); + downloadLink.click(); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); + }) + ).subscribe(); } - - downloadLink.setAttribute('download', this.file.name); - document.body.appendChild(downloadLink); - downloadLink.click(); } openPdfInTab() { - let src = this.file.contentView; + let src = ''; if (this.file.contentMode === 'base64') { src = `data:${this.file.type};base64,${this.file.content}`; + const newWindow = window.open(); + newWindow.document.write(`<iframe style="width: 100%;height: 100%;margin: 0;padding: 0;" src="${src}" frameborder="0" allowfullscreen></iframe>`); + newWindow.document.title = this.title; + } else { + this.http.get(this.file.contentView).pipe( + tap((data: any) => { + src = `data:${data.mimeType};base64,${data.encodedDocument}`; + const newWindow = window.open(); + newWindow.document.write(`<iframe style="width: 100%;height: 100%;margin: 0;padding: 0;" src="${src}" frameborder="0" allowfullscreen></iframe>`); + newWindow.document.title = this.title; + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); + }) + ).subscribe(); } - - let newWindow = window.open(); - newWindow.document.write(`<iframe style="width: 100%;height: 100%;margin: 0;padding: 0;" src="${src}" frameborder="0" allowfullscreen></iframe>`); - newWindow.document.title = this.title; } async loadRessource(resId: any, target: string = 'mainDocument') { @@ -551,10 +573,11 @@ export class DocumentViewerComponent implements OnInit { (data: any) => { if (data.encodedDocument) { this.file.contentMode = 'route'; + this.file.name = `${resId}.${data.originalFormat}`; this.file.format = data.originalFormat; this.file.creatorId = data.originalCreatorId; - this.file.content = `../rest/attachments/${resId}/originalContent`; - this.file.contentView = `../rest/attachments/${resId}/content?mode=view`; + this.file.content = `../rest/attachments/${resId}/originalContent?mode=base64`; + this.file.contentView = `../rest/attachments/${resId}/content?mode=base64`; this.file.src = this.base64ToArrayBuffer(data.encodedDocument); this.loading = false; } @@ -564,7 +587,7 @@ export class DocumentViewerComponent implements OnInit { this.noFile = true; } else if (err.error.errors === 'Converted Document not found') { this.file.contentMode = 'route'; - this.file.content = `../rest/attachments/${resId}/originalContent`; + this.file.content = `../rest/attachments/${resId}/originalContent?mode=base64`; this.noConvertedFound = true; } else { this.notify.error(err.error.errors); @@ -582,7 +605,7 @@ export class DocumentViewerComponent implements OnInit { this.loading = false; } else if (!this.file.subinfos.canConvert) { this.file.contentMode = 'route'; - this.file.content = `../rest/resources/${resId}/originalContent`; + this.file.content = `../rest/resources/${resId}/originalContent?mode=base64`; this.noConvertedFound = true; this.loading = false; } else { @@ -590,9 +613,10 @@ export class DocumentViewerComponent implements OnInit { (data: any) => { if (data.encodedDocument) { this.file.contentMode = 'route'; + this.file.name = `${resId}.${data.originalFormat}`; this.file.format = data.originalFormat; - this.file.content = `../rest/resources/${resId}/originalContent`; - this.file.contentView = `../rest/resources/${resId}/content?mode=view`; + this.file.content = `../rest/resources/${resId}/originalContent?mode=base64`; + this.file.contentView = `../rest/resources/${resId}/content?mode=base64`; this.file.src = this.base64ToArrayBuffer(data.encodedDocument); this.loading = false; } @@ -653,7 +677,7 @@ export class DocumentViewerComponent implements OnInit { editTemplate(templateId: number) { let confirmMsg = ''; - if (this.mode == 'attachment') { + if (this.mode === 'attachment') { confirmMsg = this.lang.editionAttachmentConfirmFirst + '<br><br>' + this.lang.editionAttachmentConfirmThird; } else { confirmMsg = this.lang.editionAttachmentConfirmFirst + '<br><br>' + this.lang.editionAttachmentConfirmSecond; @@ -670,7 +694,7 @@ export class DocumentViewerComponent implements OnInit { tap(() => { this.triggerEvent.emit(); - const template = this.listTemplates.filter(template => template.id === templateId)[0]; + const template = this.listTemplates.filter(templateItem => templateItem.id === templateId)[0]; this.file.format = template.extension; @@ -812,7 +836,7 @@ export class DocumentViewerComponent implements OnInit { } loadTemplatesByResId(resId: number, attachType: string) { - let arrValues: any[] = []; + const arrValues: any[] = []; let arrTypes: any = []; this.listTemplates = []; this.http.get('../rest/attachmentsTypes').pipe( @@ -865,8 +889,8 @@ export class DocumentViewerComponent implements OnInit { loadTemplates() { if (this.listTemplates.length === 0) { - let arrValues: any[] = []; - if (this.mode == 'mainDocument') { + const arrValues: any[] = []; + if (this.mode === 'mainDocument') { this.http.get('../rest/currentUser/templates?target=indexingFile').pipe( tap((data: any) => { this.listTemplates = data.templates; @@ -999,7 +1023,7 @@ export class DocumentViewerComponent implements OnInit { src: this.base64ToArrayBuffer(data.encodedResource) }; }), - //exhaustMap((data) => this.http.post(`../rest/convertedFile/encodedFile`, data.content)), + // exhaustMap((data) => this.http.post(`../rest/convertedFile/encodedFile`, data.content)), catchError((err: any) => { this.notify.handleSoftErrors(err); resolve(false); diff --git a/src/frontend/app/viewer/page/document-viewer-page.component.html b/src/frontend/app/viewer/page/document-viewer-page.component.html new file mode 100644 index 00000000000..2766471ee6a --- /dev/null +++ b/src/frontend/app/viewer/page/document-viewer-page.component.html @@ -0,0 +1,5 @@ +<div class="doc-container"> + <app-document-viewer #appDocumentViewer *ngIf="!loading" style="display:block;height:100%;width:100%;max-width:800px;overflow: auto;" [editMode]="false" + [resId]="resId" [title]="resId"> +</app-document-viewer> +</div> diff --git a/src/frontend/app/viewer/page/document-viewer-page.component.scss b/src/frontend/app/viewer/page/document-viewer-page.component.scss new file mode 100644 index 00000000000..7082297068d --- /dev/null +++ b/src/frontend/app/viewer/page/document-viewer-page.component.scss @@ -0,0 +1,7 @@ +@import "../../../css/vars.scss"; + +.doc-container { + background: $primary; + display: flex; + justify-content: center; +} \ No newline at end of file diff --git a/src/frontend/app/viewer/page/document-viewer-page.component.ts b/src/frontend/app/viewer/page/document-viewer-page.component.ts new file mode 100644 index 00000000000..706a2ed0ce6 --- /dev/null +++ b/src/frontend/app/viewer/page/document-viewer-page.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { catchError } from 'rxjs/internal/operators/catchError'; +import { of } from 'rxjs/internal/observable/of'; +import { tap } from 'rxjs/internal/operators/tap'; +import { HttpClient } from '@angular/common/http'; +import { NotificationService } from '../../notification.service'; +import { HeaderService } from '../../../service/header.service'; + +@Component({ + selector: 'app-document-viewer-page', + templateUrl: './document-viewer-page.component.html', + styleUrls: ['./document-viewer-page.component.scss'] +}) +export class DocumentViewerPageComponent implements OnInit { + + loading: boolean = true; + resId: number = 0; + + constructor( + private http: HttpClient, + private route: ActivatedRoute, + private router: Router, + private notify: NotificationService, + private headerService: HeaderService, + ) { } + + ngOnInit() { + this.route.params.subscribe(params => { + if (typeof params['resId'] !== 'undefined') { + this.resId = params['resId']; + this.http.get(`../rest/resources/${this.resId}/fileInformation`).pipe( + tap((data: any) => { + this.loading = false; + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + this.router.navigate(['/home']); + return of(false); + }) + ).subscribe(); + } else { + this.router.navigate(['/home']); + } + }); + } + +} diff --git a/src/frontend/service/app.guard.ts b/src/frontend/service/app.guard.ts index b495e63dd6a..9aa6ad95527 100644 --- a/src/frontend/service/app.guard.ts +++ b/src/frontend/service/app.guard.ts @@ -59,7 +59,7 @@ export class AppGuard implements CanActivate { console.log('ABS!'); return this.router.navigate(['/activate-user']); } else { - if (route.url.map((url: any) => url.path).filter((url: any) => url === 'signatureBook').length > 0) { + if (route.url.map((url: any) => url.path).filter((url: any) => ['signatureBook', 'content'].indexOf(url) > -1).length > 0) { this.headerService.hideSideBar = true; } else { this.headerService.hideSideBar = false; @@ -81,7 +81,7 @@ export class AppGuard implements CanActivate { console.log('ABS!'); return this.router.navigate(['/activate-user']); } else { - if (route.url.map((url: any) => url.path).filter((url: any) => url === 'signatureBook').length > 0) { + if (route.url.map((url: any) => url.path).filter((url: any) => ['signatureBook', 'content'].indexOf(url) > -1).length > 0) { this.headerService.hideSideBar = true; } else { this.headerService.hideSideBar = false; @@ -130,7 +130,7 @@ export class AppGuard implements CanActivate { console.log('ABS!'); return this.router.navigate(['/activate-user']); } else { - if (route.url.map((url: any) => url.path).filter((url: any) => url === 'signatureBook').length > 0) { + if (route.url.map((url: any) => url.path).filter((url: any) => ['signatureBook', 'content'].indexOf(url) > -1).length > 0) { this.headerService.hideSideBar = true; } else { this.headerService.hideSideBar = false; diff --git a/src/frontend/service/header.service.ts b/src/frontend/service/header.service.ts index 20c6a60c1fb..65c9e0574ab 100755 --- a/src/frontend/service/header.service.ts +++ b/src/frontend/service/header.service.ts @@ -28,7 +28,7 @@ export class HeaderService { headerMessageIcon: string = ''; headerMessage: string = ''; subHeaderMessage: string = ''; - user: any = { firstname: '', lastname: '', groups: [], privileges: [] }; + user: any = { firstname: '', lastname: '', groups: [], privileges: [], preferences: [] }; lang: any = LANG; nbResourcesFollowed: number = 0; base64: string = null; -- GitLab