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