From 0aa9462cead77f4b06f07196f9f1d182eebbf0ff Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 4 May 2023 23:18:02 -0700 Subject: [PATCH 001/103] Save tour completion, hide welcome widget --- src-ui/messages.xlf | 69 ++++++++++--------- src-ui/src/app/app.component.ts | 15 ++-- .../dashboard/dashboard.component.html | 26 ++++--- .../dashboard/dashboard.component.ts | 12 +++- .../welcome-widget.component.html | 3 +- .../welcome-widget.component.ts | 5 +- src-ui/src/app/data/paperless-uisettings.ts | 6 ++ src-ui/src/app/services/settings.service.ts | 17 ++++- 8 files changed, 96 insertions(+), 57 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 422eb69aa..1a5d4402c 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -410,7 +410,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 @@ -719,7 +719,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -730,7 +730,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 @@ -1243,7 +1243,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -1890,21 +1890,21 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned @@ -2167,14 +2167,14 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 @@ -2357,35 +2357,35 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 @@ -2717,43 +2717,43 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -2764,35 +2764,35 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -2803,14 +2803,14 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -2841,7 +2841,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -2868,7 +2868,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 @@ -2877,7 +2877,7 @@ )"/> src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 @@ -5272,6 +5272,13 @@ 426 + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + Information diff --git a/src-ui/src/app/app.component.ts b/src-ui/src/app/app.component.ts index e22098496..9d9f2c99c 100644 --- a/src-ui/src/app/app.component.ts +++ b/src-ui/src/app/app.component.ts @@ -2,7 +2,7 @@ import { SettingsService } from './services/settings.service' import { SETTINGS_KEYS } from './data/paperless-uisettings' import { Component, OnDestroy, OnInit, Renderer2 } from '@angular/core' import { Router } from '@angular/router' -import { Subscription } from 'rxjs' +import { Subscription, first } from 'rxjs' import { ConsumerStatusService } from './services/consumer-status.service' import { ToastService } from './services/toast.service' import { NgxFileDropEntry } from 'ngx-file-drop' @@ -240,13 +240,14 @@ export class AppComponent implements OnInit, OnDestroy { this.tourService.start$.subscribe(() => { this.renderer.addClass(document.body, 'tour-active') - }) - this.tourService.end$.subscribe(() => { - // animation time - setTimeout(() => { - this.renderer.removeClass(document.body, 'tour-active') - }, 500) + this.tourService.end$.pipe(first()).subscribe(() => { + this.settings.completeTour() + // animation time + setTimeout(() => { + this.renderer.removeClass(document.body, 'tour-active') + }, 500) + }) }) } diff --git a/src-ui/src/app/components/dashboard/dashboard.component.html b/src-ui/src/app/components/dashboard/dashboard.component.html index 5ddcada9d..f2dcf855e 100644 --- a/src-ui/src/app/components/dashboard/dashboard.component.html +++ b/src-ui/src/app/components/dashboard/dashboard.component.html @@ -21,22 +21,20 @@
- -
- Loading... -
- - - -
- - - - - +
+ +
+ Loading...
-
+ + +
+ + + +
+
diff --git a/src-ui/src/app/components/dashboard/dashboard.component.ts b/src-ui/src/app/components/dashboard/dashboard.component.ts index de3c5c969..2a7533808 100644 --- a/src-ui/src/app/components/dashboard/dashboard.component.ts +++ b/src-ui/src/app/components/dashboard/dashboard.component.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core' import { SavedViewService } from 'src/app/services/rest/saved-view.service' import { SettingsService } from 'src/app/services/settings.service' import { ComponentWithPermissions } from '../with-permissions/with-permissions.component' +import { TourService } from 'ngx-ui-tour-ng-bootstrap' @Component({ selector: 'app-dashboard', @@ -11,7 +12,8 @@ import { ComponentWithPermissions } from '../with-permissions/with-permissions.c export class DashboardComponent extends ComponentWithPermissions { constructor( public settingsService: SettingsService, - public savedViewService: SavedViewService + public savedViewService: SavedViewService, + private tourService: TourService ) { super() } @@ -23,4 +25,12 @@ export class DashboardComponent extends ComponentWithPermissions { return $localize`Welcome to Paperless-ngx` } } + + completeTour() { + if (this.tourService.getStatus() !== 0) { + this.tourService.end() // will call settingsService.completeTour() + } else { + this.settingsService.completeTour() + } + } } diff --git a/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html b/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html index f33e5621a..63532813f 100644 --- a/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html +++ b/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html @@ -1,5 +1,4 @@ - - +

Paperless-ngx is running! 🎉

You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below.

More detail on how to use and configure Paperless-ngx is always available in the documentation.

diff --git a/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.ts b/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.ts index 7a83780c3..d46a91e37 100644 --- a/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.ts +++ b/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core' +import { Component, EventEmitter, Output } from '@angular/core' import { TourService } from 'ngx-ui-tour-ng-bootstrap' @Component({ @@ -8,4 +8,7 @@ import { TourService } from 'ngx-ui-tour-ng-bootstrap' }) export class WelcomeWidgetComponent { constructor(public readonly tourService: TourService) {} + + @Output() + dismiss: EventEmitter = new EventEmitter() } diff --git a/src-ui/src/app/data/paperless-uisettings.ts b/src-ui/src/app/data/paperless-uisettings.ts index 4701a4300..c06aa405d 100644 --- a/src-ui/src/app/data/paperless-uisettings.ts +++ b/src-ui/src/app/data/paperless-uisettings.ts @@ -41,6 +41,7 @@ export const SETTINGS_KEYS = { 'general-settings:update-checking:backend-setting', SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE: 'general-settings:saved-views:warn-on-unsaved-change', + TOUR_COMPLETE: 'general-settings:tour-complete', } export const SETTINGS: PaperlessUiSetting[] = [ @@ -144,4 +145,9 @@ export const SETTINGS: PaperlessUiSetting[] = [ type: 'boolean', default: true, }, + { + key: SETTINGS_KEYS.TOUR_COMPLETE, + type: 'boolean', + default: false, + }, ] diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts index 7b68a423a..207ccba56 100644 --- a/src-ui/src/app/services/settings.service.ts +++ b/src-ui/src/app/services/settings.service.ts @@ -484,7 +484,22 @@ export class SettingsService { offerTour(): boolean { return ( !this.savedViewService.loading && - this.savedViewService.dashboardViews.length == 0 + this.savedViewService.dashboardViews.length == 0 && + !this.get(SETTINGS_KEYS.TOUR_COMPLETE) ) } + + completeTour() { + const tourCompleted = this.get(SETTINGS_KEYS.TOUR_COMPLETE) + if (!tourCompleted) { + this.set(SETTINGS_KEYS.TOUR_COMPLETE, true) + this.storeSettings() + .pipe(first()) + .subscribe(() => { + this.toastService.showInfo( + $localize`You can restart the tour from the settings page.` + ) + }) + } + } } From c59420581c6c0c8c9a5c1f90c6641e66e0f7cc23 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 5 May 2023 01:01:57 -0700 Subject: [PATCH 002/103] Dynamic counts include all pages, hide for "Any" --- .../filterable-dropdown.component.html | 2 +- .../filterable-dropdown.component.ts | 10 +++++++++ .../toggleable-dropdown-button.component.html | 2 +- .../toggleable-dropdown-button.component.ts | 3 +++ .../services/document-list-view.service.ts | 22 +++++++++++++------ src/documents/serialisers.py | 2 +- 6 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html index 57197d1ea..cef3690d1 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html @@ -34,7 +34,7 @@
+ *ngIf="allowSelectNone || item.id" [item]="item" [hideCount]="hideCount(item)" [state]="selectionModel.get(item.id)" [count]="getUpdatedDocumentCount(item.id)" (toggle)="selectionModel.toggle(item.id)" (exclude)="excludeClicked(item.id)" (click)="setButtonItemIndex(i)" [disabled]="disabled">
diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts index b324ac6a0..79548aaf8 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts @@ -12,6 +12,7 @@ import { ToggleableItemState } from './toggleable-dropdown-button/toggleable-dro import { MatchingModel } from 'src/app/data/matching-model' import { Subject } from 'rxjs' import { SelectionDataItem } from 'src/app/services/rest/document.service' +import { ObjectWithPermissions } from 'src/app/data/object-with-permissions' export interface ChangedItems { itemsToAdd: MatchingModel[] @@ -552,4 +553,13 @@ export class FilterableDropdownComponent { // just track the index in case user uses arrows this.keyboardIndex = index } + + hideCount(item: ObjectWithPermissions) { + // counts are pointless when clicking item would add to the set of docs + return ( + this.selectionModel.logicalOperator === LogicalOperator.Or && + this.manyToOne && + this.selectionModel.get(item.id) !== ToggleableItemState.Selected + ) + } } diff --git a/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html b/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html index af935b0db..b67ae736c 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html +++ b/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html @@ -20,5 +20,5 @@ {{item.name}}
-
{{count ?? item.document_count}}
+
{{count ?? item.document_count}}
diff --git a/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.ts b/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.ts index 32ec671b1..7eb6d1b26 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.ts @@ -26,6 +26,9 @@ export class ToggleableDropdownButtonComponent { @Input() disabled: boolean = false + @Input() + hideCount: boolean = false + @Output() toggle = new EventEmitter() diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index 906e36a0f..087cf5473 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core' import { ParamMap, Router } from '@angular/router' -import { Observable } from 'rxjs' +import { Observable, first } from 'rxjs' import { filterRulesDiffer, cloneFilterRules, @@ -230,13 +230,21 @@ export class DocumentListViewService { activeListViewState.documents = result.results this.documentService - .getSelectionData(result.results.map((d) => d.id)) + .listAllFilteredIds(activeListViewState.filterRules) + .pipe(first()) .subscribe({ - next: (selectionData) => { - this.selectionData = selectionData - }, - error: () => { - this.selectionData = null + next: (ids: number[]) => { + this.documentService + .getSelectionData(ids) + .pipe(first()) + .subscribe({ + next: (selectionData) => { + this.selectionData = selectionData + }, + error: () => { + this.selectionData = null + }, + }) }, }) diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index ad2b5d0f6..f15fdd626 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -422,7 +422,7 @@ class DocumentSerializer(OwnedObjectSerializer, DynamicFieldsModelSerializer): def to_representation(self, instance): doc = super().to_representation(instance) - if self.truncate_content: + if self.truncate_content and "content" in self.fields: doc["content"] = doc.get("content")[0:550] return doc From 01fd400ec7cd61ff0da2cbc3766ee82a1e212f46 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:05:02 -0700 Subject: [PATCH 003/103] Moves to the new action for cleaning the published images --- .github/scripts/cleanup-tags.py | 485 ----------------------------- .github/scripts/github.py | 270 ---------------- .github/workflows/cleanup-tags.yml | 95 +++--- 3 files changed, 43 insertions(+), 807 deletions(-) delete mode 100644 .github/scripts/cleanup-tags.py delete mode 100644 .github/scripts/github.py diff --git a/.github/scripts/cleanup-tags.py b/.github/scripts/cleanup-tags.py deleted file mode 100644 index bf8b119b8..000000000 --- a/.github/scripts/cleanup-tags.py +++ /dev/null @@ -1,485 +0,0 @@ -import json -import logging -import os -import shutil -import subprocess -from argparse import ArgumentParser -from typing import Dict -from typing import Final -from typing import Iterator -from typing import List -from typing import Optional - -from common import get_log_level -from github import ContainerPackage -from github import GithubBranchApi -from github import GithubContainerRegistryApi - -logger = logging.getLogger("cleanup-tags") - - -class ImageProperties: - """ - Data class wrapping the properties of an entry in the image index - manifests list. It is NOT an actual image with layers, etc - - https://docs.docker.com/registry/spec/manifest-v2-2/ - https://github.com/opencontainers/image-spec/blob/main/manifest.md - https://github.com/opencontainers/image-spec/blob/main/descriptor.md - """ - - def __init__(self, data: Dict) -> None: - self._data = data - # This is the sha256: digest string. Corresponds to GitHub API name - # if the package is an untagged package - self.digest = self._data["digest"] - platform_data_os = self._data["platform"]["os"] - platform_arch = self._data["platform"]["architecture"] - platform_variant = self._data["platform"].get( - "variant", - "", - ) - self.platform = f"{platform_data_os}/{platform_arch}{platform_variant}" - - -class ImageIndex: - """ - Data class wrapping up logic for an OCI Image Index - JSON data. Primary use is to access the manifests listing - - See https://github.com/opencontainers/image-spec/blob/main/image-index.md - """ - - def __init__(self, package_url: str, tag: str) -> None: - self.qualified_name = f"{package_url}:{tag}" - logger.info(f"Getting image index for {self.qualified_name}") - try: - proc = subprocess.run( - [ - shutil.which("docker"), - "buildx", - "imagetools", - "inspect", - "--raw", - self.qualified_name, - ], - capture_output=True, - check=True, - ) - - self._data = json.loads(proc.stdout) - - except subprocess.CalledProcessError as e: - logger.error( - f"Failed to get image index for {self.qualified_name}: {e.stderr}", - ) - raise e - - @property - def image_pointers(self) -> Iterator[ImageProperties]: - for manifest_data in self._data["manifests"]: - yield ImageProperties(manifest_data) - - -class RegistryTagsCleaner: - """ - This is the base class for the image registry cleaning. Given a package - name, it will keep all images which are tagged and all untagged images - referred to by a manifest. This results in only images which have been untagged - and cannot be referenced except by their SHA in being removed. None of these - images should be referenced, so it is fine to delete them. - """ - - def __init__( - self, - package_name: str, - repo_owner: str, - repo_name: str, - package_api: GithubContainerRegistryApi, - branch_api: Optional[GithubBranchApi], - ): - self.actually_delete = False - self.package_api = package_api - self.branch_api = branch_api - self.package_name = package_name - self.repo_owner = repo_owner - self.repo_name = repo_name - self.tags_to_delete: List[str] = [] - self.tags_to_keep: List[str] = [] - - # Get the information about all versions of the given package - # These are active, not deleted, the default returned from the API - self.all_package_versions = self.package_api.get_active_package_versions( - self.package_name, - ) - - # Get a mapping from a tag like "1.7.0" or "feature-xyz" to the ContainerPackage - # tagged with it. It makes certain lookups easy - self.all_pkgs_tags_to_version: Dict[str, ContainerPackage] = {} - for pkg in self.all_package_versions: - for tag in pkg.tags: - self.all_pkgs_tags_to_version[tag] = pkg - logger.info( - f"Located {len(self.all_package_versions)} versions of package {self.package_name}", - ) - - self.decide_what_tags_to_keep() - - def clean(self): - """ - This method will delete image versions, based on the selected tags to delete. - It behaves more like an unlinking than actual deletion. Removing the tag - simply removes a pointer to an image, but the actual image data remains accessible - if one has the sha256 digest of it. - """ - for tag_to_delete in self.tags_to_delete: - package_version_info = self.all_pkgs_tags_to_version[tag_to_delete] - - if self.actually_delete: - logger.info( - f"Deleting {tag_to_delete} (id {package_version_info.id})", - ) - self.package_api.delete_package_version( - package_version_info, - ) - - else: - logger.info( - f"Would delete {tag_to_delete} (id {package_version_info.id})", - ) - else: - logger.info("No tags to delete") - - def clean_untagged(self, is_manifest_image: bool): - """ - This method will delete untagged images, that is those which are not named. It - handles if the image tag is actually a manifest, which points to images that look otherwise - untagged. - """ - - def _clean_untagged_manifest(): - """ - - Handles the deletion of untagged images, but where the package is a manifest, ie a multi - arch image, which means some "untagged" images need to exist still. - - Ok, bear with me, these are annoying. - - Our images are multi-arch, so the manifest is more like a pointer to a sha256 digest. - These images are untagged, but pointed to, and so should not be removed (or every pull fails). - - So for each image getting kept, parse the manifest to find the digest(s) it points to. Then - remove those from the list of untagged images. The final result is the untagged, not pointed to - version which should be safe to remove. - - Example: - Tag: ghcr.io/paperless-ngx/paperless-ngx:1.7.1 refers to - amd64: sha256:b9ed4f8753bbf5146547671052d7e91f68cdfc9ef049d06690b2bc866fec2690 - armv7: sha256:81605222df4ba4605a2ba4893276e5d08c511231ead1d5da061410e1bbec05c3 - arm64: sha256:374cd68db40734b844705bfc38faae84cc4182371de4bebd533a9a365d5e8f3b - each of which appears as untagged image, but isn't really. - - So from the list of untagged packages, remove those digests. Once all tags which - are being kept are checked, the remaining untagged packages are actually untagged - with no referrals in a manifest to them. - """ - # Simplify the untagged data, mapping name (which is a digest) to the version - # At the moment, these are the images which APPEAR untagged. - untagged_versions = {} - for x in self.all_package_versions: - if x.untagged: - untagged_versions[x.name] = x - - skips = 0 - - # Parse manifests to locate digests pointed to - for tag in sorted(self.tags_to_keep): - try: - image_index = ImageIndex( - f"ghcr.io/{self.repo_owner}/{self.package_name}", - tag, - ) - for manifest in image_index.image_pointers: - if manifest.digest in untagged_versions: - logger.info( - f"Skipping deletion of {manifest.digest}," - f" referred to by {image_index.qualified_name}" - f" for {manifest.platform}", - ) - del untagged_versions[manifest.digest] - skips += 1 - - except Exception as err: - self.actually_delete = False - logger.exception(err) - return - - logger.info( - f"Skipping deletion of {skips} packages referred to by a manifest", - ) - - # Delete the untagged and not pointed at packages - logger.info(f"Deleting untagged packages of {self.package_name}") - for to_delete_name in untagged_versions: - to_delete_version = untagged_versions[to_delete_name] - - if self.actually_delete: - logger.info( - f"Deleting id {to_delete_version.id} named {to_delete_version.name}", - ) - self.package_api.delete_package_version( - to_delete_version, - ) - else: - logger.info( - f"Would delete {to_delete_name} (id {to_delete_version.id})", - ) - - def _clean_untagged_non_manifest(): - """ - If the package is not a multi-arch manifest, images without tags are safe to delete. - """ - - for package in self.all_package_versions: - if package.untagged: - if self.actually_delete: - logger.info( - f"Deleting id {package.id} named {package.name}", - ) - self.package_api.delete_package_version( - package, - ) - else: - logger.info( - f"Would delete {package.name} (id {package.id})", - ) - else: - logger.info( - f"Not deleting tag {package.tags[0]} of package {self.package_name}", - ) - - logger.info("Beginning untagged image cleaning") - - if is_manifest_image: - _clean_untagged_manifest() - else: - _clean_untagged_non_manifest() - - def decide_what_tags_to_keep(self): - """ - This method holds the logic to delete what tags to keep and there fore - what tags to delete. - - By default, any image with at least 1 tag will be kept - """ - # By default, keep anything which is tagged - self.tags_to_keep = list(set(self.all_pkgs_tags_to_version.keys())) - - def check_remaining_tags_valid(self): - """ - Checks the non-deleted tags are still valid. The assumption is if the - manifest is can be inspected and each image manifest if points to can be - inspected, the image will still pull. - - https://github.com/opencontainers/image-spec/blob/main/image-index.md - """ - logger.info("Beginning confirmation step") - a_tag_failed = False - for tag in sorted(self.tags_to_keep): - try: - image_index = ImageIndex( - f"ghcr.io/{self.repo_owner}/{self.package_name}", - tag, - ) - for manifest in image_index.image_pointers: - logger.info(f"Checking {manifest.digest} for {manifest.platform}") - - # This follows the pointer from the index to an actual image, layers and all - # Note the format is @ - digest_name = f"ghcr.io/{self.repo_owner}/{self.package_name}@{manifest.digest}" - - try: - subprocess.run( - [ - shutil.which("docker"), - "buildx", - "imagetools", - "inspect", - "--raw", - digest_name, - ], - capture_output=True, - check=True, - ) - except subprocess.CalledProcessError as e: - logger.error(f"Failed to inspect digest: {e.stderr}") - a_tag_failed = True - except subprocess.CalledProcessError as e: - a_tag_failed = True - logger.error(f"Failed to inspect: {e.stderr}") - continue - - if a_tag_failed: - raise Exception("At least one image tag failed to inspect") - - -class MainImageTagsCleaner(RegistryTagsCleaner): - def decide_what_tags_to_keep(self): - """ - Overrides the default logic for deciding what images to keep. Images tagged as "feature-" - will be removed, if the corresponding branch no longer exists. - """ - - # Default to everything gets kept still - super().decide_what_tags_to_keep() - - # Locate the feature branches - feature_branches = {} - for branch in self.branch_api.get_branches( - repo=self.repo_name, - ): - if branch.name.startswith("feature-"): - logger.debug(f"Found feature branch {branch.name}") - feature_branches[branch.name] = branch - - logger.info(f"Located {len(feature_branches)} feature branches") - - if not len(feature_branches): - # Our work here is done, delete nothing - return - - # Filter to packages which are tagged with feature-* - packages_tagged_feature: List[ContainerPackage] = [] - for package in self.all_package_versions: - if package.tag_matches("feature-"): - packages_tagged_feature.append(package) - - # Map tags like "feature-xyz" to a ContainerPackage - feature_pkgs_tags_to_versions: Dict[str, ContainerPackage] = {} - for pkg in packages_tagged_feature: - for tag in pkg.tags: - feature_pkgs_tags_to_versions[tag] = pkg - - logger.info( - f'Located {len(feature_pkgs_tags_to_versions)} versions of package {self.package_name} tagged "feature-"', - ) - - # All the feature tags minus all the feature branches leaves us feature tags - # with no corresponding branch - self.tags_to_delete = list( - set(feature_pkgs_tags_to_versions.keys()) - set(feature_branches.keys()), - ) - - # All the tags minus the set of going to be deleted tags leaves us the - # tags which will be kept around - self.tags_to_keep = list( - set(self.all_pkgs_tags_to_version.keys()) - set(self.tags_to_delete), - ) - logger.info( - f"Located {len(self.tags_to_delete)} versions of package {self.package_name} to delete", - ) - - -class LibraryTagsCleaner(RegistryTagsCleaner): - """ - Exists for the off chance that someday, the installer library images - will need their own logic - """ - - -def _main(): - parser = ArgumentParser( - description="Using the GitHub API locate and optionally delete container" - " tags which no longer have an associated feature branch", - ) - - # Requires an affirmative command to actually do a delete - parser.add_argument( - "--delete", - action="store_true", - default=False, - help="If provided, actually delete the container tags", - ) - - # When a tagged image is updated, the previous version remains, but it no longer tagged - # Add this option to remove them as well - parser.add_argument( - "--untagged", - action="store_true", - default=False, - help="If provided, delete untagged containers as well", - ) - - # If given, the package is assumed to be a multi-arch manifest. Cache packages are - # not multi-arch, all other types are - parser.add_argument( - "--is-manifest", - action="store_true", - default=False, - help="If provided, the package is assumed to be a multi-arch manifest following schema v2", - ) - - # Allows configuration of log level for debugging - parser.add_argument( - "--loglevel", - default="info", - help="Configures the logging level", - ) - - # Get the name of the package being processed this round - parser.add_argument( - "package", - help="The package to process", - ) - - args = parser.parse_args() - - logging.basicConfig( - level=get_log_level(args), - datefmt="%Y-%m-%d %H:%M:%S", - format="%(asctime)s %(levelname)-8s %(message)s", - ) - - # Must be provided in the environment - repo_owner: Final[str] = os.environ["GITHUB_REPOSITORY_OWNER"] - repo: Final[str] = os.environ["GITHUB_REPOSITORY"] - gh_token: Final[str] = os.environ["TOKEN"] - - # Find all branches named feature-* - # Note: Only relevant to the main application, but simpler to - # leave in for all packages - with GithubBranchApi(gh_token) as branch_api: - with GithubContainerRegistryApi(gh_token, repo_owner) as container_api: - if args.package in {"paperless-ngx", "paperless-ngx/builder/cache/app"}: - cleaner = MainImageTagsCleaner( - args.package, - repo_owner, - repo, - container_api, - branch_api, - ) - else: - cleaner = LibraryTagsCleaner( - args.package, - repo_owner, - repo, - container_api, - None, - ) - - # Set if actually doing a delete vs dry run - cleaner.actually_delete = args.delete - - # Clean images with tags - cleaner.clean() - - # Clean images which are untagged - cleaner.clean_untagged(args.is_manifest) - - # Verify remaining tags still pull - if args.is_manifest: - cleaner.check_remaining_tags_valid() - - -if __name__ == "__main__": - _main() diff --git a/.github/scripts/github.py b/.github/scripts/github.py deleted file mode 100644 index ccbd6d11e..000000000 --- a/.github/scripts/github.py +++ /dev/null @@ -1,270 +0,0 @@ -""" -This module contains some useful classes for interacting with the Github API. -The full documentation for the API can be found here: https://docs.github.com/en/rest - -Mostly, this focusses on two areas, repo branches and repo packages, as the use case -is cleaning up container images which are no longer referred to. - -""" -import functools -import logging -import re -import urllib.parse -from typing import Dict -from typing import List -from typing import Optional - -import httpx - -logger = logging.getLogger("github-api") - - -class _GithubApiBase: - """ - A base class for interacting with the Github API. It - will handle the session and setting authorization headers. - """ - - def __init__(self, token: str) -> None: - self._token = token - self._client: Optional[httpx.Client] = None - - def __enter__(self) -> "_GithubApiBase": - """ - Sets up the required headers for auth and response - type from the API - """ - self._client = httpx.Client() - self._client.headers.update( - { - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {self._token}", - }, - ) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """ - Ensures the authorization token is cleaned up no matter - the reason for the exit - """ - if "Accept" in self._client.headers: - del self._client.headers["Accept"] - if "Authorization" in self._client.headers: - del self._client.headers["Authorization"] - - # Close the session as well - self._client.close() - self._client = None - - def _read_all_pages(self, endpoint): - """ - Helper function to read all pages of an endpoint, utilizing the - next.url until exhausted. Assumes the endpoint returns a list - """ - internal_data = [] - - while True: - resp = self._client.get(endpoint) - if resp.status_code == 200: - internal_data += resp.json() - if "next" in resp.links: - endpoint = resp.links["next"]["url"] - else: - logger.debug("Exiting pagination loop") - break - else: - logger.warning(f"Request to {endpoint} return HTTP {resp.status_code}") - resp.raise_for_status() - - return internal_data - - -class _EndpointResponse: - """ - For all endpoint JSON responses, store the full - response data, for ease of extending later, if need be. - """ - - def __init__(self, data: Dict) -> None: - self._data = data - - -class GithubBranch(_EndpointResponse): - """ - Simple wrapper for a repository branch, only extracts name information - for now. - """ - - def __init__(self, data: Dict) -> None: - super().__init__(data) - self.name = self._data["name"] - - -class GithubBranchApi(_GithubApiBase): - """ - Wrapper around branch API. - - See https://docs.github.com/en/rest/branches/branches - - """ - - def __init__(self, token: str) -> None: - super().__init__(token) - - self._ENDPOINT = "https://api.github.com/repos/{REPO}/branches" - - def get_branches(self, repo: str) -> List[GithubBranch]: - """ - Returns all current branches of the given repository owned by the given - owner or organization. - """ - # The environment GITHUB_REPOSITORY already contains the owner in the correct location - endpoint = self._ENDPOINT.format(REPO=repo) - internal_data = self._read_all_pages(endpoint) - return [GithubBranch(branch) for branch in internal_data] - - -class ContainerPackage(_EndpointResponse): - """ - Data class wrapping the JSON response from the package related - endpoints - """ - - def __init__(self, data: Dict): - super().__init__(data) - # This is a numerical ID, required for interactions with this - # specific package, including deletion of it or restoration - self.id: int = self._data["id"] - - # A string name. This might be an actual name or it could be a - # digest string like "sha256:" - self.name: str = self._data["name"] - - # URL to the package, including its ID, can be used for deletion - # or restoration without needing to build up a URL ourselves - self.url: str = self._data["url"] - - # The list of tags applied to this image. Maybe an empty list - self.tags: List[str] = self._data["metadata"]["container"]["tags"] - - @functools.cached_property - def untagged(self) -> bool: - """ - Returns True if the image has no tags applied to it, False otherwise - """ - return len(self.tags) == 0 - - @functools.cache - def tag_matches(self, pattern: str) -> bool: - """ - Returns True if the image has at least one tag which matches the given regex, - False otherwise - """ - return any(re.match(pattern, tag) is not None for tag in self.tags) - - def __repr__(self): - return f"Package {self.name}" - - -class GithubContainerRegistryApi(_GithubApiBase): - """ - Class wrapper to deal with the Github packages API. This class only deals with - container type packages, the only type published by paperless-ngx. - """ - - def __init__(self, token: str, owner_or_org: str) -> None: - super().__init__(token) - self._owner_or_org = owner_or_org - if self._owner_or_org == "paperless-ngx": - # https://docs.github.com/en/rest/packages#get-all-package-versions-for-a-package-owned-by-an-organization - self._PACKAGES_VERSIONS_ENDPOINT = "https://api.github.com/orgs/{ORG}/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions" - # https://docs.github.com/en/rest/packages#delete-package-version-for-an-organization - self._PACKAGE_VERSION_DELETE_ENDPOINT = "https://api.github.com/orgs/{ORG}/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions/{PACKAGE_VERSION_ID}" - else: - # https://docs.github.com/en/rest/packages#get-all-package-versions-for-a-package-owned-by-the-authenticated-user - self._PACKAGES_VERSIONS_ENDPOINT = "https://api.github.com/user/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions" - # https://docs.github.com/en/rest/packages#delete-a-package-version-for-the-authenticated-user - self._PACKAGE_VERSION_DELETE_ENDPOINT = "https://api.github.com/user/packages/{PACKAGE_TYPE}/{PACKAGE_NAME}/versions/{PACKAGE_VERSION_ID}" - self._PACKAGE_VERSION_RESTORE_ENDPOINT = ( - f"{self._PACKAGE_VERSION_DELETE_ENDPOINT}/restore" - ) - - def get_active_package_versions( - self, - package_name: str, - ) -> List[ContainerPackage]: - """ - Returns all the versions of a given package (container images) from - the API - """ - - package_type: str = "container" - # Need to quote this for slashes in the name - package_name = urllib.parse.quote(package_name, safe="") - - endpoint = self._PACKAGES_VERSIONS_ENDPOINT.format( - ORG=self._owner_or_org, - PACKAGE_TYPE=package_type, - PACKAGE_NAME=package_name, - ) - - pkgs = [] - - for data in self._read_all_pages(endpoint): - pkgs.append(ContainerPackage(data)) - - return pkgs - - def get_deleted_package_versions( - self, - package_name: str, - ) -> List[ContainerPackage]: - package_type: str = "container" - # Need to quote this for slashes in the name - package_name = urllib.parse.quote(package_name, safe="") - - endpoint = ( - self._PACKAGES_VERSIONS_ENDPOINT.format( - ORG=self._owner_or_org, - PACKAGE_TYPE=package_type, - PACKAGE_NAME=package_name, - ) - + "?state=deleted" - ) - - pkgs = [] - - for data in self._read_all_pages(endpoint): - pkgs.append(ContainerPackage(data)) - - return pkgs - - def delete_package_version(self, package_data: ContainerPackage): - """ - Deletes the given package version from the GHCR - """ - resp = self._client.delete(package_data.url) - if resp.status_code != 204: - logger.warning( - f"Request to delete {package_data.url} returned HTTP {resp.status_code}", - ) - - def restore_package_version( - self, - package_name: str, - package_data: ContainerPackage, - ): - package_type: str = "container" - endpoint = self._PACKAGE_VERSION_RESTORE_ENDPOINT.format( - ORG=self._owner_or_org, - PACKAGE_TYPE=package_type, - PACKAGE_NAME=package_name, - PACKAGE_VERSION_ID=package_data.id, - ) - - resp = self._client.post(endpoint) - if resp.status_code != 204: - logger.warning( - f"Request to delete {endpoint} returned HTTP {resp.status_code}", - ) diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml index 5992b4442..c850b952e 100644 --- a/.github/workflows/cleanup-tags.yml +++ b/.github/workflows/cleanup-tags.yml @@ -12,9 +12,6 @@ on: push: paths: - ".github/workflows/cleanup-tags.yml" - - ".github/scripts/cleanup-tags.py" - - ".github/scripts/github.py" - - ".github/scripts/common.py" concurrency: group: registry-tags-cleanup @@ -22,62 +19,56 @@ concurrency: jobs: cleanup-images: - name: Cleanup Image Tags for ${{ matrix.primary-name }} + name: Cleanup Image Tags for paperless-ngx if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-22.04 - strategy: - matrix: - include: - - primary-name: "paperless-ngx" - cache-name: "paperless-ngx/builder/cache/app" - - - primary-name: "paperless-ngx/builder/qpdf" - cache-name: "paperless-ngx/builder/cache/qpdf" - - - primary-name: "paperless-ngx/builder/pikepdf" - cache-name: "paperless-ngx/builder/cache/pikepdf" - - - primary-name: "paperless-ngx/builder/jbig2enc" - cache-name: "paperless-ngx/builder/cache/jbig2enc" - - - primary-name: "paperless-ngx/builder/psycopg2" - cache-name: "paperless-ngx/builder/cache/psycopg2" env: # Requires a personal access token with the OAuth scope delete:packages TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }} steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Login to Github Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.10" - - - name: Install Python libraries - run: | - python -m pip install httpx docker - # - # Clean up primary package - # - - - name: Cleanup for package "${{ matrix.primary-name }}" + name: Clean temporary images if: "${{ env.TOKEN != '' }}" - run: | - python ${GITHUB_WORKSPACE}/.github/scripts/cleanup-tags.py --untagged --is-manifest --delete "${{ matrix.primary-name }}" - # - # Clean up registry cache package - # + uses: stumpylog/image-cleaner-action/ephemeral@develop + with: + token: "${{ env.TOKEN }}" + owner: "${{ github.repository_owner }}" + is_org: "true" + package_name: "paperless-ngx" + scheme: "branch" + repo_name: "paperless-ngx" + match_regex: "feature-" + + cleanup-untagged-images: + name: Cleanup Untagged Images Tags for ${{ matrix.primary-name }} + if: github.repository_owner == 'paperless-ngx' + runs-on: ubuntu-22.04 + needs: + - cleanup-images + strategy: + fail-fast: false + matrix: + include: + - primary-name: "paperless-ngx" + - primary-name: "paperless-ngx/builder/cache/app" + - primary-name: "paperless-ngx/builder/qpdf" + - primary-name: "paperless-ngx/builder/cache/qpdf" + - primary-name: "paperless-ngx/builder/pikepdf" + - primary-name: "paperless-ngx/builder/cache/pikepdf" + - primary-name: "paperless-ngx/builder/jbig2enc" + - primary-name: "paperless-ngx/builder/cache/jbig2enc" + - primary-name: "paperless-ngx/builder/psycopg2" + - primary-name: "paperless-ngx/builder/cache/psycopg2" + env: + # Requires a personal access token with the OAuth scope delete:packages + TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }} + steps: - - name: Cleanup for package "${{ matrix.cache-name }}" + name: Clean untagged images if: "${{ env.TOKEN != '' }}" - run: | - python ${GITHUB_WORKSPACE}/.github/scripts/cleanup-tags.py --untagged --delete "${{ matrix.cache-name }}" + uses: stumpylog/image-cleaner-action/untagged@develop + with: + token: "${{ env.TOKEN }}" + owner: "${{ github.repository_owner }}" + is_org: "true" + package_name: "${{ matrix.primary-name }}" From f875ae4abf77ffb9c94c574327860faf0942cc98 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:05:28 -0700 Subject: [PATCH 004/103] CI cleanup and improvements. Removes the building of installers from the repo, they can now be built elsewhere, on demand, as their building is no longer tied to the Dockerfile --- .build-config.json | 9 - .github/scripts/common.py | 47 --- .github/scripts/get-build-json.py | 91 ----- .github/workflows/ci.yml | 120 ++----- .github/workflows/cleanup-tags.yml | 9 + .github/workflows/installer-library.yml | 310 ------------------ .../workflows/reusable-workflow-builder.yml | 57 ---- Dockerfile | 8 +- Pipfile | 2 +- Pipfile.lock | 147 ++++----- build-docker-image.sh | 81 ----- docker-builders/Dockerfile.jbig2enc | 48 --- docker-builders/Dockerfile.pikepdf | 118 ------- docker-builders/Dockerfile.psycopg2 | 66 ---- docker-builders/Dockerfile.qpdf | 156 --------- docker-builders/README.md | 57 ---- docs/development.md | 9 +- 17 files changed, 112 insertions(+), 1223 deletions(-) delete mode 100644 .build-config.json delete mode 100644 .github/scripts/common.py delete mode 100644 .github/scripts/get-build-json.py delete mode 100644 .github/workflows/installer-library.yml delete mode 100644 .github/workflows/reusable-workflow-builder.yml delete mode 100755 build-docker-image.sh delete mode 100644 docker-builders/Dockerfile.jbig2enc delete mode 100644 docker-builders/Dockerfile.pikepdf delete mode 100644 docker-builders/Dockerfile.psycopg2 delete mode 100644 docker-builders/Dockerfile.qpdf delete mode 100644 docker-builders/README.md diff --git a/.build-config.json b/.build-config.json deleted file mode 100644 index 73e8b7792..000000000 --- a/.build-config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "qpdf": { - "version": "11.3.0" - }, - "jbig2enc": { - "version": "0.29", - "git_tag": "0.29" - } -} diff --git a/.github/scripts/common.py b/.github/scripts/common.py deleted file mode 100644 index f7c91e7d7..000000000 --- a/.github/scripts/common.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging - - -def get_image_tag( - repo_name: str, - pkg_name: str, - pkg_version: str, -) -> str: - """ - Returns a string representing the normal image for a given package - """ - return f"ghcr.io/{repo_name.lower()}/builder/{pkg_name}:{pkg_version}" - - -def get_cache_image_tag( - repo_name: str, - pkg_name: str, - pkg_version: str, - branch_name: str, -) -> str: - """ - Returns a string representing the expected image cache tag for a given package - - Registry type caching is utilized for the builder images, to allow fast - rebuilds, generally almost instant for the same version - """ - return f"ghcr.io/{repo_name.lower()}/builder/cache/{pkg_name}:{pkg_version}" - - -def get_log_level(args) -> int: - """ - Returns a logging level, based - :param args: - :return: - """ - levels = { - "critical": logging.CRITICAL, - "error": logging.ERROR, - "warn": logging.WARNING, - "warning": logging.WARNING, - "info": logging.INFO, - "debug": logging.DEBUG, - } - level = levels.get(args.loglevel.lower()) - if level is None: - level = logging.INFO - return level diff --git a/.github/scripts/get-build-json.py b/.github/scripts/get-build-json.py deleted file mode 100644 index a37b31e90..000000000 --- a/.github/scripts/get-build-json.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -This is a helper script for the mutli-stage Docker image builder. -It provides a single point of configuration for package version control. -The output JSON object is used by the CI workflow to determine what versions -to build and pull into the final Docker image. - -Python package information is obtained from the Pipfile.lock. As this is -kept updated by dependabot, it usually will need no further configuration. -The sole exception currently is pikepdf, which has a dependency on qpdf, -and is configured here to use the latest version of qpdf built by the workflow. - -Other package version information is configured directly below, generally by -setting the version and Git information, if any. - -""" -import argparse -import json -import os -from pathlib import Path -from typing import Final - -from common import get_cache_image_tag -from common import get_image_tag - - -def _main(): - parser = argparse.ArgumentParser( - description="Generate a JSON object of information required to build the given package, based on the Pipfile.lock", - ) - parser.add_argument( - "package", - help="The name of the package to generate JSON for", - ) - - PIPFILE_LOCK_PATH: Final[Path] = Path("Pipfile.lock") - BUILD_CONFIG_PATH: Final[Path] = Path(".build-config.json") - - # Read the main config file - build_json: Final = json.loads(BUILD_CONFIG_PATH.read_text()) - - # Read Pipfile.lock file - pipfile_data: Final = json.loads(PIPFILE_LOCK_PATH.read_text()) - - args: Final = parser.parse_args() - - # Read from environment variables set by GitHub Actions - repo_name: Final[str] = os.environ["GITHUB_REPOSITORY"] - branch_name: Final[str] = os.environ["GITHUB_REF_NAME"] - - # Default output values - version = None - extra_config = {} - - if args.package in pipfile_data["default"]: - # Read the version from Pipfile.lock - pkg_data = pipfile_data["default"][args.package] - pkg_version = pkg_data["version"].split("==")[-1] - version = pkg_version - - # Any extra/special values needed - if args.package == "pikepdf": - extra_config["qpdf_version"] = build_json["qpdf"]["version"] - - elif args.package in build_json: - version = build_json[args.package]["version"] - - else: - raise NotImplementedError(args.package) - - # The JSON object we'll output - output = { - "name": args.package, - "version": version, - "image_tag": get_image_tag(repo_name, args.package, version), - "cache_tag": get_cache_image_tag( - repo_name, - args.package, - version, - branch_name, - ), - } - - # Add anything special a package may need - output.update(extra_config) - - # Output the JSON info to stdout - print(json.dumps(output)) - - -if __name__ == "__main__": - _main() diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f824b04dc..ae6809c19 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ on: env: # This is the version of pipenv all the steps will use # If changing this, change Dockerfile - DEFAULT_PIP_ENV_VERSION: "2023.3.20" + DEFAULT_PIP_ENV_VERSION: "2023.4.20" # This is the default version of Python to use in most steps # If changing this, change Dockerfile DEFAULT_PYTHON_VERSION: "3.9" @@ -197,90 +197,20 @@ jobs: - run: cd src-ui && npm run test - run: cd src-ui && npm run e2e:ci - prepare-docker-build: - name: Prepare Docker Pipeline Data - if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || contains(github.ref, 'beta.rc') || startsWith(github.ref, 'refs/tags/v')) - runs-on: ubuntu-22.04 - needs: - - documentation - - tests-backend - - tests-frontend - steps: - - - name: Set ghcr repository name - id: set-ghcr-repository - run: | - ghcr_name=$(echo "${GITHUB_REPOSITORY}" | awk '{ print tolower($0) }') - echo "repository=${ghcr_name}" >> $GITHUB_OUTPUT - - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - - - name: Setup qpdf image - id: qpdf-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py qpdf) - - echo ${build_json} - - echo "qpdf-json=${build_json}" >> $GITHUB_OUTPUT - - - name: Setup psycopg2 image - id: psycopg2-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py psycopg2) - - echo ${build_json} - - echo "psycopg2-json=${build_json}" >> $GITHUB_OUTPUT - - - name: Setup pikepdf image - id: pikepdf-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py pikepdf) - - echo ${build_json} - - echo "pikepdf-json=${build_json}" >> $GITHUB_OUTPUT - - - name: Setup jbig2enc image - id: jbig2enc-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py jbig2enc) - - echo ${build_json} - - echo "jbig2enc-json=${build_json}" >> $GITHUB_OUTPUT - - outputs: - - ghcr-repository: ${{ steps.set-ghcr-repository.outputs.repository }} - - qpdf-json: ${{ steps.qpdf-setup.outputs.qpdf-json }} - - pikepdf-json: ${{ steps.pikepdf-setup.outputs.pikepdf-json }} - - psycopg2-json: ${{ steps.psycopg2-setup.outputs.psycopg2-json }} - - jbig2enc-json: ${{ steps.jbig2enc-setup.outputs.jbig2enc-json}} - - # build and push image to docker hub. build-docker-image: + name: Build Docker image for ${{ github.ref_name }} runs-on: ubuntu-22.04 + if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || contains(github.ref, 'beta.rc') || startsWith(github.ref, 'refs/tags/v')) concurrency: group: ${{ github.workflow }}-build-docker-image-${{ github.ref_name }} cancel-in-progress: true needs: - - prepare-docker-build + - tests-backend + - tests-frontend steps: - name: Check pushing to Docker Hub - id: docker-hub + id: push-other-places # Only push to Dockerhub from the main repo AND the ref is either: # main # dev @@ -288,22 +218,29 @@ jobs: # a tag # Otherwise forks would require a Docker Hub account and secrets setup run: | - if [[ ${{ needs.prepare-docker-build.outputs.ghcr-repository }} == "paperless-ngx/paperless-ngx" && ( ${{ github.ref_name }} == "main" || ${{ github.ref_name }} == "dev" || ${{ github.ref_name }} == "beta" || ${{ startsWith(github.ref, 'refs/tags/v') }} == "true" ) ]] ; then + if [[ ${{ github.repository_owner }} == "paperless-ngx" && ( ${{ github.ref_name }} == "main" || ${{ github.ref_name }} == "dev" || ${{ github.ref_name }} == "beta" || ${{ startsWith(github.ref, 'refs/tags/v') }} == "true" ) ]] ; then echo "Enabling DockerHub image push" echo "enable=true" >> $GITHUB_OUTPUT else echo "Not pushing to DockerHub" echo "enable=false" >> $GITHUB_OUTPUT fi + - + name: Set ghcr repository name + id: set-ghcr-repository + run: | + ghcr_name=$(echo "${{ github.repository }}" | awk '{ print tolower($0) }') + echo "Name is ${ghcr_name}" + echo "ghcr-repository=${ghcr_name}" >> $GITHUB_OUTPUT - name: Gather Docker metadata id: docker-meta uses: docker/metadata-action@v4 with: images: | - ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }} - name=paperlessngx/paperless-ngx,enable=${{ steps.docker-hub.outputs.enable }} - name=quay.io/paperlessngx/paperless-ngx,enable=${{ steps.docker-hub.outputs.enable }} + ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }} + name=paperlessngx/paperless-ngx,enable=${{ steps.push-other-places.outputs.enable }} + name=quay.io/paperlessngx/paperless-ngx,enable=${{ steps.push-other-places.outputs.enable }} tags: | # Tag branches with branch name type=ref,event=branch @@ -314,8 +251,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + # If https://github.com/docker/buildx/issues/1044 is resolved, + # the append input with a native arm64 arch could be used to + # significantly speed up building - - name: Set up Docker Buildx + name: Set up Docker Buildx (fork/failure) uses: docker/setup-buildx-action@v2 - name: Set up QEMU @@ -331,15 +271,15 @@ jobs: name: Login to Docker Hub uses: docker/login-action@v2 # Don't attempt to login is not pushing to Docker Hub - if: steps.docker-hub.outputs.enable == 'true' + if: steps.push-other-places.outputs.enable == 'true' with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to Quay.io uses: docker/login-action@v2 - # Don't attempt to login is not pushing to Docker Hub - if: steps.docker-hub.outputs.enable == 'true' + # Don't attempt to login is not pushing to Quay.io + if: steps.push-other-places.outputs.enable == 'true' with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} @@ -354,19 +294,13 @@ jobs: push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.docker-meta.outputs.tags }} labels: ${{ steps.docker-meta.outputs.labels }} - build-args: | - JBIG2ENC_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).version }} - QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }} - PIKEPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).version }} - PSYCOPG2_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).version }} # Get cache layers from this branch, then dev, then main # This allows new branches to get at least some cache benefits, generally from dev cache-from: | - type=registry,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }} - type=registry,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:dev - type=registry,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:main + type=registry,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }} + type=registry,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:dev cache-to: | - type=registry,mode=max,ref=ghcr.io/${{ needs.prepare-docker-build.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }} + type=registry,mode=max,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }} - name: Inspect image run: | diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml index c850b952e..3885720d7 100644 --- a/.github/workflows/cleanup-tags.yml +++ b/.github/workflows/cleanup-tags.yml @@ -59,6 +59,15 @@ jobs: - primary-name: "paperless-ngx/builder/cache/jbig2enc" - primary-name: "paperless-ngx/builder/psycopg2" - primary-name: "paperless-ngx/builder/cache/psycopg2" + # TODO: Remove the above and replace with the below + # - primary-name: "builder/qpdf" + # - primary-name: "builder/cache/qpdf" + # - primary-name: "builder/pikepdf" + # - primary-name: "builder/cache/pikepdf" + # - primary-name: "builder/jbig2enc" + # - primary-name: "builder/cache/jbig2enc" + # - primary-name: "builder/psycopg2" + # - primary-name: "builder/cache/psycopg2" env: # Requires a personal access token with the OAuth scope delete:packages TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }} diff --git a/.github/workflows/installer-library.yml b/.github/workflows/installer-library.yml deleted file mode 100644 index 56064ad86..000000000 --- a/.github/workflows/installer-library.yml +++ /dev/null @@ -1,310 +0,0 @@ -# This workflow will run to update the installer library of -# Docker images. These are the images which provide updated wheels -# .deb installation packages or maybe just some compiled library - -name: Build Image Library - -on: - push: - # Must match one of these branches AND one of the paths - # to be triggered - branches: - - "main" - - "dev" - - "library-*" - - "feature-*" - paths: - # Trigger the workflow if a Dockerfile changed - - "docker-builders/**" - # Trigger if a package was updated - - ".build-config.json" - - "Pipfile.lock" - # Also trigger on workflow changes related to the library - - ".github/workflows/installer-library.yml" - - ".github/workflows/reusable-workflow-builder.yml" - - ".github/scripts/**" - -# Set a workflow level concurrency group so primary workflow -# can wait for this to complete if needed -# DO NOT CHANGE without updating main workflow group -concurrency: - group: build-installer-library - cancel-in-progress: false - -jobs: - prepare-docker-build: - name: Prepare Docker Image Version Data - runs-on: ubuntu-22.04 - steps: - - - name: Set ghcr repository name - id: set-ghcr-repository - run: | - ghcr_name=$(echo "${GITHUB_REPOSITORY}" | awk '{ print tolower($0) }') - echo "repository=${ghcr_name}" >> $GITHUB_OUTPUT - - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.9" - - - name: Install jq - run: | - sudo apt-get update - sudo apt-get install jq - - - name: Setup qpdf image - id: qpdf-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py qpdf) - - echo ${build_json} - - echo "qpdf-json=${build_json}" >> $GITHUB_OUTPUT - - - name: Setup psycopg2 image - id: psycopg2-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py psycopg2) - - echo ${build_json} - - echo "psycopg2-json=${build_json}" >> $GITHUB_OUTPUT - - - name: Setup pikepdf image - id: pikepdf-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py pikepdf) - - echo ${build_json} - - echo "pikepdf-json=${build_json}" >> $GITHUB_OUTPUT - - - name: Setup jbig2enc image - id: jbig2enc-setup - run: | - build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py jbig2enc) - - echo ${build_json} - - echo "jbig2enc-json=${build_json}" >> $GITHUB_OUTPUT - - - name: Setup other versions - id: cache-bust-setup - run: | - pillow_version=$(jq -r '.default.pillow.version | gsub("=";"")' Pipfile.lock) - lxml_version=$(jq -r '.default.lxml.version | gsub("=";"")' Pipfile.lock) - - echo "Pillow is ${pillow_version}" - echo "lxml is ${lxml_version}" - - echo "pillow-version=${pillow_version}" >> $GITHUB_OUTPUT - echo "lxml-version=${lxml_version}" >> $GITHUB_OUTPUT - - outputs: - - ghcr-repository: ${{ steps.set-ghcr-repository.outputs.repository }} - - qpdf-json: ${{ steps.qpdf-setup.outputs.qpdf-json }} - - pikepdf-json: ${{ steps.pikepdf-setup.outputs.pikepdf-json }} - - psycopg2-json: ${{ steps.psycopg2-setup.outputs.psycopg2-json }} - - jbig2enc-json: ${{ steps.jbig2enc-setup.outputs.jbig2enc-json }} - - pillow-version: ${{ steps.cache-bust-setup.outputs.pillow-version }} - - lxml-version: ${{ steps.cache-bust-setup.outputs.lxml-version }} - - build-qpdf-debs: - name: qpdf - needs: - - prepare-docker-build - uses: ./.github/workflows/reusable-workflow-builder.yml - with: - dockerfile: ./docker-builders/Dockerfile.qpdf - build-platforms: linux/amd64 - build-json: ${{ needs.prepare-docker-build.outputs.qpdf-json }} - build-args: | - QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }} - - build-jbig2enc: - name: jbig2enc - needs: - - prepare-docker-build - uses: ./.github/workflows/reusable-workflow-builder.yml - with: - dockerfile: ./docker-builders/Dockerfile.jbig2enc - build-json: ${{ needs.prepare-docker-build.outputs.jbig2enc-json }} - build-args: | - JBIG2ENC_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).version }} - - build-psycopg2-wheel: - name: psycopg2 - needs: - - prepare-docker-build - uses: ./.github/workflows/reusable-workflow-builder.yml - with: - dockerfile: ./docker-builders/Dockerfile.psycopg2 - build-json: ${{ needs.prepare-docker-build.outputs.psycopg2-json }} - build-args: | - PSYCOPG2_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).version }} - - build-pikepdf-wheel: - name: pikepdf - needs: - - prepare-docker-build - - build-qpdf-debs - uses: ./.github/workflows/reusable-workflow-builder.yml - with: - dockerfile: ./docker-builders/Dockerfile.pikepdf - build-json: ${{ needs.prepare-docker-build.outputs.pikepdf-json }} - build-args: | - REPO=${{ needs.prepare-docker-build.outputs.ghcr-repository }} - QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }} - PIKEPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).version }} - PILLOW_VERSION=${{ needs.prepare-docker-build.outputs.pillow-version }} - LXML_VERSION=${{ needs.prepare-docker-build.outputs.lxml-version }} - - commit-binary-files: - name: Store installers - needs: - - prepare-docker-build - - build-qpdf-debs - - build-jbig2enc - - build-psycopg2-wheel - - build-pikepdf-wheel - runs-on: ubuntu-22.04 - steps: - - - name: Checkout - uses: actions/checkout@v3 - with: - ref: binary-library - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.9" - - - name: Install system dependencies - run: | - sudo apt-get update -qq - sudo apt-get install -qq --no-install-recommends tree - - - name: Extract qpdf files - run: | - version=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }} - tag=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).image_tag }} - - docker pull --quiet ${tag} - docker create --name qpdf-extract ${tag} - - mkdir --parents qpdf/${version}/amd64 - docker cp qpdf-extract:/usr/src/qpdf/${version}/amd64 qpdf/${version} - - mkdir --parents qpdf/${version}/arm64 - docker cp qpdf-extract:/usr/src/qpdf/${version}/arm64 qpdf/${version} - - mkdir --parents qpdf/${version}/armv7 - docker cp qpdf-extract:/usr/src/qpdf/${version}/armv7 qpdf/${version} - - - name: Extract psycopg2 files - run: | - version=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).version }} - tag=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).image_tag }} - - docker pull --quiet --platform linux/amd64 ${tag} - docker create --platform linux/amd64 --name psycopg2-extract ${tag} - mkdir --parents psycopg2/${version}/amd64 - docker cp psycopg2-extract:/usr/src/wheels/ psycopg2/${version}/amd64 - mv psycopg2/${version}/amd64/wheels/* psycopg2/${version}/amd64 - rm -r psycopg2/${version}/amd64/wheels/ - docker rm psycopg2-extract - - docker pull --quiet --platform linux/arm64 ${tag} - docker create --platform linux/arm64 --name psycopg2-extract ${tag} - mkdir --parents psycopg2/${version}/arm64 - docker cp psycopg2-extract:/usr/src/wheels/ psycopg2/${version}/arm64 - mv psycopg2/${version}/arm64/wheels/* psycopg2/${version}/arm64 - rm -r psycopg2/${version}/arm64/wheels/ - docker rm psycopg2-extract - - docker pull --quiet --platform linux/arm/v7 ${tag} - docker create --platform linux/arm/v7 --name psycopg2-extract ${tag} - mkdir --parents psycopg2/${version}/armv7 - docker cp psycopg2-extract:/usr/src/wheels/ psycopg2/${version}/armv7 - mv psycopg2/${version}/armv7/wheels/* psycopg2/${version}/armv7 - rm -r psycopg2/${version}/armv7/wheels/ - docker rm psycopg2-extract - - - name: Extract pikepdf files - run: | - version=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).version }} - tag=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).image_tag }} - - docker pull --quiet --platform linux/amd64 ${tag} - docker create --platform linux/amd64 --name pikepdf-extract ${tag} - mkdir --parents pikepdf/${version}/amd64 - docker cp pikepdf-extract:/usr/src/wheels/ pikepdf/${version}/amd64 - mv pikepdf/${version}/amd64/wheels/* pikepdf/${version}/amd64 - rm -r pikepdf/${version}/amd64/wheels/ - docker rm pikepdf-extract - - docker pull --quiet --platform linux/arm64 ${tag} - docker create --platform linux/arm64 --name pikepdf-extract ${tag} - mkdir --parents pikepdf/${version}/arm64 - docker cp pikepdf-extract:/usr/src/wheels/ pikepdf/${version}/arm64 - mv pikepdf/${version}/arm64/wheels/* pikepdf/${version}/arm64 - rm -r pikepdf/${version}/arm64/wheels/ - docker rm pikepdf-extract - - docker pull --quiet --platform linux/arm/v7 ${tag} - docker create --platform linux/arm/v7 --name pikepdf-extract ${tag} - mkdir --parents pikepdf/${version}/armv7 - docker cp pikepdf-extract:/usr/src/wheels/ pikepdf/${version}/armv7 - mv pikepdf/${version}/armv7/wheels/* pikepdf/${version}/armv7 - rm -r pikepdf/${version}/armv7/wheels/ - docker rm pikepdf-extract - - - name: Extract jbig2enc files - run: | - version=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).version }} - tag=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).image_tag }} - - docker pull --quiet --platform linux/amd64 ${tag} - docker create --platform linux/amd64 --name jbig2enc-extract ${tag} - mkdir --parents jbig2enc/${version}/amd64 - docker cp jbig2enc-extract:/usr/src/jbig2enc/build jbig2enc/${version}/amd64/ - mv jbig2enc/${version}/amd64/build/* jbig2enc/${version}/amd64/ - docker rm jbig2enc-extract - - docker pull --quiet --platform linux/arm64 ${tag} - docker create --platform linux/arm64 --name jbig2enc-extract ${tag} - mkdir --parents jbig2enc/${version}/arm64 - docker cp jbig2enc-extract:/usr/src/jbig2enc/build jbig2enc/${version}/arm64 - mv jbig2enc/${version}/arm64/build/* jbig2enc/${version}/arm64/ - docker rm jbig2enc-extract - - docker pull --quiet --platform linux/arm/v7 ${tag} - docker create --platform linux/arm/v7 --name jbig2enc-extract ${tag} - mkdir --parents jbig2enc/${version}/armv7 - docker cp jbig2enc-extract:/usr/src/jbig2enc/build jbig2enc/${version}/armv7 - mv jbig2enc/${version}/armv7/build/* jbig2enc/${version}/armv7/ - docker rm jbig2enc-extract - - - name: Show file structure - run: | - tree . - - - name: Commit files - run: | - git config --global user.name "github-actions" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add pikepdf/ qpdf/ psycopg2/ jbig2enc/ - git commit -m "Updating installer packages" || true - git push origin || true diff --git a/.github/workflows/reusable-workflow-builder.yml b/.github/workflows/reusable-workflow-builder.yml deleted file mode 100644 index 012e42b91..000000000 --- a/.github/workflows/reusable-workflow-builder.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Reusable Image Builder - -on: - workflow_call: - inputs: - dockerfile: - required: true - type: string - build-json: - required: true - type: string - build-args: - required: false - default: "" - type: string - build-platforms: - required: false - default: linux/amd64,linux/arm64,linux/arm/v7 - type: string - -concurrency: - group: ${{ github.workflow }}-${{ fromJSON(inputs.build-json).name }}-${{ fromJSON(inputs.build-json).version }} - cancel-in-progress: false - -jobs: - build-image: - name: Build ${{ fromJSON(inputs.build-json).name }} @ ${{ fromJSON(inputs.build-json).version }} - runs-on: ubuntu-22.04 - steps: - - - name: Checkout - uses: actions/checkout@v3 - - - name: Login to Github Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Build ${{ fromJSON(inputs.build-json).name }} - uses: docker/build-push-action@v4 - with: - context: . - file: ${{ inputs.dockerfile }} - tags: ${{ fromJSON(inputs.build-json).image_tag }} - platforms: ${{ inputs.build-platforms }} - build-args: ${{ inputs.build-args }} - push: true - cache-from: type=registry,ref=${{ fromJSON(inputs.build-json).cache_tag }} - cache-to: type=registry,mode=max,ref=${{ fromJSON(inputs.build-json).cache_tag }} diff --git a/Dockerfile b/Dockerfile index 1d3def67a..88b5d7ad4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ RUN set -eux \ # Comments: # - pipenv dependencies are not left in the final image # - pipenv can't touch the final image somehow -FROM --platform=$BUILDPLATFORM python:3.9-slim-bullseye as pipenv-base +FROM --platform=$BUILDPLATFORM python:3.9-alpine as pipenv-base WORKDIR /usr/src/pipenv @@ -29,7 +29,7 @@ COPY Pipfile* ./ RUN set -eux \ && echo "Installing pipenv" \ - && python3 -m pip install --no-cache-dir --upgrade pipenv==2023.3.20 \ + && python3 -m pip install --no-cache-dir --upgrade pipenv==2023.4.20 \ && echo "Generating requirement.txt" \ && pipenv requirements > requirements.txt @@ -170,7 +170,7 @@ RUN set -eux \ ARG TARGETARCH ARG TARGETVARIANT -# Workflow provided, defaults set for manual building +# Can be workflow provided, defaults set for manual building ARG JBIG2ENC_VERSION=0.29 ARG QPDF_VERSION=11.3.0 ARG PIKEPDF_VERSION=7.1.1 @@ -181,7 +181,7 @@ ARG PSYCOPG2_VERSION=2.9.5 RUN set -eux \ && echo "Getting binaries" \ && mkdir paperless-ngx \ - && curl --fail --silent --show-error --output paperless-ngx.tar.gz --location https://github.com/paperless-ngx/paperless-ngx/archive/ba28a1e16c27d121b644b4f6bdb78855a2850561.tar.gz \ + && curl --fail --silent --show-error --output paperless-ngx.tar.gz --location https://github.com/paperless-ngx/builder/archive/e04666c257ef648716381a99113856f599e66911.tar.gz \ && tar -xf paperless-ngx.tar.gz --directory paperless-ngx --strip-components=1 \ && cd paperless-ngx \ # Setting a specific revision ensures we know what this installed diff --git a/Pipfile b/Pipfile index 1308dc2a3..d1471f52c 100644 --- a/Pipfile +++ b/Pipfile @@ -25,7 +25,7 @@ gunicorn = "*" imap-tools = "*" langdetect = "*" pathvalidate = "*" -pillow = "~=9.4" +pillow = "*" pikepdf = "*" python-gnupg = "*" python-dotenv = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 39805737f..1831d894c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "77248fee6dad10b9e5189e9ba80f7c506c9f49c875bac8b259e90dadecba03f1" + "sha256": "5a1fda76f86696709eca15c024959540ea9ce860b9d67f401e3e3aa7b01eca34" }, "pipfile-spec": 6, "requires": {}, @@ -1125,86 +1125,75 @@ }, "pillow": { "hashes": [ - "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33", - "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b", - "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e", - "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35", - "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153", - "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9", - "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569", - "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57", - "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8", - "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1", - "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264", - "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157", - "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9", - "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133", - "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9", - "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab", - "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6", - "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5", - "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df", - "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503", - "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b", - "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa", - "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327", - "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493", - "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d", - "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4", - "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4", - "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35", - "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2", - "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c", - "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011", - "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a", - "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e", - "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f", - "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848", - "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57", - "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f", - "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c", - "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9", - "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5", - "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9", - "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d", - "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0", - "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1", - "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e", - "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815", - "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0", - "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b", - "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd", - "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c", - "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3", - "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab", - "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858", - "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5", - "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee", - "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343", - "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb", - "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47", - "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed", - "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837", - "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286", - "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28", - "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628", - "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df", - "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d", - "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d", - "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a", - "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6", - "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336", - "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132", - "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070", - "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe", - "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a", - "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd", - "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391", - "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a", - "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12" + "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1", + "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba", + "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a", + "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799", + "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51", + "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb", + "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5", + "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270", + "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6", + "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47", + "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf", + "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e", + "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b", + "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66", + "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865", + "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec", + "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c", + "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1", + "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38", + "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906", + "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705", + "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef", + "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc", + "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f", + "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf", + "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392", + "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d", + "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe", + "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32", + "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5", + "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7", + "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44", + "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d", + "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3", + "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625", + "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e", + "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829", + "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089", + "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3", + "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78", + "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96", + "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964", + "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597", + "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99", + "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a", + "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140", + "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7", + "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16", + "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903", + "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1", + "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296", + "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572", + "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115", + "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a", + "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd", + "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4", + "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1", + "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb", + "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa", + "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a", + "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569", + "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c", + "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf", + "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082", + "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062", + "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579" ], "index": "pypi", - "version": "==9.4.0" + "version": "==9.5.0" }, "pluggy": { "hashes": [ diff --git a/build-docker-image.sh b/build-docker-image.sh deleted file mode 100755 index 01e2251a0..000000000 --- a/build-docker-image.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash - -# Helper script for building the Docker image locally. -# Parses and provides the nessecary versions of other images to Docker -# before passing in the rest of script args. - -# First Argument: The Dockerfile to build -# Other Arguments: Additional arguments to docker build - -# Example Usage: -# ./build-docker-image.sh Dockerfile -t paperless-ngx:my-awesome-feature - -set -eu - -if ! command -v jq &> /dev/null ; then - echo "jq required" - exit 1 -elif [ ! -f "$1" ]; then - echo "$1 is not a file, please provide the Dockerfile" - exit 1 -fi - -# Get the branch name (used for caching) -branch_name=$(git rev-parse --abbrev-ref HEAD) - -# Parse eithe Pipfile.lock or the .build-config.json -jbig2enc_version=$(jq -r '.jbig2enc.version' .build-config.json) -qpdf_version=$(jq -r '.qpdf.version' .build-config.json) -psycopg2_version=$(jq -r '.default.psycopg2.version | gsub("=";"")' Pipfile.lock) -pikepdf_version=$(jq -r '.default.pikepdf.version | gsub("=";"")' Pipfile.lock) -pillow_version=$(jq -r '.default.pillow.version | gsub("=";"")' Pipfile.lock) -lxml_version=$(jq -r '.default.lxml.version | gsub("=";"")' Pipfile.lock) - -base_filename="$(basename -- "${1}")" -build_args_str="" -cache_from_str="" - -case "${base_filename}" in - - *.jbig2enc) - build_args_str="--build-arg JBIG2ENC_VERSION=${jbig2enc_version}" - cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/jbig2enc:${jbig2enc_version}" - ;; - - *.psycopg2) - build_args_str="--build-arg PSYCOPG2_VERSION=${psycopg2_version}" - cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/psycopg2:${psycopg2_version}" - ;; - - *.qpdf) - build_args_str="--build-arg QPDF_VERSION=${qpdf_version}" - cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/qpdf:${qpdf_version}" - ;; - - *.pikepdf) - build_args_str="--build-arg QPDF_VERSION=${qpdf_version} --build-arg PIKEPDF_VERSION=${pikepdf_version} --build-arg PILLOW_VERSION=${pillow_version} --build-arg LXML_VERSION=${lxml_version}" - cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/pikepdf:${pikepdf_version}" - ;; - - Dockerfile) - build_args_str="--build-arg QPDF_VERSION=${qpdf_version} --build-arg PIKEPDF_VERSION=${pikepdf_version} --build-arg PSYCOPG2_VERSION=${psycopg2_version} --build-arg JBIG2ENC_VERSION=${jbig2enc_version}" - cache_from_str="--cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/app:${branch_name} --cache-from ghcr.io/paperless-ngx/paperless-ngx/builder/cache/app:dev" - ;; - - *) - echo "Unable to match ${base_filename}" - exit 1 - ;; -esac - -read -r -a build_args_arr <<< "${build_args_str}" -read -r -a cache_from_arr <<< "${cache_from_str}" - -set -eux - -docker buildx build --file "${1}" \ - --progress=plain \ - --output=type=docker \ - "${cache_from_arr[@]}" \ - "${build_args_arr[@]}" \ - "${@:2}" . diff --git a/docker-builders/Dockerfile.jbig2enc b/docker-builders/Dockerfile.jbig2enc deleted file mode 100644 index 388bdd1f7..000000000 --- a/docker-builders/Dockerfile.jbig2enc +++ /dev/null @@ -1,48 +0,0 @@ -# This Dockerfile compiles the jbig2enc library -# Inputs: -# - JBIG2ENC_VERSION - the Git tag to checkout and build - -FROM debian:bullseye-slim as main - -LABEL org.opencontainers.image.description="A intermediate image with jbig2enc built" - -ARG DEBIAN_FRONTEND=noninteractive -ARG JBIG2ENC_VERSION - -ARG BUILD_PACKAGES="\ - build-essential \ - automake \ - libtool \ - libleptonica-dev \ - zlib1g-dev \ - git \ - ca-certificates" - -WORKDIR /usr/src/jbig2enc - -RUN set -eux \ - && echo "Installing build tools" \ - && apt-get update --quiet \ - && apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \ - && echo "Building jbig2enc" \ - && git clone --quiet --branch $JBIG2ENC_VERSION https://github.com/agl/jbig2enc . \ - && ./autogen.sh \ - && ./configure \ - && make \ - && echo "Gathering package data" \ - && dpkg-query -f '${Package;-40}${Version}\n' -W > ./pkg-list.txt \ - && echo "Cleaning up image" \ - && apt-get -y purge ${BUILD_PACKAGES} \ - && apt-get -y autoremove --purge \ - && rm -rf /var/lib/apt/lists/* \ - && echo "Moving files around" \ - && mkdir build \ - # Unlink a symlink that causes problems - && unlink ./src/.libs/libjbig2enc.la \ - # Move what the link pointed to - && mv ./src/libjbig2enc.la ./build/ \ - # Move the shared library .so files - && mv ./src/.libs/libjbig2enc* ./build/ \ - # And move the cli binary - && mv ./src/jbig2 ./build/ \ - && mv ./pkg-list.txt ./build/ diff --git a/docker-builders/Dockerfile.pikepdf b/docker-builders/Dockerfile.pikepdf deleted file mode 100644 index e4181c538..000000000 --- a/docker-builders/Dockerfile.pikepdf +++ /dev/null @@ -1,118 +0,0 @@ -# This Dockerfile builds the pikepdf wheel -# Inputs: -# - REPO - Docker repository to pull qpdf from -# - QPDF_VERSION - The image qpdf version to copy .deb files from -# - PIKEPDF_VERSION - Version of pikepdf to build wheel for - -# Default to pulling from the main repo registry when manually building -ARG REPO="paperless-ngx/paperless-ngx" - -# This does nothing, except provide a name for a copy below -ARG QPDF_VERSION -FROM --platform=$BUILDPLATFORM ghcr.io/${REPO}/builder/qpdf:${QPDF_VERSION} as qpdf-builder - -# -# Stage: builder -# Purpose: -# - Build the pikepdf wheel -# - Build any dependent wheels which can't be found -# -FROM python:3.9-slim-bullseye as builder - -LABEL org.opencontainers.image.description="A intermediate image with pikepdf wheel built" - -# Buildx provided -ARG TARGETARCH -ARG TARGETVARIANT - -ARG DEBIAN_FRONTEND=noninteractive -# Workflow provided -ARG QPDF_VERSION -ARG PIKEPDF_VERSION -# These are not used, but will still bust the cache if one changes -# Otherwise, the main image will try to build thing (and fail) -ARG PILLOW_VERSION -ARG LXML_VERSION - -ARG BUILD_PACKAGES="\ - build-essential \ - python3-dev \ - python3-pip \ - # qpdf requirement - https://github.com/qpdf/qpdf#crypto-providers - libgnutls28-dev \ - # lxml requrements - https://lxml.de/installation.html - libxml2-dev \ - libxslt1-dev \ - # Pillow requirements - https://pillow.readthedocs.io/en/stable/installation.html#external-libraries - # JPEG functionality - libjpeg62-turbo-dev \ - # conpressed PNG - zlib1g-dev \ - # compressed TIFF - libtiff-dev \ - # type related services - libfreetype-dev \ - # color management - liblcms2-dev \ - # WebP format - libwebp-dev \ - # JPEG 2000 - libopenjp2-7-dev \ - # improved color quantization - libimagequant-dev \ - # complex text layout support - libraqm-dev" - -WORKDIR /usr/src - -COPY --from=qpdf-builder /usr/src/qpdf/${QPDF_VERSION}/${TARGETARCH}${TARGETVARIANT}/*.deb ./ - -# As this is an base image for a multi-stage final image -# the added size of the install is basically irrelevant - -RUN set -eux \ - && echo "Installing build tools" \ - && apt-get update --quiet \ - && apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \ - && echo "Installing qpdf" \ - && dpkg --install libqpdf29_*.deb \ - && dpkg --install libqpdf-dev_*.deb \ - && echo "Installing Python tools" \ - && python3 -m pip install --no-cache-dir --upgrade \ - pip \ - wheel \ - # https://pikepdf.readthedocs.io/en/latest/installation.html#requirements - pybind11 \ - && echo "Building pikepdf wheel ${PIKEPDF_VERSION}" \ - && mkdir wheels \ - && python3 -m pip wheel \ - # Build the package at the required version - pikepdf==${PIKEPDF_VERSION} \ - # Look to piwheels for additional pre-built wheels - --extra-index-url https://www.piwheels.org/simple \ - # Output the *.whl into this directory - --wheel-dir wheels \ - # Do not use a binary packge for the package being built - --no-binary=pikepdf \ - # Do use binary packages for dependencies - --prefer-binary \ - # Don't cache build files - --no-cache-dir \ - && ls -ahl wheels \ - && echo "Gathering package data" \ - && dpkg-query -f '${Package;-40}${Version}\n' -W > ./wheels/pkg-list.txt \ - && echo "Cleaning up image" \ - && apt-get -y purge ${BUILD_PACKAGES} \ - && apt-get -y autoremove --purge \ - && rm -rf /var/lib/apt/lists/* - -# -# Stage: package -# Purpose: Holds the compiled .whl files in a tiny image to pull -# -FROM alpine:3.17 as package - -WORKDIR /usr/src/wheels/ - -COPY --from=builder /usr/src/wheels/*.whl ./ -COPY --from=builder /usr/src/wheels/pkg-list.txt ./ diff --git a/docker-builders/Dockerfile.psycopg2 b/docker-builders/Dockerfile.psycopg2 deleted file mode 100644 index e3f182435..000000000 --- a/docker-builders/Dockerfile.psycopg2 +++ /dev/null @@ -1,66 +0,0 @@ -# This Dockerfile builds the psycopg2 wheel -# Inputs: -# - PSYCOPG2_VERSION - Version to build - -# -# Stage: builder -# Purpose: -# - Build the psycopg2 wheel -# -FROM python:3.9-slim-bullseye as builder - -LABEL org.opencontainers.image.description="A intermediate image with psycopg2 wheel built" - -ARG PSYCOPG2_VERSION -ARG DEBIAN_FRONTEND=noninteractive - -ARG BUILD_PACKAGES="\ - build-essential \ - python3-dev \ - python3-pip \ - # https://www.psycopg.org/docs/install.html#prerequisites - libpq-dev" - -WORKDIR /usr/src - -# As this is an base image for a multi-stage final image -# the added size of the install is basically irrelevant - -RUN set -eux \ - && echo "Installing build tools" \ - && apt-get update --quiet \ - && apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \ - && echo "Installing Python tools" \ - && python3 -m pip install --no-cache-dir --upgrade pip wheel \ - && echo "Building psycopg2 wheel ${PSYCOPG2_VERSION}" \ - && cd /usr/src \ - && mkdir wheels \ - && python3 -m pip wheel \ - # Build the package at the required version - psycopg2==${PSYCOPG2_VERSION} \ - # Output the *.whl into this directory - --wheel-dir wheels \ - # Do not use a binary packge for the package being built - --no-binary=psycopg2 \ - # Do use binary packages for dependencies - --prefer-binary \ - # Don't cache build files - --no-cache-dir \ - && ls -ahl wheels/ \ - && echo "Gathering package data" \ - && dpkg-query -f '${Package;-40}${Version}\n' -W > ./wheels/pkg-list.txt \ - && echo "Cleaning up image" \ - && apt-get -y purge ${BUILD_PACKAGES} \ - && apt-get -y autoremove --purge \ - && rm -rf /var/lib/apt/lists/* - -# -# Stage: package -# Purpose: Holds the compiled .whl files in a tiny image to pull -# -FROM alpine:3.17 as package - -WORKDIR /usr/src/wheels/ - -COPY --from=builder /usr/src/wheels/*.whl ./ -COPY --from=builder /usr/src/wheels/pkg-list.txt ./ diff --git a/docker-builders/Dockerfile.qpdf b/docker-builders/Dockerfile.qpdf deleted file mode 100644 index 3ad11d8b1..000000000 --- a/docker-builders/Dockerfile.qpdf +++ /dev/null @@ -1,156 +0,0 @@ -# -# Stage: pre-build -# Purpose: -# - Installs common packages -# - Sets common environment variables related to dpkg -# - Aquires the qpdf source from bookwork -# Useful Links: -# - https://qpdf.readthedocs.io/en/stable/installation.html#system-requirements -# - https://wiki.debian.org/Multiarch/HOWTO -# - https://wiki.debian.org/CrossCompiling -# - -FROM debian:bullseye-slim as pre-build - -ARG QPDF_VERSION - -ARG COMMON_BUILD_PACKAGES="\ - cmake \ - debhelper\ - debian-keyring \ - devscripts \ - dpkg-dev \ - equivs \ - packaging-dev \ - libtool" - -ENV DEB_BUILD_OPTIONS="terse nocheck nodoc parallel=2" - -WORKDIR /usr/src - -RUN set -eux \ - && echo "Installing common packages" \ - && apt-get update --quiet \ - && apt-get install --yes --quiet --no-install-recommends ${COMMON_BUILD_PACKAGES} \ - && echo "Getting qpdf source" \ - && echo "deb-src http://deb.debian.org/debian/ bookworm main" > /etc/apt/sources.list.d/bookworm-src.list \ - && apt-get update --quiet \ - && apt-get source --yes --quiet qpdf=${QPDF_VERSION}-1/bookworm - -# -# Stage: amd64-builder -# Purpose: Builds qpdf for x86_64 (native build) -# -FROM pre-build as amd64-builder - -ARG AMD64_BUILD_PACKAGES="\ - build-essential \ - libjpeg62-turbo-dev:amd64 \ - libgnutls28-dev:amd64 \ - zlib1g-dev:amd64" - -WORKDIR /usr/src/qpdf-${QPDF_VERSION} - -RUN set -eux \ - && echo "Beginning amd64" \ - && echo "Install amd64 packages" \ - && apt-get update --quiet \ - && apt-get install --yes --quiet --no-install-recommends ${AMD64_BUILD_PACKAGES} \ - && echo "Building amd64" \ - && dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean \ - && echo "Removing debug files" \ - && rm -f ../libqpdf29-dbgsym* \ - && rm -f ../qpdf-dbgsym* \ - && echo "Gathering package data" \ - && dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt -# -# Stage: armhf-builder -# Purpose: -# - Sets armhf specific environment -# - Builds qpdf for armhf (cross compile) -# -FROM pre-build as armhf-builder - -ARG ARMHF_PACKAGES="\ - crossbuild-essential-armhf \ - libjpeg62-turbo-dev:armhf \ - libgnutls28-dev:armhf \ - zlib1g-dev:armhf" - -WORKDIR /usr/src/qpdf-${QPDF_VERSION} - -ENV CXX="/usr/bin/arm-linux-gnueabihf-g++" \ - CC="/usr/bin/arm-linux-gnueabihf-gcc" - -RUN set -eux \ - && echo "Beginning armhf" \ - && echo "Install armhf packages" \ - && dpkg --add-architecture armhf \ - && apt-get update --quiet \ - && apt-get install --yes --quiet --no-install-recommends ${ARMHF_PACKAGES} \ - && echo "Building armhf" \ - && dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean --host-arch armhf \ - && echo "Removing debug files" \ - && rm -f ../libqpdf29-dbgsym* \ - && rm -f ../qpdf-dbgsym* \ - && echo "Gathering package data" \ - && dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt - -# -# Stage: aarch64-builder -# Purpose: -# - Sets aarch64 specific environment -# - Builds qpdf for aarch64 (cross compile) -# -FROM pre-build as aarch64-builder - -ARG ARM64_PACKAGES="\ - crossbuild-essential-arm64 \ - libjpeg62-turbo-dev:arm64 \ - libgnutls28-dev:arm64 \ - zlib1g-dev:arm64" - -ENV CXX="/usr/bin/aarch64-linux-gnu-g++" \ - CC="/usr/bin/aarch64-linux-gnu-gcc" - -WORKDIR /usr/src/qpdf-${QPDF_VERSION} - -RUN set -eux \ - && echo "Beginning arm64" \ - && echo "Install arm64 packages" \ - && dpkg --add-architecture arm64 \ - && apt-get update --quiet \ - && apt-get install --yes --quiet --no-install-recommends ${ARM64_PACKAGES} \ - && echo "Building arm64" \ - && dpkg-buildpackage --build=binary --unsigned-source --unsigned-changes --post-clean --host-arch arm64 \ - && echo "Removing debug files" \ - && rm -f ../libqpdf29-dbgsym* \ - && rm -f ../qpdf-dbgsym* \ - && echo "Gathering package data" \ - && dpkg-query -f '${Package;-40}${Version}\n' -W > ../pkg-list.txt - -# -# Stage: package -# Purpose: Holds the compiled .deb files in arch/variant specific folders -# -FROM alpine:3.17 as package - -LABEL org.opencontainers.image.description="A image with qpdf installers stored in architecture & version specific folders" - -ARG QPDF_VERSION - -WORKDIR /usr/src/qpdf/${QPDF_VERSION}/amd64 - -COPY --from=amd64-builder /usr/src/*.deb ./ -COPY --from=amd64-builder /usr/src/pkg-list.txt ./ - -# Note this is ${TARGETARCH}${TARGETVARIANT} for armv7 -WORKDIR /usr/src/qpdf/${QPDF_VERSION}/armv7 - -COPY --from=armhf-builder /usr/src/*.deb ./ -COPY --from=armhf-builder /usr/src/pkg-list.txt ./ - -WORKDIR /usr/src/qpdf/${QPDF_VERSION}/arm64 - -COPY --from=aarch64-builder /usr/src/*.deb ./ -COPY --from=aarch64-builder /usr/src/pkg-list.txt ./ diff --git a/docker-builders/README.md b/docker-builders/README.md deleted file mode 100644 index 6202719c6..000000000 --- a/docker-builders/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# Installer Library - -This folder contains the Dockerfiles for building certain installers or libraries, which are then pulled into the main image. - -## [jbig2enc](https://github.com/agl/jbig2enc) - -### Why - -JBIG is an image coding which can achieve better compression of images for PDFs. - -### What - -The Docker image builds a shared library file and utility, which is copied into the correct location in the final image. - -### Updating - -1. Ensure the given qpdf version is present in [Debian bookworm](https://packages.debian.org/bookworm/qpdf) -2. Update `.build-config.json` to the given version -3. If the Debian specific version has incremented, update `Dockerfile.qpdf` - -See Also: - -- [OCRMyPDF Documentation](https://ocrmypdf.readthedocs.io/en/latest/jbig2.html) - -## [psycopg2](https://www.psycopg.org/) - -### Why - -The pre-built wheels of psycopg2 are built on Debian 9, which provides a quite old version of libpq-dev. This causes issue with authentication methods. - -### What - -The image builds psycopg2 wheels on Debian 10 and places the produced wheels into `/usr/src/wheels/`. - -See Also: - -- [Issue 266](https://github.com/paperless-ngx/paperless-ngx/issues/266) - -## [qpdf](https://qpdf.readthedocs.io/en/stable/index.html) - -### Why - -qpdf and it's library provide tools to read, manipulate and fix up PDFs. Version 11 is also required by `pikepdf` 6+ and Debian 9 does not provide above version 10. - -### What - -The Docker image cross compiles .deb installers for each supported architecture of the main image. The installers are placed in `/usr/src/qpdf/${QPDF_VERSION}/${TARGETARCH}${TARGETVARIANT}/` - -## [pikepdf](https://pikepdf.readthedocs.io/en/latest/) - -### Why - -Required by OCRMyPdf, this is a general purpose library for PDF manipulation in Python via the qpdf libraries. - -### What - -The built wheels are placed into `/usr/src/wheels/` diff --git a/docs/development.md b/docs/development.md index 82d2d4c16..ddbd9c40e 100644 --- a/docs/development.md +++ b/docs/development.md @@ -374,13 +374,10 @@ If you want to build the documentation locally, this is how you do it: The docker image is primarily built by the GitHub actions workflow, but it can be faster when developing to build and tag an image locally. -To provide the build arguments automatically, build the image using the -helper script `build-docker-image.sh`. +Building the image works as with any image: -Building the docker image from source: - -```bash -./build-docker-image.sh Dockerfile -t +``` +docker build --file Dockerfile --tag paperless:local --progress simple . ``` ## Extending Paperless-ngx From 81a5fd377ef6464af95067f12fd59bbbddcce515 Mon Sep 17 00:00:00 2001 From: Trenton Holmes <797416+stumpylog@users.noreply.github.com> Date: Sun, 30 Apr 2023 09:27:32 -0700 Subject: [PATCH 005/103] Use a tagged version of the image cleaner action --- .github/workflows/cleanup-tags.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml index 3885720d7..a54716b53 100644 --- a/.github/workflows/cleanup-tags.yml +++ b/.github/workflows/cleanup-tags.yml @@ -29,7 +29,7 @@ jobs: - name: Clean temporary images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/ephemeral@develop + uses: stumpylog/image-cleaner-action/ephemeral@v0.1.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" @@ -75,7 +75,7 @@ jobs: - name: Clean untagged images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/untagged@develop + uses: stumpylog/image-cleaner-action/untagged@v0.1.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" From 02b2bcafc542103b2ce852655dd287116c641d34 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Tue, 2 May 2023 12:08:08 -0700 Subject: [PATCH 006/103] Fixes a small step naming thing, updates codecov to only upload on pull request events --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae6809c19..c8afcb261 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -161,7 +161,7 @@ jobs: pipenv --python ${{ steps.setup-python.outputs.python-version }} run pytest -ra - name: Upload coverage to Codecov - if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION }} + if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION && github.event_name == 'pull_request'}} uses: codecov/codecov-action@v3 with: # not required for public repos, but intermittently fails otherwise @@ -255,7 +255,7 @@ jobs: # the append input with a native arm64 arch could be used to # significantly speed up building - - name: Set up Docker Buildx (fork/failure) + name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Set up QEMU From f124e2a8891a9c963a7c9eaf0c1179acc3552148 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 6 May 2023 09:54:45 -0700 Subject: [PATCH 007/103] Add "all" property to results --- src-ui/src/app/data/results.ts | 2 + .../services/document-list-view.service.ts | 19 +++----- src/documents/tests/test_api.py | 29 +++++++++++++ src/paperless/views.py | 43 +++++++++++++++++++ 4 files changed, 80 insertions(+), 13 deletions(-) diff --git a/src-ui/src/app/data/results.ts b/src-ui/src/app/data/results.ts index dbf99c5a1..d29a55567 100644 --- a/src-ui/src/app/data/results.ts +++ b/src-ui/src/app/data/results.ts @@ -2,4 +2,6 @@ export interface Results { count: number results: T[] + + all: number[] } diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index 087cf5473..6245c6632 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -230,21 +230,14 @@ export class DocumentListViewService { activeListViewState.documents = result.results this.documentService - .listAllFilteredIds(activeListViewState.filterRules) + .getSelectionData(result.all) .pipe(first()) .subscribe({ - next: (ids: number[]) => { - this.documentService - .getSelectionData(ids) - .pipe(first()) - .subscribe({ - next: (selectionData) => { - this.selectionData = selectionData - }, - error: () => { - this.selectionData = null - }, - }) + next: (selectionData) => { + this.selectionData = selectionData + }, + error: () => { + this.selectionData = null }, }) diff --git a/src/documents/tests/test_api.py b/src/documents/tests/test_api.py index e8c6dee7c..82f6f7bde 100644 --- a/src/documents/tests/test_api.py +++ b/src/documents/tests/test_api.py @@ -499,21 +499,25 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): results = response.data["results"] self.assertEqual(response.data["count"], 3) self.assertEqual(len(results), 3) + self.assertCountEqual(response.data["all"], [d1.id, d2.id, d3.id]) response = self.client.get("/api/documents/?query=september") results = response.data["results"] self.assertEqual(response.data["count"], 1) self.assertEqual(len(results), 1) + self.assertCountEqual(response.data["all"], [d3.id]) response = self.client.get("/api/documents/?query=statement") results = response.data["results"] self.assertEqual(response.data["count"], 2) self.assertEqual(len(results), 2) + self.assertCountEqual(response.data["all"], [d2.id, d3.id]) response = self.client.get("/api/documents/?query=sfegdfg") results = response.data["results"] self.assertEqual(response.data["count"], 0) self.assertEqual(len(results), 0) + self.assertCountEqual(response.data["all"], []) def test_search_multi_page(self): with AsyncWriter(index.open_index()) as writer: @@ -1230,6 +1234,31 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): [d1.id, d3.id, d2.id], ) + def test_pagination_all(self): + """ + GIVEN: + - A set of 50 documents + WHEN: + - API reuqest for document filtering + THEN: + - Results are paginated (25 items) and response["all"] returns all ids (50 items) + """ + t = Tag.objects.create(name="tag") + docs = [] + for i in range(50): + d = Document.objects.create(checksum=i, content=f"test{i}") + d.tags.add(t) + docs.append(d) + + response = self.client.get( + f"/api/documents/?tags__id__in={t.id}", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertEqual(len(results), 25) + self.assertEqual(len(response.data["all"]), 50) + self.assertCountEqual(response.data["all"], [d.id for d in docs]) + def test_statistics(self): doc1 = Document.objects.create( title="none1", diff --git a/src/paperless/views.py b/src/paperless/views.py index 588b534e3..777641f75 100644 --- a/src/paperless/views.py +++ b/src/paperless/views.py @@ -1,4 +1,5 @@ import os +from collections import OrderedDict from django.contrib.auth.models import Group from django.contrib.auth.models import User @@ -9,6 +10,7 @@ from django_filters.rest_framework import DjangoFilterBackend from rest_framework.filters import OrderingFilter from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from documents.permissions import PaperlessObjectPermissions @@ -23,6 +25,47 @@ class StandardPagination(PageNumberPagination): page_size_query_param = "page_size" max_page_size = 100000 + def get_paginated_response(self, data): + return Response( + OrderedDict( + [ + ("count", self.page.paginator.count), + ("next", self.get_next_link()), + ("previous", self.get_previous_link()), + ("all", self.get_all_result_ids()), + ("results", data), + ], + ), + ) + + def get_all_result_ids(self): + ids = [] + if hasattr(self.page.paginator.object_list, "saved_results"): + results_page = self.page.paginator.object_list.saved_results[0] + if results_page is not None: + for i in range(0, len(results_page.results.docs())): + try: + fields = results_page.results.fields(i) + if "id" in fields: + ids.append(fields["id"]) + except Exception: + pass + else: + for obj in self.page.paginator.object_list: + if hasattr(obj, "id"): + ids.append(obj.id) + elif hasattr(obj, "fields"): + ids.append(obj.fields()["id"]) + return ids + + def get_paginated_response_schema(self, schema): + response_schema = super().get_paginated_response_schema(schema) + response_schema["properties"]["all"] = { + "type": "array", + "example": "[1, 2, 3]", + } + return response_schema + class FaviconView(View): def get(self, request, *args, **kwargs): # pragma: nocover From 81a7b34101c4ffbfaa3a9d84082e17ae07d917ac Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 6 May 2023 23:32:21 -0700 Subject: [PATCH 008/103] Dont perform mail actions when rule filename filter not met Update mail.py --- src/paperless_mail/mail.py | 26 +++++++++++++--- src/paperless_mail/tests/test_mail.py | 45 +++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/paperless_mail/mail.py b/src/paperless_mail/mail.py index 45cf57aa1..de03a4861 100644 --- a/src/paperless_mail/mail.py +++ b/src/paperless_mail/mail.py @@ -725,11 +725,27 @@ class MailAccountHandler(LoggingMixin): f"by paperless", ) - queue_consumption_tasks( - consume_tasks=consume_tasks, - rule=rule, - message=message, - ) + if len(consume_tasks) > 0: + queue_consumption_tasks( + consume_tasks=consume_tasks, + rule=rule, + message=message, + ) + else: + # No files to consume, just mark as processed if it wasnt by .eml processing + if not ProcessedMail.objects.filter( + rule=rule, + uid=message.uid, + folder=rule.folder, + ).exists(): + ProcessedMail.objects.create( + rule=rule, + folder=rule.folder, + uid=message.uid, + subject=message.subject, + received=message.date, + status="PROCESSED_WO_CONSUMPTION", + ) return processed_attachments diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index 0ca32663a..e69dbbef8 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -222,7 +222,7 @@ class TestMail( self, attachments: Union[int, List[_AttachmentDef]] = 1, body: str = "", - subject: str = "the suject", + subject: str = "the subject", from_: str = "noone@mail.com", to: Optional[List[str]] = None, seen: bool = False, @@ -539,7 +539,6 @@ class TestMail( tests = [ ("*.pdf", ["f1.pdf", "f2.pdf", "f3.pdf", "file.PDf", "f1.Pdf"]), ("f1.pdf", ["f1.pdf", "f1.Pdf"]), - ("f1", []), ("*", ["f1.pdf", "f2.pdf", "f3.pdf", "f2.png", "file.PDf", "f1.Pdf"]), ("*.png", ["f2.png"]), ] @@ -564,6 +563,48 @@ class TestMail( ], ) + def test_filename_filter_inline_no_consumption(self): + """ + GIVEN: + - Rule that processes all attachments but filters by filename + WHEN: + - Given email with inline attachment that does not meet filename filter + THEN: + - Mail action should not be performed + """ + message = self.create_message( + attachments=[ + _AttachmentDef( + filename="test.png", + disposition="inline", + ), + ], + ) + self.bogus_mailbox.messages.append(message) + account = MailAccount.objects.create( + name="test", + imap_server="", + username="admin", + password="secret", + ) + account.save() + rule = MailRule( + name=str(uuid.uuid4()), + assign_title_from=MailRule.TitleSource.FROM_FILENAME, + account=account, + filter_attachment_filename="*.pdf", + attachment_type=MailRule.AttachmentProcessing.EVERYTHING, + action=MailRule.MailAction.DELETE, + ) + rule.save() + + self.assertEqual(len(self.bogus_mailbox.messages), 4) + + self.mail_account_handler.handle_mail_account(account) + self.apply_mail_actions() + + self.assertEqual(len(self.bogus_mailbox.messages), 1) + def test_handle_mail_account_mark_read(self): account = MailAccount.objects.create( name="test", From 9a40a5f0190a280385ec0f26bea1d1d19df94ec7 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 4 May 2023 08:40:10 -0700 Subject: [PATCH 009/103] Add proper testing for *__id__in testing --- src/documents/tests/test_api.py | 40 ++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/documents/tests/test_api.py b/src/documents/tests/test_api.py index e8c6dee7c..5588378cc 100644 --- a/src/documents/tests/test_api.py +++ b/src/documents/tests/test_api.py @@ -912,8 +912,11 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): t = Tag.objects.create(name="tag") t2 = Tag.objects.create(name="tag2") c = Correspondent.objects.create(name="correspondent") + c2 = Correspondent.objects.create(name="correspondent2") dt = DocumentType.objects.create(name="type") + dt2 = DocumentType.objects.create(name="type2") sp = StoragePath.objects.create(name="path") + sp2 = StoragePath.objects.create(name="path2") d1 = Document.objects.create(checksum="1", correspondent=c, content="test") d2 = Document.objects.create(checksum="2", document_type=dt, content="test") @@ -934,6 +937,13 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): ) Document.objects.create(checksum="6", content="test2") d7 = Document.objects.create(checksum="7", storage_path=sp, content="test") + d8 = Document.objects.create( + checksum="8", + correspondent=c2, + document_type=dt2, + storage_path=sp2, + content="test", + ) with AsyncWriter(index.open_index()) as writer: for doc in Document.objects.all(): @@ -946,39 +956,39 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): self.assertCountEqual( search_query(""), - [d1.id, d2.id, d3.id, d4.id, d5.id, d7.id], + [d1.id, d2.id, d3.id, d4.id, d5.id, d7.id, d8.id], ) self.assertCountEqual(search_query("&is_tagged=true"), [d3.id, d4.id]) self.assertCountEqual( search_query("&is_tagged=false"), - [d1.id, d2.id, d5.id, d7.id], + [d1.id, d2.id, d5.id, d7.id, d8.id], ) self.assertCountEqual(search_query("&correspondent__id=" + str(c.id)), [d1.id]) self.assertCountEqual( - search_query("&correspondent__id__in=" + str(c.id)), - [d1.id], + search_query(f"&correspondent__id__in={c.id},{c2.id}"), + [d1.id, d8.id], ) self.assertCountEqual( search_query("&correspondent__id__none=" + str(c.id)), - [d2.id, d3.id, d4.id, d5.id, d7.id], + [d2.id, d3.id, d4.id, d5.id, d7.id, d8.id], ) self.assertCountEqual(search_query("&document_type__id=" + str(dt.id)), [d2.id]) self.assertCountEqual( - search_query("&document_type__id__in=" + str(dt.id)), - [d2.id], + search_query(f"&document_type__id__in={dt.id},{dt2.id}"), + [d2.id, d8.id], ) self.assertCountEqual( search_query("&document_type__id__none=" + str(dt.id)), - [d1.id, d3.id, d4.id, d5.id, d7.id], + [d1.id, d3.id, d4.id, d5.id, d7.id, d8.id], ) self.assertCountEqual(search_query("&storage_path__id=" + str(sp.id)), [d7.id]) self.assertCountEqual( - search_query("&storage_path__id__in=" + str(sp.id)), - [d7.id], + search_query(f"&storage_path__id__in={sp.id},{sp2.id}"), + [d7.id, d8.id], ) self.assertCountEqual( search_query("&storage_path__id__none=" + str(sp.id)), - [d1.id, d2.id, d3.id, d4.id, d5.id], + [d1.id, d2.id, d3.id, d4.id, d5.id, d8.id], ) self.assertCountEqual( @@ -1002,6 +1012,14 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): search_query("&tags__id__all=" + str(t2.id)), [d3.id, d4.id], ) + self.assertCountEqual( + search_query(f"&tags__id__in={t.id},{t2.id}"), + [d3.id, d4.id], + ) + self.assertCountEqual( + search_query(f"&tags__id__none={t.id},{t2.id}"), + [d1.id, d2.id, d5.id, d7.id, d8.id], + ) self.assertIn( d4.id, From b783d2e2102f460ec7d41198c4bfe69e015d2263 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 7 May 2023 16:07:48 -0700 Subject: [PATCH 010/103] Fix PassUserMixin not properly being used in DocumentViewSet --- src/documents/tests/test_api.py | 26 ++++++++++++++++++++++++-- src/documents/views.py | 4 +--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/documents/tests/test_api.py b/src/documents/tests/test_api.py index e8c6dee7c..29829c8ab 100644 --- a/src/documents/tests/test_api.py +++ b/src/documents/tests/test_api.py @@ -3533,9 +3533,28 @@ class TestApiAuth(DirectoriesMixin, APITestCase): ) def test_dynamic_permissions_fields(self): - Document.objects.create(title="Test", content="content 1", checksum="1") + user1 = User.objects.create_user(username="user1") + user1.user_permissions.add(*Permission.objects.filter(codename="view_document")) + user2 = User.objects.create_user(username="user2") + + Document.objects.create(title="Test", content="content 1", checksum="1") + doc2 = Document.objects.create( + title="Test2", + content="content 2", + checksum="2", + owner=user2, + ) + doc3 = Document.objects.create( + title="Test3", + content="content 3", + checksum="3", + owner=user2, + ) + + assign_perm("view_document", user1, doc2) + assign_perm("view_document", user1, doc3) + assign_perm("change_document", user1, doc3) - user1 = User.objects.create_superuser(username="test1") self.client.force_authenticate(user1) response = self.client.get( @@ -3549,6 +3568,9 @@ class TestApiAuth(DirectoriesMixin, APITestCase): self.assertNotIn("permissions", resp_data["results"][0]) self.assertIn("user_can_change", resp_data["results"][0]) + self.assertEqual(resp_data["results"][0]["user_can_change"], True) # doc1 + self.assertEqual(resp_data["results"][1]["user_can_change"], False) # doc2 + self.assertEqual(resp_data["results"][2]["user_can_change"], True) # doc3 response = self.client.get( "/api/documents/?full_perms=true", diff --git a/src/documents/views.py b/src/documents/views.py index 0b450c3b3..bfe2b3e6f 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -270,11 +270,9 @@ class DocumentViewSet( return Document.objects.distinct().annotate(num_notes=Count("notes")) def get_serializer(self, *args, **kwargs): - super().get_serializer(*args, **kwargs) fields_param = self.request.query_params.get("fields", None) fields = fields_param.split(",") if fields_param else None truncate_content = self.request.query_params.get("truncate_content", "False") - serializer_class = self.get_serializer_class() kwargs.setdefault("context", self.get_serializer_context()) kwargs.setdefault("fields", fields) kwargs.setdefault("truncate_content", truncate_content.lower() in ["true", "1"]) @@ -282,7 +280,7 @@ class DocumentViewSet( "full_perms", self.request.query_params.get("full_perms", False), ) - return serializer_class(*args, **kwargs) + return super().get_serializer(*args, **kwargs) def update(self, request, *args, **kwargs): response = super().update(request, *args, **kwargs) From caf43638de497dc0652cc353197351f1daa74d5b Mon Sep 17 00:00:00 2001 From: Ross Brown Date: Sun, 7 May 2023 05:18:57 +0100 Subject: [PATCH 011/103] Bump django from 4.1.7 to 4.1.9 --- Pipfile | 4 +++- Pipfile.lock | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Pipfile b/Pipfile index d1471f52c..c0456a4db 100644 --- a/Pipfile +++ b/Pipfile @@ -10,7 +10,9 @@ name = "piwheels" [packages] dateparser = "~=1.1" -django = "~=4.1" +# WARNING: django does not use semver. +# Only patch versions are guaranteed to not introduce breaking changes. +django = "~=4.1.9" django-cors-headers = "*" django-celery-results = "*" django-compression-middleware = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 1831d894c..790b13a38 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5a1fda76f86696709eca15c024959540ea9ce860b9d67f401e3e3aa7b01eca34" + "sha256": "a854a7a6c073e1cc1a3360fe357517fbf1748c221a55df9b55468a7ffd14acf1" }, "pipfile-spec": 6, "requires": {}, @@ -489,11 +489,11 @@ }, "django": { "hashes": [ - "sha256:44f714b81c5f190d9d2ddad01a532fe502fa01c4cb8faf1d081f4264ed15dcd8", - "sha256:f2f431e75adc40039ace496ad3b9f17227022e8b11566f4b363da44c7e44761e" + "sha256:adae3a952fd86800094ae6f64aa558572e8b4ba8dfe21f0ed8175147e75a72a1", + "sha256:e9f074a84930662104871bfcea55c3c180c50a0a47739db82435deae6cbaf032" ], "index": "pypi", - "version": "==4.1.7" + "version": "==4.1.9" }, "django-celery-results": { "hashes": [ @@ -1795,11 +1795,11 @@ }, "sqlparse": { "hashes": [ - "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34", - "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268" + "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3", + "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c" ], "markers": "python_version >= '3.5'", - "version": "==0.4.3" + "version": "==0.4.4" }, "threadpoolctl": { "hashes": [ From 55af3c3dd1d47b18e2f927e2d86bd252d5e33630 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:04 -0700 Subject: [PATCH 012/103] New translations messages.xlf (French) [ci skip] --- src-ui/src/locale/messages.fr_FR.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.fr_FR.xlf b/src-ui/src/locale/messages.fr_FR.xlf index 8a5558e22..854854a94 100644 --- a/src-ui/src/locale/messages.fr_FR.xlf +++ b/src-ui/src/locale/messages.fr_FR.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Démarrage du téléversement... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Une erreur s'est produite lors de l'enregistrement des paramètres de vérification des mises à jour. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Appliquer @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Cliquer à nouveau pour exclure des éléments. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Non affecté @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Bonjour , bienvenue dans Paperless-ngx  @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Bienvenue dans Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx fonctionne ! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Vous êtes prêt à téléverser des documents ! Explorez les différentes fonctionnalités de cette application web par vous-même, ou commencez une visite rapide en utilisant le bouton ci-dessous. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Davantage de détails sur comment utiliser et configurer Paperless-ngx sont disponibles dans la documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Merci de faire partie de la communauté Paperless-ngx ! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Commencer la visite  @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Erreur lors de la récupération des métadonnées @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Erreur lors de la récupération des suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document enregistré avec succès. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Erreur lors de la sauvegarde du document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Voulez-vous vraiment supprimer le document "" ? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Les fichiers liés à ce document seront supprimés définitivement. Cette action est irréversible. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Supprimer le document @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Erreur lors de la suppression du document : @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Cette opération écrasera la ROC pour ce document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 La relance de la ROC va démarrer en arrière-plan. Fermez et réouvrez ou recharger ce document une fois l'opération terminée pour voir le nouveau contenu. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Erreur lors de l'exécution de l'opération : @@ -5857,6 +5857,14 @@ Impossible de migrer les paramètres vers la base de données, veuillez essayer d’enregistrer manuellement. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 02d09edd493aa06edef10100fcc3194e2fbb8956 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:05 -0700 Subject: [PATCH 013/103] New translations messages.xlf (Spanish) [ci skip] --- src-ui/src/locale/messages.es_ES.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.es_ES.xlf b/src-ui/src/locale/messages.es_ES.xlf index 0b4697e00..f6afbaedf 100644 --- a/src-ui/src/locale/messages.es_ES.xlf +++ b/src-ui/src/locale/messages.es_ES.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Iniciando subida... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Se produjo un error al guardar la configuración de comprobación de actualizaciones. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Aplicar @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Haga clic de nuevo para excluir los elementos. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Sin asignar @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Bienvenido a Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 ¡Paperless-ngx está corriendo! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Encontrarás más información sobre cómo utilizar y configurar Paperless-ngx en la documentación. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 ¡Gracias por formar parte de la comunidad de Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 ¿Estás seguro de querer borrar el documento ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Los archivos para este documento serán borrados permanentemente. Esta operación no se puede deshacer. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Borrar documento @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Esta operación rehará permanentemente el OCR de este documento. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ No se puede migrar la configuración a la base de datos, por favor intente guardarla manualmente. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 3c86b12ef97a845448490111e76eb5279a6e5d9a Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:07 -0700 Subject: [PATCH 014/103] New translations messages.xlf (Arabic) [ci skip] --- src-ui/src/locale/messages.ar_AR.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.ar_AR.xlf b/src-ui/src/locale/messages.ar_AR.xlf index 820ee2a3d..e3d9f405b 100644 --- a/src-ui/src/locale/messages.ar_AR.xlf +++ b/src-ui/src/locale/messages.ar_AR.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 بَدْء التحميل... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 حدث خطأ في أثناء حفظ إعدادات التحقق من التحديث. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 تطبيق @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 انقر مرة أخرى لاستبعاد العناصر. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned غير معين @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 أهلا , مرحبا بك في Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 مرحبا بك في Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 يعمل Paperless-ngx! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 أنت على استعداد لبدء تحميل المستندات! استكشف الميزات المختلفة لتطبيق الويب هذا بمفردك، أو بدء جولة سريعة باستخدام الزر أدناه. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 المزيد من التفاصيل حول كيفية استخدام وتهيئة Paperless-ngx متوفرة دائماً في المستندات. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 شكرًا لك لكونك جزءًا من مجتمع Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 بدء الجولة @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 خطأ في استرجاع البيانات الوصفية @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 خطأ في استرجاع الاقتراحات @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 تم حفظ المستند بنجاح. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 خطأ أثناء حفظ المستند @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 هل تريد حقاً حذف المستند " @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 ستحذف ملفات هذا المستند بشكل دائم. لا يمكن التراجع عن هذه العملية. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 حذف مستند @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 حدث خطأ بحذف المستند: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 هذه العملية ستعيد بشكل دائم OCR لهذا المستند. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 إعادة تشغيل OCR ستبدأ في الخلفية. إغلاق وإعادة فتح أو إعادة تحميل هذا المستند بعد اكتمال العملية لمشاهدة محتوى جديد. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 خطأ في تنفيذ العملية: @@ -5857,6 +5857,14 @@ غير قادر على ترحيل الإعدادات إلى قاعدة البيانات، الرجاء محاولة الحفظ يدوياً. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 8ee63124021ae91285bac2d038291d618ef5e1b8 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:08 -0700 Subject: [PATCH 015/103] New translations messages.xlf (Belarusian) [ci skip] --- src-ui/src/locale/messages.be_BY.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.be_BY.xlf b/src-ui/src/locale/messages.be_BY.xlf index eb3b2c2d7..330db3634 100644 --- a/src-ui/src/locale/messages.be_BY.xlf +++ b/src-ui/src/locale/messages.be_BY.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Пачатак загрузкі... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Адбылася памылка падчас захавання налад праверкі абнаўленняў. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Ужыць @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Націсніце зноў, каб выключыць элементы. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Не прызначана @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Прывітанне, , запрашаем у Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Вітаем у Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx працуе! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Вы гатовыя пачаць запампоўку дакументаў! Даследуйце розныя функцыі гэтай вэб-праграмы самастойна або пачніце кароткі тур, націснуўшы кнопку ніжэй. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Дзякуй за ўдзел у супольнасці Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Пачаць тур @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Вы сапраўды хочаце выдаліць дакумент ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Файлы для гэтага дакумента будуць выдалены назаўсёды. Гэтую аперацыю нельга адмяніць. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Выдаліць дакумент @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Гэтая аперацыя назаўсёды паўторыць OCR для гэтага дакумента. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Памылка выканання аперацыі: @@ -5857,6 +5857,14 @@ Немагчыма перанесці налады ў базу дадзеных, паспрабуйце захаваць уручную. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From c986a218c79e969625c00514637be20964367fea Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:09 -0700 Subject: [PATCH 016/103] New translations messages.xlf (Catalan) [ci skip] --- src-ui/src/locale/messages.ca_ES.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.ca_ES.xlf b/src-ui/src/locale/messages.ca_ES.xlf index 5a65f86b8..6c08efe8a 100644 --- a/src-ui/src/locale/messages.ca_ES.xlf +++ b/src-ui/src/locale/messages.ca_ES.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Inicialitzant pujada... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 S'ha produït un error en desar la configuració de comprovació d'actualitzacions. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Aplica @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Feu clic de nou per excloure elements. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned No assignat @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hola , benvingut a Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Benvingut a Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx funcionant! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Tot preparat per començar a penjar documents! Explora les diverses funcions d'aquesta aplicació web pel vostre compte o inicieu un recorregut ràpid amb el botó següent. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Més detalls de com utilitzar i configurar Paperless-ngx sempre estan disponibles a la pàgina documentació. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Gràcies per formar part de la comunitat Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Comença el tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error recuperant metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error recuperant suggerències @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document guardat correctament. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error guardant document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Realment vols esborrar el document ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Els fitxers d'aquest document se suprimiran permanentment. Aquesta operació no es pot desfer. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Esborra document @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error esborrant document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Aquesta operació tornarà a fer l'OCR per a aquest document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 L'operació de refer OCR començarà en segon pla. Tanqueu i torneu a obrir o recarregueu aquest document un cop finalitzada l'operació per veure contingut nou. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executant operació: @@ -5857,6 +5857,14 @@ No es pot migrar la configuració de la base de dades, prova manualment. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 9e992da863be882d743b2026fdf41fd4e8d41f3a Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:10 -0700 Subject: [PATCH 017/103] New translations messages.xlf (Czech) [ci skip] --- src-ui/src/locale/messages.cs_CZ.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.cs_CZ.xlf b/src-ui/src/locale/messages.cs_CZ.xlf index acb655166..3c060b0d5 100644 --- a/src-ui/src/locale/messages.cs_CZ.xlf +++ b/src-ui/src/locale/messages.cs_CZ.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Initiating upload... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Došlo k chybě při ukládání nastavení kontroly aktualizací. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Použít @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Klikněte znovu pro vyloučení položek. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nepřiřazeno @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Ahoj , vítej v Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Vítej v Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx běží! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Jste připraveni začít nahrávat dokumenty! Prozkoumejte různé funkce této webové aplikace sami, nebo začněte rychlou prohlídku pomocí tlačítka níže. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Podrobnější informace o používání a konfiguraci Paperless-ngx jsou vždy k dispozici v dokumentaci. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Děkujeme, že jste součástí komunity Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Spustit prohlídku @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Opravdu chcete smazat dokument ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Soubory tohoto dokumentu budou trvale smazány. Tuto operaci nelze vrátit zpět. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Smazat dokument @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 33f7b58e6eacc5eeb0da5cbe435b45f370793b67 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:11 -0700 Subject: [PATCH 018/103] New translations messages.xlf (Danish) [ci skip] --- src-ui/src/locale/messages.da_DK.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.da_DK.xlf b/src-ui/src/locale/messages.da_DK.xlf index c89757616..7b85c6444 100644 --- a/src-ui/src/locale/messages.da_DK.xlf +++ b/src-ui/src/locale/messages.da_DK.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Uploader... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Anvend @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Klik igen for at ekskludere elementer. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ikke tildelt @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Er du sikker på, at du vil slette dokument ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Filerne for dette dokument vil blive slettet permanent. Denne handling kan ikke fortrydes. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Slet dokument @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 7ef14832d06d057ba6f9bca51117f0d6b0c5f3c8 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:13 -0700 Subject: [PATCH 019/103] New translations messages.xlf (German) [ci skip] --- src-ui/src/locale/messages.de_DE.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.de_DE.xlf b/src-ui/src/locale/messages.de_DE.xlf index dc3d71881..42a4dadc5 100644 --- a/src-ui/src/locale/messages.de_DE.xlf +++ b/src-ui/src/locale/messages.de_DE.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Beginne Upload... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Es ist ein Fehler beim Speichern der Update-Einstellungen aufgetreten. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Anwenden @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Erneut klicken, um Elemente auszuschließen. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nicht zugewiesen @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hallo , willkommen zu Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Willkommen bei Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx ist gestartet! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Sie sind bereit, Dokumente hochzuladen! Entdecken Sie die verschiedenen Funktionen dieser Web-App auf eigene Faust oder starten Sie eine kurze Tour mit dem unten stehenden Button. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Mehr Details zur Verwendung und Konfiguration von Paperless-ngx sind immer in der -Dokumentation verfügbar. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Vielen Dank, dass Sie Teil der Paperless-ngx Community sind! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Die Tour beginnen @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Fehler beim Abrufen der Metadaten @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Fehler beim Abrufen der Vorschläge @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Dokument erfolgreich gespeichert. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Fehler beim Speichern des Dokuments @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Möchten Sie das Dokument "" wirklich löschen? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Die Dateien dieses Dokuments werden permanent gelöscht. Diese Aktion kann nicht rückgängig gemacht werden. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Dokument löschen @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Fehler beim Löschen des Dokuments @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Diese Aktion wird die Texterkennung für das Dokument wiederholen. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 OCR-Vorgang wird im Hintergrund neu gestartet. Schließen oder laden Sie dieses Dokument nach Abschluss der Operation neu oder öffnen Sie es erneut, um neue Inhalte anzuzeigen. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Fehler beim Ausführen der Aktion: @@ -5857,6 +5857,14 @@ Einstellungen konnten nicht in die Datenbank migriert werden, bitte versuchen Sie es manuell. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 9694face1687bff5e7d08fb3323427e863a05f1d Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:14 -0700 Subject: [PATCH 020/103] New translations messages.xlf (Finnish) [ci skip] --- src-ui/src/locale/messages.fi_FI.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.fi_FI.xlf b/src-ui/src/locale/messages.fi_FI.xlf index e3e3f9d91..2a9958dba 100644 --- a/src-ui/src/locale/messages.fi_FI.xlf +++ b/src-ui/src/locale/messages.fi_FI.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Aloittaa latausta... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Virhe tallennettaessa päivitystarkistuksen asetuksia @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Käytä @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Klikkaa uudelleen jättääksesi pois kohteita. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ei määritetty @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hei , tervetuloa Paperless-ngx sovellukseen @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Tervetuloa Paperless-ngx sovellukseen @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx on käynnissä! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Olet valmis aloittamaan asiakirjojen lataamisen! Tutustu tämän web-sovelluksen eri ominaisuuksiin tai aloita opastus käyttämällä alla olevaa painiketta. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Tarkempia tietoja Paperless-ngx sovelluksen käytöstä ja konfiguroinnista on saatavilla dokumentaatiossa. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Kiitos, että olette osana Paperless-ngx -yhteisöä! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Aloita opastus @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Virhe haettaessa metatietoja @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Virhe haettaessa ehdotuksia @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Asiakirja tallennettu onnistuneesti. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Virhe tallennettaessa asiakirjaa @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Haluatko varmasti poistaa asiakirjan ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Tämän asiakirjan tiedostot poistetaan pysyvästi. Tätä toimintoa ei voi peruuttaa. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Poista asiakirja @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Virhe poistettaessa asiakirjaa: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Tämä toiminto suorittaa OCR:n uudelleen. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 OCR-toiminto alkaa taustalla. Sulje ja avaa uudelleen tämä asiakirja tai lataa se uudelleen, kun toiminto on suoritettu nähdäksesi uuden sisällön. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Virhe suoritettaessa toimintoa: @@ -5857,6 +5857,14 @@ Asetuksia ei saatu migratoitua tietokantaan. Yritä tallennusta manuaalisesti. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 9b2ca57038ccaec251b45e6b114f799dfc8085c4 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:15 -0700 Subject: [PATCH 021/103] New translations messages.xlf (Hebrew) [ci skip] --- src-ui/src/locale/messages.he_IL.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.he_IL.xlf b/src-ui/src/locale/messages.he_IL.xlf index 932823690..7106f1aec 100644 --- a/src-ui/src/locale/messages.he_IL.xlf +++ b/src-ui/src/locale/messages.he_IL.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 מאתחל העלאה... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 החל @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 לחץ שוב כדי לא לכלול פריטים. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned לא הוקצה @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 בטוח שברצנך למחוק את המסמך ? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 הקבצים עבור מסמך זה יימחקו לצמיתות. לא ניתן לבטל פעולה זו. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 מחק מסמך @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ לא ניתן לבצע העברה של הגדרות למסד הנתונים, נסה לשמור באופן ידני. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From efb00b2387a0355d7305e17651c84bc674cb95d3 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:17 -0700 Subject: [PATCH 022/103] New translations messages.xlf (Italian) [ci skip] --- src-ui/src/locale/messages.it_IT.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.it_IT.xlf b/src-ui/src/locale/messages.it_IT.xlf index 547a58e94..0f1d647d4 100644 --- a/src-ui/src/locale/messages.it_IT.xlf +++ b/src-ui/src/locale/messages.it_IT.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Avvio caricamento... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Si è verificato un errore durante il salvataggio delle impostazioni sugli aggiornamenti. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Applica @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Clicca di nuovo per escludere gli elementi. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Non assegnato @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Ciao , benvenuto su Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Benvenuto su Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless è in esecuzione! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Sei pronto per iniziare a caricare documenti! Esplora le varie funzionalità di questa web app da sola, o inizia un rapido tour utilizzando il pulsante qui sotto. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Maggiori informazioni su come usare e configurare Paperless-ngx sono disponibili nella documentazione. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Grazie per essere parte della comunità di Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Inizia il tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Errore nel recupero dei metadati @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Errore nel recupero dei suggerimenti @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Errore nel salvare il documento @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Vuoi eliminare il documento ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 I file di questo documento saranno eliminati permanentemente. Questa operazione è irreversibile. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Elimina documento @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Questa operazione effettuerà la rilettura OCR di questo documento. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Errore nell'esecuzione dell'operazione: @@ -5857,6 +5857,14 @@ Impossibile migrare le impostazioni nel database, prova a salvare manualmente. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From fd1d12859d4730cb4ab90cd62aeedd452f1cadce Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:18 -0700 Subject: [PATCH 023/103] New translations messages.xlf (Dutch) [ci skip] --- src-ui/src/locale/messages.nl_NL.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.nl_NL.xlf b/src-ui/src/locale/messages.nl_NL.xlf index f8b013637..31c74e10b 100644 --- a/src-ui/src/locale/messages.nl_NL.xlf +++ b/src-ui/src/locale/messages.nl_NL.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Upload starten... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Er is een fout opgetreden tijdens het opslaan van de instellingen voor updatecontroles. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Toepassen @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Klik nogmaals om items uit te sluiten. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Zonder toewijzing @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hallo , welkom bij Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welkom bij Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is gestart! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 U bent klaar om documenten te uploaden! Ontdek zelf de verschillende functies van deze webapp of start een snelle rondleiding met de knop hieronder. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Meer details over het gebruik van Paperless-ngx zijn altijd beschikbaar in de documentatie. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Bedankt dat je deel uitmaakt van de Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Rondleiding starten @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Fout bij ophalen metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Fout bij ophalen suggesties @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document succesvol opgeslagen. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Fout bij opslaan document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Wilt u het document echt verwijderen ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 De bestanden voor dit document worden definitief verwijderd. Deze bewerking kan niet ongedaan worden gemaakt. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Verwijder document @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Fout bij verwijderen document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Met deze bewerking wordt OCR permanent opnieuw uitgevoerd voor dit document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Opnieuw uitvoeren van OCR-bewerking begint op de achtergrond. Sluit en heropen of herlaad dit document nadat de bewerking is voltooid om nieuwe inhoud te zien. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Fout tijdens uitvoeren bewerking: @@ -5857,6 +5857,14 @@ Kan instellingen niet migreren naar de database, probeer handmatig op te slaan. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 6b8b8209f3fde6578645901cdd0df58d03d2a1a8 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:19 -0700 Subject: [PATCH 024/103] New translations messages.xlf (Norwegian) [ci skip] --- src-ui/src/locale/messages.no_NO.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.no_NO.xlf b/src-ui/src/locale/messages.no_NO.xlf index 017630719..c24031625 100644 --- a/src-ui/src/locale/messages.no_NO.xlf +++ b/src-ui/src/locale/messages.no_NO.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Starter opplasting... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Bruk @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Klikk igjen for å ekskludere elementer. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ikke tildelt @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Ønsker du virkelig å slette dokumentet ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Filene til dokumentet vil bli slettet permanent. Denne operasjonen kan ikke angres. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Slett dokument @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Denne operasjonen vil permanent gjenta OCR for dette dokumentet. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Kunne ikke overføre innstillinger til databasen, prøv å lagre manuelt. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 7ce67fd465035b59b7412b7060213210704c484c Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:20 -0700 Subject: [PATCH 025/103] New translations messages.xlf (Polish) [ci skip] --- src-ui/src/locale/messages.pl_PL.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.pl_PL.xlf b/src-ui/src/locale/messages.pl_PL.xlf index 5ca06a9b2..d0fd41f76 100644 --- a/src-ui/src/locale/messages.pl_PL.xlf +++ b/src-ui/src/locale/messages.pl_PL.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Rozpoczęcie wysyłania... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Wystąpił błąd podczas zapisywania ustawień sprawdzania aktualizacyj. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Zastosuj @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Kliknij ponownie, aby wykluczyć elementy. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nieprzypisane @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Czy na pewno chcesz usunąć dokument""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Pliki tego dokumentu zostaną trwale usunięte. Tej operacji nie można cofnąć. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Usuń dokument @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Nie można przenieść ustawień do bazy danych, spróbuj zapisać ręcznie. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 059e37a41f9c1fb2cea4b960d529bb08cfe0cd19 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:22 -0700 Subject: [PATCH 026/103] New translations messages.xlf (Portuguese) [ci skip] --- src-ui/src/locale/messages.pt_PT.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.pt_PT.xlf b/src-ui/src/locale/messages.pt_PT.xlf index 64afa3156..a4aab368f 100644 --- a/src-ui/src/locale/messages.pt_PT.xlf +++ b/src-ui/src/locale/messages.pt_PT.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 A iniciar o carregamento... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Aplicar @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Clique novamente para excluir itens. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Não atribuído @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Olá , bem-vindo ao Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Bem-vindo ao Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Tem a certeza que quer apagar o documento ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Os ficheiros deste documento serão excluídos permanentemente. Esta operação não pode ser revertida. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Apagar documento @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From feb943b6df55cd6aad5b50483781278ed5706362 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:23 -0700 Subject: [PATCH 027/103] New translations messages.xlf (Russian) [ci skip] --- src-ui/src/locale/messages.ru_RU.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.ru_RU.xlf b/src-ui/src/locale/messages.ru_RU.xlf index d470bf49f..8d4e1fadb 100644 --- a/src-ui/src/locale/messages.ru_RU.xlf +++ b/src-ui/src/locale/messages.ru_RU.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Начинается загрузка... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Произошла ошибка при сохранении настроек проверки обновлений. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Подтвердить @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Нажмите еще раз, чтобы исключить элементы. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Не назначено @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Здравствуйте, , добро пожаловать в Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Добро пожаловать в Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx работает! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Вы готовы начать загружать документы! Изучите различные функции этого веб-приложения самостоятельно, или начните короткий тур с помощью кнопки ниже. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Более подробная информация о том, как использовать и настроить Paperless-ngx всегда доступна в документации. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Спасибо, что являетесь частью сообщества Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Начать тур @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Ошибка при получении метаданных @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Ошибка при получении предложений @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Ошибка при сохранении документа @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Вы действительно хотите удалить документ ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Файлы из этого документа будут удалены незамедлительно. Это операцию нельзя отменить. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Удалить документ @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Это действие перезапишет результаты распознавания текста для этого документа. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Операция повторного распознавания начнется в фоновом режиме. Закройте и повторно откройте или перезагрузите этот документ после завершения операции, чтобы увидеть новое содержимое. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Ошибка выполнения операции: @@ -5857,6 +5857,14 @@ Не удается перенести настройки в базу данных, пожалуйста, попробуйте сохранить вручную. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From a26bec5b00426586e22b4408cba36eeef9a1433b Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:24 -0700 Subject: [PATCH 028/103] New translations messages.xlf (Slovenian) [ci skip] --- src-ui/src/locale/messages.sl_SI.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.sl_SI.xlf b/src-ui/src/locale/messages.sl_SI.xlf index 8c9bfe18d..e1a00f01f 100644 --- a/src-ui/src/locale/messages.sl_SI.xlf +++ b/src-ui/src/locale/messages.sl_SI.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Začetek nalaganja... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Uporabi @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Kliknite znova, da izključite elemente. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ni dodeljeno @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Ali res želite izbrisati dokument ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Datoteke za ta dokument bodo trajno izbrisane. Te operacije ni mogoče razveljaviti. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Izbriši dokument @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Ta izbira bo permanentno izvedla ponovni OCR na tem dokumentu. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Napaka pri izvajanju operacije: @@ -5857,6 +5857,14 @@ Nastavitev ni mogoče preseliti v bazo podatkov, poskusite jih shraniti ročno. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 38af53f28141284a1bd8acfaae85da1a1ae34d7c Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:25 -0700 Subject: [PATCH 029/103] New translations messages.xlf (Swedish) [ci skip] --- src-ui/src/locale/messages.sv_SE.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.sv_SE.xlf b/src-ui/src/locale/messages.sv_SE.xlf index 8b5aa2690..99ae6b77e 100644 --- a/src-ui/src/locale/messages.sv_SE.xlf +++ b/src-ui/src/locale/messages.sv_SE.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Initiating upload... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Tillämpa @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Click again to exclude items. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Inte tilldelad @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hej , välkommen till Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Välkommen till Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx är igång! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Du kan nu börja ladda upp dokument! Utforska de olika funktionerna på egen hand, eller starta en snabb rundtur med hjälp av knappen nedanför. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Tack för att du är en del av gemenskapen kring Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Starta rundturen @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Vill du verkligen ta bort dokumentet ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Filerna för detta dokument kommer att raderas permanent. Den här åtgärden kan inte ångras. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Ta bort dokument @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 5e7579c1fd1cb2514900f173db5160ea674948bf Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:27 -0700 Subject: [PATCH 030/103] New translations messages.xlf (Turkish) [ci skip] --- src-ui/src/locale/messages.tr_TR.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.tr_TR.xlf b/src-ui/src/locale/messages.tr_TR.xlf index fba44e839..1dbf59807 100644 --- a/src-ui/src/locale/messages.tr_TR.xlf +++ b/src-ui/src/locale/messages.tr_TR.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Initiating upload... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Uygula @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Öğeleri hariç tutmak için yeniden tıklatın. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Atanmadı @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 "" olan belgeyi gerçekten silmek istiyormusunuz? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Bu belgeye ait dosyalar kalıcı olarak siliniecektir. Bu işlem geri alınamaz. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Belgeyi sil @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 7515d8af644ef2f479a9462ac871bea6b7be0609 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:28 -0700 Subject: [PATCH 031/103] New translations messages.xlf (Chinese Simplified) [ci skip] --- src-ui/src/locale/messages.zh_CN.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.zh_CN.xlf b/src-ui/src/locale/messages.zh_CN.xlf index 8eaf54871..04a7eef9e 100644 --- a/src-ui/src/locale/messages.zh_CN.xlf +++ b/src-ui/src/locale/messages.zh_CN.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 正在初始化上传... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 应用 @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 再次单击以排除项目。 @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned 未分配 @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 您真的想要删除文档 “” 吗? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 此文档的文件将被永久删除。此操作无法撤消。 @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 删除文档 @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ 无法将设置迁移到数据库,请尝试手动保存。 + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From cc9980fc19775a4f3f7b929ac7a34f929e26c795 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:30 -0700 Subject: [PATCH 032/103] New translations messages.xlf (Portuguese, Brazilian) [ci skip] --- src-ui/src/locale/messages.pt_BR.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.pt_BR.xlf b/src-ui/src/locale/messages.pt_BR.xlf index badb52a89..272648546 100644 --- a/src-ui/src/locale/messages.pt_BR.xlf +++ b/src-ui/src/locale/messages.pt_BR.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Iniciando o upload... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Aplicar @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Clique novamente para excluir itens. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Não atribuído @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Olá , bem-vindo(a) ao Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Bem-vindo ao Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx está em execução! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Você está pronto para começar a enviar documentos! Explore os vários recursos deste aplicativo web por conta própria, ou inicie um tour rápido usando o botão abaixo. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Mais detalhes sobre como usar e configurar Paperless-ngx estão sempre disponíveis na documentação. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Obrigado por fazer parte da comunidade Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Iniciar o tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Erro ao recuperar metadados @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Erro ao recuperar sugestões @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Erro ao salvar documento @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Você realmente deseja excluir o documento ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Os arquivos desse documento serão excluídos permanentemente. Essa operação não pode ser revertida. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Excluir documento @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Esta operação irá refazer o OCR permanentemente para este documento. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Não foi possível migrar as configurações para o banco de dados, por favor tente salvar manualmente. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 3a0ada9f46fe682de7c419201ec8ba58702bb5af Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:31 -0700 Subject: [PATCH 033/103] New translations messages.xlf (Indonesian) [ci skip] --- src-ui/src/locale/messages.id_ID.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.id_ID.xlf b/src-ui/src/locale/messages.id_ID.xlf index ee6981b7b..2119d6859 100644 --- a/src-ui/src/locale/messages.id_ID.xlf +++ b/src-ui/src/locale/messages.id_ID.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Mulai mengunggah... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Terjadi kesalahan saat menyimpan setelan pemeriksaan pembaruan. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Terapkan @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Klik lagi untuk mengecualikan barang. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Not assigned @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Halo , selamat datang ke Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Selamat datang ke Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx sedang berjalan! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Anda siap untuk mulai mengunggah dokumen! Jelajahi berbagai fitur aplikasi web ini, atau mulai tur singkat menggunakan tombol di bawah ini. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Detail lebih lanjut tentang cara menggunakan dan mengonfigurasi Paperless-ngx selalu tersedia di dokumentasi. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Terima kasih telah menjadi bagian dalam komunitas Paperless-ngx! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Mulai tur @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Kesalahan saat mendapatkan metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Kesalahan saat menyimpan dokumen @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Apakah Anda yakin ingin menghapus dokumen ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 File untuk dokumen akan dihapus secara permanen. Operasi ini tidak dapat diurungkan. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Hapus dokumen @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Kesalahan saat menghapus dokumen: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Kesalahan menjalankan operasi: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From fc869aa203e66e374d6b3c658959370a8405d7c7 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:32 -0700 Subject: [PATCH 034/103] New translations messages.xlf (Croatian) [ci skip] --- src-ui/src/locale/messages.hr_HR.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.hr_HR.xlf b/src-ui/src/locale/messages.hr_HR.xlf index 50d03724d..5260d2f3e 100644 --- a/src-ui/src/locale/messages.hr_HR.xlf +++ b/src-ui/src/locale/messages.hr_HR.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Pokretanje prijenosa... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Primijeni @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Pritisnite ponovo da biste isključili stavke. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nije dodijeljen @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx is running! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Start the tour @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Do you really want to delete document ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 The files for this document will be deleted permanently. This operation cannot be undone. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Delete document @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 1c64a4f145cf0c98b1fa688274ac98752c77ddd4 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:33 -0700 Subject: [PATCH 035/103] New translations messages.xlf (Luxembourgish) [ci skip] --- src-ui/src/locale/messages.lb_LU.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.lb_LU.xlf b/src-ui/src/locale/messages.lb_LU.xlf index f0e76872a..96676e8fb 100644 --- a/src-ui/src/locale/messages.lb_LU.xlf +++ b/src-ui/src/locale/messages.lb_LU.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Upload fänkt un... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 An error occurred while saving update checking settings. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Applizéieren @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Klickt nach eng Kéier fir Elementer auszeschléissen. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Net zougewisen @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Hello , welcome to Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Welcome to Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx leeft! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Thanks for being a part of the Paperless-ngx community! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Tour starten @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Error retrieving metadata @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Error retrieving suggestions @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Document saved successfully. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Error saving document @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Wëllt Dir d'Dokument "" wierklech läschen? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 D'Fichiere fir dëst Dokument gi permanent geläscht. Dës Operatioun kann net réckgängeg gemaach ginn. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Dokument läschen @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Error deleting document: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 This operation will permanently redo OCR for this document. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Error executing operation: @@ -5857,6 +5857,14 @@ Unable to migrate settings to the database, please try saving manually. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 019c7e2f78de0b4dd8011cd7cc6221aaeff96abe Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 08:04:35 -0700 Subject: [PATCH 036/103] New translations messages.xlf (Serbian (Latin)) [ci skip] --- src-ui/src/locale/messages.sr_CS.xlf | 70 ++++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src-ui/src/locale/messages.sr_CS.xlf b/src-ui/src/locale/messages.sr_CS.xlf index bdee8da95..4fae8a0b1 100644 --- a/src-ui/src/locale/messages.sr_CS.xlf +++ b/src-ui/src/locale/messages.sr_CS.xlf @@ -466,7 +466,7 @@ Initiating upload... src/app/app.component.ts - 288 + 289 Pokretanje otpremanja... @@ -803,7 +803,7 @@ An error occurred while saving settings. src/app/components/app-frame/app-frame.component.ts - 89 + 104 src/app/components/manage/settings/settings.component.ts @@ -815,7 +815,7 @@ An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 222 + 237 Došlo je do greške prilikom čuvanja podešavanja. @@ -1363,7 +1363,7 @@ src/app/components/dashboard/dashboard.component.html - 26 + 27 src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html @@ -2083,7 +2083,7 @@ Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 40 + 42 Primeni @@ -2091,7 +2091,7 @@ Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 46 + 48 Kliknite ponovo da biste isključili stavke. @@ -2099,7 +2099,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 335 + 336 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nije dodeljen @@ -2387,7 +2387,7 @@ Hello , welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 36 + 23 Pozdrav , dobro došao u Paperless-ngx @@ -2395,7 +2395,7 @@ Welcome to Paperless-ngx src/app/components/dashboard/dashboard.component.ts - 38 + 25 Dobro došli u Paperless-ngx @@ -2598,7 +2598,7 @@ Paperless-ngx is running! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 3 + 2 Paperless-ngx je pokrenut! @@ -2606,7 +2606,7 @@ You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 4 + 3 Spremni ste da počnete da otpremate dokumente! Istražite različite funkcije ove veb aplikacije sami ili započnite brzi obilazak koristeći dugme ispod. @@ -2614,7 +2614,7 @@ More detail on how to use and configure Paperless-ngx is always available in the documentation. src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 5 + 4 Više detalja o tome kako da koristite i konfigurišete Paperless-ngx je uvek dostupno u dokumentaciji. @@ -2622,7 +2622,7 @@ Thanks for being a part of the Paperless-ngx community! src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 8 + 7 Hvala što ste deo Paperless-ngx zajednice! @@ -2630,7 +2630,7 @@ Start the tour src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html - 9 + 8 Započni obilazak @@ -2998,7 +2998,7 @@ Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 354 + 369 Greška pri preuzimanju metapodataka @@ -3006,7 +3006,7 @@ Error retrieving suggestions src/app/components/document-detail/document-detail.component.ts - 374 + 389 Greška pri preuzimanju predloga @@ -3014,11 +3014,11 @@ Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 484 + 499 src/app/components/document-detail/document-detail.component.ts - 492 + 507 Dokument je uspešno sačuvan. @@ -3026,11 +3026,11 @@ Error saving document src/app/components/document-detail/document-detail.component.ts - 497 + 512 src/app/components/document-detail/document-detail.component.ts - 542 + 557 Greška prilikom čuvanja dokumenta @@ -3038,7 +3038,7 @@ Confirm delete src/app/components/document-detail/document-detail.component.ts - 571 + 586 src/app/components/manage/management-list/management-list.component.ts @@ -3050,7 +3050,7 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 572 + 587 Da li stvarno želite da obrišite dokument ""? @@ -3058,7 +3058,7 @@ The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 573 + 588 Fajlovi za ovaj dokument će biti trajno obrisani. Ova operacija se ne može opozvati. @@ -3066,7 +3066,7 @@ Delete document src/app/components/document-detail/document-detail.component.ts - 575 + 590 Obriši dokument @@ -3074,7 +3074,7 @@ Error deleting document: src/app/components/document-detail/document-detail.component.ts - 595,597 + 610,612 Greška prilikom brisanja dokumenta: @@ -3082,7 +3082,7 @@ Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 618 + 633 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3094,7 +3094,7 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 619 + 634 Ova će operacija trajno ponoviti OCR za ovaj dokument. @@ -3102,7 +3102,7 @@ This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 620 + 635 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3134,7 +3134,7 @@ Proceed src/app/components/document-detail/document-detail.component.ts - 622 + 637 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3162,7 +3162,7 @@ Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 630 + 645 Ponovna OCR operacija će početi u pozadini. Zatvorite i ponovo otvorite ili ponovo učitajte ovaj dokument nakon što se operacija završi da biste videli novi sadržaj. @@ -3170,7 +3170,7 @@ Error executing operation: src/app/components/document-detail/document-detail.component.ts - 641,643 + 656,658 Greška pri izvršavanju operacije: @@ -5857,6 +5857,14 @@ Nije moguće preneti podešavanja u bazu podataka, pokušajte da ih sačuvate ručno. + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + Information From 487d3a6262da5cab804414b3662de15a948f39ca Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 2 May 2023 00:38:32 -0700 Subject: [PATCH 037/103] Support owner API query vars --- src/documents/filters.py | 4 + src/documents/index.py | 29 +++- ...036_alter_savedviewfilterrule_rule_type.py | 58 ++++++++ src/documents/models.py | 4 + src/documents/tests/test_api.py | 128 ++++++++++++++++++ src/documents/views.py | 1 + 6 files changed, 220 insertions(+), 4 deletions(-) create mode 100644 src/documents/migrations/1036_alter_savedviewfilterrule_rule_type.py diff --git a/src/documents/filters.py b/src/documents/filters.py index 56a490bc0..53ef0391c 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -105,6 +105,8 @@ class DocumentFilterSet(FilterSet): title_content = TitleContentFilter() + owner__id__none = ObjectFilter(field_name="owner", exclude=True) + class Meta: model = Document fields = { @@ -125,6 +127,8 @@ class DocumentFilterSet(FilterSet): "storage_path": ["isnull"], "storage_path__id": ID_KWARGS, "storage_path__name": CHAR_KWARGS, + "owner": ["isnull"], + "owner__id": ID_KWARGS, } diff --git a/src/documents/index.py b/src/documents/index.py index 0b0493514..540bce9d5 100644 --- a/src/documents/index.py +++ b/src/documents/index.py @@ -208,11 +208,13 @@ class DelayedQuery: for document_type_id in v.split(","): criterias.append(query.Not(query.Term("type_id", document_type_id))) elif k == "correspondent__isnull": - criterias.append(query.Term("has_correspondent", v == "false")) + criterias.append( + query.Term("has_correspondent", self.evalBoolean(v)), + ) elif k == "is_tagged": - criterias.append(query.Term("has_tag", v == "true")) + criterias.append(query.Term("has_tag", self.evalBoolean(v))) elif k == "document_type__isnull": - criterias.append(query.Term("has_type", v == "false")) + criterias.append(query.Term("has_type", self.evalBoolean(v) is False)) elif k == "created__date__lt": criterias.append( query.DateRange("created", start=None, end=isoparse(v)), @@ -236,7 +238,19 @@ class DelayedQuery: for storage_path_id in v.split(","): criterias.append(query.Not(query.Term("path_id", storage_path_id))) elif k == "storage_path__isnull": - criterias.append(query.Term("has_path", v == "false")) + criterias.append(query.Term("has_path", self.evalBoolean(v) is False)) + elif k == "owner__isnull": + criterias.append(query.Term("has_owner", self.evalBoolean(v) is False)) + elif k == "owner__id": + criterias.append(query.Term("owner_id", v)) + elif k == "owner__id__in": + owners_in = [] + for owner_id in v.split(","): + owners_in.append(query.Term("owner_id", owner_id)) + criterias.append(query.Or(owners_in)) + elif k == "owner__id__none": + for owner_id in v.split(","): + criterias.append(query.Not(query.Term("owner_id", owner_id))) user_criterias = [query.Term("has_owner", False)] if "user" in self.query_params: @@ -254,6 +268,12 @@ class DelayedQuery: else: return query.Or(user_criterias) if len(user_criterias) > 0 else None + def evalBoolean(self, val): + if val == "false" or val == "0": + return False + if val == "true" or val == "1": + return True + def _get_query_sortedby(self): if "ordering" not in self.query_params: return None, False @@ -269,6 +289,7 @@ class DelayedQuery: "document_type__name": "type", "archive_serial_number": "asn", "num_notes": "num_notes", + "owner": "owner", } if field.startswith("-"): diff --git a/src/documents/migrations/1036_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1036_alter_savedviewfilterrule_rule_type.py new file mode 100644 index 000000000..e65586ad8 --- /dev/null +++ b/src/documents/migrations/1036_alter_savedviewfilterrule_rule_type.py @@ -0,0 +1,58 @@ +# Generated by Django 4.1.7 on 2023-05-04 04:11 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "1035_rename_comment_note"), + ] + + operations = [ + migrations.AlterField( + model_name="savedviewfilterrule", + name="rule_type", + field=models.PositiveIntegerField( + choices=[ + (0, "title contains"), + (1, "content contains"), + (2, "ASN is"), + (3, "correspondent is"), + (4, "document type is"), + (5, "is in inbox"), + (6, "has tag"), + (7, "has any tag"), + (8, "created before"), + (9, "created after"), + (10, "created year is"), + (11, "created month is"), + (12, "created day is"), + (13, "added before"), + (14, "added after"), + (15, "modified before"), + (16, "modified after"), + (17, "does not have tag"), + (18, "does not have ASN"), + (19, "title or content contains"), + (20, "fulltext query"), + (21, "more like this"), + (22, "has tags in"), + (23, "ASN greater than"), + (24, "ASN less than"), + (25, "storage path is"), + (26, "has correspondent in"), + (27, "does not have correspondent in"), + (28, "has document type in"), + (29, "does not have document type in"), + (30, "has storage path in"), + (31, "does not have storage path in"), + (32, "owner is"), + (33, "has owner in"), + (34, "does not have owner"), + (35, "does not have owner in"), + ], + verbose_name="rule type", + ), + ), + ] diff --git a/src/documents/models.py b/src/documents/models.py index d28664a68..e3f14a8b2 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -448,6 +448,10 @@ class SavedViewFilterRule(models.Model): (29, _("does not have document type in")), (30, _("has storage path in")), (31, _("does not have storage path in")), + (32, _("owner is")), + (33, _("has owner in")), + (34, _("does not have owner")), + (35, _("does not have owner in")), ] saved_view = models.ForeignKey( diff --git a/src/documents/tests/test_api.py b/src/documents/tests/test_api.py index dd872fe78..416a0adfd 100644 --- a/src/documents/tests/test_api.py +++ b/src/documents/tests/test_api.py @@ -469,6 +469,98 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): results = response.data["results"] self.assertEqual(len(results), 0) + def test_document_owner_filters(self): + """ + GIVEN: + - Documents with owners, with and without granted permissions + WHEN: + - User filters by owner + THEN: + - Owner filters work correctly but still respect permissions + """ + u1 = User.objects.create_user("user1") + u2 = User.objects.create_user("user2") + u1.user_permissions.add(*Permission.objects.filter(codename="view_document")) + u2.user_permissions.add(*Permission.objects.filter(codename="view_document")) + + u1_doc1 = Document.objects.create( + title="none1", + checksum="A", + mime_type="application/pdf", + owner=u1, + ) + Document.objects.create( + title="none2", + checksum="B", + mime_type="application/pdf", + owner=u2, + ) + u0_doc1 = Document.objects.create( + title="none3", + checksum="C", + mime_type="application/pdf", + ) + u1_doc2 = Document.objects.create( + title="none4", + checksum="D", + mime_type="application/pdf", + owner=u1, + ) + u2_doc2 = Document.objects.create( + title="none5", + checksum="E", + mime_type="application/pdf", + owner=u2, + ) + + self.client.force_authenticate(user=u1) + assign_perm("view_document", u1, u2_doc2) + + # Will not show any u1 docs or u2_doc1 which isn't shared + response = self.client.get(f"/api/documents/?owner__id__none={u1.id}") + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertEqual(len(results), 2) + self.assertCountEqual( + [results[0]["id"], results[1]["id"]], + [u0_doc1.id, u2_doc2.id], + ) + + # Will not show any u1 docs, u0_doc1 which has no owner or u2_doc1 which isn't shared + response = self.client.get( + f"/api/documents/?owner__id__none={u1.id}&owner__isnull=false", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertEqual(len(results), 1) + self.assertCountEqual([results[0]["id"]], [u2_doc2.id]) + + # Will not show any u1 docs, u2_doc2 which is shared but has owner + response = self.client.get( + f"/api/documents/?owner__id__none={u1.id}&owner__isnull=true", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertEqual(len(results), 1) + self.assertCountEqual([results[0]["id"]], [u0_doc1.id]) + + # Will not show any u1 docs or u2_doc1 which is not shared + response = self.client.get(f"/api/documents/?owner__id={u2.id}") + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertEqual(len(results), 1) + self.assertCountEqual([results[0]["id"]], [u2_doc2.id]) + + # Will not show u2_doc1 which is not shared + response = self.client.get(f"/api/documents/?owner__id__in={u1.id},{u2.id}") + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertEqual(len(results), 3) + self.assertCountEqual( + [results[0]["id"], results[1]["id"], results[2]["id"]], + [u1_doc1.id, u1_doc2.id, u2_doc2.id], + ) + def test_search(self): d1 = Document.objects.create( title="invoice", @@ -1112,18 +1204,30 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): self.assertEqual(r.data["count"], 2) r = self.client.get("/api/documents/?query=test&document_type__id__none=1") self.assertEqual(r.data["count"], 2) + r = self.client.get(f"/api/documents/?query=test&owner__id__none={u1.id}") + self.assertEqual(r.data["count"], 1) + r = self.client.get(f"/api/documents/?query=test&owner__id__in={u1.id}") + self.assertEqual(r.data["count"], 1) + r = self.client.get( + f"/api/documents/?query=test&owner__id__none={u1.id}&owner__isnull=true", + ) + self.assertEqual(r.data["count"], 1) self.client.force_authenticate(user=u2) r = self.client.get("/api/documents/?query=test") self.assertEqual(r.data["count"], 3) r = self.client.get("/api/documents/?query=test&document_type__id__none=1") self.assertEqual(r.data["count"], 3) + r = self.client.get(f"/api/documents/?query=test&owner__id__none={u2.id}") + self.assertEqual(r.data["count"], 1) self.client.force_authenticate(user=superuser) r = self.client.get("/api/documents/?query=test") self.assertEqual(r.data["count"], 4) r = self.client.get("/api/documents/?query=test&document_type__id__none=1") self.assertEqual(r.data["count"], 4) + r = self.client.get(f"/api/documents/?query=test&owner__id__none={u1.id}") + self.assertEqual(r.data["count"], 3) def test_search_filtering_with_object_perms(self): """ @@ -1153,6 +1257,14 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): self.assertEqual(r.data["count"], 2) r = self.client.get("/api/documents/?query=test&document_type__id__none=1") self.assertEqual(r.data["count"], 2) + r = self.client.get(f"/api/documents/?query=test&owner__id__none={u1.id}") + self.assertEqual(r.data["count"], 1) + r = self.client.get(f"/api/documents/?query=test&owner__id={u1.id}") + self.assertEqual(r.data["count"], 1) + r = self.client.get(f"/api/documents/?query=test&owner__id__in={u1.id}") + self.assertEqual(r.data["count"], 1) + r = self.client.get("/api/documents/?query=test&owner__isnull=true") + self.assertEqual(r.data["count"], 1) assign_perm("view_document", u1, d2) assign_perm("view_document", u1, d3) @@ -1166,6 +1278,14 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): self.assertEqual(r.data["count"], 4) r = self.client.get("/api/documents/?query=test&document_type__id__none=1") self.assertEqual(r.data["count"], 4) + r = self.client.get(f"/api/documents/?query=test&owner__id__none={u1.id}") + self.assertEqual(r.data["count"], 3) + r = self.client.get(f"/api/documents/?query=test&owner__id={u1.id}") + self.assertEqual(r.data["count"], 1) + r = self.client.get(f"/api/documents/?query=test&owner__id__in={u1.id}") + self.assertEqual(r.data["count"], 1) + r = self.client.get("/api/documents/?query=test&owner__isnull=true") + self.assertEqual(r.data["count"], 1) def test_search_sorting(self): u1 = User.objects.create_user("user1") @@ -1247,6 +1367,14 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): search_query("&ordering=-num_notes"), [d1.id, d3.id, d2.id], ) + self.assertListEqual( + search_query("&ordering=owner"), + [d1.id, d2.id, d3.id], + ) + self.assertListEqual( + search_query("&ordering=-owner"), + [d3.id, d2.id, d1.id], + ) def test_statistics(self): doc1 = Document.objects.create( diff --git a/src/documents/views.py b/src/documents/views.py index bfe2b3e6f..e859571f2 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -264,6 +264,7 @@ class DocumentViewSet( "added", "archive_serial_number", "num_notes", + "owner", ) def get_queryset(self): From c2b5451fe42b5b848abd3d109acb5f60152758e5 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 2 May 2023 20:41:41 -0700 Subject: [PATCH 038/103] Add frontend owner filtering Add owner to doc cards, table Frontend testing for owner filtering --- .../e2e/documents/documents-list.cy.ts | 2 +- .../cypress/e2e/documents/query-params.cy.ts | 68 +++++++-- .../cypress/fixtures/documents/documents.json | 58 ++++++++ src-ui/src/app/app.module.ts | 9 +- .../date-dropdown.component.html | 2 +- ...permissions-filter-dropdown.component.html | 81 +++++++++++ ...permissions-filter-dropdown.component.scss | 8 ++ .../permissions-filter-dropdown.component.ts | 132 ++++++++++++++++++ .../document-card-large.component.html | 6 + .../document-card-large.component.ts | 2 +- .../document-card-small.component.html | 31 ++-- .../document-card-small.component.ts | 2 +- .../document-list.component.html | 10 ++ .../filter-editor.component.html | 10 +- .../filter-editor/filter-editor.component.ts | 87 +++++++++++- src-ui/src/app/data/filter-rule-type.ts | 29 ++++ src-ui/src/app/pipes/username.pipe.ts | 42 ++++++ .../src/app/services/rest/document.service.ts | 1 + 18 files changed, 549 insertions(+), 31 deletions(-) create mode 100644 src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html create mode 100644 src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.scss create mode 100644 src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.ts create mode 100644 src-ui/src/app/pipes/username.pipe.ts diff --git a/src-ui/cypress/e2e/documents/documents-list.cy.ts b/src-ui/cypress/e2e/documents/documents-list.cy.ts index 5c17ef5d9..847d038b8 100644 --- a/src-ui/cypress/e2e/documents/documents-list.cy.ts +++ b/src-ui/cypress/e2e/documents/documents-list.cy.ts @@ -150,7 +150,7 @@ describe('documents-list', () => { cy.contains('button', 'Corresp 11').click() cy.contains('label', 'Exclude').click() }) - cy.contains('One document') + cy.contains('3 documents') }) it('should apply tags', () => { diff --git a/src-ui/cypress/e2e/documents/query-params.cy.ts b/src-ui/cypress/e2e/documents/query-params.cy.ts index eb160e9de..78a85d185 100644 --- a/src-ui/cypress/e2e/documents/query-params.cy.ts +++ b/src-ui/cypress/e2e/documents/query-params.cy.ts @@ -190,6 +190,36 @@ describe('documents query params', () => { response.count = response.results.length } + if (req.query.hasOwnProperty('owner__id')) { + response.results = ( + documentsJson.results as Array + ).filter((d) => d.owner == req.query['owner__id']) + response.count = response.results.length + } else if (req.query.hasOwnProperty('owner__id__in')) { + const owners = req.query['owner__id__in'] + .toString() + .split(',') + .map((o) => parseInt(o)) + response.results = ( + documentsJson.results as Array + ).filter((d) => owners.includes(d.owner)) + response.count = response.results.length + } else if (req.query.hasOwnProperty('owner__id__none')) { + const owners = req.query['owner__id__none'] + .toString() + .split(',') + .map((o) => parseInt(o)) + response.results = ( + documentsJson.results as Array + ).filter((d) => !owners.includes(d.owner)) + response.count = response.results.length + } else if (req.query.hasOwnProperty('owner__isnull')) { + response.results = ( + documentsJson.results as Array + ).filter((d) => d.owner === null) + response.count = response.results.length + } + req.reply(response) }) }) @@ -202,7 +232,7 @@ describe('documents query params', () => { it('should show a list of documents reverse sorted by created', () => { cy.visit('/documents?sort=created&reverse=true') - cy.get('app-document-card-small').first().contains('sit amet') + cy.get('app-document-card-small').first().contains('Doc 6') }) it('should show a list of documents sorted by added', () => { @@ -212,7 +242,7 @@ describe('documents query params', () => { it('should show a list of documents reverse sorted by added', () => { cy.visit('/documents?sort=added&reverse=true') - cy.get('app-document-card-small').first().contains('sit amet') + cy.get('app-document-card-small').first().contains('Doc 6') }) it('should show a list of documents filtered by any tags', () => { @@ -222,12 +252,12 @@ describe('documents query params', () => { it('should show a list of documents filtered by excluded tags', () => { cy.visit('/documents?sort=created&reverse=true&tags__id__none=2,4') - cy.contains('One document') + cy.contains('3 documents') }) it('should show a list of documents filtered by no tags', () => { cy.visit('/documents?sort=created&reverse=true&is_tagged=0') - cy.contains('One document') + cy.contains('3 documents') }) it('should show a list of documents filtered by document type', () => { @@ -242,7 +272,7 @@ describe('documents query params', () => { it('should show a list of documents filtered by no document type', () => { cy.visit('/documents?sort=created&reverse=true&document_type__isnull=1') - cy.contains('One document') + cy.contains('3 documents') }) it('should show a list of documents filtered by correspondent', () => { @@ -257,7 +287,7 @@ describe('documents query params', () => { it('should show a list of documents filtered by no correspondent', () => { cy.visit('/documents?sort=created&reverse=true&correspondent__isnull=1') - cy.contains('One document') + cy.contains('3 documents') }) it('should show a list of documents filtered by storage path', () => { @@ -267,7 +297,7 @@ describe('documents query params', () => { it('should show a list of documents filtered by no storage path', () => { cy.visit('/documents?sort=created&reverse=true&storage_path__isnull=1') - cy.contains('3 documents') + cy.contains('5 documents') }) it('should show a list of documents filtered by title or content', () => { @@ -312,7 +342,7 @@ describe('documents query params', () => { cy.visit( '/documents?sort=created&reverse=true&created__date__gt=2022-03-23' ) - cy.contains('3 documents') + cy.contains('5 documents') }) it('should show a list of documents filtered by created date less than', () => { @@ -324,7 +354,7 @@ describe('documents query params', () => { it('should show a list of documents filtered by added date greater than', () => { cy.visit('/documents?sort=created&reverse=true&added__date__gt=2022-03-24') - cy.contains('2 documents') + cy.contains('4 documents') }) it('should show a list of documents filtered by added date less than', () => { @@ -338,4 +368,24 @@ describe('documents query params', () => { ) cy.contains('2 documents') }) + + it('should show a list of documents filtered by owner', () => { + cy.visit('/documents?owner__id=15') + cy.contains('One document') + }) + + it('should show a list of documents filtered by multiple owners', () => { + cy.visit('/documents?owner__id__in=6,15') + cy.contains('2 documents') + }) + + it('should show a list of documents filtered by excluded owners', () => { + cy.visit('/documents?owner__id__none=6') + cy.contains('5 documents') + }) + + it('should show a list of documents filtered by null owner', () => { + cy.visit('/documents?owner__isnull=true') + cy.contains('4 documents') + }) }) diff --git a/src-ui/cypress/fixtures/documents/documents.json b/src-ui/cypress/fixtures/documents/documents.json index 6b284f7b2..a33e4e43f 100644 --- a/src-ui/cypress/fixtures/documents/documents.json +++ b/src-ui/cypress/fixtures/documents/documents.json @@ -143,6 +143,64 @@ } }, "notes": [] + }, + { + "id": 5, + "correspondent": null, + "document_type": null, + "storage_path": null, + "title": "Doc 5", + "content": "Test document 5", + "tags": [], + "created": "2023-05-01T07:24:18Z", + "created_date": "2023-05-02", + "modified": "2023-05-02T07:24:23.264859Z", + "added": "2023-05-02T07:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "doc5.pdf", + "archived_file_name": "doc5.pdf", + "owner": 15, + "user_can_change": true, + "permissions": { + "view": { + "users": [1], + "groups": [] + }, + "change": { + "users": [], + "groups": [] + } + }, + "notes": [] + }, + { + "id": 6, + "correspondent": null, + "document_type": null, + "storage_path": null, + "title": "Doc 6", + "content": "Test document 6", + "tags": [], + "created": "2023-05-01T10:24:18Z", + "created_date": "2023-05-02", + "modified": "2023-05-02T10:24:23.264859Z", + "added": "2023-05-02T10:24:22.922631Z", + "archive_serial_number": null, + "original_file_name": "doc6.pdf", + "archived_file_name": "doc6.pdf", + "owner": 6, + "user_can_change": true, + "permissions": { + "view": { + "users": [1], + "groups": [] + }, + "change": { + "users": [], + "groups": [] + } + }, + "notes": [] } ] } diff --git a/src-ui/src/app/app.module.ts b/src-ui/src/app/app.module.ts index ed847d41a..6c6d13f6c 100644 --- a/src-ui/src/app/app.module.ts +++ b/src-ui/src/app/app.module.ts @@ -88,6 +88,10 @@ import { PermissionsUserComponent } from './components/common/input/permissions/ import { PermissionsGroupComponent } from './components/common/input/permissions/permissions-group/permissions-group.component' import { IfOwnerDirective } from './directives/if-owner.directive' import { IfObjectPermissionsDirective } from './directives/if-object-permissions.directive' +import { PermissionsDialogComponent } from './components/common/permissions-dialog/permissions-dialog.component' +import { PermissionsFormComponent } from './components/common/input/permissions/permissions-form/permissions-form.component' +import { PermissionsFilterDropdownComponent } from './components/common/permissions-filter-dropdown/permissions-filter-dropdown.component' +import { UsernamePipe } from './pipes/username.pipe' import localeAr from '@angular/common/locales/ar' import localeBe from '@angular/common/locales/be' @@ -111,8 +115,6 @@ import localeSr from '@angular/common/locales/sr' import localeSv from '@angular/common/locales/sv' import localeTr from '@angular/common/locales/tr' import localeZh from '@angular/common/locales/zh' -import { PermissionsDialogComponent } from './components/common/permissions-dialog/permissions-dialog.component' -import { PermissionsFormComponent } from './components/common/input/permissions/permissions-form/permissions-form.component' registerLocaleData(localeAr) registerLocaleData(localeBe) @@ -213,6 +215,8 @@ function initializeApp(settings: SettingsService) { IfObjectPermissionsDirective, PermissionsDialogComponent, PermissionsFormComponent, + PermissionsFilterDropdownComponent, + UsernamePipe, ], imports: [ BrowserModule, @@ -253,6 +257,7 @@ function initializeApp(settings: SettingsService) { PermissionsGuard, DirtyDocGuard, DirtySavedViewGuard, + UsernamePipe, ], bootstrap: [AppComponent], }) diff --git a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html index 58634b4d0..40bce985d 100644 --- a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html +++ b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html @@ -6,7 +6,7 @@ +
+ + {{document.owner | username}} +
Score: diff --git a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.ts b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.ts index 58a3dd4e4..d2153fb62 100644 --- a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.ts +++ b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.ts @@ -23,7 +23,7 @@ import { ComponentWithPermissions } from '../../with-permissions/with-permission export class DocumentCardLargeComponent extends ComponentWithPermissions { constructor( private documentService: DocumentService, - private settingsService: SettingsService + public settingsService: SettingsService ) { super() } diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html index 7365fec36..f61d586c8 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html @@ -38,15 +38,15 @@
@@ -59,18 +59,23 @@
- {{document.created_date | customDate:'mediumDate'}}
-
- - #{{document.archive_serial_number}} -
+
+
+ + #{{document.archive_serial_number}} +
+
+ + {{document.owner | username}}
diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts index fcec51ebf..62f44851e 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts @@ -24,7 +24,7 @@ import { ComponentWithPermissions } from '../../with-permissions/with-permission export class DocumentCardSmallComponent extends ComponentWithPermissions { constructor( private documentService: DocumentService, - private settingsService: SettingsService + public settingsService: SettingsService ) { super() } diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index 0b7b06dbc..c0fba9325 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -142,6 +142,13 @@ [currentSortReverse]="list.sortReverse" (sort)="onSort($event)" i18n>Title + Owner {{d.title | documentTitle}} + + {{d.owner | username}} + diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html index 4e7851a57..e83688596 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html @@ -58,20 +58,26 @@ [documentCounts]="storagePathDocumentCounts" [allowSelectNone]="true">
-
+
-
+
+ +
diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index 10048f7d7..37a58c54c 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -43,6 +43,10 @@ import { FILTER_DOCUMENT_TYPE, FILTER_CORRESPONDENT, FILTER_STORAGE_PATH, + FILTER_OWNER, + FILTER_OWNER_DOES_NOT_INCLUDE, + FILTER_OWNER_ISNULL, + FILTER_OWNER_ANY, } from 'src/app/data/filter-rule-type' import { FilterableDropdownSelectionModel, @@ -59,6 +63,11 @@ import { PaperlessDocument } from 'src/app/data/paperless-document' import { PaperlessStoragePath } from 'src/app/data/paperless-storage-path' import { StoragePathService } from 'src/app/services/rest/storage-path.service' import { RelativeDate } from '../../common/date-dropdown/date-dropdown.component' +import { + OwnerFilterType, + PermissionsSelectionModel, +} from '../../common/permissions-filter-dropdown/permissions-filter-dropdown.component' +import { SettingsService } from 'src/app/services/settings.service' const TEXT_FILTER_TARGET_TITLE = 'title' const TEXT_FILTER_TARGET_TITLE_CONTENT = 'title-content' @@ -136,6 +145,15 @@ export class FilterEditorComponent implements OnInit, OnDestroy { case FILTER_ASN: return $localize`ASN: ${rule.value}` + + case FILTER_OWNER: + return $localize`Owner: ${rule.value}` + + case FILTER_OWNER_DOES_NOT_INCLUDE: + return $localize`Owner not in: ${rule.value}` + + case FILTER_OWNER_ISNULL: + return $localize`Without an owner` } } @@ -147,7 +165,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy { private tagService: TagService, private correspondentService: CorrespondentService, private documentService: DocumentService, - private storagePathService: StoragePathService + private storagePathService: StoragePathService, + private settingsService: SettingsService ) {} @ViewChild('textFilterInput') @@ -241,6 +260,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy { dateCreatedRelativeDate: RelativeDate dateAddedRelativeDate: RelativeDate + permissionsSelectionModel = new PermissionsSelectionModel() + _unmodifiedFilterRules: FilterRule[] = [] _filterRules: FilterRule[] = [] @@ -274,6 +295,7 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.dateCreatedRelativeDate = null this.dateAddedRelativeDate = null this.textFilterModifier = TEXT_FILTER_MODIFIER_EQUALS + this.permissionsSelectionModel.clear() value.forEach((rule) => { switch (rule.rule_type) { @@ -441,6 +463,35 @@ export class FilterEditorComponent implements OnInit, OnDestroy { this.textFilterModifier = TEXT_FILTER_MODIFIER_LT this._textFilter = rule.value break + case FILTER_OWNER: + this.permissionsSelectionModel.ownerFilter = OwnerFilterType.SELF + this.permissionsSelectionModel.hideUnowned = false + if (rule.value) + this.permissionsSelectionModel.userID = parseInt(rule.value, 10) + break + case FILTER_OWNER_ANY: + this.permissionsSelectionModel.ownerFilter = OwnerFilterType.OTHERS + if (rule.value) + this.permissionsSelectionModel.includeUsers.push( + parseInt(rule.value, 10) + ) + break + case FILTER_OWNER_DOES_NOT_INCLUDE: + this.permissionsSelectionModel.ownerFilter = OwnerFilterType.NOT_SELF + if (rule.value) + this.permissionsSelectionModel.excludeUsers.push( + parseInt(rule.value, 10) + ) + break + case FILTER_OWNER_ISNULL: + if (rule.value === 'true' || rule.value === '1') { + this.permissionsSelectionModel.hideUnowned = false + this.permissionsSelectionModel.ownerFilter = OwnerFilterType.UNOWNED + } else { + this.permissionsSelectionModel.hideUnowned = + rule.value === 'false' || rule.value === '0' + break + } } }) this.rulesModified = filterRulesDiffer( @@ -702,6 +753,40 @@ export class FilterEditorComponent implements OnInit, OnDestroy { } } } + if (this.permissionsSelectionModel.ownerFilter == OwnerFilterType.SELF) { + filterRules.push({ + rule_type: FILTER_OWNER, + value: this.permissionsSelectionModel.userID.toString(), + }) + } else if ( + this.permissionsSelectionModel.ownerFilter == OwnerFilterType.NOT_SELF + ) { + filterRules.push({ + rule_type: FILTER_OWNER_DOES_NOT_INCLUDE, + value: this.permissionsSelectionModel.excludeUsers?.join(','), + }) + } else if ( + this.permissionsSelectionModel.ownerFilter == OwnerFilterType.OTHERS + ) { + filterRules.push({ + rule_type: FILTER_OWNER_ANY, + value: this.permissionsSelectionModel.includeUsers?.join(','), + }) + } else if ( + this.permissionsSelectionModel.ownerFilter == OwnerFilterType.UNOWNED + ) { + filterRules.push({ + rule_type: FILTER_OWNER_ISNULL, + value: 'true', + }) + } + + if (this.permissionsSelectionModel.hideUnowned) { + filterRules.push({ + rule_type: FILTER_OWNER_ISNULL, + value: 'false', + }) + } return filterRules } diff --git a/src-ui/src/app/data/filter-rule-type.ts b/src-ui/src/app/data/filter-rule-type.ts index 50b80b13b..f65f52fd2 100644 --- a/src-ui/src/app/data/filter-rule-type.ts +++ b/src-ui/src/app/data/filter-rule-type.ts @@ -41,6 +41,11 @@ export const FILTER_TITLE_CONTENT = 19 export const FILTER_FULLTEXT_QUERY = 20 export const FILTER_FULLTEXT_MORELIKE = 21 +export const FILTER_OWNER = 32 +export const FILTER_OWNER_ANY = 33 +export const FILTER_OWNER_ISNULL = 34 +export const FILTER_OWNER_DOES_NOT_INCLUDE = 35 + export const FILTER_RULE_TYPES: FilterRuleType[] = [ { id: FILTER_TITLE, @@ -242,6 +247,30 @@ export const FILTER_RULE_TYPES: FilterRuleType[] = [ datatype: 'number', multi: false, }, + { + id: FILTER_OWNER, + filtervar: 'owner__id', + datatype: 'number', + multi: false, + }, + { + id: FILTER_OWNER_ANY, + filtervar: 'owner__id__in', + datatype: 'number', + multi: true, + }, + { + id: FILTER_OWNER_ISNULL, + filtervar: 'owner__isnull', + datatype: 'boolean', + multi: false, + }, + { + id: FILTER_OWNER_DOES_NOT_INCLUDE, + filtervar: 'owner__id__none', + datatype: 'number', + multi: true, + }, ] export interface FilterRuleType { diff --git a/src-ui/src/app/pipes/username.pipe.ts b/src-ui/src/app/pipes/username.pipe.ts new file mode 100644 index 000000000..79d2657a2 --- /dev/null +++ b/src-ui/src/app/pipes/username.pipe.ts @@ -0,0 +1,42 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { UserService } from '../services/rest/user.service' +import { + PermissionAction, + PermissionType, + PermissionsService, +} from '../services/permissions.service' +import { PaperlessUser } from '../data/paperless-user' + +@Pipe({ + name: 'username', +}) +export class UsernamePipe implements PipeTransform { + users: PaperlessUser[] + + constructor( + permissionsService: PermissionsService, + userService: UserService + ) { + if ( + permissionsService.currentUserCan( + PermissionAction.View, + PermissionType.User + ) + ) { + userService.listAll().subscribe((r) => (this.users = r.results)) + } + } + + transform(userID: number): string { + return this.users + ? this.getName(this.users.find((u) => u.id === userID)) ?? '' + : $localize`Shared` + } + + getName(user: PaperlessUser): string { + if (!user) return '' + const name = [user.first_name, user.last_name].join(' ') + if (name.length > 1) return name.trim() + return user.username + } +} diff --git a/src-ui/src/app/services/rest/document.service.ts b/src-ui/src/app/services/rest/document.service.ts index 4ff2ee88f..08050ac85 100644 --- a/src-ui/src/app/services/rest/document.service.ts +++ b/src-ui/src/app/services/rest/document.service.ts @@ -23,6 +23,7 @@ export const DOCUMENT_SORT_FIELDS = [ { field: 'added', name: $localize`Added` }, { field: 'modified', name: $localize`Modified` }, { field: 'num_notes', name: $localize`Notes` }, + { field: 'owner', name: $localize`Owner` }, ] export const DOCUMENT_SORT_FIELDS_FULLTEXT = [ From 8b8d988c073f214ba6bba448f1c8e8fa45128e56 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 23:51:58 -0700 Subject: [PATCH 039/103] New translations messages.xlf (Catalan) [ci skip] --- src-ui/src/locale/messages.ca_ES.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/src/locale/messages.ca_ES.xlf b/src-ui/src/locale/messages.ca_ES.xlf index 6c08efe8a..6050853e1 100644 --- a/src-ui/src/locale/messages.ca_ES.xlf +++ b/src-ui/src/locale/messages.ca_ES.xlf @@ -5863,7 +5863,7 @@ src/app/services/settings.service.ts 500
- You can restart the tour from the settings page. + Pots reiniciar el tour des de les opcions.
Information From fb864f11320b15078739de1e28e191074c107346 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Mon, 8 May 2023 23:51:59 -0700 Subject: [PATCH 040/103] New translations messages.xlf (Slovenian) [ci skip] --- src-ui/src/locale/messages.sl_SI.xlf | 92 ++++++++++++++-------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src-ui/src/locale/messages.sl_SI.xlf b/src-ui/src/locale/messages.sl_SI.xlf index e1a00f01f..25bcc505d 100644 --- a/src-ui/src/locale/messages.sl_SI.xlf +++ b/src-ui/src/locale/messages.sl_SI.xlf @@ -444,7 +444,7 @@ src/app/app.component.ts 229 - Thank you! 🙏 + Hvala! 🙏 There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. @@ -789,7 +789,7 @@ src/app/components/app-frame/app-frame.component.html 224,226 - How does this work? + Kako to deluje? Update available @@ -1257,7 +1257,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.html 81 - Permissions + Dovoljenja Create new user group @@ -1281,7 +1281,7 @@ src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html 11 - IMAP Server + IMAP strežnik IMAP Port @@ -1289,7 +1289,7 @@ src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html 12 - IMAP Port + IMAP vrata IMAP Security @@ -1313,7 +1313,7 @@ src/app/components/manage/settings/settings.component.html 344 - Username + Uporabniško ime Password @@ -1325,7 +1325,7 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 12 - Password + Geslo Password is token @@ -1417,7 +1417,7 @@ src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts 14 - SSL + SSL STARTTLS @@ -1425,7 +1425,7 @@ src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts 15 - STARTTLS + STARTTLS Create new mail account @@ -1457,7 +1457,7 @@ src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts 89 - Unable to connect to the mail server + Povezava s poštnim strežnikom ni mogoča Account @@ -1469,7 +1469,7 @@ src/app/components/manage/settings/settings.component.html 295 - Account + Račun Folder @@ -1477,7 +1477,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 12 - Folder + Mapa Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. @@ -1485,7 +1485,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 12 - Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. + Podmape morajo biti ločene z znakom, običajno je to pika (.) ali poševnica ('/'), vendar je odvisno od poštnega strežnika. Maximum age (days) @@ -1493,7 +1493,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 13 - Maximum age (days) + Maksimalna starost (dni) Attachment type @@ -1501,7 +1501,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 14 - Attachment type + Vrsta priponke Consumption scope @@ -1541,7 +1541,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 20 - Filter from + Filtriraj od Filter to @@ -1549,7 +1549,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 21 - Filter to + Filtriraj za Filter subject @@ -1557,7 +1557,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 22 - Filter subject + Filtriraj zadevo Filter body @@ -1565,7 +1565,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 23 - Filter body + Filtriraj vsebino Filter attachment filename @@ -1573,7 +1573,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 24 - Filter attachment filename + Filtriraj ime priloge Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. @@ -1801,7 +1801,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts 75 - Use subject as title + Uporabite zadevo kot naslov Use attachment filename as title @@ -1809,7 +1809,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts 79 - Use attachment filename as title + Uporabite ime priloge kot naslov Do not assign a correspondent @@ -1961,7 +1961,7 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 11 - Email + E-pošta First name @@ -1969,7 +1969,7 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 13 - First name + Ime Last name @@ -1977,7 +1977,7 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 14 - Last name + Priimek Active @@ -2017,7 +2017,7 @@ src/app/components/manage/settings/settings.component.html 367 - Groups + Skupine Create new user account @@ -2025,7 +2025,7 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts 42 - Create new user account + Ustvari nov uporabniški račun Edit user account @@ -2069,7 +2069,7 @@ src/app/components/common/filterable-dropdown/filterable-dropdown.component.html 24 - Include + Vključi Exclude @@ -2077,7 +2077,7 @@ src/app/components/common/filterable-dropdown/filterable-dropdown.component.html 26 - Exclude + Izvzemi Apply @@ -2287,7 +2287,7 @@ src/app/components/common/tag/tag.component.html 8 - Private + Zasebno Add tag @@ -2303,7 +2303,7 @@ src/app/components/common/permissions-dialog/permissions-dialog.component.ts 26 - Set Permissions + Nastavi dovoljenja Note that permissions set here will override any existing permissions @@ -2327,7 +2327,7 @@ src/app/components/common/permissions-select/permissions-select.component.html 7 - Add + Dodaj Change @@ -2357,7 +2357,7 @@ src/app/components/common/permissions-select/permissions-select.component.ts 62 - Inherited from group + Podedovano od skupine Select @@ -2389,7 +2389,7 @@ src/app/components/dashboard/dashboard.component.ts 23 - Hello , welcome to Paperless-ngx + Pozdravljeni , dobrodošli v Paperless-ngx Welcome to Paperless-ngx @@ -2497,7 +2497,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 9 - Total documents + Skupaj dokumentov Total characters @@ -2505,7 +2505,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 13 - Total characters + Skupaj znakov Other @@ -2513,7 +2513,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.ts 55 - Other + Ostalo Upload new documents @@ -2948,7 +2948,7 @@ src/app/components/document-detail/document-detail.component.html 151 - Preview + Predogled Enter Password @@ -4570,7 +4570,7 @@ src/app/components/manage/settings/settings.component.html 135 - Update checking + Preverjanje za posodobitve Update checking works by pinging the public Github API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. @@ -4594,7 +4594,7 @@ src/app/components/manage/settings/settings.component.html 146 - Enable update checking + Vključi preverjanje za posodobitve Note that for users of third-party containers e.g. linuxserver.io this notification may be 'ahead' of the current third-party release. @@ -4730,7 +4730,7 @@ src/app/components/manage/settings/settings.component.html 240,239 - Mail + Pošta Mail accounts @@ -4738,7 +4738,7 @@ src/app/components/manage/settings/settings.component.html 245 - Mail accounts + Poštni računi Add Account @@ -4754,7 +4754,7 @@ src/app/components/manage/settings/settings.component.html 258 - Server + Strežnik No mail accounts defined. @@ -4810,7 +4810,7 @@ src/app/components/manage/settings/settings.component.html 337 - Add User + Dodaj uporabnika Add Group @@ -4818,7 +4818,7 @@ src/app/components/manage/settings/settings.component.html 372 - Add Group + Dodaj skupino Saved view "" deleted. @@ -4914,7 +4914,7 @@ src/app/components/manage/settings/settings.component.ts 686 - Confirm delete user account + Potrdi izbris uporabniškega računa This operation will permanently delete this user account. From eb1cc55f944886d90cb4493788d7dfbbec2fc8b9 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Tue, 9 May 2023 02:31:20 -0700 Subject: [PATCH 041/103] New translations messages.xlf (German) [ci skip] --- src-ui/src/locale/messages.de_DE.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/src/locale/messages.de_DE.xlf b/src-ui/src/locale/messages.de_DE.xlf index 42a4dadc5..9a8d09c16 100644 --- a/src-ui/src/locale/messages.de_DE.xlf +++ b/src-ui/src/locale/messages.de_DE.xlf @@ -5863,7 +5863,7 @@ src/app/services/settings.service.ts 500 - You can restart the tour from the settings page. + Sie können die Tour in den Einstellungen neu starten. Information From 028f42e7753a41d9af585f123bdf9bf28b3f491e Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Tue, 9 May 2023 03:37:38 -0700 Subject: [PATCH 042/103] New translations django.po (Slovenian) [ci skip] --- src/locale/sl_SI/LC_MESSAGES/django.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/locale/sl_SI/LC_MESSAGES/django.po b/src/locale/sl_SI/LC_MESSAGES/django.po index 9a3e6ec49..0a44d4224 100644 --- a/src/locale/sl_SI/LC_MESSAGES/django.po +++ b/src/locale/sl_SI/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-03-03 19:15+0000\n" -"PO-Revision-Date: 2023-03-03 20:41\n" +"PO-Revision-Date: 2023-05-09 10:37\n" "Last-Translator: \n" "Language-Team: Slovenian\n" "Language: sl_SI\n" @@ -23,7 +23,7 @@ msgstr "Dokumenti" #: documents/models.py:36 msgid "None" -msgstr "" +msgstr "Brez" #: documents/models.py:37 msgid "Any word" @@ -68,7 +68,7 @@ msgstr "brez razlikovanje velikosti črk" #: documents/models.py:71 msgid "owner" -msgstr "" +msgstr "lastnik" #: documents/models.py:81 documents/models.py:136 msgid "correspondent" @@ -192,7 +192,7 @@ msgstr "Trenutno ime arhivske datoteke v shrambi" #: documents/models.py:239 msgid "original filename" -msgstr "" +msgstr "izvirno ime datoteke" #: documents/models.py:245 msgid "The original name of the file when it was uploaded" From 6493f51a29e38d58a3ba53dee5c18796cf2a705f Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Tue, 9 May 2023 05:47:19 -0700 Subject: [PATCH 043/103] New translations messages.xlf (Slovenian) [ci skip] --- src-ui/src/locale/messages.sl_SI.xlf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-ui/src/locale/messages.sl_SI.xlf b/src-ui/src/locale/messages.sl_SI.xlf index 25bcc505d..23e62c193 100644 --- a/src-ui/src/locale/messages.sl_SI.xlf +++ b/src-ui/src/locale/messages.sl_SI.xlf @@ -74,7 +74,7 @@ 13 Currently selected slide number read by screen reader - Slide of + Stran od Hours @@ -352,7 +352,7 @@ src/app/app.component.ts 138 - Prev + Nazaj Next @@ -372,7 +372,7 @@ src/app/app.component.ts 140 - End + Konec The dashboard can be used to show saved views, such as an 'Inbox'. Those settings are found under Settings > Saved Views once you have created some. From 3852a6c5cfe7e452c6b4c0a894f7c3469d45dc65 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Tue, 9 May 2023 05:47:20 -0700 Subject: [PATCH 044/103] New translations django.po (Slovenian) [ci skip] --- src/locale/sl_SI/LC_MESSAGES/django.po | 30 +++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/locale/sl_SI/LC_MESSAGES/django.po b/src/locale/sl_SI/LC_MESSAGES/django.po index 0a44d4224..0e39bb60d 100644 --- a/src/locale/sl_SI/LC_MESSAGES/django.po +++ b/src/locale/sl_SI/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-03-03 19:15+0000\n" -"PO-Revision-Date: 2023-05-09 10:37\n" +"PO-Revision-Date: 2023-05-09 12:47\n" "Last-Translator: \n" "Language-Team: Slovenian\n" "Language: sl_SI\n" @@ -196,7 +196,7 @@ msgstr "izvirno ime datoteke" #: documents/models.py:245 msgid "The original name of the file when it was uploaded" -msgstr "" +msgstr "Izvirno ime datoteke, ko je bila naložena" #: documents/models.py:252 msgid "archive serial number" @@ -380,7 +380,7 @@ msgstr "" #: documents/models.py:439 msgid "storage path is" -msgstr "" +msgstr "pot do shrambe je" #: documents/models.py:449 msgid "rule type" @@ -400,7 +400,7 @@ msgstr "filtriraj pravila" #: documents/models.py:563 msgid "Task ID" -msgstr "" +msgstr "ID opravila" #: documents/models.py:564 msgid "Celery ID for the Task that was run" @@ -408,7 +408,7 @@ msgstr "" #: documents/models.py:569 msgid "Acknowledged" -msgstr "" +msgstr "Potrjeno" #: documents/models.py:570 msgid "If the task is acknowledged via the frontend or API" @@ -424,7 +424,7 @@ msgstr "" #: documents/models.py:583 msgid "Task Name" -msgstr "" +msgstr "Ime opravila" #: documents/models.py:584 msgid "Name of the Task which was run" @@ -432,7 +432,7 @@ msgstr "" #: documents/models.py:591 msgid "Task State" -msgstr "" +msgstr "Status opravila" #: documents/models.py:592 msgid "Current state of the task being run" @@ -480,11 +480,11 @@ msgstr "uporabnik" #: documents/models.py:655 msgid "comment" -msgstr "" +msgstr "komentar" #: documents/models.py:656 msgid "comments" -msgstr "" +msgstr "komentarji" #: documents/serialisers.py:80 #, python-format @@ -562,7 +562,7 @@ msgstr "Angleščina (ZDA)" #: paperless/settings.py:522 msgid "Arabic" -msgstr "" +msgstr "Arabščina" #: paperless/settings.py:523 msgid "Belarusian" @@ -894,21 +894,21 @@ msgstr "dodeli tega dopisnika" #: paperless_mail/models.py:239 msgid "uid" -msgstr "" +msgstr "uid" #: paperless_mail/models.py:247 msgid "subject" -msgstr "" +msgstr "zadeva" #: paperless_mail/models.py:255 msgid "received" -msgstr "" +msgstr "prejeto" #: paperless_mail/models.py:262 msgid "processed" -msgstr "" +msgstr "obdelano" #: paperless_mail/models.py:268 msgid "status" -msgstr "" +msgstr "stanje" From 8dffea4a42021e1e83a1f29e3dacacd0bdf40dc5 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Tue, 9 May 2023 07:15:58 -0700 Subject: [PATCH 045/103] New translations messages.xlf (French) [ci skip] --- src-ui/src/locale/messages.fr_FR.xlf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src-ui/src/locale/messages.fr_FR.xlf b/src-ui/src/locale/messages.fr_FR.xlf index 854854a94..70920f967 100644 --- a/src-ui/src/locale/messages.fr_FR.xlf +++ b/src-ui/src/locale/messages.fr_FR.xlf @@ -5713,13 +5713,13 @@ Espagnol - + Finnish src/app/services/settings.service.ts 213 - Finnish + Finnois French @@ -5857,13 +5857,13 @@ Impossible de migrer les paramètres vers la base de données, veuillez essayer d’enregistrer manuellement. - + You can restart the tour from the settings page. src/app/services/settings.service.ts 500 - You can restart the tour from the settings page. + Vous pouvez recommencer la visite depuis les paramètres. Information From 3a1daf46ae7c4a23176bc90877e2fed681836f41 Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Tue, 9 May 2023 16:56:46 -0700 Subject: [PATCH 046/103] New translations django.po (Hungarian) [ci skip] --- src/locale/hu_HU/LC_MESSAGES/django.po | 680 ++++++++++++++++--------- 1 file changed, 448 insertions(+), 232 deletions(-) diff --git a/src/locale/hu_HU/LC_MESSAGES/django.po b/src/locale/hu_HU/LC_MESSAGES/django.po index 870a35195..433a975d1 100644 --- a/src/locale/hu_HU/LC_MESSAGES/django.po +++ b/src/locale/hu_HU/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: paperless-ng\n" +"Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-05-16 09:38+0000\n" -"PO-Revision-Date: 2021-05-16 10:09\n" +"POT-Creation-Date: 2023-03-03 19:15+0000\n" +"PO-Revision-Date: 2023-05-09 23:56\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Language: hu_HU\n" @@ -11,50 +11,54 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Crowdin-Project: paperless-ng\n" -"X-Crowdin-Project-ID: 434940\n" +"X-Crowdin-Project: paperless-ngx\n" +"X-Crowdin-Project-ID: 500308\n" "X-Crowdin-Language: hu\n" "X-Crowdin-File: /dev/src/locale/en_US/LC_MESSAGES/django.po\n" -"X-Crowdin-File-ID: 54\n" +"X-Crowdin-File-ID: 14\n" -#: documents/apps.py:10 +#: documents/apps.py:9 msgid "Documents" -msgstr "Dokumentumok" - -#: documents/models.py:32 -msgid "Any word" msgstr "" -#: documents/models.py:33 -msgid "All words" -msgstr "" - -#: documents/models.py:34 -msgid "Exact match" -msgstr "" - -#: documents/models.py:35 -msgid "Regular expression" -msgstr "Regexp" - #: documents/models.py:36 -msgid "Fuzzy word" +msgid "None" msgstr "" #: documents/models.py:37 -msgid "Automatic" -msgstr "Automatikus" +msgid "Any word" +msgstr "" -#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25 -#: paperless_mail/models.py:117 +#: documents/models.py:38 +msgid "All words" +msgstr "" + +#: documents/models.py:39 +msgid "Exact match" +msgstr "" + +#: documents/models.py:40 +msgid "Regular expression" +msgstr "" + +#: documents/models.py:41 +msgid "Fuzzy word" +msgstr "" + +#: documents/models.py:42 +msgid "Automatic" +msgstr "" + +#: documents/models.py:45 documents/models.py:394 paperless_mail/models.py:17 +#: paperless_mail/models.py:89 msgid "name" msgstr "" -#: documents/models.py:45 +#: documents/models.py:47 msgid "match" msgstr "" -#: documents/models.py:49 +#: documents/models.py:50 msgid "matching algorithm" msgstr "" @@ -62,637 +66,849 @@ msgstr "" msgid "is insensitive" msgstr "" -#: documents/models.py:74 documents/models.py:120 +#: documents/models.py:71 +msgid "owner" +msgstr "" + +#: documents/models.py:81 documents/models.py:136 msgid "correspondent" msgstr "" -#: documents/models.py:75 +#: documents/models.py:82 msgid "correspondents" msgstr "" -#: documents/models.py:81 +#: documents/models.py:87 msgid "color" msgstr "" -#: documents/models.py:87 +#: documents/models.py:90 msgid "is inbox tag" msgstr "" -#: documents/models.py:89 +#: documents/models.py:93 msgid "Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags." msgstr "" -#: documents/models.py:94 +#: documents/models.py:99 msgid "tag" msgstr "" -#: documents/models.py:95 documents/models.py:151 +#: documents/models.py:100 documents/models.py:174 msgid "tags" msgstr "" -#: documents/models.py:101 documents/models.py:133 +#: documents/models.py:105 documents/models.py:156 msgid "document type" msgstr "" -#: documents/models.py:102 +#: documents/models.py:106 msgid "document types" msgstr "" -#: documents/models.py:110 +#: documents/models.py:111 +msgid "path" +msgstr "" + +#: documents/models.py:117 documents/models.py:145 +msgid "storage path" +msgstr "" + +#: documents/models.py:118 +msgid "storage paths" +msgstr "" + +#: documents/models.py:126 msgid "Unencrypted" msgstr "" -#: documents/models.py:111 +#: documents/models.py:127 msgid "Encrypted with GNU Privacy Guard" msgstr "" -#: documents/models.py:124 +#: documents/models.py:148 msgid "title" msgstr "" -#: documents/models.py:137 +#: documents/models.py:160 documents/models.py:624 msgid "content" msgstr "" -#: documents/models.py:139 +#: documents/models.py:163 msgid "The raw, text-only data of the document. This field is primarily used for searching." msgstr "" -#: documents/models.py:144 +#: documents/models.py:168 msgid "mime type" msgstr "" -#: documents/models.py:155 +#: documents/models.py:178 msgid "checksum" msgstr "" -#: documents/models.py:159 +#: documents/models.py:182 msgid "The checksum of the original document." msgstr "" -#: documents/models.py:163 +#: documents/models.py:186 msgid "archive checksum" msgstr "" -#: documents/models.py:168 +#: documents/models.py:191 msgid "The checksum of the archived document." msgstr "" -#: documents/models.py:172 documents/models.py:328 +#: documents/models.py:194 documents/models.py:376 documents/models.py:630 msgid "created" msgstr "" -#: documents/models.py:176 +#: documents/models.py:197 msgid "modified" msgstr "" -#: documents/models.py:180 +#: documents/models.py:204 msgid "storage type" msgstr "" -#: documents/models.py:188 +#: documents/models.py:212 msgid "added" msgstr "" -#: documents/models.py:192 +#: documents/models.py:219 msgid "filename" msgstr "" -#: documents/models.py:198 +#: documents/models.py:225 msgid "Current filename in storage" msgstr "" -#: documents/models.py:202 +#: documents/models.py:229 msgid "archive filename" msgstr "" -#: documents/models.py:208 +#: documents/models.py:235 msgid "Current archive filename in storage" msgstr "" -#: documents/models.py:212 +#: documents/models.py:239 +msgid "original filename" +msgstr "" + +#: documents/models.py:245 +msgid "The original name of the file when it was uploaded" +msgstr "" + +#: documents/models.py:252 msgid "archive serial number" msgstr "" -#: documents/models.py:217 +#: documents/models.py:262 msgid "The position of this document in your physical document archive." msgstr "" -#: documents/models.py:223 +#: documents/models.py:268 documents/models.py:641 msgid "document" msgstr "" -#: documents/models.py:224 +#: documents/models.py:269 msgid "documents" msgstr "" -#: documents/models.py:311 +#: documents/models.py:359 msgid "debug" msgstr "" -#: documents/models.py:312 +#: documents/models.py:360 msgid "information" msgstr "" -#: documents/models.py:313 +#: documents/models.py:361 msgid "warning" msgstr "" -#: documents/models.py:314 +#: documents/models.py:362 paperless_mail/models.py:276 msgid "error" msgstr "" -#: documents/models.py:315 +#: documents/models.py:363 msgid "critical" msgstr "" -#: documents/models.py:319 +#: documents/models.py:366 msgid "group" msgstr "" -#: documents/models.py:322 +#: documents/models.py:368 msgid "message" msgstr "" -#: documents/models.py:325 +#: documents/models.py:371 msgid "level" msgstr "" -#: documents/models.py:332 +#: documents/models.py:380 msgid "log" msgstr "" -#: documents/models.py:333 +#: documents/models.py:381 msgid "logs" msgstr "" -#: documents/models.py:344 documents/models.py:401 +#: documents/models.py:391 documents/models.py:446 msgid "saved view" msgstr "" -#: documents/models.py:345 +#: documents/models.py:392 msgid "saved views" msgstr "" -#: documents/models.py:348 -msgid "user" -msgstr "" - -#: documents/models.py:354 +#: documents/models.py:397 msgid "show on dashboard" msgstr "" -#: documents/models.py:357 +#: documents/models.py:400 msgid "show in sidebar" msgstr "" -#: documents/models.py:361 +#: documents/models.py:404 msgid "sort field" msgstr "" -#: documents/models.py:367 +#: documents/models.py:409 msgid "sort reverse" msgstr "" -#: documents/models.py:373 +#: documents/models.py:414 msgid "title contains" msgstr "" -#: documents/models.py:374 +#: documents/models.py:415 msgid "content contains" msgstr "" -#: documents/models.py:375 +#: documents/models.py:416 msgid "ASN is" msgstr "" -#: documents/models.py:376 +#: documents/models.py:417 msgid "correspondent is" msgstr "" -#: documents/models.py:377 +#: documents/models.py:418 msgid "document type is" msgstr "" -#: documents/models.py:378 +#: documents/models.py:419 msgid "is in inbox" msgstr "" -#: documents/models.py:379 +#: documents/models.py:420 msgid "has tag" msgstr "" -#: documents/models.py:380 +#: documents/models.py:421 msgid "has any tag" msgstr "" -#: documents/models.py:381 +#: documents/models.py:422 msgid "created before" msgstr "" -#: documents/models.py:382 +#: documents/models.py:423 msgid "created after" msgstr "" -#: documents/models.py:383 +#: documents/models.py:424 msgid "created year is" msgstr "" -#: documents/models.py:384 +#: documents/models.py:425 msgid "created month is" msgstr "" -#: documents/models.py:385 +#: documents/models.py:426 msgid "created day is" msgstr "" -#: documents/models.py:386 +#: documents/models.py:427 msgid "added before" msgstr "" -#: documents/models.py:387 +#: documents/models.py:428 msgid "added after" msgstr "" -#: documents/models.py:388 +#: documents/models.py:429 msgid "modified before" msgstr "" -#: documents/models.py:389 +#: documents/models.py:430 msgid "modified after" msgstr "" -#: documents/models.py:390 +#: documents/models.py:431 msgid "does not have tag" msgstr "" -#: documents/models.py:391 +#: documents/models.py:432 msgid "does not have ASN" msgstr "" -#: documents/models.py:392 +#: documents/models.py:433 msgid "title or content contains" msgstr "" -#: documents/models.py:393 +#: documents/models.py:434 msgid "fulltext query" msgstr "" -#: documents/models.py:394 +#: documents/models.py:435 msgid "more like this" msgstr "" -#: documents/models.py:405 +#: documents/models.py:436 +msgid "has tags in" +msgstr "" + +#: documents/models.py:437 +msgid "ASN greater than" +msgstr "" + +#: documents/models.py:438 +msgid "ASN less than" +msgstr "" + +#: documents/models.py:439 +msgid "storage path is" +msgstr "" + +#: documents/models.py:449 msgid "rule type" msgstr "" -#: documents/models.py:409 +#: documents/models.py:451 msgid "value" msgstr "" -#: documents/models.py:415 +#: documents/models.py:454 msgid "filter rule" msgstr "" -#: documents/models.py:416 +#: documents/models.py:455 msgid "filter rules" msgstr "" -#: documents/serialisers.py:53 +#: documents/models.py:563 +msgid "Task ID" +msgstr "" + +#: documents/models.py:564 +msgid "Celery ID for the Task that was run" +msgstr "" + +#: documents/models.py:569 +msgid "Acknowledged" +msgstr "" + +#: documents/models.py:570 +msgid "If the task is acknowledged via the frontend or API" +msgstr "" + +#: documents/models.py:576 +msgid "Task Filename" +msgstr "" + +#: documents/models.py:577 +msgid "Name of the file which the Task was run for" +msgstr "" + +#: documents/models.py:583 +msgid "Task Name" +msgstr "" + +#: documents/models.py:584 +msgid "Name of the Task which was run" +msgstr "" + +#: documents/models.py:591 +msgid "Task State" +msgstr "" + +#: documents/models.py:592 +msgid "Current state of the task being run" +msgstr "" + +#: documents/models.py:597 +msgid "Created DateTime" +msgstr "" + +#: documents/models.py:598 +msgid "Datetime field when the task result was created in UTC" +msgstr "" + +#: documents/models.py:603 +msgid "Started DateTime" +msgstr "" + +#: documents/models.py:604 +msgid "Datetime field when the task was started in UTC" +msgstr "" + +#: documents/models.py:609 +msgid "Completed DateTime" +msgstr "" + +#: documents/models.py:610 +msgid "Datetime field when the task was completed in UTC" +msgstr "" + +#: documents/models.py:615 +msgid "Result Data" +msgstr "" + +#: documents/models.py:617 +msgid "The data returned by the task" +msgstr "" + +#: documents/models.py:626 +msgid "Comment for the document" +msgstr "" + +#: documents/models.py:650 +msgid "user" +msgstr "" + +#: documents/models.py:655 +msgid "comment" +msgstr "" + +#: documents/models.py:656 +msgid "comments" +msgstr "" + +#: documents/serialisers.py:80 #, python-format msgid "Invalid regular expression: %(error)s" msgstr "" -#: documents/serialisers.py:177 +#: documents/serialisers.py:320 msgid "Invalid color." msgstr "" -#: documents/serialisers.py:451 +#: documents/serialisers.py:700 #, python-format msgid "File type %(type)s not supported" msgstr "" -#: documents/templates/index.html:22 -msgid "Paperless-ng is loading..." +#: documents/serialisers.py:794 +msgid "Invalid variable detected." +msgstr "" + +#: documents/templates/index.html:78 +msgid "Paperless-ngx is loading..." +msgstr "" + +#: documents/templates/index.html:79 +msgid "Still here?! Hmm, something might be wrong." +msgstr "" + +#: documents/templates/index.html:79 +msgid "Here's a link to the docs." msgstr "" #: documents/templates/registration/logged_out.html:14 -msgid "Paperless-ng signed out" +msgid "Paperless-ngx signed out" msgstr "" -#: documents/templates/registration/logged_out.html:45 +#: documents/templates/registration/logged_out.html:59 msgid "You have been successfully logged out. Bye!" msgstr "" -#: documents/templates/registration/logged_out.html:46 +#: documents/templates/registration/logged_out.html:60 msgid "Sign in again" msgstr "" #: documents/templates/registration/login.html:15 -msgid "Paperless-ng sign in" +msgid "Paperless-ngx sign in" msgstr "" -#: documents/templates/registration/login.html:47 +#: documents/templates/registration/login.html:61 msgid "Please sign in." msgstr "" -#: documents/templates/registration/login.html:50 +#: documents/templates/registration/login.html:64 msgid "Your username and password didn't match. Please try again." msgstr "" -#: documents/templates/registration/login.html:53 +#: documents/templates/registration/login.html:67 msgid "Username" msgstr "" -#: documents/templates/registration/login.html:54 +#: documents/templates/registration/login.html:68 msgid "Password" msgstr "" -#: documents/templates/registration/login.html:59 +#: documents/templates/registration/login.html:73 msgid "Sign in" msgstr "" -#: paperless/settings.py:303 -msgid "English (US)" -msgstr "Angol (US)" +#: paperless/apps.py:9 +msgid "Paperless" +msgstr "" -#: paperless/settings.py:304 +#: paperless/settings.py:521 +msgid "English (US)" +msgstr "" + +#: paperless/settings.py:522 +msgid "Arabic" +msgstr "" + +#: paperless/settings.py:523 +msgid "Belarusian" +msgstr "" + +#: paperless/settings.py:524 +msgid "Czech" +msgstr "" + +#: paperless/settings.py:525 +msgid "Danish" +msgstr "" + +#: paperless/settings.py:526 +msgid "German" +msgstr "" + +#: paperless/settings.py:527 msgid "English (GB)" msgstr "" -#: paperless/settings.py:305 -msgid "German" -msgstr "Német" - -#: paperless/settings.py:306 -msgid "Dutch" -msgstr "" - -#: paperless/settings.py:307 -msgid "French" -msgstr "" - -#: paperless/settings.py:308 -msgid "Portuguese (Brazil)" -msgstr "" - -#: paperless/settings.py:309 -msgid "Portuguese" -msgstr "" - -#: paperless/settings.py:310 -msgid "Italian" -msgstr "" - -#: paperless/settings.py:311 -msgid "Romanian" -msgstr "" - -#: paperless/settings.py:312 -msgid "Russian" -msgstr "" - -#: paperless/settings.py:313 +#: paperless/settings.py:528 msgid "Spanish" msgstr "" -#: paperless/settings.py:314 +#: paperless/settings.py:529 +msgid "French" +msgstr "" + +#: paperless/settings.py:530 +msgid "Italian" +msgstr "" + +#: paperless/settings.py:531 +msgid "Luxembourgish" +msgstr "" + +#: paperless/settings.py:532 +msgid "Dutch" +msgstr "" + +#: paperless/settings.py:533 msgid "Polish" msgstr "" -#: paperless/settings.py:315 +#: paperless/settings.py:534 +msgid "Portuguese (Brazil)" +msgstr "" + +#: paperless/settings.py:535 +msgid "Portuguese" +msgstr "" + +#: paperless/settings.py:536 +msgid "Romanian" +msgstr "" + +#: paperless/settings.py:537 +msgid "Russian" +msgstr "" + +#: paperless/settings.py:538 +msgid "Slovenian" +msgstr "" + +#: paperless/settings.py:539 +msgid "Serbian" +msgstr "" + +#: paperless/settings.py:540 msgid "Swedish" msgstr "" -#: paperless/urls.py:120 -msgid "Paperless-ng administration" +#: paperless/settings.py:541 +msgid "Turkish" msgstr "" -#: paperless_mail/admin.py:15 +#: paperless/settings.py:542 +msgid "Chinese Simplified" +msgstr "" + +#: paperless/urls.py:169 +msgid "Paperless-ngx administration" +msgstr "" + +#: paperless_mail/admin.py:30 msgid "Authentication" msgstr "" -#: paperless_mail/admin.py:18 +#: paperless_mail/admin.py:31 msgid "Advanced settings" msgstr "" -#: paperless_mail/admin.py:37 +#: paperless_mail/admin.py:48 msgid "Filter" -msgstr "Szűrő" +msgstr "" -#: paperless_mail/admin.py:39 +#: paperless_mail/admin.py:51 msgid "Paperless will only process mails that match ALL of the filters given below." msgstr "" -#: paperless_mail/admin.py:49 +#: paperless_mail/admin.py:66 msgid "Actions" -msgstr "Műveletek" - -#: paperless_mail/admin.py:51 -msgid "The action applied to the mail. This action is only performed when documents were consumed from the mail. Mails without attachments will remain entirely untouched." msgstr "" -#: paperless_mail/admin.py:58 -msgid "Metadata" -msgstr "Metaadat" +#: paperless_mail/admin.py:69 +msgid "The action applied to the mail. This action is only performed when the mail body or attachments were consumed from the mail." +msgstr "" -#: paperless_mail/admin.py:60 +#: paperless_mail/admin.py:77 +msgid "Metadata" +msgstr "" + +#: paperless_mail/admin.py:80 msgid "Assign metadata to documents consumed from this rule automatically. If you do not assign tags, types or correspondents here, paperless will still process all matching rules that you have defined." msgstr "" -#: paperless_mail/apps.py:9 +#: paperless_mail/apps.py:10 msgid "Paperless mail" msgstr "" -#: paperless_mail/models.py:11 +#: paperless_mail/models.py:9 msgid "mail account" msgstr "" -#: paperless_mail/models.py:12 +#: paperless_mail/models.py:10 msgid "mail accounts" msgstr "" -#: paperless_mail/models.py:19 +#: paperless_mail/models.py:13 msgid "No encryption" msgstr "" -#: paperless_mail/models.py:20 +#: paperless_mail/models.py:14 msgid "Use SSL" msgstr "" -#: paperless_mail/models.py:21 +#: paperless_mail/models.py:15 msgid "Use STARTTLS" msgstr "" -#: paperless_mail/models.py:29 +#: paperless_mail/models.py:19 msgid "IMAP server" msgstr "" -#: paperless_mail/models.py:33 +#: paperless_mail/models.py:22 msgid "IMAP port" msgstr "" -#: paperless_mail/models.py:36 +#: paperless_mail/models.py:26 msgid "This is usually 143 for unencrypted and STARTTLS connections, and 993 for SSL connections." msgstr "" -#: paperless_mail/models.py:40 +#: paperless_mail/models.py:32 msgid "IMAP security" msgstr "" -#: paperless_mail/models.py:46 +#: paperless_mail/models.py:37 msgid "username" msgstr "" -#: paperless_mail/models.py:50 +#: paperless_mail/models.py:39 msgid "password" msgstr "" -#: paperless_mail/models.py:54 +#: paperless_mail/models.py:42 msgid "character set" msgstr "" -#: paperless_mail/models.py:57 +#: paperless_mail/models.py:46 msgid "The character set to use when communicating with the mail server, such as 'UTF-8' or 'US-ASCII'." msgstr "" -#: paperless_mail/models.py:68 +#: paperless_mail/models.py:57 msgid "mail rule" msgstr "" -#: paperless_mail/models.py:69 +#: paperless_mail/models.py:58 msgid "mail rules" msgstr "" -#: paperless_mail/models.py:75 +#: paperless_mail/models.py:61 paperless_mail/models.py:69 msgid "Only process attachments." msgstr "" -#: paperless_mail/models.py:76 +#: paperless_mail/models.py:62 +msgid "Process full Mail (with embedded attachments in file) as .eml" +msgstr "" + +#: paperless_mail/models.py:64 +msgid "Process full Mail (with embedded attachments in file) as .eml + process attachments as separate documents" +msgstr "" + +#: paperless_mail/models.py:70 msgid "Process all files, including 'inline' attachments." msgstr "" -#: paperless_mail/models.py:86 -msgid "Mark as read, don't process read mails" +#: paperless_mail/models.py:73 +msgid "Delete" msgstr "" -#: paperless_mail/models.py:87 -msgid "Flag the mail, don't process flagged mails" -msgstr "" - -#: paperless_mail/models.py:88 +#: paperless_mail/models.py:74 msgid "Move to specified folder" msgstr "" -#: paperless_mail/models.py:89 -msgid "Delete" -msgstr "Törlés" +#: paperless_mail/models.py:75 +msgid "Mark as read, don't process read mails" +msgstr "" -#: paperless_mail/models.py:96 +#: paperless_mail/models.py:76 +msgid "Flag the mail, don't process flagged mails" +msgstr "" + +#: paperless_mail/models.py:77 +msgid "Tag the mail with specified tag, don't process tagged mails" +msgstr "" + +#: paperless_mail/models.py:80 msgid "Use subject as title" msgstr "" -#: paperless_mail/models.py:97 +#: paperless_mail/models.py:81 msgid "Use attachment filename as title" msgstr "" -#: paperless_mail/models.py:107 +#: paperless_mail/models.py:84 msgid "Do not assign a correspondent" msgstr "" -#: paperless_mail/models.py:109 +#: paperless_mail/models.py:85 msgid "Use mail address" msgstr "" -#: paperless_mail/models.py:111 +#: paperless_mail/models.py:86 msgid "Use name (or mail address if not available)" msgstr "" -#: paperless_mail/models.py:113 +#: paperless_mail/models.py:87 msgid "Use correspondent selected below" msgstr "" -#: paperless_mail/models.py:121 +#: paperless_mail/models.py:91 msgid "order" msgstr "" -#: paperless_mail/models.py:128 +#: paperless_mail/models.py:97 msgid "account" msgstr "" -#: paperless_mail/models.py:132 +#: paperless_mail/models.py:101 paperless_mail/models.py:231 msgid "folder" msgstr "" -#: paperless_mail/models.py:134 -msgid "Subfolders must be separated by dots." +#: paperless_mail/models.py:105 +msgid "Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server." msgstr "" -#: paperless_mail/models.py:138 +#: paperless_mail/models.py:111 msgid "filter from" msgstr "" -#: paperless_mail/models.py:141 +#: paperless_mail/models.py:117 msgid "filter subject" msgstr "" -#: paperless_mail/models.py:144 +#: paperless_mail/models.py:123 msgid "filter body" msgstr "" -#: paperless_mail/models.py:148 +#: paperless_mail/models.py:130 msgid "filter attachment filename" msgstr "" -#: paperless_mail/models.py:150 +#: paperless_mail/models.py:135 msgid "Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive." msgstr "" -#: paperless_mail/models.py:156 +#: paperless_mail/models.py:142 msgid "maximum age" msgstr "" -#: paperless_mail/models.py:158 +#: paperless_mail/models.py:144 msgid "Specified in days." msgstr "" -#: paperless_mail/models.py:161 +#: paperless_mail/models.py:148 msgid "attachment type" msgstr "" -#: paperless_mail/models.py:164 +#: paperless_mail/models.py:152 msgid "Inline attachments include embedded images, so it's best to combine this option with a filename filter." msgstr "" -#: paperless_mail/models.py:169 +#: paperless_mail/models.py:158 +msgid "consumption scope" +msgstr "" + +#: paperless_mail/models.py:164 msgid "action" msgstr "" -#: paperless_mail/models.py:175 +#: paperless_mail/models.py:170 msgid "action parameter" msgstr "" -#: paperless_mail/models.py:177 +#: paperless_mail/models.py:175 msgid "Additional parameter for the action selected above, i.e., the target folder of the move to folder action. Subfolders must be separated by dots." msgstr "" -#: paperless_mail/models.py:184 +#: paperless_mail/models.py:183 msgid "assign title from" msgstr "" -#: paperless_mail/models.py:194 +#: paperless_mail/models.py:191 msgid "assign this tag" msgstr "" -#: paperless_mail/models.py:202 +#: paperless_mail/models.py:199 msgid "assign this document type" msgstr "" -#: paperless_mail/models.py:206 +#: paperless_mail/models.py:203 msgid "assign correspondent from" msgstr "" -#: paperless_mail/models.py:216 +#: paperless_mail/models.py:213 msgid "assign this correspondent" msgstr "" +#: paperless_mail/models.py:239 +msgid "uid" +msgstr "" + +#: paperless_mail/models.py:247 +msgid "subject" +msgstr "" + +#: paperless_mail/models.py:255 +msgid "received" +msgstr "" + +#: paperless_mail/models.py:262 +msgid "processed" +msgstr "" + +#: paperless_mail/models.py:268 +msgid "status" +msgstr "" + From f18f997796aea5a5c4595de540287a4f25acad2e Mon Sep 17 00:00:00 2001 From: "Paperless-ngx Bot [bot]" <99855517+paperlessngx-bot@users.noreply.github.com> Date: Tue, 9 May 2023 16:56:48 -0700 Subject: [PATCH 047/103] New translations messages.xlf (Hungarian) [ci skip] --- src-ui/src/locale/messages.hu_HU.xlf | 5910 ++++++++++++++++++++++++++ 1 file changed, 5910 insertions(+) create mode 100644 src-ui/src/locale/messages.hu_HU.xlf diff --git a/src-ui/src/locale/messages.hu_HU.xlf b/src-ui/src/locale/messages.hu_HU.xlf new file mode 100644 index 000000000..513e0a680 --- /dev/null +++ b/src-ui/src/locale/messages.hu_HU.xlf @@ -0,0 +1,5910 @@ + + + + + + Close + + node_modules/src/ngb-config.ts + 13 + + Close + + + HH + + node_modules/src/ngb-config.ts + 13 + + HH + + + Close + + node_modules/src/ngb-config.ts + 13 + + Close + + + «« + + node_modules/src/ngb-config.ts + 13 + + «« + + + Select month + + node_modules/src/ngb-config.ts + 13 + + + node_modules/src/ngb-config.ts + 13 + + Select month + + + Previous month + + node_modules/src/ngb-config.ts + 13 + + + node_modules/src/ngb-config.ts + 13 + + Previous month + + + + + + + node_modules/src/ngb-config.ts + 13 + + + + Slide of + + node_modules/src/ngb-config.ts + 13 + + Currently selected slide number read by screen reader + Slide of + + + Hours + + node_modules/src/ngb-config.ts + 13 + + Hours + + + « + + node_modules/src/ngb-config.ts + 13 + + « + + + Previous + + node_modules/src/ngb-config.ts + 13 + + Previous + + + MM + + node_modules/src/ngb-config.ts + 13 + + MM + + + » + + node_modules/src/ngb-config.ts + 13 + + » + + + Select year + + node_modules/src/ngb-config.ts + 13 + + + node_modules/src/ngb-config.ts + 13 + + Select year + + + Next month + + node_modules/src/ngb-config.ts + 13 + + + node_modules/src/ngb-config.ts + 13 + + Next month + + + Next + + node_modules/src/ngb-config.ts + 13 + + Next + + + Minutes + + node_modules/src/ngb-config.ts + 13 + + Minutes + + + »» + + node_modules/src/ngb-config.ts + 13 + + »» + + + Increment hours + + node_modules/src/ngb-config.ts + 13 + + Increment hours + + + First + + node_modules/src/ngb-config.ts + 13 + + First + + + Previous + + node_modules/src/ngb-config.ts + 13 + + Previous + + + Decrement hours + + node_modules/src/ngb-config.ts + 13 + + Decrement hours + + + Next + + node_modules/src/ngb-config.ts + 13 + + Next + + + Increment minutes + + node_modules/src/ngb-config.ts + 13 + + Increment minutes + + + Last + + node_modules/src/ngb-config.ts + 13 + + Last + + + Decrement minutes + + node_modules/src/ngb-config.ts + 13 + + Decrement minutes + + + SS + + node_modules/src/ngb-config.ts + 13 + + SS + + + Seconds + + node_modules/src/ngb-config.ts + 13 + + Seconds + + + Increment seconds + + node_modules/src/ngb-config.ts + 13 + + Increment seconds + + + Decrement seconds + + node_modules/src/ngb-config.ts + 13 + + Decrement seconds + + + + + + + node_modules/src/ngb-config.ts + 13 + + + + + + + + node_modules/src/ngb-config.ts + 13 + + + + Drop files to begin upload + + src/app/app.component.html + 7 + + Drop files to begin upload + + + Document added + + src/app/app.component.ts + 90 + + + src/app/app.component.ts + 100 + + Document added + + + Document was added to paperless. + + src/app/app.component.ts + 92 + + + src/app/app.component.ts + 102 + + Document was added to paperless. + + + Open document + + src/app/app.component.ts + 93 + + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 46 + + Open document + + + Could not add : + + src/app/app.component.ts + 116 + + Could not add : + + + New document detected + + src/app/app.component.ts + 131 + + New document detected + + + Document is being processed by paperless. + + src/app/app.component.ts + 133 + + Document is being processed by paperless. + + + Prev + + src/app/app.component.ts + 138 + + Prev + + + Next + + src/app/app.component.ts + 139 + + + src/app/components/document-detail/document-detail.component.html + 55 + + Next + + + End + + src/app/app.component.ts + 140 + + End + + + The dashboard can be used to show saved views, such as an 'Inbox'. Those settings are found under Settings > Saved Views once you have created some. + + src/app/app.component.ts + 145 + + The dashboard can be used to show saved views, such as an 'Inbox'. Those settings are found under Settings > Saved Views once you have created some. + + + Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. + + src/app/app.component.ts + 155 + + Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. + + + The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. + + src/app/app.component.ts + 165 + + The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. + + + The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. + + src/app/app.component.ts + 178 + + The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. + + + Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. + + src/app/app.component.ts + 189 + + Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. + + + Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view. + + src/app/app.component.ts + 199 + + Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view. + + + File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process. + + src/app/app.component.ts + 209 + + File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process. + + + Check out the settings for various tweaks to the web app, toggle settings for saved views or setup e-mail checking. + + src/app/app.component.ts + 219 + + Check out the settings for various tweaks to the web app, toggle settings for saved views or setup e-mail checking. + + + Thank you! 🙏 + + src/app/app.component.ts + 229 + + Thank you! 🙏 + + + There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. + + src/app/app.component.ts + 231 + + There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. + + + Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! + + src/app/app.component.ts + 233 + + Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! + + + Initiating upload... + + src/app/app.component.ts + 289 + + Initiating upload... + + + Paperless-ngx + + src/app/components/app-frame/app-frame.component.html + 11 + + app title + Paperless-ngx + + + Search documents + + src/app/components/app-frame/app-frame.component.html + 18 + + Search documents + + + Logged in as + + src/app/components/app-frame/app-frame.component.html + 39 + + Logged in as + + + Settings + + src/app/components/app-frame/app-frame.component.html + 45 + + + src/app/components/app-frame/app-frame.component.html + 174 + + + src/app/components/app-frame/app-frame.component.html + 177 + + + src/app/components/manage/settings/settings.component.html + 1 + + + src/app/components/manage/settings/settings.component.html + 192 + + Settings + + + Logout + + src/app/components/app-frame/app-frame.component.html + 50 + + Logout + + + Dashboard + + src/app/components/app-frame/app-frame.component.html + 69 + + + src/app/components/app-frame/app-frame.component.html + 72 + + + src/app/components/dashboard/dashboard.component.html + 1 + + Dashboard + + + Documents + + src/app/components/app-frame/app-frame.component.html + 76 + + + src/app/components/app-frame/app-frame.component.html + 79 + + + src/app/components/document-list/document-list.component.ts + 97 + + + src/app/components/manage/management-list/management-list.component.html + 54 + + + src/app/components/manage/management-list/management-list.component.html + 54 + + + src/app/components/manage/management-list/management-list.component.html + 54 + + + src/app/components/manage/management-list/management-list.component.html + 54 + + Documents + + + Saved views + + src/app/components/app-frame/app-frame.component.html + 85 + + + src/app/components/manage/settings/settings.component.html + 189 + + Saved views + + + Open documents + + src/app/components/app-frame/app-frame.component.html + 101 + + Open documents + + + Close all + + src/app/components/app-frame/app-frame.component.html + 117 + + + src/app/components/app-frame/app-frame.component.html + 120 + + Close all + + + Manage + + src/app/components/app-frame/app-frame.component.html + 127 + + Manage + + + Correspondents + + src/app/components/app-frame/app-frame.component.html + 131 + + + src/app/components/app-frame/app-frame.component.html + 134 + + Correspondents + + + Tags + + src/app/components/app-frame/app-frame.component.html + 138 + + + src/app/components/app-frame/app-frame.component.html + 141 + + + src/app/components/common/input/tags/tags.component.html + 2 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 28 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 27 + + Tags + + + Document types + + src/app/components/app-frame/app-frame.component.html + 145 + + + src/app/components/app-frame/app-frame.component.html + 148 + + Document types + + + Storage paths + + src/app/components/app-frame/app-frame.component.html + 152 + + + src/app/components/app-frame/app-frame.component.html + 155 + + Storage paths + + + File Tasks + + src/app/components/app-frame/app-frame.component.html + 159 + + + src/app/components/manage/tasks/tasks.component.html + 1 + + File Tasks + + + File Tasks + + src/app/components/app-frame/app-frame.component.html + 163 + + File Tasks + + + Logs + + src/app/components/app-frame/app-frame.component.html + 167 + + + src/app/components/app-frame/app-frame.component.html + 170 + + + src/app/components/manage/logs/logs.component.html + 1 + + Logs + + + Info + + src/app/components/app-frame/app-frame.component.html + 183 + + + src/app/components/manage/tasks/tasks.component.html + 43 + + Info + + + Documentation + + src/app/components/app-frame/app-frame.component.html + 187 + + + src/app/components/app-frame/app-frame.component.html + 190 + + Documentation + + + GitHub + + src/app/components/app-frame/app-frame.component.html + 195 + + + src/app/components/app-frame/app-frame.component.html + 198 + + GitHub + + + Suggest an idea + + src/app/components/app-frame/app-frame.component.html + 200 + + + src/app/components/app-frame/app-frame.component.html + 204 + + Suggest an idea + + + is available. + + src/app/components/app-frame/app-frame.component.html + 213 + + is available. + + + Click to view. + + src/app/components/app-frame/app-frame.component.html + 213 + + Click to view. + + + Paperless-ngx can automatically check for updates + + src/app/components/app-frame/app-frame.component.html + 217 + + Paperless-ngx can automatically check for updates + + + How does this work? + + src/app/components/app-frame/app-frame.component.html + 224,226 + + How does this work? + + + Update available + + src/app/components/app-frame/app-frame.component.html + 235 + + Update available + + + An error occurred while saving settings. + + src/app/components/app-frame/app-frame.component.ts + 104 + + + src/app/components/manage/settings/settings.component.ts + 593 + + An error occurred while saving settings. + + + An error occurred while saving update checking settings. + + src/app/components/app-frame/app-frame.component.ts + 237 + + An error occurred while saving update checking settings. + + + Clear + + src/app/components/common/clearable-badge/clearable-badge.component.html + 1 + + + src/app/components/common/date-dropdown/date-dropdown.component.html + 24 + + + src/app/components/common/date-dropdown/date-dropdown.component.html + 47 + + Clear + + + Cancel + + src/app/components/common/confirm-dialog/confirm-dialog.component.html + 12 + + Cancel + + + Confirmation + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 20 + + Confirmation + + + Confirm + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 32 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 21 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 324 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 364 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 402 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 440 + + Confirm + + + After + + src/app/components/common/date-dropdown/date-dropdown.component.html + 19 + + After + + + Before + + src/app/components/common/date-dropdown/date-dropdown.component.html + 42 + + Before + + + Last 7 days + + src/app/components/common/date-dropdown/date-dropdown.component.ts + 43 + + Last 7 days + + + Last month + + src/app/components/common/date-dropdown/date-dropdown.component.ts + 47 + + Last month + + + Last 3 months + + src/app/components/common/date-dropdown/date-dropdown.component.ts + 51 + + Last 3 months + + + Last year + + src/app/components/common/date-dropdown/date-dropdown.component.ts + 55 + + Last year + + + Name + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 9 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 10 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 10 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 10 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 10 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 9 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 8 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 8 + + + src/app/components/manage/management-list/management-list.component.html + 9 + + + src/app/components/manage/management-list/management-list.component.html + 9 + + + src/app/components/manage/management-list/management-list.component.html + 9 + + + src/app/components/manage/management-list/management-list.component.html + 9 + + + src/app/components/manage/management-list/management-list.component.html + 19 + + + src/app/components/manage/management-list/management-list.component.html + 19 + + + src/app/components/manage/management-list/management-list.component.html + 19 + + + src/app/components/manage/management-list/management-list.component.html + 19 + + + src/app/components/manage/settings/settings.component.html + 204 + + + src/app/components/manage/settings/settings.component.html + 257 + + + src/app/components/manage/settings/settings.component.html + 294 + + + src/app/components/manage/settings/settings.component.html + 345 + + + src/app/components/manage/settings/settings.component.html + 379 + + + src/app/components/manage/tasks/tasks.component.html + 40 + + Name + + + Matching algorithm + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 10 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 13 + + Matching algorithm + + + Matching pattern + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 12 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 12 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 14 + + Matching pattern + + + Case insensitive + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 12 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 15 + + Case insensitive + + + Cancel + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 20 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 22 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 16 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 34 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 39 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 21 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 23 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 35 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 20 + + + src/app/components/common/select-dialog/select-dialog.component.html + 12 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 6 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 18 + + Cancel + + + Save + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 21 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 23 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 17 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 35 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 40 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 22 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 24 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 36 + + + src/app/components/document-detail/document-detail.component.html + 196 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 19 + + + src/app/components/manage/settings/settings.component.html + 415 + + Save + + + Create new correspondent + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts + 25 + + Create new correspondent + + + Edit correspondent + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts + 29 + + Edit correspondent + + + Create new document type + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts + 25 + + Create new document type + + + Edit document type + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts + 29 + + Edit document type + + + Create new item + + src/app/components/common/edit-dialog/edit-dialog.component.ts + 71 + + Create new item + + + Edit item + + src/app/components/common/edit-dialog/edit-dialog.component.ts + 75 + + Edit item + + + Could not save element: + + src/app/components/common/edit-dialog/edit-dialog.component.ts + 79 + + Could not save element: + + + Permissions + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 30 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 2 + + + src/app/components/document-detail/document-detail.component.html + 182 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 81 + + Permissions + + + Create new user group + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts + 24 + + Create new user group + + + Edit user group + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts + 28 + + Edit user group + + + IMAP Server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 11 + + IMAP Server + + + IMAP Port + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 12 + + IMAP Port + + + IMAP Security + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 13 + + IMAP Security + + + Username + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 16 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 10 + + + src/app/components/manage/settings/settings.component.html + 344 + + Username + + + Password + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 17 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 12 + + Password + + + Password is token + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 18 + + Password is token + + + Check if the password above is a token used for authentication + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 18 + + Check if the password above is a token used for authentication + + + Character Set + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 19 + + Character Set + + + Loading... + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 30 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 18 + + + src/app/components/dashboard/dashboard.component.html + 27 + + + src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html + 7 + + + src/app/components/document-list/document-list.component.html + 95 + + + src/app/components/manage/settings/settings.component.html + 230 + + + src/app/components/manage/settings/settings.component.html + 320 + + + src/app/components/manage/settings/settings.component.html + 406 + + + src/app/components/manage/tasks/tasks.component.html + 19 + + + src/app/components/manage/tasks/tasks.component.html + 27 + + Loading... + + + Test + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 32 + + Test + + + No encryption + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 13 + + No encryption + + + SSL + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 14 + + SSL + + + STARTTLS + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 15 + + STARTTLS + + + Create new mail account + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 39 + + Create new mail account + + + Edit mail account + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 43 + + Edit mail account + + + Successfully connected to the mail server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 88 + + Successfully connected to the mail server + + + Unable to connect to the mail server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 89 + + Unable to connect to the mail server + + + Account + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 11 + + + src/app/components/manage/settings/settings.component.html + 295 + + Account + + + Folder + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 12 + + Folder + + + Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 12 + + Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. + + + Maximum age (days) + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 13 + + Maximum age (days) + + + Attachment type + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 14 + + Attachment type + + + Consumption scope + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 15 + + Consumption scope + + + See docs for .eml processing requirements + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 15 + + See docs for .eml processing requirements + + + Rule order + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 16 + + Rule order + + + Paperless will only process mails that match all of the filters specified below. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 19 + + Paperless will only process mails that match all of the filters specified below. + + + Filter from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 20 + + Filter from + + + Filter to + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 21 + + Filter to + + + Filter subject + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 22 + + Filter subject + + + Filter body + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 23 + + Filter body + + + Filter attachment filename + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 24 + + Filter attachment filename + + + Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 24 + + Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. + + + Action + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 27 + + Action + + + Action is only performed when documents are consumed from the mail. Mails without attachments remain entirely untouched. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 27 + + Action is only performed when documents are consumed from the mail. Mails without attachments remain entirely untouched. + + + Action parameter + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 28 + + Action parameter + + + Assign title from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 29 + + Assign title from + + + Assign document type + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 31 + + Assign document type + + + Assign correspondent from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 32 + + Assign correspondent from + + + Assign correspondent + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 33 + + Assign correspondent + + + Error + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 38 + + + src/app/services/toast.service.ts + 35 + + Error + + + Only process attachments + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 26 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 37 + + Only process attachments + + + Process all files, including 'inline' attachments + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 30 + + Process all files, including 'inline' attachments + + + Process message as .eml + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 41 + + Process message as .eml + + + Process message as .eml and attachments separately + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 45 + + Process message as .eml and attachments separately + + + Delete + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 52 + + + src/app/components/common/permissions-select/permissions-select.component.html + 9 + + + src/app/components/document-detail/document-detail.component.html + 11 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 141 + + + src/app/components/manage/management-list/management-list.component.html + 46 + + + src/app/components/manage/management-list/management-list.component.html + 46 + + + src/app/components/manage/management-list/management-list.component.html + 46 + + + src/app/components/manage/management-list/management-list.component.html + 46 + + + src/app/components/manage/management-list/management-list.component.html + 65 + + + src/app/components/manage/management-list/management-list.component.html + 65 + + + src/app/components/manage/management-list/management-list.component.html + 65 + + + src/app/components/manage/management-list/management-list.component.html + 65 + + + src/app/components/manage/management-list/management-list.component.ts + 214 + + + src/app/components/manage/settings/settings.component.html + 222 + + + src/app/components/manage/settings/settings.component.html + 270 + + + src/app/components/manage/settings/settings.component.html + 307 + + + src/app/components/manage/settings/settings.component.html + 359 + + + src/app/components/manage/settings/settings.component.html + 394 + + Delete + + + Move to specified folder + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 56 + + Move to specified folder + + + Mark as read, don't process read mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 60 + + Mark as read, don't process read mails + + + Flag the mail, don't process flagged mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 64 + + Flag the mail, don't process flagged mails + + + Tag the mail with specified tag, don't process tagged mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 68 + + Tag the mail with specified tag, don't process tagged mails + + + Use subject as title + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 75 + + Use subject as title + + + Use attachment filename as title + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 79 + + Use attachment filename as title + + + Do not assign a correspondent + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 86 + + Do not assign a correspondent + + + Use mail address + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 90 + + Use mail address + + + Use name (or mail address if not available) + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 94 + + Use name (or mail address if not available) + + + Use correspondent selected below + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 98 + + Use correspondent selected below + + + Create new mail rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 139 + + Create new mail rule + + + Edit mail rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 143 + + Edit mail rule + + + Path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 10 + + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 42 + + Path + + + e.g. + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 26 + + e.g. + + + or use slashes to add directories e.g. + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 28 + + or use slashes to add directories e.g. + + + See <a target="_blank" href="https://docs.paperless-ngx.com/advanced_usage/#file-name-handling">documentation</a> for full list. + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 30 + + See <a target="_blank" href="https://docs.paperless-ngx.com/advanced_usage/#file-name-handling">documentation</a> for full list. + + + Create new storage path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 35 + + Create new storage path + + + Edit storage path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 39 + + Edit storage path + + + Color + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 10 + + + src/app/components/manage/tag-list/tag-list.component.ts + 42 + + Color + + + Inbox tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 12 + + Inbox tag + + + Inbox tags are automatically assigned to all consumed documents. + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 12 + + Inbox tags are automatically assigned to all consumed documents. + + + Create new tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts + 26 + + Create new tag + + + Edit tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts + 30 + + Edit tag + + + Email + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 11 + + Email + + + First name + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 13 + + First name + + + Last name + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 14 + + Last name + + + Active + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 19 + + Active + + + Superuser + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 23 + + Superuser + + + (Grants all permissions and can view objects) + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 23 + + (Grants all permissions and can view objects) + + + Groups + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 27 + + + src/app/components/manage/settings/settings.component.html + 346 + + + src/app/components/manage/settings/settings.component.html + 367 + + Groups + + + Create new user account + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 42 + + Create new user account + + + Edit user account + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 46 + + Edit user account + + + All + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 16 + + + src/app/components/common/permissions-select/permissions-select.component.html + 6 + + + src/app/components/common/permissions-select/permissions-select.component.html + 17 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 20 + + All + + + Any + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 18 + + Any + + + Include + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 24 + + Include + + + Exclude + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 26 + + Exclude + + + Apply + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 42 + + Apply + + + Click again to exclude items. + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 48 + + Click again to exclude items. + + + Not assigned + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts + 336 + + Filter drop down element to filter for documents with no correspondent/type/tag assigned + Not assigned + + + Invalid date. + + src/app/components/common/input/date/date.component.html + 13 + + Invalid date. + + + Suggestions: + + src/app/components/common/input/date/date.component.html + 16 + + + src/app/components/common/input/select/select.component.html + 32 + + + src/app/components/common/input/tags/tags.component.html + 43 + + Suggestions: + + + Edit Permissions + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 7 + + Edit Permissions + + + Owner: + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 19 + + Owner: + + + Objects without an owner can be viewed and edited by all users + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 25 + + Objects without an owner can be viewed and edited by all users + + + View + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 27 + + + src/app/components/common/permissions-select/permissions-select.component.html + 10 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 56 + + View + + + Users: + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 31 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 50 + + Users: + + + Groups: + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 39 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 58 + + Groups: + + + Edit + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 46 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 49 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 78 + + + src/app/components/manage/management-list/management-list.component.html + 45 + + + src/app/components/manage/management-list/management-list.component.html + 45 + + + src/app/components/manage/management-list/management-list.component.html + 45 + + + src/app/components/manage/management-list/management-list.component.html + 45 + + + src/app/components/manage/management-list/management-list.component.html + 59 + + + src/app/components/manage/management-list/management-list.component.html + 59 + + + src/app/components/manage/management-list/management-list.component.html + 59 + + + src/app/components/manage/management-list/management-list.component.html + 59 + + + src/app/components/manage/settings/settings.component.html + 269 + + + src/app/components/manage/settings/settings.component.html + 306 + + + src/app/components/manage/settings/settings.component.html + 358 + + + src/app/components/manage/settings/settings.component.html + 393 + + Edit + + + Edit permissions also grant viewing permissions + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 64 + + Edit permissions also grant viewing permissions + + + Add item + + src/app/components/common/input/select/select.component.html + 12 + + Used for both types, correspondents, storage paths + Add item + + + Private + + src/app/components/common/input/select/select.component.ts + 57 + + + src/app/components/common/tag/tag.component.html + 7 + + + src/app/components/common/tag/tag.component.html + 8 + + Private + + + Add tag + + src/app/components/common/input/tags/tags.component.html + 12 + + Add tag + + + Set Permissions + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 26 + + Set Permissions + + + Note that permissions set here will override any existing permissions + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 43 + + Note that permissions set here will override any existing permissions + + + Type + + src/app/components/common/permissions-select/permissions-select.component.html + 5 + + Type + + + Add + + src/app/components/common/permissions-select/permissions-select.component.html + 7 + + Add + + + Change + + src/app/components/common/permissions-select/permissions-select.component.html + 8 + + Change + + + + + + + src/app/components/common/permissions-select/permissions-select.component.html + 22 + + + src/app/components/manage/tasks/tasks.component.html + 11 + + + + + Inherited from group + + src/app/components/common/permissions-select/permissions-select.component.ts + 62 + + Inherited from group + + + Select + + src/app/components/common/select-dialog/select-dialog.component.html + 13 + + + src/app/components/common/select-dialog/select-dialog.component.ts + 17 + + + src/app/components/document-list/document-list.component.html + 8 + + Select + + + Please select an object + + src/app/components/common/select-dialog/select-dialog.component.ts + 20 + + Please select an object + + + Hello , welcome to Paperless-ngx + + src/app/components/dashboard/dashboard.component.ts + 23 + + Hello , welcome to Paperless-ngx + + + Welcome to Paperless-ngx + + src/app/components/dashboard/dashboard.component.ts + 25 + + Welcome to Paperless-ngx + + + Show all + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 3 + + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 27 + + Show all + + + Created + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 9 + + + src/app/components/document-list/document-list.component.html + 172 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 63 + + + src/app/components/manage/tasks/tasks.component.html + 41 + + + src/app/services/rest/document.service.ts + 22 + + Created + + + Title + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 10 + + + src/app/components/document-detail/document-detail.component.html + 75 + + + src/app/components/document-list/document-list.component.html + 144 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 172 + + + src/app/services/rest/document.service.ts + 20 + + Title + + + Statistics + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 1 + + Statistics + + + Go to inbox + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 4 + + Go to inbox + + + Documents in inbox + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 5 + + Documents in inbox + + + Go to documents + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 8 + + Go to documents + + + Total documents + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 9 + + Total documents + + + Total characters + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 13 + + Total characters + + + Other + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.ts + 55 + + Other + + + Upload new documents + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 1 + + Upload new documents + + + Dismiss completed + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 4 + + This button dismisses all status messages about processed documents on the dashboard (failed and successful) + Dismiss completed + + + Drop documents here or + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 13 + + Drop documents here or + + + Browse files + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 13 + + Browse files + + + {VAR_PLURAL, plural, =1 {One more document} other { more documents}} + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 25 + + This is shown as a summary line when there are more than 5 document in the processing pipeline. + {VAR_PLURAL, plural, =1 {One more document} other { more documents}} + + + Processing: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 39 + + Processing: + + + Failed: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 42 + + Failed: + + + Added: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 45 + + Added: + + + , + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 48 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 269 + + this string is used to separate processing, failed and added on the file upload widget + , + + + Paperless-ngx is running! + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 2 + + Paperless-ngx is running! + + + You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 3 + + You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. + + + More detail on how to use and configure Paperless-ngx is always available in the documentation. + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 4 + + More detail on how to use and configure Paperless-ngx is always available in the documentation. + + + Thanks for being a part of the Paperless-ngx community! + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 7 + + Thanks for being a part of the Paperless-ngx community! + + + Start the tour + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 8 + + Start the tour + + + Searching document with asn + + src/app/components/document-asn/document-asn.component.html + 1 + + Searching document with asn + + + Page + + src/app/components/document-detail/document-detail.component.html + 3 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 15 + + Page + + + of + + src/app/components/document-detail/document-detail.component.html + 5,6 + + of + + + Download + + src/app/components/document-detail/document-detail.component.html + 19 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 105 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 64 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 94 + + Download + + + Download original + + src/app/components/document-detail/document-detail.component.html + 25 + + Download original + + + Redo OCR + + src/app/components/document-detail/document-detail.component.html + 34 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 92 + + Redo OCR + + + More like this + + src/app/components/document-detail/document-detail.component.html + 40 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 44 + + More like this + + + Close + + src/app/components/document-detail/document-detail.component.html + 43 + + + src/app/guards/dirty-saved-view.guard.ts + 40 + + Close + + + Previous + + src/app/components/document-detail/document-detail.component.html + 50 + + Previous + + + Details + + src/app/components/document-detail/document-detail.component.html + 72 + + Details + + + Archive serial number + + src/app/components/document-detail/document-detail.component.html + 76 + + Archive serial number + + + Date created + + src/app/components/document-detail/document-detail.component.html + 77 + + Date created + + + Correspondent + + src/app/components/document-detail/document-detail.component.html + 79 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 40 + + + src/app/components/document-list/document-list.component.html + 137 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 36 + + + src/app/services/rest/document.service.ts + 19 + + Correspondent + + + Document type + + src/app/components/document-detail/document-detail.component.html + 81 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 51 + + + src/app/components/document-list/document-list.component.html + 158 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 44 + + + src/app/services/rest/document.service.ts + 21 + + Document type + + + Storage path + + src/app/components/document-detail/document-detail.component.html + 83 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 62 + + + src/app/components/document-list/document-list.component.html + 165 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 52 + + Storage path + + + Default + + src/app/components/document-detail/document-detail.component.html + 84 + + Default + + + Content + + src/app/components/document-detail/document-detail.component.html + 91 + + Content + + + Metadata + + src/app/components/document-detail/document-detail.component.html + 100 + + + src/app/components/document-detail/metadata-collapse/metadata-collapse.component.ts + 17 + + Metadata + + + Date modified + + src/app/components/document-detail/document-detail.component.html + 106 + + Date modified + + + Date added + + src/app/components/document-detail/document-detail.component.html + 110 + + Date added + + + Media filename + + src/app/components/document-detail/document-detail.component.html + 114 + + Media filename + + + Original filename + + src/app/components/document-detail/document-detail.component.html + 118 + + Original filename + + + Original MD5 checksum + + src/app/components/document-detail/document-detail.component.html + 122 + + Original MD5 checksum + + + Original file size + + src/app/components/document-detail/document-detail.component.html + 126 + + Original file size + + + Original mime type + + src/app/components/document-detail/document-detail.component.html + 130 + + Original mime type + + + Archive MD5 checksum + + src/app/components/document-detail/document-detail.component.html + 134 + + Archive MD5 checksum + + + Archive file size + + src/app/components/document-detail/document-detail.component.html + 138 + + Archive file size + + + Original document metadata + + src/app/components/document-detail/document-detail.component.html + 144 + + Original document metadata + + + Archived document metadata + + src/app/components/document-detail/document-detail.component.html + 145 + + Archived document metadata + + + Preview + + src/app/components/document-detail/document-detail.component.html + 151 + + Preview + + + Enter Password + + src/app/components/document-detail/document-detail.component.html + 167 + + + src/app/components/document-detail/document-detail.component.html + 215 + + Enter Password + + + Notes + + src/app/components/document-detail/document-detail.component.html + 175,176 + + Notes + + + Discard + + src/app/components/document-detail/document-detail.component.html + 194 + + Discard + + + Save & next + + src/app/components/document-detail/document-detail.component.html + 195 + + Save & next + + + An error occurred loading content: + + src/app/components/document-detail/document-detail.component.ts + 226,228 + + An error occurred loading content: + + + Error retrieving metadata + + src/app/components/document-detail/document-detail.component.ts + 369 + + Error retrieving metadata + + + Error retrieving suggestions + + src/app/components/document-detail/document-detail.component.ts + 389 + + Error retrieving suggestions + + + Document saved successfully. + + src/app/components/document-detail/document-detail.component.ts + 499 + + + src/app/components/document-detail/document-detail.component.ts + 507 + + Document saved successfully. + + + Error saving document + + src/app/components/document-detail/document-detail.component.ts + 512 + + + src/app/components/document-detail/document-detail.component.ts + 557 + + Error saving document + + + Confirm delete + + src/app/components/document-detail/document-detail.component.ts + 586 + + + src/app/components/manage/management-list/management-list.component.ts + 210 + + Confirm delete + + + Do you really want to delete document ""? + + src/app/components/document-detail/document-detail.component.ts + 587 + + Do you really want to delete document ""? + + + The files for this document will be deleted permanently. This operation cannot be undone. + + src/app/components/document-detail/document-detail.component.ts + 588 + + The files for this document will be deleted permanently. This operation cannot be undone. + + + Delete document + + src/app/components/document-detail/document-detail.component.ts + 590 + + Delete document + + + Error deleting document: + + src/app/components/document-detail/document-detail.component.ts + 610,612 + + Error deleting document: + + + Redo OCR confirm + + src/app/components/document-detail/document-detail.component.ts + 633 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 499 + + Redo OCR confirm + + + This operation will permanently redo OCR for this document. + + src/app/components/document-detail/document-detail.component.ts + 634 + + This operation will permanently redo OCR for this document. + + + This operation cannot be undone. + + src/app/components/document-detail/document-detail.component.ts + 635 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 462 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 501 + + + src/app/components/manage/settings/settings.component.ts + 688 + + + src/app/components/manage/settings/settings.component.ts + 742 + + + src/app/components/manage/settings/settings.component.ts + 803 + + + src/app/components/manage/settings/settings.component.ts + 862 + + This operation cannot be undone. + + + Proceed + + src/app/components/document-detail/document-detail.component.ts + 637 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 503 + + + src/app/components/manage/settings/settings.component.ts + 690 + + + src/app/components/manage/settings/settings.component.ts + 744 + + + src/app/components/manage/settings/settings.component.ts + 805 + + + src/app/components/manage/settings/settings.component.ts + 864 + + Proceed + + + Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + + src/app/components/document-detail/document-detail.component.ts + 645 + + Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + + + Error executing operation: + + src/app/components/document-detail/document-detail.component.ts + 656,658 + + Error executing operation: + + + Select: + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 10 + + Select: + + + Edit: + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 27 + + Edit: + + + Filter tags + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 29 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 28 + + Filter tags + + + Filter correspondents + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 41 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 37 + + Filter correspondents + + + Filter document types + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 52 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 45 + + Filter document types + + + Filter storage paths + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 63 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 53 + + Filter storage paths + + + Actions + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 89 + + + src/app/components/manage/management-list/management-list.component.html + 23 + + + src/app/components/manage/management-list/management-list.component.html + 23 + + + src/app/components/manage/management-list/management-list.component.html + 23 + + + src/app/components/manage/management-list/management-list.component.html + 23 + + + src/app/components/manage/settings/settings.component.html + 221 + + + src/app/components/manage/settings/settings.component.html + 259 + + + src/app/components/manage/settings/settings.component.html + 296 + + + src/app/components/manage/settings/settings.component.html + 347 + + + src/app/components/manage/settings/settings.component.html + 382 + + + src/app/components/manage/tasks/tasks.component.html + 44 + + Actions + + + Include: + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 111 + + Include: + + + Archived files + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 115,117 + + Archived files + + + Original files + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 121,123 + + Original files + + + Use formatted filename + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 128,130 + + Use formatted filename + + + Error executing bulk operation: + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 185,187 + + Error executing bulk operation: + + + "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 261 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 267 + + "" + + + "" and "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 263 + + This is for messages like 'modify "tag1" and "tag2"' + "" and "" + + + and "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 271,273 + + this is for messages like 'modify "tag1", "tag2" and "tag3"' + and "" + + + Confirm tags assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 288 + + Confirm tags assignment + + + This operation will add the tag "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 294 + + This operation will add the tag "" to selected document(s). + + + This operation will add the tags to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 299,301 + + This operation will add the tags to selected document(s). + + + This operation will remove the tag "" from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 307 + + This operation will remove the tag "" from selected document(s). + + + This operation will remove the tags from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 312,314 + + This operation will remove the tags from selected document(s). + + + This operation will add the tags and remove the tags on selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 316,320 + + This operation will add the tags and remove the tags on selected document(s). + + + Confirm correspondent assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 357 + + Confirm correspondent assignment + + + This operation will assign the correspondent "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 359 + + This operation will assign the correspondent "" to selected document(s). + + + This operation will remove the correspondent from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 361 + + This operation will remove the correspondent from selected document(s). + + + Confirm document type assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 395 + + Confirm document type assignment + + + This operation will assign the document type "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 397 + + This operation will assign the document type "" to selected document(s). + + + This operation will remove the document type from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 399 + + This operation will remove the document type from selected document(s). + + + Confirm storage path assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 433 + + Confirm storage path assignment + + + This operation will assign the storage path "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 435 + + This operation will assign the storage path "" to selected document(s). + + + This operation will remove the storage path from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 437 + + This operation will remove the storage path from selected document(s). + + + Delete confirm + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 460 + + Delete confirm + + + This operation will permanently delete selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 461 + + This operation will permanently delete selected document(s). + + + Delete document(s) + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 464 + + Delete document(s) + + + This operation will permanently redo OCR for selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 500 + + This operation will permanently redo OCR for selected document(s). + + + Filter by correspondent + + src/app/components/document-list/document-card-large/document-card-large.component.html + 20 + + + src/app/components/document-list/document-list.component.html + 194 + + Filter by correspondent + + + Filter by tag + + src/app/components/document-list/document-card-large/document-card-large.component.html + 24 + + + src/app/components/document-list/document-list.component.html + 199 + + Filter by tag + + + View notes + + src/app/components/document-list/document-card-large/document-card-large.component.html + 70 + + View notes + + + Notes + + src/app/components/document-list/document-card-large/document-card-large.component.html + 74 + + Notes + + + Filter by document type + + src/app/components/document-list/document-card-large/document-card-large.component.html + 76 + + + src/app/components/document-list/document-list.component.html + 212 + + Filter by document type + + + Filter by storage path + + src/app/components/document-list/document-card-large/document-card-large.component.html + 83 + + + src/app/components/document-list/document-list.component.html + 217 + + Filter by storage path + + + Created: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 98,99 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 56,57 + + Created: + + + Added: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 99,100 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 57,58 + + Added: + + + Modified: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 100,101 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 58,59 + + Modified: + + + Score: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 110 + + Score: + + + Toggle tag filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 14 + + Toggle tag filter + + + Toggle correspondent filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 32 + + Toggle correspondent filter + + + Toggle document type filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 39 + + Toggle document type filter + + + Toggle storage path filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 46 + + Toggle storage path filter + + + Select none + + src/app/components/document-list/document-list.component.html + 11 + + Select none + + + Select page + + src/app/components/document-list/document-list.component.html + 12 + + Select page + + + Select all + + src/app/components/document-list/document-list.component.html + 13 + + Select all + + + Sort + + src/app/components/document-list/document-list.component.html + 38 + + Sort + + + Views + + src/app/components/document-list/document-list.component.html + 64 + + + src/app/components/manage/settings/settings.component.html + 199 + + Views + + + Save "" + + src/app/components/document-list/document-list.component.html + 76 + + Save "" + + + Save as... + + src/app/components/document-list/document-list.component.html + 78 + + Save as... + + + {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} + + src/app/components/document-list/document-list.component.html + 97 + + {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} + + + {VAR_PLURAL, plural, =1 {One document} other { documents}} + + src/app/components/document-list/document-list.component.html + 99 + + {VAR_PLURAL, plural, =1 {One document} other { documents}} + + + (filtered) + + src/app/components/document-list/document-list.component.html + 99 + + (filtered) + + + Error while loading documents + + src/app/components/document-list/document-list.component.html + 112 + + Error while loading documents + + + Sort by ASN + + src/app/components/document-list/document-list.component.html + 126 + + Sort by ASN + + + ASN + + src/app/components/document-list/document-list.component.html + 131,130 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 177 + + + src/app/services/rest/document.service.ts + 18 + + ASN + + + Sort by correspondent + + src/app/components/document-list/document-list.component.html + 133 + + Sort by correspondent + + + Sort by title + + src/app/components/document-list/document-list.component.html + 140 + + Sort by title + + + Sort by notes + + src/app/components/document-list/document-list.component.html + 147 + + Sort by notes + + + Notes + + src/app/components/document-list/document-list.component.html + 151 + + + src/app/components/manage/settings/settings.component.html + 159 + + + src/app/services/rest/document.service.ts + 25 + + Notes + + + Sort by document type + + src/app/components/document-list/document-list.component.html + 154 + + Sort by document type + + + Sort by storage path + + src/app/components/document-list/document-list.component.html + 161 + + Sort by storage path + + + Sort by created date + + src/app/components/document-list/document-list.component.html + 168 + + Sort by created date + + + Sort by added date + + src/app/components/document-list/document-list.component.html + 175 + + Sort by added date + + + Added + + src/app/components/document-list/document-list.component.html + 179 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 69 + + + src/app/services/rest/document.service.ts + 23 + + Added + + + Edit document + + src/app/components/document-list/document-list.component.html + 198 + + Edit document + + + View "" saved successfully. + + src/app/components/document-list/document-list.component.ts + 205 + + View "" saved successfully. + + + View "" created successfully. + + src/app/components/document-list/document-list.component.ts + 246 + + View "" created successfully. + + + Reset filters + + src/app/components/document-list/filter-editor/filter-editor.component.html + 82 + + Reset filters + + + Correspondent: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 108,110 + + Correspondent: + + + Without correspondent + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 112 + + Without correspondent + + + Type: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 117,119 + + Type: + + + Without document type + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 121 + + Without document type + + + Tag: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 125,127 + + Tag: + + + Without any tag + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 131 + + Without any tag + + + Title: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 135 + + Title: + + + ASN: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 138 + + ASN: + + + Title & content + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 175 + + Title & content + + + Advanced search + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 180 + + Advanced search + + + More like + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 186 + + More like + + + equals + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 205 + + equals + + + is empty + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 209 + + is empty + + + is not empty + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 213 + + is not empty + + + greater than + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 217 + + greater than + + + less than + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 221 + + less than + + + Save current view + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 3 + + Save current view + + + Show in sidebar + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 9 + + + src/app/components/manage/settings/settings.component.html + 216 + + Show in sidebar + + + Show on dashboard + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 10 + + + src/app/components/manage/settings/settings.component.html + 212 + + Show on dashboard + + + Filter rules error occurred while saving this view + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 12 + + Filter rules error occurred while saving this view + + + The error returned was + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 13 + + The error returned was + + + Enter note + + src/app/components/document-notes/document-notes.component.html + 4 + + Enter note + + + Please enter a note. + + src/app/components/document-notes/document-notes.component.html + 5,7 + + Please enter a note. + + + Add note + + src/app/components/document-notes/document-notes.component.html + 11 + + Add note + + + Delete note + + src/app/components/document-notes/document-notes.component.html + 21 + + + src/app/components/document-notes/document-notes.component.html + 25 + + Delete note + + + Error saving note: + + src/app/components/document-notes/document-notes.component.ts + 65 + + Error saving note: + + + Error deleting note: + + src/app/components/document-notes/document-notes.component.ts + 81 + + Error deleting note: + + + correspondent + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 39 + + correspondent + + + correspondents + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 40 + + correspondents + + + Last used + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 45 + + Last used + + + Do you really want to delete the correspondent ""? + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 55 + + Do you really want to delete the correspondent ""? + + + document type + + src/app/components/manage/document-type-list/document-type-list.component.ts + 36 + + document type + + + document types + + src/app/components/manage/document-type-list/document-type-list.component.ts + 37 + + document types + + + Do you really want to delete the document type ""? + + src/app/components/manage/document-type-list/document-type-list.component.ts + 44 + + Do you really want to delete the document type ""? + + + Create + + src/app/components/manage/management-list/management-list.component.html + 2 + + + src/app/components/manage/management-list/management-list.component.html + 2 + + + src/app/components/manage/management-list/management-list.component.html + 2 + + + src/app/components/manage/management-list/management-list.component.html + 2 + + Create + + + Filter by: + + src/app/components/manage/management-list/management-list.component.html + 8 + + + src/app/components/manage/management-list/management-list.component.html + 8 + + + src/app/components/manage/management-list/management-list.component.html + 8 + + + src/app/components/manage/management-list/management-list.component.html + 8 + + Filter by: + + + Matching + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + Matching + + + Document count + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + Document count + + + Filter Documents + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + Filter Documents + + + {VAR_PLURAL, plural, =1 {One } other { total }} + + src/app/components/manage/management-list/management-list.component.html + 74 + + + src/app/components/manage/management-list/management-list.component.html + 74 + + + src/app/components/manage/management-list/management-list.component.html + 74 + + + src/app/components/manage/management-list/management-list.component.html + 74 + + {VAR_PLURAL, plural, =1 {One } other { total }} + + + Automatic + + src/app/components/manage/management-list/management-list.component.ts + 100 + + + src/app/data/matching-model.ts + 15 + + Automatic + + + None + + src/app/components/manage/management-list/management-list.component.ts + 102 + + + src/app/data/matching-model.ts + 45 + + None + + + Error occurred while creating : . + + src/app/components/manage/management-list/management-list.component.ts + 143 + + + src/app/components/manage/management-list/management-list.component.ts + 154,156 + + Error occurred while creating : . + + + Successfully created . + + src/app/components/manage/management-list/management-list.component.ts + 148 + + Successfully created . + + + Error occurred while saving . + + src/app/components/manage/management-list/management-list.component.ts + 175,177 + + Error occurred while saving . + + + Successfully updated . + + src/app/components/manage/management-list/management-list.component.ts + 182 + + Successfully updated . + + + Error occurred while saving : . + + src/app/components/manage/management-list/management-list.component.ts + 188,190 + + Error occurred while saving : . + + + Do you really want to delete the ? + + src/app/components/manage/management-list/management-list.component.ts + 197 + + Do you really want to delete the ? + + + Associated documents will not be deleted. + + src/app/components/manage/management-list/management-list.component.ts + 212 + + Associated documents will not be deleted. + + + Error while deleting element: + + src/app/components/manage/management-list/management-list.component.ts + 225,227 + + Error while deleting element: + + + Start tour + + src/app/components/manage/settings/settings.component.html + 2 + + Start tour + + + Open Django Admin + + src/app/components/manage/settings/settings.component.html + 4 + + Open Django Admin + + + General + + src/app/components/manage/settings/settings.component.html + 15 + + General + + + Appearance + + src/app/components/manage/settings/settings.component.html + 18 + + Appearance + + + Display language + + src/app/components/manage/settings/settings.component.html + 22 + + Display language + + + You need to reload the page after applying a new language. + + src/app/components/manage/settings/settings.component.html + 30 + + You need to reload the page after applying a new language. + + + Date display + + src/app/components/manage/settings/settings.component.html + 37 + + Date display + + + Date format + + src/app/components/manage/settings/settings.component.html + 50 + + Date format + + + Short: + + src/app/components/manage/settings/settings.component.html + 56,57 + + Short: + + + Medium: + + src/app/components/manage/settings/settings.component.html + 60,61 + + Medium: + + + Long: + + src/app/components/manage/settings/settings.component.html + 64,65 + + Long: + + + Items per page + + src/app/components/manage/settings/settings.component.html + 72 + + Items per page + + + Document editor + + src/app/components/manage/settings/settings.component.html + 88 + + Document editor + + + Use PDF viewer provided by the browser + + src/app/components/manage/settings/settings.component.html + 92 + + Use PDF viewer provided by the browser + + + 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 + 92 + + This is usually faster for displaying large PDF documents, but it might not work on some browsers. + + + Sidebar + + src/app/components/manage/settings/settings.component.html + 99 + + Sidebar + + + Use 'slim' sidebar (icons only) + + src/app/components/manage/settings/settings.component.html + 103 + + Use 'slim' sidebar (icons only) + + + Dark mode + + src/app/components/manage/settings/settings.component.html + 110 + + Dark mode + + + Use system settings + + src/app/components/manage/settings/settings.component.html + 113 + + Use system settings + + + Enable dark mode + + src/app/components/manage/settings/settings.component.html + 114 + + Enable dark mode + + + Invert thumbnails in dark mode + + src/app/components/manage/settings/settings.component.html + 115 + + Invert thumbnails in dark mode + + + Theme Color + + src/app/components/manage/settings/settings.component.html + 121 + + Theme Color + + + Reset + + src/app/components/manage/settings/settings.component.html + 130 + + Reset + + + Update checking + + src/app/components/manage/settings/settings.component.html + 135 + + Update checking + + + Update checking works by pinging the public Github API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. + + src/app/components/manage/settings/settings.component.html + 140,142 + + Update checking works by pinging the public Github API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. + + + No tracking data is collected by the app in any way. + + src/app/components/manage/settings/settings.component.html + 144,146 + + No tracking data is collected by the app in any way. + + + Enable update checking + + src/app/components/manage/settings/settings.component.html + 146 + + Enable update checking + + + Note that for users of third-party containers e.g. linuxserver.io this notification may be 'ahead' of the current third-party release. + + src/app/components/manage/settings/settings.component.html + 146 + + Note that for users of third-party containers e.g. linuxserver.io this notification may be 'ahead' of the current third-party release. + + + Bulk editing + + src/app/components/manage/settings/settings.component.html + 150 + + Bulk editing + + + Show confirmation dialogs + + src/app/components/manage/settings/settings.component.html + 154 + + Show confirmation dialogs + + + Deleting documents will always ask for confirmation. + + src/app/components/manage/settings/settings.component.html + 154 + + Deleting documents will always ask for confirmation. + + + Apply on close + + src/app/components/manage/settings/settings.component.html + 155 + + Apply on close + + + Enable notes + + src/app/components/manage/settings/settings.component.html + 163 + + Enable notes + + + Notifications + + src/app/components/manage/settings/settings.component.html + 171 + + Notifications + + + Document processing + + src/app/components/manage/settings/settings.component.html + 174 + + Document processing + + + Show notifications when new documents are detected + + src/app/components/manage/settings/settings.component.html + 178 + + Show notifications when new documents are detected + + + Show notifications when document processing completes successfully + + src/app/components/manage/settings/settings.component.html + 179 + + Show notifications when document processing completes successfully + + + Show notifications when document processing fails + + src/app/components/manage/settings/settings.component.html + 180 + + Show notifications when document processing fails + + + Suppress notifications on dashboard + + src/app/components/manage/settings/settings.component.html + 181 + + Suppress notifications on dashboard + + + This will suppress all messages about document processing status on the dashboard. + + src/app/components/manage/settings/settings.component.html + 181 + + This will suppress all messages about document processing status on the dashboard. + + + Show warning when closing saved views with unsaved changes + + src/app/components/manage/settings/settings.component.html + 195 + + Show warning when closing saved views with unsaved changes + + + Appears on + + src/app/components/manage/settings/settings.component.html + 209 + + Appears on + + + No saved views defined. + + src/app/components/manage/settings/settings.component.html + 226 + + No saved views defined. + + + Mail + + src/app/components/manage/settings/settings.component.html + 240,239 + + Mail + + + Mail accounts + + src/app/components/manage/settings/settings.component.html + 245 + + Mail accounts + + + Add Account + + src/app/components/manage/settings/settings.component.html + 250 + + Add Account + + + Server + + src/app/components/manage/settings/settings.component.html + 258 + + Server + + + No mail accounts defined. + + src/app/components/manage/settings/settings.component.html + 276 + + No mail accounts defined. + + + Mail rules + + src/app/components/manage/settings/settings.component.html + 282 + + Mail rules + + + Add Rule + + src/app/components/manage/settings/settings.component.html + 287 + + Add Rule + + + No mail rules defined. + + src/app/components/manage/settings/settings.component.html + 313 + + No mail rules defined. + + + Users & Groups + + src/app/components/manage/settings/settings.component.html + 327 + + Users & Groups + + + Users + + src/app/components/manage/settings/settings.component.html + 332 + + Users + + + Add User + + src/app/components/manage/settings/settings.component.html + 337 + + Add User + + + Add Group + + src/app/components/manage/settings/settings.component.html + 372 + + Add Group + + + Saved view "" deleted. + + src/app/components/manage/settings/settings.component.ts + 475 + + Saved view "" deleted. + + + Settings saved + + src/app/components/manage/settings/settings.component.ts + 577 + + Settings saved + + + Settings were saved successfully. + + src/app/components/manage/settings/settings.component.ts + 578 + + Settings were saved successfully. + + + Settings were saved successfully. Reload is required to apply some changes. + + src/app/components/manage/settings/settings.component.ts + 582 + + Settings were saved successfully. Reload is required to apply some changes. + + + Reload now + + src/app/components/manage/settings/settings.component.ts + 583 + + Reload now + + + Use system language + + src/app/components/manage/settings/settings.component.ts + 601 + + Use system language + + + Use date format of display language + + src/app/components/manage/settings/settings.component.ts + 608 + + Use date format of display language + + + Error while storing settings on server: + + src/app/components/manage/settings/settings.component.ts + 628,630 + + Error while storing settings on server: + + + Password has been changed, you will be logged out momentarily. + + src/app/components/manage/settings/settings.component.ts + 659 + + Password has been changed, you will be logged out momentarily. + + + Saved user "". + + src/app/components/manage/settings/settings.component.ts + 666 + + Saved user "". + + + Error saving user: . + + src/app/components/manage/settings/settings.component.ts + 676 + + Error saving user: . + + + Confirm delete user account + + src/app/components/manage/settings/settings.component.ts + 686 + + Confirm delete user account + + + This operation will permanently delete this user account. + + src/app/components/manage/settings/settings.component.ts + 687 + + This operation will permanently delete this user account. + + + Deleted user + + src/app/components/manage/settings/settings.component.ts + 696 + + Deleted user + + + Error deleting user: . + + src/app/components/manage/settings/settings.component.ts + 704 + + Error deleting user: . + + + Saved group "". + + src/app/components/manage/settings/settings.component.ts + 722 + + Saved group "". + + + Error saving group: . + + src/app/components/manage/settings/settings.component.ts + 730 + + Error saving group: . + + + Confirm delete user group + + src/app/components/manage/settings/settings.component.ts + 740 + + Confirm delete user group + + + This operation will permanently delete this user group. + + src/app/components/manage/settings/settings.component.ts + 741 + + This operation will permanently delete this user group. + + + Deleted group + + src/app/components/manage/settings/settings.component.ts + 750 + + Deleted group + + + Error deleting group: . + + src/app/components/manage/settings/settings.component.ts + 758 + + Error deleting group: . + + + Saved account "". + + src/app/components/manage/settings/settings.component.ts + 781 + + Saved account "". + + + Error saving account: . + + src/app/components/manage/settings/settings.component.ts + 791 + + Error saving account: . + + + Confirm delete mail account + + src/app/components/manage/settings/settings.component.ts + 801 + + Confirm delete mail account + + + This operation will permanently delete this mail account. + + src/app/components/manage/settings/settings.component.ts + 802 + + This operation will permanently delete this mail account. + + + Deleted mail account + + src/app/components/manage/settings/settings.component.ts + 811 + + Deleted mail account + + + Error deleting mail account: . + + src/app/components/manage/settings/settings.component.ts + 820 + + Error deleting mail account: . + + + Saved rule "". + + src/app/components/manage/settings/settings.component.ts + 839 + + Saved rule "". + + + Error saving rule: . + + src/app/components/manage/settings/settings.component.ts + 850 + + Error saving rule: . + + + Confirm delete mail rule + + src/app/components/manage/settings/settings.component.ts + 860 + + Confirm delete mail rule + + + This operation will permanently delete this mail rule. + + src/app/components/manage/settings/settings.component.ts + 861 + + This operation will permanently delete this mail rule. + + + Deleted mail rule + + src/app/components/manage/settings/settings.component.ts + 870 + + Deleted mail rule + + + Error deleting mail rule: . + + src/app/components/manage/settings/settings.component.ts + 879 + + Error deleting mail rule: . + + + storage path + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 36 + + storage path + + + storage paths + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 37 + + storage paths + + + Do you really want to delete the storage path ""? + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 52 + + Do you really want to delete the storage path ""? + + + tag + + src/app/components/manage/tag-list/tag-list.component.ts + 36 + + tag + + + tags + + src/app/components/manage/tag-list/tag-list.component.ts + 37 + + tags + + + Do you really want to delete the tag ""? + + src/app/components/manage/tag-list/tag-list.component.ts + 53 + + Do you really want to delete the tag ""? + + + Clear selection + + src/app/components/manage/tasks/tasks.component.html + 6 + + Clear selection + + + Refresh + + src/app/components/manage/tasks/tasks.component.html + 20 + + Refresh + + + Results + + src/app/components/manage/tasks/tasks.component.html + 42 + + Results + + + click for full output + + src/app/components/manage/tasks/tasks.component.html + 66 + + click for full output + + + Dismiss + + src/app/components/manage/tasks/tasks.component.html + 81 + + + src/app/components/manage/tasks/tasks.component.ts + 62 + + Dismiss + + + Open Document + + src/app/components/manage/tasks/tasks.component.html + 87 + + Open Document + + + Failed  + + src/app/components/manage/tasks/tasks.component.html + 105 + + Failed  + + + Complete  + + src/app/components/manage/tasks/tasks.component.html + 111 + + Complete  + + + Started  + + src/app/components/manage/tasks/tasks.component.html + 117 + + Started  + + + Queued  + + src/app/components/manage/tasks/tasks.component.html + 123 + + Queued  + + + Dismiss selected + + src/app/components/manage/tasks/tasks.component.ts + 26 + + Dismiss selected + + + Dismiss all + + src/app/components/manage/tasks/tasks.component.ts + 27 + + + src/app/components/manage/tasks/tasks.component.ts + 60 + + Dismiss all + + + Confirm Dismiss All + + src/app/components/manage/tasks/tasks.component.ts + 58 + + Confirm Dismiss All + + + tasks? + + src/app/components/manage/tasks/tasks.component.ts + 60 + + tasks? + + + 404 Not Found + + src/app/components/not-found/not-found.component.html + 7 + + 404 Not Found + + + Auto: Learn matching automatically + + src/app/data/matching-model.ts + 16 + + Auto: Learn matching automatically + + + Any word + + src/app/data/matching-model.ts + 20 + + Any word + + + Any: Document contains any of these words (space separated) + + src/app/data/matching-model.ts + 21 + + Any: Document contains any of these words (space separated) + + + All words + + src/app/data/matching-model.ts + 25 + + All words + + + All: Document contains all of these words (space separated) + + src/app/data/matching-model.ts + 26 + + All: Document contains all of these words (space separated) + + + Exact match + + src/app/data/matching-model.ts + 30 + + Exact match + + + Exact: Document contains this string + + src/app/data/matching-model.ts + 31 + + Exact: Document contains this string + + + Regular expression + + src/app/data/matching-model.ts + 35 + + Regular expression + + + Regular expression: Document matches this regular expression + + src/app/data/matching-model.ts + 36 + + Regular expression: Document matches this regular expression + + + Fuzzy word + + src/app/data/matching-model.ts + 40 + + Fuzzy word + + + Fuzzy: Document contains a word similar to this word + + src/app/data/matching-model.ts + 41 + + Fuzzy: Document contains a word similar to this word + + + None: Disable matching + + src/app/data/matching-model.ts + 46 + + None: Disable matching + + + Warning: You have unsaved changes to your document(s). + + src/app/guards/dirty-doc.guard.ts + 17 + + Warning: You have unsaved changes to your document(s). + + + Unsaved Changes + + src/app/guards/dirty-form.guard.ts + 17 + + + src/app/guards/dirty-saved-view.guard.ts + 32 + + + src/app/services/open-documents.service.ts + 104 + + + src/app/services/open-documents.service.ts + 131 + + Unsaved Changes + + + You have unsaved changes. + + src/app/guards/dirty-form.guard.ts + 18 + + + src/app/services/open-documents.service.ts + 132 + + You have unsaved changes. + + + Are you sure you want to leave? + + src/app/guards/dirty-form.guard.ts + 19 + + Are you sure you want to leave? + + + Leave page + + src/app/guards/dirty-form.guard.ts + 21 + + Leave page + + + You have unsaved changes to the saved view + + src/app/guards/dirty-saved-view.guard.ts + 34 + + You have unsaved changes to the saved view + + + Are you sure you want to close this saved view? + + src/app/guards/dirty-saved-view.guard.ts + 38 + + Are you sure you want to close this saved view? + + + Save and close + + src/app/guards/dirty-saved-view.guard.ts + 42 + + Save and close + + + You don't have permissions to do that + + src/app/guards/permissions.guard.ts + 35 + + You don't have permissions to do that + + + (no title) + + src/app/pipes/document-title.pipe.ts + 11 + + (no title) + + + Yes + + src/app/pipes/yes-no.pipe.ts + 8 + + Yes + + + No + + src/app/pipes/yes-no.pipe.ts + 8 + + No + + + Document already exists. + + src/app/services/consumer-status.service.ts + 15 + + Document already exists. + + + Document with ASN already exists. + + src/app/services/consumer-status.service.ts + 16 + + Document with ASN already exists. + + + File not found. + + src/app/services/consumer-status.service.ts + 17 + + File not found. + + + Pre-consume script does not exist. + + src/app/services/consumer-status.service.ts + 18 + + Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Pre-consume script does not exist. + + + Error while executing pre-consume script. + + src/app/services/consumer-status.service.ts + 19 + + Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Error while executing pre-consume script. + + + Post-consume script does not exist. + + src/app/services/consumer-status.service.ts + 20 + + Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Post-consume script does not exist. + + + Error while executing post-consume script. + + src/app/services/consumer-status.service.ts + 21 + + Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Error while executing post-consume script. + + + Received new file. + + src/app/services/consumer-status.service.ts + 22 + + Received new file. + + + File type not supported. + + src/app/services/consumer-status.service.ts + 23 + + File type not supported. + + + Processing document... + + src/app/services/consumer-status.service.ts + 24 + + Processing document... + + + Generating thumbnail... + + src/app/services/consumer-status.service.ts + 25 + + Generating thumbnail... + + + Retrieving date from document... + + src/app/services/consumer-status.service.ts + 26 + + Retrieving date from document... + + + Saving document... + + src/app/services/consumer-status.service.ts + 27 + + Saving document... + + + Finished. + + src/app/services/consumer-status.service.ts + 28 + + Finished. + + + You have unsaved changes to the document + + src/app/services/open-documents.service.ts + 106 + + You have unsaved changes to the document + + + Are you sure you want to close this document? + + src/app/services/open-documents.service.ts + 110 + + Are you sure you want to close this document? + + + Close document + + src/app/services/open-documents.service.ts + 112 + + Close document + + + Are you sure you want to close all documents? + + src/app/services/open-documents.service.ts + 133 + + Are you sure you want to close all documents? + + + Close documents + + src/app/services/open-documents.service.ts + 135 + + Close documents + + + Modified + + src/app/services/rest/document.service.ts + 24 + + Modified + + + Search score + + src/app/services/rest/document.service.ts + 32 + + Score is a value returned by the full text search engine and specifies how well a result matches the given query + Search score + + + English (US) + + src/app/services/settings.service.ts + 159 + + English (US) + + + Arabic + + src/app/services/settings.service.ts + 165 + + Arabic + + + Belarusian + + src/app/services/settings.service.ts + 171 + + Belarusian + + + Catalan + + src/app/services/settings.service.ts + 177 + + Catalan + + + Czech + + src/app/services/settings.service.ts + 183 + + Czech + + + Danish + + src/app/services/settings.service.ts + 189 + + Danish + + + German + + src/app/services/settings.service.ts + 195 + + German + + + English (GB) + + src/app/services/settings.service.ts + 201 + + English (GB) + + + Spanish + + src/app/services/settings.service.ts + 207 + + Spanish + + + Finnish + + src/app/services/settings.service.ts + 213 + + Finnish + + + French + + src/app/services/settings.service.ts + 219 + + French + + + Italian + + src/app/services/settings.service.ts + 225 + + Italian + + + Luxembourgish + + src/app/services/settings.service.ts + 231 + + Luxembourgish + + + Dutch + + src/app/services/settings.service.ts + 237 + + Dutch + + + Polish + + src/app/services/settings.service.ts + 243 + + Polish + + + Portuguese (Brazil) + + src/app/services/settings.service.ts + 249 + + Portuguese (Brazil) + + + Portuguese + + src/app/services/settings.service.ts + 255 + + Portuguese + + + Romanian + + src/app/services/settings.service.ts + 261 + + Romanian + + + Russian + + src/app/services/settings.service.ts + 267 + + Russian + + + Slovenian + + src/app/services/settings.service.ts + 273 + + Slovenian + + + Serbian + + src/app/services/settings.service.ts + 279 + + Serbian + + + Swedish + + src/app/services/settings.service.ts + 285 + + Swedish + + + Turkish + + src/app/services/settings.service.ts + 291 + + Turkish + + + Chinese Simplified + + src/app/services/settings.service.ts + 297 + + Chinese Simplified + + + ISO 8601 + + src/app/services/settings.service.ts + 314 + + ISO 8601 + + + Successfully completed one-time migratration of settings to the database! + + src/app/services/settings.service.ts + 425 + + Successfully completed one-time migratration of settings to the database! + + + Unable to migrate settings to the database, please try saving manually. + + src/app/services/settings.service.ts + 426 + + Unable to migrate settings to the database, please try saving manually. + + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 500 + + You can restart the tour from the settings page. + + + Information + + src/app/services/toast.service.ts + 43 + + Information + + + Connecting... + + src/app/services/upload-documents.service.ts + 33 + + Connecting... + + + Uploading... + + src/app/services/upload-documents.service.ts + 45 + + Uploading... + + + Upload complete, waiting... + + src/app/services/upload-documents.service.ts + 48 + + Upload complete, waiting... + + + HTTP error: + + src/app/services/upload-documents.service.ts + 64 + + HTTP error: + + + + From 3c4dadd905ed9462466e98e105c5bd09d4743952 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 3 May 2023 19:37:36 -0700 Subject: [PATCH 048/103] Re-work filter editor, bulk editor & reset buttons --- .../app-frame/app-frame.component.html | 6 ++-- .../date-dropdown.component.html | 22 ++++++------ .../toggleable-dropdown-button.component.html | 12 +++---- ...permissions-filter-dropdown.component.html | 29 +++++++-------- .../bulk-editor/bulk-editor.component.html | 35 +++++++++---------- .../document-list.component.html | 15 +++++--- .../document-list/document-list.component.ts | 4 +++ .../filter-editor.component.html | 35 +++++++++---------- .../management-list.component.html | 6 ++-- .../manage/settings/settings.component.html | 4 +-- src-ui/src/styles.scss | 10 +++++- src-ui/src/theme.scss | 4 +++ src/documents/index.py | 2 +- src/documents/tests/test_api.py | 6 ++-- 14 files changed, 104 insertions(+), 86 deletions(-) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html index be0240eb5..83fe13d81 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.html +++ b/src-ui/src/app/components/app-frame/app-frame.component.html @@ -18,8 +18,8 @@ @@ -107,7 +107,7 @@  {{d.title | documentTitle}} - + diff --git a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html index 40bce985d..05547fed6 100644 --- a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html +++ b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.html @@ -7,9 +7,9 @@
@@ -18,8 +18,8 @@
After
- - + + Clear @@ -29,8 +29,8 @@
@@ -41,8 +41,8 @@
Before
- - + + Clear @@ -52,8 +52,8 @@
diff --git a/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html b/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html index af935b0db..45c6240e4 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html +++ b/src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html @@ -1,18 +1,18 @@