Fix switching between docs

This commit is contained in:
shamoon
2026-02-10 15:10:45 -08:00
parent b676397b80
commit bfb65a1eb8
3 changed files with 48 additions and 10 deletions

View File

@@ -81,7 +81,7 @@ export class PngxPdfViewerComponent
this.dispatchFindIfReady() this.dispatchFindIfReady()
this.rendered.emit() this.rendered.emit()
} }
private readonly onPagesInit = () => this.applyScale() private readonly onPagesInit = () => this.applyViewerState()
private readonly onPageChanging = (evt: { pageNumber: number }) => { private readonly onPageChanging = (evt: { pageNumber: number }) => {
// Avoid [(page)] two-way binding re-triggers navigation // Avoid [(page)] two-way binding re-triggers navigation
this.lastViewerPage = evt.pageNumber this.lastViewerPage = evt.pageNumber
@@ -90,8 +90,10 @@ export class PngxPdfViewerComponent
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(changes: SimpleChanges): void {
if (changes['src']) { if (changes['src']) {
this.hasLoaded = false this.resetViewerState()
if (this.src) {
this.loadDocument() this.loadDocument()
}
return return
} }
@@ -139,6 +141,21 @@ export class PngxPdfViewerComponent
this.pdfViewer = undefined this.pdfViewer = undefined
} }
private resetViewerState(): void {
this.hasLoaded = false
this.hasRenderedPage = false
this.lastFindQuery = ''
this.lastViewerPage = undefined
this.loadingTask?.destroy()
this.loadingTask = undefined
this.pdf = undefined
this.linkService.setDocument(null)
if (this.pdfViewer) {
this.pdfViewer.setDocument(null)
this.pdfViewer.currentPageNumber = 1
}
}
private async loadDocument(): Promise<void> { private async loadDocument(): Promise<void> {
if (this.hasLoaded) { if (this.hasLoaded) {
return return
@@ -222,7 +239,11 @@ export class PngxPdfViewerComponent
hasPages && hasPages &&
this.page !== this.lastViewerPage this.page !== this.lastViewerPage
) { ) {
this.pdfViewer.currentPageNumber = this.page const nextPage = Math.min(
Math.max(Math.trunc(this.page), 1),
this.pdfViewer.pagesCount
)
this.pdfViewer.currentPageNumber = nextPage
} }
if (this.page === this.lastViewerPage) { if (this.page === this.lastViewerPage) {
this.lastViewerPage = undefined this.lastViewerPage = undefined

View File

@@ -537,7 +537,7 @@
@if (!useNativePdfViewer) { @if (!useNativePdfViewer) {
<div class="preview-sticky pdf-viewer-container"> <div class="preview-sticky pdf-viewer-container">
<pngx-pdf-viewer <pngx-pdf-viewer
[src]="{ url: previewUrl, password: password }" [src]="pdfSource"
[renderMode]="PdfRenderMode.All" [renderMode]="PdfRenderMode.All"
[(page)]="previewCurrentPage" [(page)]="previewCurrentPage"
[zoomScale]="previewZoomScale" [zoomScale]="previewZoomScale"

View File

@@ -116,6 +116,7 @@ import { PDFEditorComponent } from '../common/pdf-editor/pdf-editor.component'
import { PngxPdfViewerComponent } from '../common/pdf-viewer/pdf-viewer.component' import { PngxPdfViewerComponent } from '../common/pdf-viewer/pdf-viewer.component'
import { import {
PdfRenderMode, PdfRenderMode,
PdfSource,
PdfZoomLevel, PdfZoomLevel,
PdfZoomScale, PdfZoomScale,
PngxPdfDocumentProxy, PngxPdfDocumentProxy,
@@ -239,16 +240,18 @@ export class DocumentDetailComponent
titleSubject: Subject<string> = new Subject() titleSubject: Subject<string> = new Subject()
previewUrl: string previewUrl: string
thumbUrl: string thumbUrl: string
// Versioning: which document ID to use for file preview/download
selectedVersionId: number
newVersionLabel: string = ''
versionUploadState: UploadState = UploadState.Idle
versionUploadError: string | null = null
previewText: string previewText: string
previewLoaded: boolean = false previewLoaded: boolean = false
tiffURL: string tiffURL: string
tiffError: string tiffError: string
// Versioning
selectedVersionId: number
newVersionLabel: string = ''
pdfSource: PdfSource
versionUploadState: UploadState = UploadState.Idle
versionUploadError: string | null = null
correspondents: Correspondent[] correspondents: Correspondent[]
documentTypes: DocumentType[] documentTypes: DocumentType[]
storagePaths: StoragePath[] storagePaths: StoragePath[]
@@ -362,6 +365,17 @@ export class DocumentDetailComponent
return ContentRenderType.Other return ContentRenderType.Other
} }
private updatePdfSource() {
if (!this.previewUrl) {
this.pdfSource = undefined
return
}
this.pdfSource = {
url: this.previewUrl,
password: this.password || undefined,
}
}
get isRTL() { get isRTL() {
if (!this.metadata || !this.metadata.lang) return false if (!this.metadata || !this.metadata.lang) return false
else { else {
@@ -442,6 +456,7 @@ export class DocumentDetailComponent
this.previewUrl = this.documentsService.getPreviewUrl( this.previewUrl = this.documentsService.getPreviewUrl(
this.selectedVersionId this.selectedVersionId
) )
this.updatePdfSource()
this.http this.http
.get(this.previewUrl, { responseType: 'text' }) .get(this.previewUrl, { responseType: 'text' })
.pipe( .pipe(
@@ -786,6 +801,7 @@ export class DocumentDetailComponent
false, false,
this.selectedVersionId this.selectedVersionId
) )
this.updatePdfSource()
this.thumbUrl = this.documentsService.getThumbUrl(this.selectedVersionId) this.thumbUrl = this.documentsService.getThumbUrl(this.selectedVersionId)
// For text previews, refresh content // For text previews, refresh content
this.http this.http
@@ -1442,6 +1458,7 @@ export class DocumentDetailComponent
onPasswordKeyUp(event: KeyboardEvent) { onPasswordKeyUp(event: KeyboardEvent) {
if ('Enter' == event.key) { if ('Enter' == event.key) {
this.password = (event.target as HTMLInputElement).value this.password = (event.target as HTMLInputElement).value
this.updatePdfSource()
} }
} }