diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 9cc39b30a..9b6324a76 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -34,28 +34,28 @@ Select none src/app/components/document-list/document-list.component.html - 11 + 10 Select page src/app/components/document-list/document-list.component.html - 12 + 11 Select all src/app/components/document-list/document-list.component.html - 13 + 12 - - Sort by + + Sort src/app/components/document-list/document-list.component.html - 41 + 39 @@ -83,98 +83,98 @@ {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} src/app/components/document-list/document-list.component.html - 87 + 85 {VAR_PLURAL, plural, =1 {One document} other { documents}} src/app/components/document-list/document-list.component.html - 88 + 86 (filtered) src/app/components/document-list/document-list.component.html - 88 + 86 ASN src/app/components/document-list/document-list.component.html - 107 + 105 Correspondent src/app/components/document-list/document-list.component.html - 113 + 111 Title src/app/components/document-list/document-list.component.html - 119 + 117 Document type src/app/components/document-list/document-list.component.html - 125 + 123 Created src/app/components/document-list/document-list.component.html - 131 + 129 Added src/app/components/document-list/document-list.component.html - 137 + 135 Confirm delete src/app/components/document-detail/document-detail.component.ts - 186 + 192 Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 187 + 193 The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 188 + 194 Delete document src/app/components/document-detail/document-detail.component.ts - 190 + 196 Error deleting document: src/app/components/document-detail/document-detail.component.ts - 197 + 203 @@ -475,21 +475,21 @@ Saved view "" deleted. src/app/components/manage/settings/settings.component.ts - 54 + 55 Settings saved successfully. src/app/components/manage/settings/settings.component.ts - 74 + 68 Error while storing settings on server: src/app/components/manage/settings/settings.component.ts - 86 + 80 @@ -510,7 +510,7 @@ Saved views src/app/components/manage/settings/settings.component.html - 56 + 64 @@ -527,81 +527,102 @@ 17 + + Document editor + + src/app/components/manage/settings/settings.component.html + 33 + + + + Use PDF viewer provided by the browser + + src/app/components/manage/settings/settings.component.html + 37 + + + + This is usually faster for displaying large PDF documents, but it might not work on some browsers. + + src/app/components/manage/settings/settings.component.html + 37 + + Dark mode src/app/components/manage/settings/settings.component.html - 33 + 44 Use system settings src/app/components/manage/settings/settings.component.html - 36 - - - - Bulk editing - - src/app/components/manage/settings/settings.component.html - 44 - - - - Show confirmation dialogs - - src/app/components/manage/settings/settings.component.html - 48 - - - - Deleting documents will always ask for confirmation. - - src/app/components/manage/settings/settings.component.html - 48 - - - - Apply on close - - src/app/components/manage/settings/settings.component.html - 49 + 47 Enable dark mode src/app/components/manage/settings/settings.component.html - 39 + 48 + + + + Bulk editing + + src/app/components/manage/settings/settings.component.html + 52 + + + + Show confirmation dialogs + + src/app/components/manage/settings/settings.component.html + 56 + + + + Deleting documents will always ask for confirmation. + + src/app/components/manage/settings/settings.component.html + 56 + + + + Apply on close + + src/app/components/manage/settings/settings.component.html + 57 Appears on src/app/components/manage/settings/settings.component.html - 68 + 76 Show on dashboard src/app/components/manage/settings/settings.component.html - 71 + 79 Show in sidebar src/app/components/manage/settings/settings.component.html - 75 + 83 No saved views defined. src/app/components/manage/settings/settings.component.html - 85 + 93 @@ -910,28 +931,28 @@ Filter correspondents src/app/components/document-list/filter-editor/filter-editor.component.html - 19 + 20 Filter document types src/app/components/document-list/filter-editor/filter-editor.component.html - 25 + 27 Reset filters src/app/components/document-list/filter-editor/filter-editor.component.html - 47 + 50 Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 161 + 166 Filter drop down element to filter for documents with no correspondent/type/tag assigned @@ -939,7 +960,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 28 + 26 @@ -1002,7 +1023,7 @@ Created: src/app/components/document-list/document-card-large/document-card-large.component.html - 65 + 67 @@ -1023,7 +1044,7 @@ Score: src/app/components/document-list/document-card-large/document-card-large.component.html - 61 + 62 @@ -1187,21 +1208,21 @@ Select: src/app/components/document-list/bulk-editor/bulk-editor.component.html - 11 + 10 All src/app/components/document-list/bulk-editor/bulk-editor.component.html - 21 + 20 Edit: src/app/components/document-list/bulk-editor/bulk-editor.component.html - 28 + 27 diff --git a/src-ui/src/app/app.module.ts b/src-ui/src/app/app.module.ts index 8cd28b6fc..30411c980 100644 --- a/src-ui/src/app/app.module.ts +++ b/src-ui/src/app/app.module.ts @@ -58,6 +58,7 @@ import { MetadataCollapseComponent } from './components/document-detail/metadata import { SelectDialogComponent } from './components/common/select-dialog/select-dialog.component'; import { NgSelectModule } from '@ng-select/ng-select'; import { NumberComponent } from './components/common/input/number/number.component'; +import { SafePipe } from './pipes/safe.pipe'; @NgModule({ declarations: [ @@ -106,7 +107,8 @@ import { NumberComponent } from './components/common/input/number/number.compone DocumentTitlePipe, MetadataCollapseComponent, SelectDialogComponent, - NumberComponent + NumberComponent, + SafePipe ], imports: [ BrowserModule, diff --git a/src-ui/src/app/components/document-detail/document-detail.component.html b/src-ui/src/app/components/document-detail/document-detail.component.html index d3d736aa2..7d5e93fbe 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.html +++ b/src-ui/src/app/components/document-detail/document-detail.component.html @@ -1,5 +1,5 @@ -
+
Page
@@ -134,8 +134,13 @@
-
- -
+ +
+ +
+ + + +
diff --git a/src-ui/src/app/components/document-detail/document-detail.component.scss b/src-ui/src/app/components/document-detail/document-detail.component.scss index 998653bab..346c9f4b0 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.scss +++ b/src-ui/src/app/components/document-detail/document-detail.component.scss @@ -1,6 +1,9 @@ -.pdf-viewer-container { +.preview-sticky { height: calc(100vh - 160px); top: 70px; position: sticky; +} + +.pdf-viewer-container { background-color: gray; } diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index 4216b1854..aa2308eac 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -18,6 +18,7 @@ import { DocumentTypeEditDialogComponent } from '../manage/document-type-list/do import { PDFDocumentProxy } from 'ng2-pdf-viewer'; import { ToastService } from 'src/app/services/toast.service'; import { TextComponent } from '../common/input/text/text.component'; +import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service'; @Component({ selector: 'app-document-detail', @@ -70,7 +71,12 @@ export class DocumentDetailComponent implements OnInit { private openDocumentService: OpenDocumentsService, private documentListViewService: DocumentListViewService, private documentTitlePipe: DocumentTitlePipe, - private toastService: ToastService) { } + private toastService: ToastService, + private settings: SettingsService) { } + + get useNativePdfViewer(): boolean { + return this.settings.get(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER) + } getContentType() { return this.metadata?.has_archive_version ? 'application/pdf' : this.metadata?.original_mime_type diff --git a/src-ui/src/app/components/manage/settings/settings.component.html b/src-ui/src/app/components/manage/settings/settings.component.html index 90ef0e6ec..cc4de9bf0 100644 --- a/src-ui/src/app/components/manage/settings/settings.component.html +++ b/src-ui/src/app/components/manage/settings/settings.component.html @@ -28,16 +28,24 @@ +
+
+ Document editor +
+
+ + + +
+
+
Dark mode
- -
- - -
+ +
diff --git a/src-ui/src/app/components/manage/settings/settings.component.ts b/src-ui/src/app/components/manage/settings/settings.component.ts index 559ffe00f..0e364e6c5 100644 --- a/src-ui/src/app/components/manage/settings/settings.component.ts +++ b/src-ui/src/app/components/manage/settings/settings.component.ts @@ -21,6 +21,7 @@ export class SettingsComponent implements OnInit { 'documentListItemPerPage': new FormControl(this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE)), 'darkModeUseSystem': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_USE_SYSTEM)), 'darkModeEnabled': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_ENABLED)), + 'useNativePdfViewer': new FormControl(this.settings.get(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER)), 'savedViews': this.savedViewGroup }) @@ -55,20 +56,13 @@ export class SettingsComponent implements OnInit { }) } - toggleDarkModeSetting() { - if (this.settingsForm.value.darkModeUseSystem) { - (this.settingsForm.controls.darkModeEnabled as FormControl).disable() - } else { - (this.settingsForm.controls.darkModeEnabled as FormControl).enable() - } - } - private saveLocalSettings() { this.settings.set(SETTINGS_KEYS.BULK_EDIT_APPLY_ON_CLOSE, this.settingsForm.value.bulkEditApplyOnClose) this.settings.set(SETTINGS_KEYS.BULK_EDIT_CONFIRMATION_DIALOGS, this.settingsForm.value.bulkEditConfirmationDialogs) this.settings.set(SETTINGS_KEYS.DOCUMENT_LIST_SIZE, this.settingsForm.value.documentListItemPerPage) this.settings.set(SETTINGS_KEYS.DARK_MODE_USE_SYSTEM, this.settingsForm.value.darkModeUseSystem) this.settings.set(SETTINGS_KEYS.DARK_MODE_ENABLED, (this.settingsForm.value.darkModeEnabled == true).toString()) + this.settings.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, this.settingsForm.value.useNativePdfViewer) this.documentListViewService.updatePageSize() this.settings.updateDarkModeSettings() this.toastService.showInfo($localize`Settings saved successfully.`) diff --git a/src-ui/src/app/pipes/safe.pipe.spec.ts b/src-ui/src/app/pipes/safe.pipe.spec.ts new file mode 100644 index 000000000..49ee0ad14 --- /dev/null +++ b/src-ui/src/app/pipes/safe.pipe.spec.ts @@ -0,0 +1,8 @@ +import { SafePipe } from './safe.pipe'; + +describe('SafePipe', () => { + it('create an instance', () => { + const pipe = new SafePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src-ui/src/app/pipes/safe.pipe.ts b/src-ui/src/app/pipes/safe.pipe.ts new file mode 100644 index 000000000..6614964a9 --- /dev/null +++ b/src-ui/src/app/pipes/safe.pipe.ts @@ -0,0 +1,19 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Pipe({ + name: 'safe' +}) +export class SafePipe implements PipeTransform { + + constructor(private sanitizer: DomSanitizer) { } + + transform(url) { + if (url == null) { + return this.sanitizer.bypassSecurityTrustResourceUrl("") + } else { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } + } + +} \ No newline at end of file diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts index a8f85972d..eb533e118 100644 --- a/src-ui/src/app/services/settings.service.ts +++ b/src-ui/src/app/services/settings.service.ts @@ -12,7 +12,8 @@ export const SETTINGS_KEYS = { BULK_EDIT_APPLY_ON_CLOSE: 'general-settings:bulk-edit:apply-on-close', DOCUMENT_LIST_SIZE: 'general-settings:documentListSize', DARK_MODE_USE_SYSTEM: 'general-settings:dark-mode:use-system', - DARK_MODE_ENABLED: 'general-settings:dark-mode:enabled' + DARK_MODE_ENABLED: 'general-settings:dark-mode:enabled', + USE_NATIVE_PDF_VIEWER: 'general-settings:document-details:native-pdf-viewer' } const SETTINGS: PaperlessSettings[] = [ @@ -20,7 +21,8 @@ const SETTINGS: PaperlessSettings[] = [ {key: SETTINGS_KEYS.BULK_EDIT_APPLY_ON_CLOSE, type: "boolean", default: false}, {key: SETTINGS_KEYS.DOCUMENT_LIST_SIZE, type: "number", default: 50}, {key: SETTINGS_KEYS.DARK_MODE_USE_SYSTEM, type: "boolean", default: true}, - {key: SETTINGS_KEYS.DARK_MODE_ENABLED, type: "boolean", default: false} + {key: SETTINGS_KEYS.DARK_MODE_ENABLED, type: "boolean", default: false}, + {key: SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, type: "boolean", default: false} ] @Injectable({ diff --git a/src/paperless/settings.py b/src/paperless/settings.py index fdc6df9f3..894ecb60b 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -179,6 +179,12 @@ if ENABLE_HTTP_REMOTE_USER: 'rest_framework.authentication.RemoteUserAuthentication' ) +# X-Frame options for embedded PDF display: +if DEBUG: + X_FRAME_OPTIONS = 'ANY' +else: + X_FRAME_OPTIONS = 'SAMEORIGIN' + # We allow CORS from localhost:8080 CORS_ALLOWED_ORIGINS = tuple(os.getenv("PAPERLESS_CORS_ALLOWED_HOSTS", "http://localhost:8000").split(","))