Compare commits

..

7 Commits

Author SHA1 Message Date
dependabot[bot]
04eb78c8e6 Chore(deps-dev): Bump webpack from 5.102.0 to 5.102.1 in /src-ui
Bumps [webpack](https://github.com/webpack/webpack) from 5.102.0 to 5.102.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.102.0...v5.102.1)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.102.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-06 19:41:07 +00:00
shamoon
cac48c9855 Bump version to 2.19.5 2025-11-06 11:39:08 -08:00
github-actions[bot]
3fda648f37 New Crowdin translations by GitHub Action (#11288) 2025-11-06 19:36:26 +00:00
dependabot[bot]
95736eebc4 docker(deps): Bump astral-sh/uv (#11283)
Bumps [astral-sh/uv](https://github.com/astral-sh/uv) from 0.9.4-python3.12-bookworm-slim to 0.9.7-python3.12-bookworm-slim.
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/uv/compare/0.9.4...0.9.7)

---
updated-dependencies:
- dependency-name: astral-sh/uv
  dependency-version: 0.9.7-python3.12-bookworm-slim
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-04 20:12:56 -08:00
shamoon
85027dbffd Fix: ensure custom field query propagation, change detection (#11291) 2025-11-04 12:40:05 -08:00
github-actions[bot]
74f72e417d Documentation: Add v2.19.4 changelog (#11285)
* Changelog v2.19.4 - GHA

* Update changelog for paperless-ngx 2.19.4

Reorganize changelog to include performance enhancements.

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2025-11-03 17:39:28 -08:00
shamoon
fe3c424d7d Bump version to 2.19.4 2025-11-03 16:02:09 -08:00
20 changed files with 241 additions and 95 deletions

View File

@@ -32,7 +32,7 @@ RUN set -eux \
# Purpose: Installs s6-overlay and rootfs # Purpose: Installs s6-overlay and rootfs
# Comments: # Comments:
# - Don't leave anything extra in here either # - Don't leave anything extra in here either
FROM ghcr.io/astral-sh/uv:0.9.4-python3.12-bookworm-slim AS s6-overlay-base FROM ghcr.io/astral-sh/uv:0.9.7-python3.12-bookworm-slim AS s6-overlay-base
WORKDIR /usr/src/s6 WORKDIR /usr/src/s6

View File

@@ -1,5 +1,41 @@
# Changelog # Changelog
## paperless-ngx 2.19.4
### Bug Fixes
- Fix: use original_file when attaching docs to workflow emails with added trigger [@shamoon](https://github.com/shamoon) ([#11266](https://github.com/paperless-ngx/paperless-ngx/pull/11266))
- Fix: mark 'Select' button in doc list for translation [@shamoon](https://github.com/shamoon) ([#11278](https://github.com/paperless-ngx/paperless-ngx/pull/11278))
- Fix: respect fields parameter for created field [@shamoon](https://github.com/shamoon) ([#11251](https://github.com/paperless-ngx/paperless-ngx/pull/11251))
- Fix: improve legibility of processed mail error popover in light mode [@shamoon](https://github.com/shamoon) ([#11258](https://github.com/paperless-ngx/paperless-ngx/pull/11258))
- Fixhancement: truncate large logs, improve auto-scroll [@shamoon](https://github.com/shamoon) ([#11239](https://github.com/paperless-ngx/paperless-ngx/pull/11239))
- Chore: add max-height and overflow to processedmail error popover [@shamoon](https://github.com/shamoon) ([#11252](https://github.com/paperless-ngx/paperless-ngx/pull/11252))
- Fix: delay iframe DOM removal, handle onafterprint error for print in FF [@shamoon](https://github.com/shamoon) ([#11237](https://github.com/paperless-ngx/paperless-ngx/pull/11237))
- Fix: de-deduplicate children in tag list when filtering [@shamoon](https://github.com/shamoon) ([#11229](https://github.com/paperless-ngx/paperless-ngx/pull/11229))
### Performance
- Performance: re-enable virtual scroll, bump ng-select [@shamoon](https://github.com/shamoon) ([#11279](https://github.com/paperless-ngx/paperless-ngx/pull/11279))
- Performance: use virtual scroll container and log level parsing for logs view [@MickLesk](https://github.com/MickLesk) ([#11233](https://github.com/paperless-ngx/paperless-ngx/pull/11233))
### All App Changes
<details>
<summary>11 changes</summary>
- Performance: re-enable virtual scroll, bump ng-select [@shamoon](https://github.com/shamoon) ([#11279](https://github.com/paperless-ngx/paperless-ngx/pull/11279))
- Fix: use original_file when attaching docs to workflow emails with added trigger [@shamoon](https://github.com/shamoon) ([#11266](https://github.com/paperless-ngx/paperless-ngx/pull/11266))
- Fix: mark 'Select' button in doc list for translation [@shamoon](https://github.com/shamoon) ([#11278](https://github.com/paperless-ngx/paperless-ngx/pull/11278))
- Fix: respect fields parameter for created field [@shamoon](https://github.com/shamoon) ([#11251](https://github.com/paperless-ngx/paperless-ngx/pull/11251))
- Fix: improve legibility of processed mail error popover in light mode [@shamoon](https://github.com/shamoon) ([#11258](https://github.com/paperless-ngx/paperless-ngx/pull/11258))
- Fixhancement: truncate large logs, improve auto-scroll [@shamoon](https://github.com/shamoon) ([#11239](https://github.com/paperless-ngx/paperless-ngx/pull/11239))
- Chore: add max-height and overflow to processedmail error popover [@shamoon](https://github.com/shamoon) ([#11252](https://github.com/paperless-ngx/paperless-ngx/pull/11252))
- Fix: delay iframe DOM removal, handle onafterprint error for print in FF [@shamoon](https://github.com/shamoon) ([#11237](https://github.com/paperless-ngx/paperless-ngx/pull/11237))
- Performance: use virtual scroll container and log level parsing for logs view [@MickLesk](https://github.com/MickLesk) ([#11233](https://github.com/paperless-ngx/paperless-ngx/pull/11233))
- Chore: cache Github version check for 15 minutes [@shamoon](https://github.com/shamoon) ([#11235](https://github.com/paperless-ngx/paperless-ngx/pull/11235))
- Fix: de-deduplicate children in tag list when filtering [@shamoon](https://github.com/shamoon) ([#11229](https://github.com/paperless-ngx/paperless-ngx/pull/11229))
</details>
## paperless-ngx 2.19.3 ## paperless-ngx 2.19.3
### Bug Fixes ### Bug Fixes

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "paperless-ngx" name = "paperless-ngx"
version = "2.19.3" version = "2.19.5"
description = "A community-supported supercharged document management system: scan, index and archive all your physical documents" description = "A community-supported supercharged document management system: scan, index and archive all your physical documents"
readme = "README.md" readme = "README.md"
requires-python = ">=3.10" requires-python = ">=3.10"

View File

@@ -1,6 +1,6 @@
{ {
"name": "paperless-ngx-ui", "name": "paperless-ngx-ui",
"version": "2.19.3", "version": "2.19.5",
"scripts": { "scripts": {
"preinstall": "npx only-allow pnpm", "preinstall": "npx only-allow pnpm",
"ng": "ng", "ng": "ng",
@@ -68,7 +68,7 @@
"prettier-plugin-organize-imports": "^4.3.0", "prettier-plugin-organize-imports": "^4.3.0",
"ts-node": "~10.9.1", "ts-node": "~10.9.1",
"typescript": "^5.8.3", "typescript": "^5.8.3",
"webpack": "^5.102.0" "webpack": "^5.102.1"
}, },
"packageManager": "pnpm@10.17.1", "packageManager": "pnpm@10.17.1",
"pnpm": { "pnpm": {

160
src-ui/pnpm-lock.yaml generated
View File

@@ -128,7 +128,7 @@ importers:
version: 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) version: 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3)
'@codecov/webpack-plugin': '@codecov/webpack-plugin':
specifier: ^1.9.1 specifier: ^1.9.1
version: 1.9.1(webpack@5.102.0) version: 1.9.1(webpack@5.102.1)
'@playwright/test': '@playwright/test':
specifier: ^1.55.1 specifier: ^1.55.1
version: 1.55.1 version: 1.55.1
@@ -175,8 +175,8 @@ importers:
specifier: ^5.8.3 specifier: ^5.8.3
version: 5.8.3 version: 5.8.3
webpack: webpack:
specifier: ^5.102.0 specifier: ^5.102.1
version: 5.102.0 version: 5.102.1
packages: packages:
@@ -3504,6 +3504,10 @@ packages:
resolution: {integrity: sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==} resolution: {integrity: sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==}
hasBin: true hasBin: true
baseline-browser-mapping@2.8.25:
resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==}
hasBin: true
batch@0.6.1: batch@0.6.1:
resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==}
@@ -3562,6 +3566,11 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true hasBin: true
browserslist@4.27.0:
resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
bs-logger@0.2.6: bs-logger@0.2.6:
resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@@ -3610,6 +3619,9 @@ packages:
caniuse-lite@1.0.30001746: caniuse-lite@1.0.30001746:
resolution: {integrity: sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==} resolution: {integrity: sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==}
caniuse-lite@1.0.30001754:
resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==}
canvas@3.0.0: canvas@3.0.0:
resolution: {integrity: sha512-NtcIBY88FjymQy+g2g5qnuP5IslrbWCQ3A6rSr1PeuYxVRapRZ3BZCrDyAakvI6CuDYidgZaf55ygulFVwROdg==} resolution: {integrity: sha512-NtcIBY88FjymQy+g2g5qnuP5IslrbWCQ3A6rSr1PeuYxVRapRZ3BZCrDyAakvI6CuDYidgZaf55ygulFVwROdg==}
engines: {node: ^18.12.0 || >= 20.9.0} engines: {node: ^18.12.0 || >= 20.9.0}
@@ -3988,6 +4000,9 @@ packages:
electron-to-chromium@1.5.228: electron-to-chromium@1.5.228:
resolution: {integrity: sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==} resolution: {integrity: sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==}
electron-to-chromium@1.5.246:
resolution: {integrity: sha512-CKp2enkTcw94o8p7P+nb3in3yILO7jAIoERSmkIhGazMuK2eLnPSVUH/dxUveGN8ulJJDjYUv0vV7y2e2AZ0nA==}
emittery@0.13.1: emittery@0.13.1:
resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -5103,8 +5118,8 @@ packages:
resolution: {integrity: sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==} resolution: {integrity: sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==}
hasBin: true hasBin: true
loader-runner@4.3.0: loader-runner@4.3.1:
resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==}
engines: {node: '>=6.11.5'} engines: {node: '>=6.11.5'}
loader-utils@2.0.4: loader-utils@2.0.4:
@@ -5466,6 +5481,9 @@ packages:
node-releases@2.0.21: node-releases@2.0.21:
resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==}
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
nopt@8.1.0: nopt@8.1.0:
resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
engines: {node: ^18.17.0 || >=20.5.0} engines: {node: ^18.17.0 || >=20.5.0}
@@ -6048,8 +6066,8 @@ packages:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'} engines: {node: '>=v12.22.7'}
schema-utils@4.3.2: schema-utils@4.3.3:
resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
engines: {node: '>= 10.13.0'} engines: {node: '>= 10.13.0'}
select-hose@2.0.0: select-hose@2.0.0:
@@ -6323,8 +6341,8 @@ packages:
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
tapable@2.2.3: tapable@2.3.0:
resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'} engines: {node: '>=6'}
tar-fs@2.1.1: tar-fs@2.1.1:
@@ -6363,8 +6381,8 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
terser@5.44.0: terser@5.44.1:
resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==}
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
@@ -6594,6 +6612,12 @@ packages:
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
update-browserslist-db@1.1.4:
resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
uri-js@4.4.1: uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -6788,8 +6812,8 @@ packages:
webpack-virtual-modules@0.6.2: webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
webpack@5.102.0: webpack@5.102.1:
resolution: {integrity: sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==} resolution: {integrity: sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -7196,7 +7220,7 @@ snapshots:
dependencies: dependencies:
'@ampproject/remapping': 2.3.0 '@ampproject/remapping': 2.3.0
'@angular-devkit/architect': 0.2000.4(chokidar@4.0.3) '@angular-devkit/architect': 0.2000.4(chokidar@4.0.3)
'@angular-devkit/build-webpack': 0.2000.4(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.102.0))(webpack@5.99.8(esbuild@0.25.5)) '@angular-devkit/build-webpack': 0.2000.4(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.102.1))(webpack@5.99.8(esbuild@0.25.5))
'@angular-devkit/core': 20.0.4(chokidar@4.0.3) '@angular-devkit/core': 20.0.4(chokidar@4.0.3)
'@angular/build': 20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(yaml@2.7.0) '@angular/build': 20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(yaml@2.7.0)
'@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3)
@@ -7215,7 +7239,7 @@ snapshots:
ansi-colors: 4.1.3 ansi-colors: 4.1.3
autoprefixer: 10.4.21(postcss@8.5.3) autoprefixer: 10.4.21(postcss@8.5.3)
babel-loader: 10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.5)) babel-loader: 10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.5))
browserslist: 4.26.3 browserslist: 4.27.0
copy-webpack-plugin: 13.0.0(webpack@5.99.8(esbuild@0.25.5)) copy-webpack-plugin: 13.0.0(webpack@5.99.8(esbuild@0.25.5))
css-loader: 7.1.2(webpack@5.99.8(esbuild@0.25.5)) css-loader: 7.1.2(webpack@5.99.8(esbuild@0.25.5))
esbuild-wasm: 0.25.5 esbuild-wasm: 0.25.5
@@ -7282,12 +7306,12 @@ snapshots:
- webpack-cli - webpack-cli
- yaml - yaml
'@angular-devkit/build-webpack@0.2000.4(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.102.0))(webpack@5.99.8(esbuild@0.25.5))': '@angular-devkit/build-webpack@0.2000.4(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.102.1))(webpack@5.99.8(esbuild@0.25.5))':
dependencies: dependencies:
'@angular-devkit/architect': 0.2000.4(chokidar@4.0.3) '@angular-devkit/architect': 0.2000.4(chokidar@4.0.3)
rxjs: 7.8.2 rxjs: 7.8.2
webpack: 5.99.8(esbuild@0.25.5) webpack: 5.99.8(esbuild@0.25.5)
webpack-dev-server: 5.2.1(webpack@5.102.0) webpack-dev-server: 5.2.1(webpack@5.102.1)
transitivePeerDependencies: transitivePeerDependencies:
- chokidar - chokidar
@@ -7398,7 +7422,7 @@ snapshots:
'@inquirer/confirm': 5.1.10(@types/node@24.6.1) '@inquirer/confirm': 5.1.10(@types/node@24.6.1)
'@vitejs/plugin-basic-ssl': 2.0.0(vite@6.3.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.0)) '@vitejs/plugin-basic-ssl': 2.0.0(vite@6.3.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.0))
beasties: 0.3.4 beasties: 0.3.4
browserslist: 4.26.3 browserslist: 4.27.0
esbuild: 0.25.5 esbuild: 0.25.5
https-proxy-agent: 7.0.6 https-proxy-agent: 7.0.6
istanbul-lib-instrument: 6.0.3 istanbul-lib-instrument: 6.0.3
@@ -7704,7 +7728,7 @@ snapshots:
dependencies: dependencies:
'@babel/compat-data': 7.28.4 '@babel/compat-data': 7.28.4
'@babel/helper-validator-option': 7.27.1 '@babel/helper-validator-option': 7.27.1
browserslist: 4.26.3 browserslist: 4.27.0
lru-cache: 5.1.1 lru-cache: 5.1.1
semver: 6.3.1 semver: 6.3.1
@@ -8435,11 +8459,11 @@ snapshots:
unplugin: 1.16.1 unplugin: 1.16.1
zod: 3.25.76 zod: 3.25.76
'@codecov/webpack-plugin@1.9.1(webpack@5.102.0)': '@codecov/webpack-plugin@1.9.1(webpack@5.102.1)':
dependencies: dependencies:
'@codecov/bundler-plugin-core': 1.9.1 '@codecov/bundler-plugin-core': 1.9.1
unplugin: 1.16.1 unplugin: 1.16.1
webpack: 5.102.0 webpack: 5.102.1
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
dependencies: dependencies:
@@ -10431,8 +10455,8 @@ snapshots:
autoprefixer@10.4.21(postcss@8.5.3): autoprefixer@10.4.21(postcss@8.5.3):
dependencies: dependencies:
browserslist: 4.26.3 browserslist: 4.27.0
caniuse-lite: 1.0.30001746 caniuse-lite: 1.0.30001754
fraction.js: 4.3.7 fraction.js: 4.3.7
normalize-range: 0.1.2 normalize-range: 0.1.2
picocolors: 1.1.1 picocolors: 1.1.1
@@ -10530,6 +10554,8 @@ snapshots:
baseline-browser-mapping@2.8.10: {} baseline-browser-mapping@2.8.10: {}
baseline-browser-mapping@2.8.25: {}
batch@0.6.1: {} batch@0.6.1: {}
beasties@0.3.4: beasties@0.3.4:
@@ -10630,6 +10656,14 @@ snapshots:
node-releases: 2.0.21 node-releases: 2.0.21
update-browserslist-db: 1.1.3(browserslist@4.26.3) update-browserslist-db: 1.1.3(browserslist@4.26.3)
browserslist@4.27.0:
dependencies:
baseline-browser-mapping: 2.8.25
caniuse-lite: 1.0.30001754
electron-to-chromium: 1.5.246
node-releases: 2.0.27
update-browserslist-db: 1.1.4(browserslist@4.27.0)
bs-logger@0.2.6: bs-logger@0.2.6:
dependencies: dependencies:
fast-json-stable-stringify: 2.1.0 fast-json-stable-stringify: 2.1.0
@@ -10685,6 +10719,8 @@ snapshots:
caniuse-lite@1.0.30001746: {} caniuse-lite@1.0.30001746: {}
caniuse-lite@1.0.30001754: {}
canvas@3.0.0: canvas@3.0.0:
dependencies: dependencies:
node-addon-api: 7.1.1 node-addon-api: 7.1.1
@@ -10833,14 +10869,14 @@ snapshots:
dependencies: dependencies:
glob-parent: 6.0.2 glob-parent: 6.0.2
normalize-path: 3.0.0 normalize-path: 3.0.0
schema-utils: 4.3.2 schema-utils: 4.3.3
serialize-javascript: 6.0.2 serialize-javascript: 6.0.2
tinyglobby: 0.2.15 tinyglobby: 0.2.15
webpack: 5.99.8(esbuild@0.25.5) webpack: 5.99.8(esbuild@0.25.5)
core-js-compat@3.43.0: core-js-compat@3.43.0:
dependencies: dependencies:
browserslist: 4.26.3 browserslist: 4.27.0
core-util-is@1.0.3: {} core-util-is@1.0.3: {}
@@ -11025,6 +11061,8 @@ snapshots:
electron-to-chromium@1.5.228: {} electron-to-chromium@1.5.228: {}
electron-to-chromium@1.5.246: {}
emittery@0.13.1: {} emittery@0.13.1: {}
emoji-regex@10.5.0: {} emoji-regex@10.5.0: {}
@@ -11052,7 +11090,7 @@ snapshots:
enhanced-resolve@5.18.3: enhanced-resolve@5.18.3:
dependencies: dependencies:
graceful-fs: 4.2.11 graceful-fs: 4.2.11
tapable: 2.2.3 tapable: 2.3.0
entities@4.5.0: {} entities@4.5.0: {}
@@ -12588,7 +12626,7 @@ snapshots:
'@lmdb/lmdb-win32-x64': 3.4.2 '@lmdb/lmdb-win32-x64': 3.4.2
optional: true optional: true
loader-runner@4.3.0: {} loader-runner@4.3.1: {}
loader-utils@2.0.4: loader-utils@2.0.4:
dependencies: dependencies:
@@ -12731,8 +12769,8 @@ snapshots:
mini-css-extract-plugin@2.9.2(webpack@5.99.8(esbuild@0.25.5)): mini-css-extract-plugin@2.9.2(webpack@5.99.8(esbuild@0.25.5)):
dependencies: dependencies:
schema-utils: 4.3.2 schema-utils: 4.3.3
tapable: 2.2.3 tapable: 2.3.0
webpack: 5.99.8(esbuild@0.25.5) webpack: 5.99.8(esbuild@0.25.5)
minimalistic-assert@1.0.1: {} minimalistic-assert@1.0.1: {}
@@ -12939,6 +12977,8 @@ snapshots:
node-releases@2.0.21: {} node-releases@2.0.21: {}
node-releases@2.0.27: {}
nopt@8.1.0: nopt@8.1.0:
dependencies: dependencies:
abbrev: 3.0.1 abbrev: 3.0.1
@@ -13604,7 +13644,7 @@ snapshots:
dependencies: dependencies:
xmlchars: 2.2.0 xmlchars: 2.2.0
schema-utils@4.3.2: schema-utils@4.3.3:
dependencies: dependencies:
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
ajv: 8.17.1 ajv: 8.17.1
@@ -13945,7 +13985,7 @@ snapshots:
dependencies: dependencies:
'@pkgr/core': 0.2.9 '@pkgr/core': 0.2.9
tapable@2.2.3: {} tapable@2.3.0: {}
tar-fs@2.1.1: tar-fs@2.1.1:
dependencies: dependencies:
@@ -13985,21 +14025,21 @@ snapshots:
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.31 '@jridgewell/trace-mapping': 0.3.31
jest-worker: 27.5.1 jest-worker: 27.5.1
schema-utils: 4.3.2 schema-utils: 4.3.3
serialize-javascript: 6.0.2 serialize-javascript: 6.0.2
terser: 5.44.0 terser: 5.44.1
webpack: 5.99.8(esbuild@0.25.5) webpack: 5.99.8(esbuild@0.25.5)
optionalDependencies: optionalDependencies:
esbuild: 0.25.5 esbuild: 0.25.5
terser-webpack-plugin@5.3.14(webpack@5.102.0): terser-webpack-plugin@5.3.14(webpack@5.102.1):
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.31 '@jridgewell/trace-mapping': 0.3.31
jest-worker: 27.5.1 jest-worker: 27.5.1
schema-utils: 4.3.2 schema-utils: 4.3.3
serialize-javascript: 6.0.2 serialize-javascript: 6.0.2
terser: 5.44.0 terser: 5.44.1
webpack: 5.102.0 webpack: 5.102.1
terser@5.39.1: terser@5.39.1:
dependencies: dependencies:
@@ -14008,7 +14048,7 @@ snapshots:
commander: 2.20.3 commander: 2.20.3
source-map-support: 0.5.21 source-map-support: 0.5.21
terser@5.44.0: terser@5.44.1:
dependencies: dependencies:
'@jridgewell/source-map': 0.3.11 '@jridgewell/source-map': 0.3.11
acorn: 8.15.0 acorn: 8.15.0
@@ -14262,6 +14302,12 @@ snapshots:
escalade: 3.2.0 escalade: 3.2.0
picocolors: 1.1.1 picocolors: 1.1.1
update-browserslist-db@1.1.4(browserslist@4.27.0):
dependencies:
browserslist: 4.27.0
escalade: 3.2.0
picocolors: 1.1.1
uri-js@4.4.1: uri-js@4.4.1:
dependencies: dependencies:
punycode: 2.3.1 punycode: 2.3.1
@@ -14365,16 +14411,16 @@ snapshots:
webidl-conversions@7.0.0: {} webidl-conversions@7.0.0: {}
webpack-dev-middleware@7.4.2(webpack@5.102.0): webpack-dev-middleware@7.4.2(webpack@5.102.1):
dependencies: dependencies:
colorette: 2.0.20 colorette: 2.0.20
memfs: 4.17.2 memfs: 4.17.2
mime-types: 2.1.35 mime-types: 2.1.35
on-finished: 2.4.1 on-finished: 2.4.1
range-parser: 1.2.1 range-parser: 1.2.1
schema-utils: 4.3.2 schema-utils: 4.3.3
optionalDependencies: optionalDependencies:
webpack: 5.102.0 webpack: 5.102.1
webpack-dev-middleware@7.4.2(webpack@5.99.8(esbuild@0.25.5)): webpack-dev-middleware@7.4.2(webpack@5.99.8(esbuild@0.25.5)):
dependencies: dependencies:
@@ -14383,11 +14429,11 @@ snapshots:
mime-types: 2.1.35 mime-types: 2.1.35
on-finished: 2.4.1 on-finished: 2.4.1
range-parser: 1.2.1 range-parser: 1.2.1
schema-utils: 4.3.2 schema-utils: 4.3.3
optionalDependencies: optionalDependencies:
webpack: 5.99.8(esbuild@0.25.5) webpack: 5.99.8(esbuild@0.25.5)
webpack-dev-server@5.2.1(webpack@5.102.0): webpack-dev-server@5.2.1(webpack@5.102.1):
dependencies: dependencies:
'@types/bonjour': 3.5.13 '@types/bonjour': 3.5.13
'@types/connect-history-api-fallback': 1.5.4 '@types/connect-history-api-fallback': 1.5.4
@@ -14410,15 +14456,15 @@ snapshots:
launch-editor: 2.10.0 launch-editor: 2.10.0
open: 10.1.2 open: 10.1.2
p-retry: 6.2.1 p-retry: 6.2.1
schema-utils: 4.3.2 schema-utils: 4.3.3
selfsigned: 2.4.1 selfsigned: 2.4.1
serve-index: 1.9.1 serve-index: 1.9.1
sockjs: 0.3.24 sockjs: 0.3.24
spdy: 4.0.2 spdy: 4.0.2
webpack-dev-middleware: 7.4.2(webpack@5.102.0) webpack-dev-middleware: 7.4.2(webpack@5.102.1)
ws: 8.18.3 ws: 8.18.3
optionalDependencies: optionalDependencies:
webpack: 5.102.0 webpack: 5.102.1
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
- debug - debug
@@ -14448,7 +14494,7 @@ snapshots:
launch-editor: 2.10.0 launch-editor: 2.10.0
open: 10.1.2 open: 10.1.2
p-retry: 6.2.1 p-retry: 6.2.1
schema-utils: 4.3.2 schema-utils: 4.3.3
selfsigned: 2.4.1 selfsigned: 2.4.1
serve-index: 1.9.1 serve-index: 1.9.1
sockjs: 0.3.24 sockjs: 0.3.24
@@ -14478,7 +14524,7 @@ snapshots:
webpack-virtual-modules@0.6.2: {} webpack-virtual-modules@0.6.2: {}
webpack@5.102.0: webpack@5.102.1:
dependencies: dependencies:
'@types/eslint-scope': 3.7.7 '@types/eslint-scope': 3.7.7
'@types/estree': 1.0.8 '@types/estree': 1.0.8
@@ -14488,7 +14534,7 @@ snapshots:
'@webassemblyjs/wasm-parser': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1
acorn: 8.15.0 acorn: 8.15.0
acorn-import-phases: 1.0.4(acorn@8.15.0) acorn-import-phases: 1.0.4(acorn@8.15.0)
browserslist: 4.26.3 browserslist: 4.27.0
chrome-trace-event: 1.0.4 chrome-trace-event: 1.0.4
enhanced-resolve: 5.18.3 enhanced-resolve: 5.18.3
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
@@ -14497,12 +14543,12 @@ snapshots:
glob-to-regexp: 0.4.1 glob-to-regexp: 0.4.1
graceful-fs: 4.2.11 graceful-fs: 4.2.11
json-parse-even-better-errors: 2.3.1 json-parse-even-better-errors: 2.3.1
loader-runner: 4.3.0 loader-runner: 4.3.1
mime-types: 2.1.35 mime-types: 2.1.35
neo-async: 2.6.2 neo-async: 2.6.2
schema-utils: 4.3.2 schema-utils: 4.3.3
tapable: 2.2.3 tapable: 2.3.0
terser-webpack-plugin: 5.3.14(webpack@5.102.0) terser-webpack-plugin: 5.3.14(webpack@5.102.1)
watchpack: 2.4.4 watchpack: 2.4.4
webpack-sources: 3.3.3 webpack-sources: 3.3.3
transitivePeerDependencies: transitivePeerDependencies:
@@ -14519,7 +14565,7 @@ snapshots:
'@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1
'@webassemblyjs/wasm-parser': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1
acorn: 8.15.0 acorn: 8.15.0
browserslist: 4.26.3 browserslist: 4.27.0
chrome-trace-event: 1.0.4 chrome-trace-event: 1.0.4
enhanced-resolve: 5.18.3 enhanced-resolve: 5.18.3
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
@@ -14528,11 +14574,11 @@ snapshots:
glob-to-regexp: 0.4.1 glob-to-regexp: 0.4.1
graceful-fs: 4.2.11 graceful-fs: 4.2.11
json-parse-even-better-errors: 2.3.1 json-parse-even-better-errors: 2.3.1
loader-runner: 4.3.0 loader-runner: 4.3.1
mime-types: 2.1.35 mime-types: 2.1.35
neo-async: 2.6.2 neo-async: 2.6.2
schema-utils: 4.3.2 schema-utils: 4.3.3
tapable: 2.2.3 tapable: 2.3.0
terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.99.8(esbuild@0.25.5)) terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.99.8(esbuild@0.25.5))
watchpack: 2.4.4 watchpack: 2.4.4
webpack-sources: 3.3.3 webpack-sources: 3.3.3

View File

@@ -354,5 +354,13 @@ describe('CustomFieldsQueryDropdownComponent', () => {
model.removeElement(atom) model.removeElement(atom)
expect(completeSpy).toHaveBeenCalled() expect(completeSpy).toHaveBeenCalled()
}) })
it('should subscribe to existing elements when queries are assigned', () => {
const expression = new CustomFieldQueryExpression()
const nextSpy = jest.spyOn(model.changed, 'next')
model.queries = [expression]
expression.changed.next(expression)
expect(nextSpy).toHaveBeenCalledWith(model)
})
}) })
}) })

View File

@@ -17,7 +17,7 @@ import {
} from '@ng-bootstrap/ng-bootstrap' } from '@ng-bootstrap/ng-bootstrap'
import { NgSelectComponent, NgSelectModule } from '@ng-select/ng-select' import { NgSelectComponent, NgSelectModule } from '@ng-select/ng-select'
import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
import { first, Subject, takeUntil } from 'rxjs' import { first, Subject, Subscription, takeUntil } from 'rxjs'
import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field' import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field'
import { import {
CUSTOM_FIELD_QUERY_MAX_ATOMS, CUSTOM_FIELD_QUERY_MAX_ATOMS,
@@ -41,10 +41,27 @@ import { ClearableBadgeComponent } from '../clearable-badge/clearable-badge.comp
import { DocumentLinkComponent } from '../input/document-link/document-link.component' import { DocumentLinkComponent } from '../input/document-link/document-link.component'
export class CustomFieldQueriesModel { export class CustomFieldQueriesModel {
public queries: CustomFieldQueryElement[] = [] private _queries: CustomFieldQueryElement[] = []
private rootSubscriptions: Subscription[] = []
public readonly changed = new Subject<CustomFieldQueriesModel>() public readonly changed = new Subject<CustomFieldQueriesModel>()
public get queries(): CustomFieldQueryElement[] {
return this._queries
}
public set queries(value: CustomFieldQueryElement[]) {
this.teardownRootSubscriptions()
this._queries = value ?? []
for (const element of this._queries) {
this.rootSubscriptions.push(
element.changed.subscribe(() => {
this.changed.next(this)
})
)
}
}
public clear(fireEvent = true) { public clear(fireEvent = true) {
this.queries = [] this.queries = []
if (fireEvent) { if (fireEvent) {
@@ -107,14 +124,14 @@ export class CustomFieldQueriesModel {
public addExpression( public addExpression(
expression: CustomFieldQueryExpression = new CustomFieldQueryExpression() expression: CustomFieldQueryExpression = new CustomFieldQueryExpression()
) { ) {
if (this.queries.length > 0) { if (this.queries.length === 0) {
;( this.queries = [expression]
(this.queries[0] as CustomFieldQueryExpression) return
.value as CustomFieldQueryElement[]
).push(expression)
} else {
this.queries.push(expression)
} }
;(
(this.queries[0] as CustomFieldQueryExpression)
.value as CustomFieldQueryElement[]
).push(expression)
expression.changed.subscribe(() => { expression.changed.subscribe(() => {
this.changed.next(this) this.changed.next(this)
}) })
@@ -166,6 +183,13 @@ export class CustomFieldQueriesModel {
this.changed.next(this) this.changed.next(this)
} }
} }
private teardownRootSubscriptions() {
for (const subscription of this.rootSubscriptions) {
subscription.unsubscribe()
}
this.rootSubscriptions = []
}
} }
@Component({ @Component({

View File

@@ -1,4 +1,3 @@
import { fakeAsync, tick } from '@angular/core/testing'
import { import {
CustomFieldQueryElementType, CustomFieldQueryElementType,
CustomFieldQueryLogicalOperator, CustomFieldQueryLogicalOperator,
@@ -111,13 +110,38 @@ describe('CustomFieldQueryAtom', () => {
expect(atom.serialize()).toEqual([1, 'operator', 'value']) expect(atom.serialize()).toEqual([1, 'operator', 'value'])
}) })
it('should emit changed on value change after debounce', fakeAsync(() => { it('should emit changed on value change immediately', () => {
const atom = new CustomFieldQueryAtom() const atom = new CustomFieldQueryAtom()
const changeSpy = jest.spyOn(atom.changed, 'next') const changeSpy = jest.spyOn(atom.changed, 'next')
atom.value = 'new value' atom.value = 'new value'
tick(1000)
expect(changeSpy).toHaveBeenCalled() expect(changeSpy).toHaveBeenCalled()
})) })
it('should ignore duplicate array emissions', () => {
const atom = new CustomFieldQueryAtom()
atom.operator = CustomFieldQueryOperator.In
const changeSpy = jest.fn()
atom.changed.subscribe(changeSpy)
atom.value = [1, 2]
expect(changeSpy).toHaveBeenCalledTimes(1)
changeSpy.mockClear()
atom.value = [1, 2]
expect(changeSpy).not.toHaveBeenCalled()
})
it('should emit when array values differ while length matches', () => {
const atom = new CustomFieldQueryAtom()
atom.operator = CustomFieldQueryOperator.In
const changeSpy = jest.fn()
atom.changed.subscribe(changeSpy)
atom.value = [1, 2]
changeSpy.mockClear()
atom.value = [1, 3]
expect(changeSpy).toHaveBeenCalledTimes(1)
})
}) })
describe('CustomFieldQueryExpression', () => { describe('CustomFieldQueryExpression', () => {

View File

@@ -1,4 +1,4 @@
import { Subject, debounceTime, distinctUntilChanged } from 'rxjs' import { Subject, distinctUntilChanged } from 'rxjs'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
import { import {
CUSTOM_FIELD_QUERY_VALUE_TYPES_BY_OPERATOR, CUSTOM_FIELD_QUERY_VALUE_TYPES_BY_OPERATOR,
@@ -110,7 +110,22 @@ export class CustomFieldQueryAtom extends CustomFieldQueryElement {
protected override connectValueModelChanged(): void { protected override connectValueModelChanged(): void {
this.valueModelChanged this.valueModelChanged
.pipe(debounceTime(1000), distinctUntilChanged()) .pipe(
distinctUntilChanged((previous, current) => {
if (Array.isArray(previous) && Array.isArray(current)) {
if (previous.length !== current.length) {
return false
}
for (let i = 0; i < previous.length; i++) {
if (previous[i] !== current[i]) {
return false
}
}
return true
}
return previous === current
})
)
.subscribe(() => { .subscribe(() => {
this.changed.next(this) this.changed.next(this)
}) })

View File

@@ -6,7 +6,7 @@ export const environment = {
apiVersion: '9', // match src/paperless/settings.py apiVersion: '9', // match src/paperless/settings.py
appTitle: 'Paperless-ngx', appTitle: 'Paperless-ngx',
tag: 'prod', tag: 'prod',
version: '2.19.3', version: '2.19.5',
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/',

View File

@@ -764,7 +764,7 @@
<context context-type="sourcefile">src/app/components/admin/logs/logs.component.html</context> <context context-type="sourcefile">src/app/components/admin/logs/logs.component.html</context>
<context context-type="linenumber">17</context> <context context-type="linenumber">17</context>
</context-group> </context-group>
<target state="needs-translation">lines</target> <target state="translated">línies</target>
</trans-unit> </trans-unit>
<trans-unit id="8838884664569764142" datatype="html"> <trans-unit id="8838884664569764142" datatype="html">
<source>Auto refresh</source> <source>Auto refresh</source>
@@ -8700,7 +8700,7 @@
<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>
<context context-type="linenumber">18</context> <context context-type="linenumber">18</context>
</context-group> </context-group>
<target state="needs-translation">Select:</target> <target state="translated">Selecciona:</target>
</trans-unit> </trans-unit>
<trans-unit id="6252070156626006029" datatype="html"> <trans-unit id="6252070156626006029" datatype="html">
<source>None</source> <source>None</source>

View File

@@ -764,7 +764,7 @@
<context context-type="sourcefile">src/app/components/admin/logs/logs.component.html</context> <context context-type="sourcefile">src/app/components/admin/logs/logs.component.html</context>
<context context-type="linenumber">17</context> <context context-type="linenumber">17</context>
</context-group> </context-group>
<target state="needs-translation">lines</target> <target state="translated">lignes</target>
</trans-unit> </trans-unit>
<trans-unit id="8838884664569764142" datatype="html" approved="yes"> <trans-unit id="8838884664569764142" datatype="html" approved="yes">
<source>Auto refresh</source> <source>Auto refresh</source>
@@ -8699,7 +8699,7 @@
<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>
<context context-type="linenumber">18</context> <context context-type="linenumber">18</context>
</context-group> </context-group>
<target state="needs-translation">Select:</target> <target state="translated">Sélectionner :</target>
</trans-unit> </trans-unit>
<trans-unit id="6252070156626006029" datatype="html" approved="yes"> <trans-unit id="6252070156626006029" datatype="html" approved="yes">
<source>None</source> <source>None</source>

View File

@@ -8700,7 +8700,7 @@
<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>
<context context-type="linenumber">18</context> <context context-type="linenumber">18</context>
</context-group> </context-group>
<target state="needs-translation">Select:</target> <target state="translated">選取:</target>
</trans-unit> </trans-unit>
<trans-unit id="6252070156626006029" datatype="html"> <trans-unit id="6252070156626006029" datatype="html">
<source>None</source> <source>None</source>

View File

@@ -3,7 +3,7 @@ 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: 2025-10-28 18:06+0000\n" "POT-Creation-Date: 2025-10-28 18:06+0000\n"
"PO-Revision-Date: 2025-10-28 18:07\n" "PO-Revision-Date: 2025-11-04 12:15\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Catalan\n" "Language-Team: Catalan\n"
"Language: ca_ES\n" "Language: ca_ES\n"

View File

@@ -3,7 +3,7 @@ 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: 2025-10-28 18:06+0000\n" "POT-Creation-Date: 2025-10-28 18:06+0000\n"
"PO-Revision-Date: 2025-11-03 17:49\n" "PO-Revision-Date: 2025-11-06 00:35\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: de_DE\n" "Language: de_DE\n"

View File

@@ -3,7 +3,7 @@ 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: 2025-10-28 18:06+0000\n" "POT-Creation-Date: 2025-10-28 18:06+0000\n"
"PO-Revision-Date: 2025-10-29 12:14\n" "PO-Revision-Date: 2025-11-06 12:14\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: French\n" "Language-Team: French\n"
"Language: fr_FR\n" "Language: fr_FR\n"

View File

@@ -3,7 +3,7 @@ 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: 2025-10-28 18:06+0000\n" "POT-Creation-Date: 2025-10-28 18:06+0000\n"
"PO-Revision-Date: 2025-10-28 18:07\n" "PO-Revision-Date: 2025-11-06 00:35\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Chinese Traditional\n" "Language-Team: Chinese Traditional\n"
"Language: zh_TW\n" "Language: zh_TW\n"

View File

@@ -537,13 +537,6 @@ ACCOUNT_EMAIL_VERIFICATION = (
) )
) )
if ACCOUNT_EMAIL_VERIFICATION == "mandatory":
ACCOUNT_EMAIL_REQUIRED = True
if not EMAIL_ENABLED:
raise ValueError(
"Email must be enabled if ACCOUNT_EMAIL_VERIFICATION is mandatory",
)
ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS = __get_boolean( ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS = __get_boolean(
"PAPERLESS_ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS", "PAPERLESS_ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS",
"True", "True",

View File

@@ -1,6 +1,6 @@
from typing import Final from typing import Final
__version__: Final[tuple[int, int, int]] = (2, 19, 3) __version__: Final[tuple[int, int, int]] = (2, 19, 5)
# Version string like X.Y.Z # Version string like X.Y.Z
__full_version_str__: Final[str] = ".".join(map(str, __version__)) __full_version_str__: Final[str] = ".".join(map(str, __version__))
# Version string like X.Y # Version string like X.Y

2
uv.lock generated
View File

@@ -2115,7 +2115,7 @@ wheels = [
[[package]] [[package]]
name = "paperless-ngx" name = "paperless-ngx"
version = "2.19.3" version = "2.19.5"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },