]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Support navigating directly to comments
authorshamoon <4887959+shamoon@users.noreply.github.com>
Fri, 17 Mar 2023 06:18:16 +0000 (23:18 -0700)
committershamoon <4887959+shamoon@users.noreply.github.com>
Sat, 18 Mar 2023 01:47:03 +0000 (18:47 -0700)
src-ui/src/app/app-routing.module.ts
src-ui/src/app/components/document-detail/document-detail.component.html
src-ui/src/app/components/document-detail/document-detail.component.ts
src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html
src-ui/src/app/components/document-list/document-card-large/document-card-large.component.scss
src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html
src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss
src-ui/src/app/components/document-list/document-list.component.html
src-ui/src/styles.scss

index 6f26a81fdcd2a7c3ca36655f9321fd2f6dc083e8..4d12ee4f3926d599cc3b8ec072a5ca7fcc47bbe2 100644 (file)
@@ -65,6 +65,17 @@ const routes: Routes = [
           },
         },
       },
+      {
+        path: 'documents/:id/:section',
+        component: DocumentDetailComponent,
+        canActivate: [PermissionsGuard],
+        data: {
+          requiredPermission: {
+            action: PermissionAction.View,
+            type: PermissionType.Document,
+          },
+        },
+      },
       {
         path: 'asn/:id',
         component: DocumentAsnComponent,
@@ -144,13 +155,14 @@ const routes: Routes = [
         },
       },
       {
-        path: 'tasks',
-        component: TasksComponent,
+        path: 'settings/:section',
+        component: SettingsComponent,
+        canDeactivate: [DirtyFormGuard],
         canActivate: [PermissionsGuard],
         data: {
           requiredPermission: {
             action: PermissionAction.View,
-            type: PermissionType.PaperlessTask,
+            type: PermissionType.UISettings,
           },
         },
       },
@@ -158,19 +170,18 @@ const routes: Routes = [
         path: 'settings/:section',
         component: SettingsComponent,
         canDeactivate: [DirtyFormGuard],
+      },
+      {
+        path: 'tasks',
+        component: TasksComponent,
         canActivate: [PermissionsGuard],
         data: {
           requiredPermission: {
             action: PermissionAction.View,
-            type: PermissionType.UISettings,
+            type: PermissionType.PaperlessTask,
           },
         },
       },
-      {
-        path: 'settings/:section',
-        component: SettingsComponent,
-        canDeactivate: [DirtyFormGuard],
-      },
       { path: 'tasks', component: TasksComponent },
     ],
   },
index 43eeed0ef2fbbe61d6731e88b68e6780be60c0fa..c5d727459a17d8cc2f978fb2e8ddf746548f115c 100644 (file)
@@ -67,8 +67,8 @@
 
         <form [formGroup]='documentForm' (ngSubmit)="save()">
 
-            <ul ngbNav #nav="ngbNav" class="nav-tabs">
-                <li [ngbNavItem]="1">
+            <ul ngbNav #nav="ngbNav" class="nav-tabs" (navChange)="onNavChange($event)" [(activeId)]="activeNavID">
+                <li [ngbNavItem]="DocumentDetailNavIDs.Details">
                     <a ngbNavLink i18n>Details</a>
                     <ng-template ngbNavContent>
 
@@ -87,7 +87,7 @@
                     </ng-template>
                 </li>
 
-                <li [ngbNavItem]="2">
+                <li [ngbNavItem]="DocumentDetailNavIDs.Content">
                     <a ngbNavLink i18n>Content</a>
                     <ng-template ngbNavContent>
                         <div class="mb-3">
@@ -96,7 +96,7 @@
                     </ng-template>
                 </li>
 
-                <li [ngbNavItem]="3">
+                <li [ngbNavItem]="DocumentDetailNavIDs.Metadata">
                     <a ngbNavLink i18n>Metadata</a>
                     <ng-template ngbNavContent>
 
                     </ng-template>
                 </li>
 
-                <li [ngbNavItem]="4" class="d-md-none">
+                <li [ngbNavItem]="DocumentDetailNavIDs.Preview" class="d-md-none">
                     <a ngbNavLink i18n>Preview</a>
                     <ng-template ngbNavContent *ngIf="!pdfPreview.offsetParent">
                         <div class="position-relative">
                     </ng-template>
                 </li>
 
-                <li [ngbNavItem]="5" *ngIf="commentsEnabled">
+                <li [ngbNavItem]="DocumentDetailNavIDs.Comments" *ngIf="commentsEnabled">
                     <a ngbNavLink i18n>Comments <span *ngIf="document?.n_comments" class="badge text-bg-secondary ms-1">{{document.n_comments}}</span></a>
                     <ng-template ngbNavContent>
                         <app-document-comments [documentId]="documentId" (updated)="commentsUpdated($event)"></app-document-comments>
                     </ng-template>
                 </li>
 
-                <li [ngbNavItem]="6" *appIfOwner="document">
+                <li [ngbNavItem]="DocumentDetailNavIDs.Permissions" *appIfOwner="document">
                     <a ngbNavLink i18n>Permissions</a>
                     <ng-template ngbNavContent>
                         <div class="mb-3">
index 401b82944d6e941f045c8976da7d2be26b4cf982..029fab6420ed3cfd9894dde44653dd175af46b2f 100644 (file)
@@ -1,7 +1,7 @@
 import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'
 import { FormControl, FormGroup } from '@angular/forms'
 import { ActivatedRoute, Router } from '@angular/router'
-import { NgbModal, NgbNav } from '@ng-bootstrap/ng-bootstrap'
+import { NgbModal, NgbNav, NgbNavChangeEvent } from '@ng-bootstrap/ng-bootstrap'
 import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent'
 import { PaperlessDocument } from 'src/app/data/paperless-document'
 import { PaperlessDocumentMetadata } from 'src/app/data/paperless-document-metadata'
@@ -43,6 +43,15 @@ import {
 import { PaperlessUser } from 'src/app/data/paperless-user'
 import { UserService } from 'src/app/services/rest/user.service'
 
+enum DocumentDetailNavIDs {
+  Details = 1,
+  Content = 2,
+  Metadata = 3,
+  Preview = 4,
+  Comments = 5,
+  Permissions = 6,
+}
+
 @Component({
   selector: 'app-document-detail',
   templateUrl: './document-detail.component.html',
@@ -117,6 +126,8 @@ export class DocumentDetailComponent
 
   PermissionAction = PermissionAction
   PermissionType = PermissionType
+  DocumentDetailNavIDs = DocumentDetailNavIDs
+  activeNavID: number
 
   constructor(
     private documentsService: DocumentService,
@@ -282,6 +293,18 @@ export class DocumentDetailComponent
           this.router.navigate(['404'])
         },
       })
+
+    this.route.paramMap.subscribe((paramMap) => {
+      const section = paramMap.get('section')
+      if (section) {
+        const navIDKey: string = Object.keys(DocumentDetailNavIDs).find(
+          (navID) => navID.toLowerCase() == section
+        )
+        if (navIDKey) {
+          this.activeNavID = DocumentDetailNavIDs[navIDKey]
+        }
+      }
+    })
   }
 
   ngOnDestroy(): void {
@@ -289,6 +312,18 @@ export class DocumentDetailComponent
     this.unsubscribeNotifier.complete()
   }
 
+  onNavChange(navChangeEvent: NgbNavChangeEvent) {
+    const [foundNavIDkey] = Object.entries(DocumentDetailNavIDs).find(
+      ([, navIDValue]) => navIDValue == navChangeEvent.nextId
+    )
+    if (foundNavIDkey)
+      this.router.navigate([
+        'documents',
+        this.documentId,
+        foundNavIDkey.toLowerCase(),
+      ])
+  }
+
   updateComponent(doc: PaperlessDocument) {
     this.document = doc
     this.requiresPassword = false
index 102fe9844c4361aafdd8603bb0c5906ccbbe5321..b6417ceb1ace0c5f076aa5ce7811936ae745700f 100644 (file)
@@ -67,7 +67,7 @@
 
 
           <div class="list-group list-group-horizontal border-0 card-info ms-md-auto mt-2 mt-md-0">
-            <button *ngIf="document.n_comments" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2" title="View comments" i18n-title>
+            <button routerLink="/documents/{{document.id}}/comments" *ngIf="document.n_comments" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2" title="View comments" i18n-title>
               <svg class="metadata-icon me-2 text-muted" fill="currentColor">
                 <use xlink:href="assets/bootstrap-icons.svg#chat-left-text"/>
               </svg>
index e3398c24598291734beec6368d46b12699e44c5f..35f6f53b1a83d313e27e6e0934248754804bfcbf 100644 (file)
     }
   }
 
-  .metadata-icon {
-    width: 0.9rem;
-    height: 0.9rem;
-    padding: 0.05rem;
-  }
-
   .search-score {
     padding-top: 0.35rem !important;
   }
index 00e2334256dc2c6534ea3ef3c8b3a419089cfa30..107b2ecbcc96238bbbdbbdac3a3f02bf3185cec3 100644 (file)
       </div>
     </div>
 
-    <div *ngIf="document.n_comments" class="document-card-comments pe-none py-2 px-1">
-    <span class="badge rounded-pill bg-light border text-primary">
+    <a routerLink="/documents/{{document.id}}/comments" *ngIf="document.n_comments" class="document-card-comments py-2 px-1">
+      <span class="badge rounded-pill bg-light border text-primary">
       <svg class="metadata-icon ms-1 me-1" fill="currentColor">
         <use xlink:href="assets/bootstrap-icons.svg#chat-left-text"/>
       </svg>
       {{document.n_comments}}</span>
-    </div>
+    </a>
 
     <div class="card-body p-2">
       <p class="card-text">
index 4825be9b24dafc031249522179df31c2e9b09114..95c66d7d6953c16b2f772f52ca00dd92fb9e56ae 100644 (file)
@@ -5,7 +5,7 @@
 .doc-img {
   object-fit: cover;
   object-position: top left;
-  height: 175px;
+  height: 180px;
   mix-blend-mode: multiply;
 }
 
   }
 }
 
-.metadata-icon {
-  width: 0.9rem;
-  height: 0.9rem;
-  padding: 0.05rem;
-}
-
 .card-footer .btn {
   padding-top: .10rem;
 }
index 25a75c1b6e77d21bc01f120fdd58777611e53fa5..c46206d614b35b788e8ef2dc15554052bfaaf2cc 100644 (file)
         [currentSortReverse]="list.sortReverse"
         (sort)="onSort($event)"
         i18n>Title</th>
+      <th class="d-none d-xl-table-cell"
+        appSortable="n_comments"
+        [currentSortField]="list.sortField"
+        [currentSortReverse]="list.sortReverse"
+        (sort)="onSort($event)"
+        i18n>Comments</th>
       <th class="d-none d-xl-table-cell"
         appSortable="document_type__name"
         [currentSortField]="list.sortField"
           <a routerLink="/documents/{{d.id}}" title="Edit document" i18n-title style="overflow-wrap: anywhere;">{{d.title | documentTitle}}</a>
           <app-tag [tag]="t" *ngFor="let t of d.tags$ | async" class="ms-1" clickable="true" linkTitle="Filter by tag" i18n-linkTitle (click)="clickTag(t.id);$event.stopPropagation()"></app-tag>
         </td>
+        <td class="d-none d-xl-table-cell">
+          <a routerLink="/documents/{{d.id}}/comments" *ngIf="d.n_comments" class="btn btn-sm p-0">
+            <span class="badge rounded-pill bg-light border text-primary">
+            <svg class="metadata-icon ms-1 me-1" fill="currentColor">
+              <use xlink:href="assets/bootstrap-icons.svg#chat-left-text"/>
+            </svg>
+            {{d.n_comments}}</span>
+          </a>
+        </td>
         <td class="d-none d-xl-table-cell">
           <ng-container *ngIf="d.document_type">
             <a (click)="clickDocumentType(d.document_type);$event.stopPropagation()" title="Filter by document type" i18n-title>{{(d.document_type$ | async)?.name}}</a>
index ed4efbe9db0193d1c58463571b4a1a663fbbb7e0..e5a69361fdb857defca1781902a77fa1af1ab33f 100644 (file)
@@ -436,6 +436,12 @@ textarea,
   height: 12px;
 }
 
+.metadata-icon {
+  width: 0.9rem;
+  height: 0.9rem;
+  padding: 0.05rem;
+}
+
 table.table {
   color: var(--bs-body-color);