From f67418359329972b6af8a418f443ae29b234ee72 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 4 Dec 2023 17:13:00 -0800 Subject: [PATCH] Squashed commit of the following: commit 80ff5677eacec9271f342525155c250d9245c54c Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon Dec 4 06:40:17 2023 -0800 Fix: bulk edit object permissions should use permissions object (#4797) commit 62c417cd5189be0b93e3c0529326609f9d1e4f40 Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com> Date: Sun Dec 3 19:09:02 2023 -0800 Fixes the 0023 migration to include the new help text and verbose name commit f27f25aa03d032ad7ca6a5f2ba41f83bd00c0bd7 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun Dec 3 15:35:30 2023 -0800 Enhancement: support assigning custom fields via consumption templates (#4727) commit 285a4b5aef0aa4676ee66751a381e77a9e9fcdcf Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun Dec 3 12:57:43 2023 -0800 Fix: empty strings for consumption template fields should be treated as None (#4762) commit 47a2ded30d7e77f2a264b187821af001232ce3d5 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat Dec 2 16:52:48 2023 -0800 Fix: use default permissions for objects created via dropdown (#4778) commit 5b502b1e1a34528b59a0af0a01e73a1f9e7c0656 Author: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Sat Dec 2 16:18:06 2023 -0800 Use the original image file for the checksum, not the maybe alpha removed version (#4781) commit aff56077a8ac4d4ec78860d52b824961fada847b Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat Dec 2 08:26:42 2023 -0800 Feature: update user profile (#4678) commit 6e371ac5ac2227a6bdef5e15483f5b478ba78c4d Author: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Sat Dec 2 08:26:19 2023 -0800 Enhancement: Allow excluding mail attachments by name (#4691) * Adds new filtering to exclude attachments from processing * Frontend use include / exclude mail rule filename filters --------- Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> commit 1b69b89d2dd4ec021aa6e3bceb175340cdd4e0ff Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat Dec 2 08:24:17 2023 -0800 Chore: Remove unneeded .env entry, revert crowdin action rm, reduce frequency commit 5a20c8e512a7c8a45c26eed5f9e0cf3b1bb04661 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat Dec 2 07:56:56 2023 -0800 Fix version checker GitHub api url (#4773) commit 4ca1503beb1c65eb4f77ac992b4b3ea74fbc6fd4 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat Dec 2 07:47:57 2023 -0800 Fix: Limit global drag-drop to events with files (#4767) commit 20f27fe32ffe144813d6c69e3326bf230a2da52a Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri Dec 1 18:05:43 2023 -0800 Remove the pngx .env file for crowdin action commit 1a50d6bb8624a3dd419cadb48e4ee5416fd46ce6 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 2 02:04:16 2023 +0000 Bump the actions group with 2 updates (#4745) Bumps the actions group with 2 updates: [actions/github-script](https://github.com/actions/github-script) and [stumpylog/image-cleaner-action](https://github.com/stumpylog/image-cleaner-action). Updates `actions/github-script` from 6 to 7 - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v6...v7) Updates `stumpylog/image-cleaner-action` from 0.3.0 to 0.4.0 - [Release notes](https://github.com/stumpylog/image-cleaner-action/releases) - [Changelog](https://github.com/stumpylog/image-cleaner-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/stumpylog/image-cleaner-action/compare/v0.3.0...v0.4.0) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: stumpylog/image-cleaner-action dependency-type: direct:production update-type: version-update:semver-minor dependency-group: actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 0b16c2db0372535d18e75267f0a26e4d7f4c812a Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri Dec 1 17:54:00 2023 -0800 Update crowdin action triggers commit 76ac8883865e123bb48f80336cc0658f7d913249 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri Dec 1 17:44:33 2023 -0800 Chore: Implement crowdin GHA (#4706) commit 7cfa05d7f2c63d2a1c25eb4e0b54ad3a52726a59 Author: Paperless-ngx Bot [bot] <99855517+paperlessngx-bot@users.noreply.github.com> Date: Fri Dec 1 17:44:05 2023 -0800 New Crowdin updates (#4729) commit e3496d04858337a193b623fabc8cc49ec0dc08cf Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 2 01:07:13 2023 +0000 Bump the frontend-eslint-dependencies group in /src-ui with 3 updates (#4756) Bumps the frontend-eslint-dependencies group in /src-ui with 3 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) and [eslint](https://github.com/eslint/eslint). Updates `@typescript-eslint/eslint-plugin` from 6.9.1 to 6.13.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.13.1/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.9.1 to 6.13.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.13.1/packages/parser) Updates `eslint` from 8.52.0 to 8.55.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.52.0...v8.55.0) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-eslint-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-eslint-dependencies - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-eslint-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit d2c33c00746ecc4ceba35a1ce5339354fdbf20ea Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 2 00:58:27 2023 +0000 Bump the frontend-jest-dependencies group in /src-ui with 2 updates (#4744) Bumps the frontend-jest-dependencies group in /src-ui with 2 updates: [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) and [jest-preset-angular](https://github.com/thymikee/jest-preset-angular). Updates `@types/jest` from 29.5.7 to 29.5.10 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest) Updates `jest-preset-angular` from 13.1.2 to 13.1.4 - [Release notes](https://github.com/thymikee/jest-preset-angular/releases) - [Changelog](https://github.com/thymikee/jest-preset-angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/thymikee/jest-preset-angular/compare/v13.1.2...v13.1.4) --- updated-dependencies: - dependency-name: "@types/jest" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-jest-dependencies - dependency-name: jest-preset-angular dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-jest-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 9c5caecafadc6f28e414117ba7be329243863608 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 2 00:49:46 2023 +0000 Bump @playwright/test from 1.39.0 to 1.40.1 in /src-ui (#4749) Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.39.0 to 1.40.1. - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.39.0...v1.40.1) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 64651d5a8424488ad4878bb61098376c550d892e Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 2 00:38:35 2023 +0000 Bump wait-on from 7.0.1 to 7.2.0 in /src-ui (#4747) Bumps [wait-on](https://github.com/jeffbski/wait-on) from 7.0.1 to 7.2.0. - [Release notes](https://github.com/jeffbski/wait-on/releases) - [Commits](https://github.com/jeffbski/wait-on/compare/v7.0.1...v7.2.0) --- updated-dependencies: - dependency-name: wait-on dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 4493236879bcc70aa3e4b6be769a543d9ada239d Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Dec 1 16:28:50 2023 -0800 Bump @types/node from 20.8.10 to 20.10.2 in /src-ui (#4748) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.8.10 to 20.10.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit ce643942ea4f2635a13c22e34a933b254647d560 Author: omahs <73983677+omahs@users.noreply.github.com> Date: Fri Dec 1 15:55:03 2023 +0100 Documentation: Fix typos (#4737) commit 46d216b02f35abb5fdbed0539984b8d262192e01 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu Nov 30 23:14:59 2023 -0800 Remove project actions in favor of GH workflows commit 133d43ae3057bceb56cbedaf96742ce62c0d7930 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu Nov 30 19:08:03 2023 -0800 Enhancement: auto-refresh logs & tasks (#4680) commit 27155cb7e3230a6909ff9b339e41bf423fb08e64 Author: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu Nov 30 17:12:14 2023 -0800 Fixes the image cleaner not running for the registry cache (#4732) commit 69be86e16c956e2129baef318e76a5f4cadf8b7a Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com> Date: Thu Nov 30 07:11:46 2023 -0800 Resets version string to 2.0.1-dev commit 65f6b0881ea2dce37a9c8b8ee079278e4fd81865 Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com> Date: Thu Nov 30 07:11:00 2023 -0800 Bumps version to 2.0.1 commit c2bede40c7094e46f49640790cf2267bd273dadd Merge: 6575c6940 33c2398de Author: Trenton Holmes <797416+stumpylog@users.noreply.github.com> Date: Thu Nov 30 07:10:29 2023 -0800 Merge remote-tracking branch 'origin/dev' commit 33c2398de949dd4ee97b08736e5964efab2fcc01 Author: Paperless-ngx Bot [bot] <99855517+paperlessngx-bot@users.noreply.github.com> Date: Thu Nov 30 07:08:10 2023 -0800 New Crowdin updates (#4695) commit 64cfc43891fbc7da692c138e73922d45b2e12c8c Author: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu Nov 30 07:00:54 2023 -0800 Inreases the length to 5, allowing for commas as well as values (#4719) commit 6575c69409afeb68f70fd602832e15c9d0701bc2 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed Nov 29 21:56:05 2023 -0800 Fix: restore docs search commit e3f4e0b77572a9a784f748a79aa78c25388fb77c Author: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Wed Nov 29 12:18:44 2023 -0800 Adds new setting to control color conversions (#4709) commit 5be89bfda5228e19351387351b27ece458528317 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Nov 29 11:50:30 2023 -0800 Changelog v2.0.0 - GHA (#4693) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> commit e1b573adeb3f9b644fb51bd9359b51922df10732 Author: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Wed Nov 29 11:28:27 2023 -0800 Fix: Add a warning about a low image DPI which may cause OCR to fail (#4708) commit 0913c7aa9efbd071bd5c423b5d5de5cf12617185 Author: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed Nov 29 11:10:55 2023 -0800 Fix: share links for URLs containing 'api' incorrect in dropdown (#4701) --- .env | 1 - .github/workflows/ci.yml | 2 +- .github/workflows/cleanup-tags.yml | 25 +- .github/workflows/crowdin.yml | 33 ++ .github/workflows/project-actions.yml | 30 -- crowdin.yml | 8 +- docs/administration.md | 6 +- docs/advanced_usage.md | 4 +- docs/api.md | 7 +- docs/changelog.md | 274 +++++++++++++ docs/configuration.md | 14 + docs/development.md | 2 +- docs/faq.md | 2 +- docs/usage.md | 1 + mkdocs.yml | 1 + src-ui/messages.xlf | 375 ++++++++++++------ src-ui/package-lock.json | 212 +++++----- src-ui/package.json | 16 +- src-ui/src/app/app.module.ts | 2 + .../components/admin/logs/logs.component.html | 13 +- .../admin/logs/logs.component.spec.ts | 20 +- .../components/admin/logs/logs.component.ts | 14 + .../admin/tasks/tasks.component.html | 15 +- .../admin/tasks/tasks.component.spec.ts | 18 +- .../components/admin/tasks/tasks.component.ts | 14 + .../users-groups/users-groups.component.ts | 2 +- .../app-frame/app-frame.component.html | 5 + .../app-frame/app-frame.component.spec.ts | 15 +- .../app-frame/app-frame.component.ts | 10 + ...mption-template-edit-dialog.component.html | 1 + ...ion-template-edit-dialog.component.spec.ts | 10 + ...sumption-template-edit-dialog.component.ts | 12 +- .../edit-dialog/edit-dialog.component.spec.ts | 1 + .../edit-dialog/edit-dialog.component.ts | 6 +- .../mail-rule-edit-dialog.component.html | 3 +- .../mail-rule-edit-dialog.component.ts | 3 +- .../input/password/password.component.html | 11 +- .../input/password/password.component.spec.ts | 23 ++ .../input/password/password.component.ts | 31 +- .../common/input/tags/tags.component.spec.ts | 8 +- .../common/input/text/text.component.html | 2 +- .../common/input/text/text.component.ts | 5 +- .../permissions-dialog.component.spec.ts | 11 +- .../permissions-dialog.component.ts | 13 +- .../profile-edit-dialog.component.html | 56 +++ .../profile-edit-dialog.component.scss | 9 + .../profile-edit-dialog.component.spec.ts | 222 +++++++++++ .../profile-edit-dialog.component.ts | 184 +++++++++ .../share-links-dropdown.component.spec.ts | 20 + .../share-links-dropdown.component.ts | 5 +- .../document-detail.component.spec.ts | 1 + .../file-drop/file-drop.component.spec.ts | 12 +- .../file-drop/file-drop.component.ts | 5 +- .../data/paperless-consumption-template.ts | 2 + src-ui/src/app/data/paperless-mail-rule.ts | 4 +- src-ui/src/app/data/user-profile.ts | 7 + .../src/app/services/profile.service.spec.ts | 54 +++ src-ui/src/app/services/profile.service.ts | 34 ++ .../services/rest/mail-rule.service.spec.ts | 9 +- src-ui/src/environments/environment.prod.ts | 2 +- src-ui/src/locale/messages.af_ZA.xlf | 74 ++-- src-ui/src/locale/messages.ar_AR.xlf | 74 ++-- src-ui/src/locale/messages.be_BY.xlf | 74 ++-- src-ui/src/locale/messages.bg_BG.xlf | 74 ++-- src-ui/src/locale/messages.ca_ES.xlf | 74 ++-- src-ui/src/locale/messages.cs_CZ.xlf | 74 ++-- src-ui/src/locale/messages.da_DK.xlf | 74 ++-- src-ui/src/locale/messages.de_DE.xlf | 76 ++-- src-ui/src/locale/messages.el_GR.xlf | 74 ++-- src-ui/src/locale/messages.es_ES.xlf | 74 ++-- src-ui/src/locale/messages.fi_FI.xlf | 74 ++-- src-ui/src/locale/messages.fr_FR.xlf | 102 ++--- src-ui/src/locale/messages.he_IL.xlf | 74 ++-- src-ui/src/locale/messages.hr_HR.xlf | 74 ++-- src-ui/src/locale/messages.hu_HU.xlf | 92 ++--- src-ui/src/locale/messages.id_ID.xlf | 74 ++-- src-ui/src/locale/messages.it_IT.xlf | 74 ++-- src-ui/src/locale/messages.ko_KR.xlf | 74 ++-- src-ui/src/locale/messages.lb_LU.xlf | 74 ++-- src-ui/src/locale/messages.lv_LV.xlf | 74 ++-- src-ui/src/locale/messages.nl_NL.xlf | 244 ++++++------ src-ui/src/locale/messages.no_NO.xlf | 74 ++-- src-ui/src/locale/messages.pl_PL.xlf | 74 ++-- src-ui/src/locale/messages.pt_BR.xlf | 74 ++-- src-ui/src/locale/messages.pt_PT.xlf | 74 ++-- src-ui/src/locale/messages.ro_RO.xlf | 74 ++-- src-ui/src/locale/messages.ru_RU.xlf | 74 ++-- src-ui/src/locale/messages.sk_SK.xlf | 74 ++-- src-ui/src/locale/messages.sl_SI.xlf | 74 ++-- src-ui/src/locale/messages.sr_CS.xlf | 74 ++-- src-ui/src/locale/messages.sv_SE.xlf | 74 ++-- src-ui/src/locale/messages.th_TH.xlf | 74 ++-- src-ui/src/locale/messages.tr_TR.xlf | 74 ++-- src-ui/src/locale/messages.uk_UA.xlf | 74 ++-- src-ui/src/locale/messages.vi_VN.xlf | 78 ++-- src-ui/src/locale/messages.zh_CN.xlf | 74 ++-- src-ui/src/locale/messages.zh_TW.xlf | 74 ++-- src/documents/consumer.py | 53 ++- src/documents/data_models.py | 7 + .../1041_alter_consumptiontemplate_sources.py | 22 + ...onsumptiontemplate_assign_custom_fields.py | 23 ++ src/documents/models.py | 275 ++++++------- src/documents/parsers.py | 2 +- src/documents/serialisers.py | 18 +- src/documents/tasks.py | 1 + src/documents/tests/test_api.py | 59 ++- src/documents/tests/test_api_profile.py | 105 +++++ src/documents/tests/test_consumer.py | 24 ++ .../tests/test_consumption_templates.py | 14 +- src/documents/views.py | 4 +- src/locale/el_GR/LC_MESSAGES/django.po | 104 ++--- src/locale/hu_HU/LC_MESSAGES/django.po | 26 +- src/locale/pl_PL/LC_MESSAGES/django.po | 20 +- src/locale/ru_RU/LC_MESSAGES/django.po | 24 +- src/paperless/serialisers.py | 16 + src/paperless/settings.py | 5 + src/paperless/urls.py | 8 + src/paperless/version.py | 2 +- src/paperless/views.py | 54 +++ src/paperless_mail/admin.py | 3 +- src/paperless_mail/mail.py | 21 +- ...ule_filter_attachment_filename_and_more.py | 40 ++ src/paperless_mail/models.py | 16 +- src/paperless_mail/serialisers.py | 3 +- src/paperless_mail/tests/test_api.py | 16 +- src/paperless_mail/tests/test_mail.py | 81 +++- src/paperless_tesseract/parsers.py | 9 + 127 files changed, 3827 insertions(+), 2095 deletions(-) create mode 100644 .github/workflows/crowdin.yml create mode 100644 src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html create mode 100644 src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.scss create mode 100644 src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.spec.ts create mode 100644 src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts create mode 100644 src-ui/src/app/data/user-profile.ts create mode 100644 src-ui/src/app/services/profile.service.spec.ts create mode 100644 src-ui/src/app/services/profile.service.ts create mode 100644 src/documents/migrations/1041_alter_consumptiontemplate_sources.py create mode 100644 src/documents/migrations/1042_consumptiontemplate_assign_custom_fields.py create mode 100644 src/documents/tests/test_api_profile.py create mode 100644 src/paperless_mail/migrations/0023_remove_mailrule_filter_attachment_filename_and_more.py diff --git a/.env b/.env index 46f557886..0bd5be6ff 100644 --- a/.env +++ b/.env @@ -1,2 +1 @@ COMPOSE_PROJECT_NAME=paperless -export PROMPT="(pipenv-projectname)$P$G" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8fe34d40a..ad19726cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -643,7 +643,7 @@ jobs: git push origin ${{ needs.publish-release.outputs.version }}-changelog - name: Create Pull Request - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { repo, owner } = context.repo; diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml index 63eb5bf2c..5d3d0604c 100644 --- a/.github/workflows/cleanup-tags.yml +++ b/.github/workflows/cleanup-tags.yml @@ -19,9 +19,13 @@ concurrency: jobs: cleanup-images: - name: Cleanup Image Tags for paperless-ngx + name: Cleanup Image Tags for ${{ matrix.primary-name }} if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + primary-name: ["paperless-ngx", "paperless-ngx/builder/cache/app"] env: # Requires a personal access token with the OAuth scope delete:packages TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }} @@ -29,12 +33,12 @@ jobs: - name: Clean temporary images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/ephemeral@v0.3.0 + uses: stumpylog/image-cleaner-action/ephemeral@v0.4.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" is_org: "true" - package_name: "paperless-ngx" + package_name: "${{ matrix.primary-name }}" scheme: "branch" repo_name: "paperless-ngx" match_regex: "feature-" @@ -49,18 +53,7 @@ jobs: strategy: fail-fast: false matrix: - include: - - primary-name: "paperless-ngx" - - primary-name: "paperless-ngx/builder/cache/app" - # 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" + primary-name: ["paperless-ngx", "paperless-ngx/builder/cache/app"] env: # Requires a personal access token with the OAuth scope delete:packages TOKEN: ${{ secrets.GHA_CONTAINER_DELETE_TOKEN }} @@ -68,7 +61,7 @@ jobs: - name: Clean untagged images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/untagged@v0.3.0 + uses: stumpylog/image-cleaner-action/untagged@v0.4.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml new file mode 100644 index 000000000..11dc0b36a --- /dev/null +++ b/.github/workflows/crowdin.yml @@ -0,0 +1,33 @@ +name: Crowdin Action + +on: + workflow_dispatch: + schedule: + - cron: '2 */12 * * *' + push: + paths: [ + 'src/locale/**', + 'src-ui/src/locale/**' + ] + branches: [ dev ] + +jobs: + synchronize-with-crowdin: + name: Crowdin Sync + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: crowdin action + uses: crowdin/github-action@v1 + with: + upload_translations: false + download_translations: true + crowdin_branch_name: 'dev' + localization_branch_name: l10n_dev + pull_request_labels: 'skip-changelog, translation' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} diff --git a/.github/workflows/project-actions.yml b/.github/workflows/project-actions.yml index 6fa849652..16ef05de1 100644 --- a/.github/workflows/project-actions.yml +++ b/.github/workflows/project-actions.yml @@ -1,10 +1,6 @@ name: Project Automations on: - issues: - types: - - opened - - reopened pull_request_target: #_target allows access to secrets types: - opened @@ -16,25 +12,7 @@ on: permissions: contents: read -env: - todo: Todo - done: Done - in_progress: In Progress - jobs: - issue_opened_or_reopened: - name: issue_opened_or_reopened - runs-on: ubuntu-22.04 - if: github.event_name == 'issues' && (github.event.action == 'opened' || github.event.action == 'reopened') - steps: - - name: Add issue to project and set status to ${{ env.todo }} - uses: leonsteinhaeuser/project-beta-automations@v2.2.1 - with: - gh_token: ${{ secrets.GH_TOKEN }} - organization: paperless-ngx - project_id: 2 - resource_node_id: ${{ github.event.issue.node_id }} - status_value: ${{ env.todo }} # Target status pr_opened_or_reopened: name: pr_opened_or_reopened runs-on: ubuntu-22.04 @@ -43,14 +21,6 @@ jobs: pull-requests: write if: github.event_name == 'pull_request_target' && (github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request.user.login != 'dependabot' steps: - - name: Add PR to project and set status to "Needs Review" - uses: leonsteinhaeuser/project-beta-automations@v2.2.1 - with: - gh_token: ${{ secrets.GH_TOKEN }} - organization: paperless-ngx - project_id: 2 - resource_node_id: ${{ github.event.pull_request.node_id }} - status_value: "Needs Review" # Target status - name: Label PR with release-drafter uses: release-drafter/release-drafter@v5 env: diff --git a/crowdin.yml b/crowdin.yml index 0c5fc8c98..0118d6b6e 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,8 +1,6 @@ -commit_message: '[ci skip]' -pull_request_labels: [ - "skip-changelog", - "translation" -] +project_id_env: CROWDIN_PROJECT_ID +api_token_env: CROWDIN_PERSONAL_TOKEN +preserve_hierarchy: true files: - source: /src/locale/en_US/LC_MESSAGES/django.po translation: /src/locale/%locale_with_underscore%/LC_MESSAGES/django.po diff --git a/docs/administration.md b/docs/administration.md index c5659a94c..808d6afaf 100644 --- a/docs/administration.md +++ b/docs/administration.md @@ -34,7 +34,7 @@ Options available to docker installations: Paperless uses 4 volumes: - `paperless_media`: This is where your documents are stored. - - `paperless_data`: This is where auxillary data is stored. This + - `paperless_data`: This is where auxiliary data is stored. This folder also contains the SQLite database, if you use it. - `paperless_pgdata`: Exists only if you use PostgreSQL and contains the database. @@ -408,7 +408,7 @@ that don't match a document anymore get removed as well. ### Managing the Automatic matching algorithm The _Auto_ matching algorithm requires a trained neural network to work. -This network needs to be updated whenever somethings in your data +This network needs to be updated whenever something in your data changes. The docker image takes care of that automatically with the task scheduler. You can manually renew the classifier by invoking the following management command: @@ -597,7 +597,7 @@ This tool does a fuzzy match over document content, looking for those which look close according to a given ratio. At this time, other metadata (such as correspondent or type) is not -take into account by the detection. +taken into account by the detection. ``` document_fuzzy_match [--ratio] [--processes N] diff --git a/docs/advanced_usage.md b/docs/advanced_usage.md index ac8c1549d..ca5ed4321 100644 --- a/docs/advanced_usage.md +++ b/docs/advanced_usage.md @@ -510,7 +510,7 @@ existing tables) with: ## Barcodes {#barcodes} -Paperless is able to utilize barcodes for automatically preforming some tasks. +Paperless is able to utilize barcodes for automatically performing some tasks. At this time, the library utilized for detection of barcodes supports the following types: @@ -566,7 +566,7 @@ collating two separate scans into one document, reordering the pages as necessar Suppose you have a double-sided document with 6 pages (3 sheets of paper). First, put the stack into your ADF as normal, ensuring that page 1 is scanned first. Your ADF -will now scan pages 1, 3, and 5. Then you (or your the scanner, if it supports it) upload +will now scan pages 1, 3, and 5. Then you (or your scanner, if it supports it) upload the scan into the correct sub-directory of the consume folder (`double-sided` by default; keep in mind that Paperless will _not_ automatically create the directory for you.) Paperless will then process the scan and move it into an internal staging area. diff --git a/docs/api.md b/docs/api.md index 0eacd7913..8096b84e9 100644 --- a/docs/api.md +++ b/docs/api.md @@ -21,6 +21,7 @@ The API provides the following main endpoints: - `/api/groups/`: Full CRUD support. - `/api/share_links/`: Full CRUD support. - `/api/custom_fields/`: Full CRUD support. +- `/api/profile/`: GET, PATCH All of these endpoints except for the logging endpoint allow you to fetch (and edit and delete where appropriate) individual objects by @@ -157,6 +158,10 @@ The REST api provides three different forms of authentication. 3. Token authentication + You can create (or re-create) an API token by opening the "My Profile" + link in the user dropdown found in the web UI and clicking the circular + arrow button. + Paperless also offers an endpoint to acquire authentication tokens. POST a username and password as a form or json string to @@ -168,7 +173,7 @@ The REST api provides three different forms of authentication. Authorization: Token ``` - Tokens can be managed and revoked in the paperless admin. + Tokens can also be managed in the Django admin. ## Searching for documents diff --git a/docs/changelog.md b/docs/changelog.md index 7e9eb7a64..58ef26cd3 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,279 @@ # Changelog +## paperless-ngx 2.0.0 + +### Breaking Changes + +- Breaking: Rename the environment variable for self-signed email certificates [@stumpylog](https://github.com/stumpylog) ([#4346](https://github.com/paperless-ngx/paperless-ngx/pull/4346)) +- Breaking: Drop support for Python 3.8 [@stumpylog](https://github.com/stumpylog) ([#4156](https://github.com/paperless-ngx/paperless-ngx/pull/4156)) +- Breaking: Remove ARMv7 building of the Docker image [@stumpylog](https://github.com/stumpylog) ([#3973](https://github.com/paperless-ngx/paperless-ngx/pull/3973)) + +### Notable Changes + +- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) +- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) +- Enhancement: Updates the underlying image to use Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4150](https://github.com/paperless-ngx/paperless-ngx/pull/4150)) + +### Features + +- Feature: compact notifications [@shamoon](https://github.com/shamoon) ([#4545](https://github.com/paperless-ngx/paperless-ngx/pull/4545)) +- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) +- Feature: Hungarian translation [@shamoon](https://github.com/shamoon) ([#4552](https://github.com/paperless-ngx/paperless-ngx/pull/4552)) +- Chore: API support for id args for documents \& objects [@shamoon](https://github.com/shamoon) ([#4519](https://github.com/paperless-ngx/paperless-ngx/pull/4519)) +- Feature: Add Bulgarian translation [@shamoon](https://github.com/shamoon) ([#4470](https://github.com/paperless-ngx/paperless-ngx/pull/4470)) +- Feature: Audit Trail [@nanokatz](https://github.com/nanokatz) ([#4425](https://github.com/paperless-ngx/paperless-ngx/pull/4425)) +- Feature: Add ahead of time compression of the static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#4390](https://github.com/paperless-ngx/paperless-ngx/pull/4390)) +- Feature: sort sidebar views [@shamoon](https://github.com/shamoon) ([#4381](https://github.com/paperless-ngx/paperless-ngx/pull/4381)) +- Feature: Switches to a new client to handle communication with Gotenberg [@stumpylog](https://github.com/stumpylog) ([#4391](https://github.com/paperless-ngx/paperless-ngx/pull/4391)) +- barcode logic: strip non-numeric characters from detected ASN string [@queaker](https://github.com/queaker) ([#4379](https://github.com/paperless-ngx/paperless-ngx/pull/4379)) +- Feature: Include more updated base tools in Docker image [@stumpylog](https://github.com/stumpylog) ([#4319](https://github.com/paperless-ngx/paperless-ngx/pull/4319)) +- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) +- Feature: password reset [@shamoon](https://github.com/shamoon) ([#4289](https://github.com/paperless-ngx/paperless-ngx/pull/4289)) +- Enhancement: dashboard improvements, drag-n-drop reorder dashboard views [@shamoon](https://github.com/shamoon) ([#4252](https://github.com/paperless-ngx/paperless-ngx/pull/4252)) +- Feature: Updates Django to 4.2.5 [@stumpylog](https://github.com/stumpylog) ([#4278](https://github.com/paperless-ngx/paperless-ngx/pull/4278)) +- Enhancement: settings reorganization \& improvements, separate admin section [@shamoon](https://github.com/shamoon) ([#4251](https://github.com/paperless-ngx/paperless-ngx/pull/4251)) +- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) +- Enhancement: support default permissions for object creation via frontend [@shamoon](https://github.com/shamoon) ([#4233](https://github.com/paperless-ngx/paperless-ngx/pull/4233)) +- Fix: Set permissions before declaring volumes for rootless [@stumpylog](https://github.com/stumpylog) ([#4225](https://github.com/paperless-ngx/paperless-ngx/pull/4225)) +- Enhancement: bulk edit object permissions [@shamoon](https://github.com/shamoon) ([#4176](https://github.com/paperless-ngx/paperless-ngx/pull/4176)) +- Enhancement: Allow the user the specifiy the export zip file name [@stumpylog](https://github.com/stumpylog) ([#4189](https://github.com/paperless-ngx/paperless-ngx/pull/4189)) +- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) +- Chore: update docker image and ci to node 20 [@shamoon](https://github.com/shamoon) ([#4184](https://github.com/paperless-ngx/paperless-ngx/pull/4184)) +- Fix: Trim unneeded libraries from Docker image [@stumpylog](https://github.com/stumpylog) ([#4183](https://github.com/paperless-ngx/paperless-ngx/pull/4183)) +- Feature: New management command for fuzzy matching document content [@stumpylog](https://github.com/stumpylog) ([#4160](https://github.com/paperless-ngx/paperless-ngx/pull/4160)) +- Enhancement: Updates the underlying image to use Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4150](https://github.com/paperless-ngx/paperless-ngx/pull/4150)) +- Enhancement: frontend better handle slow backend requests [@shamoon](https://github.com/shamoon) ([#4055](https://github.com/paperless-ngx/paperless-ngx/pull/4055)) +- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) +- Enhancement: Improved error notifications [@shamoon](https://github.com/shamoon) ([#4062](https://github.com/paperless-ngx/paperless-ngx/pull/4062)) +- Feature: Official support for Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4146](https://github.com/paperless-ngx/paperless-ngx/pull/4146)) +- Enhancement: Add Afrikaans, Greek \& Norwegian languages [@shamoon](https://github.com/shamoon) ([#4088](https://github.com/paperless-ngx/paperless-ngx/pull/4088)) +- Enhancement: add task id to pre/post consume script as env [@andreheuer](https://github.com/andreheuer) ([#4037](https://github.com/paperless-ngx/paperless-ngx/pull/4037)) +- Enhancement: update bootstrap to v5.3.1 for backend static pages [@shamoon](https://github.com/shamoon) ([#4060](https://github.com/paperless-ngx/paperless-ngx/pull/4060)) + +### Bug Fixes + +- Fix: Add missing spaces to help string in [@joouha](https://github.com/joouha) ([#4674](https://github.com/paperless-ngx/paperless-ngx/pull/4674)) +- Fix: Typo invalidates precondition for doctype, resulting in Exception [@ArminGruner](https://github.com/ArminGruner) ([#4668](https://github.com/paperless-ngx/paperless-ngx/pull/4668)) +- Fix: Miscellaneous visual fixes in v2.0.0-beta.rc1 2 [@shamoon](https://github.com/shamoon) ([#4635](https://github.com/paperless-ngx/paperless-ngx/pull/4635)) +- Fix: Delay consumption after MODIFY inotify events [@frozenbrain](https://github.com/frozenbrain) ([#4626](https://github.com/paperless-ngx/paperless-ngx/pull/4626)) +- Documentation: Add note that trash dir must exist [@shamoon](https://github.com/shamoon) ([#4608](https://github.com/paperless-ngx/paperless-ngx/pull/4608)) +- Fix: Miscellaneous v2.0 visual fixes [@shamoon](https://github.com/shamoon) ([#4576](https://github.com/paperless-ngx/paperless-ngx/pull/4576)) +- Fix: Force UTF-8 for exporter manifests and don't allow escaping [@stumpylog](https://github.com/stumpylog) ([#4574](https://github.com/paperless-ngx/paperless-ngx/pull/4574)) +- Fix: plain text preview overflows [@shamoon](https://github.com/shamoon) ([#4555](https://github.com/paperless-ngx/paperless-ngx/pull/4555)) +- Fix: add permissions for custom fields with migration [@shamoon](https://github.com/shamoon) ([#4513](https://github.com/paperless-ngx/paperless-ngx/pull/4513)) +- Fix: visually hidden text breaks delete button wrap [@shamoon](https://github.com/shamoon) ([#4462](https://github.com/paperless-ngx/paperless-ngx/pull/4462)) +- Fix: API statistics document_file_type_counts return type [@shamoon](https://github.com/shamoon) ([#4464](https://github.com/paperless-ngx/paperless-ngx/pull/4464)) +- Fix: Always return a list for audit log check [@shamoon](https://github.com/shamoon) ([#4463](https://github.com/paperless-ngx/paperless-ngx/pull/4463)) +- Fix: Only create a Correspondent if the email matches rule filters [@stumpylog](https://github.com/stumpylog) ([#4431](https://github.com/paperless-ngx/paperless-ngx/pull/4431)) +- Fix: Combination of consume template with recursive tagging [@stumpylog](https://github.com/stumpylog) ([#4442](https://github.com/paperless-ngx/paperless-ngx/pull/4442)) +- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) +- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) +- Fix: Updates to latest imap_tools which includes fix for the meta charset in HTML content [@stumpylog](https://github.com/stumpylog) ([#4355](https://github.com/paperless-ngx/paperless-ngx/pull/4355)) +- Fix: Missing creation of a folder in Docker image [@stumpylog](https://github.com/stumpylog) ([#4347](https://github.com/paperless-ngx/paperless-ngx/pull/4347)) +- Fix: Retry Tika parsing when Tika returns HTTP 500 [@stumpylog](https://github.com/stumpylog) ([#4334](https://github.com/paperless-ngx/paperless-ngx/pull/4334)) +- Fix: get highest ASN regardless of user [@shamoon](https://github.com/shamoon) ([#4326](https://github.com/paperless-ngx/paperless-ngx/pull/4326)) +- Fix: Generate secret key with C locale and increase allowed characters [@stumpylog](https://github.com/stumpylog) ([#4277](https://github.com/paperless-ngx/paperless-ngx/pull/4277)) +- Fix: long notes cause visual overflow [@shamoon](https://github.com/shamoon) ([#4287](https://github.com/paperless-ngx/paperless-ngx/pull/4287)) +- Fix: Ensures all old connections are closed in certain long lived places [@stumpylog](https://github.com/stumpylog) ([#4265](https://github.com/paperless-ngx/paperless-ngx/pull/4265)) +- CI: fix playwright browser version mismatch failures [@shamoon](https://github.com/shamoon) ([#4239](https://github.com/paperless-ngx/paperless-ngx/pull/4239)) +- Fix: Set a non-zero polling internal when inotify cannot import [@stumpylog](https://github.com/stumpylog) ([#4230](https://github.com/paperless-ngx/paperless-ngx/pull/4230)) +- Fix: Set permissions before declaring volumes for rootless [@stumpylog](https://github.com/stumpylog) ([#4225](https://github.com/paperless-ngx/paperless-ngx/pull/4225)) +- Documentation: Fix fuzzy matching details [@stumpylog](https://github.com/stumpylog) ([#4207](https://github.com/paperless-ngx/paperless-ngx/pull/4207)) +- Fix: application of theme color vars at root [@shamoon](https://github.com/shamoon) ([#4193](https://github.com/paperless-ngx/paperless-ngx/pull/4193)) +- Fix: Trim unneeded libraries from Docker image [@stumpylog](https://github.com/stumpylog) ([#4183](https://github.com/paperless-ngx/paperless-ngx/pull/4183)) +- Fix: support storage path placeholder via API [@shamoon](https://github.com/shamoon) ([#4179](https://github.com/paperless-ngx/paperless-ngx/pull/4179)) +- Fix: Logs the errors during thumbnail generation [@stumpylog](https://github.com/stumpylog) ([#4171](https://github.com/paperless-ngx/paperless-ngx/pull/4171)) +- Fix: remove owner details from saved_views api endpoint [@shamoon](https://github.com/shamoon) ([#4158](https://github.com/paperless-ngx/paperless-ngx/pull/4158)) +- Fix: dashboard widget card borders hidden by bkgd color [@shamoon](https://github.com/shamoon) ([#4155](https://github.com/paperless-ngx/paperless-ngx/pull/4155)) +- Fix: hide entire add user / group buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#4133](https://github.com/paperless-ngx/paperless-ngx/pull/4133)) + +### Documentation + +- Documentation: Update documentation to refer only to Docker Compose v2 command [@stumpylog](https://github.com/stumpylog) ([#4650](https://github.com/paperless-ngx/paperless-ngx/pull/4650)) +- Documentation: fix typo, add to features list [@tooomm](https://github.com/tooomm) ([#4624](https://github.com/paperless-ngx/paperless-ngx/pull/4624)) +- Documentation: Add note that trash dir must exist [@shamoon](https://github.com/shamoon) ([#4608](https://github.com/paperless-ngx/paperless-ngx/pull/4608)) +- Documentation: Structure backup sections more clearly [@quantenProjects](https://github.com/quantenProjects) ([#4559](https://github.com/paperless-ngx/paperless-ngx/pull/4559)) +- Documentation: update docs, screenshots ahead of Paperless-ngx v2.0 [@shamoon](https://github.com/shamoon) ([#4542](https://github.com/paperless-ngx/paperless-ngx/pull/4542)) +- Chore: Cleanup command arguments and standardize process count handling [@stumpylog](https://github.com/stumpylog) ([#4541](https://github.com/paperless-ngx/paperless-ngx/pull/4541)) +- Add section for SELinux troubleshooting [@nachtjasmin](https://github.com/nachtjasmin) ([#4528](https://github.com/paperless-ngx/paperless-ngx/pull/4528)) +- Documentation: clarify document_exporter includes settings [@coaxial](https://github.com/coaxial) ([#4533](https://github.com/paperless-ngx/paperless-ngx/pull/4533)) +- Change: Install script improvements [@m-GDEV](https://github.com/m-GDEV) ([#4387](https://github.com/paperless-ngx/paperless-ngx/pull/4387)) +- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) +- Fix: correct set owner API location in docs, additional test [@shamoon](https://github.com/shamoon) ([#4366](https://github.com/paperless-ngx/paperless-ngx/pull/4366)) +- Documentation: Remove old information about building the Docker image locally [@stumpylog](https://github.com/stumpylog) ([#4354](https://github.com/paperless-ngx/paperless-ngx/pull/4354)) +- Documentation enhancement: add direct links for all config vars [@shamoon](https://github.com/shamoon) ([#4237](https://github.com/paperless-ngx/paperless-ngx/pull/4237)) +- Documentation: Fix fuzzy matching details [@stumpylog](https://github.com/stumpylog) ([#4207](https://github.com/paperless-ngx/paperless-ngx/pull/4207)) + +### Maintenance + +- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) +- Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#4476](https://github.com/paperless-ngx/paperless-ngx/pull/4476)) +- Feature: Add Bulgarian translation [@shamoon](https://github.com/shamoon) ([#4470](https://github.com/paperless-ngx/paperless-ngx/pull/4470)) +- Chore: Stop duplicated action runs against internal PRs [@stumpylog](https://github.com/stumpylog) ([#4430](https://github.com/paperless-ngx/paperless-ngx/pull/4430)) +- CI: separate frontend deps install [@shamoon](https://github.com/shamoon) ([#4336](https://github.com/paperless-ngx/paperless-ngx/pull/4336)) +- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) +- Fix: Generate secret key with C locale and increase allowed characters [@stumpylog](https://github.com/stumpylog) ([#4277](https://github.com/paperless-ngx/paperless-ngx/pull/4277)) +- Bump leonsteinhaeuser/project-beta-automations from 2.1.0 to 2.2.1 [@dependabot](https://github.com/dependabot) ([#4281](https://github.com/paperless-ngx/paperless-ngx/pull/4281)) +- Chore: Updates dependabot to group more dependencies [@stumpylog](https://github.com/stumpylog) ([#4280](https://github.com/paperless-ngx/paperless-ngx/pull/4280)) +- Change: update translation string for tasks dialog [@shamoon](https://github.com/shamoon) ([#4263](https://github.com/paperless-ngx/paperless-ngx/pull/4263)) +- CI: fix playwright browser version mismatch failures [@shamoon](https://github.com/shamoon) ([#4239](https://github.com/paperless-ngx/paperless-ngx/pull/4239)) +- Bump docker/login-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4221](https://github.com/paperless-ngx/paperless-ngx/pull/4221)) +- Bump docker/setup-buildx-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4220](https://github.com/paperless-ngx/paperless-ngx/pull/4220)) +- Bump docker/setup-qemu-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4211](https://github.com/paperless-ngx/paperless-ngx/pull/4211)) +- Bump stumpylog/image-cleaner-action from 0.2.0 to 0.3.0 [@dependabot](https://github.com/dependabot) ([#4210](https://github.com/paperless-ngx/paperless-ngx/pull/4210)) +- Bump docker/metadata-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4209](https://github.com/paperless-ngx/paperless-ngx/pull/4209)) +- Bump docker/build-push-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4212](https://github.com/paperless-ngx/paperless-ngx/pull/4212)) +- Bump actions/checkout from 3 to 4 [@dependabot](https://github.com/dependabot) ([#4208](https://github.com/paperless-ngx/paperless-ngx/pull/4208)) +- Chore: update docker image and ci to node 20 [@shamoon](https://github.com/shamoon) ([#4184](https://github.com/paperless-ngx/paperless-ngx/pull/4184)) + +### Dependencies + +
+39 changes + +- Chore: Bulk update of Python dependencies [@stumpylog](https://github.com/stumpylog) ([#4688](https://github.com/paperless-ngx/paperless-ngx/pull/4688)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4479](https://github.com/paperless-ngx/paperless-ngx/pull/4479)) +- Bump [@playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot) ([#4480](https://github.com/paperless-ngx/paperless-ngx/pull/4480)) +- Bump concurrently from 8.2.1 to 8.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4481](https://github.com/paperless-ngx/paperless-ngx/pull/4481)) +- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#4478](https://github.com/paperless-ngx/paperless-ngx/pull/4478)) +- Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#4477](https://github.com/paperless-ngx/paperless-ngx/pull/4477)) +- Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#4476](https://github.com/paperless-ngx/paperless-ngx/pull/4476)) +- Bump [@babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot](https://github.com/babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot) ([#4389](https://github.com/paperless-ngx/paperless-ngx/pull/4389)) +- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) +- Bump postcss from 8.4.12 to 8.4.31 in /src/paperless_mail/templates [@dependabot](https://github.com/dependabot) ([#4318](https://github.com/paperless-ngx/paperless-ngx/pull/4318)) +- Bump [@types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot](https://github.com/types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot) ([#4303](https://github.com/paperless-ngx/paperless-ngx/pull/4303)) +- Bump the frontend-angular-dependencies group in /src-ui with 8 updates [@dependabot](https://github.com/dependabot) ([#4302](https://github.com/paperless-ngx/paperless-ngx/pull/4302)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4283](https://github.com/paperless-ngx/paperless-ngx/pull/4283)) +- Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#4282](https://github.com/paperless-ngx/paperless-ngx/pull/4282)) +- Bump [@types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot](https://github.com/types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot) ([#4284](https://github.com/paperless-ngx/paperless-ngx/pull/4284)) +- Bump leonsteinhaeuser/project-beta-automations from 2.1.0 to 2.2.1 [@dependabot](https://github.com/dependabot) ([#4281](https://github.com/paperless-ngx/paperless-ngx/pull/4281)) +- Bump zone.js from 0.13.1 to 0.13.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#4223](https://github.com/paperless-ngx/paperless-ngx/pull/4223)) +- Bump [@types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot](https://github.com/types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot) ([#4224](https://github.com/paperless-ngx/paperless-ngx/pull/4224)) +- Bump the frontend-angular-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4222](https://github.com/paperless-ngx/paperless-ngx/pull/4222)) +- Bump docker/login-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4221](https://github.com/paperless-ngx/paperless-ngx/pull/4221)) +- Bump docker/setup-buildx-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4220](https://github.com/paperless-ngx/paperless-ngx/pull/4220)) +- Bump docker/setup-qemu-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4211](https://github.com/paperless-ngx/paperless-ngx/pull/4211)) +- Bump bootstrap from 5.3.1 to 5.3.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4217](https://github.com/paperless-ngx/paperless-ngx/pull/4217)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4215](https://github.com/paperless-ngx/paperless-ngx/pull/4215)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4218](https://github.com/paperless-ngx/paperless-ngx/pull/4218)) +- Bump stumpylog/image-cleaner-action from 0.2.0 to 0.3.0 [@dependabot](https://github.com/dependabot) ([#4210](https://github.com/paperless-ngx/paperless-ngx/pull/4210)) +- Bump docker/metadata-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4209](https://github.com/paperless-ngx/paperless-ngx/pull/4209)) +- Bump uuid from 9.0.0 to 9.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4216](https://github.com/paperless-ngx/paperless-ngx/pull/4216)) +- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#4213](https://github.com/paperless-ngx/paperless-ngx/pull/4213)) +- Bump docker/build-push-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4212](https://github.com/paperless-ngx/paperless-ngx/pull/4212)) +- Bump actions/checkout from 3 to 4 [@dependabot](https://github.com/dependabot) ([#4208](https://github.com/paperless-ngx/paperless-ngx/pull/4208)) +- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) +- Chore: Unlock dependencies \& update them all [@stumpylog](https://github.com/stumpylog) ([#4142](https://github.com/paperless-ngx/paperless-ngx/pull/4142)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4112](https://github.com/paperless-ngx/paperless-ngx/pull/4112)) +- Bump tslib from 2.6.1 to 2.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4108](https://github.com/paperless-ngx/paperless-ngx/pull/4108)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4106](https://github.com/paperless-ngx/paperless-ngx/pull/4106)) +- Bump concurrently from 8.2.0 to 8.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4111](https://github.com/paperless-ngx/paperless-ngx/pull/4111)) +- Bump [@types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot](https://github.com/types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot) ([#4110](https://github.com/paperless-ngx/paperless-ngx/pull/4110)) +- Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#4104](https://github.com/paperless-ngx/paperless-ngx/pull/4104)) +
+ +### All App Changes + +
+95 changes + +- Fix: Add missing spaces to help string in [@joouha](https://github.com/joouha) ([#4674](https://github.com/paperless-ngx/paperless-ngx/pull/4674)) +- Fix: Typo invalidates precondition for doctype, resulting in Exception [@ArminGruner](https://github.com/ArminGruner) ([#4668](https://github.com/paperless-ngx/paperless-ngx/pull/4668)) +- Fix: dark mode inconsistencies in v2.0.0 beta.rc1 [@shamoon](https://github.com/shamoon) ([#4669](https://github.com/paperless-ngx/paperless-ngx/pull/4669)) +- Fix: dashboard saved view mobile width in v.2.0.0 beta.rc1 [@shamoon](https://github.com/shamoon) ([#4660](https://github.com/paperless-ngx/paperless-ngx/pull/4660)) +- Fix: Miscellaneous visual fixes in v2.0.0-beta.rc1 2 [@shamoon](https://github.com/shamoon) ([#4635](https://github.com/paperless-ngx/paperless-ngx/pull/4635)) +- Fix: Delay consumption after MODIFY inotify events [@frozenbrain](https://github.com/frozenbrain) ([#4626](https://github.com/paperless-ngx/paperless-ngx/pull/4626)) +- Fix: Import of split-manifests can fail [@stumpylog](https://github.com/stumpylog) ([#4623](https://github.com/paperless-ngx/paperless-ngx/pull/4623)) +- Fix: sidebar views dont update after creation in v2.0.0-beta.rc1 [@shamoon](https://github.com/shamoon) ([#4619](https://github.com/paperless-ngx/paperless-ngx/pull/4619)) +- Fix: Prevent text wrap on consumption template label [@shamoon](https://github.com/shamoon) ([#4616](https://github.com/paperless-ngx/paperless-ngx/pull/4616)) +- Fix: increase width of labels in default perms settings [@shamoon](https://github.com/shamoon) ([#4612](https://github.com/paperless-ngx/paperless-ngx/pull/4612)) +- Fix: note deletion fails in v2.0.0-beta.rc1 [@shamoon](https://github.com/shamoon) ([#4602](https://github.com/paperless-ngx/paperless-ngx/pull/4602)) +- Fix: Handle override lists being None [@stumpylog](https://github.com/stumpylog) ([#4598](https://github.com/paperless-ngx/paperless-ngx/pull/4598)) +- Fix: Miscellaneous v2.0 visual fixes [@shamoon](https://github.com/shamoon) ([#4576](https://github.com/paperless-ngx/paperless-ngx/pull/4576)) +- Fix: Force UTF-8 for exporter manifests and don't allow escaping [@stumpylog](https://github.com/stumpylog) ([#4574](https://github.com/paperless-ngx/paperless-ngx/pull/4574)) +- Feature: compact notifications [@shamoon](https://github.com/shamoon) ([#4545](https://github.com/paperless-ngx/paperless-ngx/pull/4545)) +- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) +- Fix: plain text preview overflows [@shamoon](https://github.com/shamoon) ([#4555](https://github.com/paperless-ngx/paperless-ngx/pull/4555)) +- Feature: Hungarian translation [@shamoon](https://github.com/shamoon) ([#4552](https://github.com/paperless-ngx/paperless-ngx/pull/4552)) +- Chore: Cleanup command arguments and standardize process count handling [@stumpylog](https://github.com/stumpylog) ([#4541](https://github.com/paperless-ngx/paperless-ngx/pull/4541)) +- Chore: API support for id args for documents \& objects [@shamoon](https://github.com/shamoon) ([#4519](https://github.com/paperless-ngx/paperless-ngx/pull/4519)) +- Fix: add permissions for custom fields with migration [@shamoon](https://github.com/shamoon) ([#4513](https://github.com/paperless-ngx/paperless-ngx/pull/4513)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4479](https://github.com/paperless-ngx/paperless-ngx/pull/4479)) +- Bump [@playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot) ([#4480](https://github.com/paperless-ngx/paperless-ngx/pull/4480)) +- Bump concurrently from 8.2.1 to 8.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4481](https://github.com/paperless-ngx/paperless-ngx/pull/4481)) +- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#4478](https://github.com/paperless-ngx/paperless-ngx/pull/4478)) +- Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#4477](https://github.com/paperless-ngx/paperless-ngx/pull/4477)) +- Fix: visually hidden text breaks delete button wrap [@shamoon](https://github.com/shamoon) ([#4462](https://github.com/paperless-ngx/paperless-ngx/pull/4462)) +- Fix: API statistics document_file_type_counts return type [@shamoon](https://github.com/shamoon) ([#4464](https://github.com/paperless-ngx/paperless-ngx/pull/4464)) +- Fix: Always return a list for audit log check [@shamoon](https://github.com/shamoon) ([#4463](https://github.com/paperless-ngx/paperless-ngx/pull/4463)) +- Feature: Audit Trail [@nanokatz](https://github.com/nanokatz) ([#4425](https://github.com/paperless-ngx/paperless-ngx/pull/4425)) +- Fix: Only create a Correspondent if the email matches rule filters [@stumpylog](https://github.com/stumpylog) ([#4431](https://github.com/paperless-ngx/paperless-ngx/pull/4431)) +- Fix: Combination of consume template with recursive tagging [@stumpylog](https://github.com/stumpylog) ([#4442](https://github.com/paperless-ngx/paperless-ngx/pull/4442)) +- Feature: Add ahead of time compression of the static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#4390](https://github.com/paperless-ngx/paperless-ngx/pull/4390)) +- Feature: sort sidebar views [@shamoon](https://github.com/shamoon) ([#4381](https://github.com/paperless-ngx/paperless-ngx/pull/4381)) +- Feature: Switches to a new client to handle communication with Gotenberg [@stumpylog](https://github.com/stumpylog) ([#4391](https://github.com/paperless-ngx/paperless-ngx/pull/4391)) +- barcode logic: strip non-numeric characters from detected ASN string [@queaker](https://github.com/queaker) ([#4379](https://github.com/paperless-ngx/paperless-ngx/pull/4379)) +- Bump [@babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot](https://github.com/babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot) ([#4389](https://github.com/paperless-ngx/paperless-ngx/pull/4389)) +- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) +- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) +- Fix: correct set owner API location in docs, additional test [@shamoon](https://github.com/shamoon) ([#4366](https://github.com/paperless-ngx/paperless-ngx/pull/4366)) +- Fix: get highest ASN regardless of user [@shamoon](https://github.com/shamoon) ([#4326](https://github.com/paperless-ngx/paperless-ngx/pull/4326)) +- Bump postcss from 8.4.12 to 8.4.31 in /src/paperless_mail/templates [@dependabot](https://github.com/dependabot) ([#4318](https://github.com/paperless-ngx/paperless-ngx/pull/4318)) +- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) +- Bump [@types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot](https://github.com/types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot) ([#4303](https://github.com/paperless-ngx/paperless-ngx/pull/4303)) +- Bump the frontend-angular-dependencies group in /src-ui with 8 updates [@dependabot](https://github.com/dependabot) ([#4302](https://github.com/paperless-ngx/paperless-ngx/pull/4302)) +- Feature: password reset [@shamoon](https://github.com/shamoon) ([#4289](https://github.com/paperless-ngx/paperless-ngx/pull/4289)) +- Enhancement: dashboard improvements, drag-n-drop reorder dashboard views [@shamoon](https://github.com/shamoon) ([#4252](https://github.com/paperless-ngx/paperless-ngx/pull/4252)) +- Fix: long notes cause visual overflow [@shamoon](https://github.com/shamoon) ([#4287](https://github.com/paperless-ngx/paperless-ngx/pull/4287)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4283](https://github.com/paperless-ngx/paperless-ngx/pull/4283)) +- Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#4282](https://github.com/paperless-ngx/paperless-ngx/pull/4282)) +- Bump [@types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot](https://github.com/types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot) ([#4284](https://github.com/paperless-ngx/paperless-ngx/pull/4284)) +- Fix: Ensures all old connections are closed in certain long lived places [@stumpylog](https://github.com/stumpylog) ([#4265](https://github.com/paperless-ngx/paperless-ngx/pull/4265)) +- Change: update translation string for tasks dialog [@shamoon](https://github.com/shamoon) ([#4263](https://github.com/paperless-ngx/paperless-ngx/pull/4263)) +- Enhancement: settings reorganization \& improvements, separate admin section [@shamoon](https://github.com/shamoon) ([#4251](https://github.com/paperless-ngx/paperless-ngx/pull/4251)) +- Chore: Standardizes the imports across all the files and modules [@stumpylog](https://github.com/stumpylog) ([#4248](https://github.com/paperless-ngx/paperless-ngx/pull/4248)) +- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) +- Enhancement: support default permissions for object creation via frontend [@shamoon](https://github.com/shamoon) ([#4233](https://github.com/paperless-ngx/paperless-ngx/pull/4233)) +- Fix: Set a non-zero polling internal when inotify cannot import [@stumpylog](https://github.com/stumpylog) ([#4230](https://github.com/paperless-ngx/paperless-ngx/pull/4230)) +- Bump zone.js from 0.13.1 to 0.13.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#4223](https://github.com/paperless-ngx/paperless-ngx/pull/4223)) +- Bump [@types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot](https://github.com/types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot) ([#4224](https://github.com/paperless-ngx/paperless-ngx/pull/4224)) +- Bump the frontend-angular-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4222](https://github.com/paperless-ngx/paperless-ngx/pull/4222)) +- Bump bootstrap from 5.3.1 to 5.3.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4217](https://github.com/paperless-ngx/paperless-ngx/pull/4217)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4215](https://github.com/paperless-ngx/paperless-ngx/pull/4215)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4218](https://github.com/paperless-ngx/paperless-ngx/pull/4218)) +- Bump uuid from 9.0.0 to 9.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4216](https://github.com/paperless-ngx/paperless-ngx/pull/4216)) +- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#4213](https://github.com/paperless-ngx/paperless-ngx/pull/4213)) +- Enhancement: bulk edit object permissions [@shamoon](https://github.com/shamoon) ([#4176](https://github.com/paperless-ngx/paperless-ngx/pull/4176)) +- Fix: completely hide upload widget if user does not have permissions [@nawramm](https://github.com/nawramm) ([#4198](https://github.com/paperless-ngx/paperless-ngx/pull/4198)) +- Fix: application of theme color vars at root [@shamoon](https://github.com/shamoon) ([#4193](https://github.com/paperless-ngx/paperless-ngx/pull/4193)) +- Enhancement: Allow the user the specifiy the export zip file name [@stumpylog](https://github.com/stumpylog) ([#4189](https://github.com/paperless-ngx/paperless-ngx/pull/4189)) +- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) +- Chore: change dark mode to use Bootstrap's color modes [@lkster](https://github.com/lkster) ([#4174](https://github.com/paperless-ngx/paperless-ngx/pull/4174)) +- Fix: support storage path placeholder via API [@shamoon](https://github.com/shamoon) ([#4179](https://github.com/paperless-ngx/paperless-ngx/pull/4179)) +- Fix: Logs the errors during thumbnail generation [@stumpylog](https://github.com/stumpylog) ([#4171](https://github.com/paperless-ngx/paperless-ngx/pull/4171)) +- Feature: New management command for fuzzy matching document content [@stumpylog](https://github.com/stumpylog) ([#4160](https://github.com/paperless-ngx/paperless-ngx/pull/4160)) +- Breaking: Drop support for Python 3.8 [@stumpylog](https://github.com/stumpylog) ([#4156](https://github.com/paperless-ngx/paperless-ngx/pull/4156)) +- Fix: dashboard widget card borders hidden by bkgd color [@shamoon](https://github.com/shamoon) ([#4155](https://github.com/paperless-ngx/paperless-ngx/pull/4155)) +- Enhancement: frontend better handle slow backend requests [@shamoon](https://github.com/shamoon) ([#4055](https://github.com/paperless-ngx/paperless-ngx/pull/4055)) +- Chore: Extend the live service utility for handling 503 errors [@stumpylog](https://github.com/stumpylog) ([#4143](https://github.com/paperless-ngx/paperless-ngx/pull/4143)) +- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) +- Fix: hide entire add user / group buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#4133](https://github.com/paperless-ngx/paperless-ngx/pull/4133)) +- Enhancement: Improved error notifications [@shamoon](https://github.com/shamoon) ([#4062](https://github.com/paperless-ngx/paperless-ngx/pull/4062)) +- Feature: Official support for Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4146](https://github.com/paperless-ngx/paperless-ngx/pull/4146)) +- Chore: Unlock dependencies \& update them all [@stumpylog](https://github.com/stumpylog) ([#4142](https://github.com/paperless-ngx/paperless-ngx/pull/4142)) +- Change: PWA Manifest to Standalone Display [@swoga](https://github.com/swoga) ([#4129](https://github.com/paperless-ngx/paperless-ngx/pull/4129)) +- Enhancement: add --id-range for document_retagger [@kamilkosek](https://github.com/kamilkosek) ([#4080](https://github.com/paperless-ngx/paperless-ngx/pull/4080)) +- Enhancement: Add Afrikaans, Greek \& Norwegian languages [@shamoon](https://github.com/shamoon) ([#4088](https://github.com/paperless-ngx/paperless-ngx/pull/4088)) +- Enhancement: add task id to pre/post consume script as env [@andreheuer](https://github.com/andreheuer) ([#4037](https://github.com/paperless-ngx/paperless-ngx/pull/4037)) +- Enhancement: update bootstrap to v5.3.1 for backend static pages [@shamoon](https://github.com/shamoon) ([#4060](https://github.com/paperless-ngx/paperless-ngx/pull/4060)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4112](https://github.com/paperless-ngx/paperless-ngx/pull/4112)) +- Bump tslib from 2.6.1 to 2.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4108](https://github.com/paperless-ngx/paperless-ngx/pull/4108)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4106](https://github.com/paperless-ngx/paperless-ngx/pull/4106)) +- Bump concurrently from 8.2.0 to 8.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4111](https://github.com/paperless-ngx/paperless-ngx/pull/4111)) +- Bump [@types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot](https://github.com/types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot) ([#4110](https://github.com/paperless-ngx/paperless-ngx/pull/4110)) +- Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#4104](https://github.com/paperless-ngx/paperless-ngx/pull/4104)) +
+ ## paperless-ngx 1.17.4 ### Bug Fixes diff --git a/docs/configuration.md b/docs/configuration.md index e952ec41b..c0e8022ac 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -704,6 +704,20 @@ but could result in missing text content. this value if you are certain your documents are not malicious and you need the text which was not OCRed +#### [`PAPERLESS_OCR_COLOR_CONVERSION_STRATEGY=`](#PAPERLESS_OCR_COLOR_CONVERSION_STRATEGY) {#PAPERLESS_OCR_COLOR_CONVERSION_STRATEGY} + +: Controls the Ghostscript color conversion strategy when creating the archive file. This setting +will only be utilized if the output is a version of PDF/A. + + Valid options are CMYK, Gray, LeaveColorUnchanged, RGB or UseDeviceIndependentColor. + + You can find more on the settings [here](https://ghostscript.readthedocs.io/en/latest/VectorDevices.html#color-conversion-and-management) in the Ghostscript documentation. + + !!! warning + + Utilizing some of the options may result in errors when creating archive + files from PDFs. + #### [`PAPERLESS_OCR_USER_ARGS=`](#PAPERLESS_OCR_USER_ARGS) {#PAPERLESS_OCR_USER_ARGS} : OCRmyPDF offers many more options. Use this parameter to specify any diff --git a/docs/development.md b/docs/development.md index e4eb36d94..16933a172 100644 --- a/docs/development.md +++ b/docs/development.md @@ -9,7 +9,7 @@ following way: - `main` always represents the latest release and will only see changes when a new release is made. - `dev` contains the code that will be in the next release. -- `feature-X` contain bigger changes that will be in some release, but +- `feature-X` contains bigger changes that will be in some release, but not necessarily the next one. When making functional changes to Paperless-ngx, _always_ make your changes diff --git a/docs/faq.md b/docs/faq.md index 9dff29dac..5d59e29ad 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -87,7 +87,7 @@ follow the [Docker Compose instructions](https://docs.paperless-ngx.com/setup/#i space compared to a bare metal installation, docker comes with close to zero overhead, even on Raspberry Pi. -If you decide to got with the bare metal route, be aware that some of +If you decide to go with the bare metal route, be aware that some of the python requirements do not have precompiled packages for ARM / ARM64. Installation of these will require additional development libraries and compilation will take a long time. diff --git a/docs/usage.md b/docs/usage.md index a3e5b3665..d27ea9e1d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -283,6 +283,7 @@ Consumption templates can assign: - Tags, correspondent, document types - Document owner - View and / or edit permissions to users or groups +- Custom fields. Note that no value for the field will be set ### Consumption template permissions diff --git a/mkdocs.yml b/mkdocs.yml index 55cd3ca94..816ba932c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -67,4 +67,5 @@ extra: - icon: material/chat link: https://matrix.to/#/#paperless:matrix.org plugins: + - search - glightbox diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 870f7c696..1b94018f3 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -403,22 +403,33 @@ src/app/components/app-frame/app-frame.component.html - 225 + 230 src/app/components/app-frame/app-frame.component.html - 228 + 233 + + + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -426,11 +437,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -489,15 +496,15 @@ src/app/components/app-frame/app-frame.component.html - 45 + 50 src/app/components/app-frame/app-frame.component.html - 203 + 208 src/app/components/app-frame/app-frame.component.html - 206 + 211 @@ -966,7 +973,7 @@ src/app/components/app-frame/app-frame.component.html - 91 + 96 @@ -995,7 +1002,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1131,7 +1138,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1308,7 +1315,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 42 + 43 src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html @@ -1322,6 +1329,10 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 36 + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 54 + src/app/components/document-detail/document-detail.component.html 93 @@ -1389,7 +1400,7 @@ src/app/components/app-frame/app-frame.component.ts - 119 + 116 @@ -1421,7 +1432,7 @@ src/app/components/app-frame/app-frame.component.html - 217 + 222 @@ -1462,18 +1473,11 @@ 22 - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1496,130 +1500,130 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 @@ -1630,11 +1634,11 @@ src/app/components/app-frame/app-frame.component.html - 210 + 215 src/app/components/app-frame/app-frame.component.html - 213 + 218 @@ -1780,6 +1784,10 @@ src/app/components/admin/users-groups/users-groups.component.ts 89 + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 144 + Saved user "". @@ -1961,37 +1969,44 @@ 39 + + My Profile + + src/app/components/app-frame/app-frame.component.html + 45 + + Logout src/app/components/app-frame/app-frame.component.html - 50 + 55 Documentation src/app/components/app-frame/app-frame.component.html - 56 + 61 src/app/components/app-frame/app-frame.component.html - 232 + 237 src/app/components/app-frame/app-frame.component.html - 235 + 240 Dashboard src/app/components/app-frame/app-frame.component.html - 75 + 80 src/app/components/app-frame/app-frame.component.html - 78 + 83 src/app/components/dashboard/dashboard.component.html @@ -2002,11 +2017,11 @@ Documents src/app/components/app-frame/app-frame.component.html - 82 + 87 src/app/components/app-frame/app-frame.component.html - 85 + 90 src/app/components/document-list/document-list.component.ts @@ -2033,36 +2048,36 @@ Open documents src/app/components/app-frame/app-frame.component.html - 118 + 123 Close all src/app/components/app-frame/app-frame.component.html - 134 + 139 src/app/components/app-frame/app-frame.component.html - 137 + 142 Manage src/app/components/app-frame/app-frame.component.html - 144 + 149 Correspondents src/app/components/app-frame/app-frame.component.html - 148 + 153 src/app/components/app-frame/app-frame.component.html - 151 + 156 src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html @@ -2073,11 +2088,11 @@ Tags src/app/components/app-frame/app-frame.component.html - 155 + 160 src/app/components/app-frame/app-frame.component.html - 158 + 163 src/app/components/common/input/tags/tags.component.ts @@ -2104,11 +2119,11 @@ Document Types src/app/components/app-frame/app-frame.component.html - 162 + 167 src/app/components/app-frame/app-frame.component.html - 165 + 170 src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html @@ -2119,11 +2134,11 @@ Storage Paths src/app/components/app-frame/app-frame.component.html - 169 + 174 src/app/components/app-frame/app-frame.component.html - 172 + 177 src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html @@ -2134,11 +2149,11 @@ Custom Fields src/app/components/app-frame/app-frame.component.html - 176 + 181 src/app/components/app-frame/app-frame.component.html - 179 + 184 src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html @@ -2153,102 +2168,102 @@ Consumption templates src/app/components/app-frame/app-frame.component.html - 183 + 188 Templates src/app/components/app-frame/app-frame.component.html - 186 + 191 Mail src/app/components/app-frame/app-frame.component.html - 190 + 195 src/app/components/app-frame/app-frame.component.html - 193 + 198 Administration src/app/components/app-frame/app-frame.component.html - 199 + 204 File Tasks src/app/components/app-frame/app-frame.component.html - 221 + 226 GitHub src/app/components/app-frame/app-frame.component.html - 241 + 246 is available. src/app/components/app-frame/app-frame.component.html - 247 + 252 Click to view. src/app/components/app-frame/app-frame.component.html - 247 + 252 Paperless-ngx can automatically check for updates src/app/components/app-frame/app-frame.component.html - 251 + 256 How does this work? src/app/components/app-frame/app-frame.component.html - 258,260 + 263,265 Update available src/app/components/app-frame/app-frame.component.html - 269 + 274 Sidebar views updated src/app/components/app-frame/app-frame.component.ts - 247 + 252 Error updating sidebar views src/app/components/app-frame/app-frame.component.ts - 250 + 255 An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 271 + 276 @@ -2520,7 +2535,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 32 + 33 @@ -2531,7 +2546,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 34 + 35 @@ -2570,7 +2585,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 40 + 41 src/app/components/common/toasts/toasts.component.html @@ -2605,7 +2620,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 41 + 42 src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html @@ -2623,6 +2638,10 @@ src/app/components/common/permissions-dialog/permissions-dialog.component.html 20 + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 53 + src/app/components/common/select-dialog/select-dialog.component.html 12 @@ -2843,6 +2862,10 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 12 + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 18 + Password is token @@ -3016,8 +3039,8 @@ 23 - - Filter attachment filename + + Filter attachment filename includes src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 24 @@ -3030,53 +3053,67 @@ 24 + + Filter attachment filename excluding + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 25 + + + + Do not 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 + 25 + + Action src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 27 + 28 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 + 28 Action parameter src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 28 + 29 Assignments specified here will supersede any consumption templates. src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 29 + 30 Assign title from src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 30 + 31 Assign correspondent from src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 33 + 34 Assign owner from rule src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 35 + 36 @@ -3293,6 +3330,10 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 11 + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 8 + First name @@ -3300,6 +3341,10 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 13 + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 28 + Last name @@ -3307,6 +3352,10 @@ src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html 14 + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 29 + Active @@ -3469,6 +3518,13 @@ 155 + + Show password + + src/app/components/common/input/password/password.component.html + 5 + + Edit Permissions @@ -3623,6 +3679,109 @@ 61 + + Edit Profile + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 3 + + + + Confirm Email + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 13 + + + + Confirm Password + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 23 + + + + API Auth Token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 31 + + + + Copy + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 35 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 39 + + + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 23 + + + + Regenerate auth token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 41 + + + + Copied! + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 47 + + + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 36 + + + + Warning: changing the token cannot be undone + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 49 + + + + Emails must match + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 94 + + + + Passwords must match + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 122 + + + + Profile updated successfully + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 141 + + + + Error saving profile + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 153 + + + + Error generating auth token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 170 + + Select @@ -3663,13 +3822,6 @@ 10,12 - - Copy - - src/app/components/common/share-links-dropdown/share-links-dropdown.component.html - 23 - - Share @@ -3677,13 +3829,6 @@ 28 - - Copied! - - src/app/components/common/share-links-dropdown/share-links-dropdown.component.html - 36 - - Share archive version @@ -3713,7 +3858,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts - 90 + 93 @@ -3748,21 +3893,21 @@ days src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts - 90 + 93 Error deleting link src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts - 117 + 120 Error creating link src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts - 145 + 148 diff --git a/src-ui/package-lock.json b/src-ui/package-lock.json index 8495ad8b8..4e898bf81 100644 --- a/src-ui/package-lock.json +++ b/src-ui/package-lock.json @@ -45,21 +45,21 @@ "@angular-eslint/template-parser": "16.2.0", "@angular/cli": "~16.2.9", "@angular/compiler-cli": "~16.2.3", - "@playwright/test": "^1.39.0", - "@types/jest": "^29.5.7", - "@types/node": "^20.8.10", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", + "@playwright/test": "^1.40.1", + "@types/jest": "^29.5.10", + "@types/node": "^20.10.2", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", "concurrently": "^8.2.2", - "eslint": "^8.52.0", + "eslint": "^8.55.0", "jest": "29.7.0", "jest-environment-jsdom": "^29.7.0", - "jest-preset-angular": "^13.1.1", + "jest-preset-angular": "^13.1.4", "jest-websocket-mock": "^2.5.0", "patch-package": "^8.0.0", "ts-node": "~10.9.1", "typescript": "^5.1.6", - "wait-on": "^7.0.1" + "wait-on": "^7.2.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -3698,9 +3698,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -3743,9 +3743,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3788,9 +3788,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5299,12 +5299,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz", - "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", + "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==", "dev": true, "dependencies": { - "playwright": "1.39.0" + "playwright": "1.40.1" }, "bin": { "playwright": "cli.js" @@ -5662,9 +5662,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.7", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", - "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -5695,9 +5695,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz", + "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5812,16 +5812,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -5847,13 +5847,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -5907,15 +5907,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" }, "engines": { @@ -5935,13 +5935,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -6101,9 +6101,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -6114,13 +6114,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6174,17 +6174,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", "semver": "^7.5.4" }, "engines": { @@ -6232,12 +6232,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -7193,9 +7193,9 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -9320,15 +9320,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -12455,9 +12455,9 @@ } }, "node_modules/jest-preset-angular": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-13.1.2.tgz", - "integrity": "sha512-kuzuIch/YYTMaMnuGDaiZEu++Bjc5WskOAmMwqWO0Grpcd0SulqTOV70Gz6Q/ZOQuMye+LS4KPyIVfqnJr2e3g==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-13.1.4.tgz", + "integrity": "sha512-XKeWa8Qt7p37SzlJ85qEXgig06SgkfrzV057X2GSMqfz/HLJmTUjMFkHJKe65ZaQumNQWCcXpxXREr6EfZ9bow==", "dev": true, "dependencies": { "bs-logger": "^0.2.6", @@ -12474,10 +12474,10 @@ "esbuild": ">=0.13.8" }, "peerDependencies": { - "@angular-devkit/build-angular": ">=13.0.0 <17.0.0", - "@angular/compiler-cli": ">=13.0.0 <17.0.0", - "@angular/core": ">=13.0.0 <17.0.0", - "@angular/platform-browser-dynamic": ">=13.0.0 <17.0.0", + "@angular-devkit/build-angular": ">=13.0.0 <18.0.0", + "@angular/compiler-cli": ">=13.0.0 <18.0.0", + "@angular/core": ">=13.0.0 <18.0.0", + "@angular/platform-browser-dynamic": ">=13.0.0 <18.0.0", "jest": "^29.0.0", "typescript": ">=4.4" } @@ -13273,9 +13273,9 @@ } }, "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0", @@ -15736,12 +15736,12 @@ } }, "node_modules/playwright": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", - "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", + "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", "dev": true, "dependencies": { - "playwright-core": "1.39.0" + "playwright-core": "1.40.1" }, "bin": { "playwright": "cli.js" @@ -15754,9 +15754,9 @@ } }, "node_modules/playwright-core": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", - "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", + "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -18282,16 +18282,16 @@ } }, "node_modules/wait-on": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", - "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", "dev": true, "dependencies": { - "axios": "^0.27.2", - "joi": "^17.7.0", + "axios": "^1.6.1", + "joi": "^17.11.0", "lodash": "^4.17.21", - "minimist": "^1.2.7", - "rxjs": "^7.8.0" + "minimist": "^1.2.8", + "rxjs": "^7.8.1" }, "bin": { "wait-on": "bin/wait-on" @@ -18300,16 +18300,6 @@ "node": ">=12.0.0" } }, - "node_modules/wait-on/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/src-ui/package.json b/src-ui/package.json index 27439e26d..a2c94084c 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -47,20 +47,20 @@ "@angular-eslint/template-parser": "16.2.0", "@angular/cli": "~16.2.9", "@angular/compiler-cli": "~16.2.3", - "@playwright/test": "^1.39.0", - "@types/jest": "^29.5.7", - "@types/node": "^20.8.10", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", + "@playwright/test": "^1.40.1", + "@types/jest": "^29.5.10", + "@types/node": "^20.10.2", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", "concurrently": "^8.2.2", - "eslint": "^8.52.0", + "eslint": "^8.55.0", "jest": "29.7.0", "jest-environment-jsdom": "^29.7.0", - "jest-preset-angular": "^13.1.1", + "jest-preset-angular": "^13.1.4", "jest-websocket-mock": "^2.5.0", "patch-package": "^8.0.0", "ts-node": "~10.9.1", "typescript": "^5.1.6", - "wait-on": "^7.0.1" + "wait-on": "^7.2.0" } } diff --git a/src-ui/src/app/app.module.ts b/src-ui/src/app/app.module.ts index 3ba768146..8d7ea5663 100644 --- a/src-ui/src/app/app.module.ts +++ b/src-ui/src/app/app.module.ts @@ -104,6 +104,7 @@ import { FileDropComponent } from './components/file-drop/file-drop.component' import { CustomFieldsComponent } from './components/manage/custom-fields/custom-fields.component' import { CustomFieldEditDialogComponent } from './components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component' import { CustomFieldsDropdownComponent } from './components/common/custom-fields-dropdown/custom-fields-dropdown.component' +import { ProfileEditDialogComponent } from './components/common/profile-edit-dialog/profile-edit-dialog.component' import { PdfViewerComponent } from './components/common/pdf-viewer/pdf-viewer.component' import localeAf from '@angular/common/locales/af' @@ -256,6 +257,7 @@ function initializeApp(settings: SettingsService) { CustomFieldsComponent, CustomFieldEditDialogComponent, CustomFieldsDropdownComponent, + ProfileEditDialogComponent, PdfViewerComponent, ], imports: [ diff --git a/src-ui/src/app/components/admin/logs/logs.component.html b/src-ui/src/app/components/admin/logs/logs.component.html index 91f7f3bd6..628886c62 100644 --- a/src-ui/src/app/components/admin/logs/logs.component.html +++ b/src-ui/src/app/components/admin/logs/logs.component.html @@ -1,14 +1,19 @@ - +
+ + +
diff --git a/src-ui/src/app/components/admin/logs/logs.component.spec.ts b/src-ui/src/app/components/admin/logs/logs.component.spec.ts index a9c4b4613..690bbcdde 100644 --- a/src-ui/src/app/components/admin/logs/logs.component.spec.ts +++ b/src-ui/src/app/components/admin/logs/logs.component.spec.ts @@ -1,4 +1,9 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing' +import { + ComponentFixture, + TestBed, + fakeAsync, + tick, +} from '@angular/core/testing' import { LogService } from 'src/app/services/rest/log.service' import { PageHeaderComponent } from '../../common/page-header/page-header.component' import { LogsComponent } from './logs.component' @@ -26,6 +31,7 @@ describe('LogsComponent', () => { let fixture: ComponentFixture let logService: LogService let logSpy + let reloadSpy beforeEach(async () => { TestBed.configureTestingModule({ @@ -42,7 +48,9 @@ describe('LogsComponent', () => { }) fixture = TestBed.createComponent(LogsComponent) component = fixture.componentInstance + reloadSpy = jest.spyOn(component, 'reloadLogs') window.HTMLElement.prototype.scroll = function () {} // mock scroll + jest.useFakeTimers() fixture.detectChanges() }) @@ -68,4 +76,14 @@ describe('LogsComponent', () => { component.reloadLogs() expect(component.logs).toHaveLength(0) }) + + it('should auto refresh, allow toggle', () => { + jest.advanceTimersByTime(6000) + expect(reloadSpy).toHaveBeenCalledTimes(2) + + component.toggleAutoRefresh() + expect(component.autoRefreshInterval).toBeNull() + jest.advanceTimersByTime(6000) + expect(reloadSpy).toHaveBeenCalledTimes(2) + }) }) diff --git a/src-ui/src/app/components/admin/logs/logs.component.ts b/src-ui/src/app/components/admin/logs/logs.component.ts index cf88077e7..2ca259218 100644 --- a/src-ui/src/app/components/admin/logs/logs.component.ts +++ b/src-ui/src/app/components/admin/logs/logs.component.ts @@ -27,6 +27,8 @@ export class LogsComponent implements OnInit, AfterViewChecked, OnDestroy { public isLoading: boolean = false + public autoRefreshInterval: any + @ViewChild('logContainer') logContainer: ElementRef ngOnInit(): void { @@ -41,6 +43,7 @@ export class LogsComponent implements OnInit, AfterViewChecked, OnDestroy { this.activeLog = this.logFiles[0] this.reloadLogs() } + this.toggleAutoRefresh() }) } @@ -91,4 +94,15 @@ export class LogsComponent implements OnInit, AfterViewChecked, OnDestroy { behavior: 'auto', }) } + + toggleAutoRefresh(): void { + if (this.autoRefreshInterval) { + clearInterval(this.autoRefreshInterval) + this.autoRefreshInterval = null + } else { + this.autoRefreshInterval = setInterval(() => { + this.reloadLogs() + }, 5000) + } + } } diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.html b/src-ui/src/app/components/admin/tasks/tasks.component.html index 62799c9f6..7e0ac4cae 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.html +++ b/src-ui/src/app/components/admin/tasks/tasks.component.html @@ -1,5 +1,5 @@ -
+
- +
+ + +
diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts b/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts index c981dac6f..b86a170b7 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts +++ b/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts @@ -112,6 +112,7 @@ describe('TasksComponent', () => { let modalService: NgbModal let router: Router let httpTestingController: HttpTestingController + let reloadSpy beforeEach(async () => { TestBed.configureTestingModule({ @@ -141,11 +142,13 @@ describe('TasksComponent', () => { }).compileComponents() tasksService = TestBed.inject(TasksService) + reloadSpy = jest.spyOn(tasksService, 'reload') httpTestingController = TestBed.inject(HttpTestingController) modalService = TestBed.inject(NgbModal) router = TestBed.inject(Router) fixture = TestBed.createComponent(TasksComponent) component = fixture.componentInstance + jest.useFakeTimers() fixture.detectChanges() httpTestingController .expectOne(`${environment.apiBaseUrl}tasks/`) @@ -164,7 +167,7 @@ describe('TasksComponent', () => { `Failed${currentTasksLength}` ) expect( - fixture.debugElement.queryAll(By.css('input[type="checkbox"]')) + fixture.debugElement.queryAll(By.css('table input[type="checkbox"]')) ).toHaveLength(currentTasksLength + 1) currentTasksLength = tasks.filter( @@ -245,7 +248,7 @@ describe('TasksComponent', () => { it('should support toggle all tasks', () => { const toggleCheck = fixture.debugElement.query( - By.css('input[type=checkbox]') + By.css('table input[type=checkbox]') ) toggleCheck.nativeElement.dispatchEvent(new MouseEvent('click')) fixture.detectChanges() @@ -269,4 +272,15 @@ describe('TasksComponent', () => { tasks[3].related_document, ]) }) + + it('should auto refresh, allow toggle', () => { + expect(reloadSpy).toHaveBeenCalledTimes(1) + jest.advanceTimersByTime(5000) + expect(reloadSpy).toHaveBeenCalledTimes(2) + + component.toggleAutoRefresh() + expect(component.autoRefreshInterval).toBeNull() + jest.advanceTimersByTime(6000) + expect(reloadSpy).toHaveBeenCalledTimes(2) + }) }) diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.ts b/src-ui/src/app/components/admin/tasks/tasks.component.ts index 32cf6800f..5a1949e77 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.ts +++ b/src-ui/src/app/components/admin/tasks/tasks.component.ts @@ -23,6 +23,8 @@ export class TasksComponent public pageSize: number = 25 public page: number = 1 + public autoRefreshInterval: any + get dismissButtonText(): string { return this.selectedTasks.size > 0 ? $localize`Dismiss selected` @@ -39,6 +41,7 @@ export class TasksComponent ngOnInit() { this.tasksService.reload() + this.toggleAutoRefresh() } ngOnDestroy() { @@ -135,4 +138,15 @@ export class TasksComponent return $localize`failed` } } + + toggleAutoRefresh(): void { + if (this.autoRefreshInterval) { + clearInterval(this.autoRefreshInterval) + this.autoRefreshInterval = null + } else { + this.autoRefreshInterval = setInterval(() => { + this.tasksService.reload() + }, 5000) + } + } } diff --git a/src-ui/src/app/components/admin/users-groups/users-groups.component.ts b/src-ui/src/app/components/admin/users-groups/users-groups.component.ts index a9ce1d600..8f1751092 100644 --- a/src-ui/src/app/components/admin/users-groups/users-groups.component.ts +++ b/src-ui/src/app/components/admin/users-groups/users-groups.component.ts @@ -89,7 +89,7 @@ export class UsersAndGroupsComponent $localize`Password has been changed, you will be logged out momentarily.` ) setTimeout(() => { - window.location.href = `${window.location.origin}/accounts/logout/?next=/accounts/login/` + window.location.href = `${window.location.origin}/accounts/logout/?next=/accounts/login/?next=/` }, 2500) } else { this.toastService.showInfo( 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 a710600ef..556252670 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 @@ -39,6 +39,11 @@

Logged in as {{this.settingsService.displayName}}

+ diff --git a/src-ui/src/app/components/app-frame/app-frame.component.spec.ts b/src-ui/src/app/components/app-frame/app-frame.component.spec.ts index 7b8bf4bce..152429358 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.spec.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.spec.ts @@ -9,7 +9,7 @@ import { fakeAsync, tick, } from '@angular/core/testing' -import { NgbModule } from '@ng-bootstrap/ng-bootstrap' +import { NgbModal, NgbModalModule, NgbModule } from '@ng-bootstrap/ng-bootstrap' import { BrowserModule } from '@angular/platform-browser' import { RouterTestingModule } from '@angular/router/testing' import { SettingsService } from 'src/app/services/settings.service' @@ -32,6 +32,7 @@ import { routes } from 'src/app/app-routing.module' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop' import { PaperlessSavedView } from 'src/app/data/paperless-saved-view' +import { ProfileEditDialogComponent } from '../common/profile-edit-dialog/profile-edit-dialog.component' const saved_views = [ { @@ -86,6 +87,7 @@ describe('AppFrameComponent', () => { let documentListViewService: DocumentListViewService let router: Router let savedViewSpy + let modalService: NgbModal beforeEach(async () => { TestBed.configureTestingModule({ @@ -98,6 +100,7 @@ describe('AppFrameComponent', () => { FormsModule, ReactiveFormsModule, DragDropModule, + NgbModalModule, ], providers: [ SettingsService, @@ -120,6 +123,7 @@ describe('AppFrameComponent', () => { ToastService, OpenDocumentsService, SearchService, + NgbModal, { provide: ActivatedRoute, useValue: { @@ -148,6 +152,7 @@ describe('AppFrameComponent', () => { openDocumentsService = TestBed.inject(OpenDocumentsService) searchService = TestBed.inject(SearchService) documentListViewService = TestBed.inject(DocumentListViewService) + modalService = TestBed.inject(NgbModal) router = TestBed.inject(Router) jest @@ -363,4 +368,12 @@ describe('AppFrameComponent', () => { >) expect(toastSpy).toHaveBeenCalled() }) + + it('should support edit profile', () => { + const modalSpy = jest.spyOn(modalService, 'open') + component.editProfile() + expect(modalSpy).toHaveBeenCalledWith(ProfileEditDialogComponent, { + backdrop: 'static', + }) + }) }) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.ts b/src-ui/src/app/components/app-frame/app-frame.component.ts index 0c8f149c1..f346dc089 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.ts @@ -39,6 +39,8 @@ import { CdkDragDrop, moveItemInArray, } from '@angular/cdk/drag-drop' +import { NgbModal } from '@ng-bootstrap/ng-bootstrap' +import { ProfileEditDialogComponent } from '../common/profile-edit-dialog/profile-edit-dialog.component' @Component({ selector: 'pngx-app-frame', @@ -69,6 +71,7 @@ export class AppFrameComponent public settingsService: SettingsService, public tasksService: TasksService, private readonly toastService: ToastService, + private modalService: NgbModal, permissionsService: PermissionsService ) { super() @@ -121,6 +124,13 @@ export class AppFrameComponent this.isMenuCollapsed = true } + editProfile() { + this.modalService.open(ProfileEditDialogComponent, { + backdrop: 'static', + }) + this.closeMenu() + } + get openDocuments(): PaperlessDocument[] { return this.openDocumentsService.getOpenDocuments() } diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html index 371faaebc..920026448 100644 --- a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html +++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html @@ -35,6 +35,7 @@ +
diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts index 52789fb49..2a1ea25fe 100644 --- a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts @@ -20,6 +20,7 @@ import { TagsComponent } from '../../input/tags/tags.component' import { TextComponent } from '../../input/text/text.component' import { EditDialogMode } from '../edit-dialog.component' import { ConsumptionTemplateEditDialogComponent } from './consumption-template-edit-dialog.component' +import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' describe('ConsumptionTemplateEditDialogComponent', () => { let component: ConsumptionTemplateEditDialogComponent @@ -93,6 +94,15 @@ describe('ConsumptionTemplateEditDialogComponent', () => { }), }, }, + { + provide: CustomFieldsService, + useValue: { + listAll: () => + of({ + results: [], + }), + }, + }, ], imports: [ HttpClientTestingModule, diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts index 3f89e5d76..dedbd3523 100644 --- a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts +++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts @@ -18,6 +18,8 @@ import { SettingsService } from 'src/app/services/settings.service' import { EditDialogComponent } from '../edit-dialog.component' import { MailRuleService } from 'src/app/services/rest/mail-rule.service' import { PaperlessMailRule } from 'src/app/data/paperless-mail-rule' +import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' +import { PaperlessCustomField } from 'src/app/data/paperless-custom-field' export const DOCUMENT_SOURCE_OPTIONS = [ { @@ -45,6 +47,7 @@ export class ConsumptionTemplateEditDialogComponent extends EditDialogComponent< documentTypes: PaperlessDocumentType[] storagePaths: PaperlessStoragePath[] mailRules: PaperlessMailRule[] + customFields: PaperlessCustomField[] constructor( service: ConsumptionTemplateService, @@ -54,7 +57,8 @@ export class ConsumptionTemplateEditDialogComponent extends EditDialogComponent< storagePathService: StoragePathService, mailRuleService: MailRuleService, userService: UserService, - settingsService: SettingsService + settingsService: SettingsService, + customFieldsService: CustomFieldsService ) { super(service, activeModal, userService, settingsService) @@ -77,6 +81,11 @@ export class ConsumptionTemplateEditDialogComponent extends EditDialogComponent< .listAll() .pipe(first()) .subscribe((result) => (this.mailRules = result.results)) + + customFieldsService + .listAll() + .pipe(first()) + .subscribe((result) => (this.customFields = result.results)) } getCreateTitle() { @@ -106,6 +115,7 @@ export class ConsumptionTemplateEditDialogComponent extends EditDialogComponent< assign_view_groups: new FormControl([]), assign_change_users: new FormControl([]), assign_change_groups: new FormControl([]), + assign_custom_fields: new FormControl([]), }) } diff --git a/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.spec.ts b/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.spec.ts index e81c7c99c..d0974236d 100644 --- a/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.spec.ts @@ -131,6 +131,7 @@ describe('EditDialogComponent', () => { }) it('should interpolate object permissions', () => { + component.getMatchingAlgorithms() // coverage component.object = tag component.dialogMode = EditDialogMode.EDIT component.ngOnInit() diff --git a/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.ts index 30384ea31..43253ba8a 100644 --- a/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.ts +++ b/src-ui/src/app/components/common/edit-dialog/edit-dialog.component.ts @@ -58,8 +58,8 @@ export abstract class EditDialogComponent< objectForm: FormGroup = this.getForm() ngOnInit(): void { - if (this.object != null) { - if (this.object['permissions']) { + if (this.object != null && this.dialogMode !== EditDialogMode.CREATE) { + if ((this.object as ObjectWithPermissions).permissions) { this.object['set_permissions'] = this.object['permissions'] } @@ -69,6 +69,8 @@ export abstract class EditDialogComponent< } this.objectForm.patchValue(this.object) } else { + // e.g. if name was set + this.objectForm.patchValue(this.object) // defaults from settings this.objectForm.patchValue({ permissions_form: { diff --git a/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html b/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html index afbcc5c8d..5c335fdaa 100644 --- a/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html +++ b/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html @@ -21,7 +21,8 @@ - + +
diff --git a/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts index 1de036847..2d9469f9e 100644 --- a/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts +++ b/src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts @@ -158,7 +158,8 @@ export class MailRuleEditDialogComponent extends EditDialogComponent - - +
+ + +
{{error}}
+
diff --git a/src-ui/src/app/components/common/input/password/password.component.spec.ts b/src-ui/src/app/components/common/input/password/password.component.spec.ts index 80ad853d7..1788104a6 100644 --- a/src-ui/src/app/components/common/input/password/password.component.spec.ts +++ b/src-ui/src/app/components/common/input/password/password.component.spec.ts @@ -5,6 +5,7 @@ import { NG_VALUE_ACCESSOR, } from '@angular/forms' import { PasswordComponent } from './password.component' +import { By } from '@angular/platform-browser' describe('PasswordComponent', () => { let component: PasswordComponent @@ -33,4 +34,26 @@ describe('PasswordComponent', () => { // fixture.detectChanges() // expect(component.value).toEqual('foo') }) + + it('should support toggling field visibility', () => { + expect(input.type).toEqual('password') + component.showReveal = true + fixture.detectChanges() + fixture.debugElement.query(By.css('button')).triggerEventHandler('click') + fixture.detectChanges() + expect(input.type).toEqual('text') + }) + + it('should empty field if password is obfuscated on focus', () => { + component.value = '*********' + component.onFocus() + expect(component.value).toEqual('') + component.onFocusOut() + expect(component.value).toEqual('**********') + }) + + it('should disable toggle button if no real password', () => { + component.value = '*********' + expect(component.disableRevealToggle).toBeTruthy() + }) }) diff --git a/src-ui/src/app/components/common/input/password/password.component.ts b/src-ui/src/app/components/common/input/password/password.component.ts index ce0284a77..26f5a94e8 100644 --- a/src-ui/src/app/components/common/input/password/password.component.ts +++ b/src-ui/src/app/components/common/input/password/password.component.ts @@ -1,4 +1,4 @@ -import { Component, forwardRef } from '@angular/core' +import { Component, Input, forwardRef } from '@angular/core' import { NG_VALUE_ACCESSOR } from '@angular/forms' import { AbstractInputComponent } from '../abstract-input' @@ -15,7 +15,32 @@ import { AbstractInputComponent } from '../abstract-input' styleUrls: ['./password.component.scss'], }) export class PasswordComponent extends AbstractInputComponent { - constructor() { - super() + @Input() + showReveal: boolean = false + + @Input() + autocomplete: string + + public textVisible: boolean = false + + public toggleVisibility(): void { + this.textVisible = !this.textVisible + } + + public onFocus() { + if (this.value?.replace(/\*/g, '').length === 0) { + this.writeValue('') + } + } + + public onFocusOut() { + if (this.value?.length === 0) { + this.writeValue('**********') + this.onChange(this.value) + } + } + + get disableRevealToggle(): boolean { + return this.value?.replace(/\*/g, '').length === 0 } } diff --git a/src-ui/src/app/components/common/input/tags/tags.component.spec.ts b/src-ui/src/app/components/common/input/tags/tags.component.spec.ts index 85c492aba..7244560fd 100644 --- a/src-ui/src/app/components/common/input/tags/tags.component.spec.ts +++ b/src-ui/src/app/components/common/input/tags/tags.component.spec.ts @@ -32,11 +32,9 @@ import { CheckComponent } from '../check/check.component' import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' import { TextComponent } from '../text/text.component' import { ColorComponent } from '../color/color.component' -import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { PermissionsFormComponent } from '../permissions/permissions-form/permissions-form.component' import { SelectComponent } from '../select/select.component' -import { ColorSliderModule } from 'ngx-color/slider' -import { By } from '@angular/platform-browser' +import { SettingsService } from 'src/app/services/settings.service' const tags: PaperlessTag[] = [ { @@ -63,8 +61,8 @@ const tags: PaperlessTag[] = [ describe('TagsComponent', () => { let component: TagsComponent let fixture: ComponentFixture - let input: HTMLInputElement let modalService: NgbModal + let settingsService: SettingsService beforeEach(async () => { TestBed.configureTestingModule({ @@ -110,6 +108,7 @@ describe('TagsComponent', () => { }).compileComponents() modalService = TestBed.inject(NgbModal) + settingsService = TestBed.inject(SettingsService) fixture = TestBed.createComponent(TagsComponent) fixture.debugElement.injector.get(NG_VALUE_ACCESSOR) component = fixture.componentInstance @@ -139,6 +138,7 @@ describe('TagsComponent', () => { }) it('should support create new using last search term and open a modal', () => { + settingsService.currentUser = { id: 1 } let activeInstances: NgbModalRef[] modalService.activeInstances.subscribe((v) => (activeInstances = v)) component.select.searchTerm = 'foobar' diff --git a/src-ui/src/app/components/common/input/text/text.component.html b/src-ui/src/app/components/common/input/text/text.component.html index 98714e553..47ec804c6 100644 --- a/src-ui/src/app/components/common/input/text/text.component.html +++ b/src-ui/src/app/components/common/input/text/text.component.html @@ -9,7 +9,7 @@
- +
{{error}} diff --git a/src-ui/src/app/components/common/input/text/text.component.ts b/src-ui/src/app/components/common/input/text/text.component.ts index 4060977d4..a546e2e39 100644 --- a/src-ui/src/app/components/common/input/text/text.component.ts +++ b/src-ui/src/app/components/common/input/text/text.component.ts @@ -1,4 +1,4 @@ -import { Component, forwardRef } from '@angular/core' +import { Component, Input, forwardRef } from '@angular/core' import { NG_VALUE_ACCESSOR } from '@angular/forms' import { AbstractInputComponent } from '../abstract-input' @@ -15,6 +15,9 @@ import { AbstractInputComponent } from '../abstract-input' styleUrls: ['./text.component.scss'], }) export class TextComponent extends AbstractInputComponent { + @Input() + autocomplete: string + constructor() { super() } diff --git a/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.spec.ts b/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.spec.ts index 47f245d0a..3f601d771 100644 --- a/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.spec.ts @@ -80,7 +80,16 @@ describe('PermissionsDialogComponent', () => { it('should return permissions', () => { expect(component.permissions).toEqual({ owner: null, - set_permissions: null, + set_permissions: { + view: { + users: [], + groups: [], + }, + change: { + users: [], + groups: [], + }, + }, }) component.form.get('permissions_form').setValue(set_permissions) expect(component.permissions).toEqual(set_permissions) diff --git a/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.ts b/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.ts index 8e5f2321b..e6d5fdb2b 100644 --- a/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.ts +++ b/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.ts @@ -52,8 +52,17 @@ export class PermissionsDialogComponent { get permissions() { return { owner: this.form.get('permissions_form').value?.owner ?? null, - set_permissions: - this.form.get('permissions_form').value?.set_permissions ?? null, + set_permissions: this.form.get('permissions_form').value + ?.set_permissions ?? { + view: { + users: [], + groups: [], + }, + change: { + users: [], + groups: [], + }, + }, } } diff --git a/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html new file mode 100644 index 000000000..b6423b796 --- /dev/null +++ b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html @@ -0,0 +1,56 @@ +
+ + + +
diff --git a/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.scss b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.scss new file mode 100644 index 000000000..62eb6b8cf --- /dev/null +++ b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.scss @@ -0,0 +1,9 @@ +::ng-deep { + .accordion-body .mb-3 { + margin: 0 !important; // hack-ish, for animation + } +} + +.copied-badge { + right: 8em; +} diff --git a/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.spec.ts b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.spec.ts new file mode 100644 index 000000000..0b300bd74 --- /dev/null +++ b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.spec.ts @@ -0,0 +1,222 @@ +import { + ComponentFixture, + TestBed, + fakeAsync, + tick, +} from '@angular/core/testing' + +import { ProfileEditDialogComponent } from './profile-edit-dialog.component' +import { ProfileService } from 'src/app/services/profile.service' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { + NgbAccordionModule, + NgbActiveModal, + NgbModal, + NgbModalModule, +} from '@ng-bootstrap/ng-bootstrap' +import { HttpClientModule } from '@angular/common/http' +import { TextComponent } from '../input/text/text.component' +import { PasswordComponent } from '../input/password/password.component' +import { of, throwError } from 'rxjs' +import { ToastService } from 'src/app/services/toast.service' +import { Clipboard } from '@angular/cdk/clipboard' + +const profile = { + email: 'foo@bar.com', + password: '*********', + first_name: 'foo', + last_name: 'bar', + auth_token: '123456789abcdef', +} + +describe('ProfileEditDialogComponent', () => { + let component: ProfileEditDialogComponent + let fixture: ComponentFixture + let profileService: ProfileService + let toastService: ToastService + let clipboard: Clipboard + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ + ProfileEditDialogComponent, + TextComponent, + PasswordComponent, + ], + providers: [NgbActiveModal], + imports: [ + HttpClientModule, + ReactiveFormsModule, + FormsModule, + NgbModalModule, + NgbAccordionModule, + ], + }) + profileService = TestBed.inject(ProfileService) + toastService = TestBed.inject(ToastService) + clipboard = TestBed.inject(Clipboard) + fixture = TestBed.createComponent(ProfileEditDialogComponent) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should get profile on init, display in form', () => { + const getSpy = jest.spyOn(profileService, 'get') + getSpy.mockReturnValue(of(profile)) + component.ngOnInit() + expect(getSpy).toHaveBeenCalled() + fixture.detectChanges() + expect(component.form.get('email').value).toEqual(profile.email) + }) + + it('should update profile on save, display error if needed', () => { + const newProfile = { + email: 'foo@bar2.com', + password: profile.password, + first_name: 'foo2', + last_name: profile.last_name, + auth_token: profile.auth_token, + } + const updateSpy = jest.spyOn(profileService, 'update') + const errorSpy = jest.spyOn(toastService, 'showError') + updateSpy.mockReturnValueOnce(throwError(() => new Error('failed to save'))) + component.save() + expect(errorSpy).toHaveBeenCalled() + + updateSpy.mockClear() + const infoSpy = jest.spyOn(toastService, 'showInfo') + component.form.patchValue(newProfile) + updateSpy.mockReturnValueOnce(of(newProfile)) + component.save() + expect(updateSpy).toHaveBeenCalledWith(newProfile) + expect(infoSpy).toHaveBeenCalled() + }) + + it('should close on cancel', () => { + const closeSpy = jest.spyOn(component.activeModal, 'close') + component.cancel() + expect(closeSpy).toHaveBeenCalled() + }) + + it('should show additional confirmation field when email changes, warn with error & disable save', () => { + expect(component.form.get('email_confirm').enabled).toBeFalsy() + const getSpy = jest.spyOn(profileService, 'get') + getSpy.mockReturnValue(of(profile)) + component.ngOnInit() + component.form.get('email').patchValue('foo@bar2.com') + component.onEmailKeyUp({ target: { value: 'foo@bar2.com' } } as any) + fixture.detectChanges() + expect(component.form.get('email_confirm').enabled).toBeTruthy() + expect(fixture.debugElement.nativeElement.textContent).toContain( + 'Emails must match' + ) + expect(component.saveDisabled).toBeTruthy() + + component.form.get('email_confirm').patchValue('foo@bar2.com') + component.onEmailConfirmKeyUp({ target: { value: 'foo@bar2.com' } } as any) + fixture.detectChanges() + expect(fixture.debugElement.nativeElement.textContent).not.toContain( + 'Emails must match' + ) + expect(component.saveDisabled).toBeFalsy() + + component.form.get('email').patchValue(profile.email) + fixture.detectChanges() + expect(component.form.get('email_confirm').enabled).toBeFalsy() + expect(fixture.debugElement.nativeElement.textContent).not.toContain( + 'Emails must match' + ) + expect(component.saveDisabled).toBeFalsy() + }) + + it('should show additional confirmation field when password changes, warn with error & disable save', () => { + expect(component.form.get('password_confirm').enabled).toBeFalsy() + const getSpy = jest.spyOn(profileService, 'get') + getSpy.mockReturnValue(of(profile)) + component.ngOnInit() + component.form.get('password').patchValue('new*pass') + component.onPasswordKeyUp({ + target: { value: 'new*pass', tagName: 'input' }, + } as any) + component.onPasswordKeyUp({ target: { tagName: 'button' } } as any) // coverage + fixture.detectChanges() + expect(component.form.get('password_confirm').enabled).toBeTruthy() + expect(fixture.debugElement.nativeElement.textContent).toContain( + 'Passwords must match' + ) + expect(component.saveDisabled).toBeTruthy() + + component.form.get('password_confirm').patchValue('new*pass') + component.onPasswordConfirmKeyUp({ target: { value: 'new*pass' } } as any) + fixture.detectChanges() + expect(fixture.debugElement.nativeElement.textContent).not.toContain( + 'Passwords must match' + ) + expect(component.saveDisabled).toBeFalsy() + + component.form.get('password').patchValue(profile.password) + fixture.detectChanges() + expect(component.form.get('password_confirm').enabled).toBeFalsy() + expect(fixture.debugElement.nativeElement.textContent).not.toContain( + 'Passwords must match' + ) + expect(component.saveDisabled).toBeFalsy() + }) + + it('should logout on save if password changed', fakeAsync(() => { + const getSpy = jest.spyOn(profileService, 'get') + getSpy.mockReturnValue(of(profile)) + component.ngOnInit() + component['newPassword'] = 'new*pass' + component.form.get('password').patchValue('new*pass') + component.form.get('password_confirm').patchValue('new*pass') + + const updateSpy = jest.spyOn(profileService, 'update') + updateSpy.mockReturnValue(of(null)) + Object.defineProperty(window, 'location', { + value: { + href: 'http://localhost/', + }, + writable: true, // possibility to override + }) + component.save() + expect(updateSpy).toHaveBeenCalled() + tick(2600) + expect(window.location.href).toContain('logout') + })) + + it('should support auth token copy', fakeAsync(() => { + const getSpy = jest.spyOn(profileService, 'get') + getSpy.mockReturnValue(of(profile)) + component.ngOnInit() + const copySpy = jest.spyOn(clipboard, 'copy') + component.copyAuthToken() + expect(copySpy).toHaveBeenCalledWith(profile.auth_token) + expect(component.copied).toBeTruthy() + tick(3000) + expect(component.copied).toBeFalsy() + })) + + it('should support generate token, display error if needed', () => { + const getSpy = jest.spyOn(profileService, 'get') + getSpy.mockReturnValue(of(profile)) + + const generateSpy = jest.spyOn(profileService, 'generateAuthToken') + const errorSpy = jest.spyOn(toastService, 'showError') + generateSpy.mockReturnValueOnce( + throwError(() => new Error('failed to generate')) + ) + component.generateAuthToken() + expect(errorSpy).toHaveBeenCalled() + + generateSpy.mockClear() + const newToken = '789101112hijk' + generateSpy.mockReturnValueOnce(of(newToken)) + component.generateAuthToken() + expect(generateSpy).toHaveBeenCalled() + expect(component.form.get('auth_token').value).not.toEqual( + profile.auth_token + ) + expect(component.form.get('auth_token').value).toEqual(newToken) + }) +}) diff --git a/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts new file mode 100644 index 000000000..19391ce28 --- /dev/null +++ b/src-ui/src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts @@ -0,0 +1,184 @@ +import { Component, OnDestroy, OnInit } from '@angular/core' +import { FormControl, FormGroup } from '@angular/forms' +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' +import { ProfileService } from 'src/app/services/profile.service' +import { ToastService } from 'src/app/services/toast.service' +import { Subject, takeUntil } from 'rxjs' +import { Clipboard } from '@angular/cdk/clipboard' + +@Component({ + selector: 'pngx-profile-edit-dialog', + templateUrl: './profile-edit-dialog.component.html', + styleUrls: ['./profile-edit-dialog.component.scss'], +}) +export class ProfileEditDialogComponent implements OnInit, OnDestroy { + public networkActive: boolean = false + public error: any + private unsubscribeNotifier: Subject = new Subject() + + public form = new FormGroup({ + email: new FormControl(''), + email_confirm: new FormControl({ value: null, disabled: true }), + password: new FormControl(null), + password_confirm: new FormControl({ value: null, disabled: true }), + first_name: new FormControl(''), + last_name: new FormControl(''), + auth_token: new FormControl(''), + }) + + private currentPassword: string + private newPassword: string + private passwordConfirm: string + public showPasswordConfirm: boolean = false + + private currentEmail: string + private newEmail: string + private emailConfirm: string + public showEmailConfirm: boolean = false + + public copied: boolean = false + + constructor( + private profileService: ProfileService, + public activeModal: NgbActiveModal, + private toastService: ToastService, + private clipboard: Clipboard + ) {} + + ngOnInit(): void { + this.networkActive = true + this.profileService + .get() + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe((profile) => { + this.networkActive = false + this.form.patchValue(profile) + this.currentEmail = profile.email + this.form.get('email').valueChanges.subscribe((newEmail) => { + this.newEmail = newEmail + this.onEmailChange() + }) + this.currentPassword = profile.password + this.form.get('password').valueChanges.subscribe((newPassword) => { + this.newPassword = newPassword + this.onPasswordChange() + }) + }) + } + + ngOnDestroy(): void { + this.unsubscribeNotifier.next(true) + this.unsubscribeNotifier.complete() + } + + get saveDisabled(): boolean { + return this.error?.password_confirm || this.error?.email_confirm + } + + onEmailKeyUp(event: KeyboardEvent): void { + this.newEmail = (event.target as HTMLInputElement)?.value + this.onEmailChange() + } + + onEmailConfirmKeyUp(event: KeyboardEvent): void { + this.emailConfirm = (event.target as HTMLInputElement)?.value + this.onEmailChange() + } + + onEmailChange(): void { + this.showEmailConfirm = this.currentEmail !== this.newEmail + if (this.showEmailConfirm) { + this.form.get('email_confirm').enable() + if (this.newEmail !== this.emailConfirm) { + if (!this.error) this.error = {} + this.error.email_confirm = $localize`Emails must match` + } else { + delete this.error?.email_confirm + } + } else { + this.form.get('email_confirm').disable() + delete this.error?.email_confirm + } + } + + onPasswordKeyUp(event: KeyboardEvent): void { + if ((event.target as HTMLElement).tagName !== 'input') return // toggle button can trigger this handler + this.newPassword = (event.target as HTMLInputElement)?.value + this.onPasswordChange() + } + + onPasswordConfirmKeyUp(event: KeyboardEvent): void { + this.passwordConfirm = (event.target as HTMLInputElement)?.value + this.onPasswordChange() + } + + onPasswordChange(): void { + this.showPasswordConfirm = this.currentPassword !== this.newPassword + + if (this.showPasswordConfirm) { + this.form.get('password_confirm').enable() + if (this.newPassword !== this.passwordConfirm) { + if (!this.error) this.error = {} + this.error.password_confirm = $localize`Passwords must match` + } else { + delete this.error?.password_confirm + } + } else { + this.form.get('password_confirm').disable() + delete this.error?.password_confirm + } + } + + save(): void { + const passwordChanged = this.currentPassword !== this.newPassword + const profile = Object.assign({}, this.form.value) + this.networkActive = true + this.profileService + .update(profile) + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe({ + next: () => { + this.toastService.showInfo($localize`Profile updated successfully`) + if (passwordChanged) { + this.toastService.showInfo( + $localize`Password has been changed, you will be logged out momentarily.` + ) + setTimeout(() => { + window.location.href = `${window.location.origin}/accounts/logout/?next=/accounts/login/?next=/` + }, 2500) + } + this.activeModal.close() + }, + error: (error) => { + this.toastService.showError($localize`Error saving profile`, error) + this.networkActive = false + }, + }) + } + + cancel(): void { + this.activeModal.close() + } + + generateAuthToken(): void { + this.profileService.generateAuthToken().subscribe({ + next: (token: string) => { + this.form.patchValue({ auth_token: token }) + }, + error: (error) => { + this.toastService.showError( + $localize`Error generating auth token`, + error + ) + }, + }) + } + + copyAuthToken(): void { + this.clipboard.copy(this.form.get('auth_token').value) + this.copied = true + setTimeout(() => { + this.copied = false + }, 3000) + } +} diff --git a/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.spec.ts b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.spec.ts index 0abcd4e7c..27955a8a5 100644 --- a/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.spec.ts @@ -192,4 +192,24 @@ describe('ShareLinksDropdownComponent', () => { component.share(link) // expect(navigatorSpy).toHaveBeenCalledWith({ url: component.getShareUrl(link) }) }) + + it('should correctly generate share URLs', () => { + environment.apiBaseUrl = 'http://example.com/api/' + expect(component.getShareUrl({ slug: '123abc123' } as any)).toEqual( + 'http://example.com/share/123abc123' + ) + environment.apiBaseUrl = 'http://example.domainwithapiinit.com/api/' + expect(component.getShareUrl({ slug: '123abc123' } as any)).toEqual( + 'http://example.domainwithapiinit.com/share/123abc123' + ) + environment.apiBaseUrl = 'http://example.domainwithapiinit.com:1234/api/' + expect(component.getShareUrl({ slug: '123abc123' } as any)).toEqual( + 'http://example.domainwithapiinit.com:1234/share/123abc123' + ) + environment.apiBaseUrl = + 'http://example.domainwithapiinit.com:1234/subpath/api/' + expect(component.getShareUrl({ slug: '123abc123' } as any)).toEqual( + 'http://example.domainwithapiinit.com:1234/subpath/share/123abc123' + ) + }) }) diff --git a/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts index 3aff4823d..fa2df3a54 100644 --- a/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts +++ b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts @@ -80,7 +80,10 @@ export class ShareLinksDropdownComponent implements OnInit { } getShareUrl(link: PaperlessShareLink): string { - return `${environment.apiBaseUrl.replace('api', 'share')}${link.slug}` + const apiURL = new URL(environment.apiBaseUrl) + return `${apiURL.origin}${apiURL.pathname.replace(/\/api\/$/, '/share/')}${ + link.slug + }` } getDaysRemaining(link: PaperlessShareLink): string { diff --git a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts index f7e7ef919..4a9d01cc2 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts @@ -263,6 +263,7 @@ describe('DocumentDetailComponent', () => { toastService = TestBed.inject(ToastService) documentListViewService = TestBed.inject(DocumentListViewService) settingsService = TestBed.inject(SettingsService) + settingsService.currentUser = { id: 1 } customFieldsService = TestBed.inject(CustomFieldsService) fixture = TestBed.createComponent(DocumentDetailComponent) component = fixture.componentInstance diff --git a/src-ui/src/app/components/file-drop/file-drop.component.spec.ts b/src-ui/src/app/components/file-drop/file-drop.component.spec.ts index ec86ff2b2..d35bf54d9 100644 --- a/src-ui/src/app/components/file-drop/file-drop.component.spec.ts +++ b/src-ui/src/app/components/file-drop/file-drop.component.spec.ts @@ -84,7 +84,9 @@ describe('FileDropComponent', () => { it('should support drag drop, initiate upload', fakeAsync(() => { jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) expect(component.fileIsOver).toBeFalsy() - component.onDragOver(new Event('dragover') as DragEvent) + const overEvent = new Event('dragover') as DragEvent + ;(overEvent as any).dataTransfer = { types: ['Files'] } + component.onDragOver(overEvent) tick(1) fixture.detectChanges() expect(component.fileIsOver).toBeTruthy() @@ -151,7 +153,9 @@ describe('FileDropComponent', () => { const leaveSpy = jest.spyOn(component, 'onDragLeave') jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) settingsService.globalDropzoneEnabled = true - component.onDragOver(new Event('dragover') as DragEvent) + const overEvent = new Event('dragover') as DragEvent + ;(overEvent as any).dataTransfer = { types: ['Files'] } + component.onDragOver(overEvent) tick(1) expect(component.hidden).toBeFalsy() expect(component.fileIsOver).toBeTruthy() @@ -165,7 +169,9 @@ describe('FileDropComponent', () => { const leaveSpy = jest.spyOn(component, 'onDragLeave') jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) settingsService.globalDropzoneEnabled = true - component.onDragOver(new Event('dragover') as DragEvent) + const overEvent = new Event('dragover') as DragEvent + ;(overEvent as any).dataTransfer = { types: ['Files'] } + component.onDragOver(overEvent) tick(1) expect(component.hidden).toBeFalsy() expect(component.fileIsOver).toBeTruthy() diff --git a/src-ui/src/app/components/file-drop/file-drop.component.ts b/src-ui/src/app/components/file-drop/file-drop.component.ts index 0c9637b79..e45d816b0 100644 --- a/src-ui/src/app/components/file-drop/file-drop.component.ts +++ b/src-ui/src/app/components/file-drop/file-drop.component.ts @@ -38,8 +38,9 @@ export class FileDropComponent { @ViewChild('ngxFileDrop') ngxFileDrop: NgxFileDropComponent - @HostListener('dragover', ['$event ']) onDragOver(event: DragEvent) { - if (!this.dragDropEnabled) return + @HostListener('dragover', ['$event']) onDragOver(event: DragEvent) { + if (!this.dragDropEnabled || !event.dataTransfer?.types?.includes('Files')) + return event.preventDefault() event.stopImmediatePropagation() this.settings.globalDropzoneActive = true diff --git a/src-ui/src/app/data/paperless-consumption-template.ts b/src-ui/src/app/data/paperless-consumption-template.ts index c303fc8d4..94e6202c1 100644 --- a/src-ui/src/app/data/paperless-consumption-template.ts +++ b/src-ui/src/app/data/paperless-consumption-template.ts @@ -38,4 +38,6 @@ export interface PaperlessConsumptionTemplate extends ObjectWithId { assign_change_users?: number[] // [PaperlessUser.id] assign_change_groups?: number[] // [PaperlessGroup.id] + + assign_custom_fields?: number[] // [PaperlessCustomField.id] } diff --git a/src-ui/src/app/data/paperless-mail-rule.ts b/src-ui/src/app/data/paperless-mail-rule.ts index cc1bea0e7..f87ef55fa 100644 --- a/src-ui/src/app/data/paperless-mail-rule.ts +++ b/src-ui/src/app/data/paperless-mail-rule.ts @@ -49,7 +49,9 @@ export interface PaperlessMailRule extends ObjectWithPermissions { filter_body: string - filter_attachment_filename: string + filter_attachment_filename_include: string + + filter_attachment_filename_exclude: string maximum_age: number diff --git a/src-ui/src/app/data/user-profile.ts b/src-ui/src/app/data/user-profile.ts new file mode 100644 index 000000000..94012925a --- /dev/null +++ b/src-ui/src/app/data/user-profile.ts @@ -0,0 +1,7 @@ +export interface PaperlessUserProfile { + email?: string + password?: string + first_name?: string + last_name?: string + auth_token?: string +} diff --git a/src-ui/src/app/services/profile.service.spec.ts b/src-ui/src/app/services/profile.service.spec.ts new file mode 100644 index 000000000..f19a1312e --- /dev/null +++ b/src-ui/src/app/services/profile.service.spec.ts @@ -0,0 +1,54 @@ +import { TestBed } from '@angular/core/testing' + +import { ProfileService } from './profile.service' +import { + HttpClientTestingModule, + HttpTestingController, +} from '@angular/common/http/testing' +import { environment } from 'src/environments/environment' + +describe('ProfileService', () => { + let httpTestingController: HttpTestingController + let service: ProfileService + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ProfileService], + imports: [HttpClientTestingModule], + }) + + httpTestingController = TestBed.inject(HttpTestingController) + service = TestBed.inject(ProfileService) + }) + + afterEach(() => { + httpTestingController.verify() + }) + + it('calls get profile endpoint', () => { + service.get().subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}profile/` + ) + expect(req.request.method).toEqual('GET') + }) + + it('calls patch on update', () => { + service.update({ email: 'foo@bar.com' }).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}profile/` + ) + expect(req.request.method).toEqual('PATCH') + expect(req.request.body).toEqual({ + email: 'foo@bar.com', + }) + }) + + it('supports generating new auth token', () => { + service.generateAuthToken().subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}profile/generate_auth_token/` + ) + expect(req.request.method).toEqual('POST') + }) +}) diff --git a/src-ui/src/app/services/profile.service.ts b/src-ui/src/app/services/profile.service.ts new file mode 100644 index 000000000..de5aeb7a4 --- /dev/null +++ b/src-ui/src/app/services/profile.service.ts @@ -0,0 +1,34 @@ +import { HttpClient } from '@angular/common/http' +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs' +import { PaperlessUserProfile } from '../data/user-profile' +import { environment } from 'src/environments/environment' + +@Injectable({ + providedIn: 'root', +}) +export class ProfileService { + private endpoint = 'profile' + + constructor(private http: HttpClient) {} + + get(): Observable { + return this.http.get( + `${environment.apiBaseUrl}${this.endpoint}/` + ) + } + + update(profile: PaperlessUserProfile): Observable { + return this.http.patch( + `${environment.apiBaseUrl}${this.endpoint}/`, + profile + ) + } + + generateAuthToken(): Observable { + return this.http.post( + `${environment.apiBaseUrl}${this.endpoint}/generate_auth_token/`, + {} + ) + } +} diff --git a/src-ui/src/app/services/rest/mail-rule.service.spec.ts b/src-ui/src/app/services/rest/mail-rule.service.spec.ts index a83827182..69ef7cb34 100644 --- a/src-ui/src/app/services/rest/mail-rule.service.spec.ts +++ b/src-ui/src/app/services/rest/mail-rule.service.spec.ts @@ -23,7 +23,8 @@ const mail_rules = [ filter_to: null, filter_subject: null, filter_body: null, - filter_attachment_filename: null, + filter_attachment_filename_include: null, + filter_attachment_filename_exclude: null, maximum_age: 30, attachment_type: MailFilterAttachmentType.Everything, action: MailAction.MarkRead, @@ -40,7 +41,8 @@ const mail_rules = [ filter_to: null, filter_subject: null, filter_body: null, - filter_attachment_filename: null, + filter_attachment_filename_include: null, + filter_attachment_filename_exclude: null, maximum_age: 30, attachment_type: MailFilterAttachmentType.Everything, action: MailAction.Delete, @@ -57,7 +59,8 @@ const mail_rules = [ filter_to: null, filter_subject: null, filter_body: null, - filter_attachment_filename: null, + filter_attachment_filename_include: null, + filter_attachment_filename_exclude: null, maximum_age: 30, attachment_type: MailFilterAttachmentType.Everything, action: MailAction.Flag, diff --git a/src-ui/src/environments/environment.prod.ts b/src-ui/src/environments/environment.prod.ts index f0cc500c7..93603f0d1 100644 --- a/src-ui/src/environments/environment.prod.ts +++ b/src-ui/src/environments/environment.prod.ts @@ -5,7 +5,7 @@ export const environment = { apiBaseUrl: document.baseURI + 'api/', apiVersion: '3', appTitle: 'Paperless-ngx', - version: '2.0.0-dev', + version: '2.0.1-dev', webSocketHost: window.location.host, webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:', webSocketBaseUrl: base_url.pathname + 'ws/', diff --git a/src-ui/src/locale/messages.af_ZA.xlf b/src-ui/src/locale/messages.af_ZA.xlf index 4c3760907..5d0e3a806 100644 --- a/src-ui/src/locale/messages.af_ZA.xlf +++ b/src-ui/src/locale/messages.af_ZA.xlf @@ -466,15 +466,27 @@ Logboeke + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1598,19 +1606,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Verfris - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1634,7 +1634,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultate @@ -1642,7 +1642,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Inligting @@ -1650,7 +1650,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 klik vir volle afvoer @@ -1658,11 +1658,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Versteek @@ -1670,7 +1670,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open dokument @@ -1678,7 +1678,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Een taak} other { totale take}} @@ -1686,7 +1686,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Misluk @@ -1694,7 +1694,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Voltooid @@ -1702,7 +1702,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Begin @@ -1710,7 +1710,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Wagry @@ -1718,7 +1718,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Versteek gekose @@ -1726,7 +1726,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Versteek van alle @@ -1734,7 +1734,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Bevestig versteek van alle @@ -1742,7 +1742,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1750,7 +1750,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1758,7 +1758,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1766,7 +1766,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1774,7 +1774,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.ar_AR.xlf b/src-ui/src/locale/messages.ar_AR.xlf index 2bdeb0321..69aebac05 100644 --- a/src-ui/src/locale/messages.ar_AR.xlf +++ b/src-ui/src/locale/messages.ar_AR.xlf @@ -466,15 +466,27 @@ السجلات + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - تحديث - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 النتائج @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 معلومات @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 انقر لمشاهدة كامل الإخراج @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 رفض @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 فتح مستند @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, zero {} one { اجمالي المهام} two { اجمالي المهام} few { اجمالي المهام} many { اجمالي المهام}=1 {مهمة واحدة } other { اجمالي المهام}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 فشل @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 أكمل @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 بدأ @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 الانتظار @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 تحديد الرفض @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 رفض الجميع @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 تأكيد رفض الكل @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 تجاهل كل مهام؟ @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 في قائمة الانتظار @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 بدأ @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 اكتمل @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 فشلت diff --git a/src-ui/src/locale/messages.be_BY.xlf b/src-ui/src/locale/messages.be_BY.xlf index d4df5724b..ba2f47440 100644 --- a/src-ui/src/locale/messages.be_BY.xlf +++ b/src-ui/src/locale/messages.be_BY.xlf @@ -466,15 +466,27 @@ Логі + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Аднавіць - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Вынікі @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Інфармацыя @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 націсніце для поўнага вываду @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Адхіліць @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Адкрыць дакумент @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Не атрымалася @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Поўнае выкананне @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Пачатак @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 У чарзе @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Адхіліць выбранае @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Адхіліць усе @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Пацвердзіць Адхіліць усе @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 пачата @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.bg_BG.xlf b/src-ui/src/locale/messages.bg_BG.xlf index bdf7391a2..2526f711e 100644 --- a/src-ui/src/locale/messages.bg_BG.xlf +++ b/src-ui/src/locale/messages.bg_BG.xlf @@ -466,15 +466,27 @@ Дневници + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Опресняване - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Резултати @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Информация @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 щракнете за пълен резултат @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Отхвърляне @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Отваряне на документ @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, one {}=1 {Една задача} other { общо задачи}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Провалени @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Завършени @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Започнати @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Изчакващи @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Отхвърляне на селекцията @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Отхвърляне на всичко @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Потвърдете отхвърлянето на всичко @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Отхвърляне на всички задачи? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 на опашка @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 стартирано @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 завършени @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 неуспял diff --git a/src-ui/src/locale/messages.ca_ES.xlf b/src-ui/src/locale/messages.ca_ES.xlf index 6a69fe4af..4225ccb82 100644 --- a/src-ui/src/locale/messages.ca_ES.xlf +++ b/src-ui/src/locale/messages.ca_ES.xlf @@ -466,15 +466,27 @@ Logs + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresca - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultats @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 clic per veure sortida completa @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Descarta @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Obre Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, one {}=1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Fallit @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Completat @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Iniciat @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 A la cua @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Descarta seleccionats @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Descarta tot @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirma Descarta Tot @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Descarta totes tasques? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 a la cua @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 començat @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 acabat @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 Ha fallat diff --git a/src-ui/src/locale/messages.cs_CZ.xlf b/src-ui/src/locale/messages.cs_CZ.xlf index 13d333424..99d3c03c1 100644 --- a/src-ui/src/locale/messages.cs_CZ.xlf +++ b/src-ui/src/locale/messages.cs_CZ.xlf @@ -466,15 +466,27 @@ Záznamy + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informace @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 zahájeno @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.da_DK.xlf b/src-ui/src/locale/messages.da_DK.xlf index f23853e21..4b574d9e2 100644 --- a/src-ui/src/locale/messages.da_DK.xlf +++ b/src-ui/src/locale/messages.da_DK.xlf @@ -466,15 +466,27 @@ Logninger + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.de_DE.xlf b/src-ui/src/locale/messages.de_DE.xlf index 01dcf75cf..ace103ad4 100644 --- a/src-ui/src/locale/messages.de_DE.xlf +++ b/src-ui/src/locale/messages.de_DE.xlf @@ -466,15 +466,27 @@ Protokolle + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Aktualisieren - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Ergebnisse @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 Für vollständige Ausgabe anklicken @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Verwerfen @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Dokument öffnen @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Eine Aufgabe} other {Insgesamt Aufgaben}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Fehlgeschlagen @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Abgeschlossen @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Gestartet @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Ausstehend @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Ausgewählte verwerfen @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Alle verwerfen @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Alle verwerfen bestätigen @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Alle Aufgaben verwerfen? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 ausstehend @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 gestartet @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 abgeschlossen @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 fehlgeschlagen @@ -3019,7 +3019,7 @@ src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts 39 - Neues benutzerdefinidertes Feld erstellen + Neues benutzerdefiniertes Feld erstellen Edit custom field diff --git a/src-ui/src/locale/messages.el_GR.xlf b/src-ui/src/locale/messages.el_GR.xlf index 45491601c..24b70bd85 100644 --- a/src-ui/src/locale/messages.el_GR.xlf +++ b/src-ui/src/locale/messages.el_GR.xlf @@ -466,15 +466,27 @@ Αρχεία Καταγραφής + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Ανανέωση - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Αποτελέσματα @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Πληροφορίες @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 κάντε κλικ για το πλήρες αποτέλεσμα @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Παράβλεψη @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Άνοιγμα εγγράφου @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Μία εργασία} other { συνολικές εργασίες}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Απέτυχε @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Ολοκληρώθηκε @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Ξεκίνησε @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Στην ουρά @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Παράβλεψη επιλεγμένων @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Παράβλεψη όλων @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Επιβεβαίωση Παράβλεψης Όλων @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 στην ουρά @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 ξεκίνησε @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 ολοκληρώθηκε @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 απέτυχε diff --git a/src-ui/src/locale/messages.es_ES.xlf b/src-ui/src/locale/messages.es_ES.xlf index b93ad8dc9..a46c29508 100644 --- a/src-ui/src/locale/messages.es_ES.xlf +++ b/src-ui/src/locale/messages.es_ES.xlf @@ -466,15 +466,27 @@ Logs + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Actualizar - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultados @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Información @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 haz clic para obtener una salida completa @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Descartar @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Abrir documento @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, one {}=1 {Una tarea} other { en total tareas}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Error @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Completado @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Iniciado @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Encolado @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Descartar seleccionados @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Descartar todo @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirmar Descartar Todo @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.fi_FI.xlf b/src-ui/src/locale/messages.fi_FI.xlf index 1d7f28411..df1d1132c 100644 --- a/src-ui/src/locale/messages.fi_FI.xlf +++ b/src-ui/src/locale/messages.fi_FI.xlf @@ -466,15 +466,27 @@ Lokit + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Päivitä - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Tulokset @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 klikkaa saadaksesi täyden tulosteen @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Hylkää @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Avaa asiakirja @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Epäonnistui @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Onnistui @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Aloitettu @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Jonossa @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Poista valitut @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Poista kaikki @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Vahvista "poista kaikki" @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 jonossa @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 aloitettu @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 valmistui @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 epäonnistui diff --git a/src-ui/src/locale/messages.fr_FR.xlf b/src-ui/src/locale/messages.fr_FR.xlf index 89afbd485..952b8e738 100644 --- a/src-ui/src/locale/messages.fr_FR.xlf +++ b/src-ui/src/locale/messages.fr_FR.xlf @@ -466,15 +466,27 @@ Journaux + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Rafraîchir - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Résultats @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Information @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 cliquer pour obtenir l'affichage complet @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Ignorer @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Ouvrir le document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural,=1 {Une tâche } other { tâches }} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Échouées @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Réussies @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Commencées @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 En attente @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Ignorer la sélection @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Tout ignorer @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirmer « Tout ignorer » @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Ignorer les tâches ? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 liste d'attente @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 commencé @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 terminé @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 échec @@ -1960,13 +1960,13 @@ Erreur lors de l'enregistrement de l'utilisateur. - + Confirm delete user account src/app/components/admin/users-groups/users-groups.component.ts 114 - Confirmer la suppression du compte utilisateur + Confirmer la suppression du compte utilisateur This operation will permanently delete this user account. @@ -2797,13 +2797,13 @@ Affecter des autorisations de vue - + Assign edit permissions src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html 61 - Assigner des autorisations d'édition + Assigner des autorisations d'édition Error @@ -4159,13 +4159,13 @@ État - + Copy Raw Error src/app/components/common/toasts/toasts.component.html 33 - Erreur lors de la copie brute + Copier l'erreur brute Hello , welcome to Paperless-ngx @@ -6120,13 +6120,13 @@ Erreur lors de la récupération des règles de messagerie - + Saved account "". src/app/components/manage/mail/mail.component.ts 92 - Compte enregistré. + Compte enregistré. Error saving account. @@ -6136,21 +6136,21 @@ Erreur lors de l'enregistrement du compte. - + Confirm delete mail account src/app/components/manage/mail/mail.component.ts 112 - Confirmer la suppression du compte de messagerie + Confirmer la suppression du compte de messagerie - + This operation will permanently delete this mail account. src/app/components/manage/mail/mail.component.ts 113 - Cette opération supprimera définitivement ce compte de messagerie. + Cette opération supprimera définitivement ce compte de messagerie. Deleted mail account @@ -6216,13 +6216,13 @@ Erreur lors de la supression de la règle de messagerie. - + Permissions updated src/app/components/manage/mail/mail.component.ts 212 - Droits d'accès mis à jour + Droits d'accès mis à jour Error updating permissions diff --git a/src-ui/src/locale/messages.he_IL.xlf b/src-ui/src/locale/messages.he_IL.xlf index a83994c73..3b959df8f 100644 --- a/src-ui/src/locale/messages.he_IL.xlf +++ b/src-ui/src/locale/messages.he_IL.xlf @@ -466,15 +466,27 @@ יומני רישום + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - רענון - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 תוצאות @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 מידע @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 לחיצה תציג פלט מלא @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 התעלמות @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 פתח מסמך @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 הושלם @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 התחיל @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 בתור @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 בטל מסומנים @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 בטל הכל @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 אשר לבטל מסומנים @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 בתור @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 התחיל @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 הושלם @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 נכשל diff --git a/src-ui/src/locale/messages.hr_HR.xlf b/src-ui/src/locale/messages.hr_HR.xlf index 1a76efa33..f22825b74 100644 --- a/src-ui/src/locale/messages.hr_HR.xlf +++ b/src-ui/src/locale/messages.hr_HR.xlf @@ -466,15 +466,27 @@ Zapisnici + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informacije @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 započeto @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.hu_HU.xlf b/src-ui/src/locale/messages.hu_HU.xlf index 77f5df45a..21cd1b000 100644 --- a/src-ui/src/locale/messages.hu_HU.xlf +++ b/src-ui/src/locale/messages.hu_HU.xlf @@ -194,7 +194,7 @@ node_modules/src/ngb-config.ts 13 - Csökkenő órák + Órák csökkentése Next @@ -226,7 +226,7 @@ node_modules/src/ngb-config.ts 13 - Csökkenő percek + Percek csökkentése SS @@ -288,7 +288,7 @@ src/app/app.component.ts 92 - Document was added to Paperless-ngx. + A dokumentum hozzá lett adva a Paperless-ngx-hez. Open document @@ -316,7 +316,7 @@ src/app/app.component.ts 122 - Document is being processed by Paperless-ngx. + A dokumentumot a Paperless-ngx feldolgozza. Prev @@ -466,15 +466,27 @@ Naplók + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Automatikus frissítés + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1598,19 +1606,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Frissítés - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1634,7 +1634,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Eredmények @@ -1642,7 +1642,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Infó @@ -1650,7 +1650,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 kattintson a teljes kimenetért @@ -1658,11 +1658,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Elutasít @@ -1670,7 +1670,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Dokumentum megnyitása @@ -1678,7 +1678,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Egy feladat} other { összesen feladatok}} @@ -1686,7 +1686,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Sikertelen @@ -1694,7 +1694,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Teljes @@ -1702,7 +1702,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Elindult @@ -1710,7 +1710,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Várakozik @@ -1718,7 +1718,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Elveti a kijelöltet @@ -1726,7 +1726,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Elveti az összeset @@ -1734,7 +1734,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Összes elvetés megerősítése @@ -1742,7 +1742,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Az összes feladat elvetése? @@ -1750,7 +1750,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 várakozik @@ -1758,7 +1758,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 elindult @@ -1766,7 +1766,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 elkészült @@ -1774,7 +1774,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 sikertelen @@ -1928,7 +1928,7 @@ src/app/components/admin/users-groups/users-groups.component.html 55 - Új csoport + Csoport hozzáadása No groups defined @@ -2289,7 +2289,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.html 26 - Címkék + Jelölők Document Types @@ -4075,7 +4075,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 46 - Expires + Lejárati idő Create @@ -5856,7 +5856,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.html 1 - Consumption Templates + Felhasználói sablonok Add Template @@ -7065,7 +7065,7 @@ src/app/services/settings.service.ts 239 - Hungarian + Magyar Italian diff --git a/src-ui/src/locale/messages.id_ID.xlf b/src-ui/src/locale/messages.id_ID.xlf index 11c642547..f78d3104c 100644 --- a/src-ui/src/locale/messages.id_ID.xlf +++ b/src-ui/src/locale/messages.id_ID.xlf @@ -466,15 +466,27 @@ Log + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informasi @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.it_IT.xlf b/src-ui/src/locale/messages.it_IT.xlf index 8bd44d755..571d2169f 100644 --- a/src-ui/src/locale/messages.it_IT.xlf +++ b/src-ui/src/locale/messages.it_IT.xlf @@ -466,15 +466,27 @@ Log + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Aggiorna - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Risultati @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informazioni @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 clicca per l'output completo @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Ignora @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Apri Documento @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Una attività} other { totale attività}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Fallito @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Completato @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Aviato @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 In coda @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Ignora selezionati @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Ignora tutto @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Conferma Ignora Tutto @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 in coda @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 avviato @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completato @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 fallito diff --git a/src-ui/src/locale/messages.ko_KR.xlf b/src-ui/src/locale/messages.ko_KR.xlf index 4e29ddcb0..1261e630e 100644 --- a/src-ui/src/locale/messages.ko_KR.xlf +++ b/src-ui/src/locale/messages.ko_KR.xlf @@ -466,15 +466,27 @@ Logs + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.lb_LU.xlf b/src-ui/src/locale/messages.lb_LU.xlf index 70abc553d..02d24740d 100644 --- a/src-ui/src/locale/messages.lb_LU.xlf +++ b/src-ui/src/locale/messages.lb_LU.xlf @@ -466,15 +466,27 @@ Protokoller + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informatiounen @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Dokument opmaachen @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.lv_LV.xlf b/src-ui/src/locale/messages.lv_LV.xlf index faef9fc84..86e08bc84 100644 --- a/src-ui/src/locale/messages.lv_LV.xlf +++ b/src-ui/src/locale/messages.lv_LV.xlf @@ -466,15 +466,27 @@ Logs + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.nl_NL.xlf b/src-ui/src/locale/messages.nl_NL.xlf index 72980c757..275fd690d 100644 --- a/src-ui/src/locale/messages.nl_NL.xlf +++ b/src-ui/src/locale/messages.nl_NL.xlf @@ -288,7 +288,7 @@ src/app/app.component.ts 92 - Document was added to Paperless-ngx. + Document is toegevoegd aan Paperless-ngx. Open document @@ -316,7 +316,7 @@ src/app/app.component.ts 122 - Document is being processed by Paperless-ngx. + Document wordt verwerkt door Paperless-ngx. Prev @@ -466,15 +466,27 @@ Logbestanden + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Automatisch vernieuwen + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -756,7 +764,7 @@ src/app/components/admin/settings/settings.component.html 139,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. + Updatecontrole werkt door de openbare GitHub API te gebruiken om te bepalen of een nieuwe versie beschikbaar is. Het daadwerkelijk updaten van de app moet nog handmatig worden gedaan. No tracking data is collected by the app in any way. @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Vernieuw - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultaten @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informatie @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 klik voor volledige output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Verbergen @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Document openen @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Eén taak} other { taken in totaal}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Mislukt @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Voltooid @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Gestart @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Wachtrij @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Verberg geselecteerde @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Verberg alle @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Bevestig alles verbergen @@ -1740,15 +1740,15 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 - Dismiss all tasks? + Verberg alle taken? queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 in wachtrij @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 gestart @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 voltooid @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 mislukt @@ -2375,7 +2375,7 @@ src/app/components/app-frame/app-frame.component.html 199 - Administration + Beheer File Tasks @@ -2439,7 +2439,7 @@ src/app/components/app-frame/app-frame.component.ts 247 - Sidebar views updated + Zijbalkweergaven bijgewerkt Error updating sidebar views @@ -2447,7 +2447,7 @@ src/app/components/app-frame/app-frame.component.ts 250 - Error updating sidebar views + Fout tijdens bijwerken van zijbalkweergaven An error occurred while saving update checking settings. @@ -2563,7 +2563,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts 59 - Saved field "". + Veld "" opgeslagen. Error saving field. @@ -2683,7 +2683,7 @@ src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html 21 - Apply to documents that match this filename. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. + Toepassen op documenten die overeenkomen met deze bestandsnaam. Wildcards als *.pdf of *factuur* zijn toegestaan. Niet hoofdlettergevoelig. Filter path @@ -2699,7 +2699,7 @@ src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html 22 - Apply to documents that match this path. Wildcards specified as * are allowed. Case insensitive.</a> + Toepassen op documenten die overeenkomen met dit pad. Wildcards met * zijn toegestaan. Niet hoofdlettergevoelig.</a> Filter mail rule @@ -2707,7 +2707,7 @@ src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html 23 - Filter mail rule + Filter op e-mailregel Apply to documents consumed via this mail rule. @@ -2715,7 +2715,7 @@ src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html 23 - Apply to documents consumed via this mail rule. + Toepassen op documenten die via deze e-mailregel zijn toegevoegd. Assignments @@ -2723,7 +2723,7 @@ src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html 28 - Assignments + Toewijzingen Assign title @@ -2739,7 +2739,7 @@ src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html 33 - Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#consumption-templates'>documentation</a>. + Kan enkele placeholders bevatten, zie <a target='_blank' href='https://docs.paperless-ngx.com/usage/#consumption-templates'>documentatie</a>. Assign tags @@ -3019,7 +3019,7 @@ src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts 39 - Create new custom field + Nieuw aangepast veld Edit custom field @@ -3027,7 +3027,7 @@ src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts 43 - Edit custom field + Bewerk aangepast veld Create new document type @@ -3355,7 +3355,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 29 - Assignments specified here will supersede any consumption templates. + Deze toewijzingen zullen die van consumpiesjablonen vervangen. Assign title from @@ -3379,7 +3379,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 35 - Assign owner from rule + Eigenaar van regel toewijzen Only process attachments @@ -3471,7 +3471,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts 84 - Do not assign title from this rule + Titel van deze regel niet gebruiken Do not assign a correspondent @@ -3780,7 +3780,7 @@ src/app/components/common/input/url/url.component.html 8 - Remove + Verwijderen Invalid date. @@ -3885,7 +3885,7 @@ src/app/components/common/input/select/select.component.ts 92 - No items found + Geen items gevonden Add tag @@ -3909,7 +3909,7 @@ src/app/components/common/input/url/url.component.html 14 - Open link + Link openen Set permissions @@ -3917,7 +3917,7 @@ src/app/components/common/permissions-dialog/permissions-dialog.component.ts 28 - Set permissions + Rechten toepassen Edit permissions for @@ -3925,7 +3925,7 @@ src/app/components/common/permissions-dialog/permissions-dialog.component.ts 33 - Edit permissions for + Rechten bewerken voor Note that permissions set here will override any existing permissions @@ -4025,7 +4025,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 26 - Share Links + Gedeelde links No existing links @@ -4033,7 +4033,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 10,12 - No existing links + Geen bestaande links Copy @@ -4041,7 +4041,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 23 - Copy + Kopiëren Share @@ -4049,7 +4049,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 28 - Share + Delen Copied! @@ -4057,7 +4057,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 36 - Copied! + Gekopieerd! Share archive version @@ -4065,7 +4065,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 42 - Share archive version + Deel gearchiveerde versie Expires @@ -4073,7 +4073,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 46 - Expires + Verloopt Create @@ -4093,7 +4093,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 90 - 1 day + 1 dag 7 days @@ -4101,7 +4101,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 20 - 7 days + 7 dagen 30 days @@ -4109,7 +4109,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 21 - 30 days + 30 dagen Never @@ -4117,7 +4117,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 22 - Never + Nooit Error retrieving links @@ -4125,7 +4125,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 74 - Error retrieving links + Fout bij ophalen van links days @@ -4133,7 +4133,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 90 - days + dagen Error deleting link @@ -4141,7 +4141,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 117 - Error deleting link + Fout bij verwijderen link Error creating link @@ -4149,7 +4149,7 @@ src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 145 - Error creating link + Fout bij maken link Status @@ -4157,7 +4157,7 @@ src/app/components/common/toasts/toasts.component.html 22 - Status + Status Copy Raw Error @@ -4165,7 +4165,7 @@ src/app/components/common/toasts/toasts.component.html 33 - Copy Raw Error + Kopieer onbewerkte foutmelding Hello , welcome to Paperless-ngx @@ -4189,7 +4189,7 @@ src/app/components/dashboard/dashboard.component.ts 71 - Dashboard updated + Dashboard bijgewerkt Error updating dashboard @@ -4197,7 +4197,7 @@ src/app/components/dashboard/dashboard.component.ts 74 - Error updating dashboard + Fout bij bijwerken dashboard Show all @@ -4301,7 +4301,7 @@ src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html 53 - No documents + Geen documenten Statistics @@ -4373,7 +4373,7 @@ src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 4 - Drop documents anywhere or + Sleep documenten hierheen of Browse files @@ -4884,7 +4884,7 @@ src/app/components/document-detail/document-detail.component.ts 655 - Error deleting document + Fout bij verwijderen document Redo OCR confirm @@ -4920,7 +4920,7 @@ src/app/components/document-detail/document-detail.component.ts 698 - Error executing operation + Fout bij uitvoeren bewerking Select: @@ -5024,7 +5024,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts 185 - Error executing bulk operation + Fout bij uitvoeren bulkbewerking "" @@ -5698,7 +5698,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts 211 - Custom fields + Aangepaste velden Advanced search @@ -5830,7 +5830,7 @@ src/app/components/document-notes/document-notes.component.ts 80 - Error deleting note + Fout bij verwijderen notitie Drop files to begin upload @@ -5854,7 +5854,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.html 1 - Consumption Templates + Consumptie sjablonen Add Template @@ -5862,7 +5862,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.html 6 - Add Template + Sjalboon toevoegen Document Sources @@ -5870,7 +5870,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.html 16 - Document Sources + Documentbron No templates defined. @@ -5878,7 +5878,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.html 42 - No templates defined. + Geen sjablonen aangemaakt. Saved template "". @@ -5886,7 +5886,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.ts 73 - Saved template "". + Sjabloon "" opgeslagen. Error saving template. @@ -5894,7 +5894,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.ts 81 - Error saving template. + Fout bij opslaan sjabloon. Confirm delete template @@ -5902,7 +5902,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.ts 89 - Confirm delete template + Bevestig sjabloon verwijderen This operation will permanently delete this template. @@ -5910,7 +5910,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.ts 90 - This operation will permanently delete this template. + Deze bewerking zal dit sjabloon permanent verwijderen. Deleted template @@ -5918,7 +5918,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.ts 99 - Deleted template + Sjabloon verwijderd Error deleting template. @@ -5926,7 +5926,7 @@ src/app/components/manage/consumption-templates/consumption-templates.component.ts 104 - Error deleting template. + Fout bij verwijderen sjabloon. correspondent @@ -5966,7 +5966,7 @@ src/app/components/manage/custom-fields/custom-fields.component.html 6 - Add Field + Veld toevoegen Data Type @@ -5974,7 +5974,7 @@ src/app/components/manage/custom-fields/custom-fields.component.html 15 - Data Type + Gegevenstype No fields defined. @@ -5982,7 +5982,7 @@ src/app/components/manage/custom-fields/custom-fields.component.html 40 - No fields defined. + Geen velden aangemaakt. Confirm delete field @@ -5990,7 +5990,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts 74 - Confirm delete field + Bevestig veld verwijderen This operation will permanently delete this field. @@ -5998,7 +5998,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts 75 - This operation will permanently delete this field. + Deze bewerking zal dit veld permanent verwijderen. Deleted field @@ -6006,7 +6006,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts 84 - Deleted field + Veld verwijderd Error deleting field. @@ -6014,7 +6014,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts 89 - Error deleting field. + Fout bij verwijderen veld. document type @@ -6046,7 +6046,7 @@ src/app/components/manage/mail/mail.component.html 1 - Mail Settings + E-mail instellingen Mail accounts @@ -6222,7 +6222,7 @@ src/app/components/manage/mail/mail.component.ts 212 - Permissions updated + Rechten bijgewerkt Error updating permissions @@ -6234,7 +6234,7 @@ src/app/components/manage/management-list/management-list.component.ts 300 - Error updating permissions + Fout bij bijwerken rechten Create @@ -6254,7 +6254,7 @@ src/app/components/manage/management-list/management-list.component.html 13,17 - Create + Maak Filter by: @@ -6426,7 +6426,7 @@ src/app/components/manage/management-list/management-list.component.ts 219 - Error while deleting element + Fout tijdens het verwijderen van element Permissions updated successfully @@ -6434,7 +6434,7 @@ src/app/components/manage/management-list/management-list.component.ts 293 - Permissions updated successfully + Rechten succesvol bijgewerkt storage path @@ -6602,7 +6602,7 @@ src/app/data/paperless-custom-field.ts 16 - Boolean + Boolean Date @@ -6610,7 +6610,7 @@ src/app/data/paperless-custom-field.ts 20 - Date + Datum Integer @@ -6618,7 +6618,7 @@ src/app/data/paperless-custom-field.ts 24 - Integer + Geheel getal Number @@ -6626,7 +6626,7 @@ src/app/data/paperless-custom-field.ts 28 - Number + Getal Monetary @@ -6634,7 +6634,7 @@ src/app/data/paperless-custom-field.ts 32 - Monetary + Monetair Text @@ -6642,7 +6642,7 @@ src/app/data/paperless-custom-field.ts 36 - Text + Tekst Url @@ -6650,7 +6650,7 @@ src/app/data/paperless-custom-field.ts 40 - Url + Url Warning: You have unsaved changes to your document(s). @@ -6959,7 +6959,7 @@ src/app/services/settings.service.ts 161 - Afrikaans + Afrikaans Arabic @@ -6983,7 +6983,7 @@ src/app/services/settings.service.ts 179 - Bulgarian + Bulgaars Catalan @@ -7023,7 +7023,7 @@ src/app/services/settings.service.ts 209 - Greek + Grieks English (GB) @@ -7063,7 +7063,7 @@ src/app/services/settings.service.ts 239 - Hungarian + Hongaars Italian @@ -7095,7 +7095,7 @@ src/app/services/settings.service.ts 263 - Norwegian + Noors Polish diff --git a/src-ui/src/locale/messages.no_NO.xlf b/src-ui/src/locale/messages.no_NO.xlf index e62e6cb4c..fbb14002b 100644 --- a/src-ui/src/locale/messages.no_NO.xlf +++ b/src-ui/src/locale/messages.no_NO.xlf @@ -466,15 +466,27 @@ Logger + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Oppdater - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultater @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 klikk for full utdata @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Avvis @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Åpne dokument @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {En oppgave} other { totalt oppgaver}}}"/> @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Feilet @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Avvis valgte @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Avvis alle @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Bekreft avvisning av alle @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 i kø @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 startet @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 fullført @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 feilet diff --git a/src-ui/src/locale/messages.pl_PL.xlf b/src-ui/src/locale/messages.pl_PL.xlf index 7f40223e7..6495a4545 100644 --- a/src-ui/src/locale/messages.pl_PL.xlf +++ b/src-ui/src/locale/messages.pl_PL.xlf @@ -466,15 +466,27 @@ Logi + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Odśwież - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Wyniki @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informacje @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 kliknij, aby uzyskać pełne dane @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Odrzuć @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Otwórz dokument @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Odrzuć zaznaczone @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Odrzuć wszystkie @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Potwierdź odrzucenie wszystkich @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 start @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.pt_BR.xlf b/src-ui/src/locale/messages.pt_BR.xlf index 6c3a5060a..8541ee690 100644 --- a/src-ui/src/locale/messages.pt_BR.xlf +++ b/src-ui/src/locale/messages.pt_BR.xlf @@ -466,15 +466,27 @@ Logs + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Atualizar - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultados @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informação @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 clique para obter a saída completa @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dispensar @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Abrir Documento @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dispensar selecionado @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dispensar todos @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirmar Dispensar Todos @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.pt_PT.xlf b/src-ui/src/locale/messages.pt_PT.xlf index 4760f7ae4..f7a065810 100644 --- a/src-ui/src/locale/messages.pt_PT.xlf +++ b/src-ui/src/locale/messages.pt_PT.xlf @@ -466,15 +466,27 @@ Registos + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Atualizar - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultados @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informação @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dispensar @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Abrir documento @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural,=1 {Umatarefa}other { tarefas no total}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Falha @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Completo @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Iniciado @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Em fila @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Descartar selecionado @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Descartar todos @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirmar o descartar de todos @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 em fila @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 iniciado @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completo @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 falhou diff --git a/src-ui/src/locale/messages.ro_RO.xlf b/src-ui/src/locale/messages.ro_RO.xlf index 32d28036d..34661010b 100644 --- a/src-ui/src/locale/messages.ro_RO.xlf +++ b/src-ui/src/locale/messages.ro_RO.xlf @@ -466,15 +466,27 @@ Jurnale + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informații @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.ru_RU.xlf b/src-ui/src/locale/messages.ru_RU.xlf index a6432627f..6cb82acb4 100644 --- a/src-ui/src/locale/messages.ru_RU.xlf +++ b/src-ui/src/locale/messages.ru_RU.xlf @@ -466,15 +466,27 @@ Логи + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Обновить - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Результаты @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Информация @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 нажать для полного вывода @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Отклонить @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Открыть документ @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Неудачно @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Отменить выбранное @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Отменить все @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Подтвердить отмену всех @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 запущено @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.sk_SK.xlf b/src-ui/src/locale/messages.sk_SK.xlf index fa596448c..69b26900a 100644 --- a/src-ui/src/locale/messages.sk_SK.xlf +++ b/src-ui/src/locale/messages.sk_SK.xlf @@ -466,15 +466,27 @@ Logy + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Obnoviť - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Výsledky @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 kliknite pre celý výstup @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Zrušiť @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Otvoriť dokument @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Jedna úloha} other { celkom úloh}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Neúspešné @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Úspešné @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Spustené @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Čakajúce @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Odstrániť vybrané @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Odstrániť všetky @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Potvrdenie odstránenia @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 v poradí @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 prebieha @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 dokončené @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 neúspešné diff --git a/src-ui/src/locale/messages.sl_SI.xlf b/src-ui/src/locale/messages.sl_SI.xlf index 9188d9b77..7a9cf2220 100644 --- a/src-ui/src/locale/messages.sl_SI.xlf +++ b/src-ui/src/locale/messages.sl_SI.xlf @@ -466,15 +466,27 @@ Dnevniki + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Osveži - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Rezultat @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informacije @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 kliknite za celoten izpis @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Opusti @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Odpri dokument @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Ena naloga} other { skupno nalog}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Neuspešno @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Dokončano @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Začeto @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Čaka @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Opusti izbrano @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Opusti vse @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Potrdi Opusti vse @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Opustite vsa opravila? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 čaka @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 začeto @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 končano @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 neuspešno diff --git a/src-ui/src/locale/messages.sr_CS.xlf b/src-ui/src/locale/messages.sr_CS.xlf index bceeb4085..bee916d17 100644 --- a/src-ui/src/locale/messages.sr_CS.xlf +++ b/src-ui/src/locale/messages.sr_CS.xlf @@ -466,15 +466,27 @@ Logovi + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Osveži - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Rezultati @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Informacije @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 klikni za pun prikaz @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Odbaci @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Otvori dokument @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Neuspešno @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Završeno @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Pokrenuto @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Na čekanju @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Odbaci selektovano @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Odbaci sve @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Potvrdi odbacivanje svega @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Odbaci sve zadatke? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 čekanje @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 pokrenuto @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 završeno @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 neuspešno diff --git a/src-ui/src/locale/messages.sv_SE.xlf b/src-ui/src/locale/messages.sv_SE.xlf index bc7772a14..41fa476fe 100644 --- a/src-ui/src/locale/messages.sv_SE.xlf +++ b/src-ui/src/locale/messages.sv_SE.xlf @@ -466,15 +466,27 @@ Loggar + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Uppdatera - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Resultat @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 klicka för full utdata @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Avvisa @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Öppna Dokument @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, one {}=1 {En uppgift} other { totalt uppgifter}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Misslyckades @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Lyckades @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Startade @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Köade @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Avfärda markerade @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Avfärda alla @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Bekräfta avfärda alla @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 köade @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 startade @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 slutförda @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 misslyckade diff --git a/src-ui/src/locale/messages.th_TH.xlf b/src-ui/src/locale/messages.th_TH.xlf index 8e9d28226..8bd9f8e54 100644 --- a/src-ui/src/locale/messages.th_TH.xlf +++ b/src-ui/src/locale/messages.th_TH.xlf @@ -466,15 +466,27 @@ Logs + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - รีเฟรช - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 ผลลัพธ์ @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 ข้อมูล @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 ปิด @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 เปิดเอกสาร @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 ล้างการเลือก @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 ละทิ้งทั้งหมด @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 ยืนยันล้างทั้งหมด @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 จัดคิวแล้ว @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 เริ่มต้นแล้ว @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 เสร็จสมบูรณ์ @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 ล้มเหลว diff --git a/src-ui/src/locale/messages.tr_TR.xlf b/src-ui/src/locale/messages.tr_TR.xlf index 4164f0a49..550512d2b 100644 --- a/src-ui/src/locale/messages.tr_TR.xlf +++ b/src-ui/src/locale/messages.tr_TR.xlf @@ -466,15 +466,27 @@ Günlükler + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Yenile - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Sonuçlar @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Bilgi @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Yoksay @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Belgeyi Aç @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Seçilenleri temizle @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 başladı @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.uk_UA.xlf b/src-ui/src/locale/messages.uk_UA.xlf index 57073cb7f..2ab29dee1 100644 --- a/src-ui/src/locale/messages.uk_UA.xlf +++ b/src-ui/src/locale/messages.uk_UA.xlf @@ -466,15 +466,27 @@ Логи + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Оновити - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Результати @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Інформація @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 натисніть для повного виведення @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Відхилити @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Відкрити документ @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {Одне завдання} other { всього завдань}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Невдачі @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Завершено @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Розпочато @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 У черзі @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Відхилити вибрані @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Відхилити все @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Підтвердити відхилення всіх @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 в черзі @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 запущено @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 завершено @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 невдачі diff --git a/src-ui/src/locale/messages.vi_VN.xlf b/src-ui/src/locale/messages.vi_VN.xlf index aad663995..efc231e33 100644 --- a/src-ui/src/locale/messages.vi_VN.xlf +++ b/src-ui/src/locale/messages.vi_VN.xlf @@ -466,15 +466,27 @@ Nhật ký + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Tải lại - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Kết quả @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Thông tin @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click để có đầu ra đầy đủ @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Bỏ qua @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Mở tài liệu @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Loại bỏ đã được chọn @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Bỏ qua tất cả @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Xác nhận loại bỏ tất cả @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed @@ -1802,7 +1802,7 @@ src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html 68 - Users + Người dùng Add User @@ -1810,7 +1810,7 @@ src/app/components/admin/users-groups/users-groups.component.html 11 - Add User + Thêm Người dùng Username diff --git a/src-ui/src/locale/messages.zh_CN.xlf b/src-ui/src/locale/messages.zh_CN.xlf index f2fe51fbf..ee0ddee76 100644 --- a/src-ui/src/locale/messages.zh_CN.xlf +++ b/src-ui/src/locale/messages.zh_CN.xlf @@ -466,15 +466,27 @@ 日志 + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - 刷新 - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 结果 @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 信息 @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 单击以获取完整输出 @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 关闭 @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 打开文档 @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 失败 @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 完成 @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 开始 @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 排队 @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 取消选择 @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 取消所有 @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 确认取消所有 @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 已开始 @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src-ui/src/locale/messages.zh_TW.xlf b/src-ui/src/locale/messages.zh_TW.xlf index 1e32e4a53..aadb208d2 100644 --- a/src-ui/src/locale/messages.zh_TW.xlf +++ b/src-ui/src/locale/messages.zh_TW.xlf @@ -466,15 +466,27 @@ Logs + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 4 + + + src/app/components/admin/tasks/tasks.component.html + 15 + + Auto refresh + Loading... src/app/components/admin/logs/logs.component.html - 11 + 16 src/app/components/admin/logs/logs.component.html - 20 + 25 src/app/components/admin/settings/settings.component.html @@ -482,11 +494,7 @@ src/app/components/admin/tasks/tasks.component.html - 19 - - - src/app/components/admin/tasks/tasks.component.html - 27 + 22 src/app/components/admin/users-groups/users-groups.component.html @@ -1106,7 +1114,7 @@ src/app/components/admin/tasks/tasks.component.html - 40 + 35 src/app/components/admin/users-groups/users-groups.component.html @@ -1246,7 +1254,7 @@ src/app/components/admin/tasks/tasks.component.html - 44 + 39 src/app/components/admin/users-groups/users-groups.component.html @@ -1596,19 +1604,11 @@ - - Refresh - - src/app/components/admin/tasks/tasks.component.html - 20 - - Refresh - Created src/app/components/admin/tasks/tasks.component.html - 41 + 36 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -1632,7 +1632,7 @@ Results src/app/components/admin/tasks/tasks.component.html - 42 + 37 Results @@ -1640,7 +1640,7 @@ Info src/app/components/admin/tasks/tasks.component.html - 43 + 38 Info @@ -1648,7 +1648,7 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 66 + 61 click for full output @@ -1656,11 +1656,11 @@ Dismiss src/app/components/admin/tasks/tasks.component.html - 81 + 76 src/app/components/admin/tasks/tasks.component.ts - 63 + 66 Dismiss @@ -1668,7 +1668,7 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 87 + 82 Open Document @@ -1676,7 +1676,7 @@ {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 103 + 98 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} @@ -1684,7 +1684,7 @@ Failed src/app/components/admin/tasks/tasks.component.html - 110 + 105 Failed @@ -1692,7 +1692,7 @@ Complete src/app/components/admin/tasks/tasks.component.html - 116 + 111 Complete @@ -1700,7 +1700,7 @@ Started src/app/components/admin/tasks/tasks.component.html - 122 + 117 Started @@ -1708,7 +1708,7 @@ Queued src/app/components/admin/tasks/tasks.component.html - 128 + 123 Queued @@ -1716,7 +1716,7 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 28 + 30 Dismiss selected @@ -1724,7 +1724,7 @@ Dismiss all src/app/components/admin/tasks/tasks.component.ts - 29 + 31 Dismiss all @@ -1732,7 +1732,7 @@ Confirm Dismiss All src/app/components/admin/tasks/tasks.component.ts - 60 + 63 Confirm Dismiss All @@ -1740,7 +1740,7 @@ Dismiss all tasks? src/app/components/admin/tasks/tasks.component.ts - 61 + 64 Dismiss all tasks? @@ -1748,7 +1748,7 @@ queued src/app/components/admin/tasks/tasks.component.ts - 129 + 132 queued @@ -1756,7 +1756,7 @@ started src/app/components/admin/tasks/tasks.component.ts - 131 + 134 started @@ -1764,7 +1764,7 @@ completed src/app/components/admin/tasks/tasks.component.ts - 133 + 136 completed @@ -1772,7 +1772,7 @@ failed src/app/components/admin/tasks/tasks.component.ts - 135 + 138 failed diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 47dba9412..4f97881ef 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -29,6 +29,8 @@ from documents.loggers import LoggingMixin from documents.matching import document_matches_template from documents.models import ConsumptionTemplate from documents.models import Correspondent +from documents.models import CustomField +from documents.models import CustomFieldInstance from documents.models import Document from documents.models import DocumentType from documents.models import FileInfo @@ -124,6 +126,7 @@ class Consumer(LoggingMixin): self.override_asn = None self.task_id = None self.override_owner_id = None + self.override_custom_field_ids = None self.channel_layer = get_channel_layer() @@ -333,6 +336,7 @@ class Consumer(LoggingMixin): override_view_groups=None, override_change_users=None, override_change_groups=None, + override_custom_field_ids=None, ) -> Document: """ Return the document object if it was successfully created. @@ -353,6 +357,7 @@ class Consumer(LoggingMixin): self.override_view_groups = override_view_groups self.override_change_users = override_change_users self.override_change_groups = override_change_groups + self.override_custom_field_ids = override_custom_field_ids self._send_progress( 0, @@ -519,7 +524,11 @@ class Consumer(LoggingMixin): document.filename = generate_unique_filename(document) create_source_path_directory(document.source_path) - self._write(document.storage_type, self.path, document.source_path) + self._write( + document.storage_type, + self.original_path, + document.source_path, + ) self._write( document.storage_type, @@ -640,6 +649,11 @@ class Consumer(LoggingMixin): template_overrides.change_groups = [ group.pk for group in template.assign_change_groups.all() ] + if template.assign_custom_fields is not None: + template_overrides.custom_field_ids = [ + field.pk for field in template.assign_custom_fields.all() + ] + overrides.update(template_overrides) return overrides @@ -711,21 +725,20 @@ class Consumer(LoggingMixin): storage_type = Document.STORAGE_TYPE_UNENCRYPTED - with open(self.path, "rb") as f: - document = Document.objects.create( - title=( - self._parse_title_placeholders(self.override_title) - if self.override_title is not None - else file_info.title - )[:127], - content=text, - mime_type=mime_type, - checksum=hashlib.md5(f.read()).hexdigest(), - created=create_date, - modified=create_date, - storage_type=storage_type, - original_filename=self.filename, - ) + document = Document.objects.create( + title=( + self._parse_title_placeholders(self.override_title) + if self.override_title is not None + else file_info.title + )[:127], + content=text, + mime_type=mime_type, + checksum=hashlib.md5(self.original_path.read_bytes()).hexdigest(), + created=create_date, + modified=create_date, + storage_type=storage_type, + original_filename=self.filename, + ) self.apply_overrides(document) @@ -779,6 +792,14 @@ class Consumer(LoggingMixin): } set_permissions_for_object(permissions=permissions, object=document) + if self.override_custom_field_ids: + for field_id in self.override_custom_field_ids: + field = CustomField.objects.get(pk=field_id) + CustomFieldInstance.objects.create( + field=field, + document=document, + ) # adds to document + def _write(self, storage_type, source, target): with open(source, "rb") as read_file, open(target, "wb") as write_file: write_file.write(read_file.read()) diff --git a/src/documents/data_models.py b/src/documents/data_models.py index 29a23fa7a..8b53e2c14 100644 --- a/src/documents/data_models.py +++ b/src/documents/data_models.py @@ -28,6 +28,7 @@ class DocumentMetadataOverrides: view_groups: Optional[list[int]] = None change_users: Optional[list[int]] = None change_groups: Optional[list[int]] = None + custom_field_ids: Optional[list[int]] = None def update(self, other: "DocumentMetadataOverrides") -> "DocumentMetadataOverrides": """ @@ -74,6 +75,12 @@ class DocumentMetadataOverrides: self.change_groups = other.change_groups elif other.change_groups is not None: self.change_groups.extend(other.change_groups) + + if self.custom_field_ids is None: + self.custom_field_ids = other.custom_field_ids + elif other.custom_field_ids is not None: + self.custom_field_ids.extend(other.custom_field_ids) + return self diff --git a/src/documents/migrations/1041_alter_consumptiontemplate_sources.py b/src/documents/migrations/1041_alter_consumptiontemplate_sources.py new file mode 100644 index 000000000..c96dc53cf --- /dev/null +++ b/src/documents/migrations/1041_alter_consumptiontemplate_sources.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.7 on 2023-11-30 14:29 + +import multiselectfield.db.fields +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "1040_customfield_customfieldinstance_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="consumptiontemplate", + name="sources", + field=multiselectfield.db.fields.MultiSelectField( + choices=[(1, "Consume Folder"), (2, "Api Upload"), (3, "Mail Fetch")], + default="1,2,3", + max_length=5, + ), + ), + ] diff --git a/src/documents/migrations/1042_consumptiontemplate_assign_custom_fields.py b/src/documents/migrations/1042_consumptiontemplate_assign_custom_fields.py new file mode 100644 index 000000000..08d6062ea --- /dev/null +++ b/src/documents/migrations/1042_consumptiontemplate_assign_custom_fields.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.7 on 2023-11-30 17:44 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "1041_alter_consumptiontemplate_sources"), + ] + + operations = [ + migrations.AddField( + model_name="consumptiontemplate", + name="assign_custom_fields", + field=models.ManyToManyField( + blank=True, + related_name="+", + to="documents.customfield", + verbose_name="assign these custom fields", + ), + ), + ] diff --git a/src/documents/models.py b/src/documents/models.py index 04a3230e6..d688253de 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -743,140 +743,6 @@ class ShareLink(models.Model): return f"Share Link for {self.document.title}" -class ConsumptionTemplate(models.Model): - class DocumentSourceChoices(models.IntegerChoices): - CONSUME_FOLDER = DocumentSource.ConsumeFolder.value, _("Consume Folder") - API_UPLOAD = DocumentSource.ApiUpload.value, _("Api Upload") - MAIL_FETCH = DocumentSource.MailFetch.value, _("Mail Fetch") - - name = models.CharField(_("name"), max_length=256, unique=True) - - order = models.IntegerField(_("order"), default=0) - - sources = MultiSelectField( - max_length=3, - choices=DocumentSourceChoices.choices, - default=f"{DocumentSource.ConsumeFolder},{DocumentSource.ApiUpload},{DocumentSource.MailFetch}", - ) - - filter_path = models.CharField( - _("filter path"), - max_length=256, - null=True, - blank=True, - help_text=_( - "Only consume documents with a path that matches " - "this if specified. Wildcards specified as * are " - "allowed. Case insensitive.", - ), - ) - - filter_filename = models.CharField( - _("filter filename"), - max_length=256, - null=True, - blank=True, - help_text=_( - "Only consume documents which entirely match this " - "filename if specified. Wildcards such as *.pdf or " - "*invoice* are allowed. Case insensitive.", - ), - ) - - filter_mailrule = models.ForeignKey( - "paperless_mail.MailRule", - null=True, - blank=True, - on_delete=models.SET_NULL, - verbose_name=_("filter documents from this mail rule"), - ) - - assign_title = models.CharField( - _("assign title"), - max_length=256, - null=True, - blank=True, - help_text=_( - "Assign a document title, can include some placeholders, " - "see documentation.", - ), - ) - - assign_tags = models.ManyToManyField( - Tag, - blank=True, - verbose_name=_("assign this tag"), - ) - - assign_document_type = models.ForeignKey( - DocumentType, - null=True, - blank=True, - on_delete=models.SET_NULL, - verbose_name=_("assign this document type"), - ) - - assign_correspondent = models.ForeignKey( - Correspondent, - null=True, - blank=True, - on_delete=models.SET_NULL, - verbose_name=_("assign this correspondent"), - ) - - assign_storage_path = models.ForeignKey( - StoragePath, - null=True, - blank=True, - on_delete=models.SET_NULL, - verbose_name=_("assign this storage path"), - ) - - assign_owner = models.ForeignKey( - User, - null=True, - blank=True, - on_delete=models.SET_NULL, - related_name="+", - verbose_name=_("assign this owner"), - ) - - assign_view_users = models.ManyToManyField( - User, - blank=True, - related_name="+", - verbose_name=_("grant view permissions to these users"), - ) - - assign_view_groups = models.ManyToManyField( - Group, - blank=True, - related_name="+", - verbose_name=_("grant view permissions to these groups"), - ) - - assign_change_users = models.ManyToManyField( - User, - blank=True, - related_name="+", - verbose_name=_("grant change permissions to these users"), - ) - - assign_change_groups = models.ManyToManyField( - Group, - blank=True, - related_name="+", - verbose_name=_("grant change permissions to these groups"), - ) - - class Meta: - verbose_name = _("consumption template") - verbose_name_plural = _("consumption templates") - - def __str__(self): - return f"{self.name}" - - class CustomField(models.Model): """ Defines the name and type of a custom field @@ -1013,3 +879,144 @@ if settings.AUDIT_LOG_ENABLED: auditlog.register(Note) auditlog.register(CustomField) auditlog.register(CustomFieldInstance) + + +class ConsumptionTemplate(models.Model): + class DocumentSourceChoices(models.IntegerChoices): + CONSUME_FOLDER = DocumentSource.ConsumeFolder.value, _("Consume Folder") + API_UPLOAD = DocumentSource.ApiUpload.value, _("Api Upload") + MAIL_FETCH = DocumentSource.MailFetch.value, _("Mail Fetch") + + name = models.CharField(_("name"), max_length=256, unique=True) + + order = models.IntegerField(_("order"), default=0) + + sources = MultiSelectField( + max_length=5, + choices=DocumentSourceChoices.choices, + default=f"{DocumentSource.ConsumeFolder},{DocumentSource.ApiUpload},{DocumentSource.MailFetch}", + ) + + filter_path = models.CharField( + _("filter path"), + max_length=256, + null=True, + blank=True, + help_text=_( + "Only consume documents with a path that matches " + "this if specified. Wildcards specified as * are " + "allowed. Case insensitive.", + ), + ) + + filter_filename = models.CharField( + _("filter filename"), + max_length=256, + null=True, + blank=True, + help_text=_( + "Only consume documents which entirely match this " + "filename if specified. Wildcards such as *.pdf or " + "*invoice* are allowed. Case insensitive.", + ), + ) + + filter_mailrule = models.ForeignKey( + "paperless_mail.MailRule", + null=True, + blank=True, + on_delete=models.SET_NULL, + verbose_name=_("filter documents from this mail rule"), + ) + + assign_title = models.CharField( + _("assign title"), + max_length=256, + null=True, + blank=True, + help_text=_( + "Assign a document title, can include some placeholders, " + "see documentation.", + ), + ) + + assign_tags = models.ManyToManyField( + Tag, + blank=True, + verbose_name=_("assign this tag"), + ) + + assign_document_type = models.ForeignKey( + DocumentType, + null=True, + blank=True, + on_delete=models.SET_NULL, + verbose_name=_("assign this document type"), + ) + + assign_correspondent = models.ForeignKey( + Correspondent, + null=True, + blank=True, + on_delete=models.SET_NULL, + verbose_name=_("assign this correspondent"), + ) + + assign_storage_path = models.ForeignKey( + StoragePath, + null=True, + blank=True, + on_delete=models.SET_NULL, + verbose_name=_("assign this storage path"), + ) + + assign_owner = models.ForeignKey( + User, + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="+", + verbose_name=_("assign this owner"), + ) + + assign_view_users = models.ManyToManyField( + User, + blank=True, + related_name="+", + verbose_name=_("grant view permissions to these users"), + ) + + assign_view_groups = models.ManyToManyField( + Group, + blank=True, + related_name="+", + verbose_name=_("grant view permissions to these groups"), + ) + + assign_change_users = models.ManyToManyField( + User, + blank=True, + related_name="+", + verbose_name=_("grant change permissions to these users"), + ) + + assign_change_groups = models.ManyToManyField( + Group, + blank=True, + related_name="+", + verbose_name=_("grant change permissions to these groups"), + ) + + assign_custom_fields = models.ManyToManyField( + CustomField, + blank=True, + related_name="+", + verbose_name=_("assign these custom fields"), + ) + + class Meta: + verbose_name = _("consumption template") + verbose_name_plural = _("consumption templates") + + def __str__(self): + return f"{self.name}" diff --git a/src/documents/parsers.py b/src/documents/parsers.py index 16094810e..aa2645e07 100644 --- a/src/documents/parsers.py +++ b/src/documents/parsers.py @@ -105,7 +105,7 @@ def get_supported_file_extensions() -> set[str]: return extensions -def get_parser_class_for_mime_type(mime_type: str) -> Optional["DocumentParser"]: +def get_parser_class_for_mime_type(mime_type: str) -> Optional[type["DocumentParser"]]: """ Returns the best parser (by weight) for the given mimetype or None if no parser exists diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 86d7f0e37..2373a25dd 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -429,7 +429,7 @@ class ReadWriteSerializerMethodField(serializers.SerializerMethodField): class CustomFieldInstanceSerializer(serializers.ModelSerializer): field = serializers.PrimaryKeyRelatedField(queryset=CustomField.objects.all()) - value = ReadWriteSerializerMethodField() + value = ReadWriteSerializerMethodField(allow_null=True) def create(self, validated_data): type_to_data_store_name_map = { @@ -1166,15 +1166,25 @@ class ConsumptionTemplateSerializer(serializers.ModelSerializer): "assign_view_groups", "assign_change_users", "assign_change_groups", + "assign_custom_fields", ] def validate(self, attrs): if ("filter_mailrule") in attrs and attrs["filter_mailrule"] is not None: attrs["sources"] = {DocumentSource.MailFetch.value} + + # Empty strings treated as None to avoid unexpected behavior + if ("assign_title") in attrs and len(attrs["assign_title"]) == 0: + attrs["assign_title"] = None + if "filter_filename" in attrs and len(attrs["filter_filename"]) == 0: + attrs["filter_filename"] = None + if "filter_path" in attrs and len(attrs["filter_path"]) == 0: + attrs["filter_path"] = None + if ( - ("filter_mailrule" not in attrs) - and ("filter_filename" not in attrs or len(attrs["filter_filename"]) == 0) - and ("filter_path" not in attrs or len(attrs["filter_path"]) == 0) + "filter_mailrule" not in attrs + and ("filter_filename" not in attrs or attrs["filter_filename"] is None) + and ("filter_path" not in attrs or attrs["filter_path"] is None) ): raise serializers.ValidationError( "File name, path or mail rule filter are required", diff --git a/src/documents/tasks.py b/src/documents/tasks.py index e89b4fa47..10a44a8fe 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -179,6 +179,7 @@ def consume_file( override_view_groups=overrides.view_groups, override_change_users=overrides.change_users, override_change_groups=overrides.change_groups, + override_custom_field_ids=overrides.custom_field_ids, task_id=self.request.id, ) diff --git a/src/documents/tests/test_api.py b/src/documents/tests/test_api.py index 9000c3c21..e671ce2ce 100644 --- a/src/documents/tests/test_api.py +++ b/src/documents/tests/test_api.py @@ -5649,6 +5649,11 @@ class TestApiConsumptionTemplates(DirectoriesMixin, APITestCase): self.t2 = Tag.objects.create(name="t2") self.t3 = Tag.objects.create(name="t3") self.sp = StoragePath.objects.create(path="/test/") + self.cf1 = CustomField.objects.create(name="Custom Field 1", data_type="string") + self.cf2 = CustomField.objects.create( + name="Custom Field 2", + data_type="integer", + ) self.ct = ConsumptionTemplate.objects.create( name="Template 1", @@ -5669,6 +5674,8 @@ class TestApiConsumptionTemplates(DirectoriesMixin, APITestCase): self.ct.assign_view_groups.add(self.group1.pk) self.ct.assign_change_users.add(self.user3.pk) self.ct.assign_change_groups.add(self.group1.pk) + self.ct.assign_custom_fields.add(self.cf1.pk) + self.ct.assign_custom_fields.add(self.cf2.pk) self.ct.save() def test_api_get_consumption_template(self): @@ -5740,7 +5747,55 @@ class TestApiConsumptionTemplates(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual(StoragePath.objects.count(), 1) + self.assertEqual(ConsumptionTemplate.objects.count(), 1) + + def test_api_create_consumption_template_empty_fields(self): + """ + GIVEN: + - API request to create a consumption template + - Path or filename filter or assign title are empty string + WHEN: + - API is called + THEN: + - Template is created but filter or title assignment is not set if "" + """ + response = self.client.post( + self.ENDPOINT, + json.dumps( + { + "name": "Template 2", + "order": 1, + "sources": [DocumentSource.ApiUpload], + "filter_filename": "*test*", + "filter_path": "", + "assign_title": "", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + ct = ConsumptionTemplate.objects.get(name="Template 2") + self.assertEqual(ct.filter_filename, "*test*") + self.assertIsNone(ct.filter_path) + self.assertIsNone(ct.assign_title) + + response = self.client.post( + self.ENDPOINT, + json.dumps( + { + "name": "Template 3", + "order": 1, + "sources": [DocumentSource.ApiUpload], + "filter_filename": "", + "filter_path": "*/test/*", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + ct2 = ConsumptionTemplate.objects.get(name="Template 3") + self.assertEqual(ct2.filter_path, "*/test/*") + self.assertIsNone(ct2.filter_filename) def test_api_create_consumption_template_with_mailrule(self): """ @@ -5769,7 +5824,7 @@ class TestApiConsumptionTemplates(DirectoriesMixin, APITestCase): filter_to="someone@somewhere.com", filter_subject="subject", filter_body="body", - filter_attachment_filename="file.pdf", + filter_attachment_filename_include="file.pdf", maximum_age=30, action=MailRule.MailAction.MARK_READ, assign_title_from=MailRule.TitleSource.FROM_SUBJECT, diff --git a/src/documents/tests/test_api_profile.py b/src/documents/tests/test_api_profile.py new file mode 100644 index 000000000..9e12b1ed3 --- /dev/null +++ b/src/documents/tests/test_api_profile.py @@ -0,0 +1,105 @@ +from django.contrib.auth.models import User +from rest_framework import status +from rest_framework.authtoken.models import Token +from rest_framework.test import APITestCase + +from documents.tests.utils import DirectoriesMixin + + +class TestApiProfile(DirectoriesMixin, APITestCase): + ENDPOINT = "/api/profile/" + + def setUp(self): + super().setUp() + + self.user = User.objects.create_superuser( + username="temp_admin", + first_name="firstname", + last_name="surname", + ) + self.client.force_authenticate(user=self.user) + + def test_get_profile(self): + """ + GIVEN: + - Configured user + WHEN: + - API call is made to get profile + THEN: + - Profile is returned + """ + + response = self.client.get(self.ENDPOINT) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(response.data["email"], self.user.email) + self.assertEqual(response.data["first_name"], self.user.first_name) + self.assertEqual(response.data["last_name"], self.user.last_name) + + def test_update_profile(self): + """ + GIVEN: + - Configured user + WHEN: + - API call is made to update profile + THEN: + - Profile is updated + """ + + user_data = { + "email": "new@email.com", + "password": "superpassword1234", + "first_name": "new first name", + "last_name": "new last name", + } + response = self.client.patch(self.ENDPOINT, user_data) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + user = User.objects.get(username=self.user.username) + self.assertTrue(user.check_password(user_data["password"])) + self.assertEqual(user.email, user_data["email"]) + self.assertEqual(user.first_name, user_data["first_name"]) + self.assertEqual(user.last_name, user_data["last_name"]) + + def test_update_auth_token(self): + """ + GIVEN: + - Configured user + WHEN: + - API call is made to generate auth token + THEN: + - Token is created the first time, updated the second + """ + + self.assertEqual(len(Token.objects.all()), 0) + + response = self.client.post(f"{self.ENDPOINT}generate_auth_token/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + token1 = Token.objects.filter(user=self.user).first() + self.assertIsNotNone(token1) + + response = self.client.post(f"{self.ENDPOINT}generate_auth_token/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + token2 = Token.objects.filter(user=self.user).first() + + self.assertNotEqual(token1.key, token2.key) + + def test_profile_not_logged_in(self): + """ + GIVEN: + - User not logged in + WHEN: + - API call is made to get profile and update token + THEN: + - Profile is returned + """ + + self.client.logout() + + response = self.client.get(self.ENDPOINT) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + response = self.client.post(f"{self.ENDPOINT}generate_auth_token/") + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 831dbcc3a..e2cd74016 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -22,6 +22,7 @@ from documents.consumer import Consumer from documents.consumer import ConsumerError from documents.consumer import ConsumerFilePhase from documents.models import Correspondent +from documents.models import CustomField from documents.models import Document from documents.models import DocumentType from documents.models import FileInfo @@ -458,6 +459,29 @@ class TestConsumer(DirectoriesMixin, FileSystemAssertsMixin, TestCase): self.assertIn(t3, document.tags.all()) self._assert_first_last_send_progress() + def testOverrideCustomFields(self): + cf1 = CustomField.objects.create(name="Custom Field 1", data_type="string") + cf2 = CustomField.objects.create( + name="Custom Field 2", + data_type="integer", + ) + cf3 = CustomField.objects.create( + name="Custom Field 3", + data_type="url", + ) + document = self.consumer.try_consume_file( + self.get_test_file(), + override_custom_field_ids=[cf1.id, cf3.id], + ) + + fields_used = [ + field_instance.field for field_instance in document.custom_fields.all() + ] + self.assertIn(cf1, fields_used) + self.assertNotIn(cf2, fields_used) + self.assertIn(cf3, fields_used) + self._assert_first_last_send_progress() + def testOverrideAsn(self): document = self.consumer.try_consume_file( self.get_test_file(), diff --git a/src/documents/tests/test_consumption_templates.py b/src/documents/tests/test_consumption_templates.py index 23cda7c1e..3abbacf14 100644 --- a/src/documents/tests/test_consumption_templates.py +++ b/src/documents/tests/test_consumption_templates.py @@ -11,6 +11,7 @@ from documents.data_models import ConsumableDocument from documents.data_models import DocumentSource from documents.models import ConsumptionTemplate from documents.models import Correspondent +from documents.models import CustomField from documents.models import DocumentType from documents.models import StoragePath from documents.models import Tag @@ -32,6 +33,11 @@ class TestConsumptionTemplates(DirectoriesMixin, FileSystemAssertsMixin, TestCas self.t2 = Tag.objects.create(name="t2") self.t3 = Tag.objects.create(name="t3") self.sp = StoragePath.objects.create(path="/test/") + self.cf1 = CustomField.objects.create(name="Custom Field 1", data_type="string") + self.cf2 = CustomField.objects.create( + name="Custom Field 2", + data_type="integer", + ) self.user2 = User.objects.create(username="user2") self.user3 = User.objects.create(username="user3") @@ -54,7 +60,7 @@ class TestConsumptionTemplates(DirectoriesMixin, FileSystemAssertsMixin, TestCas filter_to="someone@somewhere.com", filter_subject="subject", filter_body="body", - filter_attachment_filename="file.pdf", + filter_attachment_filename_include="file.pdf", maximum_age=30, action=MailRule.MailAction.MARK_READ, assign_title_from=MailRule.TitleSource.NONE, @@ -95,6 +101,8 @@ class TestConsumptionTemplates(DirectoriesMixin, FileSystemAssertsMixin, TestCas ct.assign_view_groups.add(self.group1.pk) ct.assign_change_users.add(self.user3.pk) ct.assign_change_groups.add(self.group1.pk) + ct.assign_custom_fields.add(self.cf1.pk) + ct.assign_custom_fields.add(self.cf2.pk) ct.save() self.assertEqual(ct.__str__(), "Template 1") @@ -128,6 +136,10 @@ class TestConsumptionTemplates(DirectoriesMixin, FileSystemAssertsMixin, TestCas overrides["override_title"], "Doc from {correspondent}", ) + self.assertEqual( + overrides["override_custom_field_ids"], + [self.cf1.pk, self.cf2.pk], + ) info = cm.output[0] expected_str = f"Document matched template {ct}" diff --git a/src/documents/views.py b/src/documents/views.py index 386f87404..92d37adf5 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1158,8 +1158,8 @@ class RemoteVersionView(GenericAPIView): current_version = packaging_version.parse(version.__full_version_str__) try: req = urllib.request.Request( - "https://api.github.com/repos/paperlessngx/" - "paperlessngx/releases/latest", + "https://api.github.com/repos/paperless-ngx/" + "paperless-ngx/releases/latest", ) # Ensure a JSON response req.add_header("Accept", "application/json") diff --git a/src/locale/el_GR/LC_MESSAGES/django.po b/src/locale/el_GR/LC_MESSAGES/django.po index 3120a658f..12503c89f 100644 --- a/src/locale/el_GR/LC_MESSAGES/django.po +++ b/src/locale/el_GR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-10 09:02-0800\n" -"PO-Revision-Date: 2023-11-13 01:30\n" +"PO-Revision-Date: 2023-11-30 19:23\n" "Last-Translator: \n" "Language-Team: Greek\n" "Language: el_GR\n" @@ -553,15 +553,15 @@ msgstr "κοινοποίηση συνδέσμων" #: documents/models.py:748 msgid "Consume Folder" -msgstr "" +msgstr "Φάκελος Κατανάλωσης" #: documents/models.py:749 msgid "Api Upload" -msgstr "" +msgstr "Μεταφόρτωση μέσω API" #: documents/models.py:750 msgid "Mail Fetch" -msgstr "" +msgstr "Λήψη Αλληλογραφίας" #: documents/models.py:754 paperless_mail/models.py:95 msgid "order" @@ -569,15 +569,15 @@ msgstr "σειρά" #: documents/models.py:763 msgid "filter path" -msgstr "" +msgstr "διαδρομή φίλτρου" #: documents/models.py:768 msgid "Only consume documents with a path that matches this if specified. Wildcards specified as * are allowed. Case insensitive." -msgstr "" +msgstr "Μόνο κατανάλωση εγγράφων με μια διαδρομή που ταιριάζει με αυτό αν έχει καθοριστεί. Επιτρέπεται η χρήση μπαλαντέρ που ορίζεται ως *. Χωρίς διάκριση πεζών-κεφαλαίων." #: documents/models.py:775 msgid "filter filename" -msgstr "" +msgstr "φιλτράρισμα ονόματος αρχείου" #: documents/models.py:780 paperless_mail/models.py:148 msgid "Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive." @@ -585,15 +585,15 @@ msgstr "Μόνο κατανάλωση αρχείων που ταιριάζουν #: documents/models.py:791 msgid "filter documents from this mail rule" -msgstr "" +msgstr "φιλτράρισμα εγγράφων από αυτόν τον κανόνα αλληλογραφίας" #: documents/models.py:795 msgid "assign title" -msgstr "" +msgstr "ανάθεση τίτλου" #: documents/models.py:800 msgid "Assign a document title, can include some placeholders, see documentation." -msgstr "" +msgstr "Η ανάθεση τίτλου εγγράφου μπορεί να περιέχει μερικά placeholders, δείτε την τεκμηρίωση." #: documents/models.py:808 paperless_mail/models.py:204 msgid "assign this tag" @@ -609,83 +609,83 @@ msgstr "ανάθεση αυτού του ανταποκριτή" #: documents/models.py:832 msgid "assign this storage path" -msgstr "" +msgstr "ανάθεση αυτής της διαδρομής αποθήκευσης" #: documents/models.py:841 msgid "assign this owner" -msgstr "" +msgstr "ανάθεση αυτού του ιδιοκτήτη" #: documents/models.py:848 msgid "grant view permissions to these users" -msgstr "" +msgstr "εκχώρηση δικαιωμάτων προβολής σε αυτούς τους χρήστες" #: documents/models.py:855 msgid "grant view permissions to these groups" -msgstr "" +msgstr "εκχώρηση δικαιωμάτων προβολής σε αυτές τις ομάδες" #: documents/models.py:862 msgid "grant change permissions to these users" -msgstr "" +msgstr "εκχώρηση δικαιωμάτων μεταβολής σε αυτές τις ομάδες" #: documents/models.py:869 msgid "grant change permissions to these groups" -msgstr "" +msgstr "εκχώρηση δικαιωμάτων μεταβολής σε αυτές τις ομάδες" #: documents/models.py:873 msgid "consumption template" -msgstr "" +msgstr "πρότυπο κατανάλωσης" #: documents/models.py:874 msgid "consumption templates" -msgstr "" +msgstr "πρότυπα κατανάλωσης" #: documents/models.py:886 msgid "String" -msgstr "" +msgstr "Συμβολοσειρά" #: documents/models.py:887 msgid "URL" -msgstr "" +msgstr "URL" #: documents/models.py:888 msgid "Date" -msgstr "" +msgstr "Ημερομηνία" #: documents/models.py:889 msgid "Boolean" -msgstr "" +msgstr "Δυαδικές τιμές" #: documents/models.py:890 msgid "Integer" -msgstr "" +msgstr "Ακέραιος" #: documents/models.py:891 msgid "Float" -msgstr "" +msgstr "Δεκαδικός" #: documents/models.py:892 msgid "Monetary" -msgstr "" +msgstr "Νομισματικό" #: documents/models.py:904 msgid "data type" -msgstr "" +msgstr "τύπος δεδομένων" #: documents/models.py:912 msgid "custom field" -msgstr "" +msgstr "προσαρμοσμένο πεδίο" #: documents/models.py:913 msgid "custom fields" -msgstr "" +msgstr "προσαρμοσμένα πεδία" #: documents/models.py:973 msgid "custom field instance" -msgstr "" +msgstr "στιγμιότυπο προσαρμοσμένου πεδίου" #: documents/models.py:974 msgid "custom field instances" -msgstr "" +msgstr "στιγμιότυπα προσαρμοσμένων πεδίων" #: documents/serialisers.py:102 #, python-format @@ -763,72 +763,72 @@ msgstr "Είσοδος" #: documents/templates/registration/login.html:70 msgid "Forgot your password?" -msgstr "" +msgstr "Ξεχάσατε τον κωδικό σας;" #: documents/templates/registration/password_reset_complete.html:14 msgid "Paperless-ngx reset password complete" -msgstr "" +msgstr "Η επαναφορά κωδικού paperless-ngx πραγματοποιήθηκε" #: documents/templates/registration/password_reset_complete.html:40 msgid "Password reset complete." -msgstr "" +msgstr "Ολοκλήρωση επαναφοράς κωδικού πρόσβασης." #: documents/templates/registration/password_reset_complete.html:42 #, python-format msgid "Your new password has been set. You can now
log in" -msgstr "" +msgstr "Έχει οριστεί νέος κωδικός πρόσβασης. Μπορείτε τώρα να συνδεθείτε στο" #: documents/templates/registration/password_reset_confirm.html:14 msgid "Paperless-ngx reset password confirmation" -msgstr "" +msgstr "Επιβεβαίωση κωδικού paperless-ngx" #: documents/templates/registration/password_reset_confirm.html:42 msgid "Set a new password." -msgstr "" +msgstr "Ορίστε έναν νέο κωδικό πρόσβασης." #: documents/templates/registration/password_reset_confirm.html:46 msgid "Passwords did not match or too weak. Try again." -msgstr "" +msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν ή είναι πολύ αδύναμοι. Δοκιμάστε ξανά." #: documents/templates/registration/password_reset_confirm.html:49 msgid "New Password" -msgstr "" +msgstr "Νέος Κωδικός" #: documents/templates/registration/password_reset_confirm.html:50 msgid "Confirm Password" -msgstr "" +msgstr "Επιβεβαίωση Κωδικού" #: documents/templates/registration/password_reset_confirm.html:61 msgid "Change my password" -msgstr "" +msgstr "Αλλαγή κωδικού πρόσβασης" #: documents/templates/registration/password_reset_confirm.html:65 msgid "request a new password reset" -msgstr "" +msgstr "αίτημα επαναφοράς νέου κωδικού πρόσβασης" #: documents/templates/registration/password_reset_done.html:14 msgid "Paperless-ngx reset password sent" -msgstr "" +msgstr "Επαναφορά κωδικού paperless-ngx εστάλη" #: documents/templates/registration/password_reset_done.html:40 msgid "Check your inbox." -msgstr "" +msgstr "Ελέγξτε τα εισερχόμενά σας." #: documents/templates/registration/password_reset_done.html:41 msgid "We've emailed you instructions for setting your password. You should receive the email shortly!" -msgstr "" +msgstr "Σας στείλαμε μήνυμα ηλεκτρονικού ταχυδρομείου με οδηγίες για τον ορισμό του κωδικού πρόσβασης σας. Θα πρέπει να το λάβετε σύντομα!" #: documents/templates/registration/password_reset_form.html:14 msgid "Paperless-ngx reset password request" -msgstr "" +msgstr "Αίτημα επαναφοράς κωδικού πρόσβασης Paperless-ngx" #: documents/templates/registration/password_reset_form.html:41 msgid "Enter your email address below, and we'll email instructions for setting a new one." -msgstr "" +msgstr "Εισάγετε το email σας παρακάτω και θα αποστείλουμε οδηγίες για τον ορισμό νέου." #: documents/templates/registration/password_reset_form.html:44 msgid "An error occurred. Please try again." -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα. Παρακαλώ προσπαθήστε ξανά." #: documents/templates/registration/password_reset_form.html:47 msgid "Email" @@ -836,7 +836,7 @@ msgstr "E-mail" #: documents/templates/registration/password_reset_form.html:54 msgid "Send me instructions!" -msgstr "" +msgstr "Αποστολή Οδηγιών!" #: paperless/apps.py:10 msgid "Paperless" @@ -860,7 +860,7 @@ msgstr "Λευκορωσικά" #: paperless/settings.py:590 msgid "Bulgarian" -msgstr "" +msgstr "Βουλγαρικά" #: paperless/settings.py:591 msgid "Catalan" @@ -900,7 +900,7 @@ msgstr "Γαλλικά" #: paperless/settings.py:600 msgid "Hungarian" -msgstr "" +msgstr "Ουγγρικά" #: paperless/settings.py:601 msgid "Italian" @@ -1116,7 +1116,7 @@ msgstr "Χρήση ονόματος συνημμένου αρχείου ως τ #: paperless_mail/models.py:85 msgid "Do not assign title from rule" -msgstr "" +msgstr "Να μην αντιστοιχιστεί τίτλος από τον κανόνα" #: paperless_mail/models.py:88 msgid "Do not assign a correspondent" @@ -1208,7 +1208,7 @@ msgstr "ανάθεση ανταποκριτή από" #: paperless_mail/models.py:230 msgid "Assign the rule owner to documents" -msgstr "" +msgstr "Αναθέστε τον ιδιοκτήτη του κανόνα σε έγγραφα" #: paperless_mail/models.py:256 msgid "uid" diff --git a/src/locale/hu_HU/LC_MESSAGES/django.po b/src/locale/hu_HU/LC_MESSAGES/django.po index cafcce6ad..0656a4451 100644 --- a/src/locale/hu_HU/LC_MESSAGES/django.po +++ b/src/locale/hu_HU/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-10 09:02-0800\n" -"PO-Revision-Date: 2023-11-13 01:30\n" +"PO-Revision-Date: 2023-12-01 13:52\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Language: hu_HU\n" @@ -43,7 +43,7 @@ msgstr "Pontos egyezés" #: documents/models.py:57 msgid "Regular expression" -msgstr "Szabályos kifejezés" +msgstr "Reguláris kifejezés" #: documents/models.py:58 msgid "Fuzzy word" @@ -64,7 +64,7 @@ msgstr "egyezés" #: documents/models.py:67 msgid "matching algorithm" -msgstr "megfelelő algoritmus" +msgstr "egyeztető algoritmus" #: documents/models.py:72 msgid "is insensitive" @@ -72,11 +72,11 @@ msgstr "érzéketlen" #: documents/models.py:95 documents/models.py:147 msgid "correspondent" -msgstr "levelező" +msgstr "kapcsolattartó" #: documents/models.py:96 msgid "correspondents" -msgstr "levelezők" +msgstr "kapcsolattartók" #: documents/models.py:100 msgid "color" @@ -553,7 +553,7 @@ msgstr "linkek megosztása" #: documents/models.py:748 msgid "Consume Folder" -msgstr "Fogyasztás mappa" +msgstr "Feldolgozási mappa" #: documents/models.py:749 msgid "Api Upload" @@ -597,7 +597,7 @@ msgstr "A dokumentum címének hozzárendelése, tartalmazhat néhány helykitö #: documents/models.py:808 paperless_mail/models.py:204 msgid "assign this tag" -msgstr "hozzárendelni ezt a címkét" +msgstr "rendelje hozzá ezt a jelölőt" #: documents/models.py:816 paperless_mail/models.py:212 msgid "assign this document type" @@ -605,7 +605,7 @@ msgstr "rendelje hozzá ezt a dokumentumtípust" #: documents/models.py:824 paperless_mail/models.py:226 msgid "assign this correspondent" -msgstr "bízza meg ezt a levelezőt" +msgstr "rendelje hozzá ezt a kapcsolattartót" #: documents/models.py:832 msgid "assign this storage path" @@ -613,7 +613,7 @@ msgstr "rendelje hozzá ezt a tárolási útvonalat" #: documents/models.py:841 msgid "assign this owner" -msgstr "kijelölni ezt a tulajdonost" +msgstr "rendelje hozzá ezt a tulajdonost" #: documents/models.py:848 msgid "grant view permissions to these users" @@ -1188,7 +1188,7 @@ msgstr "feldolgozási kör" #: paperless_mail/models.py:177 msgid "action" -msgstr "akció" +msgstr "művelet" #: paperless_mail/models.py:183 msgid "action parameter" @@ -1204,7 +1204,7 @@ msgstr "cím hozzárendelése a" #: paperless_mail/models.py:216 msgid "assign correspondent from" -msgstr "megbízott levelezőt a" +msgstr "rendelje hozzá a kapcsolattartót a" #: paperless_mail/models.py:230 msgid "Assign the rule owner to documents" @@ -1220,7 +1220,7 @@ msgstr "tárgy" #: paperless_mail/models.py:272 msgid "received" -msgstr "kapott" +msgstr "fogadott" #: paperless_mail/models.py:279 msgid "processed" @@ -1228,5 +1228,5 @@ msgstr "feldolgozott" #: paperless_mail/models.py:285 msgid "status" -msgstr "státusz" +msgstr "állapot" diff --git a/src/locale/pl_PL/LC_MESSAGES/django.po b/src/locale/pl_PL/LC_MESSAGES/django.po index ff28f8ef5..6b6caec3f 100644 --- a/src/locale/pl_PL/LC_MESSAGES/django.po +++ b/src/locale/pl_PL/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-10 09:02-0800\n" -"PO-Revision-Date: 2023-11-13 01:31\n" +"PO-Revision-Date: 2023-12-01 11:18\n" "Last-Translator: \n" "Language-Team: Polish\n" "Language: pl_PL\n" @@ -521,7 +521,7 @@ msgstr "użytkownik" #: documents/models.py:679 msgid "note" -msgstr "" +msgstr "notatka" #: documents/models.py:680 msgid "notes" @@ -529,11 +529,11 @@ msgstr "notatki" #: documents/models.py:688 msgid "Archive" -msgstr "" +msgstr "Archiwum" #: documents/models.py:689 msgid "Original" -msgstr "" +msgstr "Oryginał" #: documents/models.py:700 msgid "expiration" @@ -657,7 +657,7 @@ msgstr "" #: documents/models.py:890 msgid "Integer" -msgstr "" +msgstr "Liczba całkowita" #: documents/models.py:891 msgid "Float" @@ -669,7 +669,7 @@ msgstr "" #: documents/models.py:904 msgid "data type" -msgstr "" +msgstr "typ danych" #: documents/models.py:912 msgid "custom field" @@ -763,7 +763,7 @@ msgstr "Zaloguj się" #: documents/templates/registration/login.html:70 msgid "Forgot your password?" -msgstr "" +msgstr "Nie pamiętasz hasła?" #: documents/templates/registration/password_reset_complete.html:14 msgid "Paperless-ngx reset password complete" @@ -792,7 +792,7 @@ msgstr "" #: documents/templates/registration/password_reset_confirm.html:49 msgid "New Password" -msgstr "" +msgstr "Nowe hasło" #: documents/templates/registration/password_reset_confirm.html:50 msgid "Confirm Password" @@ -800,11 +800,11 @@ msgstr "" #: documents/templates/registration/password_reset_confirm.html:61 msgid "Change my password" -msgstr "" +msgstr "Zmień hasło" #: documents/templates/registration/password_reset_confirm.html:65 msgid "request a new password reset" -msgstr "" +msgstr "poproś o reset hasła" #: documents/templates/registration/password_reset_done.html:14 msgid "Paperless-ngx reset password sent" diff --git a/src/locale/ru_RU/LC_MESSAGES/django.po b/src/locale/ru_RU/LC_MESSAGES/django.po index 4cd8ddf0c..9409df01d 100644 --- a/src/locale/ru_RU/LC_MESSAGES/django.po +++ b/src/locale/ru_RU/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-10 09:02-0800\n" -"PO-Revision-Date: 2023-11-13 01:31\n" +"PO-Revision-Date: 2023-11-29 08:50\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -409,7 +409,7 @@ msgstr "" #: documents/models.py:454 msgid "owner is" -msgstr "" +msgstr "владелец" #: documents/models.py:455 msgid "has owner in" @@ -417,7 +417,7 @@ msgstr "" #: documents/models.py:456 msgid "does not have owner" -msgstr "" +msgstr "не имеет владельца" #: documents/models.py:457 msgid "does not have owner in" @@ -521,7 +521,7 @@ msgstr "пользователь" #: documents/models.py:679 msgid "note" -msgstr "" +msgstr "заметка" #: documents/models.py:680 msgid "notes" @@ -529,15 +529,15 @@ msgstr "заметки" #: documents/models.py:688 msgid "Archive" -msgstr "" +msgstr "Архив" #: documents/models.py:689 msgid "Original" -msgstr "" +msgstr "Оригинал" #: documents/models.py:700 msgid "expiration" -msgstr "" +msgstr "Срок действия" #: documents/models.py:707 msgid "slug" @@ -645,7 +645,7 @@ msgstr "" #: documents/models.py:887 msgid "URL" -msgstr "" +msgstr "Ссылка" #: documents/models.py:888 msgid "Date" @@ -661,7 +661,7 @@ msgstr "" #: documents/models.py:891 msgid "Float" -msgstr "" +msgstr "С плавающей точкой" #: documents/models.py:892 msgid "Monetary" @@ -669,15 +669,15 @@ msgstr "" #: documents/models.py:904 msgid "data type" -msgstr "" +msgstr "Тип данных" #: documents/models.py:912 msgid "custom field" -msgstr "" +msgstr "Пользовательское поле" #: documents/models.py:913 msgid "custom fields" -msgstr "" +msgstr "Пользовательские поля" #: documents/models.py:973 msgid "custom field instance" diff --git a/src/paperless/serialisers.py b/src/paperless/serialisers.py index 4094a6538..36ba0171e 100644 --- a/src/paperless/serialisers.py +++ b/src/paperless/serialisers.py @@ -97,3 +97,19 @@ class GroupSerializer(serializers.ModelSerializer): "name", "permissions", ) + + +class ProfileSerializer(serializers.ModelSerializer): + email = serializers.EmailField(allow_null=False) + password = ObfuscatedUserPasswordField(required=False, allow_null=False) + auth_token = serializers.SlugRelatedField(read_only=True, slug_field="key") + + class Meta: + model = User + fields = ( + "email", + "password", + "first_name", + "last_name", + "auth_token", + ) diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 86f1f569f..9daeb8a47 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -864,6 +864,11 @@ OCR_MAX_IMAGE_PIXELS: Optional[int] = None if os.environ.get("PAPERLESS_OCR_MAX_IMAGE_PIXELS") is not None: OCR_MAX_IMAGE_PIXELS: int = int(os.environ.get("PAPERLESS_OCR_MAX_IMAGE_PIXELS")) +OCR_COLOR_CONVERSION_STRATEGY = os.getenv( + "PAPERLESS_OCR_COLOR_CONVERSION_STRATEGY", + "RGB", +) + OCR_USER_ARGS = os.getenv("PAPERLESS_OCR_USER_ARGS", "{}") # GNUPG needs a home directory for some reason diff --git a/src/paperless/urls.py b/src/paperless/urls.py index 2f0c56267..67fddbee0 100644 --- a/src/paperless/urls.py +++ b/src/paperless/urls.py @@ -35,7 +35,9 @@ from documents.views import UiSettingsView from documents.views import UnifiedSearchViewSet from paperless.consumers import StatusConsumer from paperless.views import FaviconView +from paperless.views import GenerateAuthTokenView from paperless.views import GroupViewSet +from paperless.views import ProfileView from paperless.views import UserViewSet from paperless_mail.views import MailAccountTestView from paperless_mail.views import MailAccountViewSet @@ -119,6 +121,12 @@ urlpatterns = [ BulkEditObjectPermissionsView.as_view(), name="bulk_edit_object_permissions", ), + path("profile/generate_auth_token/", GenerateAuthTokenView.as_view()), + re_path( + "^profile/", + ProfileView.as_view(), + name="profile_view", + ), *api_router.urls, ], ), diff --git a/src/paperless/version.py b/src/paperless/version.py index 8880959b6..209e0d25a 100644 --- a/src/paperless/version.py +++ b/src/paperless/version.py @@ -1,6 +1,6 @@ from typing import Final -__version__: Final[tuple[int, int, int]] = (2, 0, 0) +__version__: Final[tuple[int, int, int]] = (2, 0, 1) # Version string like X.Y.Z __full_version_str__: Final[str] = ".".join(map(str, __version__)) # Version string like X.Y diff --git a/src/paperless/views.py b/src/paperless/views.py index e872cc19c..084aee3d7 100644 --- a/src/paperless/views.py +++ b/src/paperless/views.py @@ -7,7 +7,9 @@ from django.db.models.functions import Lower from django.http import HttpResponse from django.views.generic import View from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.authtoken.models import Token from rest_framework.filters import OrderingFilter +from rest_framework.generics import GenericAPIView from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response @@ -17,6 +19,7 @@ from documents.permissions import PaperlessObjectPermissions from paperless.filters import GroupFilterSet from paperless.filters import UserFilterSet from paperless.serialisers import GroupSerializer +from paperless.serialisers import ProfileSerializer from paperless.serialisers import UserSerializer @@ -106,3 +109,54 @@ class GroupViewSet(ModelViewSet): filter_backends = (DjangoFilterBackend, OrderingFilter) filterset_class = GroupFilterSet ordering_fields = ("name",) + + +class ProfileView(GenericAPIView): + """ + User profile view, only available when logged in + """ + + permission_classes = [IsAuthenticated] + serializer_class = ProfileSerializer + + def get(self, request, *args, **kwargs): + user = self.request.user + + serializer = self.get_serializer(data=request.data) + return Response(serializer.to_representation(user)) + + def patch(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + user = self.request.user if hasattr(self.request, "user") else None + + if len(serializer.validated_data.get("password").replace("*", "")) > 0: + user.set_password(serializer.validated_data.get("password")) + user.save() + serializer.validated_data.pop("password") + + for key, value in serializer.validated_data.items(): + setattr(user, key, value) + user.save() + + return Response(serializer.to_representation(user)) + + +class GenerateAuthTokenView(GenericAPIView): + """ + Generates (or re-generates) an auth token, requires a logged in user + unlike the default DRF endpoint + """ + + permission_classes = [IsAuthenticated] + + def post(self, request, *args, **kwargs): + user = self.request.user + + existing_token = Token.objects.filter(user=user).first() + if existing_token is not None: + existing_token.delete() + token = Token.objects.create(user=user) + return Response( + token.key, + ) diff --git a/src/paperless_mail/admin.py b/src/paperless_mail/admin.py index b2eed5ce3..a266b85ae 100644 --- a/src/paperless_mail/admin.py +++ b/src/paperless_mail/admin.py @@ -68,7 +68,8 @@ class MailRuleAdmin(GuardedModelAdmin): "filter_to", "filter_subject", "filter_body", - "filter_attachment_filename", + "filter_attachment_filename_include", + "filter_attachment_filename_exclude", "maximum_age", "consumption_scope", "attachment_type", diff --git a/src/paperless_mail/mail.py b/src/paperless_mail/mail.py index 2179b8c90..0b6ec316f 100644 --- a/src/paperless_mail/mail.py +++ b/src/paperless_mail/mail.py @@ -668,12 +668,29 @@ class MailAccountHandler(LoggingMixin): ) continue - if rule.filter_attachment_filename and not fnmatch( + if rule.filter_attachment_filename_include and not fnmatch( att.filename.lower(), - rule.filter_attachment_filename.lower(), + rule.filter_attachment_filename_include.lower(), ): # Force the filename and pattern to the lowercase # as this is system dependent otherwise + self.log.debug( + f"Rule {rule}: " + f"Skipping attachment {att.filename} " + f"does not match pattern {rule.filter_attachment_filename_include}", + ) + continue + elif rule.filter_attachment_filename_exclude and fnmatch( + att.filename.lower(), + rule.filter_attachment_filename_exclude.lower(), + ): + # Force the filename and pattern to the lowercase + # as this is system dependent otherwise + self.log.debug( + f"Rule {rule}: " + f"Skipping attachment {att.filename} " + f"does match pattern {rule.filter_attachment_filename_exclude}", + ) continue correspondent = self._get_correspondent(message, rule) diff --git a/src/paperless_mail/migrations/0023_remove_mailrule_filter_attachment_filename_and_more.py b/src/paperless_mail/migrations/0023_remove_mailrule_filter_attachment_filename_and_more.py new file mode 100644 index 000000000..1a1eac790 --- /dev/null +++ b/src/paperless_mail/migrations/0023_remove_mailrule_filter_attachment_filename_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 4.2.7 on 2023-12-04 03:06 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("paperless_mail", "0022_mailrule_assign_owner_from_rule_and_more"), + ] + + operations = [ + migrations.RenameField( + model_name="mailrule", + old_name="filter_attachment_filename", + new_name="filter_attachment_filename_include", + ), + migrations.AddField( + model_name="mailrule", + name="filter_attachment_filename_exclude", + field=models.CharField( + blank=True, + help_text="Do not consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", + max_length=256, + null=True, + verbose_name="filter attachment filename exclusive", + ), + ), + migrations.AlterField( + model_name="mailrule", + name="filter_attachment_filename_include", + field=models.CharField( + blank=True, + help_text="Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", + max_length=256, + null=True, + verbose_name="filter attachment filename inclusive", + ), + ), + ] diff --git a/src/paperless_mail/models.py b/src/paperless_mail/models.py index 6f1896f1f..29a0afbef 100644 --- a/src/paperless_mail/models.py +++ b/src/paperless_mail/models.py @@ -139,8 +139,8 @@ class MailRule(document_models.ModelWithOwner): blank=True, ) - filter_attachment_filename = models.CharField( - _("filter attachment filename"), + filter_attachment_filename_include = models.CharField( + _("filter attachment filename inclusive"), max_length=256, null=True, blank=True, @@ -151,6 +151,18 @@ class MailRule(document_models.ModelWithOwner): ), ) + filter_attachment_filename_exclude = models.CharField( + _("filter attachment filename exclusive"), + max_length=256, + null=True, + blank=True, + help_text=_( + "Do not consume documents which entirely match this " + "filename if specified. Wildcards such as *.pdf or " + "*invoice* are allowed. Case insensitive.", + ), + ) + maximum_age = models.PositiveIntegerField( _("maximum age"), default=30, diff --git a/src/paperless_mail/serialisers.py b/src/paperless_mail/serialisers.py index e5da4a7da..38ee9661e 100644 --- a/src/paperless_mail/serialisers.py +++ b/src/paperless_mail/serialisers.py @@ -79,7 +79,8 @@ class MailRuleSerializer(OwnedObjectSerializer): "filter_to", "filter_subject", "filter_body", - "filter_attachment_filename", + "filter_attachment_filename_include", + "filter_attachment_filename_exclude", "maximum_age", "action", "action_parameter", diff --git a/src/paperless_mail/tests/test_api.py b/src/paperless_mail/tests/test_api.py index a02057114..7e9bbfe84 100644 --- a/src/paperless_mail/tests/test_api.py +++ b/src/paperless_mail/tests/test_api.py @@ -377,7 +377,7 @@ class TestAPIMailRules(DirectoriesMixin, APITestCase): filter_to="someone@somewhere.com", filter_subject="subject", filter_body="body", - filter_attachment_filename="file.pdf", + filter_attachment_filename_include="file.pdf", maximum_age=30, action=MailRule.MailAction.MARK_READ, assign_title_from=MailRule.TitleSource.FROM_SUBJECT, @@ -400,8 +400,8 @@ class TestAPIMailRules(DirectoriesMixin, APITestCase): self.assertEqual(returned_rule1["filter_subject"], rule1.filter_subject) self.assertEqual(returned_rule1["filter_body"], rule1.filter_body) self.assertEqual( - returned_rule1["filter_attachment_filename"], - rule1.filter_attachment_filename, + returned_rule1["filter_attachment_filename_include"], + rule1.filter_attachment_filename_include, ) self.assertEqual(returned_rule1["maximum_age"], rule1.maximum_age) self.assertEqual(returned_rule1["action"], rule1.action) @@ -453,7 +453,7 @@ class TestAPIMailRules(DirectoriesMixin, APITestCase): "filter_to": "aperson@aplace.com", "filter_subject": "subject", "filter_body": "body", - "filter_attachment_filename": "file.pdf", + "filter_attachment_filename_include": "file.pdf", "maximum_age": 30, "action": MailRule.MailAction.MARK_READ, "assign_title_from": MailRule.TitleSource.FROM_SUBJECT, @@ -488,8 +488,8 @@ class TestAPIMailRules(DirectoriesMixin, APITestCase): self.assertEqual(returned_rule1["filter_subject"], rule1["filter_subject"]) self.assertEqual(returned_rule1["filter_body"], rule1["filter_body"]) self.assertEqual( - returned_rule1["filter_attachment_filename"], - rule1["filter_attachment_filename"], + returned_rule1["filter_attachment_filename_include"], + rule1["filter_attachment_filename_include"], ) self.assertEqual(returned_rule1["maximum_age"], rule1["maximum_age"]) self.assertEqual(returned_rule1["action"], rule1["action"]) @@ -545,7 +545,7 @@ class TestAPIMailRules(DirectoriesMixin, APITestCase): filter_from="from@example.com", filter_subject="subject", filter_body="body", - filter_attachment_filename="file.pdf", + filter_attachment_filename_include="file.pdf", maximum_age=30, action=MailRule.MailAction.MARK_READ, assign_title_from=MailRule.TitleSource.FROM_SUBJECT, @@ -589,7 +589,7 @@ class TestAPIMailRules(DirectoriesMixin, APITestCase): filter_from="from@example.com", filter_subject="subject", filter_body="body", - filter_attachment_filename="file.pdf", + filter_attachment_filename_include="file.pdf", maximum_age=30, action=MailRule.MailAction.MARK_READ, assign_title_from=MailRule.TitleSource.FROM_SUBJECT, diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index 48b1e1a7a..55983939a 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -526,6 +526,16 @@ class TestMail( ) def test_filename_filter(self): + """ + GIVEN: + - Email with multiple similar named attachments + - Rule with inclusive and exclusive filters + WHEN: + - Mail action filtering is checked + THEN: + - Mail action should not be performed for files excluded + - Mail action should be performed for files included + """ message = self.create_message( attachments=[ _AttachmentDef(filename="f1.pdf"), @@ -537,15 +547,67 @@ class TestMail( ], ) + @dataclasses.dataclass(frozen=True) + class FilterTestCase: + name: str + include_pattern: Optional[str] + exclude_pattern: Optional[str] + expected_matches: list[str] + tests = [ - ("*.pdf", ["f1.pdf", "f2.pdf", "f3.pdf", "file.PDf", "f1.Pdf"]), - ("f1.pdf", ["f1.pdf", "f1.Pdf"]), - ("*", ["f1.pdf", "f2.pdf", "f3.pdf", "f2.png", "file.PDf", "f1.Pdf"]), - ("*.png", ["f2.png"]), + FilterTestCase( + "PDF Wildcard", + include_pattern="*.pdf", + exclude_pattern=None, + expected_matches=["f1.pdf", "f2.pdf", "f3.pdf", "file.PDf", "f1.Pdf"], + ), + FilterTestCase( + "F1 PDF Only", + include_pattern="f1.pdf", + exclude_pattern=None, + expected_matches=["f1.pdf", "f1.Pdf"], + ), + FilterTestCase( + "All Files", + include_pattern="*", + exclude_pattern=None, + expected_matches=[ + "f1.pdf", + "f2.pdf", + "f3.pdf", + "f2.png", + "file.PDf", + "f1.Pdf", + ], + ), + FilterTestCase( + "PNG Only", + include_pattern="*.png", + exclude_pattern=None, + expected_matches=["f2.png"], + ), + FilterTestCase( + "PDF Files without f1", + include_pattern="*.pdf", + exclude_pattern="f1*", + expected_matches=["f2.pdf", "f3.pdf", "file.PDf"], + ), + FilterTestCase( + "All Files, no PNG", + include_pattern="*", + exclude_pattern="*.png", + expected_matches=[ + "f1.pdf", + "f2.pdf", + "f3.pdf", + "file.PDf", + "f1.Pdf", + ], + ), ] - for pattern, matches in tests: - with self.subTest(msg=pattern): + for test_case in tests: + with self.subTest(msg=test_case.name): self._queue_consumption_tasks_mock.reset_mock() account = MailAccount(name=str(uuid.uuid4())) account.save() @@ -553,14 +615,15 @@ class TestMail( name=str(uuid.uuid4()), assign_title_from=MailRule.TitleSource.FROM_FILENAME, account=account, - filter_attachment_filename=pattern, + filter_attachment_filename_include=test_case.include_pattern, + filter_attachment_filename_exclude=test_case.exclude_pattern, ) rule.save() self.mail_account_handler._handle_message(message, rule) self.assert_queue_consumption_tasks_call_args( [ - [{"override_filename": m} for m in matches], + [{"override_filename": m} for m in test_case.expected_matches], ], ) @@ -593,7 +656,7 @@ class TestMail( name=str(uuid.uuid4()), assign_title_from=MailRule.TitleSource.FROM_FILENAME, account=account, - filter_attachment_filename="*.pdf", + filter_attachment_filename_include="*.pdf", attachment_type=MailRule.AttachmentProcessing.EVERYTHING, action=MailRule.MailAction.DELETE, ) diff --git a/src/paperless_tesseract/parsers.py b/src/paperless_tesseract/parsers.py index f64ea8adf..babcf6bcf 100644 --- a/src/paperless_tesseract/parsers.py +++ b/src/paperless_tesseract/parsers.py @@ -186,6 +186,11 @@ class RasterisedDocumentParser(DocumentParser): "progress_bar": False, } + if "pdfa" in ocrmypdf_args["output_type"]: + ocrmypdf_args[ + "color_conversion_strategy" + ] = settings.OCR_COLOR_CONVERSION_STRATEGY + if settings.OCR_MODE == "force" or safe_fallback: ocrmypdf_args["force_ocr"] = True elif settings.OCR_MODE in ["skip", "skip_noarchive"]: @@ -244,6 +249,10 @@ class RasterisedDocumentParser(DocumentParser): f"no DPI information is present in this image and " f"OCR_IMAGE_DPI is not set.", ) + if ocrmypdf_args["image_dpi"] < 70: # pragma: no cover + self.log.warning( + f"Image DPI of {ocrmypdf_args['image_dpi']} is low, OCR may fail", + ) if settings.OCR_USER_ARGS and not safe_fallback: try: