From 0af4638676610dc5cfc0dad563bd8e0d67ee5dae Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 11 Dec 2023 15:58:49 -0800
Subject: [PATCH] Improved popup preview with embedded viewer, plaintext, error
handling
---
src-ui/src/app/app.module.ts | 2 +
.../preview-popup.component.html | 27 +++++++++
.../preview-popup.component.scss | 9 +++
.../preview-popup.component.spec.ts | 60 +++++++++++++++++++
.../preview-popup/preview-popup.component.ts | 31 ++++++++++
.../saved-view-widget.component.html | 7 ++-
.../saved-view-widget.component.spec.ts | 2 +
.../saved-view-widget.component.ts | 21 +++++--
.../document-card-large.component.html | 7 ++-
.../document-card-large.component.spec.ts | 23 +++++++
.../document-card-large.component.ts | 16 +++--
.../document-card-small.component.html | 7 ++-
.../document-card-small.component.spec.ts | 23 +++++++
.../document-card-small.component.ts | 16 +++--
.../popover-preview/popover-preview.scss | 22 -------
src-ui/src/styles.scss | 5 ++
16 files changed, 240 insertions(+), 38 deletions(-)
create mode 100644 src-ui/src/app/components/common/preview-popup/preview-popup.component.html
create mode 100644 src-ui/src/app/components/common/preview-popup/preview-popup.component.scss
create mode 100644 src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts
create mode 100644 src-ui/src/app/components/common/preview-popup/preview-popup.component.ts
delete mode 100644 src-ui/src/app/components/document-list/popover-preview/popover-preview.scss
diff --git a/src-ui/src/app/app.module.ts b/src-ui/src/app/app.module.ts
index 6910061d2..c3b98549a 100644
--- a/src-ui/src/app/app.module.ts
+++ b/src-ui/src/app/app.module.ts
@@ -107,6 +107,7 @@ import { CustomFieldsDropdownComponent } from './components/common/custom-fields
import { ProfileEditDialogComponent } from './components/common/profile-edit-dialog/profile-edit-dialog.component'
import { PdfViewerComponent } from './components/common/pdf-viewer/pdf-viewer.component'
import { DocumentLinkComponent } from './components/common/input/document-link/document-link.component'
+import { PreviewPopupComponent } from './components/common/preview-popup/preview-popup.component'
import localeAf from '@angular/common/locales/af'
import localeAr from '@angular/common/locales/ar'
@@ -261,6 +262,7 @@ function initializeApp(settings: SettingsService) {
ProfileEditDialogComponent,
PdfViewerComponent,
DocumentLinkComponent,
+ PreviewPopupComponent,
],
imports: [
BrowserModule,
diff --git a/src-ui/src/app/components/common/preview-popup/preview-popup.component.html b/src-ui/src/app/components/common/preview-popup/preview-popup.component.html
new file mode 100644
index 000000000..e81ff9a40
--- /dev/null
+++ b/src-ui/src/app/components/common/preview-popup/preview-popup.component.html
@@ -0,0 +1,27 @@
+
diff --git a/src-ui/src/app/components/common/preview-popup/preview-popup.component.scss b/src-ui/src/app/components/common/preview-popup/preview-popup.component.scss
new file mode 100644
index 000000000..af8dc565a
--- /dev/null
+++ b/src-ui/src/app/components/common/preview-popup/preview-popup.component.scss
@@ -0,0 +1,9 @@
+.preview-popup-container > * {
+ width: 30rem !important;
+ height: 22rem !important;
+ overflow-y: scroll;
+}
+
+::ng-deep .popover.popover-preview {
+ max-width: 32rem;
+}
diff --git a/src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts b/src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts
new file mode 100644
index 000000000..945ed1572
--- /dev/null
+++ b/src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts
@@ -0,0 +1,60 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { PreviewPopupComponent } from './preview-popup.component'
+import { PdfViewerComponent } from '../pdf-viewer/pdf-viewer.component'
+import { By } from '@angular/platform-browser'
+import { SafeUrlPipe } from 'src/app/pipes/safeurl.pipe'
+
+describe('PreviewPopupComponent', () => {
+ let component: PreviewPopupComponent
+ let fixture: ComponentFixture
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ declarations: [PreviewPopupComponent, PdfViewerComponent, SafeUrlPipe],
+ })
+ fixture = TestBed.createComponent(PreviewPopupComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should render object if use native PDF viewer', () => {
+ component.useNativePdfViewer = true
+ component.previewURL = 'sample.pdf'
+ fixture.detectChanges()
+ expect(fixture.debugElement.query(By.css('object'))).not.toBeNull()
+ })
+
+ it('should render pngx viewer if not use native PDF viewer', () => {
+ component.useNativePdfViewer = false
+ component.previewURL = 'sample.pdf'
+ fixture.detectChanges()
+ expect(fixture.debugElement.query(By.css('object'))).toBeNull()
+ expect(fixture.debugElement.query(By.css('pngx-pdf-viewer'))).not.toBeNull()
+ })
+
+ it('should render plain text if needed', () => {
+ component.renderAsPlainText = true
+ component.previewText = 'Hello world'
+ fixture.detectChanges()
+ expect(fixture.debugElement.query(By.css('object'))).toBeNull()
+ expect(fixture.debugElement.query(By.css('pngx-pdf-viewer'))).toBeNull()
+ expect(fixture.debugElement.nativeElement.textContent).toContain(
+ 'Hello world'
+ )
+ })
+
+ it('should show lock icon on password error', () => {
+ component.onError({ name: 'PasswordException' })
+ fixture.detectChanges()
+ expect(fixture.debugElement.query(By.css('svg'))).not.toBeNull()
+ })
+
+ it('should show message on error', () => {
+ component.onError({})
+ fixture.detectChanges()
+ expect(fixture.debugElement.nativeElement.textContent).toContain(
+ 'Error loading preview'
+ )
+ })
+})
diff --git a/src-ui/src/app/components/common/preview-popup/preview-popup.component.ts b/src-ui/src/app/components/common/preview-popup/preview-popup.component.ts
new file mode 100644
index 000000000..ef34db9f2
--- /dev/null
+++ b/src-ui/src/app/components/common/preview-popup/preview-popup.component.ts
@@ -0,0 +1,31 @@
+import { Component, Input } from '@angular/core'
+
+@Component({
+ selector: 'pngx-preview-popup',
+ templateUrl: './preview-popup.component.html',
+ styleUrls: ['./preview-popup.component.scss'],
+})
+export class PreviewPopupComponent {
+ @Input()
+ renderAsPlainText: boolean = false
+
+ @Input()
+ previewText: string
+
+ @Input()
+ previewURL: string
+
+ @Input()
+ useNativePdfViewer: boolean = false
+
+ error = false
+ requiresPassword: boolean = false
+
+ onError(event) {
+ if (event.name == 'PasswordException') {
+ this.requiresPassword = true
+ } else {
+ this.error = true
+ }
+ }
+}
diff --git a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
index 637a28a54..695936ad9 100644
--- a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
+++ b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html
@@ -36,7 +36,12 @@
-
+
+
View
-
+
+
-
+
+