Merge branch 'dev' into feature-workflows

This commit is contained in:
shamoon 2024-01-03 00:13:16 -08:00
commit c0f74f88b6
14 changed files with 339 additions and 202 deletions

View File

@ -37,7 +37,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- -
name: Install python name: Install python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }} python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- -
@ -56,7 +56,7 @@ jobs:
- -
name: Set up Python name: Set up Python
id: setup-python id: setup-python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }} python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
cache: "pipenv" cache: "pipenv"
@ -87,7 +87,7 @@ jobs:
pipenv --python ${{ steps.setup-python.outputs.python-version }} run mkdocs gh-deploy --force --no-history pipenv --python ${{ steps.setup-python.outputs.python-version }} run mkdocs gh-deploy --force --no-history
- -
name: Upload artifact name: Upload artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: documentation name: documentation
path: site/ path: site/
@ -114,7 +114,7 @@ jobs:
- -
name: Set up Python name: Set up Python
id: setup-python id: setup-python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: "${{ matrix.python-version }}" python-version: "${{ matrix.python-version }}"
cache: "pipenv" cache: "pipenv"
@ -155,7 +155,7 @@ jobs:
- -
name: Upload coverage name: Upload coverage
if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION }} if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION }}
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: backend-coverage-report name: backend-coverage-report
path: src/coverage.xml path: src/coverage.xml
@ -238,7 +238,7 @@ jobs:
- -
name: Upload Jest coverage name: Upload Jest coverage
if: always() if: always()
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: jest-coverage-report-${{ matrix.shard-index }} name: jest-coverage-report-${{ matrix.shard-index }}
path: | path: |
@ -253,9 +253,9 @@ jobs:
- -
name: Upload Playwright test results name: Upload Playwright test results
if: always() if: always()
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: playwright-report name: playwright-report-${{ matrix.shard-index }}
path: src-ui/playwright-report path: src-ui/playwright-report
retention-days: 7 retention-days: 7
@ -269,10 +269,18 @@ jobs:
- -
uses: actions/checkout@v4 uses: actions/checkout@v4
- -
name: Download frontend coverage name: Download frontend jest coverage
uses: actions/download-artifact@v3 uses: actions/download-artifact@v4
with: with:
path: src-ui/coverage/ path: src-ui/coverage/
pattern: jest-coverage-report-*
-
name: Download frontend playwright coverage
uses: actions/download-artifact@v4
with:
path: src-ui/coverage/
pattern: playwright-report-*
merge-multiple: true
- -
name: Upload frontend coverage to Codecov name: Upload frontend coverage to Codecov
uses: codecov/codecov-action@v3 uses: codecov/codecov-action@v3
@ -285,7 +293,7 @@ jobs:
files: '!coverage.xml' files: '!coverage.xml'
- -
name: Download backend coverage name: Download backend coverage
uses: actions/download-artifact@v3 uses: actions/download-artifact@v4
with: with:
name: backend-coverage-report name: backend-coverage-report
path: src/ path: src/
@ -416,7 +424,7 @@ jobs:
docker cp frontend-extract:/usr/src/paperless/src/documents/static/frontend src/documents/static/frontend/ docker cp frontend-extract:/usr/src/paperless/src/documents/static/frontend src/documents/static/frontend/
- -
name: Upload frontend artifact name: Upload frontend artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: frontend-compiled name: frontend-compiled
path: src/documents/static/frontend/ path: src/documents/static/frontend/
@ -435,7 +443,7 @@ jobs:
- -
name: Set up Python name: Set up Python
id: setup-python id: setup-python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }} python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
cache: "pipenv" cache: "pipenv"
@ -461,13 +469,13 @@ jobs:
sudo apt-get install -qq --no-install-recommends gettext liblept5 sudo apt-get install -qq --no-install-recommends gettext liblept5
- -
name: Download frontend artifact name: Download frontend artifact
uses: actions/download-artifact@v3 uses: actions/download-artifact@v4
with: with:
name: frontend-compiled name: frontend-compiled
path: src/documents/static/frontend/ path: src/documents/static/frontend/
- -
name: Download documentation artifact name: Download documentation artifact
uses: actions/download-artifact@v3 uses: actions/download-artifact@v4
with: with:
name: documentation name: documentation
path: docs/_build/html/ path: docs/_build/html/
@ -533,7 +541,7 @@ jobs:
tar -cJf paperless-ngx.tar.xz paperless-ngx/ tar -cJf paperless-ngx.tar.xz paperless-ngx/
- -
name: Upload release artifact name: Upload release artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: release name: release
path: dist/paperless-ngx.tar.xz path: dist/paperless-ngx.tar.xz
@ -552,7 +560,7 @@ jobs:
steps: steps:
- -
name: Download release artifact name: Download release artifact
uses: actions/download-artifact@v3 uses: actions/download-artifact@v4
with: with:
name: release name: release
path: ./ path: ./
@ -603,7 +611,7 @@ jobs:
ref: main ref: main
- -
name: Set up Python name: Set up Python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }} python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
cache: "pipenv" cache: "pipenv"

View File

@ -42,7 +42,7 @@ jobs:
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@v2 uses: github/codeql-action/init@v3
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file. # If you wish to specify custom queries, you can do so here or in a config file.
@ -51,4 +51,4 @@ jobs:
# queries: ./path/to/local/query, your-org/your-repo/queries@main # queries: ./path/to/local/query, your-org/your-repo/queries@main
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2 uses: github/codeql-action/analyze@v3

View File

@ -18,7 +18,7 @@ jobs:
name: 'Stale' name: 'Stale'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v8 - uses: actions/stale@v9
with: with:
days-before-stale: 7 days-before-stale: 7
days-before-close: 14 days-before-close: 14

View File

@ -270,3 +270,5 @@ ENTRYPOINT ["/sbin/docker-entrypoint.sh"]
EXPOSE 8000 EXPOSE 8000
CMD ["/usr/local/bin/paperless_cmd.sh"] CMD ["/usr/local/bin/paperless_cmd.sh"]
HEALTHCHECK --interval=30s --timeout=10s --retries=5 CMD [ "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000" ]

View File

@ -72,7 +72,7 @@ steps described in [Docker setup](#docker_hub) automatically.
If you want to use the included `docker-compose.*.yml` file, you If you want to use the included `docker-compose.*.yml` file, you
need to have at least Docker version **17.09.0** and Docker Compose need to have at least Docker version **17.09.0** and Docker Compose
version **v2**. To check do: `docker compose -v` or `docker -v` version **v2**. To check do: `docker compose version` or `docker -v`
See the [Docker installation guide](https://docs.docker.com/engine/install/) on how to install the current See the [Docker installation guide](https://docs.docker.com/engine/install/) on how to install the current
version of Docker for your operating system or Linux distribution of version of Docker for your operating system or Linux distribution of

327
src-ui/package-lock.json generated
View File

@ -10,14 +10,14 @@
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@angular/cdk": "^17.0.4", "@angular/cdk": "^17.0.4",
"@angular/common": "~17.0.7", "@angular/common": "~17.0.8",
"@angular/compiler": "~17.0.7", "@angular/compiler": "~17.0.8",
"@angular/core": "~17.0.7", "@angular/core": "~17.0.8",
"@angular/forms": "~17.0.7", "@angular/forms": "~17.0.8",
"@angular/localize": "~17.0.7", "@angular/localize": "~17.0.8",
"@angular/platform-browser": "~17.0.7", "@angular/platform-browser": "~17.0.8",
"@angular/platform-browser-dynamic": "~17.0.7", "@angular/platform-browser-dynamic": "~17.0.8",
"@angular/router": "~17.0.7", "@angular/router": "~17.0.8",
"@ng-bootstrap/ng-bootstrap": "^16.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0",
"@ng-select/ng-select": "^12.0.4", "@ng-select/ng-select": "^12.0.4",
"@ngneat/dirty-check-forms": "^3.0.3", "@ngneat/dirty-check-forms": "^3.0.3",
@ -37,21 +37,21 @@
}, },
"devDependencies": { "devDependencies": {
"@angular-builders/jest": "17.0.0", "@angular-builders/jest": "17.0.0",
"@angular-devkit/build-angular": "~17.0.7", "@angular-devkit/build-angular": "~17.0.8",
"@angular-eslint/builder": "17.1.1", "@angular-eslint/builder": "17.1.1",
"@angular-eslint/eslint-plugin": "17.1.1", "@angular-eslint/eslint-plugin": "17.1.1",
"@angular-eslint/eslint-plugin-template": "17.1.1", "@angular-eslint/eslint-plugin-template": "17.1.1",
"@angular-eslint/schematics": "17.1.1", "@angular-eslint/schematics": "17.1.1",
"@angular-eslint/template-parser": "17.1.1", "@angular-eslint/template-parser": "17.1.1",
"@angular/cli": "~17.0.7", "@angular/cli": "~17.0.8",
"@angular/compiler-cli": "~17.0.7", "@angular/compiler-cli": "~17.0.7",
"@playwright/test": "^1.40.1", "@playwright/test": "^1.40.1",
"@types/jest": "^29.5.10", "@types/jest": "^29.5.10",
"@types/node": "^20.10.2", "@types/node": "^20.10.6",
"@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/eslint-plugin": "^6.17.0",
"@typescript-eslint/parser": "^6.10.0", "@typescript-eslint/parser": "^6.17.0",
"concurrently": "^8.2.2", "concurrently": "^8.2.2",
"eslint": "^8.53.0", "eslint": "^8.56.0",
"jest": "29.7.0", "jest": "29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"jest-preset-angular": "^13.1.4", "jest-preset-angular": "^13.1.4",
@ -107,12 +107,12 @@
} }
}, },
"node_modules/@angular-devkit/architect": { "node_modules/@angular-devkit/architect": {
"version": "0.1700.7", "version": "0.1700.8",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.7.tgz", "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.8.tgz",
"integrity": "sha512-32uitQKsYLGXAKoXBsmOnPsTt9pS+b9cnFI9ZvBFVhJ31I2EOM7vGcMFalhTxdB/DkVHk4TyO78efV0V26DwCA==", "integrity": "sha512-SWVr3CvwO6T0yW2ytszCwBT1g92vyFkwbVUxqE93urYnoD8PvP+81GH5YwVjHQTgvhP4eXQMGZ9hpHx57VOrWQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@angular-devkit/core": "17.0.7", "@angular-devkit/core": "17.0.8",
"rxjs": "7.8.1" "rxjs": "7.8.1"
}, },
"engines": { "engines": {
@ -122,15 +122,15 @@
} }
}, },
"node_modules/@angular-devkit/build-angular": { "node_modules/@angular-devkit/build-angular": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.8.tgz",
"integrity": "sha512-AtEzLk6n6BXqQzk0Bsupe6GV0IgUe7RbpBfqROi+NZqMA7OUAHCX3xA6M68Qu+5KxBtW7T5lHeZZ7iP/y39wtQ==", "integrity": "sha512-u7R5yX92ZxOL/LfxiKGGqlBo86100sJ5Rabavn8DeGtYP8N0qgwCcNwlW2zaMoUlkw2geMnxcxIX5VJI4iFPUA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "2.2.1", "@ampproject/remapping": "2.2.1",
"@angular-devkit/architect": "0.1700.7", "@angular-devkit/architect": "0.1700.8",
"@angular-devkit/build-webpack": "0.1700.7", "@angular-devkit/build-webpack": "0.1700.8",
"@angular-devkit/core": "17.0.7", "@angular-devkit/core": "17.0.8",
"@babel/core": "7.23.2", "@babel/core": "7.23.2",
"@babel/generator": "7.23.0", "@babel/generator": "7.23.0",
"@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-annotate-as-pure": "7.22.5",
@ -141,7 +141,7 @@
"@babel/preset-env": "7.23.2", "@babel/preset-env": "7.23.2",
"@babel/runtime": "7.23.2", "@babel/runtime": "7.23.2",
"@discoveryjs/json-ext": "0.5.7", "@discoveryjs/json-ext": "0.5.7",
"@ngtools/webpack": "17.0.7", "@ngtools/webpack": "17.0.8",
"@vitejs/plugin-basic-ssl": "1.0.1", "@vitejs/plugin-basic-ssl": "1.0.1",
"ansi-colors": "4.1.3", "ansi-colors": "4.1.3",
"autoprefixer": "10.4.16", "autoprefixer": "10.4.16",
@ -245,12 +245,12 @@
} }
}, },
"node_modules/@angular-devkit/build-webpack": { "node_modules/@angular-devkit/build-webpack": {
"version": "0.1700.7", "version": "0.1700.8",
"resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.7.tgz", "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.8.tgz",
"integrity": "sha512-B9Mg/qYDpE5my8PJ3VPQyRSUV0Oq1bFUzU8s0ZpqEZl1URKc04pm0LtLmebrMIcUZgDiGk0RHaD+O1E9IV/bdQ==", "integrity": "sha512-GA7QlCAlYB3uBkRaUYgIC/Vfajb9jMmouwYiAAEm34ZyP3ThFjdqsYd/A/exnuESt5o6Bh++C/PI34sV3lawRA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@angular-devkit/architect": "0.1700.7", "@angular-devkit/architect": "0.1700.8",
"rxjs": "7.8.1" "rxjs": "7.8.1"
}, },
"engines": { "engines": {
@ -264,9 +264,9 @@
} }
}, },
"node_modules/@angular-devkit/core": { "node_modules/@angular-devkit/core": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.8.tgz",
"integrity": "sha512-vATobHo5O5tJba424hJfQWLb40GzvZPNsI74dcgSUTgrDph8ksmk5xB9OvEvf0INorQZ2IMphj/VIWj4/+JqSA==", "integrity": "sha512-gI8+SOwGUwr0WOlFrhLjohLolMzcguuoR0LTZEcGjdXvQyPgH4NDSRIIrfWCdu+ZVhfy76o3zQYdYc9QN8NrjQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"ajv": "8.12.0", "ajv": "8.12.0",
@ -291,12 +291,12 @@
} }
}, },
"node_modules/@angular-devkit/schematics": { "node_modules/@angular-devkit/schematics": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.8.tgz",
"integrity": "sha512-BY11OkJkM3xyXcvyD7x5kGY/c8Ufd4AfPvI0D9imhVxbns45Q48b1DlvCQvSnCJ/s+OwnkrYb/Efa70ZiaGu8A==", "integrity": "sha512-syo814SVWfJvne448IijjZvpWbuqJsEutdNqHWLTewTfX2U3KrIAr/XRVcXQMuyMvLCDiuxjMgEJxOIP7mcIPw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@angular-devkit/core": "17.0.7", "@angular-devkit/core": "17.0.8",
"jsonc-parser": "3.2.0", "jsonc-parser": "3.2.0",
"magic-string": "0.30.5", "magic-string": "0.30.5",
"ora": "5.4.1", "ora": "5.4.1",
@ -423,15 +423,15 @@
} }
}, },
"node_modules/@angular/cli": { "node_modules/@angular/cli": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.8.tgz",
"integrity": "sha512-oSa0GVAQNA7wFbLJYeaO3kV4iUcbKEqXDLxcIE8s1GfHddBOlXH2P1T4fXonCBl5qvV+joP0G0+fs7I0w2utZQ==", "integrity": "sha512-yZXYNLAFv9u2qypsVqtS+rRCsnjsIPYXr6TcI/r5buzOtC7UQ2lleYsWJqX47SsyGMk/o3gaYg5Bj2I5mmRDLA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@angular-devkit/architect": "0.1700.7", "@angular-devkit/architect": "0.1700.8",
"@angular-devkit/core": "17.0.7", "@angular-devkit/core": "17.0.8",
"@angular-devkit/schematics": "17.0.7", "@angular-devkit/schematics": "17.0.8",
"@schematics/angular": "17.0.7", "@schematics/angular": "17.0.8",
"@yarnpkg/lockfile": "1.1.0", "@yarnpkg/lockfile": "1.1.0",
"ansi-colors": "4.1.3", "ansi-colors": "4.1.3",
"ini": "4.1.1", "ini": "4.1.1",
@ -457,9 +457,9 @@
} }
}, },
"node_modules/@angular/common": { "node_modules/@angular/common": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.8.tgz",
"integrity": "sha512-bPPL6x0KOAOTxKSE2j4EWmEUOnqZYzOYiHzroa5b9UEyA9NvGkd9bm3zIxw8xcndRj1Ehcmvpi6KBLcYBBbWfg==", "integrity": "sha512-fFfwtdg7H+OkqnvV/ENu8F8KGfgIiH16DDbQqYY5KQyyQB+SMsoVW29F1fGx6Y30s7ZlsLOy6cHhgrw74itkSw==",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -467,14 +467,14 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/core": "17.0.7", "@angular/core": "17.0.8",
"rxjs": "^6.5.3 || ^7.4.0" "rxjs": "^6.5.3 || ^7.4.0"
} }
}, },
"node_modules/@angular/compiler": { "node_modules/@angular/compiler": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.8.tgz",
"integrity": "sha512-QHPuLti2c2tGZmOGZ0cfCHo4LxiHUkC27I0aZFDyQSSQqEI5obQGVlEREHysw0nsS3sYIcLvqcwcKcRtXlXtxQ==", "integrity": "sha512-48jWypuhBGTrUUbkz1vB9gjbKKZ3hpuJ2DUUncd331Yw4tqkqZQbBa/E3ei4IHiCxEvW2uX3lI4AwlhuozmUtA==",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -482,7 +482,7 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/core": "17.0.7" "@angular/core": "17.0.8"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@angular/core": { "@angular/core": {
@ -491,9 +491,9 @@
} }
}, },
"node_modules/@angular/compiler-cli": { "node_modules/@angular/compiler-cli": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.8.tgz",
"integrity": "sha512-YnL38idjIYtl3BXYpv+sVJKWGbUjHT6eyQSQVAfO/1AwWqVa21K9hnE+Q37VmUKEcKFMnQembeuErA+KVsGI6A==", "integrity": "sha512-ny2SMVgl+icjMuU5ZM57yFGUrhjR0hNxfCn0otAD3jUFliz/Onu9l6EPRKA5Cr8MZx3mg3rTLSBMD17YT8rsOg==",
"dependencies": { "dependencies": {
"@babel/core": "7.23.2", "@babel/core": "7.23.2",
"@jridgewell/sourcemap-codec": "^1.4.14", "@jridgewell/sourcemap-codec": "^1.4.14",
@ -513,14 +513,14 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/compiler": "17.0.7", "@angular/compiler": "17.0.8",
"typescript": ">=5.2 <5.3" "typescript": ">=5.2 <5.3"
} }
}, },
"node_modules/@angular/core": { "node_modules/@angular/core": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.8.tgz",
"integrity": "sha512-mEkelXkzEi6+A9GjdKOSGGzQAfo1iAjVTn6YsplNUeGE5JgDZYZ7sXGQqs0Lin7dzJxnPAgGjCOl7SpWLXIPSQ==", "integrity": "sha512-tzYsK24LdkNuKNJK6efF4XOqspvF/qOe9j/n1Y61a6mNvFwsJFGbcmdZMby4hI/YRm6oIDoIIFjSep8ycp6Pbw==",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -533,9 +533,9 @@
} }
}, },
"node_modules/@angular/forms": { "node_modules/@angular/forms": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.8.tgz",
"integrity": "sha512-28BxRxEmgZIofGwVp6s2v3ri/kuWW+/EY/ZXhavlWKJEh4ATJl72k0RkRWNcQi4wnvn0Qb8tFdnVJnvRZvvKEw==", "integrity": "sha512-WZBHbMQjaSovAzOMhKqZN+m7eUPGfOzh9rKFKvj6UQLIJ9qSpEpqlvL0omU1z/47s3XXeLiBzomMiRfQISJvvw==",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -543,16 +543,16 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/common": "17.0.7", "@angular/common": "17.0.8",
"@angular/core": "17.0.7", "@angular/core": "17.0.8",
"@angular/platform-browser": "17.0.7", "@angular/platform-browser": "17.0.8",
"rxjs": "^6.5.3 || ^7.4.0" "rxjs": "^6.5.3 || ^7.4.0"
} }
}, },
"node_modules/@angular/localize": { "node_modules/@angular/localize": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.0.8.tgz",
"integrity": "sha512-avYYQ8zin2thzvsH2YP3WxlwkvOzjNEXxjv4yyZBx6wul68e/753kQK/0RmSUYaBpDTUEZYzrPpDay00TKwBOA==", "integrity": "sha512-1zW8qWKNMH3r/x4KpwzzUmVY+iN76vYdhjA6gzZDnpJxpon9eyljNEildj9+zSWeNUr2LgJ6HnkIX9q1f3mXfA==",
"dependencies": { "dependencies": {
"@babel/core": "7.23.2", "@babel/core": "7.23.2",
"fast-glob": "3.3.1", "fast-glob": "3.3.1",
@ -567,14 +567,14 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/compiler": "17.0.7", "@angular/compiler": "17.0.8",
"@angular/compiler-cli": "17.0.7" "@angular/compiler-cli": "17.0.8"
} }
}, },
"node_modules/@angular/platform-browser": { "node_modules/@angular/platform-browser": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.8.tgz",
"integrity": "sha512-bm9/wt51nc/MPjft/FlRNIgFSeLjDtfJOT7M32Rt6kOHhNKSK7ZTPWdMe9ahuHSbAhLzd0G/4NsT5sKrWSeVZg==", "integrity": "sha512-XaI+p2AxQaIHzR761lhPUf4OcOp46WDW0IfbvOzaezHE+8r81joZyVSDQPgXSa/aRfI58YhcfUavuGqyU3PphA==",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -582,9 +582,9 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/animations": "17.0.7", "@angular/animations": "17.0.8",
"@angular/common": "17.0.7", "@angular/common": "17.0.8",
"@angular/core": "17.0.7" "@angular/core": "17.0.8"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@angular/animations": { "@angular/animations": {
@ -593,9 +593,9 @@
} }
}, },
"node_modules/@angular/platform-browser-dynamic": { "node_modules/@angular/platform-browser-dynamic": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.8.tgz",
"integrity": "sha512-OquwUX9fLWA2JUZW5Jm6atk0CPt0sA7Tg24eGLsr6g1XfTS7jRZprlGaa72NgPLnQVV6m84o/ZiNYS6yPmq1Gg==", "integrity": "sha512-BIXNKnfBZb8sdluQ7WIhIXFuVnsJJ0SV+aiMKzQ7B6XhWoAXZQnlvON2thydjIIVuCvaF3YmWTbILI2K8YZ2jQ==",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -603,16 +603,16 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/common": "17.0.7", "@angular/common": "17.0.8",
"@angular/compiler": "17.0.7", "@angular/compiler": "17.0.8",
"@angular/core": "17.0.7", "@angular/core": "17.0.8",
"@angular/platform-browser": "17.0.7" "@angular/platform-browser": "17.0.8"
} }
}, },
"node_modules/@angular/router": { "node_modules/@angular/router": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.8.tgz",
"integrity": "sha512-rUFPe1uDlYYw6+3Gq68czW7WxBH7zT/D3UsT1otqwUV4RnQQsVze4fIit9FqJh7tuP4y3WpB4XBNf7p7Oi6TJw==", "integrity": "sha512-ptphcRe1RG/mIS60R7ZPilkkrxautqB0sOhds3h5VP3g628G1a2HWzvnmvjEfpJWDMFivV32VJMMBtTLqGr+0Q==",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@ -620,9 +620,9 @@
"node": "^18.13.0 || >=20.9.0" "node": "^18.13.0 || >=20.9.0"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/common": "17.0.7", "@angular/common": "17.0.8",
"@angular/core": "17.0.7", "@angular/core": "17.0.8",
"@angular/platform-browser": "17.0.7", "@angular/platform-browser": "17.0.8",
"rxjs": "^6.5.3 || ^7.4.0" "rxjs": "^6.5.3 || ^7.4.0"
} }
}, },
@ -2895,9 +2895,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "8.55.0", "version": "8.56.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
"integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -3941,9 +3941,9 @@
} }
}, },
"node_modules/@ngtools/webpack": { "node_modules/@ngtools/webpack": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.8.tgz",
"integrity": "sha512-gwhUhpwXn0trwwKdSu9WlJbEcLt+s/2fPwoD9lZ0y3wXfrOogsfcNBJKeO5BZf1h+A3AWt7ePmgrZXSJM+865Q==", "integrity": "sha512-wx0XBMrbpDeailK2uIhp/ZVMC3GK3BWwJjUu5SbT4BFrcoi2Zd9/9m0RCBAY54UXLBCqKd+ih7pJ6JSvprZmWw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^18.13.0 || >=20.9.0", "node": "^18.13.0 || >=20.9.0",
@ -4459,13 +4459,13 @@
} }
}, },
"node_modules/@schematics/angular": { "node_modules/@schematics/angular": {
"version": "17.0.7", "version": "17.0.8",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.7.tgz", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.8.tgz",
"integrity": "sha512-d7QKmcKrM4owb/2bR7Ipf23roiNbvbD/x7reNhQAtKAPLSHJ3Ulkf1+Yv+dj+9f+K7y9SBviEUSrD27BQ9WaxQ==", "integrity": "sha512-1h5mwKFv1B/L5JWZ0mxnC4ms06iwnSi/w+GgRZPeM3P5BpuZuvAkFiClNnM55iLlQJXRQioPNLM3sOsz7spR6w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@angular-devkit/core": "17.0.7", "@angular-devkit/core": "17.0.8",
"@angular-devkit/schematics": "17.0.7", "@angular-devkit/schematics": "17.0.8",
"jsonc-parser": "3.2.0" "jsonc-parser": "3.2.0"
}, },
"engines": { "engines": {
@ -4878,9 +4878,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.10.4", "version": "20.10.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz",
"integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
@ -4896,9 +4896,9 @@
} }
}, },
"node_modules/@types/qs": { "node_modules/@types/qs": {
"version": "6.9.10", "version": "6.9.11",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz",
"integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==",
"dev": true "dev": true
}, },
"node_modules/@types/range-parser": { "node_modules/@types/range-parser": {
@ -4995,16 +4995,16 @@
"dev": true "dev": true
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz",
"integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", "integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.5.1", "@eslint-community/regexpp": "^4.5.1",
"@typescript-eslint/scope-manager": "6.14.0", "@typescript-eslint/scope-manager": "6.17.0",
"@typescript-eslint/type-utils": "6.14.0", "@typescript-eslint/type-utils": "6.17.0",
"@typescript-eslint/utils": "6.14.0", "@typescript-eslint/utils": "6.17.0",
"@typescript-eslint/visitor-keys": "6.14.0", "@typescript-eslint/visitor-keys": "6.17.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.2.4", "ignore": "^5.2.4",
@ -5030,13 +5030,13 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz",
"integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", "integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "6.14.0", "@typescript-eslint/typescript-estree": "6.17.0",
"@typescript-eslint/utils": "6.14.0", "@typescript-eslint/utils": "6.17.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.0.1" "ts-api-utils": "^1.0.1"
}, },
@ -5057,17 +5057,17 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz",
"integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", "integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12", "@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0", "@types/semver": "^7.5.0",
"@typescript-eslint/scope-manager": "6.14.0", "@typescript-eslint/scope-manager": "6.17.0",
"@typescript-eslint/types": "6.14.0", "@typescript-eslint/types": "6.17.0",
"@typescript-eslint/typescript-estree": "6.14.0", "@typescript-eslint/typescript-estree": "6.17.0",
"semver": "^7.5.4" "semver": "^7.5.4"
}, },
"engines": { "engines": {
@ -5082,15 +5082,15 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz",
"integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", "integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "6.14.0", "@typescript-eslint/scope-manager": "6.17.0",
"@typescript-eslint/types": "6.14.0", "@typescript-eslint/types": "6.17.0",
"@typescript-eslint/typescript-estree": "6.14.0", "@typescript-eslint/typescript-estree": "6.17.0",
"@typescript-eslint/visitor-keys": "6.14.0", "@typescript-eslint/visitor-keys": "6.17.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@ -5110,13 +5110,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz",
"integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", "integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "6.14.0", "@typescript-eslint/types": "6.17.0",
"@typescript-eslint/visitor-keys": "6.14.0" "@typescript-eslint/visitor-keys": "6.17.0"
}, },
"engines": { "engines": {
"node": "^16.0.0 || >=18.0.0" "node": "^16.0.0 || >=18.0.0"
@ -5211,9 +5211,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz",
"integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", "integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^16.0.0 || >=18.0.0" "node": "^16.0.0 || >=18.0.0"
@ -5224,16 +5224,17 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz",
"integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", "integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "6.14.0", "@typescript-eslint/types": "6.17.0",
"@typescript-eslint/visitor-keys": "6.14.0", "@typescript-eslint/visitor-keys": "6.17.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
"minimatch": "9.0.3",
"semver": "^7.5.4", "semver": "^7.5.4",
"ts-api-utils": "^1.0.1" "ts-api-utils": "^1.0.1"
}, },
@ -5250,6 +5251,30 @@
} }
} }
}, },
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "6.13.1", "version": "6.13.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz",
@ -5350,12 +5375,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "6.14.0", "version": "6.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz",
"integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", "integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "6.14.0", "@typescript-eslint/types": "6.17.0",
"eslint-visitor-keys": "^3.4.1" "eslint-visitor-keys": "^3.4.1"
}, },
"engines": { "engines": {
@ -8687,15 +8712,15 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.55.0", "version": "8.56.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
"integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1", "@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4", "@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.55.0", "@eslint/js": "8.56.0",
"@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",

View File

@ -12,14 +12,14 @@
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/cdk": "^17.0.4", "@angular/cdk": "^17.0.4",
"@angular/common": "~17.0.7", "@angular/common": "~17.0.8",
"@angular/compiler": "~17.0.7", "@angular/compiler": "~17.0.8",
"@angular/core": "~17.0.7", "@angular/core": "~17.0.8",
"@angular/forms": "~17.0.7", "@angular/forms": "~17.0.8",
"@angular/localize": "~17.0.7", "@angular/localize": "~17.0.8",
"@angular/platform-browser": "~17.0.7", "@angular/platform-browser": "~17.0.8",
"@angular/platform-browser-dynamic": "~17.0.7", "@angular/platform-browser-dynamic": "~17.0.8",
"@angular/router": "~17.0.7", "@angular/router": "~17.0.8",
"@ng-bootstrap/ng-bootstrap": "^16.0.0", "@ng-bootstrap/ng-bootstrap": "^16.0.0",
"@ng-select/ng-select": "^12.0.4", "@ng-select/ng-select": "^12.0.4",
"@ngneat/dirty-check-forms": "^3.0.3", "@ngneat/dirty-check-forms": "^3.0.3",
@ -39,21 +39,21 @@
}, },
"devDependencies": { "devDependencies": {
"@angular-builders/jest": "17.0.0", "@angular-builders/jest": "17.0.0",
"@angular-devkit/build-angular": "~17.0.7", "@angular-devkit/build-angular": "~17.0.8",
"@angular-eslint/builder": "17.1.1", "@angular-eslint/builder": "17.1.1",
"@angular-eslint/eslint-plugin": "17.1.1", "@angular-eslint/eslint-plugin": "17.1.1",
"@angular-eslint/eslint-plugin-template": "17.1.1", "@angular-eslint/eslint-plugin-template": "17.1.1",
"@angular-eslint/schematics": "17.1.1", "@angular-eslint/schematics": "17.1.1",
"@angular-eslint/template-parser": "17.1.1", "@angular-eslint/template-parser": "17.1.1",
"@angular/cli": "~17.0.7", "@angular/cli": "~17.0.8",
"@angular/compiler-cli": "~17.0.7", "@angular/compiler-cli": "~17.0.7",
"@playwright/test": "^1.40.1", "@playwright/test": "^1.40.1",
"@types/jest": "^29.5.10", "@types/jest": "^29.5.10",
"@types/node": "^20.10.2", "@types/node": "^20.10.6",
"@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/eslint-plugin": "^6.17.0",
"@typescript-eslint/parser": "^6.10.0", "@typescript-eslint/parser": "^6.17.0",
"concurrently": "^8.2.2", "concurrently": "^8.2.2",
"eslint": "^8.53.0", "eslint": "^8.56.0",
"jest": "29.7.0", "jest": "29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"jest-preset-angular": "^13.1.4", "jest-preset-angular": "^13.1.4",

View File

@ -123,28 +123,73 @@
<div [formGroup]="customFieldFormFields.controls[i]"> <div [formGroup]="customFieldFormFields.controls[i]">
@switch (getCustomFieldFromInstance(fieldInstance)?.data_type) { @switch (getCustomFieldFromInstance(fieldInstance)?.data_type) {
@case (PaperlessCustomFieldDataType.String) { @case (PaperlessCustomFieldDataType.String) {
<pngx-input-text formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true" [error]="getCustomFieldError(i)"></pngx-input-text> <pngx-input-text formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-text>
} }
@case (PaperlessCustomFieldDataType.Date) { @case (PaperlessCustomFieldDataType.Date) {
<pngx-input-date formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true" [error]="getCustomFieldError(i)"></pngx-input-date> <pngx-input-date formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-date>
} }
@case (PaperlessCustomFieldDataType.Integer) { @case (PaperlessCustomFieldDataType.Integer) {
<pngx-input-number formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true" [showAdd]="false" [error]="getCustomFieldError(i)"></pngx-input-number> <pngx-input-number formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"
[showAdd]="false"
[error]="getCustomFieldError(i)"></pngx-input-number>
} }
@case (PaperlessCustomFieldDataType.Float) { @case (PaperlessCustomFieldDataType.Float) {
<pngx-input-number formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true" [showAdd]="false" [step]=".1" [error]="getCustomFieldError(i)"></pngx-input-number> <pngx-input-number formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"
[showAdd]="false"
[step]=".1"
[error]="getCustomFieldError(i)"></pngx-input-number>
} }
@case (PaperlessCustomFieldDataType.Monetary) { @case (PaperlessCustomFieldDataType.Monetary) {
<pngx-input-number formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true" [showAdd]="false" [step]=".01" [error]="getCustomFieldError(i)"></pngx-input-number> <pngx-input-number formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"
[showAdd]="false"
[step]=".01"
[error]="getCustomFieldError(i)"></pngx-input-number>
} }
@case (PaperlessCustomFieldDataType.Boolean) { @case (PaperlessCustomFieldDataType.Boolean) {
<pngx-input-check formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true"></pngx-input-check> <pngx-input-check formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"></pngx-input-check>
} }
@case (PaperlessCustomFieldDataType.Url) { @case (PaperlessCustomFieldDataType.Url) {
<pngx-input-url formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true" [error]="getCustomFieldError(i)"></pngx-input-url> <pngx-input-url formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-url>
} }
@case (PaperlessCustomFieldDataType.DocumentLink) { @case (PaperlessCustomFieldDataType.DocumentLink) {
<pngx-input-document-link formControlName="value" [title]="getCustomFieldFromInstance(fieldInstance)?.name" [parentDocumentID]="documentId" [removable]="true" (removed)="removeField(fieldInstance)" [horizontal]="true" [error]="getCustomFieldError(i)"></pngx-input-document-link> <pngx-input-document-link formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name"
[parentDocumentID]="documentId"
[removable]="userIsOwner"
(removed)="removeField(fieldInstance)"
[horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-document-link>
} }
} }
</div> </div>

View File

@ -222,7 +222,7 @@ def generate_filename(
).strip() ).strip()
if settings.FILENAME_FORMAT_REMOVE_NONE: if settings.FILENAME_FORMAT_REMOVE_NONE:
path = path.replace("-none-/", "") # remove empty directories path = path.replace("/-none-/", "/") # remove empty directories
path = path.replace(" -none-", "") # remove when spaced, with space path = path.replace(" -none-", "") # remove when spaced, with space
path = path.replace("-none-", "") # remove rest of the occurences path = path.replace("-none-", "") # remove rest of the occurences

View File

@ -568,6 +568,9 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer):
value_document_ids=[document.id], value_document_ids=[document.id],
), ),
) )
elif target_doc_field_instance.value is None:
target_doc_field_instance.value_document_ids = [document.id]
custom_field_instances_to_update.append(target_doc_field_instance)
elif document.id not in target_doc_field_instance.value: elif document.id not in target_doc_field_instance.value:
target_doc_field_instance.value_document_ids.append(document.id) target_doc_field_instance.value_document_ids.append(document.id)
custom_field_instances_to_update.append(target_doc_field_instance) custom_field_instances_to_update.append(target_doc_field_instance)

View File

@ -37,6 +37,11 @@ body {
border-bottom-left-radius: 0; border-bottom-left-radius: 0;
} }
#inputUsername:focus {
position: relative;
z-index: 100;
}
#inputPassword, #inputPassword,
#inputPassword2 { #inputPassword2 {
border-top-left-radius: 0; border-top-left-radius: 0;

View File

@ -530,7 +530,7 @@ class TestCustomField(DirectoriesMixin, APITestCase):
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
def test_bidirectional_doclink_fields(self): def test_symmetric_doclink_fields(self):
""" """
GIVEN: GIVEN:
- Existing document - Existing document
@ -637,3 +637,28 @@ class TestCustomField(DirectoriesMixin, APITestCase):
self.assertEqual(doc2.custom_fields.first().value, []) self.assertEqual(doc2.custom_fields.first().value, [])
self.assertEqual(doc3.custom_fields.first().value, [4]) self.assertEqual(doc3.custom_fields.first().value, [4])
self.assertEqual(doc4.custom_fields.first().value, [3]) self.assertEqual(doc4.custom_fields.first().value, [3])
# If field exists on target doc but value is None
doc5 = Document.objects.create(
title="WOW5",
content="the content4",
checksum="5",
mime_type="application/pdf",
)
CustomFieldInstance.objects.create(document=doc5, field=custom_field_doclink)
resp = self.client.patch(
f"/api/documents/{doc1.id}/",
data={
"custom_fields": [
{
"field": custom_field_doclink.id,
"value": [doc5.id],
},
],
},
format="json",
)
self.assertEqual(resp.status_code, status.HTTP_200_OK)
self.assertEqual(doc5.custom_fields.first().value, [1])

View File

@ -1007,6 +1007,9 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase):
self.assertEqual(generate_filename(doc_a), "ThisIsAFolder/4/2020-06-25.pdf") self.assertEqual(generate_filename(doc_a), "ThisIsAFolder/4/2020-06-25.pdf")
self.assertEqual(generate_filename(doc_b), "SomeImportantNone/2020-07-25.pdf") self.assertEqual(generate_filename(doc_b), "SomeImportantNone/2020-07-25.pdf")
@override_settings(
FILENAME_FORMAT=None,
)
def test_no_path_fallback(self): def test_no_path_fallback(self):
""" """
GIVEN: GIVEN:
@ -1157,3 +1160,28 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase):
self.assertEqual(generate_filename(text_doc), "logs.txt") self.assertEqual(generate_filename(text_doc), "logs.txt")
self.assertEqual(generate_filename(text_doc, archive_filename=True), "logs.pdf") self.assertEqual(generate_filename(text_doc, archive_filename=True), "logs.pdf")
@override_settings(
FILENAME_FORMAT="XX{correspondent}/{title}",
FILENAME_FORMAT_REMOVE_NONE=True,
)
def test_remove_none_not_dir(self):
"""
GIVEN:
- A document with & filename format that includes correspondent as part of directory name
- FILENAME_FORMAT_REMOVE_NONE is True
WHEN:
- the filename is generated for the document
THEN:
- the missing correspondent is removed but directory structure retained
"""
document = Document.objects.create(
title="doc1",
mime_type="application/pdf",
)
document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED
document.save()
# Ensure that filename is properly generated
document.filename = generate_filename(document)
self.assertEqual(document.filename, "XX/doc1.pdf")

View File

@ -56,11 +56,7 @@ class StandardPagination(PageNumberPagination):
except Exception: except Exception:
pass pass
else: else:
for obj in self.page.paginator.object_list: ids = self.page.paginator.object_list.values_list("pk", flat=True)
if hasattr(obj, "id"):
ids.append(obj.id)
elif hasattr(obj, "fields"):
ids.append(obj.fields()["id"])
return ids return ids
def get_paginated_response_schema(self, schema): def get_paginated_response_schema(self, schema):