mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-10-19 22:38:13 +00:00
Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20b7a116fd | ||
|
|
8d3902454e | ||
|
|
31caf01ae5 | ||
|
|
e756f5985f | ||
|
|
ce1dee7549 | ||
|
|
fd187cd09a | ||
|
|
814b208280 | ||
|
|
11c32d352e | ||
|
|
c21deaa452 | ||
|
|
c47766121d | ||
|
|
979bcd3896 | ||
|
|
d450f03d5f | ||
|
|
15e9a7a017 | ||
|
|
04a927c25f |
No files matched your search
@@ -1,5 +1,64 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## paperless-ngx 3.3.3
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix: fix global search input layout shifting [@shamoon](https://github.com/shamoon) ([#14491](https://github.com/paperless-ngx/paperless-ngx/pull/14491))
|
||||||
|
- Fix: dont include doc content on global search results [@shamoon](https://github.com/shamoon) ([#14488](https://github.com/paperless-ngx/paperless-ngx/pull/14488))
|
||||||
|
- Fix: remove some redundant pagers [@shamoon](https://github.com/shamoon) ([#14487](https://github.com/paperless-ngx/paperless-ngx/pull/14487))
|
||||||
|
- Fix: prevent weird wrapping of dashboard widget column titles [@shamoon](https://github.com/shamoon) ([#14486](https://github.com/paperless-ngx/paperless-ngx/pull/14486))
|
||||||
|
- Fix: dont paginate 'all' tasks view across sections [@shamoon](https://github.com/shamoon) ([#14484](https://github.com/paperless-ngx/paperless-ngx/pull/14484))
|
||||||
|
- Fix: use float parsing for importer manifest records with a passphrase [@stumpylog](https://github.com/stumpylog) ([#14483](https://github.com/paperless-ngx/paperless-ngx/pull/14483))
|
||||||
|
- Fix: respect subpath in logout, share link and auto-login redirects [@jaimevelaz](https://github.com/jaimevelaz) ([#14476](https://github.com/paperless-ngx/paperless-ngx/pull/14476))
|
||||||
|
- Fix: dont tie suggestions button to ai enabled any more [@shamoon](https://github.com/shamoon) ([#14478](https://github.com/paperless-ngx/paperless-ngx/pull/14478))
|
||||||
|
- Fix: handle single-class classifier in threshold prediction (#<!---->14471) [@stumpylog](https://github.com/stumpylog) ([#14473](https://github.com/paperless-ngx/paperless-ngx/pull/14473))
|
||||||
|
- Fix: keep counter and extension when shortening long public filenames [@stumpylog](https://github.com/stumpylog) ([#14472](https://github.com/paperless-ngx/paperless-ngx/pull/14472))
|
||||||
|
|
||||||
|
### All App Changes
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>10 changes</summary>
|
||||||
|
|
||||||
|
- Fix: fix global search input layout shifting [@shamoon](https://github.com/shamoon) ([#14491](https://github.com/paperless-ngx/paperless-ngx/pull/14491))
|
||||||
|
- Fix: dont include doc content on global search results [@shamoon](https://github.com/shamoon) ([#14488](https://github.com/paperless-ngx/paperless-ngx/pull/14488))
|
||||||
|
- Fix: remove some redundant pagers [@shamoon](https://github.com/shamoon) ([#14487](https://github.com/paperless-ngx/paperless-ngx/pull/14487))
|
||||||
|
- Fix: prevent weird wrapping of dashboard widget column titles [@shamoon](https://github.com/shamoon) ([#14486](https://github.com/paperless-ngx/paperless-ngx/pull/14486))
|
||||||
|
- Fix: dont paginate 'all' tasks view across sections [@shamoon](https://github.com/shamoon) ([#14484](https://github.com/paperless-ngx/paperless-ngx/pull/14484))
|
||||||
|
- Fix: use float parsing for importer manifest records with a passphrase [@stumpylog](https://github.com/stumpylog) ([#14483](https://github.com/paperless-ngx/paperless-ngx/pull/14483))
|
||||||
|
- Fix: respect subpath in logout, share link and auto-login redirects [@jaimevelaz](https://github.com/jaimevelaz) ([#14476](https://github.com/paperless-ngx/paperless-ngx/pull/14476))
|
||||||
|
- Fix: dont tie suggestions button to ai enabled any more [@shamoon](https://github.com/shamoon) ([#14478](https://github.com/paperless-ngx/paperless-ngx/pull/14478))
|
||||||
|
- Fix: handle single-class classifier in threshold prediction (#<!---->14471) [@stumpylog](https://github.com/stumpylog) ([#14473](https://github.com/paperless-ngx/paperless-ngx/pull/14473))
|
||||||
|
- Fix: keep counter and extension when shortening long public filenames [@stumpylog](https://github.com/stumpylog) ([#14472](https://github.com/paperless-ngx/paperless-ngx/pull/14472))
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## paperless-ngx 3.3.2
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Fix: copy only direct user grants in DocumentMetadataOverrides.from\_document [@stumpylog](https://github.com/stumpylog) ([#14452](https://github.com/paperless-ngx/paperless-ngx/pull/14452))
|
||||||
|
- Fix: support combined text/query searches [@shamoon](https://github.com/shamoon) ([#14443](https://github.com/paperless-ngx/paperless-ngx/pull/14443))
|
||||||
|
- Fix: make exporter derived file names unique when originals differ only by extension [@stumpylog](https://github.com/stumpylog) ([#14429](https://github.com/paperless-ngx/paperless-ngx/pull/14429))
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
- Chore(deps): Bump filelock from 3.32.6 to 4.0.12 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14336](https://github.com/paperless-ngx/paperless-ngx/pull/14336))
|
||||||
|
- Chore(deps): Bump the uv group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14418](https://github.com/paperless-ngx/paperless-ngx/pull/14418))
|
||||||
|
|
||||||
|
### All App Changes
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>5 changes</summary>
|
||||||
|
|
||||||
|
- Fix: copy only direct user grants in DocumentMetadataOverrides.from\_document [@stumpylog](https://github.com/stumpylog) ([#14452](https://github.com/paperless-ngx/paperless-ngx/pull/14452))
|
||||||
|
- Chore(deps): Bump filelock from 3.32.6 to 4.0.12 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14336](https://github.com/paperless-ngx/paperless-ngx/pull/14336))
|
||||||
|
- Fix: support combined text/query searches [@shamoon](https://github.com/shamoon) ([#14443](https://github.com/paperless-ngx/paperless-ngx/pull/14443))
|
||||||
|
- Chore(deps): Bump the uv group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14418](https://github.com/paperless-ngx/paperless-ngx/pull/14418))
|
||||||
|
- Fix: make exporter derived file names unique when originals differ only by extension [@stumpylog](https://github.com/stumpylog) ([#14429](https://github.com/paperless-ngx/paperless-ngx/pull/14429))
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## paperless-ngx 3.3.1
|
## paperless-ngx 3.3.1
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "paperless-ngx"
|
name = "paperless-ngx"
|
||||||
version = "3.3.1"
|
version = "3.3.3"
|
||||||
description = """\
|
description = """\
|
||||||
A community-supported supercharged document management system: scan, index and archive all your physical documents\
|
A community-supported supercharged document management system: scan, index and archive all your physical documents\
|
||||||
"""
|
"""
|
||||||
|
|||||||
+63
-63
@@ -259,15 +259,15 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">63</context>
|
<context context-type="linenumber">65</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">66</context>
|
<context context-type="linenumber">68</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">69</context>
|
<context context-type="linenumber">71</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html</context>
|
||||||
@@ -351,19 +351,19 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">151</context>
|
<context context-type="linenumber">153</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">151</context>
|
<context context-type="linenumber">153</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">151</context>
|
<context context-type="linenumber">153</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">151</context>
|
<context context-type="linenumber">153</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html</context>
|
||||||
@@ -882,19 +882,19 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">52</context>
|
<context context-type="linenumber">54</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">52</context>
|
<context context-type="linenumber">54</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">52</context>
|
<context context-type="linenumber">54</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">52</context>
|
<context context-type="linenumber">54</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
||||||
@@ -2271,19 +2271,19 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">38,39</context>
|
<context context-type="linenumber">40,41</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">38,39</context>
|
<context context-type="linenumber">40,41</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">38,39</context>
|
<context context-type="linenumber">40,41</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">38,39</context>
|
<context context-type="linenumber">40,41</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
||||||
@@ -2399,35 +2399,35 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">44,45</context>
|
<context context-type="linenumber">46,47</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">44,45</context>
|
<context context-type="linenumber">46,47</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">44,45</context>
|
<context context-type="linenumber">46,47</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">44,45</context>
|
<context context-type="linenumber">46,47</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
||||||
@@ -2987,35 +2987,35 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">121,122</context>
|
<context context-type="linenumber">123,124</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">121,122</context>
|
<context context-type="linenumber">123,124</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">121,122</context>
|
<context context-type="linenumber">123,124</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">121,122</context>
|
<context context-type="linenumber">123,124</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">140</context>
|
<context context-type="linenumber">142</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">140</context>
|
<context context-type="linenumber">142</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">140</context>
|
<context context-type="linenumber">142</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">140</context>
|
<context context-type="linenumber">142</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.ts</context>
|
||||||
@@ -3290,35 +3290,35 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">120,121</context>
|
<context context-type="linenumber">122,123</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">120,121</context>
|
<context context-type="linenumber">122,123</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">120,121</context>
|
<context context-type="linenumber">122,123</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">120,121</context>
|
<context context-type="linenumber">122,123</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">137</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">137</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">137</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">137</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/mail/mail.component.html</context>
|
||||||
@@ -3784,7 +3784,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">123</context>
|
<context context-type="linenumber">125</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
|
||||||
@@ -3997,7 +3997,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">103</context>
|
<context context-type="linenumber">105</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
@@ -8120,7 +8120,7 @@
|
|||||||
<source>Filter by correspondent</source>
|
<source>Filter by correspondent</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">73</context>
|
<context context-type="linenumber">75</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
||||||
@@ -8135,7 +8135,7 @@
|
|||||||
<source>Filter by document type</source>
|
<source>Filter by document type</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">83</context>
|
<context context-type="linenumber">85</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
||||||
@@ -8150,7 +8150,7 @@
|
|||||||
<source>Filter by storage path</source>
|
<source>Filter by storage path</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">88</context>
|
<context context-type="linenumber">90</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-card-large/document-card-large.component.html</context>
|
||||||
@@ -8165,14 +8165,14 @@
|
|||||||
<source>Filter by owner</source>
|
<source>Filter by owner</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">93</context>
|
<context context-type="linenumber">95</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3542042671420335679" datatype="html">
|
<trans-unit id="3542042671420335679" datatype="html">
|
||||||
<source>No</source>
|
<source>No</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">103</context>
|
<context context-type="linenumber">105</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
@@ -8183,7 +8183,7 @@
|
|||||||
<source>No documents</source>
|
<source>No documents</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html</context>
|
||||||
<context context-type="linenumber">187,190</context>
|
<context context-type="linenumber">189,192</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1069523139277190436" datatype="html">
|
<trans-unit id="1069523139277190436" datatype="html">
|
||||||
@@ -10528,19 +10528,19 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">129,130</context>
|
<context context-type="linenumber">131,132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">129,130</context>
|
<context context-type="linenumber">131,132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">129,130</context>
|
<context context-type="linenumber">131,132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">129,130</context>
|
<context context-type="linenumber">131,132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="651372623796033489" datatype="html">
|
<trans-unit id="651372623796033489" datatype="html">
|
||||||
@@ -10718,57 +10718,57 @@
|
|||||||
<source>Matching</source>
|
<source>Matching</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">39,40</context>
|
<context context-type="linenumber">41,42</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">39,40</context>
|
<context context-type="linenumber">41,42</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">39,40</context>
|
<context context-type="linenumber">41,42</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">39,40</context>
|
<context context-type="linenumber">41,42</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1488347670280290838" datatype="html">
|
<trans-unit id="1488347670280290838" datatype="html">
|
||||||
<source>Document count</source>
|
<source>Document count</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">40,41</context>
|
<context context-type="linenumber">42,43</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">40,41</context>
|
<context context-type="linenumber">42,43</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">40,41</context>
|
<context context-type="linenumber">42,43</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">40,41</context>
|
<context context-type="linenumber">42,43</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8095412801504464756" datatype="html">
|
<trans-unit id="8095412801504464756" datatype="html">
|
||||||
<source>{VAR_PLURAL, plural, =1 {One <x id="INTERPOLATION"/>} other {<x id="INTERPOLATION_1"/> total <x id="INTERPOLATION_2"/>}}</source>
|
<source>{VAR_PLURAL, plural, =1 {One <x id="INTERPOLATION"/>} other {<x id="INTERPOLATION_1"/> total <x id="INTERPOLATION_2"/>}}</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">67</context>
|
<context context-type="linenumber">69</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">67</context>
|
<context context-type="linenumber">69</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">67</context>
|
<context context-type="linenumber">69</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/document-attributes/management-list/management-list.component.html</context>
|
||||||
<context context-type="linenumber">67</context>
|
<context context-type="linenumber">69</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="810888510148304696" datatype="html">
|
<trans-unit id="810888510148304696" datatype="html">
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "paperless-ngx-ui",
|
"name": "paperless-ngx-ui",
|
||||||
"version": "3.3.1",
|
"version": "3.3.3",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": "npx only-allow pnpm",
|
"preinstall": "npx only-allow pnpm",
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
|
|||||||
@@ -66,6 +66,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.search-container {
|
.search-container {
|
||||||
|
min-width: 0;
|
||||||
padding-left: 1rem;
|
padding-left: 1rem;
|
||||||
padding-right: 1rem;
|
padding-right: 1rem;
|
||||||
}
|
}
|
||||||
@@ -499,6 +500,11 @@ main {
|
|||||||
|
|
||||||
// true center the search with equal flex widths
|
// true center the search with equal flex widths
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
|
.search-container {
|
||||||
|
// Prevent input padding and the conditional search button from resizing
|
||||||
|
flex-basis: 55rem;
|
||||||
|
}
|
||||||
|
|
||||||
.navbar-brand-container,
|
.navbar-brand-container,
|
||||||
.navbar > ul {
|
.navbar > ul {
|
||||||
display: flex; // so the brand link stays as wide as its contents
|
display: flex; // so the brand link stays as wide as its contents
|
||||||
|
|||||||
@@ -70,6 +70,17 @@ form {
|
|||||||
max-height: 75vh;
|
max-height: 75vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown.show {
|
||||||
|
// Hide the search icon when the dropdown is shown
|
||||||
|
i-bs[name="search"] {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control {
|
||||||
|
padding-left: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-item {
|
.dropdown-item {
|
||||||
&:has(button:focus) {
|
&:has(button:focus) {
|
||||||
background-color: var(--pngx-bg-darker);
|
background-color: var(--pngx-bg-darker);
|
||||||
|
|||||||
+1
-3
@@ -1,7 +1,5 @@
|
|||||||
@if (!accordion) {
|
@if (!accordion) {
|
||||||
@if (title?.length > 0) {
|
<h5 i18n>Permissions</h5>
|
||||||
<h5>{{title}}</h5>
|
|
||||||
}
|
|
||||||
<ng-container [ngTemplateOutlet]="permissionsForm"></ng-container>
|
<ng-container [ngTemplateOutlet]="permissionsForm"></ng-container>
|
||||||
}
|
}
|
||||||
@if (accordion) {
|
@if (accordion) {
|
||||||
|
|||||||
-3
@@ -59,9 +59,6 @@ export class PermissionsFormComponent
|
|||||||
@Input()
|
@Input()
|
||||||
accordion: boolean = false
|
accordion: boolean = false
|
||||||
|
|
||||||
@Input()
|
|
||||||
title: string = $localize`Permissions`
|
|
||||||
|
|
||||||
form = new FormGroup({
|
form = new FormGroup({
|
||||||
owner: new FormControl(null),
|
owner: new FormControl(null),
|
||||||
set_permissions: new FormGroup({
|
set_permissions: new FormGroup({
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
<h3 class="d-flex align-items-center mb-2 mb-md-1" style="line-height: 1.4">
|
<h3 class="d-flex align-items-center mb-2 mb-md-1" style="line-height: 1.4">
|
||||||
<span class="text-truncate">{{title()}}</span>
|
<span class="text-truncate">{{title()}}</span>
|
||||||
@if (id()) {
|
@if (id()) {
|
||||||
<button type="button" class="badge border-0 bg-primary text-primary-text-contrast ms-3 small fs-normal" (click)="copyID()" title="Copy ID" i18n-title>
|
<span class="badge bg-primary text-primary-text-contrast ms-3 small fs-normal cursor-pointer" (click)="copyID()">
|
||||||
@if (copied()) {
|
@if (copied()) {
|
||||||
<i-bs width="1em" height="1em" name="clipboard-check" class="me-1"></i-bs><ng-container i18n>Copied!</ng-container>
|
<i-bs width="1em" height="1em" name="clipboard-check" class="me-1"></i-bs><ng-container i18n>Copied!</ng-container>
|
||||||
} @else {
|
} @else {
|
||||||
ID: {{id()}}
|
ID: {{id()}}
|
||||||
}
|
}
|
||||||
</button>
|
</span>
|
||||||
}
|
}
|
||||||
@if (subTitle()) {
|
@if (subTitle()) {
|
||||||
<span class="page-subtitle h6 mb-0 mt-1 fw-normal ms-md-3 text-truncate" style="line-height: 1.4">{{subTitle()}}</span>
|
<span class="page-subtitle h6 mb-0 mt-1 fw-normal ms-md-3 text-truncate" style="line-height: 1.4">{{subTitle()}}</span>
|
||||||
|
|||||||
@@ -43,13 +43,6 @@ describe('PageHeaderComponent', () => {
|
|||||||
expect(titleSpy).toHaveBeenCalledWith(`Foo Bar - ${environment.appTitle}`)
|
expect(titleSpy).toHaveBeenCalledWith(`Foo Bar - ${environment.appTitle}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should set html title to just the app title until a title is available', () => {
|
|
||||||
const titleSpy = jest.spyOn(titleService, 'setTitle')
|
|
||||||
fixture.componentRef.setInput('title', undefined)
|
|
||||||
fixture.detectChanges()
|
|
||||||
expect(titleSpy).toHaveBeenCalledWith(environment.appTitle)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should copy id to clipboard, reset after 3 seconds', () => {
|
it('should copy id to clipboard, reset after 3 seconds', () => {
|
||||||
jest.useFakeTimers()
|
jest.useFakeTimers()
|
||||||
fixture.componentRef.setInput('id', 42)
|
fixture.componentRef.setInput('id', 42)
|
||||||
|
|||||||
@@ -27,10 +27,7 @@ export class PageHeaderComponent {
|
|||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
effect(() => {
|
effect(() => {
|
||||||
const title = this.title()
|
this.titleService.setTitle(`${this.title()} - ${environment.appTitle}`)
|
||||||
this.titleService.setTitle(
|
|
||||||
title ? `${title} - ${environment.appTitle}` : environment.appTitle
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -25,6 +25,8 @@
|
|||||||
@if (displayFields().includes(field)) {
|
@if (displayFields().includes(field)) {
|
||||||
<th
|
<th
|
||||||
scope="col"
|
scope="col"
|
||||||
|
class="text-truncate"
|
||||||
|
[title]="getColumnTitle(field)"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'd-none d-md-table-cell': i > 1,
|
'd-none d-md-table-cell': i > 1,
|
||||||
'w-25': field === DisplayField.CREATED || field === DisplayField.ADDED
|
'w-25': field === DisplayField.CREATED || field === DisplayField.ADDED
|
||||||
|
|||||||
@@ -1,4 +1,25 @@
|
|||||||
<pngx-page-header [title]="title()" [id]="documentId()">
|
<pngx-page-header [title]="title()" [id]="documentId()">
|
||||||
|
@if (archiveContentRenderType === ContentRenderType.PDF && !useNativePdfViewer) {
|
||||||
|
@if (previewNumPages()) {
|
||||||
|
<div class="input-group input-group-sm ms-2 d-none d-md-flex">
|
||||||
|
<div class="input-group-text" i18n>Page</div>
|
||||||
|
<input class="form-control flex-grow-0 w-auto" type="number" min="1" [max]="previewNumPages()" [ngModel]="previewCurrentPage()" (ngModelChange)="previewCurrentPage.set($event)" />
|
||||||
|
<div class="input-group-text" i18n>of {{previewNumPages()}}</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
<div class="input-group input-group-sm me-md-5 d-none d-md-flex">
|
||||||
|
<button class="btn btn-outline-secondary" (click)="decreaseZoom()" i18n>-</button>
|
||||||
|
<select class="form-select" (change)="setZoom($event.target.value)" [ngModel]="currentZoom">
|
||||||
|
@for (setting of zoomSettings; track setting) {
|
||||||
|
<option [value]="setting">
|
||||||
|
{{ getZoomSettingTitle(setting) }}
|
||||||
|
</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
<button class="btn btn-outline-secondary" (click)="increaseZoom()" i18n>+</button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<button type="button" class="btn btn-sm btn-outline-danger me-md-4" (click)="delete()" [disabled]="!userIsOwner" *pngxIfPermissions="{ action: PermissionAction.Delete, type: PermissionType.Document }" aria-label="Delete" i18n-aria-label>
|
<button type="button" class="btn btn-sm btn-outline-danger me-md-4" (click)="delete()" [disabled]="!userIsOwner" *pngxIfPermissions="{ action: PermissionAction.Delete, type: PermissionType.Document }" aria-label="Delete" i18n-aria-label>
|
||||||
<i-bs width="1.2em" height="1.2em" name="trash"></i-bs><span class="d-none d-lg-inline ps-1" i18n>Delete</span>
|
<i-bs width="1.2em" height="1.2em" name="trash"></i-bs><span class="d-none d-lg-inline ps-1" i18n>Delete</span>
|
||||||
</button>
|
</button>
|
||||||
@@ -13,7 +34,7 @@
|
|||||||
(versionsUpdated)="onVersionsUpdated($event)"
|
(versionsUpdated)="onVersionsUpdated($event)"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="btn-group ms-4">
|
<div class="btn-group">
|
||||||
<button (click)="download()" class="btn btn-sm btn-outline-primary" [disabled]="downloading()" aria-label="Download" i18n-aria-label>
|
<button (click)="download()" class="btn btn-sm btn-outline-primary" [disabled]="downloading()" aria-label="Download" i18n-aria-label>
|
||||||
@if (downloading()) {
|
@if (downloading()) {
|
||||||
<div class="spinner-border spinner-border-sm" role="status"></div>
|
<div class="spinner-border spinner-border-sm" role="status"></div>
|
||||||
@@ -73,7 +94,7 @@
|
|||||||
<button class="btn btn-sm btn-outline-primary" id="sendDropdown" ngbDropdownToggle aria-label="Send" i18n-aria-label>
|
<button class="btn btn-sm btn-outline-primary" id="sendDropdown" ngbDropdownToggle aria-label="Send" i18n-aria-label>
|
||||||
<i-bs name="send"></i-bs><div class="d-none d-sm-inline ms-1"><ng-container i18n>Send</ng-container></div>
|
<i-bs name="send"></i-bs><div class="d-none d-sm-inline ms-1"><ng-container i18n>Send</ng-container></div>
|
||||||
</button>
|
</button>
|
||||||
<div ngbDropdownMenu aria-labelledby="sendDropdown" class="shadow">
|
<div ngbDropdownMenu aria-labelledby="actionsDropdown" class="shadow">
|
||||||
<button ngbDropdownItem (click)="openShareLinks()" *pngxIfPermissions="{ action: PermissionAction.Add, type: PermissionType.ShareLink }">
|
<button ngbDropdownItem (click)="openShareLinks()" *pngxIfPermissions="{ action: PermissionAction.Add, type: PermissionType.ShareLink }">
|
||||||
<i-bs name="link" class="me-1"></i-bs><span i18n>Share Links</span>
|
<i-bs name="link" class="me-1"></i-bs><span i18n>Share Links</span>
|
||||||
</button>
|
</button>
|
||||||
@@ -92,8 +113,8 @@
|
|||||||
|
|
||||||
<form [formGroup]='documentForm' (ngSubmit)="save()">
|
<form [formGroup]='documentForm' (ngSubmit)="save()">
|
||||||
|
|
||||||
<div class="btn-toolbar mb-1 pb-3 gap-2 row-gap-2 border-bottom">
|
<div class="btn-toolbar justify-content-end mb-1 pb-3 gap-2 row-gap-2 border-bottom">
|
||||||
<div class="btn-group">
|
<div class="btn-group me-auto">
|
||||||
<button type="button" class="btn btn-sm btn-outline-secondary" i18n-title title="Close" (click)="close()">
|
<button type="button" class="btn btn-sm btn-outline-secondary" i18n-title title="Close" (click)="close()">
|
||||||
<i-bs width="1.2em" height="1.2em" name="x"></i-bs>
|
<i-bs width="1.2em" height="1.2em" name="x"></i-bs>
|
||||||
</button>
|
</button>
|
||||||
@@ -106,30 +127,43 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ng-container *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }">
|
<ng-container *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }">
|
||||||
<div class="btn-group ms-3">
|
<div class="d-flex gap-2">
|
||||||
<pngx-suggestions-dropdown *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }"
|
<div class="btn-group">
|
||||||
[disabled]="!userCanEdit || suggestionsLoading()"
|
<pngx-suggestions-dropdown *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }"
|
||||||
[loading]="suggestionsLoading()"
|
[disabled]="!userCanEdit || suggestionsLoading()"
|
||||||
[suggestions]="suggestions()"
|
[loading]="suggestionsLoading()"
|
||||||
[aiEnabled]="aiEnabled"
|
[suggestions]="suggestions()"
|
||||||
[source]="suggestionSource"
|
[aiEnabled]="aiEnabled"
|
||||||
[defaultSource]="defaultSuggestionSource"
|
[source]="suggestionSource"
|
||||||
[fetchedSources]="fetchedSuggestionSources()"
|
[defaultSource]="defaultSuggestionSource"
|
||||||
[appliedTags]="documentForm.value.tags"
|
[fetchedSources]="fetchedSuggestionSources()"
|
||||||
[appliedCorrespondent]="documentForm.value.correspondent"
|
[appliedTags]="documentForm.value.tags"
|
||||||
[appliedDocumentType]="documentForm.value.document_type"
|
[appliedCorrespondent]="documentForm.value.correspondent"
|
||||||
[appliedStoragePath]="documentForm.value.storage_path"
|
[appliedDocumentType]="documentForm.value.document_type"
|
||||||
[appliedTitle]="documentForm.value.title"
|
[appliedStoragePath]="documentForm.value.storage_path"
|
||||||
[appliedCreated]="documentForm.value.created"
|
[appliedTitle]="documentForm.value.title"
|
||||||
(getSuggestions)="getSuggestions($event)"
|
[appliedCreated]="documentForm.value.created"
|
||||||
(sourceChange)="suggestionSourceOverride.set($event)"
|
(getSuggestions)="getSuggestions($event)"
|
||||||
(addTag)="createTag($event)"
|
(sourceChange)="suggestionSourceOverride.set($event)"
|
||||||
(addDocumentType)="createDocumentType($event)"
|
(addTag)="createTag($event)"
|
||||||
(addCorrespondent)="createCorrespondent($event)">
|
(addDocumentType)="createDocumentType($event)"
|
||||||
</pngx-suggestions-dropdown>
|
(addCorrespondent)="createCorrespondent($event)">
|
||||||
|
</pngx-suggestions-dropdown>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
<pngx-custom-fields-dropdown
|
||||||
|
*pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.CustomField }"
|
||||||
|
[documentId]="documentId()"
|
||||||
|
[disabled]="!userCanEdit"
|
||||||
|
[existingFields]="document()?.custom_fields"
|
||||||
|
(created)="refreshCustomFields()"
|
||||||
|
(added)="addField($event)">
|
||||||
|
</pngx-custom-fields-dropdown>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ms-auto">
|
<div class="ps-3">
|
||||||
<ng-container *ngTemplateOutlet="saveButtons"></ng-container>
|
<ng-container *ngTemplateOutlet="saveButtons"></ng-container>
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
@@ -256,20 +290,8 @@
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="d-flex border-top pt-3">
|
<div class="d-flex justify-content-end border-top pt-3">
|
||||||
<ng-container *pngxIfPermissions="{ action: PermissionAction.Change, type: PermissionType.Document }">
|
<ng-container *ngTemplateOutlet="saveButtons"></ng-container>
|
||||||
<pngx-custom-fields-dropdown
|
|
||||||
*pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.CustomField }"
|
|
||||||
[documentId]="documentId()"
|
|
||||||
[disabled]="!userCanEdit"
|
|
||||||
[existingFields]="document()?.custom_fields"
|
|
||||||
(created)="refreshCustomFields()"
|
|
||||||
(added)="addField($event)">
|
|
||||||
</pngx-custom-fields-dropdown>
|
|
||||||
</ng-container>
|
|
||||||
<div class="ms-auto">
|
|
||||||
<ng-container *ngTemplateOutlet="saveButtons"></ng-container>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</li>
|
</li>
|
||||||
@@ -306,9 +328,9 @@
|
|||||||
<td i18n>Original filename</td>
|
<td i18n>Original filename</td>
|
||||||
<td>{{metadata()?.original_filename}}</td>
|
<td>{{metadata()?.original_filename}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="align-middle">
|
<tr>
|
||||||
<td i18n>Original SHA256 checksum</td>
|
<td i18n>Original SHA256 checksum</td>
|
||||||
<td><span class="badge bg-light font-monospace text-wrap text-break text-start">{{metadata()?.original_checksum}}</span></td>
|
<td>{{metadata()?.original_checksum}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td i18n>Original file size</td>
|
<td i18n>Original file size</td>
|
||||||
@@ -319,9 +341,9 @@
|
|||||||
<td>{{metadata()?.original_mime_type}}</td>
|
<td>{{metadata()?.original_mime_type}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@if (metadata()?.has_archive_version) {
|
@if (metadata()?.has_archive_version) {
|
||||||
<tr class="align-middle">
|
<tr>
|
||||||
<td i18n>Archive SHA256 checksum</td>
|
<td i18n>Archive SHA256 checksum</td>
|
||||||
<td><span class="badge bg-light font-monospace text-wrap text-break text-start">{{metadata()?.archive_checksum}}</span></td>
|
<td>{{metadata()?.archive_checksum}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@if (metadata()?.has_archive_version) {
|
@if (metadata()?.has_archive_version) {
|
||||||
@@ -386,7 +408,7 @@
|
|||||||
<a ngbNavLink i18n>Permissions</a>
|
<a ngbNavLink i18n>Permissions</a>
|
||||||
<ng-template ngbNavContent>
|
<ng-template ngbNavContent>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<pngx-permissions-form title="" [users]="users()" formControlName="permissions_form"></pngx-permissions-form>
|
<pngx-permissions-form [users]="users()" formControlName="permissions_form"></pngx-permissions-form>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</li>
|
</li>
|
||||||
@@ -477,29 +499,6 @@
|
|||||||
(loadError)="onError($event)"
|
(loadError)="onError($event)"
|
||||||
(afterLoadComplete)="pdfPreviewLoaded($event)">
|
(afterLoadComplete)="pdfPreviewLoaded($event)">
|
||||||
</pngx-pdf-viewer>
|
</pngx-pdf-viewer>
|
||||||
<div class="position-absolute bottom-0 start-50 translate-middle-x z-1 mb-3 d-flex gap-2 p-1 bg-body border rounded shadow">
|
|
||||||
@if (previewNumPages()) {
|
|
||||||
<div class="input-group input-group-sm w-auto flex-nowrap">
|
|
||||||
<input class="form-control flex-grow-0 w-auto" type="number" min="1" [max]="previewNumPages()" [ngModelOptions]="{standalone: true}" [ngModel]="previewCurrentPage()" (ngModelChange)="previewCurrentPage.set($event)" aria-label="Page" i18n-aria-label />
|
|
||||||
<div class="input-group-text" i18n>of {{previewNumPages()}}</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
<div class="input-group input-group-sm w-auto flex-nowrap">
|
|
||||||
<button class="btn btn-outline-secondary" (click)="decreaseZoom()" aria-label="Zoom out" i18n-aria-label>
|
|
||||||
<i-bs width="1em" height="1em" name="dash"></i-bs>
|
|
||||||
</button>
|
|
||||||
<select class="form-select" (change)="setZoom($event.target.value)" [ngModelOptions]="{standalone: true}" [ngModel]="currentZoom" aria-label="Zoom" i18n-aria-label>
|
|
||||||
@for (setting of zoomSettings; track setting) {
|
|
||||||
<option [value]="setting">
|
|
||||||
{{ getZoomSettingTitle(setting) }}
|
|
||||||
</option>
|
|
||||||
}
|
|
||||||
</select>
|
|
||||||
<button class="btn btn-outline-secondary" (click)="increaseZoom()" aria-label="Zoom in" i18n-aria-label>
|
|
||||||
<i-bs width="1em" height="1em" name="plus"></i-bs>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
} @else {
|
} @else {
|
||||||
<object [data]="previewUrl() | safeUrl" class="preview-sticky" width="100%"></object>
|
<object [data]="previewUrl() | safeUrl" class="preview-sticky" width="100%"></object>
|
||||||
|
|||||||
+5
-3
@@ -11,7 +11,7 @@
|
|||||||
<div class="input-group input-group-sm w-auto d-none d-md-flex">
|
<div class="input-group input-group-sm w-auto d-none d-md-flex">
|
||||||
<label class="input-group-text bg-transparent border-0" for="managementPageSize" i18n>Show:</label>
|
<label class="input-group-text bg-transparent border-0" for="managementPageSize" i18n>Show:</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-group input-group-sm w-auto me-3">
|
<div class="input-group input-group-sm w-auto">
|
||||||
<select id="managementPageSize" class="form-select form-select-sm small" [(ngModel)]="pageSize">
|
<select id="managementPageSize" class="form-select form-select-sm small" [(ngModel)]="pageSize">
|
||||||
<option [ngValue]="25">25</option>
|
<option [ngValue]="25">25</option>
|
||||||
<option [ngValue]="50">50</option>
|
<option [ngValue]="50">50</option>
|
||||||
@@ -19,7 +19,9 @@
|
|||||||
</select>
|
</select>
|
||||||
<span class="input-group-text text-muted d-none d-md-flex" i18n>per page</span>
|
<span class="input-group-text text-muted d-none d-md-flex" i18n>per page</span>
|
||||||
</div>
|
</div>
|
||||||
<ngb-pagination [pageSize]="pageSize" [collectionSize]="collectionSize()" [page]="page()" [maxSize]="5" (pageChange)="page.set($event); reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
|
@if (collectionSize() > pageSize) {
|
||||||
|
<ngb-pagination [pageSize]="pageSize" [collectionSize]="collectionSize()" [page]="page()" [maxSize]="5" (pageChange)="page.set($event); reloadData()" class="ms-3" size="sm" aria-label="Pagination"></ngb-pagination>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -70,7 +72,7 @@
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if (collectionSize() > 20) {
|
@if (collectionSize() > pageSize) {
|
||||||
<ngb-pagination class="ms-auto" [pageSize]="pageSize" [collectionSize]="collectionSize()" [page]="page()" [maxSize]="5" (pageChange)="page.set($event); reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
|
<ngb-pagination class="ms-auto" [pageSize]="pageSize" [collectionSize]="collectionSize()" [page]="page()" [maxSize]="5" (pageChange)="page.set($event); reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+11
-9
@@ -93,15 +93,17 @@
|
|||||||
[disabled]="selectedMailIds().size === 0"
|
[disabled]="selectedMailIds().size === 0"
|
||||||
(confirm)="deleteSelected()">
|
(confirm)="deleteSelected()">
|
||||||
</pngx-confirm-button>
|
</pngx-confirm-button>
|
||||||
<div class="ms-auto">
|
@if (processedMails().length > 50) {
|
||||||
<ngb-pagination
|
<div class="ms-auto">
|
||||||
[collectionSize]="processedMails().length"
|
<ngb-pagination
|
||||||
[(page)]="page"
|
[collectionSize]="processedMails().length"
|
||||||
[pageSize]="50"
|
[(page)]="page"
|
||||||
[maxSize]="5"
|
[pageSize]="50"
|
||||||
(pageChange)="loadProcessedMails()">
|
[maxSize]="5"
|
||||||
</ngb-pagination>
|
(pageChange)="loadProcessedMails()">
|
||||||
</div>
|
</ngb-pagination>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@@ -8,7 +8,7 @@ export const environment = {
|
|||||||
apiVersion: '10', // match src/paperless/settings.py
|
apiVersion: '10', // match src/paperless/settings.py
|
||||||
appTitle: DEFAULT_APP_TITLE,
|
appTitle: DEFAULT_APP_TITLE,
|
||||||
tag: 'prod',
|
tag: 'prod',
|
||||||
version: '3.3.1',
|
version: '3.3.3',
|
||||||
webSocketHost: window.location.host,
|
webSocketHost: window.location.host,
|
||||||
webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:',
|
webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:',
|
||||||
webSocketBaseUrl: base_url.pathname + 'ws/',
|
webSocketBaseUrl: base_url.pathname + 'ws/',
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -165,17 +165,19 @@ class BarcodePlugin(ConsumeTaskPlugin):
|
|||||||
# Locate any barcodes in the files
|
# Locate any barcodes in the files
|
||||||
self.detect()
|
self.detect()
|
||||||
|
|
||||||
# try reading tags from barcodes
|
separator_pages = (
|
||||||
# If tag splitting is enabled, skip this on the original document - let each split document extract its own tags
|
self.get_separation_pages() if self.settings.barcodes_enabled else {}
|
||||||
# However, if we're processing a split document (original_path is set), extract tags
|
)
|
||||||
|
|
||||||
|
# Defer tags to split documents only when a split will actually happen.
|
||||||
if (
|
if (
|
||||||
self.settings.barcode_enable_tag
|
self.settings.barcode_enable_tag
|
||||||
and (
|
and (
|
||||||
not self.settings.barcode_tag_split
|
not self.settings.barcode_tag_split
|
||||||
or self.input_doc.original_path is not None
|
or self.input_doc.original_path is not None
|
||||||
|
or not separator_pages
|
||||||
)
|
)
|
||||||
and (tags := self.tags) is not None
|
and (tags := self.tags)
|
||||||
and len(tags) > 0
|
|
||||||
):
|
):
|
||||||
if self.metadata.tag_ids:
|
if self.metadata.tag_ids:
|
||||||
self.metadata.tag_ids += tags
|
self.metadata.tag_ids += tags
|
||||||
@@ -184,9 +186,7 @@ class BarcodePlugin(ConsumeTaskPlugin):
|
|||||||
logger.info(f"Found tags in barcode: {tags}")
|
logger.info(f"Found tags in barcode: {tags}")
|
||||||
|
|
||||||
# Lastly attempt to split documents
|
# Lastly attempt to split documents
|
||||||
if self.settings.barcodes_enabled and (
|
if separator_pages:
|
||||||
separator_pages := self.get_separation_pages()
|
|
||||||
):
|
|
||||||
# We have pages to split against
|
# We have pages to split against
|
||||||
|
|
||||||
# Note this does NOT use the base_temp_dir, as that will be removed
|
# Note this does NOT use the base_temp_dir, as that will be removed
|
||||||
|
|||||||
@@ -2137,29 +2137,6 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase):
|
|||||||
self.assertEqual(len(response.data["documents"]), 1)
|
self.assertEqual(len(response.data["documents"]), 1)
|
||||||
self.assertEqual(response.data["documents"][0]["id"], title_match.id)
|
self.assertEqual(response.data["documents"][0]["id"], title_match.id)
|
||||||
|
|
||||||
def test_global_search_returns_latest_version_content(self) -> None:
|
|
||||||
root = Document.objects.create(
|
|
||||||
title="bank statement",
|
|
||||||
content="superseded content",
|
|
||||||
checksum="GSV1",
|
|
||||||
pk=23,
|
|
||||||
)
|
|
||||||
Document.objects.create(
|
|
||||||
title="bank statement v2",
|
|
||||||
content="latest content",
|
|
||||||
checksum="GSV2",
|
|
||||||
pk=24,
|
|
||||||
root_document=root,
|
|
||||||
version_index=1,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.client.force_authenticate(self.user)
|
|
||||||
|
|
||||||
response = self.client.get("/api/search/?query=bank&db_only=true")
|
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
||||||
returned = {doc["id"]: doc["content"] for doc in response.data["documents"]}
|
|
||||||
self.assertEqual(returned.get(root.id), "latest content")
|
|
||||||
|
|
||||||
def test_global_search_filters_owned_mail_objects(self) -> None:
|
def test_global_search_filters_owned_mail_objects(self) -> None:
|
||||||
user1 = UserFactory(username="mail-search-user")
|
user1 = UserFactory(username="mail-search-user")
|
||||||
user2 = UserFactory(username="other-mail-search-user")
|
user2 = UserFactory(username="other-mail-search-user")
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import shutil
|
|||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
import zxingcpp
|
import zxingcpp
|
||||||
@@ -13,6 +14,7 @@ from django.test import override_settings
|
|||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
||||||
from documents import tasks
|
from documents import tasks
|
||||||
|
from documents.barcodes import Barcode
|
||||||
from documents.barcodes import BarcodePlugin
|
from documents.barcodes import BarcodePlugin
|
||||||
from documents.barcodes import read_barcode_values
|
from documents.barcodes import read_barcode_values
|
||||||
from documents.consumer import ConsumerError
|
from documents.consumer import ConsumerError
|
||||||
@@ -844,6 +846,89 @@ class TestTagBarcode(DirectoriesMixin, SampleDirMixin, GetReaderPluginMixin, Tes
|
|||||||
yield reader
|
yield reader
|
||||||
reader.cleanup()
|
reader.cleanup()
|
||||||
|
|
||||||
|
@override_settings(
|
||||||
|
CONSUMER_ENABLE_BARCODES=True,
|
||||||
|
CONSUMER_ENABLE_ASN_BARCODE=True,
|
||||||
|
CONSUMER_ENABLE_TAG_BARCODE=True,
|
||||||
|
CONSUMER_TAG_BARCODE_SPLIT=True,
|
||||||
|
)
|
||||||
|
def test_first_page_tags_without_split(self) -> None:
|
||||||
|
test_file = self.BARCODE_SAMPLE_DIR / "barcode-39-asn-123.pdf"
|
||||||
|
with self.get_reader(test_file) as reader:
|
||||||
|
reader.barcodes = [
|
||||||
|
Barcode(0, "ASN123,TAG:invoice", reader.settings),
|
||||||
|
]
|
||||||
|
existing_tag = Tag.objects.create(name="existing")
|
||||||
|
reader.metadata.tag_ids = [existing_tag.pk]
|
||||||
|
|
||||||
|
reader.run()
|
||||||
|
|
||||||
|
self.assertEqual(reader.metadata.asn, 123)
|
||||||
|
self.assertCountEqual(
|
||||||
|
reader.metadata.tag_ids,
|
||||||
|
[existing_tag.pk, Tag.objects.get(name="invoice").pk],
|
||||||
|
)
|
||||||
|
|
||||||
|
@override_settings(
|
||||||
|
CONSUMER_ENABLE_BARCODES=True,
|
||||||
|
CONSUMER_ENABLE_ASN_BARCODE=True,
|
||||||
|
CONSUMER_ENABLE_TAG_BARCODE=True,
|
||||||
|
CONSUMER_TAG_BARCODE_SPLIT=False,
|
||||||
|
)
|
||||||
|
def test_asn_split_preserves_tags_when_tag_split_disabled(self) -> None:
|
||||||
|
source = self.BARCODE_SAMPLE_DIR / "split-by-tag-basic.pdf"
|
||||||
|
test_file = self.dirs.scratch_dir / "asn-split.pdf"
|
||||||
|
shutil.copy(source, test_file)
|
||||||
|
with self.get_reader(test_file) as reader:
|
||||||
|
reader.barcodes = [
|
||||||
|
Barcode(0, "ASN123", reader.settings),
|
||||||
|
Barcode(0, "TAG:invoice", reader.settings),
|
||||||
|
Barcode(1, "ASN456", reader.settings),
|
||||||
|
Barcode(1, "TAG:receipt", reader.settings),
|
||||||
|
]
|
||||||
|
existing_tag = Tag.objects.create(name="existing")
|
||||||
|
reader.metadata.tag_ids = [existing_tag.pk]
|
||||||
|
|
||||||
|
with patch("documents.tasks.consume_file.apply_async") as consume:
|
||||||
|
with self.assertRaises(StopConsumeTaskError):
|
||||||
|
reader.run()
|
||||||
|
|
||||||
|
self.assertEqual(consume.call_count, 2)
|
||||||
|
for call in consume.call_args_list:
|
||||||
|
self.assertCountEqual(
|
||||||
|
call.kwargs["kwargs"]["overrides"].tag_ids,
|
||||||
|
[
|
||||||
|
existing_tag.pk,
|
||||||
|
Tag.objects.get(name="invoice").pk,
|
||||||
|
Tag.objects.get(name="receipt").pk,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
@override_settings(
|
||||||
|
CONSUMER_ENABLE_BARCODES=True,
|
||||||
|
CONSUMER_ENABLE_TAG_BARCODE=True,
|
||||||
|
CONSUMER_TAG_BARCODE_SPLIT=False,
|
||||||
|
CONSUMER_BARCODE_RETAIN_SPLIT_PAGES=False,
|
||||||
|
)
|
||||||
|
def test_discarded_separator_page_preserves_tags(self) -> None:
|
||||||
|
source = self.BARCODE_SAMPLE_DIR / "split-by-tag-basic.pdf"
|
||||||
|
test_file = self.dirs.scratch_dir / "separator-split.pdf"
|
||||||
|
shutil.copy(source, test_file)
|
||||||
|
with self.get_reader(test_file) as reader:
|
||||||
|
reader.barcodes = [
|
||||||
|
Barcode(0, reader.settings.barcode_string, reader.settings),
|
||||||
|
Barcode(0, "TAG:invoice", reader.settings),
|
||||||
|
]
|
||||||
|
with patch("documents.tasks.consume_file.apply_async") as consume:
|
||||||
|
with self.assertRaises(StopConsumeTaskError):
|
||||||
|
reader.run()
|
||||||
|
|
||||||
|
consume.assert_called_once()
|
||||||
|
self.assertEqual(
|
||||||
|
consume.call_args.kwargs["kwargs"]["overrides"].tag_ids,
|
||||||
|
[Tag.objects.get(name="invoice").pk],
|
||||||
|
)
|
||||||
|
|
||||||
@override_settings(
|
@override_settings(
|
||||||
CONSUMER_ENABLE_TAG_BARCODE=True,
|
CONSUMER_ENABLE_TAG_BARCODE=True,
|
||||||
CONSUMER_TAG_BARCODE_MAPPING={"TAG:(.*)": "\\g<1>"},
|
CONSUMER_TAG_BARCODE_MAPPING={"TAG:(.*)": "\\g<1>"},
|
||||||
|
|||||||
@@ -423,35 +423,3 @@ class TestTrashAndGlobalSearchEffectiveContentIsNeverPerInstance:
|
|||||||
[result] = [r for r in response.data["results"] if r["id"] == root.id]
|
[result] = [r for r in response.data["results"] if r["id"] == root.id]
|
||||||
assert result["content"] == "own-content"
|
assert result["content"] == "own-content"
|
||||||
assert _get_effective_content_fallback_queries(ctx) == []
|
assert _get_effective_content_fallback_queries(ctx) == []
|
||||||
|
|
||||||
def test_global_search_db_only_shows_latest_version_content_with_no_extra_query(
|
|
||||||
self,
|
|
||||||
admin_client: APIClient,
|
|
||||||
) -> None:
|
|
||||||
"""
|
|
||||||
GIVEN:
|
|
||||||
- A root document, findable by title, whose own content differs
|
|
||||||
from its latest version's
|
|
||||||
WHEN:
|
|
||||||
- Using the global search endpoint's db_only mode
|
|
||||||
THEN:
|
|
||||||
- The response shows the latest version's content, resolved by
|
|
||||||
GlobalSearchView's own effective_content annotation
|
|
||||||
- There is no per-instance fallback query
|
|
||||||
"""
|
|
||||||
root = DocumentFactory(title="findme", content="own-content")
|
|
||||||
DocumentFactory(
|
|
||||||
root_document=root,
|
|
||||||
version_index=1,
|
|
||||||
content="version-content",
|
|
||||||
)
|
|
||||||
|
|
||||||
with CaptureQueriesContext(connection) as ctx:
|
|
||||||
response = admin_client.get(
|
|
||||||
"/api/search/?query=findme&db_only=true",
|
|
||||||
)
|
|
||||||
|
|
||||||
assert response.status_code == status.HTTP_200_OK
|
|
||||||
[result] = [d for d in response.data["documents"] if d["id"] == root.id]
|
|
||||||
assert result["content"] == "version-content"
|
|
||||||
assert _get_effective_content_fallback_queries(ctx) == []
|
|
||||||
@@ -3932,7 +3932,12 @@ class GlobalSearchView(PassUserMixin):
|
|||||||
"request": request,
|
"request": request,
|
||||||
}
|
}
|
||||||
|
|
||||||
docs_serializer = DocumentSerializer(docs, many=True, context=context)
|
docs_serializer = DocumentSerializer(
|
||||||
|
docs,
|
||||||
|
many=True,
|
||||||
|
context=context,
|
||||||
|
fields=("id", "title", "created"),
|
||||||
|
)
|
||||||
saved_views_serializer = SavedViewSerializer(
|
saved_views_serializer = SavedViewSerializer(
|
||||||
saved_views,
|
saved_views,
|
||||||
many=True,
|
many=True,
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -2,7 +2,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: paperless-ngx\n"
|
"Project-Id-Version: paperless-ngx\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-10-18 14:28+0000\n"
|
"POT-Creation-Date: 2026-10-19 15:40+0000\n"
|
||||||
"PO-Revision-Date: 2022-02-17 04:17\n"
|
"PO-Revision-Date: 2022-02-17 04:17\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: English\n"
|
"Language-Team: English\n"
|
||||||
@@ -1694,7 +1694,7 @@ msgstr ""
|
|||||||
msgid "Duplicate document identifiers are not allowed."
|
msgid "Duplicate document identifiers are not allowed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:2988 documents/views.py:4811
|
#: documents/serialisers.py:2988 documents/views.py:4816
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Documents not found: %(ids)s"
|
msgid "Documents not found: %(ids)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1965,20 +1965,20 @@ msgstr ""
|
|||||||
msgid "AI backend rejected the request. Check logs for details."
|
msgid "AI backend rejected the request. Check logs for details."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/views.py:4827
|
#: documents/views.py:4832
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Insufficient permissions to share document %(id)s."
|
msgid "Insufficient permissions to share document %(id)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/views.py:4874
|
#: documents/views.py:4879
|
||||||
msgid "Bundle is already being processed."
|
msgid "Bundle is already being processed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/views.py:4940
|
#: documents/views.py:4945
|
||||||
msgid "The share link bundle is still being prepared. Please try again later."
|
msgid "The share link bundle is still being prepared. Please try again later."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/views.py:4954
|
#: documents/views.py:4959
|
||||||
msgid "The share link bundle is unavailable."
|
msgid "The share link bundle is unavailable."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
Loaded 100 of 118 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user