mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge branch 'feature-invert-thumb-option' into dev
This commit is contained in:
		| @@ -18,8 +18,9 @@ paperlessng_directory: /opt/paperless-ng | ||||
| paperlessng_consumption_dir: "{{ paperlessng_directory }}/consumption" | ||||
| paperlessng_data_dir: "{{ paperlessng_directory }}/data" | ||||
| paperlessng_media_root: "{{ paperlessng_directory }}/media" | ||||
| paperlessng_static_dir: "{{ paperlessng_directory }}/static" | ||||
| paperlessng_staticdir: "{{ paperlessng_directory }}/static" | ||||
| paperlessng_filename_format: | ||||
| paperlessng_logging_dir: "{{ paperlessng_data_dir }}/log" | ||||
| paperlessng_virtualenv: "{{ paperlessng_directory }}/.venv" | ||||
|  | ||||
| # Hosting & Security | ||||
| @@ -36,12 +37,15 @@ paperlessng_enable_http_remote_user: False | ||||
| paperlessng_ocr_languages: | ||||
|   - eng | ||||
| paperlessng_ocr_mode: skip | ||||
| paperlessng_ocr_clean: clean | ||||
| paperlessng_ocr_deskew: True | ||||
| paperlessng_ocr_rotate_pages: True | ||||
| paperlessng_ocr_rotate_pages_threshold: 12 | ||||
| paperlessng_ocr_output_type: pdfa | ||||
| paperlessng_ocr_pages: 0 | ||||
| paperlessng_ocr_image_dpi: | ||||
| # see https://ocrmypdf.readthedocs.io/en/latest/api.html#ocrmypdf.ocr | ||||
| paperlessng_ocr_user_args: | ||||
|   #- "deskew": True  # https://github.com/jonaswinkler/paperless-ng/issues/231 | ||||
|   - "optimize": 1 | ||||
| paperlessng_use_jbig2enc: True | ||||
| paperlessng_big2enc_lossy: False | ||||
| @@ -57,10 +61,11 @@ paperlessng_consumer_polling: 0 | ||||
| paperlessng_consumer_delete_duplicates: False | ||||
| paperlessng_consumer_recursive: False | ||||
| paperlessng_consumer_subdirs_as_tags: False | ||||
| paperlessng_convert_memory_limit: 0 | ||||
| paperlessng_convert_tmpdir: | ||||
| paperlessng_optimize_thumbnails: True | ||||
| paperlessng_post_consume_script: | ||||
| paperlessng_filename_date_order: | ||||
| paperlessng_filename_parse_transforms: | ||||
| paperlessng_thumbnail_font_name: /usr/share/fonts/liberation/LiberationSerif-Regular.ttf | ||||
| paperlessng_ignore_dates: "" | ||||
|  | ||||
|   | ||||
| @@ -43,7 +43,7 @@ | ||||
|  | ||||
| - name: install ocr languages | ||||
|   apt: | ||||
|     pkg: "{{ paperlessng_ocr_languages | map('regex_replace', '^(.*)$', 'tesseract-ocr-\\1') | list }}" | ||||
|     pkg: "{{ paperlessng_ocr_languages | map('regex_replace', '^(.*)$', 'tesseract-ocr-\\1') | map('replace', '_', '-') | list }}" | ||||
|  | ||||
| - name: set up notesalexp repository key (for jbig2enc) | ||||
|   apt_key: | ||||
| @@ -256,7 +256,7 @@ | ||||
|     - "{{ paperlessng_consumption_dir }}" | ||||
|     - "{{ paperlessng_data_dir }}" | ||||
|     - "{{ paperlessng_media_root }}" | ||||
|     - "{{ paperlessng_static_dir }}" | ||||
|     - "{{ paperlessng_staticdir }}" | ||||
|  | ||||
| - name: rename initial config | ||||
|   command: | ||||
| @@ -280,9 +280,11 @@ | ||||
|     - regexp: PAPERLESS_MEDIA_ROOT | ||||
|       line: "PAPERLESS_MEDIA_ROOT={{ paperlessng_media_root }}" | ||||
|     - regexp: PAPERLESS_STATICDIR | ||||
|       line: "PAPERLESS_STATICDIR={{ paperlessng_static_dir }}" | ||||
|       line: "PAPERLESS_STATICDIR={{ paperlessng_staticdir }}" | ||||
|     - regexp: PAPERLESS_FILENAME_FORMAT | ||||
|       line: "PAPERLESS_FILENAME_FORMAT={{ paperlessng_filename_format }}" | ||||
|     - regexp: PAPERLESS_LOGGING_DIR | ||||
|       line: "PAPERLESS_LOGGING_DIR={{ paperlessng_logging_dir }}" | ||||
|     # Hosting & Security | ||||
|     - regexp: PAPERLESS_SECRET_KEY | ||||
|       line: "PAPERLESS_SECRET_KEY={{ paperlessng_secret_key }}" | ||||
| @@ -302,9 +304,17 @@ | ||||
|       line: "PAPERLESS_ENABLE_HTTP_REMOTE_USER={{ paperlessng_enable_http_remote_user }}" | ||||
|     # OCR settings | ||||
|     - regexp: PAPERLESS_OCR_LANGUAGE | ||||
|       line: "PAPERLESS_OCR_LANGUAGE={{ paperlessng_ocr_languages | join('+') }}" | ||||
|       line: "PAPERLESS_OCR_LANGUAGE={{ paperlessng_ocr_languages | join('+') | replace('-','_') }}" | ||||
|     - regexp: PAPERLESS_OCR_MODE | ||||
|       line: "PAPERLESS_OCR_MODE={{ paperlessng_ocr_mode }}" | ||||
|     - regexp: PAPERLESS_OCR_CLEAN | ||||
|       line: "PAPERLESS_OCR_CLEAN={{ paperlessng_ocr_clean }}" | ||||
|     - regexp: PAPERLESS_OCR_DESKEW | ||||
|       line: "PAPERLESS_OCR_DESKEW={{ paperlessng_ocr_deskew }}" | ||||
|     - regexp: PAPERLESS_OCR_ROTATE_PAGES | ||||
|       line: "PAPERLESS_OCR_ROTATE_PAGES={{ paperlessng_ocr_rotate_pages }}" | ||||
|     - regexp: PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD | ||||
|       line: "PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD={{ paperlessng_ocr_rotate_pages_threshold }}" | ||||
|     - regexp: PAPERLESS_OCR_OUTPUT_TYPE | ||||
|       line: "PAPERLESS_OCR_OUTPUT_TYPE={{ paperlessng_ocr_output_type }}" | ||||
|     - regexp: PAPERLESS_OCR_PAGES | ||||
| @@ -331,6 +341,10 @@ | ||||
|       line: "PAPERLESS_CONSUMER_RECURSIVE={{ paperlessng_consumer_recursive }}" | ||||
|     - regexp: PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS | ||||
|       line: "PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS={{ paperlessng_consumer_subdirs_as_tags }}" | ||||
|     - regexp: PAPERLESS_CONVERT_MEMORY_LIMIT | ||||
|       line: "PAPERLESS_CONVERT_MEMORY_LIMIT={{ paperlessng_convert_memory_limit }}" | ||||
|     - regexp: PAPERLESS_CONVERT_TMPDIR | ||||
|       line: "PAPERLESS_CONVERT_TMPDIR={{ paperlessng_convert_tmpdir }}" | ||||
|     - regexp: PAPERLESS_OPTIMIZE_THUMBNAILS | ||||
|       line: "PAPERLESS_OPTIMIZE_THUMBNAILS={{ paperlessng_optimize_thumbnails }}" | ||||
|     - regexp: PAPERLESS_POST_CONSUME_SCRIPT | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <div class="card mb-3 shadow-sm" [class.card-selected]="selected" [class.document-card]="selectable"> | ||||
|   <div class="row no-gutters"> | ||||
|     <div class="col-md-2 d-none d-lg-block doc-img-background rounded-left" [class.doc-img-background-selected]="selected" (click)="this.toggleSelected.emit($event)"> | ||||
|       <img [src]="getThumbUrl()" class="card-img doc-img border-right rounded-left"> | ||||
|       <img [src]="getThumbUrl()" class="card-img doc-img border-right rounded-left" [class.inverted]="getIsThumbInverted()"> | ||||
|  | ||||
|       <div style="top: 0; left: 0" class="position-absolute border-right border-bottom bg-light p-1" [class.document-card-check]="!selected"> | ||||
|         <div class="custom-control custom-checkbox"> | ||||
|   | ||||
| @@ -2,6 +2,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; | ||||
| import { DomSanitizer } from '@angular/platform-browser'; | ||||
| import { PaperlessDocument } from 'src/app/data/paperless-document'; | ||||
| import { DocumentService } from 'src/app/services/rest/document.service'; | ||||
| import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service'; | ||||
|  | ||||
| @Component({ | ||||
|   selector: 'app-document-card-large', | ||||
| @@ -10,7 +11,7 @@ import { DocumentService } from 'src/app/services/rest/document.service'; | ||||
| }) | ||||
| export class DocumentCardLargeComponent implements OnInit { | ||||
|  | ||||
|   constructor(private documentService: DocumentService, private sanitizer: DomSanitizer) { } | ||||
|   constructor(private documentService: DocumentService, private sanitizer: DomSanitizer, private settingsService: SettingsService) { } | ||||
|  | ||||
|   @Input() | ||||
|   selected = false | ||||
| @@ -53,6 +54,10 @@ export class DocumentCardLargeComponent implements OnInit { | ||||
|   ngOnInit(): void { | ||||
|   } | ||||
|  | ||||
|   getIsThumbInverted() { | ||||
|     return this.settingsService.get(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED) | ||||
|   } | ||||
|  | ||||
|   getDetailsAsString() { | ||||
|     if (typeof this.details === 'string') { | ||||
|       return this.details.substring(0, 500) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <div class="col p-2 h-100"> | ||||
|   <div class="card h-100 shadow-sm document-card" [class.card-selected]="selected"> | ||||
|     <div class="border-bottom doc-img-container" [class.doc-img-background-selected]="selected" (click)="this.toggleSelected.emit($event)"> | ||||
|       <img class="card-img doc-img rounded-top" [src]="getThumbUrl()"> | ||||
|       <img class="card-img doc-img rounded-top" [class.inverted]="getIsThumbInverted()" [src]="getThumbUrl()"> | ||||
|  | ||||
|       <div class="border-right border-bottom bg-light p-1 rounded document-card-check"> | ||||
|         <div class="custom-control custom-checkbox"> | ||||
|   | ||||
| @@ -2,6 +2,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; | ||||
| import { map } from 'rxjs/operators'; | ||||
| import { PaperlessDocument } from 'src/app/data/paperless-document'; | ||||
| import { DocumentService } from 'src/app/services/rest/document.service'; | ||||
| import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service'; | ||||
|  | ||||
| @Component({ | ||||
|   selector: 'app-document-card-small', | ||||
| @@ -10,7 +11,7 @@ import { DocumentService } from 'src/app/services/rest/document.service'; | ||||
| }) | ||||
| export class DocumentCardSmallComponent implements OnInit { | ||||
|  | ||||
|   constructor(private documentService: DocumentService) { } | ||||
|   constructor(private documentService: DocumentService, private settingsService: SettingsService) { } | ||||
|  | ||||
|   @Input() | ||||
|   selected = false | ||||
| @@ -32,6 +33,10 @@ export class DocumentCardSmallComponent implements OnInit { | ||||
|   ngOnInit(): void { | ||||
|   } | ||||
|  | ||||
|   getIsThumbInverted() { | ||||
|     return this.settingsService.get(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED) | ||||
|   } | ||||
|  | ||||
|   getThumbUrl() { | ||||
|     return this.documentService.getThumbUrl(this.document.id) | ||||
|   } | ||||
|   | ||||
| @@ -96,6 +96,7 @@ | ||||
|           <div class="col"> | ||||
|             <app-input-check i18n-title title="Use system settings" formControlName="darkModeUseSystem"></app-input-check> | ||||
|             <app-input-check [hidden]="settingsForm.value.darkModeUseSystem" i18n-title title="Enable dark mode" formControlName="darkModeEnabled"></app-input-check> | ||||
|             <app-input-check i18n-title title="Invert Thumbnails in dark mode" formControlName="darkModeInvertThumbs"></app-input-check> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|   | ||||
| @@ -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)), | ||||
|     'darkModeInvertThumbs': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED)), | ||||
|     'useNativePdfViewer': new FormControl(this.settings.get(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER)), | ||||
|     'savedViews': this.savedViewGroup, | ||||
|     'displayLanguage': new FormControl(this.settings.getLanguage()), | ||||
| @@ -74,6 +75,7 @@ export class SettingsComponent implements OnInit { | ||||
|     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.DARK_MODE_THUMB_INVERTED, (this.settingsForm.value.darkModeInvertThumbs == true).toString()) | ||||
|     this.settings.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, this.settingsForm.value.useNativePdfViewer) | ||||
|     this.settings.set(SETTINGS_KEYS.DATE_LOCALE, this.settingsForm.value.dateLocale) | ||||
|     this.settings.set(SETTINGS_KEYS.DATE_FORMAT, this.settingsForm.value.dateFormat) | ||||
|   | ||||
| @@ -26,6 +26,7 @@ export const SETTINGS_KEYS = { | ||||
|   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_THUMB_INVERTED: 'general-settings:dark-mode:thumb-inverted', | ||||
|   USE_NATIVE_PDF_VIEWER: 'general-settings:document-details:native-pdf-viewer', | ||||
|   DATE_LOCALE: 'general-settings:date-display:date-locale', | ||||
|   DATE_FORMAT: 'general-settings:date-display:date-format', | ||||
| @@ -41,6 +42,7 @@ const SETTINGS: PaperlessSettings[] = [ | ||||
|   {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_THUMB_INVERTED, type: "boolean", default: true}, | ||||
|   {key: SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, type: "boolean", default: false}, | ||||
|   {key: SETTINGS_KEYS.DATE_LOCALE, type: "string", default: ""}, | ||||
|   {key: SETTINGS_KEYS.DATE_FORMAT, type: "string", default: "mediumDate"}, | ||||
|   | ||||
| @@ -139,15 +139,18 @@ $border-color-dark-mode: #47494f; | ||||
|  | ||||
|   .doc-img { | ||||
|     mix-blend-mode: normal; | ||||
|     filter: invert(95%) hue-rotate(180deg); | ||||
|     border-radius: 0; | ||||
|     border-color: $bg-dark-mode; | ||||
|  | ||||
|     filter: invert(10%); | ||||
|     &.border-right { | ||||
|       border-right: none !important; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .doc-img.inverted { | ||||
|     filter: invert(95%) hue-rotate(180deg); | ||||
|   } | ||||
|  | ||||
|   .card-selected .doc-img { | ||||
|     mix-blend-mode: luminosity; | ||||
|   } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jonaswinkler
					jonaswinkler