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 @@
-
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 @@
+
+
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(","))