]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix frontend versions switching
authorshamoon <4887959+shamoon@users.noreply.github.com>
Mon, 8 Sep 2025 16:19:40 +0000 (09:19 -0700)
committershamoon <4887959+shamoon@users.noreply.github.com>
Sat, 20 Sep 2025 17:10:09 +0000 (10:10 -0700)
[ci skip]

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/services/rest/document.service.ts
src-ui/src/main.ts
src/documents/serialisers.py

index 7ea9abfdfd990c143914d511cd6c7bee7ec72783..b09c36b9d57ff474d6a77c2167988495ef55c260 100644 (file)
@@ -1,7 +1,30 @@
 <pngx-page-header [(title)]="title">
+
+  @if (document?.versions?.length > 0) {
+    <div class="btn-group" ngbDropdown role="group">
+      <div class="btn-group" ngbDropdown role="group">
+        <button class="btn btn-sm btn-outline-secondary dropdown-toggle" ngbDropdownToggle>
+          <i-bs name="layers"></i-bs>
+          <span class="d-none d-lg-inline ps-1" i18n>Version</span>
+        </button>
+        <div class="dropdown-menu shadow" ngbDropdownMenu>
+          @for (vid of document.versions; track vid) {
+            <button ngbDropdownItem (click)="selectVersion(vid)">
+              <span i18n>Version</span> {{vid}}
+              @if (selectedVersionId === vid) { <span>&nbsp;✓</span> }
+            </button>
+          }
+        </div>
+      </div>
+      <input #versionFileInput type="file" class="visually-hidden" (change)="onVersionFileSelected($event)" />
+      <button class="btn btn-sm btn-outline-secondary" title="Upload new version" i18n-title (click)="triggerUploadVersion()" [disabled]="!userIsOwner || !userCanEdit">
+        <i-bs name="file-earmark-plus"></i-bs><span class="visually-hidden" i18n>Upload new version</span>
+      </button>
+    </div>
+  }
   @if (archiveContentRenderType === ContentRenderType.PDF && !useNativePdfViewer) {
     @if (previewNumPages) {
-      <div class="input-group input-group-sm d-none d-md-flex">
+      <div class="input-group input-group-sm ms-2 d-none d-md-flex">
         <div class="input-group-text" i18n>Page</div>
           <input class="form-control flex-grow-0 w-auto" type="number" min="1" [max]="previewNumPages" [(ngModel)]="previewCurrentPage" />
         <div class="input-group-text" i18n>of {{previewNumPages}}</div>
     }
   </div>
 
-  @if (document?.versions?.length > 0) {
-    <div class="btn-group ms-2" ngbDropdown role="group">
-      <button class="btn btn-sm btn-outline-secondary dropdown-toggle" ngbDropdownToggle>
-        <i-bs name="layers"></i-bs>
-        <span class="d-none d-lg-inline ps-1" i18n>Version</span>
-      </button>
-      <div class="dropdown-menu shadow" ngbDropdownMenu>
-        <button ngbDropdownItem (click)="selectVersion(document.id)">
-          <span i18n>Current</span>
-          @if (selectedVersionId === document.id) { <span>&nbsp;✓</span> }
-        </button>
-        @for (vid of document.versions; track vid) {
-          <button ngbDropdownItem (click)="selectVersion(vid)">
-            <span i18n>Version</span> {{vid}}
-            @if (selectedVersionId === vid) { <span>&nbsp;✓</span> }
-          </button>
-        }
-      </div>
-    </div>
-  }
-
   <div class="ms-auto" ngbDropdown>
     <button class="btn btn-sm btn-outline-primary" id="actionsDropdown" ngbDropdownToggle>
       <i-bs name="three-dots"></i-bs>
       <button ngbDropdownItem (click)="editPdf()" [disabled]="!userIsOwner || !userCanEdit || originalContentRenderType !== ContentRenderType.PDF">
         <i-bs name="pencil"></i-bs>&nbsp;<ng-container i18n>PDF Editor</ng-container>
       </button>
-
-      <div class="dropdown-divider"></div>
-      <button ngbDropdownItem (click)="triggerUploadVersion()" [disabled]="!userIsOwner || !userCanEdit">
-        <i-bs name="file-earmark-plus"></i-bs>&nbsp;<ng-container i18n>Upload new version</ng-container>
-      </button>
-      <input #versionFileInput type="file" class="visually-hidden" (change)="onVersionFileSelected($event)" />
     </div>
   </div>
 
index 267c8f6d4c68e18fefb40af7364125ffbbba4a58..e09024251d6cf8f58e51ad5fd79de8a36168a8a7 100644 (file)
@@ -644,8 +644,10 @@ export class DocumentDetailComponent
 
   updateComponent(doc: Document) {
     this.document = doc
-    // Default selected version is the head document
-    this.selectedVersionId = doc.id
+    // Default selected version is the newest version
+    this.selectedVersionId = doc.versions?.length
+      ? Math.max(...doc.versions)
+      : doc.id
     this.requiresPassword = false
     this.updateFormForCustomFields()
     if (this.archiveContentRenderType === ContentRenderType.TIFF) {
@@ -714,6 +716,8 @@ export class DocumentDetailComponent
   selectVersion(versionId: number) {
     this.selectedVersionId = versionId
     this.previewUrl = this.documentsService.getPreviewUrl(
+      this.documentId,
+      false,
       this.selectedVersionId
     )
     this.thumbUrl = this.documentsService.getThumbUrl(this.selectedVersionId)
index b70e953b99ee6b37a083fb4576f1500c5ecc7e6c..79eb28467be381b8fa1e83d0205b47129b18571b 100644 (file)
@@ -163,12 +163,19 @@ export class DocumentService extends AbstractPaperlessService<Document> {
     })
   }
 
-  getPreviewUrl(id: number, original: boolean = false): string {
+  getPreviewUrl(
+    id: number,
+    original: boolean = false,
+    versionID: number = null
+  ): string {
     let url = new URL(this.getResourceUrl(id, 'preview'))
     if (this._searchQuery) url.hash = `#search="${this.searchQuery}"`
     if (original) {
       url.searchParams.append('original', 'true')
     }
+    if (versionID) {
+      url.searchParams.append('version', versionID.toString())
+    }
     return url.toString()
   }
 
index cd1f4ef59d2c037e3e3c4713a9133c2ccc0afeb2..a27709f342f0a81ab88283598a6cb480ec47553d 100644 (file)
@@ -78,6 +78,7 @@ import {
   fileEarmarkFill,
   fileEarmarkLock,
   fileEarmarkMinus,
+  fileEarmarkPlus,
   fileEarmarkRichtext,
   fileText,
   files,
@@ -290,6 +291,7 @@ const icons = {
   fileEarmarkFill,
   fileEarmarkLock,
   fileEarmarkMinus,
+  fileEarmarkPlus,
   fileEarmarkRichtext,
   files,
   fileText,
index 192c4e36ae643e51b1871dbb68643abbe2c433b0..9e8fa542f38998e1bd0d8eb556316dd913e91ddd 100644 (file)
@@ -1016,6 +1016,10 @@ class DocumentSerializer(
             request.version if request else settings.REST_FRAMEWORK["DEFAULT_VERSION"],
         )
 
+        if doc.get("versions") is not None:
+            doc["versions"] = sorted(doc["versions"], reverse=True)
+            doc["versions"].append(doc["id"])
+
         if api_version < 9:
             # provide created as a datetime for backwards compatibility
             from django.utils import timezone