From 5ff791e4c5d8e3f79f7a98d3c6a08faa6db446b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 14:15:03 -0700 Subject: [PATCH 01/51] Documentation: Add v2.8.6 changelog (#6740) --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> --- docs/changelog.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 46853f80a..1d040ffff 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,21 @@ # Changelog +## paperless-ngx 2.8.6 + +### Bug Fixes + +- Security: disallow API remote-user auth if disabled [@shamoon](https://github.com/shamoon) ([#6739](https://github.com/paperless-ngx/paperless-ngx/pull/6739)) +- Fix: retain sort field from global search filtering, use FILTER_HAS_TAGS_ALL [@shamoon](https://github.com/shamoon) ([#6737](https://github.com/paperless-ngx/paperless-ngx/pull/6737)) + +### All App Changes + +
+2 changes + +- Security: disallow API remote-user auth if disabled [@shamoon](https://github.com/shamoon) ([#6739](https://github.com/paperless-ngx/paperless-ngx/pull/6739)) +- Fix: retain sort field from global search filtering, use FILTER_HAS_TAGS_ALL [@shamoon](https://github.com/shamoon) ([#6737](https://github.com/paperless-ngx/paperless-ngx/pull/6737)) +
+ ## paperless-ngx 2.8.5 ### Bug Fixes From 50a6181e4891476084953f2554f8ca01f3187213 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 15 May 2024 14:15:56 -0700 Subject: [PATCH 02/51] Reset dev version string --- src-ui/src/environments/environment.prod.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/src/environments/environment.prod.ts b/src-ui/src/environments/environment.prod.ts index 39190d033..23e9b9b60 100644 --- a/src-ui/src/environments/environment.prod.ts +++ b/src-ui/src/environments/environment.prod.ts @@ -5,7 +5,7 @@ export const environment = { apiBaseUrl: document.baseURI + 'api/', apiVersion: '5', appTitle: 'Paperless-ngx', - version: '2.8.6', + version: '2.8.6-dev', webSocketHost: window.location.host, webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:', webSocketBaseUrl: base_url.pathname + 'ws/', From 019a2557532205a2f21e270b8186b9046dc78ac0 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 16 May 2024 11:12:19 -0700 Subject: [PATCH 03/51] Chore: revert pngx pdf viewer to third party package (#6741) --- src-ui/angular.json | 3 +- .../document-detail/document-detail.spec.ts | 2 +- src-ui/jest.config.js | 1 - src-ui/package-lock.json | 11 +- src-ui/package.json | 2 +- src-ui/src/app/app.module.ts | 4 +- .../split-confirm-dialog.component.html | 4 +- .../split-confirm-dialog.component.scss | 2 +- .../split-confirm-dialog.component.spec.ts | 5 +- .../split-confirm-dialog.component.ts | 2 +- .../pdf-viewer/pdf-viewer.component.html | 3 - .../pdf-viewer/pdf-viewer.component.scss | 1014 ----------------- .../common/pdf-viewer/pdf-viewer.component.ts | 600 ---------- .../components/common/pdf-viewer/typings.ts | 17 - .../pdf-viewer/utils/event-bus-utils.ts | 182 --- .../preview-popup.component.html | 4 +- .../preview-popup.component.spec.ts | 7 +- .../document-detail.component.html | 4 +- .../document-detail.component.scss | 8 +- .../document-detail.component.spec.ts | 6 +- .../document-detail.component.ts | 2 +- 21 files changed, 40 insertions(+), 1843 deletions(-) delete mode 100644 src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.html delete mode 100644 src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.scss delete mode 100644 src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.ts delete mode 100644 src-ui/src/app/components/common/pdf-viewer/typings.ts delete mode 100644 src-ui/src/app/components/common/pdf-viewer/utils/event-bus-utils.ts diff --git a/src-ui/angular.json b/src-ui/angular.json index 49e419879..4b1848953 100644 --- a/src-ui/angular.json +++ b/src-ui/angular.json @@ -76,8 +76,7 @@ ], "scripts": [], "allowedCommonJsDependencies": [ - "pdfjs-dist", - "pdfjs-dist/web/pdf_viewer", + "ng2-pdf-viewer", "filesize", "file-saver" ], diff --git a/src-ui/e2e/document-detail/document-detail.spec.ts b/src-ui/e2e/document-detail/document-detail.spec.ts index 0cd45a058..7f5b28c47 100644 --- a/src-ui/e2e/document-detail/document-detail.spec.ts +++ b/src-ui/e2e/document-detail/document-detail.spec.ts @@ -71,7 +71,7 @@ test('should show a mobile preview', async ({ page }) => { await page.setViewportSize({ width: 400, height: 1000 }) await expect(page.getByRole('tab', { name: 'Preview' })).toBeVisible() await page.getByRole('tab', { name: 'Preview' }).click() - await page.waitForSelector('pngx-pdf-viewer') + await page.waitForSelector('pdf-viewer') }) test('should show a list of notes', async ({ page }) => { diff --git a/src-ui/jest.config.js b/src-ui/jest.config.js index b544a4767..78edc0822 100644 --- a/src-ui/jest.config.js +++ b/src-ui/jest.config.js @@ -7,7 +7,6 @@ module.exports = { 'abstract-name-filter-service', 'abstract-paperless-service', ], - coveragePathIgnorePatterns: ['/src/app/components/common/pdf-viewer/*'], transformIgnorePatterns: [`/node_modules/(?!.*\\.mjs$|lodash-es)`], moduleNameMapper: { '^src/(.*)': '/src/$1', diff --git a/src-ui/package-lock.json b/src-ui/package-lock.json index 1f202938c..34549a35a 100644 --- a/src-ui/package-lock.json +++ b/src-ui/package-lock.json @@ -25,13 +25,13 @@ "bootstrap": "^5.3.3", "file-saver": "^2.0.5", "mime-names": "^1.0.0", + "ng2-pdf-viewer": "^10.2.1", "ngx-bootstrap-icons": "^1.9.3", "ngx-color": "^9.0.0", "ngx-cookie-service": "^17.1.0", "ngx-file-drop": "^16.0.0", "ngx-filesize": "^3.0.3", "ngx-ui-tour-ng-bootstrap": "^14.0.2", - "pdfjs-dist": "^3.11.174", "rxjs": "^7.8.1", "tslib": "^2.6.2", "uuid": "^9.0.1", @@ -14249,6 +14249,15 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/ng2-pdf-viewer": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/ng2-pdf-viewer/-/ng2-pdf-viewer-10.2.1.tgz", + "integrity": "sha512-FaKuOmAfI9y/28m+iW9kZLVPQ9IOMRsv4t9NTp4wfXWcTpkL90Z3Ih9w/UcG9rF3dQwsYD00zvyOII7lMfCInQ==", + "dependencies": { + "pdfjs-dist": "^3.11.174", + "tslib": "^2.3.0" + } + }, "node_modules/ngx-bootstrap-icons": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/ngx-bootstrap-icons/-/ngx-bootstrap-icons-1.9.3.tgz", diff --git a/src-ui/package.json b/src-ui/package.json index af8187877..340180765 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -27,13 +27,13 @@ "bootstrap": "^5.3.3", "file-saver": "^2.0.5", "mime-names": "^1.0.0", + "ng2-pdf-viewer": "^10.2.1", "ngx-bootstrap-icons": "^1.9.3", "ngx-color": "^9.0.0", "ngx-cookie-service": "^17.1.0", "ngx-file-drop": "^16.0.0", "ngx-filesize": "^3.0.3", "ngx-ui-tour-ng-bootstrap": "^14.0.2", - "pdfjs-dist": "^3.11.174", "rxjs": "^7.8.1", "tslib": "^2.6.2", "uuid": "^9.0.1", diff --git a/src-ui/src/app/app.module.ts b/src-ui/src/app/app.module.ts index 24d63ed11..bb5a62249 100644 --- a/src-ui/src/app/app.module.ts +++ b/src-ui/src/app/app.module.ts @@ -105,7 +105,7 @@ import { CustomFieldsComponent } from './components/manage/custom-fields/custom- import { CustomFieldEditDialogComponent } from './components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component' import { CustomFieldsDropdownComponent } from './components/common/custom-fields-dropdown/custom-fields-dropdown.component' import { ProfileEditDialogComponent } from './components/common/profile-edit-dialog/profile-edit-dialog.component' -import { PdfViewerComponent } from './components/common/pdf-viewer/pdf-viewer.component' +import { PdfViewerModule } from 'ng2-pdf-viewer' import { DocumentLinkComponent } from './components/common/input/document-link/document-link.component' import { PreviewPopupComponent } from './components/common/preview-popup/preview-popup.component' import { SwitchComponent } from './components/common/input/switch/switch.component' @@ -475,7 +475,6 @@ function initializeApp(settings: SettingsService) { CustomFieldEditDialogComponent, CustomFieldsDropdownComponent, ProfileEditDialogComponent, - PdfViewerComponent, DocumentLinkComponent, PreviewPopupComponent, SwitchComponent, @@ -500,6 +499,7 @@ function initializeApp(settings: SettingsService) { HttpClientModule, FormsModule, ReactiveFormsModule, + PdfViewerModule, NgxFileDropModule, NgSelectModule, ColorSliderModule, diff --git a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html index a0f7795ff..d73e97817 100644 --- a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html +++ b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.html @@ -13,12 +13,12 @@
of {{totalPages}}
- - +
diff --git a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.scss b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.scss index 0f9feacc1..e9d62c42b 100644 --- a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.scss +++ b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.scss @@ -2,7 +2,7 @@ background-color: gray; height: 350px; - pngx-pdf-viewer { + pdf-viewer { width: 100%; height: 100%; } diff --git a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.spec.ts b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.spec.ts index b88835895..27f458537 100644 --- a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.spec.ts @@ -6,7 +6,7 @@ import { ReactiveFormsModule, FormsModule } from '@angular/forms' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { DocumentService } from 'src/app/services/rest/document.service' -import { PdfViewerComponent } from '../../pdf-viewer/pdf-viewer.component' +import { PdfViewerModule } from 'ng2-pdf-viewer' describe('SplitConfirmDialogComponent', () => { let component: SplitConfirmDialogComponent @@ -15,13 +15,14 @@ describe('SplitConfirmDialogComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [SplitConfirmDialogComponent, PdfViewerComponent], + declarations: [SplitConfirmDialogComponent], providers: [NgbActiveModal], imports: [ HttpClientTestingModule, NgxBootstrapIconsModule.pick(allIcons), ReactiveFormsModule, FormsModule, + PdfViewerModule, ], }).compileComponents() diff --git a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.ts b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.ts index 42b574b93..47261afa2 100644 --- a/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.ts +++ b/src-ui/src/app/components/common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component.ts @@ -2,7 +2,7 @@ import { Component } from '@angular/core' import { ConfirmDialogComponent } from '../confirm-dialog.component' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { DocumentService } from 'src/app/services/rest/document.service' -import { PDFDocumentProxy } from '../../pdf-viewer/typings' +import { PDFDocumentProxy } from 'ng2-pdf-viewer' @Component({ selector: 'pngx-split-confirm-dialog', diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.html b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.html deleted file mode 100644 index cd2c85af5..000000000 --- a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
-
-
diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.scss b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.scss deleted file mode 100644 index 408bbb0a0..000000000 --- a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.scss +++ /dev/null @@ -1,1014 +0,0 @@ -/** - * This file is taken and modified from https://github.com/VadimDez/ng2-pdf-viewer/blob/10.0.0/src/app/pdf-viewer/pdf-viewer.component.scss - * Created by vadimdez on 21/06/16. - */ -.pngx-pdf-viewer-container { - overflow-x: auto; - position: absolute; - height: 100%; - width: 100%; - -webkit-overflow-scrolling: touch; - } - - :host { - display: block; - position: relative; - } - - :host ::ng-deep { - /* Copyright 2014 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - --pdfViewer-padding-bottom: 0; - --page-margin: 1px auto -8px; - --page-border: none; - --spreadHorizontalWrapped-margin-LR: -3.5px; - --viewer-container-height: 0; - --annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,"); - --xfa-unfocused-field-background: var( - --annotation-unfocused-field-background - ); - --page-border-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAA1ElEQVQ4jbWUWw6EIAxFy2NFs/8NzR4UJhpqLsdi5mOmSSMUOfYWqv3S0gMr4XlYH/64gZa/gN3ANYA7KAXALt4ktoQ5MI9YxqaG8bWmsIysMuT6piSQCa4whZThCu8CM4zP9YJaKci9jicPq3NcBWYoPMGUlhG7ivtkB+gVyFY75wXghOvh8t5mto1Mdim6e+MBqH6XsY+YAwjpq3vGF7weTWQptLEDVCZvPTMl5JZZsdh47FHW6qFMyvLYqjcnmdFfY9Xk/KDOlzCusX2mi/ofM7MPkzBcSp4Q1/wAAAAASUVORK5CYII=') - 9 9 repeat; - --scale-factor: 1; - - --focus-outline: solid 2px blue; - --hover-outline: dashed 2px blue; - --freetext-line-height: 1.35; - --freetext-padding: 2px; - --editorInk-editing-cursor: pointer; - - @media screen and (forced-colors: active) { - --pdfViewer-padding-bottom: 9px; - --page-margin: 8px auto -1px; - --page-border: 1px solid CanvasText; - --page-border-image: none; - --spreadHorizontalWrapped-margin-LR: 3.5px; - } - - @media (forced-colors: active) { - --focus-outline: solid 3px ButtonText; - --hover-outline: dashed 3px ButtonText; - } - - .textLayer { - position: absolute; - text-align: initial; - left: 0; - top: 0; - right: 0; - bottom: 0; - overflow: hidden; - opacity: 0.2; - line-height: 1; - -webkit-text-size-adjust: none; - -moz-text-size-adjust: none; - text-size-adjust: none; - forced-color-adjust: none; - } - - .textLayer span, - .textLayer br { - color: transparent; - position: absolute; - white-space: pre; - cursor: text; - transform-origin: 0% 0%; - } - - /* Only necessary in Google Chrome, see issue 14205, and most unfortunately - * the problem doesn't show up in "text" reference tests. */ - .textLayer span.markedContent { - top: 0; - height: 0; - } - - .textLayer .highlight { - margin: -1px; - padding: 1px; - background-color: rgba(180, 0, 170, 1); - border-radius: 4px; - } - - .textLayer .highlight.appended { - position: initial; - } - - .textLayer .highlight.begin { - border-radius: 4px 0 0 4px; - } - - .textLayer .highlight.end { - border-radius: 0 4px 4px 0; - } - - .textLayer .highlight.middle { - border-radius: 0; - } - - .textLayer .highlight.selected { - background-color: rgba(0, 100, 0, 1); - } - - .textLayer ::-moz-selection { - background: rgba(0, 0, 255, 1); - } - - .textLayer ::selection { - background: rgba(0, 0, 255, 1); - } - - /* Avoids https://github.com/mozilla/pdf.js/issues/13840 in Chrome */ - .textLayer br::-moz-selection { - background: transparent; - } - - .textLayer br::selection { - background: transparent; - } - - .textLayer .endOfContent { - display: block; - position: absolute; - left: 0; - top: 100%; - right: 0; - bottom: 0; - z-index: -1; - cursor: default; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - } - - .textLayer .endOfContent.active { - top: 0; - } - - @media (forced-colors: active) { - .annotationLayer .textWidgetAnnotation input:required, - .annotationLayer .textWidgetAnnotation textarea:required, - .annotationLayer .choiceWidgetAnnotation select:required, - .annotationLayer .buttonWidgetAnnotation.checkBox input:required, - .annotationLayer .buttonWidgetAnnotation.radioButton input:required { - outline: 1.5px solid selectedItem; - } - } - - .annotationLayer { - position: absolute; - top: 0; - left: 0; - pointer-events: none; - transform-origin: 0 0; - } - - .annotationLayer section { - position: absolute; - text-align: initial; - pointer-events: auto; - box-sizing: border-box; - transform-origin: 0 0; - } - - .annotationLayer .linkAnnotation > a, - .annotationLayer .buttonWidgetAnnotation.pushButton > a { - position: absolute; - font-size: 1em; - top: 0; - left: 0; - width: 100%; - height: 100%; - } - - .annotationLayer .buttonWidgetAnnotation.pushButton > canvas { - width: 100%; - height: 100%; - } - - .annotationLayer .linkAnnotation > a:hover, - .annotationLayer .buttonWidgetAnnotation.pushButton > a:hover { - opacity: 0.2; - background: rgba(255, 255, 0, 1); - box-shadow: 0 2px 10px rgba(255, 255, 0, 1); - } - - .annotationLayer .textAnnotation img { - position: absolute; - cursor: pointer; - width: 100%; - height: 100%; - } - - .annotationLayer .textWidgetAnnotation input, - .annotationLayer .textWidgetAnnotation textarea, - .annotationLayer .choiceWidgetAnnotation select, - .annotationLayer .buttonWidgetAnnotation.checkBox input, - .annotationLayer .buttonWidgetAnnotation.radioButton input { - background-image: var(--annotation-unfocused-field-background); - border: 1px solid transparent; - box-sizing: border-box; - font: calc(9px * var(--scale-factor)) sans-serif; - height: 100%; - margin: 0; - vertical-align: top; - width: 100%; - } - - .annotationLayer .textWidgetAnnotation input:required, - .annotationLayer .textWidgetAnnotation textarea:required, - .annotationLayer .choiceWidgetAnnotation select:required, - .annotationLayer .buttonWidgetAnnotation.checkBox input:required, - .annotationLayer .buttonWidgetAnnotation.radioButton input:required { - outline: 1.5px solid red; - } - - .annotationLayer .choiceWidgetAnnotation select option { - padding: 0; - } - - .annotationLayer .buttonWidgetAnnotation.radioButton input { - border-radius: 50%; - } - - .annotationLayer .textWidgetAnnotation textarea { - resize: none; - } - - .annotationLayer .textWidgetAnnotation input[disabled], - .annotationLayer .textWidgetAnnotation textarea[disabled], - .annotationLayer .choiceWidgetAnnotation select[disabled], - .annotationLayer .buttonWidgetAnnotation.checkBox input[disabled], - .annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] { - background: none; - border: 1px solid transparent; - cursor: not-allowed; - } - - .annotationLayer .textWidgetAnnotation input:hover, - .annotationLayer .textWidgetAnnotation textarea:hover, - .annotationLayer .choiceWidgetAnnotation select:hover, - .annotationLayer .buttonWidgetAnnotation.checkBox input:hover, - .annotationLayer .buttonWidgetAnnotation.radioButton input:hover { - border: 1px solid rgba(0, 0, 0, 1); - } - - .annotationLayer .textWidgetAnnotation input:focus, - .annotationLayer .textWidgetAnnotation textarea:focus, - .annotationLayer .choiceWidgetAnnotation select:focus { - background: none; - border: 1px solid transparent; - } - - .annotationLayer .textWidgetAnnotation input :focus, - .annotationLayer .textWidgetAnnotation textarea :focus, - .annotationLayer .choiceWidgetAnnotation select :focus, - .annotationLayer .buttonWidgetAnnotation.checkBox :focus, - .annotationLayer .buttonWidgetAnnotation.radioButton :focus { - background-image: none; - background-color: transparent; - outline: auto; - } - - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before, - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after, - .annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before { - background-color: CanvasText; - content: ''; - display: block; - position: absolute; - } - - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before, - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after { - height: 80%; - left: 45%; - width: 1px; - } - - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before { - transform: rotate(45deg); - } - - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after { - transform: rotate(-45deg); - } - - .annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before { - border-radius: 50%; - height: 50%; - left: 30%; - top: 20%; - width: 50%; - } - - .annotationLayer .textWidgetAnnotation input.comb { - font-family: monospace; - padding-left: 2px; - padding-right: 0; - } - - .annotationLayer .textWidgetAnnotation input.comb:focus { - /* - * Letter spacing is placed on the right side of each character. Hence, the - * letter spacing of the last character may be placed outside the visible - * area, causing horizontal scrolling. We avoid this by extending the width - * when the element has focus and revert this when it loses focus. - */ - width: 103%; - } - - .annotationLayer .buttonWidgetAnnotation.checkBox input, - .annotationLayer .buttonWidgetAnnotation.radioButton input { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - } - - .annotationLayer .popupTriggerArea { - height: 100%; - width: 100%; - } - - .annotationLayer .popupWrapper { - position: absolute; - font-size: calc(9px * var(--scale-factor)); - width: 100%; - min-width: calc(180px * var(--scale-factor)); - pointer-events: none; - } - - .annotationLayer .popup { - position: absolute; - max-width: calc(180px * var(--scale-factor)); - background-color: rgba(255, 255, 153, 1); - box-shadow: 0 calc(2px * var(--scale-factor)) - calc(5px * var(--scale-factor)) rgba(136, 136, 136, 1); - border-radius: calc(2px * var(--scale-factor)); - padding: calc(6px * var(--scale-factor)); - margin-left: calc(5px * var(--scale-factor)); - cursor: pointer; - font: message-box; - white-space: normal; - word-wrap: break-word; - pointer-events: auto; - } - - .annotationLayer .popup > * { - font-size: calc(9px * var(--scale-factor)); - } - - .annotationLayer .popup h1 { - display: inline-block; - } - - .annotationLayer .popupDate { - display: inline-block; - margin-left: calc(5px * var(--scale-factor)); - } - - .annotationLayer .popupContent { - border-top: 1px solid rgba(51, 51, 51, 1); - margin-top: calc(2px * var(--scale-factor)); - padding-top: calc(2px * var(--scale-factor)); - } - - .annotationLayer .richText > * { - white-space: pre-wrap; - font-size: calc(9px * var(--scale-factor)); - } - - .annotationLayer .highlightAnnotation, - .annotationLayer .underlineAnnotation, - .annotationLayer .squigglyAnnotation, - .annotationLayer .strikeoutAnnotation, - .annotationLayer .freeTextAnnotation, - .annotationLayer .lineAnnotation svg line, - .annotationLayer .squareAnnotation svg rect, - .annotationLayer .circleAnnotation svg ellipse, - .annotationLayer .polylineAnnotation svg polyline, - .annotationLayer .polygonAnnotation svg polygon, - .annotationLayer .caretAnnotation, - .annotationLayer .inkAnnotation svg polyline, - .annotationLayer .stampAnnotation, - .annotationLayer .fileAttachmentAnnotation { - cursor: pointer; - } - - .annotationLayer section svg { - position: absolute; - width: 100%; - height: 100%; - } - - .annotationLayer .annotationTextContent { - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - color: transparent; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - pointer-events: none; - } - - .annotationLayer .annotationTextContent span { - width: 100%; - display: inline-block; - } - - @media (forced-colors: active) { - .xfaLayer *:required { - outline: 1.5px solid selectedItem; - } - } - - .xfaLayer .highlight { - margin: -1px; - padding: 1px; - background-color: rgba(239, 203, 237, 1); - border-radius: 4px; - } - - .xfaLayer .highlight.appended { - position: initial; - } - - .xfaLayer .highlight.begin { - border-radius: 4px 0 0 4px; - } - - .xfaLayer .highlight.end { - border-radius: 0 4px 4px 0; - } - - .xfaLayer .highlight.middle { - border-radius: 0; - } - - .xfaLayer .highlight.selected { - background-color: rgba(203, 223, 203, 1); - } - - .xfaLayer ::-moz-selection { - background: rgba(0, 0, 255, 1); - } - - .xfaLayer ::selection { - background: rgba(0, 0, 255, 1); - } - - .xfaPage { - overflow: hidden; - position: relative; - } - - .xfaContentarea { - position: absolute; - } - - .xfaPrintOnly { - display: none; - } - - .xfaLayer { - position: absolute; - text-align: initial; - top: 0; - left: 0; - transform-origin: 0 0; - line-height: 1.2; - } - - .xfaLayer * { - color: inherit; - font: inherit; - font-style: inherit; - font-weight: inherit; - font-kerning: inherit; - letter-spacing: -0.01px; - text-align: inherit; - text-decoration: inherit; - box-sizing: border-box; - background-color: transparent; - padding: 0; - margin: 0; - pointer-events: auto; - line-height: inherit; - } - - .xfaLayer *:required { - outline: 1.5px solid red; - } - - .xfaLayer div { - pointer-events: none; - } - - .xfaLayer svg { - pointer-events: none; - } - - .xfaLayer svg * { - pointer-events: none; - } - - .xfaLayer a { - color: blue; - } - - .xfaRich li { - margin-left: 3em; - } - - .xfaFont { - color: black; - font-weight: normal; - font-kerning: none; - font-size: 10px; - font-style: normal; - letter-spacing: 0; - text-decoration: none; - vertical-align: 0; - } - - .xfaCaption { - overflow: hidden; - flex: 0 0 auto; - } - - .xfaCaptionForCheckButton { - overflow: hidden; - flex: 1 1 auto; - } - - .xfaLabel { - height: 100%; - width: 100%; - } - - .xfaLeft { - display: flex; - flex-direction: row; - align-items: center; - } - - .xfaRight { - display: flex; - flex-direction: row-reverse; - align-items: center; - } - - .xfaLeft > .xfaCaption, - .xfaLeft > .xfaCaptionForCheckButton, - .xfaRight > .xfaCaption, - .xfaRight > .xfaCaptionForCheckButton { - max-height: 100%; - } - - .xfaTop { - display: flex; - flex-direction: column; - align-items: flex-start; - } - - .xfaBottom { - display: flex; - flex-direction: column-reverse; - align-items: flex-start; - } - - .xfaTop > .xfaCaption, - .xfaTop > .xfaCaptionForCheckButton, - .xfaBottom > .xfaCaption, - .xfaBottom > .xfaCaptionForCheckButton { - width: 100%; - } - - .xfaBorder { - background-color: transparent; - position: absolute; - pointer-events: none; - } - - .xfaWrapped { - width: 100%; - height: 100%; - } - - .xfaTextfield:focus, - .xfaSelect:focus { - background-image: none; - background-color: transparent; - outline: auto; - outline-offset: -1px; - } - - .xfaCheckbox:focus, - .xfaRadio:focus { - outline: auto; - } - - .xfaTextfield, - .xfaSelect { - height: 100%; - width: 100%; - flex: 1 1 auto; - border: none; - resize: none; - background-image: var(--xfa-unfocused-field-background); - } - - .xfaTop > .xfaTextfield, - .xfaTop > .xfaSelect, - .xfaBottom > .xfaTextfield, - .xfaBottom > .xfaSelect { - flex: 0 1 auto; - } - - .xfaButton { - cursor: pointer; - width: 100%; - height: 100%; - border: none; - text-align: center; - } - - .xfaLink { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - } - - .xfaCheckbox, - .xfaRadio { - width: 100%; - height: 100%; - flex: 0 0 auto; - border: none; - } - - .xfaRich { - white-space: pre-wrap; - width: 100%; - height: 100%; - } - - .xfaImage { - -o-object-position: left top; - object-position: left top; - -o-object-fit: contain; - object-fit: contain; - width: 100%; - height: 100%; - } - - .xfaLrTb, - .xfaRlTb, - .xfaTb { - display: flex; - flex-direction: column; - align-items: stretch; - } - - .xfaLr { - display: flex; - flex-direction: row; - align-items: stretch; - } - - .xfaRl { - display: flex; - flex-direction: row-reverse; - align-items: stretch; - } - - .xfaTb > div { - justify-content: left; - } - - .xfaPosition { - position: relative; - } - - .xfaArea { - position: relative; - } - - .xfaValignMiddle { - display: flex; - align-items: center; - } - - .xfaTable { - display: flex; - flex-direction: column; - align-items: stretch; - } - - .xfaTable .xfaRow { - display: flex; - flex-direction: row; - align-items: stretch; - } - - .xfaTable .xfaRlRow { - display: flex; - flex-direction: row-reverse; - align-items: stretch; - flex: 1; - } - - .xfaTable .xfaRlRow > div { - flex: 1; - } - - .xfaNonInteractive input, - .xfaNonInteractive textarea, - .xfaDisabled input, - .xfaDisabled textarea, - .xfaReadOnly input, - .xfaReadOnly textarea { - background: initial; - } - - @media print { - .xfaTextfield, - .xfaSelect { - background: transparent; - } - - .xfaSelect { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - text-indent: 1px; - text-overflow: ''; - } - } - - [data-editor-rotation='90'] { - transform: rotate(90deg); - } - [data-editor-rotation='180'] { - transform: rotate(180deg); - } - [data-editor-rotation='270'] { - transform: rotate(270deg); - } - - .annotationEditorLayer { - background: transparent; - position: absolute; - top: 0; - left: 0; - font-size: calc(100px * var(--scale-factor)); - transform-origin: 0 0; - } - - .annotationEditorLayer .selectedEditor { - outline: var(--focus-outline); - resize: none; - } - - .annotationEditorLayer .freeTextEditor { - position: absolute; - background: transparent; - border-radius: 3px; - padding: calc(var(--freetext-padding) * var(--scale-factor)); - resize: none; - width: auto; - height: auto; - z-index: 1; - transform-origin: 0 0; - touch-action: none; - } - - .annotationEditorLayer .freeTextEditor .internal { - background: transparent; - border: none; - top: 0; - left: 0; - overflow: visible; - white-space: nowrap; - resize: none; - font: 10px sans-serif; - line-height: var(--freetext-line-height); - } - - .annotationEditorLayer .freeTextEditor .overlay { - position: absolute; - display: none; - background: transparent; - top: 0; - left: 0; - width: 100%; - height: 100%; - } - - .annotationEditorLayer .freeTextEditor .overlay.enabled { - display: block; - } - - .annotationEditorLayer .freeTextEditor .internal:empty::before { - content: attr(default-content); - color: gray; - } - - .annotationEditorLayer .freeTextEditor .internal:focus { - outline: none; - } - - .annotationEditorLayer .inkEditor.disabled { - resize: none; - } - - .annotationEditorLayer .inkEditor.disabled.selectedEditor { - resize: horizontal; - } - - .annotationEditorLayer .freeTextEditor:hover:not(.selectedEditor), - .annotationEditorLayer .inkEditor:hover:not(.selectedEditor) { - outline: var(--hover-outline); - } - - .annotationEditorLayer .inkEditor { - position: absolute; - background: transparent; - border-radius: 3px; - overflow: auto; - width: 100%; - height: 100%; - z-index: 1; - transform-origin: 0 0; - cursor: auto; - } - - .annotationEditorLayer .inkEditor.editing { - resize: none; - cursor: var(--editorInk-editing-cursor), pointer; - } - - .annotationEditorLayer .inkEditor .inkEditorCanvas { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - touch-action: none; - } - - [data-main-rotation='90'] { - transform: rotate(90deg) translateY(-100%); - } - [data-main-rotation='180'] { - transform: rotate(180deg) translate(-100%, -100%); - } - [data-main-rotation='270'] { - transform: rotate(270deg) translateX(-100%); - } - - .pdfViewer { - padding-bottom: var(--pdfViewer-padding-bottom); - } - - .pdfViewer .canvasWrapper { - overflow: hidden; - } - - .pdfViewer .page { - direction: ltr; - width: 816px; - height: 1056px; - margin: var(--page-margin); - position: relative; - overflow: visible; - border: var(--page-border); - -o-border-image: var(--page-border-image); - border-image: var(--page-border-image); - background-clip: content-box; - background-color: rgba(255, 255, 255, 1); - } - - .pdfViewer .dummyPage { - position: relative; - width: 0; - height: var(--viewer-container-height); - } - - .pdfViewer.removePageBorders .page { - margin: 0 auto 10px; - border: none; - } - - .pdfViewer.singlePageView { - display: inline-block; - } - - .pdfViewer.singlePageView .page { - margin: 0; - border: none; - } - - .pdfViewer.scrollHorizontal, - .pdfViewer.scrollWrapped, - .spread { - margin-left: 3.5px; - margin-right: 3.5px; - text-align: center; - } - - .pdfViewer.scrollHorizontal, - .spread { - white-space: nowrap; - } - - .pdfViewer.removePageBorders, - .pdfViewer.scrollHorizontal .spread, - .pdfViewer.scrollWrapped .spread { - margin-left: 0; - margin-right: 0; - } - - .spread .page, - .spread .dummyPage, - .pdfViewer.scrollHorizontal .page, - .pdfViewer.scrollWrapped .page, - .pdfViewer.scrollHorizontal .spread, - .pdfViewer.scrollWrapped .spread { - display: inline-block; - vertical-align: middle; - } - - .spread .page, - .pdfViewer.scrollHorizontal .page, - .pdfViewer.scrollWrapped .page { - margin-left: var(--spreadHorizontalWrapped-margin-LR); - margin-right: var(--spreadHorizontalWrapped-margin-LR); - } - - .pdfViewer.removePageBorders .spread .page, - .pdfViewer.removePageBorders.scrollHorizontal .page, - .pdfViewer.removePageBorders.scrollWrapped .page { - margin-left: 5px; - margin-right: 5px; - } - - .pdfViewer .page canvas { - margin: 0; - display: block; - } - - .pdfViewer .page canvas[hidden] { - display: none; - } - - .pdfViewer .page .loadingIcon { - position: absolute; - display: block; - left: 0; - top: 0; - right: 0; - bottom: 0; - background: url('data:image/gif;base64,R0lGODlhGAAYAPQQAM7Ozvr6+uDg4LCwsOjo6I6OjsjIyJycnNjY2KioqMDAwPLy8nZ2doaGhri4uGhoaP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/ilPcHRpbWl6ZWQgd2l0aCBodHRwczovL2V6Z2lmLmNvbS9vcHRpbWl6ZQAh+QQJBwAQACwAAAAAGAAYAAAFmiAkjiTkOGVaBgjZNGSgkgKjjM8zLoI8iy+BKCdiCX8iBeMAhEEIPRXLxViYUE9CbCQoFAzFhHY3zkaT3oPvBz1zE4UBsr1eWZH4vAowOBwGAHk8AoQLfH6Agm0Ed3qOAXWOIgQKiWyFJQgDgJEpdG+WEACNEFNFmKVlVzJQk6qdkwqBoi1mebJ3ALNGeIZHtGSwNDS1RZKueCEAIfkECQcAEAAsAAAAABgAGAAABZcgJI4kpChlWgYCWRQkEKgjURgjw4zOg9CjVwuiEyEeO6CxkBC9nA+HiuUqLEyoBZI0Mx4SAFFgQCDZuguBoGv6Dtg0gvpqdhxQQDkBzuUr/4A1JwMKP39pc2mDhYCIc4GQYn6QCwCMeY91l0p6dBAEJ0OfcFRimZ91Mwt0alxxAIZyRmuAsKxDLKKvZbM1tJxmvGKRpn8hACH5BAkHABAALAAAAAAYABgAAAWhICSOJGQYZVoGAnkcJBKoI3EAY1GMCtPSosSBINKJBIwGkHdwBGGQA0OhYpEGQxNqkYzNIITBACEKKBaxxNfBeOCO4vMy0Hg8nDHFeCktkKtfNAtoS4UqAicKBj9zBAKPC4iKi4aRkISGmWWBmjUIAIyHkCUEAKCVo2WmREecVqoCgZhgP4NHrGWCj7e3szSpuxAsoVWxnp6cVV4kyZW+KSEAIfkECQcAEAAsAAAAABgAGAAABZkgJI4kBABlWgYEOQykEKgjMSDjcYxG0dKi108nEhQKQN4rCIMkCgbawjWYnSCLY2yGVSgEooBhWqsGGwxc0RtNBgoMhmJ1QgETjANYFeBKyUmBKQQIdT9JDmgPDQ6EhoKJD4sOgpWWgiwChyqEBH5hmptSoSOZgJ4kLKWkYTF7C2SaqaM/hEWygay4mYG8t6uffFuzl1iANCEAIfkECQcAEAAsAAAAABgAGAAABZ0gJI4khCBlmhKkopBCoI6LIozDMAIHO4uuBVBnOiR+I4FrCDwAZsKdQnaCLIwwmRUA8JmioprWUCjcwlwUMnAoG0qL03k2KCS8cC0UjOzDCQKBfHQFDAwFU4CCfgqFhy9+kZJWgzSKSAcPZn+BfQENDw8OljGWJAFeDoZPYTBnC1GdSXqnsoBolSulX2GyP6hgvnG0KrS3NJNhuSQhACH5BAkHABAALAAAAAAYABgAAAWaICSOJCQIZZoupGGQRKCOC0CMijIiwz2LABtQZxoMfjQhxAXszWQ7gOwECRhh0MCJJRJARTUoIHFAgbfI6uBwAJS01J/i4PClVYHvfV8lbLlIBmwFbQt+aGmChG18jXeGT4dICQxlb4g/AQUMDER9XjR6BAdiDQwINDBmkAsPDVh4cX4imw53iLKuaVqAcUsPqEiidkt6j4AzIQAh+QQJBwAQACwAAAAAGAAYAAAFmSAkjiREEGWaBiSCtCoZCMsIAKOg1LEo0KKbaKFQ9EYLoOkFuQlirNxzCQkUW9GZ0hQd4nyDAWr4G/esYSbyZFYZwu3jqiuvr8u8I2BwOAwASXh1e31/doeHC3klWnElfAlTd46MfQUGk2stCVEGBQWSdCciDg5VDAVYKoEiDQ0iBwxGcj9RDw8+qHIzebc2DJJQJK6qiKVyIQAh+QQJBwAQACwAAAAAGAAYAAAFmSAkjiS0LGWaBiRBtCoZCKgoCCMB1DF0sz6cCQDo5W62l28XAyZFpyECBv3lnCbhUqHMIo0Qg4Jbmn1jRCa4iV27TzfXGjEecOFWMN1OdvvfPGUuXSoKBw6EXokrAwcHRVU0UAeEBANAAAmUI1gNDyhjJgUHLW0iDg8FIqOnBQZrDA9TELE2rEYIDw4jta2LMpCrqld/YQpgIQAh+QQJBwAQACwAAAAAGAAYAAAFmyAkjiS0LGWaBiRBkKw6BgIqCsJcyyMe4yJajhcEml5H26o1PN2QQd3uFiv2AADlAgflIbDdZLgkABOJgep5LfWty4p4zeU+w+XsvJWXliEKDwdEBgMKYQ4PDw1qK3EDCCMAiQ5BCV0LCj+FSDQkgCgGBiYHAy2MIgoMghAHqw4HAGsNDEMFBTekdgwKI7aRB2MwkL2rVHoQoWchACH5BAkHABAALAAAAAAYABgAAAWWICSOJLQsZZoGJEGQrDoGAioKwlzLIx7jIlqOFwSaXkfbqjU83ZBB3e4WK0qrCxyU55peid0qcUwuixyNx6PhILsAcAJazXYj4lvz2MkLiFsHDAlEcABKZwwMBX8pBgoKQxAIigpBA1sLBj+PSDQkB4uSACYDlTMyBgWDEKVnl2QFBUigN61gBQYjtLV5JZ4jtlR6omMhACH5BAkHABAALAAAAAAYABgAAAWaICSOJLQsZZoGJEGQrDoGAioKwlzLIx7jIlqOFwSaXkdbidYanm7I4AjwYDh6saJuJ3JUG1mZi9srPA7EcRimJLrfJYWZUVC8TziXnEG3u/E+cIJaPAFrPQl1aQAIbRAGBZGHJQiMUQKRBkEKbQsAPZaEXQcslSYKmjMyAAdXj34ACkNEiUgDA5t+PAQHn6Ogjkuzry2DNwhuIQAh+QQFBwAQACwAAAAAGAAYAAAFnCAkjiS0LGVaBgBJEGSguo8zCsK4CPIsMg+ECCcKEH0ix6MwhJl4KiOp8UCdmrEbo6EoHpxF8A6aBBZ6vhf5dmAkkGr0CoWs21WGQ2FvsI9xC3l7B311fy93iWGKJQQOhHCAJQB6A3IqcWwJLU90i2FkUiMKlhBELEI6MwgDXRAGhQgAYD6tTqRFAJxpA6mvrqazSKJJhUWMpjlIIQA7') - center no-repeat; - } - - .pdfViewer .page .loadingIcon.notVisible { - background: none; - } - - .pdfViewer.enablePermissions .textLayer span { - -webkit-user-select: none !important; - -moz-user-select: none !important; - user-select: none !important; - cursor: not-allowed; - } - - .pdfPresentationMode .pdfViewer { - padding-bottom: 0; - } - - .pdfPresentationMode .spread { - margin: 0; - } - - .pdfPresentationMode .pdfViewer .page { - margin: 0 auto; - border: 2px solid transparent; - } - } diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.ts b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.ts deleted file mode 100644 index 0c84521c6..000000000 --- a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.ts +++ /dev/null @@ -1,600 +0,0 @@ -/** - * This file is taken and modified from https://github.com/VadimDez/ng2-pdf-viewer/blob/10.0.0/src/app/pdf-viewer/pdf-viewer.component.ts - * Created by vadimdez on 21/06/16. - */ -import { - Component, - Input, - Output, - ElementRef, - EventEmitter, - OnChanges, - SimpleChanges, - OnInit, - OnDestroy, - ViewChild, - AfterViewChecked, - NgZone, -} from '@angular/core' -import { from, fromEvent, Subject } from 'rxjs' -import { debounceTime, filter, takeUntil } from 'rxjs/operators' -import * as PDFJS from 'pdfjs-dist' -import * as PDFJSViewer from 'pdfjs-dist/web/pdf_viewer' - -import { createEventBus } from './utils/event-bus-utils' - -import type { - PDFSource, - PDFPageProxy, - PDFProgressData, - PDFDocumentProxy, - PDFDocumentLoadingTask, - PDFViewerOptions, - ZoomScale, -} from './typings' -import { PDFSinglePageViewer } from 'pdfjs-dist/web/pdf_viewer' - -PDFJS['verbosity'] = PDFJS.VerbosityLevel.ERRORS - -export enum RenderTextMode { - DISABLED, - ENABLED, - ENHANCED, -} - -@Component({ - selector: 'pngx-pdf-viewer', - templateUrl: './pdf-viewer.component.html', - styleUrls: ['./pdf-viewer.component.scss'], -}) -export class PdfViewerComponent - implements OnChanges, OnInit, OnDestroy, AfterViewChecked -{ - static CSS_UNITS = 96.0 / 72.0 - static BORDER_WIDTH = 9 - - @ViewChild('pdfViewerContainer') - pdfViewerContainer!: ElementRef - - public eventBus!: PDFJSViewer.EventBus - public pdfLinkService!: PDFJSViewer.PDFLinkService - public pdfViewer!: PDFJSViewer.PDFViewer | PDFSinglePageViewer - - private isVisible = false - - private _cMapsUrl = - typeof PDFJS !== 'undefined' - ? `https://unpkg.com/pdfjs-dist@${(PDFJS as any).version}/cmaps/` - : null - private _imageResourcesPath = - typeof PDFJS !== 'undefined' - ? `https://unpkg.com/pdfjs-dist@${(PDFJS as any).version}/web/images/` - : undefined - private _renderText = true - private _renderTextMode: RenderTextMode = RenderTextMode.ENABLED - private _stickToPage = false - private _originalSize = true - private _pdf: PDFDocumentProxy | undefined - private _page = 1 - private _zoom = 1 - private _zoomScale: ZoomScale = 'page-width' - private _rotation = 0 - private _showAll = true - private _canAutoResize = true - private _fitToPage = false - private _externalLinkTarget = 'blank' - private _showBorders = false - private lastLoaded!: string | Uint8Array | PDFSource | null - private _latestScrolledPage!: number - - private resizeTimeout: number | null = null - private pageScrollTimeout: number | null = null - private isInitialized = false - private loadingTask?: PDFDocumentLoadingTask | null - private destroy$ = new Subject() - - @Output('after-load-complete') afterLoadComplete = - new EventEmitter() - @Output('page-rendered') pageRendered = new EventEmitter() - @Output('pages-initialized') pageInitialized = new EventEmitter() - @Output('text-layer-rendered') textLayerRendered = - new EventEmitter() - @Output('error') onError = new EventEmitter() - @Output('on-progress') onProgress = new EventEmitter() - @Output() pageChange: EventEmitter = new EventEmitter(true) - @Input() src?: string | Uint8Array | PDFSource - - @Input('c-maps-url') - set cMapsUrl(cMapsUrl: string) { - this._cMapsUrl = cMapsUrl - } - - @Input('page') - set page(_page: number | string | any) { - _page = parseInt(_page, 10) || 1 - const originalPage = _page - - if (this._pdf) { - _page = this.getValidPageNumber(_page) - } - - this._page = _page - if (originalPage !== _page) { - this.pageChange.emit(_page) - } - } - - @Input('render-text') - set renderText(renderText: boolean) { - this._renderText = renderText - } - - @Input('render-text-mode') - set renderTextMode(renderTextMode: RenderTextMode) { - this._renderTextMode = renderTextMode - } - - @Input('original-size') - set originalSize(originalSize: boolean) { - this._originalSize = originalSize - } - - @Input('show-all') - set showAll(value: boolean) { - this._showAll = value - } - - @Input('stick-to-page') - set stickToPage(value: boolean) { - this._stickToPage = value - } - - @Input('zoom') - set zoom(value: number) { - if (value <= 0) { - return - } - - this._zoom = value - } - - get zoom() { - return this._zoom - } - - @Input('zoom-scale') - set zoomScale(value: ZoomScale) { - this._zoomScale = value - } - - get zoomScale() { - return this._zoomScale - } - - @Input('rotation') - set rotation(value: number) { - if (!(typeof value === 'number' && value % 90 === 0)) { - console.warn('Invalid pages rotation angle.') - return - } - - this._rotation = value - } - - @Input('external-link-target') - set externalLinkTarget(value: string) { - this._externalLinkTarget = value - } - - @Input('autoresize') - set autoresize(value: boolean) { - this._canAutoResize = Boolean(value) - } - - @Input('fit-to-page') - set fitToPage(value: boolean) { - this._fitToPage = Boolean(value) - } - - @Input('show-borders') - set showBorders(value: boolean) { - this._showBorders = Boolean(value) - } - - static getLinkTarget(type: string) { - switch (type) { - case 'blank': - return (PDFJSViewer as any).LinkTarget.BLANK - case 'none': - return (PDFJSViewer as any).LinkTarget.NONE - case 'self': - return (PDFJSViewer as any).LinkTarget.SELF - case 'parent': - return (PDFJSViewer as any).LinkTarget.PARENT - case 'top': - return (PDFJSViewer as any).LinkTarget.TOP - } - - return null - } - - constructor( - private element: ElementRef, - private ngZone: NgZone - ) { - PDFJS.GlobalWorkerOptions['workerSrc'] = 'assets/js/pdf.worker.min.js' - } - - ngAfterViewChecked(): void { - if (this.isInitialized) { - return - } - - const offset = this.pdfViewerContainer.nativeElement.offsetParent - - if (this.isVisible === true && offset == null) { - this.isVisible = false - return - } - - if (this.isVisible === false && offset != null) { - this.isVisible = true - - setTimeout(() => { - this.initialize() - this.ngOnChanges({ src: this.src } as any) - }) - } - } - - ngOnInit() { - this.initialize() - this.setupResizeListener() - } - - ngOnDestroy() { - this.clear() - this.destroy$.next() - this.loadingTask = null - } - - ngOnChanges(changes: SimpleChanges) { - if (!this.isVisible) { - return - } - - if ('src' in changes) { - this.loadPDF() - } else if (this._pdf) { - if ('renderText' in changes || 'showAll' in changes) { - this.setupViewer() - this.resetPdfDocument() - } - if ('page' in changes) { - const { page } = changes - if (page.currentValue === this._latestScrolledPage) { - return - } - - // New form of page changing: The viewer will now jump to the specified page when it is changed. - // This behavior is introduced by using the PDFSinglePageViewer - this.pdfViewer.scrollPageIntoView({ pageNumber: this._page }) - } - - this.update() - } - } - - public updateSize() { - from( - this._pdf!.getPage( - this.pdfViewer.currentPageNumber - ) as unknown as Promise - ) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (page: PDFPageProxy) => { - const rotation = this._rotation + page.rotate - const viewportWidth = - (page as any).getViewport({ - scale: this._zoom, - rotation, - }).width * PdfViewerComponent.CSS_UNITS - let scale = this._zoom - let stickToPage = true - - // Scale the document when it shouldn't be in original size or doesn't fit into the viewport - if ( - !this._originalSize || - (this._fitToPage && - viewportWidth > this.pdfViewerContainer.nativeElement.clientWidth) - ) { - const viewPort = (page as any).getViewport({ scale: 1, rotation }) - scale = this.getScale(viewPort.width, viewPort.height) - stickToPage = !this._stickToPage - } - - setTimeout(() => { - this.pdfViewer.currentScale = scale - }) - }, - }) - } - - public clear() { - if (this.loadingTask && !this.loadingTask.destroyed) { - this.loadingTask.destroy() - } - - if (this._pdf) { - this._latestScrolledPage = 0 - this._pdf.destroy() - this._pdf = undefined - } - } - - private getPDFLinkServiceConfig() { - const linkTarget = PdfViewerComponent.getLinkTarget( - this._externalLinkTarget - ) - - if (linkTarget) { - return { externalLinkTarget: linkTarget } - } - - return {} - } - - private initEventBus() { - this.eventBus = createEventBus(PDFJSViewer, this.destroy$) - - fromEvent(this.eventBus, 'pagerendered') - .pipe(takeUntil(this.destroy$)) - .subscribe((event) => { - this.pageRendered.emit(event) - }) - - fromEvent(this.eventBus, 'pagesinit') - .pipe(takeUntil(this.destroy$)) - .subscribe((event) => { - this.pageInitialized.emit(event) - }) - - fromEvent(this.eventBus, 'pagechanging') - .pipe(takeUntil(this.destroy$)) - .subscribe(({ pageNumber }: any) => { - if (this.pageScrollTimeout) { - clearTimeout(this.pageScrollTimeout) - } - - this.pageScrollTimeout = window.setTimeout(() => { - this._latestScrolledPage = pageNumber - this.pageChange.emit(pageNumber) - }, 100) - }) - - fromEvent(this.eventBus, 'textlayerrendered') - .pipe(takeUntil(this.destroy$)) - .subscribe((event) => { - this.textLayerRendered.emit(event) - }) - } - - private initPDFServices() { - this.pdfLinkService = new PDFJSViewer.PDFLinkService({ - eventBus: this.eventBus, - ...this.getPDFLinkServiceConfig(), - }) - } - - private getPDFOptions(): PDFViewerOptions { - return { - eventBus: this.eventBus, - container: this.element.nativeElement.querySelector('div')!, - removePageBorders: !this._showBorders, - linkService: this.pdfLinkService, - textLayerMode: this._renderText - ? this._renderTextMode - : RenderTextMode.DISABLED, - imageResourcesPath: this._imageResourcesPath, - } - } - - private setupViewer() { - PDFJS['disableTextLayer'] = !this._renderText - - this.initPDFServices() - - if (this._showAll) { - this.pdfViewer = new PDFJSViewer.PDFViewer(this.getPDFOptions()) - } else { - this.pdfViewer = new PDFJSViewer.PDFSinglePageViewer(this.getPDFOptions()) - } - this.pdfLinkService.setViewer(this.pdfViewer) - - this.pdfViewer._currentPageNumber = this._page - } - - private getValidPageNumber(page: number): number { - if (page < 1) { - return 1 - } - - if (page > this._pdf!.numPages) { - return this._pdf!.numPages - } - - return page - } - - private getDocumentParams() { - const srcType = typeof this.src - - if (!this._cMapsUrl) { - return this.src - } - - const params: any = { - cMapUrl: this._cMapsUrl, - cMapPacked: true, - enableXfa: true, - } - params.isEvalSupported = false - - if (srcType === 'string') { - params.url = this.src - } else if (srcType === 'object') { - if ((this.src as any).byteLength !== undefined) { - params.data = this.src - } else { - Object.assign(params, this.src) - } - } - - return params - } - - private loadPDF() { - if (!this.src) { - return - } - - if (this.lastLoaded === this.src) { - this.update() - return - } - - this.clear() - - if (this.pdfViewer) { - this.pdfViewer._resetView() - this.pdfViewer = null - } - - this.setupViewer() - - try { - this.loadingTask = PDFJS.getDocument(this.getDocumentParams()) - - this.loadingTask!.onProgress = (progressData: PDFProgressData) => { - this.onProgress.emit(progressData) - } - - const src = this.src - - from(this.loadingTask!.promise as Promise) - .pipe(takeUntil(this.destroy$)) - .subscribe({ - next: (pdf) => { - this._pdf = pdf - this.lastLoaded = src - - this.afterLoadComplete.emit(pdf) - this.resetPdfDocument() - - this.update() - }, - error: (error) => { - this.lastLoaded = null - this.onError.emit(error) - }, - }) - } catch (e) { - this.onError.emit(e) - } - } - - private update() { - this.page = this._page - - this.render() - } - - private render() { - this._page = this.getValidPageNumber(this._page) - - if ( - this._rotation !== 0 || - this.pdfViewer.pagesRotation !== this._rotation - ) { - setTimeout(() => { - this.pdfViewer.pagesRotation = this._rotation - }) - } - - if (this._stickToPage) { - setTimeout(() => { - this.pdfViewer.currentPageNumber = this._page - }) - } - - this.updateSize() - } - - private getScale(viewportWidth: number, viewportHeight: number) { - const borderSize = this._showBorders - ? 2 * PdfViewerComponent.BORDER_WIDTH - : 0 - const pdfContainerWidth = - this.pdfViewerContainer.nativeElement.clientWidth - borderSize - const pdfContainerHeight = - this.pdfViewerContainer.nativeElement.clientHeight - borderSize - - if ( - pdfContainerHeight === 0 || - viewportHeight === 0 || - pdfContainerWidth === 0 || - viewportWidth === 0 - ) { - return 1 - } - - let ratio = 1 - switch (this._zoomScale) { - case 'page-fit': - ratio = Math.min( - pdfContainerHeight / viewportHeight, - pdfContainerWidth / viewportWidth - ) - break - case 'page-height': - ratio = pdfContainerHeight / viewportHeight - break - case 'page-width': - default: - ratio = pdfContainerWidth / viewportWidth - break - } - - return (this._zoom * ratio) / PdfViewerComponent.CSS_UNITS - } - - private resetPdfDocument() { - this.pdfLinkService.setDocument(this._pdf, null) - this.pdfViewer.setDocument(this._pdf!) - } - - private initialize(): void { - if (!this.isVisible) { - return - } - - this.isInitialized = true - this.initEventBus() - this.setupViewer() - } - - private setupResizeListener(): void { - this.ngZone.runOutsideAngular(() => { - fromEvent(window, 'resize') - .pipe( - debounceTime(100), - filter(() => this._canAutoResize && !!this._pdf), - takeUntil(this.destroy$) - ) - .subscribe(() => { - this.updateSize() - }) - }) - } -} diff --git a/src-ui/src/app/components/common/pdf-viewer/typings.ts b/src-ui/src/app/components/common/pdf-viewer/typings.ts deleted file mode 100644 index 8dad45f30..000000000 --- a/src-ui/src/app/components/common/pdf-viewer/typings.ts +++ /dev/null @@ -1,17 +0,0 @@ -export type PDFPageProxy = - import('pdfjs-dist/types/src/display/api').PDFPageProxy -export type PDFSource = - import('pdfjs-dist/types/src/display/api').DocumentInitParameters -export type PDFDocumentProxy = - import('pdfjs-dist/types/src/display/api').PDFDocumentProxy -export type PDFDocumentLoadingTask = - import('pdfjs-dist/types/src/display/api').PDFDocumentLoadingTask -export type PDFViewerOptions = - import('pdfjs-dist/types/web/pdf_viewer').PDFViewerOptions - -export interface PDFProgressData { - loaded: number - total: number -} - -export type ZoomScale = 'page-height' | 'page-fit' | 'page-width' diff --git a/src-ui/src/app/components/common/pdf-viewer/utils/event-bus-utils.ts b/src-ui/src/app/components/common/pdf-viewer/utils/event-bus-utils.ts deleted file mode 100644 index 8ae501169..000000000 --- a/src-ui/src/app/components/common/pdf-viewer/utils/event-bus-utils.ts +++ /dev/null @@ -1,182 +0,0 @@ -/** - * This file is taken and modified from https://github.com/VadimDez/ng2-pdf-viewer/blob/10.0.0/src/app/pdf-viewer/utils/event-bus-utils.ts - * Created by vadimdez on 21/06/16. - */ -import { fromEvent, Subject } from 'rxjs' -import { takeUntil } from 'rxjs/operators' - -import type { EventBus } from 'pdfjs-dist/web/pdf_viewer' - -// interface EventBus { -// on(eventName: string, listener: Function): void; -// off(eventName: string, listener: Function): void; -// _listeners: any; -// dispatch(eventName: string, data: Object): void; -// _on(eventName: any, listener: any, options?: null): void; -// _off(eventName: any, listener: any, options?: null): void; -// } - -export function createEventBus(pdfJsViewer: any, destroy$: Subject) { - const globalEventBus: EventBus = new pdfJsViewer.EventBus() - attachDOMEventsToEventBus(globalEventBus, destroy$) - return globalEventBus -} - -function attachDOMEventsToEventBus( - eventBus: EventBus, - destroy$: Subject -): void { - fromEvent(eventBus, 'documentload') - .pipe(takeUntil(destroy$)) - .subscribe(() => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('documentload', true, true, {}) - window.dispatchEvent(event) - }) - - fromEvent(eventBus, 'pagerendered') - .pipe(takeUntil(destroy$)) - .subscribe(({ pageNumber, cssTransform, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('pagerendered', true, true, { - pageNumber, - cssTransform, - }) - source.div.dispatchEvent(event) - }) - - fromEvent(eventBus, 'textlayerrendered') - .pipe(takeUntil(destroy$)) - .subscribe(({ pageNumber, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('textlayerrendered', true, true, { pageNumber }) - source.textLayerDiv?.dispatchEvent(event) - }) - - fromEvent(eventBus, 'pagechanging') - .pipe(takeUntil(destroy$)) - .subscribe(({ pageNumber, source }: any) => { - const event = document.createEvent('UIEvents') as any - event.initEvent('pagechanging', true, true) - /* tslint:disable:no-string-literal */ - event['pageNumber'] = pageNumber - source.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'pagesinit') - .pipe(takeUntil(destroy$)) - .subscribe(({ source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('pagesinit', true, true, null) - source.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'pagesloaded') - .pipe(takeUntil(destroy$)) - .subscribe(({ pagesCount, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('pagesloaded', true, true, { pagesCount }) - source.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'scalechange') - .pipe(takeUntil(destroy$)) - .subscribe(({ scale, presetValue, source }: any) => { - const event = document.createEvent('UIEvents') as any - event.initEvent('scalechange', true, true) - /* tslint:disable:no-string-literal */ - event['scale'] = scale - /* tslint:disable:no-string-literal */ - event['presetValue'] = presetValue - source.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'updateviewarea') - .pipe(takeUntil(destroy$)) - .subscribe(({ location, source }: any) => { - const event = document.createEvent('UIEvents') as any - event.initEvent('updateviewarea', true, true) - event['location'] = location - source.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'find') - .pipe(takeUntil(destroy$)) - .subscribe( - ({ - source, - type, - query, - phraseSearch, - caseSensitive, - highlightAll, - findPrevious, - }: any) => { - if (source === window) { - return // event comes from FirefoxCom, no need to replicate - } - const event = document.createEvent('CustomEvent') - event.initCustomEvent('find' + type, true, true, { - query, - phraseSearch, - caseSensitive, - highlightAll, - findPrevious, - }) - window.dispatchEvent(event) - } - ) - - fromEvent(eventBus, 'attachmentsloaded') - .pipe(takeUntil(destroy$)) - .subscribe(({ attachmentsCount, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('attachmentsloaded', true, true, { - attachmentsCount, - }) - source.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'sidebarviewchanged') - .pipe(takeUntil(destroy$)) - .subscribe(({ view, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('sidebarviewchanged', true, true, { view }) - source.outerContainer.dispatchEvent(event) - }) - - fromEvent(eventBus, 'pagemode') - .pipe(takeUntil(destroy$)) - .subscribe(({ mode, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('pagemode', true, true, { mode }) - source.pdfViewer.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'namedaction') - .pipe(takeUntil(destroy$)) - .subscribe(({ action, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('namedaction', true, true, { action }) - source.pdfViewer.container.dispatchEvent(event) - }) - - fromEvent(eventBus, 'presentationmodechanged') - .pipe(takeUntil(destroy$)) - .subscribe(({ active, switchInProgress }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('presentationmodechanged', true, true, { - active, - switchInProgress, - }) - window.dispatchEvent(event) - }) - - fromEvent(eventBus, 'outlineloaded') - .pipe(takeUntil(destroy$)) - .subscribe(({ outlineCount, source }: any) => { - const event = document.createEvent('CustomEvent') - event.initCustomEvent('outlineloaded', true, true, { outlineCount }) - source.container.dispatchEvent(event) - }) -} diff --git a/src-ui/src/app/components/common/preview-popup/preview-popup.component.html b/src-ui/src/app/components/common/preview-popup/preview-popup.component.html index 124d13af8..af745cba2 100644 --- a/src-ui/src/app/components/common/preview-popup/preview-popup.component.html +++ b/src-ui/src/app/components/common/preview-popup/preview-popup.component.html @@ -13,13 +13,13 @@
} @if (!requiresPassword) { - - + } } } diff --git a/src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts b/src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts index 42a97c743..6f638bb89 100644 --- a/src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts +++ b/src-ui/src/app/components/common/preview-popup/preview-popup.component.spec.ts @@ -1,7 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing' import { PreviewPopupComponent } from './preview-popup.component' -import { PdfViewerComponent } from '../pdf-viewer/pdf-viewer.component' import { By } from '@angular/platform-browser' import { SafeUrlPipe } from 'src/app/pipes/safeurl.pipe' import { SettingsService } from 'src/app/services/settings.service' @@ -9,6 +8,7 @@ import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { HttpClientTestingModule } from '@angular/common/http/testing' import { DocumentService } from 'src/app/services/rest/document.service' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { PdfViewerModule } from 'ng2-pdf-viewer' const doc = { id: 10, @@ -25,10 +25,11 @@ describe('PreviewPopupComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [PreviewPopupComponent, PdfViewerComponent, SafeUrlPipe], + declarations: [PreviewPopupComponent, SafeUrlPipe], imports: [ HttpClientTestingModule, NgxBootstrapIconsModule.pick(allIcons), + PdfViewerModule, ], }) settingsService = TestBed.inject(SettingsService) @@ -69,7 +70,7 @@ describe('PreviewPopupComponent', () => { settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, false) fixture.detectChanges() expect(fixture.debugElement.query(By.css('object'))).toBeNull() - expect(fixture.debugElement.query(By.css('pngx-pdf-viewer'))).not.toBeNull() + expect(fixture.debugElement.query(By.css('pdf-viewer'))).not.toBeNull() }) it('should show lock icon on password error', () => { diff --git a/src-ui/src/app/components/document-detail/document-detail.component.html b/src-ui/src/app/components/document-detail/document-detail.component.html index 6e2d47e2b..b226e97a2 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.html +++ b/src-ui/src/app/components/document-detail/document-detail.component.html @@ -347,7 +347,7 @@ @case (ContentRenderType.PDF) { @if (!useNativePdfViewer) {
- - +
} @else { diff --git a/src-ui/src/app/components/document-detail/document-detail.component.scss b/src-ui/src/app/components/document-detail/document-detail.component.scss index 1f6729784..2e9e63e6e 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.scss +++ b/src-ui/src/app/components/document-detail/document-detail.component.scss @@ -7,16 +7,20 @@ .pdf-viewer-container { background-color: gray; - pngx-pdf-viewer { + pdf-viewer { width: 100%; height: 100%; } } -::ng-deep .pngx-pdf-viewer-container .page { +::ng-deep .ng2-pdf-viewer-container .page { --page-margin: 10px auto; } +::ng-deep .ng2-pdf-viewer-container .page:last-child { + --page-margin: 10px auto 20px; +} + ::ng-deep form .ng-select-taggable { max-width: calc(100% - 90px); // fudge factor for (2x) ng-select button width } diff --git a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts index a0c02a688..d27c13ef1 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts @@ -76,11 +76,11 @@ import { ShareLinksDropdownComponent } from '../common/share-links-dropdown/shar import { CustomFieldsDropdownComponent } from '../common/custom-fields-dropdown/custom-fields-dropdown.component' import { CustomFieldDataType } from 'src/app/data/custom-field' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' -import { PdfViewerComponent } from '../common/pdf-viewer/pdf-viewer.component' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { environment } from 'src/environments/environment' import { RotateConfirmDialogComponent } from '../common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component' import { SplitConfirmDialogComponent } from '../common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component' +import { PdfViewerModule } from 'ng2-pdf-viewer' const doc: Document = { id: 3, @@ -176,7 +176,6 @@ describe('DocumentDetailComponent', () => { SafeUrlPipe, ShareLinksDropdownComponent, CustomFieldsDropdownComponent, - PdfViewerComponent, SplitConfirmDialogComponent, RotateConfirmDialogComponent, ], @@ -265,6 +264,7 @@ describe('DocumentDetailComponent', () => { ReactiveFormsModule, NgbModalModule, NgxBootstrapIconsModule.pick(allIcons), + PdfViewerModule, ], }).compileComponents() @@ -885,7 +885,7 @@ describe('DocumentDetailComponent', () => { jest.spyOn(settingsService, 'get').mockReturnValue(false) expect(component.useNativePdfViewer).toBeFalsy() fixture.detectChanges() - expect(fixture.debugElement.query(By.css('pngx-pdf-viewer'))).not.toBeNull() + expect(fixture.debugElement.query(By.css('pdf-viewer'))).not.toBeNull() }) it('should display native pdf viewer if enabled', () => { diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index c530921c7..820d7fbd5 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -66,10 +66,10 @@ import { ISODateAdapter } from 'src/app/utils/ngb-iso-date-adapter' import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field' import { CustomFieldInstance } from 'src/app/data/custom-field-instance' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' -import { PDFDocumentProxy } from '../common/pdf-viewer/typings' import { SplitConfirmDialogComponent } from '../common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component' import { RotateConfirmDialogComponent } from '../common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component' import { HotKeyService } from 'src/app/services/hot-key.service' +import { PDFDocumentProxy } from 'ng2-pdf-viewer' enum DocumentDetailNavIDs { Details = 1, From 3fa448ecb5d8a3dc74b395047e751e2b16b098d4 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 17 May 2024 09:02:17 -0700 Subject: [PATCH 04/51] Updates deps, unlocks those which have some resolution of issues (#6755) --- .pre-commit-config.yaml | 2 +- Pipfile | 7 +- Pipfile.lock | 915 +++++++++++++++++++++------------------- 3 files changed, 488 insertions(+), 436 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8a7156b7e..0b97ff415 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -47,7 +47,7 @@ repos: exclude: "(^Pipfile\\.lock$)" # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.4.2' + rev: 'v0.4.4' hooks: - id: ruff - repo: https://github.com/psf/black-pre-commit-mirror diff --git a/Pipfile b/Pipfile index f3e465061..702680149 100644 --- a/Pipfile +++ b/Pipfile @@ -7,7 +7,7 @@ name = "pypi" dateparser = "~=1.2" # WARNING: django does not use semver. # Only patch versions are guaranteed to not introduce breaking changes. -django = "~=4.2.11" +django = "~=4.2.13" django-allauth = {extras = ["socialaccount"], version = "*"} django-auditlog = "*" django-celery-results = "*" @@ -50,16 +50,13 @@ scikit-learn = "~=1.4" setproctitle = "*" tika-client = "*" tqdm = "*" +# See https://github.com/paperless-ngx/paperless-ngx/issues/5494 uvicorn = {extras = ["standard"], version = "==0.25.0"} watchdog = "~=4.0" whitenoise = "~=6.6" whoosh="~=2.7" zxing-cpp = {version = "*", platform_machine = "== 'x86_64'"} -# Locked for issues -# See https://github.com/paperless-ngx/paperless-ngx/discussions/6610 & https://bugs.launchpad.net/lxml/+bug/2059910 -lxml = "==5.1.1" - [dev-packages] # Linting black = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 0062d6520..369e34c17 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "4e53ee87cb715982b75fe720a69463af4f249b755691fcbc05bec8fe70e51330" + "sha256": "6fd62d37d4c5f6ec99765b037073e8d07db40dbddb2c591664406035970f7d4a" }, "pipfile-spec": 6, "requires": {}, @@ -392,41 +392,41 @@ }, "cryptography": { "hashes": [ - "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", - "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", - "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", - "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", - "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", - "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", - "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", - "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", - "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", - "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", - "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", - "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", - "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", - "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", - "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", - "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", - "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", - "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", - "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", - "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", - "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", - "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", - "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", - "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", - "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", - "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", - "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", - "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", - "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", - "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", - "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", - "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" + "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55", + "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785", + "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b", + "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886", + "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82", + "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1", + "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda", + "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f", + "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68", + "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60", + "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7", + "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd", + "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582", + "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc", + "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858", + "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b", + "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2", + "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678", + "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13", + "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4", + "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8", + "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604", + "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477", + "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e", + "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a", + "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9", + "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14", + "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda", + "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da", + "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562", + "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2", + "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9" ], "markers": "python_version >= '3.7'", - "version": "==42.0.5" + "version": "==42.0.7" }, "dateparser": { "hashes": [ @@ -454,22 +454,22 @@ }, "django": { "hashes": [ - "sha256:6e6ff3db2d8dd0c986b4eec8554c8e4f919b5c1ff62a5b4390c17aff2ed6e5c4", - "sha256:ddc24a0a8280a0430baa37aff11f28574720af05888c62b7cfe71d219f4599d3" + "sha256:837e3cf1f6c31347a1396a3f6b65688f2b4bb4a11c580dcb628b5afe527b68a5", + "sha256:a17fcba2aad3fc7d46fdb23215095dbbd64e6174bf4589171e732b18b07e426a" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==4.2.11" + "version": "==4.2.13" }, "django-allauth": { "extras": [ "socialaccount" ], "hashes": [ - "sha256:6f33e86e42fb78ec2885ee905f337b87c46465ae7fe162c4959dcac81d47e2ad" + "sha256:fbe0148c6258eac44e701a8f36e0950b5d0b1c60bde3e178683a4239f49311fc" ], "markers": "python_version >= '3.7'", - "version": "==0.62.1" + "version": "==0.63.0" }, "django-auditlog": { "hashes": [ @@ -886,83 +886,147 @@ }, "lxml": { "hashes": [ - "sha256:036b36c48cd775e4fd2084b34ae62ffeefa7a01f955f5a5b816f9257c308cfc0", - "sha256:04ef231dde88294a5499f61a74cdc42af97d8d5ecec1b0a645d1c7d436942789", - "sha256:071e5123d1eca861708c4be5b54e4d88923fa33fab3aa02722e907518b07071c", - "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9", - "sha256:13b73d78a8023203722cf98e9ea0b222da83110d1d5ef437ef8782a7755b4586", - "sha256:1528b37e83c3aeecb438e76e5be6279b353275560125a9c3f4d74642c5f110f9", - "sha256:161838cb95c97e8d76d01e544a3570b52ab6b863f4897a90e1f073bb110a75ba", - "sha256:19c6bc7476eeac4598ff925ae98597610109e21af4cd7ab1e060efcfc4b1c6e2", - "sha256:1b0611bba10d6f5467b86673e8f6bba4de0d00f7d111eea843bc872abfe11b5c", - "sha256:1d0270d33fbde6e1c6758ff58e2e284144f5331aa05dfe7f44ceafdf4e9d31aa", - "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d", - "sha256:20cd17eb21f5ae54da96791c49e1fbd3327bf66b2c00556cdf8d0552c2270f92", - "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14", - "sha256:2992480a25434d2df31413136ef87effab14d43b07f1f54c5012c4f6c7530144", - "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a", - "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee", - "sha256:318847c165063549c8fda6b162a0d068689b10deb825cb3859caef69fddaaaff", - "sha256:3641bc124b037921de4220538a5ebb52354fd2799fc2bbfb335d28096063c7d6", - "sha256:3a6e9b34f59c9755aa279c652e1c48c333c665d05a88afcd8e5ff0bde86f3b14", - "sha256:3c5940f188189956ccb3d1adb413001ada79f2d2b81087d2612a0cc4a1197eed", - "sha256:3da8db291568c27b2bb248dcfc8838ca3149f373a24e204bcd1c2c89e2813d14", - "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9", - "sha256:43f21b5929185fa4560836942020bb00a0fcdec9f67be98cac1a4b99501757c1", - "sha256:48dd28b9f410329de709a4bb6169c58f2cd8bff25f5a48d647678ec9b8a40c65", - "sha256:4958c378d9387c45ef8c4859495cf6be76f863e4e3b31494f6ec7f2c48d3b8e3", - "sha256:50007f4e94dc4e38030487a8b6c4af87a2d51ed059c7b74b29e3dd937cb1dfe1", - "sha256:5020b3081030b5cfc8149eee231167aea4ff68df73a610e1d542809e1f11fde7", - "sha256:52358249292bc155af681a9240ec3d944c1195f0124aa10ec4e3635adc1e10a1", - "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8", - "sha256:56f1e813ff660d031c77edba90a068d57e47ae93a9e811330fc88946fa68af9a", - "sha256:59ca75cfcf646ff64aa19ca4e7fd2a0fde77268d5a87856525d9e0b69b77d0c4", - "sha256:5bd2595ebe95214446e00a1ab94571f778b126e17736ea222c07505c4e092289", - "sha256:5dcb373720b70aa05419e508265dd86f06886ca0388967f6f024fbc4d551379f", - "sha256:60ceffdca5d637fe8ee95c7f06733a6c9646e07da80997efe3af2d4b4f366e36", - "sha256:666432274881cb2535e71dbe745e08ef10fe25c81fbb1a6b1e3c973177823b0c", - "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2", - "sha256:6c49eb5deaed1990fde5b5d80d6800aec1b5fd6113346b5f11068d988f68f2c4", - "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c", - "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20", - "sha256:77842b79b63c83c04dcfe2f045c78e15e4d97c86838eabd2e6518c1ed97e3900", - "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9", - "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c", - "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283", - "sha256:9113fe65a62f834b8e994c8f48e7b2179bf81878c0ec80ad7feba51ab9417663", - "sha256:95a51324a55000c55f4ab79e1f7f1e0bc42b7a24e39633f79542753023a9d4b7", - "sha256:99bcdf665576a26b44c7ce767d76b769a4418b0a13cda8300b26fb7b2647bd5b", - "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536", - "sha256:9cc30dc3c49ea914fa62ea73b57198b541cf2cd522fcf2b9559f99a24df769bb", - "sha256:a02ed1ebc469734dbfed5b688f709334de19e7a333cba7ae187b17d2b2c1d4ff", - "sha256:a103426e809640a2d985062d2f4b28db2f0fe4469ff72a67cb31fa70613158f1", - "sha256:a305d0469177fd78a0a9aa2231c60218266bb85d4b7955f9b67dab628c9267fd", - "sha256:a76a7b35e7660c74eb3f943c19f5f78c882dceab890cf8017027b6100b79ad8e", - "sha256:a94a97380ad689d751eb0a1e1ccd2a0622c5141771a31abe9a16075f80027e95", - "sha256:acff17e0cd5344677757a152631d8411efac6a84e4476d60123a9b33f5d6c511", - "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20", - "sha256:adff469b7dbfe9f3babc9e4479449ee97085ba70ac492fbe5f0f7217940c6731", - "sha256:aff34295a6c87638a1f1905355cf3a97e4026c45c0cf3bb6ed6bc35b885b4a33", - "sha256:b174885fd2cabd1ad48585296f495e25d607f02db99668c08b2afaceb668e21b", - "sha256:bc6904519dd1f92eb82f7d49814a33bbc444d0b66b1438e76daf3f79ef4aa38f", - "sha256:bd46b5b19ac969de8e87fb3d04414641d12ee489e2ea6cc75344087829b31c63", - "sha256:bf7e57dbe7b3c605e63849d9c8dae246a6ab9002223c57cd3f3dec7c3a0a8e6d", - "sha256:bfbdadc3cfe552331ecb0bbdcabf148d1697c73aa4321151e0e6c1704eeb76a7", - "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d", - "sha256:d1abbf2249467a37da45fb2d7ff37e578dfc9813f142800e58db9da761cb7899", - "sha256:d1f4d37b3f8d2d44493edce3d65ac987127bababd8ae208a6f0d7d260852346e", - "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b", - "sha256:d55ddc73dec971277b181a6d1a6abdd34f50e4511e1e60f6b4ebe22cbaad05bb", - "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4", - "sha256:d94a28c16cc430b68c374b37b8bb536ba5f0a4a080be0e1daa8310c44a00a75c", - "sha256:dec3491aa69a91ed07f5e6bc033e2b1a9424447ad5312ee69ac973e94d79083a", - "sha256:f05ab8cea65363d0cc7ce818f42407504b6d94ca885b4cde0270f021e2f4ef61", - "sha256:f1d0824e3ddb969fe1337b1bc45cf0bec8095b342f36903f41a74b7769cc8c73", - "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6" + "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3", + "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a", + "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0", + "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b", + "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f", + "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6", + "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73", + "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d", + "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad", + "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b", + "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a", + "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5", + "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab", + "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316", + "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df", + "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca", + "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264", + "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8", + "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f", + "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b", + "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3", + "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5", + "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed", + "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab", + "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5", + "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726", + "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d", + "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632", + "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706", + "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8", + "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472", + "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835", + "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf", + "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db", + "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d", + "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545", + "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9", + "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be", + "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe", + "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905", + "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438", + "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db", + "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776", + "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c", + "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed", + "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd", + "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484", + "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d", + "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6", + "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30", + "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182", + "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61", + "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425", + "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb", + "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1", + "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511", + "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e", + "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207", + "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b", + "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585", + "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56", + "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391", + "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85", + "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147", + "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18", + "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1", + "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa", + "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48", + "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3", + "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67", + "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7", + "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34", + "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706", + "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8", + "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c", + "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115", + "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009", + "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466", + "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526", + "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d", + "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525", + "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14", + "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3", + "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0", + "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b", + "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1", + "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf", + "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf", + "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0", + "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b", + "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff", + "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88", + "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2", + "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40", + "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716", + "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2", + "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2", + "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a", + "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734", + "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87", + "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48", + "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36", + "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b", + "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07", + "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573", + "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001", + "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9", + "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3", + "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce", + "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3", + "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04", + "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927", + "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083", + "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d", + "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32", + "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9", + "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f", + "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2", + "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c", + "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d", + "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393", + "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8", + "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6", + "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66", + "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5", + "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97", + "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196", + "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836", + "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae", + "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297", + "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421", + "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6", + "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981", + "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30", + "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30", + "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f", + "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324", + "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b" ], - "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==5.1.1" + "version": "==5.2.2" }, "markdown-it-py": { "hashes": [ @@ -1582,88 +1646,88 @@ }, "regex": { "hashes": [ - "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc", - "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5", - "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf", - "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94", - "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397", - "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82", - "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4", - "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae", - "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d", - "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db", - "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1", - "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b", - "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b", - "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666", - "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6", - "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c", - "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6", - "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c", - "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd", - "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636", - "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6", - "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962", - "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26", - "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e", - "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1", - "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b", - "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3", - "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a", - "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6", - "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257", - "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185", - "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e", - "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247", - "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31", - "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f", - "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec", - "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3", - "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b", - "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f", - "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150", - "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02", - "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17", - "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc", - "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4", - "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796", - "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f", - "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a", - "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d", - "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833", - "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f", - "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc", - "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d", - "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c", - "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10", - "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0", - "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb", - "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947", - "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae", - "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a", - "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f", - "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7", - "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925", - "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630", - "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61", - "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e", - "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58", - "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0", - "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8", - "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1", - "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1", - "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a", - "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662", - "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea", - "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1", - "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013", - "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90", - "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2", - "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e", - "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb" + "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649", + "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35", + "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb", + "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68", + "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5", + "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133", + "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0", + "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d", + "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da", + "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f", + "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d", + "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53", + "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa", + "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a", + "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890", + "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67", + "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c", + "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2", + "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced", + "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741", + "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f", + "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa", + "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf", + "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4", + "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5", + "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2", + "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384", + "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7", + "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014", + "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704", + "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5", + "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2", + "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49", + "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1", + "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694", + "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629", + "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6", + "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435", + "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c", + "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835", + "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e", + "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201", + "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62", + "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5", + "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16", + "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f", + "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1", + "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f", + "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f", + "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145", + "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3", + "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed", + "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143", + "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca", + "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9", + "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa", + "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850", + "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80", + "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe", + "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656", + "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388", + "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1", + "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294", + "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3", + "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d", + "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b", + "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40", + "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600", + "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c", + "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569", + "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456", + "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9", + "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb", + "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e", + "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f", + "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d", + "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a", + "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a", + "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796" ], "markers": "python_version >= '3.8'", - "version": "==2024.4.28" + "version": "==2024.5.15" }, "reportlab": { "hashes": [ @@ -2430,11 +2494,11 @@ }, "babel": { "hashes": [ - "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", - "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" + "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", + "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" ], - "markers": "python_version >= '3.7'", - "version": "==2.14.0" + "markers": "python_version >= '3.8'", + "version": "==2.15.0" }, "black": { "hashes": [ @@ -2722,41 +2786,41 @@ }, "cryptography": { "hashes": [ - "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", - "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", - "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", - "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", - "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", - "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", - "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", - "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", - "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", - "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", - "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", - "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", - "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", - "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", - "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", - "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", - "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", - "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", - "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", - "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", - "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", - "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", - "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", - "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", - "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", - "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", - "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", - "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", - "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", - "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", - "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", - "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" + "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55", + "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785", + "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b", + "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886", + "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82", + "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1", + "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda", + "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f", + "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68", + "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60", + "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7", + "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd", + "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582", + "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc", + "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858", + "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b", + "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2", + "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678", + "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13", + "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4", + "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8", + "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604", + "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477", + "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e", + "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a", + "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9", + "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14", + "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda", + "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da", + "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562", + "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2", + "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9" ], "markers": "python_version >= '3.7'", - "version": "==42.0.5" + "version": "==42.0.7" }, "daphne": { "hashes": [ @@ -2801,11 +2865,11 @@ }, "faker": { "hashes": [ - "sha256:6737cc6d591cd83421fdc5e494f6e2c1a6e32266214f158b745aa9fa15687c98", - "sha256:c153505618801f1704807b258a6010ea8cabf91f66f4788939bfdba83b887e76" + "sha256:45b84f47ff1ef86e3d1a8d11583ca871ecf6730fad0660edadc02576583a2423", + "sha256:cfe97c4857c4c36ee32ea4aaabef884895992e209bae4cbd26807cf3e05c6918" ], "markers": "python_version >= '3.8'", - "version": "==25.0.1" + "version": "==25.2.0" }, "filelock": { "hashes": [ @@ -2909,7 +2973,6 @@ "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" ], - "index": "pypi", "markers": "python_version >= '3.7'", "version": "==3.1.4" }, @@ -3021,12 +3084,12 @@ }, "mkdocs-material": { "hashes": [ - "sha256:049f82770f40559d3c2aa2259c562ea7257dbb4aaa9624323b5ef27b2d95a450", - "sha256:210e1f179682cd4be17d5c641b2f4559574b9dea2f589c3f0e7c17c5bd1959bc" + "sha256:4627fc3f15de2cba2bde9debc2fd59b9888ef494beabfe67eb352e23d14bf288", + "sha256:ffd08a5beaef3cd135aceb58ded8b98bbbbf2b70e5b656f6a14a63c917d9b001" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==9.5.21" + "version": "==9.5.23" }, "mkdocs-material-extensions": { "hashes": [ @@ -3193,11 +3256,11 @@ }, "platformdirs": { "hashes": [ - "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", - "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], "markers": "python_version >= '3.8'", - "version": "==4.2.1" + "version": "==4.2.2" }, "pluggy": { "hashes": [ @@ -3209,12 +3272,12 @@ }, "pre-commit": { "hashes": [ - "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab", - "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060" + "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", + "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.7.0" + "version": "==3.7.1" }, "pyasn1": { "hashes": [ @@ -3448,88 +3511,88 @@ }, "regex": { "hashes": [ - "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc", - "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5", - "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf", - "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94", - "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397", - "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82", - "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4", - "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae", - "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d", - "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db", - "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1", - "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b", - "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b", - "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666", - "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6", - "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c", - "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6", - "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c", - "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd", - "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636", - "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6", - "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962", - "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26", - "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e", - "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1", - "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b", - "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3", - "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a", - "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6", - "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257", - "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185", - "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e", - "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247", - "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31", - "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f", - "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec", - "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3", - "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b", - "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f", - "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150", - "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02", - "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17", - "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc", - "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4", - "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796", - "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f", - "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a", - "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d", - "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833", - "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f", - "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc", - "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d", - "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c", - "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10", - "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0", - "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb", - "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947", - "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae", - "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a", - "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f", - "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7", - "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925", - "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630", - "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61", - "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e", - "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58", - "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0", - "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8", - "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1", - "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1", - "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a", - "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662", - "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea", - "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1", - "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013", - "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90", - "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2", - "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e", - "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb" + "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649", + "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35", + "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb", + "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68", + "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5", + "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133", + "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0", + "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d", + "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da", + "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f", + "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d", + "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53", + "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa", + "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a", + "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890", + "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67", + "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c", + "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2", + "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced", + "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741", + "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f", + "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa", + "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf", + "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4", + "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5", + "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2", + "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384", + "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7", + "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014", + "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704", + "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5", + "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2", + "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49", + "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1", + "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694", + "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629", + "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6", + "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435", + "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c", + "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835", + "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e", + "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201", + "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62", + "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5", + "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16", + "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f", + "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1", + "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f", + "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f", + "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145", + "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3", + "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed", + "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143", + "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca", + "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9", + "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa", + "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850", + "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80", + "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe", + "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656", + "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388", + "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1", + "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294", + "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3", + "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d", + "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b", + "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40", + "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600", + "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c", + "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569", + "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456", + "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9", + "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb", + "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e", + "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f", + "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d", + "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a", + "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a", + "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796" ], "markers": "python_version >= '3.8'", - "version": "==2024.4.28" + "version": "==2024.5.15" }, "requests": { "hashes": [ @@ -3540,27 +3603,27 @@ }, "ruff": { "hashes": [ - "sha256:08a0d6a22918ab2552ace96adeaca308833873a4d7d1d587bb1d37bae8728eb3", - "sha256:0bfc9e955e6dc6359eb6f82ea150c4f4e82b660e5b58d9a20a0e42ec3bb6342b", - "sha256:18b00e0bcccf0fc8d7186ed21e311dffd19761cb632241a6e4fe4477cc80ef6e", - "sha256:25cacda2155778beb0d064e0ec5a3944dcca9c12715f7c4634fd9d93ac33fd30", - "sha256:262f5635e2c74d80b7507fbc2fac28fe0d4fef26373bbc62039526f7722bca1b", - "sha256:29efff25bf9ee685c2c8390563a5b5c006a3fee5230d28ea39f4f75f9d0b6f2f", - "sha256:510a67d232d2ebe983fddea324dbf9d69b71c4d2dfeb8a862f4a127536dd4cfb", - "sha256:71ca5f8ccf1121b95a59649482470c5601c60a416bf189d553955b0338e34614", - "sha256:7363691198719c26459e08cc17c6a3dac6f592e9ea3d2fa772f4e561b5fe82a3", - "sha256:7a1c3a450bc6539ef00da6c819fb1b76b6b065dec585f91456e7c0d6a0bbc725", - "sha256:819fb06d535cc76dfddbfe8d3068ff602ddeb40e3eacbc90e0d1272bb8d97113", - "sha256:927b11c1e4d0727ce1a729eace61cee88a334623ec424c0b1c8fe3e5f9d3c865", - "sha256:b70800c290f14ae6fcbb41bbe201cf62dfca024d124a1f373e76371a007454ce", - "sha256:dc9ff11cd9a092ee7680a56d21f302bdda14327772cd870d806610a3503d001f", - "sha256:eba1f14df3c758dd7de5b55fbae7e1c8af238597961e5fb628f3de446c3c40c5", - "sha256:eeb039f8428fcb6725bb63cbae92ad67b0559e68b5d80f840f11914afd8ddf7f", - "sha256:ff0a3ef2e3c4b6d133fbedcf9586abfbe38d076041f2dc18ffb2c7e0485d5a07" + "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768", + "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6", + "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6", + "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae", + "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15", + "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab", + "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef", + "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95", + "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e", + "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595", + "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36", + "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85", + "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd", + "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891", + "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9", + "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876", + "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.4.3" + "version": "==0.4.4" }, "scipy": { "hashes": [ @@ -3677,11 +3740,11 @@ }, "virtualenv": { "hashes": [ - "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b", - "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75" + "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c", + "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b" ], "markers": "python_version >= '3.7'", - "version": "==20.26.1" + "version": "==20.26.2" }, "watchdog": { "hashes": [ @@ -3721,53 +3784,45 @@ }, "zipp": { "hashes": [ - "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", - "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715" + "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059", + "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e" ], "markers": "python_version >= '3.8'", - "version": "==3.18.1" + "version": "==3.18.2" }, "zope-interface": { "hashes": [ - "sha256:014bb94fe6bf1786da1aa044eadf65bc6437bcb81c451592987e5be91e70a91e", - "sha256:01a0b3dd012f584afcf03ed814bce0fc40ed10e47396578621509ac031be98bf", - "sha256:10cde8dc6b2fd6a1d0b5ca4be820063e46ddba417ab82bcf55afe2227337b130", - "sha256:187f7900b63845dcdef1be320a523dbbdba94d89cae570edc2781eb55f8c2f86", - "sha256:1b0c4c90e5eefca2c3e045d9f9ed9f1e2cdbe70eb906bff6b247e17119ad89a1", - "sha256:22e8a218e8e2d87d4d9342aa973b7915297a08efbebea5b25900c73e78ed468e", - "sha256:26c9a37fb395a703e39b11b00b9e921c48f82b6e32cc5851ad5d0618cd8876b5", - "sha256:2bb78c12c1ad3a20c0d981a043d133299117b6854f2e14893b156979ed4e1d2c", - "sha256:2c3cfb272bcb83650e6695d49ae0d14dd06dc694789a3d929f23758557a23d92", - "sha256:2f32010ffb87759c6a3ad1c65ed4d2e38e51f6b430a1ca11cee901ec2b42e021", - "sha256:3c8731596198198746f7ce2a4487a0edcbc9ea5e5918f0ab23c4859bce56055c", - "sha256:40aa8c8e964d47d713b226c5baf5f13cdf3a3169c7a2653163b17ff2e2334d10", - "sha256:4137025731e824eee8d263b20682b28a0bdc0508de9c11d6c6be54163e5b7c83", - "sha256:46034be614d1f75f06e7dcfefba21d609b16b38c21fc912b01a99cb29e58febb", - "sha256:483e118b1e075f1819b3c6ace082b9d7d3a6a5eb14b2b375f1b80a0868117920", - "sha256:4d6b229f5e1a6375f206455cc0a63a8e502ed190fe7eb15e94a312dc69d40299", - "sha256:567d54c06306f9c5b6826190628d66753b9f2b0422f4c02d7c6d2b97ebf0a24e", - "sha256:5683aa8f2639016fd2b421df44301f10820e28a9b96382a6e438e5c6427253af", - "sha256:600101f43a7582d5b9504a7c629a1185a849ce65e60fca0f6968dfc4b76b6d39", - "sha256:62e32f02b3f26204d9c02c3539c802afc3eefb19d601a0987836ed126efb1f21", - "sha256:69dedb790530c7ca5345899a1b4cb837cc53ba669051ea51e8c18f82f9389061", - "sha256:72d5efecad16c619a97744a4f0b67ce1bcc88115aa82fcf1dc5be9bb403bcc0b", - "sha256:8d407e0fd8015f6d5dfad481309638e1968d70e6644e0753f229154667dd6cd5", - "sha256:a058e6cf8d68a5a19cb5449f42a404f0d6c2778b897e6ce8fadda9cea308b1b0", - "sha256:a1adc14a2a9d5e95f76df625a9b39f4709267a483962a572e3f3001ef90ea6e6", - "sha256:a56fe1261230093bfeedc1c1a6cd6f3ec568f9b07f031c9a09f46b201f793a85", - "sha256:ad4524289d8dbd6fb5aa17aedb18f5643e7d48358f42c007a5ee51a2afc2a7c5", - "sha256:afa0491a9f154cf8519a02026dc85a416192f4cb1efbbf32db4a173ba28b289a", - "sha256:bf34840e102d1d0b2d39b1465918d90b312b1119552cebb61a242c42079817b9", - "sha256:c40df4aea777be321b7e68facb901bc67317e94b65d9ab20fb96e0eb3c0b60a1", - "sha256:d0e7321557c702bd92dac3c66a2f22b963155fdb4600133b6b29597f62b71b12", - "sha256:d165d7774d558ea971cb867739fb334faf68fc4756a784e689e11efa3becd59e", - "sha256:e78a183a3c2f555c2ad6aaa1ab572d1c435ba42f1dc3a7e8c82982306a19b785", - "sha256:e8fa0fb05083a1a4216b4b881fdefa71c5d9a106e9b094cd4399af6b52873e91", - "sha256:f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a", - "sha256:f95bebd0afe86b2adc074df29edb6848fc4d474ff24075e2c263d698774e108d" + "sha256:21732994aa3ca43bbb6b36335c288023428a3c5b7322b637c7b0a03053937578", + "sha256:36ee6e507a9fd4f1f0aab8e8dfc801d162e7211c27503cbfb47e1d558941a7fa", + "sha256:3945f4fda92c1b6fb0cb6eaaaf72599e5c2c2059654bdc42bc09c6e711c214c8", + "sha256:414e6dccdf4a5c96c0c98da68ba040dbf9ba7511b61b34e228f11b0ed90c439d", + "sha256:4782e173c2fde4f649c2a9a68082445bc1f2c27f41907de06bf1ba82585847f2", + "sha256:4cd56eb9a23767958c9a0654306b9a4a74def485f645b3a7378cc6ab661ef31c", + "sha256:502d2c9c4231d022b20225dba5c6c736236ed65e1d7e2f6f402b5aa6a7040ec9", + "sha256:57f34b7997f8de7d2db08363eaccd05dad20f106e39efe95bed4fac84af2d022", + "sha256:5fbbb290751f5c4ed81e54ae73fe8557c4a85973f5ab019edbb0f746244ecea6", + "sha256:604fa920478dfc0c76cdb7c203572400a8317ffcdac288245c408b42b3d9aee9", + "sha256:62e6b756663deade5270f67899753437b39d970f9eecd49e19fae3b880310cf0", + "sha256:646cd83d24065d074f22f61fe101d20dbf4b729ca7831cc782ec986eb9156f93", + "sha256:6494dc0314e782ce4fb0e624b4ce2458f54d074382f50a920c7700c05cbcef28", + "sha256:6e4cc017206c1429a6d8fdd8a25c6efc15512065eec0a8d45c350df96a0911ed", + "sha256:72faa868fcfde49a29d287dce3c83180322467eecd725dd351098efe96e8d4bb", + "sha256:7cda82ab32f984985f09e4ec20a4f9665b26779a1b8e443b34a148de256f2052", + "sha256:855b7233fa5d0d1f3be8c14fadf4718dee1c928e1d75f1584bea6ecec6dcc4af", + "sha256:86e85eada0eb551950df05d72dc0e892320f14daa78bc434059e834d4b1f9300", + "sha256:8e246357f52952ae5fa950d19eda8572594c49e6cb1e5462508e6cec561a37de", + "sha256:93f28d84517dcd6c240979bd9b2f262a373832baef856fe663a24b9171d7f04d", + "sha256:b0f61ccbc26e08031d0e72b6a0cbf9b4030f035913cb2b39f940aa42eb8e0063", + "sha256:b11f2b67ccc990a1522fa8cd3f5d185a068459f944ab2d0e7a1b15d31bcb4af4", + "sha256:c04bd4ee4766d285e83c6d8c042663a98efb934389e05ccd643fefb066c88a9d", + "sha256:ee1e3ca6c98efe213a96dece89100a8aa52e210ac354861d8039d69bd1d6e5ff", + "sha256:f33af86ed460eb28dc9da1de1f3305795271a19c665161c1d973a737596b2081", + "sha256:f5092f2712e1fd07579fc3101b18e9c95857c853e836847598bf992c8e672434", + "sha256:f78e1eac48c4f4e0168a91cabcd8d1aedb972836df5c8769071fc6173294a0a3", + "sha256:fe636b49c333bfc5b0913590e36a2f151167c462fb36d9f4acc66029e45c974b" ], "markers": "python_version >= '3.7'", - "version": "==6.3" + "version": "==6.4" } }, "typing-dev": { @@ -3952,50 +4007,50 @@ }, "cryptography": { "hashes": [ - "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", - "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", - "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", - "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", - "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", - "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", - "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", - "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", - "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", - "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", - "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", - "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", - "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", - "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", - "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", - "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", - "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", - "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", - "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", - "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", - "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", - "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", - "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", - "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", - "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", - "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", - "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", - "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", - "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", - "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", - "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", - "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" + "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55", + "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785", + "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b", + "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886", + "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82", + "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1", + "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda", + "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f", + "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68", + "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60", + "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7", + "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd", + "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582", + "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc", + "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858", + "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b", + "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2", + "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678", + "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13", + "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4", + "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8", + "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604", + "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477", + "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e", + "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a", + "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9", + "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14", + "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda", + "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da", + "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562", + "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2", + "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9" ], "markers": "python_version >= '3.7'", - "version": "==42.0.5" + "version": "==42.0.7" }, "django": { "hashes": [ - "sha256:6e6ff3db2d8dd0c986b4eec8554c8e4f919b5c1ff62a5b4390c17aff2ed6e5c4", - "sha256:ddc24a0a8280a0430baa37aff11f28574720af05888c62b7cfe71d219f4599d3" + "sha256:837e3cf1f6c31347a1396a3f6b65688f2b4bb4a11c580dcb628b5afe527b68a5", + "sha256:a17fcba2aad3fc7d46fdb23215095dbbd64e6174bf4589171e732b18b07e426a" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==4.2.11" + "version": "==4.2.13" }, "django-filter-stubs": { "hashes": [ @@ -4178,12 +4233,12 @@ }, "types-pillow": { "hashes": [ - "sha256:696e68b9b6a58548fc307a8669830469237c5b11809ddf978ac77fafa79251cd", - "sha256:bd12923093b96c91d523efcdb66967a307f1a843bcfaf2d5a529146c10a9ced3" + "sha256:b2fcc27b8e15ae3741941e43b4f39eba6fce6bcb152af90bbb07b387d2585783", + "sha256:ef87a19ea0a02a89c784cbc1b99dfff6c00dd0d5796a8ac868cf7ec69c5f88ff" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==10.2.0.20240423" + "version": "==10.2.0.20240511" }, "types-psycopg2": { "hashes": [ @@ -4196,12 +4251,12 @@ }, "types-pygments": { "hashes": [ - "sha256:b101ca9448aaff52af6966506f1fdd73b1e60a79b8a79a8bace3366cbf1f7ed9", - "sha256:b1d97e905ce36343c7283b0319182ae6d4f967188f361f45502a18ae43e03e1f" + "sha256:11c90bc1737c9af55e5569558b88df7c2233e12325cb516215f722271444e91d", + "sha256:4b4c37812c87bbde687dbf27adf5bac593745a321e57f678dbc311571ba2ac9d" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.17.0.20240310" + "version": "==2.18.0.20240506" }, "types-pyopenssl": { "hashes": [ @@ -4247,12 +4302,12 @@ }, "types-setuptools": { "hashes": [ - "sha256:a4381e041510755a6c9210e26ad55b1629bc10237aeb9cb8b6bd24996b73db48", - "sha256:a7ba908f1746c4337d13f027fa0f4a5bcad6d1d92048219ba792b3295c58586d" + "sha256:3a8ccea3e3f1f639856a1dd622be282f74e94e00fdc364630240f999cc9594fc", + "sha256:bd3964c08cffd5a057d9cabe61641c86a41a1b5dd2b652b8d371eed64d89d726" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==69.5.0.20240423" + "version": "==69.5.0.20240513" }, "types-tqdm": { "hashes": [ From cb160212d4e0bc9d14af0054908f7814e45bed5c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 17 May 2024 10:20:40 -0700 Subject: [PATCH 05/51] Fix: consistently use created_date for doc display (#6758) --- .../document-card-large/document-card-large.component.html | 2 +- .../document-card-small/document-card-small.component.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html index ad9ce2e89..51f51a517 100644 --- a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html +++ b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html @@ -95,7 +95,7 @@ @if (displayFields.includes(DisplayField.CREATED) || displayFields.includes(DisplayField.ADDED)) {
- Created: {{ document.created | customDate }} + Created: {{ document.created_date | customDate }} Added: {{ document.added | customDate }} Modified: {{ document.modified | customDate }}
diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html index 5d565ddf2..9667163fb 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html @@ -62,14 +62,14 @@
- Created: {{ document.created | customDate }} + Created: {{ document.created_date | customDate }} Added: {{ document.added | customDate }} Modified: {{ document.modified | customDate }}
- {{document.created | customDate:'mediumDate'}} + {{document.created_date | customDate:'mediumDate'}}
} From c4f9828a10c22e4323cb7ab1d6035d230d89d312 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 17 May 2024 14:30:03 -0700 Subject: [PATCH 06/51] Chore: indent system status code copy --- .../system-status-dialog/system-status-dialog.component.spec.ts | 2 +- .../system-status-dialog/system-status-dialog.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts index 13baa363a..b515bb622 100644 --- a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts @@ -87,7 +87,7 @@ describe('SystemStatusDialogComponent', () => { jest.spyOn(clipboard, 'copy') component.copy() expect(clipboard.copy).toHaveBeenCalledWith( - JSON.stringify(component.status) + JSON.stringify(component.status, null, 4) ) expect(component.copied).toBeTruthy() tick(3000) diff --git a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts index 83468e711..8535969a5 100644 --- a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts +++ b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts @@ -28,7 +28,7 @@ export class SystemStatusDialogComponent { } public copy() { - this.clipboard.copy(JSON.stringify(this.status)) + this.clipboard.copy(JSON.stringify(this.status, null, 4)) this.copied = true setTimeout(() => { this.copied = false From e283bbe5c24335b5ef5d4e7c7e5320970ff64fb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 22:57:34 +0000 Subject: [PATCH 07/51] Chore(deps): Bump the frontend-angular-dependencies group (#6761) Bumps the frontend-angular-dependencies group in /src-ui with 19 updates: | Package | From | To | | --- | --- | --- | | [@angular/cdk](https://github.com/angular/components) | `17.3.6` | `17.3.9` | | [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `17.3.7` | `17.3.9` | | [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `17.3.7` | `17.3.9` | | [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `17.3.7` | `17.3.9` | | [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `17.3.7` | `17.3.9` | | [@angular/localize](https://github.com/angular/angular) | `17.3.7` | `17.3.9` | | [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `17.3.7` | `17.3.9` | | [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `17.3.7` | `17.3.9` | | [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `17.3.7` | `17.3.9` | | [ng2-pdf-viewer](https://github.com/VadimDez/ng2-pdf-viewer) | `10.2.1` | `10.2.2` | | [ngx-ui-tour-ng-bootstrap](https://github.com/hakimio/ngx-ui-tour) | `14.0.2` | `14.0.3` | | [@angular-devkit/build-angular](https://github.com/angular/angular-cli) | `17.3.6` | `17.3.7` | | [@angular-eslint/builder](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder) | `17.3.0` | `17.4.1` | | [@angular-eslint/eslint-plugin](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin) | `17.3.0` | `17.4.1` | | [@angular-eslint/eslint-plugin-template](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template) | `17.3.0` | `17.4.1` | | [@angular-eslint/schematics](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics) | `17.3.0` | `17.4.1` | | [@angular-eslint/template-parser](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser) | `17.3.0` | `17.4.1` | | [@angular/cli](https://github.com/angular/angular-cli) | `17.3.6` | `17.3.7` | | [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `17.3.7` | `17.3.9` | Updates `@angular/cdk` from 17.3.6 to 17.3.9 - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/17.3.6...17.3.9) Updates `@angular/common` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/common) Updates `@angular/compiler` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/compiler) Updates `@angular/core` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/core) Updates `@angular/forms` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/forms) Updates `@angular/localize` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/compare/17.3.7...17.3.9) Updates `@angular/platform-browser` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/platform-browser) Updates `@angular/platform-browser-dynamic` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/platform-browser-dynamic) Updates `@angular/router` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/router) Updates `ng2-pdf-viewer` from 10.2.1 to 10.2.2 - [Release notes](https://github.com/VadimDez/ng2-pdf-viewer/releases) - [Changelog](https://github.com/VadimDez/ng2-pdf-viewer/blob/master/CHANGELOG.md) - [Commits](https://github.com/VadimDez/ng2-pdf-viewer/compare/10.2.1...10.2.2) Updates `ngx-ui-tour-ng-bootstrap` from 14.0.2 to 14.0.3 - [Release notes](https://github.com/hakimio/ngx-ui-tour/releases) - [Commits](https://github.com/hakimio/ngx-ui-tour/commits) Updates `@angular-devkit/build-angular` from 17.3.6 to 17.3.7 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/17.3.6...17.3.7) Updates `@angular-eslint/builder` from 17.3.0 to 17.4.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/builder/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.4.1/packages/builder) Updates `@angular-eslint/eslint-plugin` from 17.3.0 to 17.4.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.4.1/packages/eslint-plugin) Updates `@angular-eslint/eslint-plugin-template` from 17.3.0 to 17.4.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.4.1/packages/eslint-plugin-template) Updates `@angular-eslint/schematics` from 17.3.0 to 17.4.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/schematics/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.4.1/packages/schematics) Updates `@angular-eslint/template-parser` from 17.3.0 to 17.4.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/template-parser/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.4.1/packages/template-parser) Updates `@angular/cli` from 17.3.6 to 17.3.7 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/17.3.6...17.3.7) Updates `@angular/compiler-cli` from 17.3.7 to 17.3.9 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.9/packages/compiler-cli) --- updated-dependencies: - dependency-name: "@angular/cdk" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/common" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/compiler" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/core" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/forms" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/localize" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/platform-browser" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/platform-browser-dynamic" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/router" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: ng2-pdf-viewer dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: ngx-ui-tour-ng-bootstrap dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-devkit/build-angular" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/builder" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/eslint-plugin-template" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/schematics" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/template-parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-angular-dependencies - dependency-name: "@angular/cli" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/compiler-cli" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package-lock.json | 751 +++++++++++++++++---------------------- src-ui/package.json | 36 +- 2 files changed, 353 insertions(+), 434 deletions(-) diff --git a/src-ui/package-lock.json b/src-ui/package-lock.json index 34549a35a..ecc954721 100644 --- a/src-ui/package-lock.json +++ b/src-ui/package-lock.json @@ -9,15 +9,15 @@ "version": "0.0.0", "hasInstallScript": true, "dependencies": { - "@angular/cdk": "^17.3.6", - "@angular/common": "~17.3.7", - "@angular/compiler": "~17.3.7", - "@angular/core": "~17.3.7", - "@angular/forms": "~17.3.7", - "@angular/localize": "~17.3.7", - "@angular/platform-browser": "~17.3.7", - "@angular/platform-browser-dynamic": "~17.3.7", - "@angular/router": "~17.3.7", + "@angular/cdk": "^17.3.9", + "@angular/common": "~17.3.9", + "@angular/compiler": "~17.3.9", + "@angular/core": "~17.3.9", + "@angular/forms": "~17.3.9", + "@angular/localize": "~17.3.9", + "@angular/platform-browser": "~17.3.9", + "@angular/platform-browser-dynamic": "~17.3.9", + "@angular/router": "~17.3.9", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@ng-select/ng-select": "^12.0.7", "@ngneat/dirty-check-forms": "^3.0.3", @@ -25,13 +25,13 @@ "bootstrap": "^5.3.3", "file-saver": "^2.0.5", "mime-names": "^1.0.0", - "ng2-pdf-viewer": "^10.2.1", + "ng2-pdf-viewer": "^10.2.2", "ngx-bootstrap-icons": "^1.9.3", "ngx-color": "^9.0.0", "ngx-cookie-service": "^17.1.0", "ngx-file-drop": "^16.0.0", "ngx-filesize": "^3.0.3", - "ngx-ui-tour-ng-bootstrap": "^14.0.2", + "ngx-ui-tour-ng-bootstrap": "^14.0.3", "rxjs": "^7.8.1", "tslib": "^2.6.2", "uuid": "^9.0.1", @@ -39,13 +39,13 @@ }, "devDependencies": { "@angular-builders/jest": "17.0.3", - "@angular-devkit/build-angular": "~17.3.6", - "@angular-eslint/builder": "17.3.0", - "@angular-eslint/eslint-plugin": "17.3.0", - "@angular-eslint/eslint-plugin-template": "17.3.0", - "@angular-eslint/schematics": "17.3.0", - "@angular-eslint/template-parser": "17.3.0", - "@angular/cli": "~17.3.6", + "@angular-devkit/build-angular": "~17.3.7", + "@angular-eslint/builder": "17.4.1", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@angular-eslint/schematics": "17.4.1", + "@angular-eslint/template-parser": "17.4.1", + "@angular/cli": "~17.3.7", "@angular/compiler-cli": "~17.3.2", "@playwright/test": "^1.42.1", "@types/jest": "^29.5.12", @@ -122,13 +122,41 @@ "jest": ">=29" } }, - "node_modules/@angular-devkit/architect": { - "version": "0.1703.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.6.tgz", - "integrity": "sha512-Ck501FD/QuOjeKVFs7hU92w8+Ffetv0d5Sq09XY2/uygo5c/thMzp9nkevaIWBxUSeU5RqYZizDrhFVgYzbbOw==", + "node_modules/@angular-builders/jest/node_modules/jest-preset-angular": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.0.3.tgz", + "integrity": "sha512-usgBL7x0rXMnMSx8iEFeOozj50W6fp+YAmQcQBUdAXhN+PAXRy4UXL6I/rfcAOU09rnnq7RKsLsmhpp/fFEuag==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.6", + "bs-logger": "^0.2.6", + "esbuild-wasm": ">=0.15.13", + "jest-environment-jsdom": "^29.0.0", + "jest-util": "^29.0.0", + "pretty-format": "^29.0.0", + "ts-jest": "^29.0.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "optionalDependencies": { + "esbuild": ">=0.15.13" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">=15.0.0 <18.0.0", + "@angular/compiler-cli": ">=15.0.0 <18.0.0", + "@angular/core": ">=15.0.0 <18.0.0", + "@angular/platform-browser-dynamic": ">=15.0.0 <18.0.0", + "jest": "^29.0.0", + "typescript": ">=4.8" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1703.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.7.tgz", + "integrity": "sha512-SwXbdsZqEE3JtvujCLChAii+FA20d1931VDjDYffrGWdQEViTBAr4NKtDr/kOv8KkgiL3fhGibPnRNUHTeAMtg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.7", "rxjs": "7.8.1" }, "engines": { @@ -138,15 +166,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.3.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.6.tgz", - "integrity": "sha512-K4CEZvhQZUUOpmXPVoI1YBM8BARbIlqE6FZRxakmnr+YOtVTYE5s+Dr1wgja8hZIohNz6L7j167G9Aut7oPU/w==", + "version": "17.3.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.7.tgz", + "integrity": "sha512-AsV80kiFMIPIhm3uzJgOHDj4u6JteUkZedPTKAFFFJC7CTat1luW5qx306vfF7wj62aMvUl5g9HFWaeLghTQGA==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1703.6", - "@angular-devkit/build-webpack": "0.1703.6", - "@angular-devkit/core": "17.3.6", + "@angular-devkit/architect": "0.1703.7", + "@angular-devkit/build-webpack": "0.1703.7", + "@angular-devkit/core": "17.3.7", "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", @@ -157,7 +185,7 @@ "@babel/preset-env": "7.24.0", "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.3.6", + "@ngtools/webpack": "17.3.7", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.18", @@ -725,12 +753,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1703.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.6.tgz", - "integrity": "sha512-pJu0et2SiF0kfXenHSTtAART0omzbWpLgBfeUo4hBh4uwX5IaT+mRpYpr8gCXMq+qsjoQp3HobSU3lPDeBn+bg==", + "version": "0.1703.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.7.tgz", + "integrity": "sha512-gpt2Ia5I1gmdp3hdbtB7tkZTba5qWmKeVhlCYswa/LvbceKmkjedoeNRAoyr1UKM9GeGqt6Xl1B2eHzCH+ykrg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1703.6", + "@angular-devkit/architect": "0.1703.7", "rxjs": "7.8.1" }, "engines": { @@ -744,9 +772,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.3.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.6.tgz", - "integrity": "sha512-FVbkT9dEwHEvjnxr4mvMNSMg2bCFoGoP4X68xXU9dhLEUpC05opLvfbaR3Qh543eCJ5AstosBFVzB/krfIkOvA==", + "version": "17.3.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.7.tgz", + "integrity": "sha512-qpZ7BShyqS/Jqld36E7kL02cyb2pjn1Az1p9439SbP8nsvJgYlsyjwYK2Kmcn/Wi+TZGIKxkqxgBBw9vqGgeJw==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -777,12 +805,12 @@ "dev": true }, "node_modules/@angular-devkit/schematics": { - "version": "17.3.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.6.tgz", - "integrity": "sha512-2G1YuPInd8znG7uUgKOS7z72Aku50lTzB/2csWkWPJLAFkh7vKC8QZ40x8S1nC9npVYPhI5CRLX/HVpBh9CyxA==", + "version": "17.3.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.7.tgz", + "integrity": "sha512-d7NKSwstdxYLYmPsbcYO3GOFNfXxXwOyHxSqDa1JNKoSzMdbLj4tvlCpfXw0ThNM7gioMx8aLBaaH1ac+yk06Q==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.6", + "@angular-devkit/core": "17.3.7", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", @@ -801,13 +829,13 @@ "dev": true }, "node_modules/@angular-eslint/builder": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.3.0.tgz", - "integrity": "sha512-JXSZE7+KA3UGU6jwc0v9lwOIMptosrvLIOXGlXqrhHWEXfkfu3ENPq1Lm3K8jLndQ57XueEhC+Nab/AuUiWA/Q==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.1.tgz", + "integrity": "sha512-UVnErsAGXTi8OChkoSxDVVGV2jkFpTaXQT+0fgapSwaOt3Ki7BVwJJoNaX0Zs01c64bjNPZ5ONb/i6nC8QiP9Q==", "dev": true, "dependencies": { - "@nx/devkit": "^17.2.8 || ^18.0.0", - "nx": "^17.2.8 || ^18.0.0" + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -815,19 +843,20 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz", - "integrity": "sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", + "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz", - "integrity": "sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", + "integrity": "sha512-05bN1UB4H2CuX7Sw6fz+rMobsa+Bl3g15IYldH08hbJSnVemO8mf86bIjRN2Th79sO9WOiXXimnfIt7KRf8l0Q==", "dev": true, "dependencies": { - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/utils": "7.2.0" + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", + "@typescript-eslint/utils": "7.8.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -835,15 +864,15 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz", - "integrity": "sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.1.tgz", + "integrity": "sha512-oYP7yzOpn63g1Mpwc8F8ERiywaGRhAs27ttI9t+5NXaLrwHSfc/AJleC7jjkB5xu1p88JY1mb4oIYOjeZAhHIg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", "aria-query": "5.3.0", "axobject-query": "4.0.0" }, @@ -852,17 +881,31 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/utils": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", + "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@typescript-eslint/utils": "7.8.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -870,12 +913,12 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -883,22 +926,22 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -911,21 +954,21 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -936,16 +979,16 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -962,9 +1005,9 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -976,17 +1019,31 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/utils": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", + "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@typescript-eslint/utils": "7.8.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -994,12 +1051,12 @@ } }, "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1007,22 +1064,22 @@ } }, "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1035,21 +1092,21 @@ } }, "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1060,16 +1117,16 @@ } }, "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1086,9 +1143,9 @@ } }, "node_modules/@angular-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -1101,16 +1158,16 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.3.0.tgz", - "integrity": "sha512-5yssd5EOomxlKt9vN/OXXCTCuI3Pmfj16pkjBDoW0wzC8/M2l5zlXIEfoKumHYv2wtF553LhaMXVYVU35e0lTw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.3.0", - "@angular-eslint/eslint-plugin-template": "17.3.0", - "@nx/devkit": "^17.2.8 || ^18.0.0", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", "strip-json-comments": "3.1.1", "tmp": "0.2.3" }, @@ -1119,12 +1176,12 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.3.0.tgz", - "integrity": "sha512-m+UzAnWgtjeS0x6skSmR0eXltD/p7HZA+c8pPyAkiHQzkxE7ohhfyZc03yWGuYJvWQUqQAKKdO/nQop14TP0bg==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.1.tgz", + "integrity": "sha512-fJQpwQXexgs7Z3yYpQAfuAkFB2Y5H8SSlo+eAPPafOOPpPSIm/yP4dQ2e06tE8zWB5yjYnVBMJnUKSmG5GJSDw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", "eslint-scope": "^8.0.0" }, "peerDependencies": { @@ -1148,148 +1205,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@angular-eslint/utils": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.3.0.tgz", - "integrity": "sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@typescript-eslint/utils": "7.2.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/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/@angular-eslint/utils/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/@angular/cdk": { - "version": "17.3.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.6.tgz", - "integrity": "sha512-7eKrC61/6pmMAxllU/vYKadZRF7x7GxUYpA5G70fNaQsIUUiZvxx/SJN9AuZEoPGAtF6atKlJD8QVmFoDzv/Lw==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.9.tgz", + "integrity": "sha512-N/7Is+FkIIql5UEL/I+PV6THw+yXNCCGGpwimf/yaNgT9y1fHAmBWhDY0oQqFjCuD+kXl9gQL0ONfsl5Nlnk+w==", "dependencies": { "tslib": "^2.3.0" }, @@ -1303,15 +1222,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.3.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.6.tgz", - "integrity": "sha512-poKaRPeI+hFqX+AxIaEriaIggFVcC3XqlT9E1/uBC2rfHirE1n5F9Z7xqEDtMHduKwLbNXhQIPoKIKya8+Hnew==", + "version": "17.3.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.7.tgz", + "integrity": "sha512-JgCav3sdRCoJHwLXxmF/EMzArYjwbqB+AGUW/xIR98oZET8QxCB985bOFUAm02SkAEUVcMJvjxec+WCaa60m/A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1703.6", - "@angular-devkit/core": "17.3.6", - "@angular-devkit/schematics": "17.3.6", - "@schematics/angular": "17.3.6", + "@angular-devkit/architect": "0.1703.7", + "@angular-devkit/core": "17.3.7", + "@angular-devkit/schematics": "17.3.7", + "@schematics/angular": "17.3.7", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.2", @@ -1343,9 +1262,9 @@ "dev": true }, "node_modules/@angular/common": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.7.tgz", - "integrity": "sha512-A7LRJu1vVCGGgrfZXjU+njz50SiU4weheKCar5PIUprcdIofS1IrHAJDqYh+kwXxkjXbZMOr/ijQY0+AESLEsw==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.9.tgz", + "integrity": "sha512-tH1VfbAvNVaz6ZYa+q0DiKtbmUql1jK/3q/af74B8nVjKLHcXVWwxvBayqvrmlUt7FGANGkETIcCWrB44k47Ug==", "dependencies": { "tslib": "^2.3.0" }, @@ -1353,14 +1272,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.7", + "@angular/core": "17.3.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.7.tgz", - "integrity": "sha512-AlKiqPoxnrpQ0hn13fIaQPSVodaVAIjBW4vpFyuKFqs2LBKg6iolwZ21s8rEI0KR2gXl+8ugj0/UZ6YADiVM5w==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.9.tgz", + "integrity": "sha512-2d4bPbNm7O2GanqCj5GFgPDnmjbAcsQM502Jnvcv7Aje82yecT69JoqAVRqGOfbbxwlJiPhi31D8DPdLaOz47Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -1368,7 +1287,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.7" + "@angular/core": "17.3.9" }, "peerDependenciesMeta": { "@angular/core": { @@ -1377,9 +1296,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.7.tgz", - "integrity": "sha512-vSg5IQZ9jGmvYjpbfH8KbH4Sl1IVeE+Mr1ogcxkGEsURSRvKo7EWc0K7LSEI9+gg0VLamMiP9EyCJdPxiJeLJQ==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.9.tgz", + "integrity": "sha512-J6aqoz5wqPWaurbZFUZ7iMUlzAJYXzntziJJbalm6ceXfUWEe2Vm67nGUROWCIFvO3kWXvkgYX4ubnqtod2AxA==", "dependencies": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -1399,14 +1318,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.7", + "@angular/compiler": "17.3.9", "typescript": ">=5.2 <5.5" } }, "node_modules/@angular/core": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.7.tgz", - "integrity": "sha512-HWcrbxqnvIMSxFuQdN0KPt08bc87hqr0LKm89yuRTUwx/2sNJlNQUobk6aJj4trswGBttcRDT+GOS4DQP2Nr4g==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.9.tgz", + "integrity": "sha512-x+h5BQ6islvYWGVLTz1CEgNq1/5IYngQ+Inq/tWayM6jN7RPOCydCCbCw+uOZS7MgFebkP0gYTVm14y1MRFKSQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1419,9 +1338,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.7.tgz", - "integrity": "sha512-FEhXh/VmT++XCoO8i7bBtzxG7Am/cE1zrr9aF+fWW+4jpWvJvVN1IaSiJxgBB+iPsOJ9lTBRwfRW3onlcDkhrw==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.9.tgz", + "integrity": "sha512-5b8OjK0kLghrdxkVWglgerHVp9D5WvXInXwo1KIyc2v/fGdTlyu/RFi0GLGvzq2y+7Z8TvtXWC82SB47vfx3TQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1429,16 +1348,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.7", - "@angular/core": "17.3.7", - "@angular/platform-browser": "17.3.7", + "@angular/common": "17.3.9", + "@angular/core": "17.3.9", + "@angular/platform-browser": "17.3.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/localize": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.7.tgz", - "integrity": "sha512-GidwcxquawJBZXNQs6cJ3GvmyowupW9JFkG5sVsS6KG4yu9SIt4FZC+EbrVtYDhXI3U2wxGkm+9vDKvkSGzG0g==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.9.tgz", + "integrity": "sha512-ECWWw6GoJh2laopHIf+QT4bDDpSWwQJk95SGPI5mQIEXZXw6w9ms05Sfb8KJTNRXs9kcotloIGK9YanFZxzK1g==", "dependencies": { "@babel/core": "7.23.9", "@types/babel__core": "7.20.5", @@ -1454,14 +1373,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.7", - "@angular/compiler-cli": "17.3.7" + "@angular/compiler": "17.3.9", + "@angular/compiler-cli": "17.3.9" } }, "node_modules/@angular/platform-browser": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.7.tgz", - "integrity": "sha512-Nn8ZMaftAvO9dEwribWdNv+QBHhYIBrRkv85G6et80AXfXoYAr/xcfnQECRFtZgPmANqHC5auv/xrmExQG+Yeg==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.9.tgz", + "integrity": "sha512-vMwHO76rnkz7aV3KHKy23KUFAo/+b0+yHPa6AND5Lee8z5C1J/tA2PdetFAsghlQQsX61JeK4MFJV/f3dFm2dw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1469,9 +1388,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.3.7", - "@angular/common": "17.3.7", - "@angular/core": "17.3.7" + "@angular/animations": "17.3.9", + "@angular/common": "17.3.9", + "@angular/core": "17.3.9" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1480,9 +1399,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.7.tgz", - "integrity": "sha512-9c2I4u0L1p2v1/lW8qy+WaNHisUWbyy6wqsv2v9FfCaSM49Lxymgo9LPFPC4qEG5ei5nE+eIQ2ocRiXXsf5QkQ==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.9.tgz", + "integrity": "sha512-Jmth4hFC4dZsWQRkxB++42sR1pfJUoQbErANrKQMgEPb8H4cLRdB1mAQ6f+OASPBM+FsxDxjXq2kepyLGtF2Vg==", "dependencies": { "tslib": "^2.3.0" }, @@ -1490,16 +1409,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.7", - "@angular/compiler": "17.3.7", - "@angular/core": "17.3.7", - "@angular/platform-browser": "17.3.7" + "@angular/common": "17.3.9", + "@angular/compiler": "17.3.9", + "@angular/core": "17.3.9", + "@angular/platform-browser": "17.3.9" } }, "node_modules/@angular/router": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.7.tgz", - "integrity": "sha512-lMkuRrc1ZjP5JPDxNHqoAhB0uAnfPQ/q6mJrw1s8IZoVV6VyM+FxR5r13ajNcXWC38xy/YhBjpXPF1vBdxuLXg==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.9.tgz", + "integrity": "sha512-0cRF5YBJoDbXGQsRs3wEG+DPvN4PlhEqTa0DkTr9QIDJRg5P1uiDlOclV+w3OxEMsLrmXGmhjauHaWQk07M4LA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1507,9 +1426,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.7", - "@angular/core": "17.3.7", - "@angular/platform-browser": "17.3.7", + "@angular/common": "17.3.9", + "@angular/core": "17.3.9", + "@angular/platform-browser": "17.3.9", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -4844,9 +4763,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.3.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.6.tgz", - "integrity": "sha512-equxbgh2DKzZtiFMoVf1KD4yJcH1q8lpqQ/GSPPQUvONcmHrr+yqdRUdaJ7oZCyCYmXF/nByBxtMKtJr6nKZVg==", + "version": "17.3.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.7.tgz", + "integrity": "sha512-kQNS68jsPQlaWAnKcVeFKNHp6K90uQANvq+9oXb/i+JnYWzuBsHzn2r8bVdMmvjd1HdBRiGtg767XRk3u+jgRw==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -5604,13 +5523,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "17.3.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.6.tgz", - "integrity": "sha512-jCNZdjHSVrI8TrrCnCoXC8GYvQRj7zh+SDdmm91Ve8dbikYNmBOKYLuPaCTsmojWx7ytv962yLlgKzpaa2bbfw==", + "version": "17.3.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.7.tgz", + "integrity": "sha512-HaJroKaberriP4wFefTTSVFrtU9GMvnG3I6ELbOteOyKMH7o2V91FXGJDJ5KnIiLRlBmC30G3r+9Ybc/rtAYkw==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.3.6", - "@angular-devkit/schematics": "17.3.6", + "@angular-devkit/core": "17.3.7", + "@angular-devkit/schematics": "17.3.7", "jsonc-parser": "3.2.1" }, "engines": { @@ -6064,9 +5983,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/send": { @@ -6252,18 +6171,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6279,16 +6198,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6296,12 +6215,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6309,22 +6228,22 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6337,21 +6256,21 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6362,16 +6281,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6388,9 +6307,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -12308,9 +12227,9 @@ } }, "node_modules/jest-preset-angular": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.0.3.tgz", - "integrity": "sha512-usgBL7x0rXMnMSx8iEFeOozj50W6fp+YAmQcQBUdAXhN+PAXRy4UXL6I/rfcAOU09rnnq7RKsLsmhpp/fFEuag==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.0.4.tgz", + "integrity": "sha512-O4WhVRdfiN9TtJMbJbuVJxD3zn6fyOF2Pqvu12fvEVR6FxCN1S1POfR2nU1fRdP+rQZv7iiW+ttxsy+qkE8iCw==", "dev": true, "dependencies": { "bs-logger": "^0.2.6", @@ -14250,9 +14169,9 @@ "dev": true }, "node_modules/ng2-pdf-viewer": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ng2-pdf-viewer/-/ng2-pdf-viewer-10.2.1.tgz", - "integrity": "sha512-FaKuOmAfI9y/28m+iW9kZLVPQ9IOMRsv4t9NTp4wfXWcTpkL90Z3Ih9w/UcG9rF3dQwsYD00zvyOII7lMfCInQ==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/ng2-pdf-viewer/-/ng2-pdf-viewer-10.2.2.tgz", + "integrity": "sha512-GaKAvF0nXAiR9U4LFWuT54MM9nzp0ie8GGscp34W+lFsSOXdlwS0iFx5UPuVlODRm3YEUKx6xcK5oaJeBq0SAw==", "dependencies": { "pdfjs-dist": "^3.11.174", "tslib": "^2.3.0" @@ -14330,9 +14249,9 @@ } }, "node_modules/ngx-ui-tour-core": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/ngx-ui-tour-core/-/ngx-ui-tour-core-12.0.1.tgz", - "integrity": "sha512-IkkSY8l+3huQ5D7cPZ7tnAtP7ijQ85ggsOIohekE/DHqXReX988S2xuXh5A0pU8bS+HLJw2wlC1/XohOknVumA==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/ngx-ui-tour-core/-/ngx-ui-tour-core-12.0.2.tgz", + "integrity": "sha512-x5TOu4mtjojga+ht5LraQU+vOc4by4gof6TKGXDXsyW3kgWXqf7iJm5GUR+aLk7cr9FWdQYVUU+yTUmlI7XhOQ==", "dependencies": { "tslib": "^2.0.0" }, @@ -14344,11 +14263,11 @@ } }, "node_modules/ngx-ui-tour-ng-bootstrap": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/ngx-ui-tour-ng-bootstrap/-/ngx-ui-tour-ng-bootstrap-14.0.2.tgz", - "integrity": "sha512-2w9p5GHG/YDIwOQG+pct2s19P7hvtYbX73rYYV3FF86dXe00xPA7gGl2uSg48H3GjmSD0DeeKPzVWULwSBYNrw==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/ngx-ui-tour-ng-bootstrap/-/ngx-ui-tour-ng-bootstrap-14.0.3.tgz", + "integrity": "sha512-jc/WSSxApouwVpcuP9gOVMUjB8F7Buu2AXiYC05mYVgEnY8L2lFnC9TU8HtmT0nY9e2rnrQNu+wAeetu2REcDA==", "dependencies": { - "ngx-ui-tour-core": "12.0.1", + "ngx-ui-tour-core": "12.0.2", "tslib": "^2.0.0" }, "peerDependencies": { @@ -17871,12 +17790,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" diff --git a/src-ui/package.json b/src-ui/package.json index 340180765..101e6700c 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -11,15 +11,15 @@ }, "private": true, "dependencies": { - "@angular/cdk": "^17.3.6", - "@angular/common": "~17.3.7", - "@angular/compiler": "~17.3.7", - "@angular/core": "~17.3.7", - "@angular/forms": "~17.3.7", - "@angular/localize": "~17.3.7", - "@angular/platform-browser": "~17.3.7", - "@angular/platform-browser-dynamic": "~17.3.7", - "@angular/router": "~17.3.7", + "@angular/cdk": "^17.3.9", + "@angular/common": "~17.3.9", + "@angular/compiler": "~17.3.9", + "@angular/core": "~17.3.9", + "@angular/forms": "~17.3.9", + "@angular/localize": "~17.3.9", + "@angular/platform-browser": "~17.3.9", + "@angular/platform-browser-dynamic": "~17.3.9", + "@angular/router": "~17.3.9", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@ng-select/ng-select": "^12.0.7", "@ngneat/dirty-check-forms": "^3.0.3", @@ -27,13 +27,13 @@ "bootstrap": "^5.3.3", "file-saver": "^2.0.5", "mime-names": "^1.0.0", - "ng2-pdf-viewer": "^10.2.1", + "ng2-pdf-viewer": "^10.2.2", "ngx-bootstrap-icons": "^1.9.3", "ngx-color": "^9.0.0", "ngx-cookie-service": "^17.1.0", "ngx-file-drop": "^16.0.0", "ngx-filesize": "^3.0.3", - "ngx-ui-tour-ng-bootstrap": "^14.0.2", + "ngx-ui-tour-ng-bootstrap": "^14.0.3", "rxjs": "^7.8.1", "tslib": "^2.6.2", "uuid": "^9.0.1", @@ -41,13 +41,13 @@ }, "devDependencies": { "@angular-builders/jest": "17.0.3", - "@angular-devkit/build-angular": "~17.3.6", - "@angular-eslint/builder": "17.3.0", - "@angular-eslint/eslint-plugin": "17.3.0", - "@angular-eslint/eslint-plugin-template": "17.3.0", - "@angular-eslint/schematics": "17.3.0", - "@angular-eslint/template-parser": "17.3.0", - "@angular/cli": "~17.3.6", + "@angular-devkit/build-angular": "~17.3.7", + "@angular-eslint/builder": "17.4.1", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@angular-eslint/schematics": "17.4.1", + "@angular-eslint/template-parser": "17.4.1", + "@angular/cli": "~17.3.7", "@angular/compiler-cli": "~17.3.2", "@playwright/test": "^1.42.1", "@types/jest": "^29.5.12", From 3facdefa40d5d071baa980493b6b6ef4d58538cb Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 17 May 2024 19:05:11 -0700 Subject: [PATCH 08/51] Fix: tweak pdf preview page borders --- .../common/preview-popup/preview-popup.component.html | 2 +- .../document-detail/document-detail.component.scss | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src-ui/src/app/components/common/preview-popup/preview-popup.component.html b/src-ui/src/app/components/common/preview-popup/preview-popup.component.html index af745cba2..ecbc215d8 100644 --- a/src-ui/src/app/components/common/preview-popup/preview-popup.component.html +++ b/src-ui/src/app/components/common/preview-popup/preview-popup.component.html @@ -16,7 +16,7 @@ diff --git a/src-ui/src/app/components/document-detail/document-detail.component.scss b/src-ui/src/app/components/document-detail/document-detail.component.scss index 2e9e63e6e..e5032d3f3 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.scss +++ b/src-ui/src/app/components/document-detail/document-detail.component.scss @@ -5,6 +5,7 @@ } .pdf-viewer-container { + padding-top: 10px; background-color: gray; pdf-viewer { @@ -14,11 +15,8 @@ } ::ng-deep .ng2-pdf-viewer-container .page { - --page-margin: 10px auto; -} - -::ng-deep .ng2-pdf-viewer-container .page:last-child { - --page-margin: 10px auto 20px; + --page-margin: 0 auto 10px; + --page-border: 0; } ::ng-deep form .ng-select-taggable { From 622f6241329b4ea1579782096ebb905e1dda7ac9 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 17 May 2024 19:26:50 -0700 Subject: [PATCH 09/51] Chore: Change the code formatter to Ruff (#6756) * Changing the formatting to ruff-format * Replaces references to black to ruff or ruff format, removes black from dependencies --- .github/dependabot.yml | 1 - .pre-commit-config.yaml | 5 +-- CONTRIBUTING.md | 2 +- Pipfile | 1 - Pipfile.lock | 43 ++----------------- docker/wait-for-redis.py | 1 + docs/development.md | 2 +- src/documents/barcodes.py | 1 - src/documents/bulk_edit.py | 3 -- .../management/commands/document_importer.py | 19 ++++---- ...lter_customfieldinstance_value_monetary.py | 1 - ...tion_remove_all_correspondents_and_more.py | 1 - .../1047_savedview_display_mode_and_more.py | 1 - ...048_alter_savedviewfilterrule_rule_type.py | 1 - src/documents/serialisers.py | 4 +- src/documents/tasks.py | 11 +++-- src/documents/tests/test_api_bulk_edit.py | 1 - src/documents/tests/test_consumer.py | 7 --- src/documents/tests/test_date_parsing.py | 1 - src/documents/tests/test_file_handling.py | 9 ++-- src/documents/views.py | 8 ++-- ...plicationconfiguration_max_image_pixels.py | 1 - src/paperless/settings.py | 20 +++------ src/paperless/tests/test_adapter.py | 1 - src/paperless_mail/models.py | 9 ++-- src/paperless_mail/parsers.py | 33 ++++++++------ src/paperless_tika/parsers.py | 11 +++-- 27 files changed, 78 insertions(+), 120 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f37e793fc..1ed22b439 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -53,7 +53,6 @@ updates: development: patterns: - "*pytest*" - - "black" - "ruff" - "mkdocs-material" django: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0b97ff415..87780b056 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -50,10 +50,7 @@ repos: rev: 'v0.4.4' hooks: - id: ruff - - repo: https://github.com/psf/black-pre-commit-mirror - rev: 24.4.2 - hooks: - - id: black + - id: ruff-format # Dockerfile hooks - repo: https://github.com/AleksaC/hadolint-py rev: v2.12.0.3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 222984113..4136b547e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ If you want to implement something big: ## Python -Paperless supports python 3.9 - 3.11. We format Python code with [Black](https://github.com/psf/black). +Paperless supports python 3.9 - 3.11. We format Python code with [ruff](https://docs.astral.sh/ruff/formatter/). ## Branches diff --git a/Pipfile b/Pipfile index 702680149..aee4c5ba4 100644 --- a/Pipfile +++ b/Pipfile @@ -59,7 +59,6 @@ zxing-cpp = {version = "*", platform_machine = "== 'x86_64'"} [dev-packages] # Linting -black = "*" pre-commit = "*" ruff = "*" # Testing diff --git a/Pipfile.lock b/Pipfile.lock index 369e34c17..ec194787d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "6fd62d37d4c5f6ec99765b037073e8d07db40dbddb2c591664406035970f7d4a" + "sha256": "4bb46e902c6ceb6e3647772809b7941e318f1408472c4eaf0a1d2f0360ddac3a" }, "pipfile-spec": 6, "requires": {}, @@ -466,10 +466,10 @@ "socialaccount" ], "hashes": [ - "sha256:fbe0148c6258eac44e701a8f36e0950b5d0b1c60bde3e178683a4239f49311fc" + "sha256:ef52957992ac3dfc57dec4f7c078bb317b7b47bd7bf6b15f2c12a31c9892ad4c" ], "markers": "python_version >= '3.7'", - "version": "==0.63.0" + "version": "==0.63.1" }, "django-auditlog": { "hashes": [ @@ -2500,35 +2500,6 @@ "markers": "python_version >= '3.8'", "version": "==2.15.0" }, - "black": { - "hashes": [ - "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474", - "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1", - "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0", - "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8", - "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96", - "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1", - "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04", - "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021", - "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94", - "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d", - "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c", - "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7", - "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c", - "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc", - "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7", - "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d", - "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c", - "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741", - "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce", - "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb", - "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063", - "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.4.2" - }, "certifi": { "hashes": [ "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", @@ -3099,14 +3070,6 @@ "markers": "python_version >= '3.8'", "version": "==1.3.1" }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, "nodeenv": { "hashes": [ "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", diff --git a/docker/wait-for-redis.py b/docker/wait-for-redis.py index 41df5a08b..c3e4f1d59 100755 --- a/docker/wait-for-redis.py +++ b/docker/wait-for-redis.py @@ -4,6 +4,7 @@ Simple script which attempts to ping the Redis broker as set in the environment a certain number of times, waiting a little bit in between """ + import os import sys import time diff --git a/docs/development.md b/docs/development.md index a87641ded..969c293b1 100644 --- a/docs/development.md +++ b/docs/development.md @@ -47,7 +47,7 @@ early on. Once installed, hooks will run when you commit. If the formatting isn't quite right or a linter catches something, the commit will be rejected. You'll need to look at the output and fix the issue. Some hooks, such -as the Python formatting tool `black`, will format failing +as the Python linting and formatting tool `ruff`, will format failing files, so all you need to do is `git add` those files again and retry your commit. diff --git a/src/documents/barcodes.py b/src/documents/barcodes.py index 6fa9188b6..2e290a61b 100644 --- a/src/documents/barcodes.py +++ b/src/documents/barcodes.py @@ -107,7 +107,6 @@ class BarcodePlugin(ConsumeTaskPlugin): if settings.CONSUMER_ENABLE_BARCODES and ( separator_pages := self.get_separation_pages() ): - # We have pages to split against # Note this does NOT use the base_temp_dir, as that will be removed diff --git a/src/documents/bulk_edit.py b/src/documents/bulk_edit.py index 08965bb15..f59ef1af3 100644 --- a/src/documents/bulk_edit.py +++ b/src/documents/bulk_edit.py @@ -25,7 +25,6 @@ logger = logging.getLogger("paperless.bulk_edit") def set_correspondent(doc_ids: list[int], correspondent): - if correspondent: correspondent = Correspondent.objects.only("pk").get(id=correspondent) @@ -81,7 +80,6 @@ def set_document_type(doc_ids: list[int], document_type): def add_tag(doc_ids: list[int], tag: int): - qs = Document.objects.filter(Q(id__in=doc_ids) & ~Q(tags__id=tag)).only("pk") affected_docs = list(qs.values_list("pk", flat=True)) @@ -97,7 +95,6 @@ def add_tag(doc_ids: list[int], tag: int): def remove_tag(doc_ids: list[int], tag: int): - qs = Document.objects.filter(Q(id__in=doc_ids) & Q(tags__id=tag)).only("pk") affected_docs = list(qs.values_list("pk", flat=True)) diff --git a/src/documents/management/commands/document_importer.py b/src/documents/management/commands/document_importer.py index dc0ac36fd..5cf036b0f 100644 --- a/src/documents/management/commands/document_importer.py +++ b/src/documents/management/commands/document_importer.py @@ -151,14 +151,17 @@ class Command(BaseCommand): self._check_manifest_valid() - with disable_signal( - post_save, - receiver=update_filename_and_move_files, - sender=Document, - ), disable_signal( - m2m_changed, - receiver=update_filename_and_move_files, - sender=Document.tags.through, + with ( + disable_signal( + post_save, + receiver=update_filename_and_move_files, + sender=Document, + ), + disable_signal( + m2m_changed, + receiver=update_filename_and_move_files, + sender=Document.tags.through, + ), ): if settings.AUDIT_LOG_ENABLED: auditlog.unregister(Document) diff --git a/src/documents/migrations/1045_alter_customfieldinstance_value_monetary.py b/src/documents/migrations/1045_alter_customfieldinstance_value_monetary.py index 9689bbdad..597fbb7f9 100644 --- a/src/documents/migrations/1045_alter_customfieldinstance_value_monetary.py +++ b/src/documents/migrations/1045_alter_customfieldinstance_value_monetary.py @@ -5,7 +5,6 @@ from django.db import models class Migration(migrations.Migration): - dependencies = [ ("documents", "1044_workflow_workflowaction_workflowtrigger_and_more"), ] diff --git a/src/documents/migrations/1046_workflowaction_remove_all_correspondents_and_more.py b/src/documents/migrations/1046_workflowaction_remove_all_correspondents_and_more.py index 6ce5da958..3ab010a3c 100644 --- a/src/documents/migrations/1046_workflowaction_remove_all_correspondents_and_more.py +++ b/src/documents/migrations/1046_workflowaction_remove_all_correspondents_and_more.py @@ -7,7 +7,6 @@ from django.db import models class Migration(migrations.Migration): - dependencies = [ ("auth", "0012_alter_user_first_name_max_length"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), diff --git a/src/documents/migrations/1047_savedview_display_mode_and_more.py b/src/documents/migrations/1047_savedview_display_mode_and_more.py index 3bfd638f9..904f86bb1 100644 --- a/src/documents/migrations/1047_savedview_display_mode_and_more.py +++ b/src/documents/migrations/1047_savedview_display_mode_and_more.py @@ -6,7 +6,6 @@ from django.db import models class Migration(migrations.Migration): - dependencies = [ ("documents", "1046_workflowaction_remove_all_correspondents_and_more"), ] diff --git a/src/documents/migrations/1048_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1048_alter_savedviewfilterrule_rule_type.py index dc4d0bf1c..904ad242c 100644 --- a/src/documents/migrations/1048_alter_savedviewfilterrule_rule_type.py +++ b/src/documents/migrations/1048_alter_savedviewfilterrule_rule_type.py @@ -5,7 +5,6 @@ from django.db import models class Migration(migrations.Migration): - dependencies = [ ("documents", "1047_savedview_display_mode_and_more"), ] diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index ebe857948..9d722ca5d 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -93,7 +93,9 @@ class MatchingModelSerializer(serializers.ModelSerializer): owner = ( data["owner"] if "owner" in data - else self.user if hasattr(self, "user") else None + else self.user + if hasattr(self, "user") + else None ) pk = self.instance.pk if hasattr(self.instance, "pk") else None if ("name" in data or "owner" in data) and self.Meta.model.objects.filter( diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 1bc812bfd..e3b2df990 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -117,10 +117,13 @@ def consume_file( ConsumerPlugin, ] - with ProgressManager( - overrides.filename or input_doc.original_file.name, - self.request.id, - ) as status_mgr, TemporaryDirectory(dir=settings.SCRATCH_DIR) as tmp_dir: + with ( + ProgressManager( + overrides.filename or input_doc.original_file.name, + self.request.id, + ) as status_mgr, + TemporaryDirectory(dir=settings.SCRATCH_DIR) as tmp_dir, + ): tmp_dir = Path(tmp_dir) for plugin_class in plugins: plugin_name = plugin_class.NAME diff --git a/src/documents/tests/test_api_bulk_edit.py b/src/documents/tests/test_api_bulk_edit.py index 55c0c519b..c38ed8cfd 100644 --- a/src/documents/tests/test_api_bulk_edit.py +++ b/src/documents/tests/test_api_bulk_edit.py @@ -136,7 +136,6 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): @mock.patch("documents.bulk_edit.bulk_update_documents.delay") def test_api_add_tag(self, bulk_update_task_mock): - self.assertFalse(self.doc1.tags.filter(pk=self.t1.pk).exists()) response = self.client.post( diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 3874ebac6..b585d70c5 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -425,7 +425,6 @@ class TestConsumer( self._assert_first_last_send_progress() def testOverrideTitle(self): - with self.get_consumer( self.get_test_file(), DocumentMetadataOverrides(title="Override Title"), @@ -441,7 +440,6 @@ class TestConsumer( def testOverrideTitleInvalidPlaceholders(self): with self.assertLogs("paperless.consumer", level="ERROR") as cm: - with self.get_consumer( self.get_test_file(), DocumentMetadataOverrides(title="Override {correspondent]"), @@ -546,7 +544,6 @@ class TestConsumer( self._assert_first_last_send_progress() def testOverrideAsn(self): - with self.get_consumer( self.get_test_file(), DocumentMetadataOverrides(asn=123), @@ -614,7 +611,6 @@ class TestConsumer( self._assert_first_last_send_progress() def testNotAFile(self): - with self.get_consumer(Path("non-existing-file")) as consumer: with self.assertRaisesMessage(ConsumerError, "File not found"): consumer.run() @@ -725,7 +721,6 @@ class TestConsumer( @override_settings(FILENAME_FORMAT="{correspondent}/{title}") def testFilenameHandling(self): - with self.get_consumer( self.get_test_file(), DocumentMetadataOverrides(title="new docs"), @@ -1055,7 +1050,6 @@ class PreConsumeTestCase(DirectoriesMixin, GetConsumerMixin, TestCase): @override_settings(PRE_CONSUME_SCRIPT="does-not-exist") def test_pre_consume_script_not_found(self, m): with self.get_consumer(self.test_file) as c: - self.assertRaises(ConsumerError, c.run) m.assert_not_called() @@ -1254,7 +1248,6 @@ class PostConsumeTestCase(DirectoriesMixin, GetConsumerMixin, TestCase): os.chmod(script.name, st.st_mode | stat.S_IEXEC) with override_settings(POST_CONSUME_SCRIPT=script.name): - doc = Document.objects.create(title="Test", mime_type="application/pdf") with self.get_consumer(self.test_file) as consumer: with self.assertRaisesRegex( diff --git a/src/documents/tests/test_date_parsing.py b/src/documents/tests/test_date_parsing.py index 4c75e5f6b..006ae5e96 100644 --- a/src/documents/tests/test_date_parsing.py +++ b/src/documents/tests/test_date_parsing.py @@ -10,7 +10,6 @@ from documents.parsers import parse_date_generator class TestDate(TestCase): - def test_date_format_1(self): text = "lorem ipsum 130218 lorem ipsum" self.assertEqual(parse_date("", text), None) diff --git a/src/documents/tests/test_file_handling.py b/src/documents/tests/test_file_handling.py index fe5a5b589..2f085f2ce 100644 --- a/src/documents/tests/test_file_handling.py +++ b/src/documents/tests/test_file_handling.py @@ -144,9 +144,12 @@ class TestFileHandling(DirectoriesMixin, FileSystemAssertsMixin, TestCase): # Set a correspondent and save the document document.correspondent = Correspondent.objects.get_or_create(name="test")[0] - with mock.patch( - "documents.signals.handlers.Document.objects.filter", - ) as m, disable_auditlog(): + with ( + mock.patch( + "documents.signals.handlers.Document.objects.filter", + ) as m, + disable_auditlog(), + ): m.side_effect = DatabaseError() document.save() diff --git a/src/documents/views.py b/src/documents/views.py index 89a4a9011..8b3486f76 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -618,7 +618,6 @@ class DocumentViewSet( @action(methods=["get", "post", "delete"], detail=True) def notes(self, request, pk=None): - currentUser = request.user try: doc = ( @@ -1337,7 +1336,6 @@ class StatisticsView(APIView): permission_classes = (IsAuthenticated,) def get(self, request, format=None): - user = request.user if request.user is not None else None documents = ( @@ -1533,9 +1531,9 @@ class UiSettingsView(GenericAPIView): if hasattr(user, "ui_settings"): ui_settings = user.ui_settings.settings if "update_checking" in ui_settings: - ui_settings["update_checking"][ - "backend_setting" - ] = settings.ENABLE_UPDATE_CHECK + ui_settings["update_checking"]["backend_setting"] = ( + settings.ENABLE_UPDATE_CHECK + ) else: ui_settings["update_checking"] = { "backend_setting": settings.ENABLE_UPDATE_CHECK, diff --git a/src/paperless/migrations/0003_alter_applicationconfiguration_max_image_pixels.py b/src/paperless/migrations/0003_alter_applicationconfiguration_max_image_pixels.py index c27feefb3..cac873552 100644 --- a/src/paperless/migrations/0003_alter_applicationconfiguration_max_image_pixels.py +++ b/src/paperless/migrations/0003_alter_applicationconfiguration_max_image_pixels.py @@ -6,7 +6,6 @@ from django.db import models class Migration(migrations.Migration): - dependencies = [ ("paperless", "0002_applicationconfiguration_app_logo_and_more"), ] diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 31ddb8b29..5c7aa6c19 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -171,8 +171,7 @@ def _parse_beat_schedule() -> dict: "task": "paperless_mail.tasks.process_mail_accounts", "options": { # 1 minute before default schedule sends again - "expires": 9.0 - * 60.0, + "expires": 9.0 * 60.0, }, }, { @@ -183,8 +182,7 @@ def _parse_beat_schedule() -> dict: "task": "documents.tasks.train_classifier", "options": { # 1 minute before default schedule sends again - "expires": 59.0 - * 60.0, + "expires": 59.0 * 60.0, }, }, { @@ -195,9 +193,7 @@ def _parse_beat_schedule() -> dict: "task": "documents.tasks.index_optimize", "options": { # 1 hour before default schedule sends again - "expires": 23.0 - * 60.0 - * 60.0, + "expires": 23.0 * 60.0 * 60.0, }, }, { @@ -208,9 +204,7 @@ def _parse_beat_schedule() -> dict: "task": "documents.tasks.sanity_check", "options": { # 1 hour before default schedule sends again - "expires": ((7.0 * 24.0) - 1.0) - * 60.0 - * 60.0, + "expires": ((7.0 * 24.0) - 1.0) * 60.0 * 60.0, }, }, ] @@ -822,9 +816,9 @@ CACHES = { } if DEBUG and os.getenv("PAPERLESS_CACHE_BACKEND") is None: - CACHES["default"][ - "BACKEND" - ] = "django.core.cache.backends.locmem.LocMemCache" # pragma: no cover + CACHES["default"]["BACKEND"] = ( + "django.core.cache.backends.locmem.LocMemCache" # pragma: no cover + ) def default_threads_per_worker(task_workers) -> int: diff --git a/src/paperless/tests/test_adapter.py b/src/paperless/tests/test_adapter.py index 8e73cafea..5659a279a 100644 --- a/src/paperless/tests/test_adapter.py +++ b/src/paperless/tests/test_adapter.py @@ -29,7 +29,6 @@ class TestCustomAccountAdapter(TestCase): with context.request_context(request): adapter = get_adapter() with override_settings(ALLOWED_HOSTS=["*"]): - # True because request host is same url = "https://example.com" self.assertTrue(adapter.is_safe_url(url)) diff --git a/src/paperless_mail/models.py b/src/paperless_mail/models.py index 29a0afbef..2343259a8 100644 --- a/src/paperless_mail/models.py +++ b/src/paperless_mail/models.py @@ -63,9 +63,12 @@ class MailRule(document_models.ModelWithOwner): class ConsumptionScope(models.IntegerChoices): ATTACHMENTS_ONLY = 1, _("Only process attachments.") EML_ONLY = 2, _("Process full Mail (with embedded attachments in file) as .eml") - EVERYTHING = 3, _( - "Process full Mail (with embedded attachments in file) as .eml " - "+ process attachments as separate documents", + EVERYTHING = ( + 3, + _( + "Process full Mail (with embedded attachments in file) as .eml " + "+ process attachments as separate documents", + ), ) class AttachmentProcessing(models.IntegerChoices): diff --git a/src/paperless_mail/parsers.py b/src/paperless_mail/parsers.py index b8cf12980..9275c5579 100644 --- a/src/paperless_mail/parsers.py +++ b/src/paperless_mail/parsers.py @@ -222,10 +222,13 @@ class MailDocumentParser(DocumentParser): self.log.debug("Merging email text and HTML content into single PDF") - with GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, client.merge.merge() as route: + with ( + GotenbergClient( + host=settings.TIKA_GOTENBERG_ENDPOINT, + timeout=settings.CELERY_TASK_TIME_LIMIT, + ) as client, + client.merge.merge() as route, + ): # Configure requested PDF/A formatting, if any pdf_a_format = self._settings_to_gotenberg_pdfa() if pdf_a_format is not None: @@ -310,10 +313,13 @@ class MailDocumentParser(DocumentParser): css_file = Path(__file__).parent / "templates" / "output.css" email_html_file = self.mail_to_html(mail) - with GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, client.chromium.html_to_pdf() as route: + with ( + GotenbergClient( + host=settings.TIKA_GOTENBERG_ENDPOINT, + timeout=settings.CELERY_TASK_TIME_LIMIT, + ) as client, + client.chromium.html_to_pdf() as route, + ): # Configure requested PDF/A formatting, if any pdf_a_format = self._settings_to_gotenberg_pdfa() if pdf_a_format is not None: @@ -363,10 +369,13 @@ class MailDocumentParser(DocumentParser): html_clean_file = tempdir / "index.html" html_clean_file.write_text(html_clean) - with GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, client.chromium.html_to_pdf() as route: + with ( + GotenbergClient( + host=settings.TIKA_GOTENBERG_ENDPOINT, + timeout=settings.CELERY_TASK_TIME_LIMIT, + ) as client, + client.chromium.html_to_pdf() as route, + ): # Configure requested PDF/A formatting, if any pdf_a_format = self._settings_to_gotenberg_pdfa() if pdf_a_format is not None: diff --git a/src/paperless_tika/parsers.py b/src/paperless_tika/parsers.py index a6ef4b14a..d5589cca4 100644 --- a/src/paperless_tika/parsers.py +++ b/src/paperless_tika/parsers.py @@ -88,10 +88,13 @@ class TikaDocumentParser(DocumentParser): self.log.info(f"Converting {document_path} to PDF as {pdf_path}") - with GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, client.libre_office.to_pdf() as route: + with ( + GotenbergClient( + host=settings.TIKA_GOTENBERG_ENDPOINT, + timeout=settings.CELERY_TASK_TIME_LIMIT, + ) as client, + client.libre_office.to_pdf() as route, + ): # Set the output format of the resulting PDF if settings.OCR_OUTPUT_TYPE in { OutputTypeChoices.PDF_A, From 79067041dd9c864b59948d38f4cfa09615aa35ed Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 17 May 2024 23:44:55 -0700 Subject: [PATCH 10/51] Documentation: correct usage --- docs/usage.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 52713fb86..2900e67f4 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -421,13 +421,12 @@ to optionally attach data to documents which does not fit in the existing set of Paperless-ngx provides. 1. First, create a custom field (under "Manage"), with a given name and data type. This could be something like "Invoice Number" or "Date Paid", with a data type of "Number", "Date", "String", etc. -2. Once created, a field can be used with documents and data stored. To do so, use the "Custom Fields" menu on the document detail page, choose your existing field and click "Add". Once the field is visible in the form you can enter the appropriate - data which will be validated according to the custom field "data type". +2. Once created, a field can be used with documents and data stored. To do so, use the "Custom Fields" menu on the document detail page, choose your existing field from the dropdown. Once the field is visible in the form you can enter the appropriate data which will be validated according to the custom field "data type". 3. Fields can be removed by hovering over the field name revealing a "Remove" button. !!! important - Added / removed fields, as well as any data is not saved to the document until you + Added / removed fields, as well as any data, is not saved to the document until you actually hit the "Save" button, similar to other changes on the document details page. !!! note From 3061c59c067e85cea5a91689e8b675dd3c81d531 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 17 May 2024 23:50:57 -0700 Subject: [PATCH 11/51] Chore: add system status to bug report --- .github/ISSUE_TEMPLATE/bug-report.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 992312a39..1736b5f08 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -86,6 +86,12 @@ body: description: Note there are significant differences from the official image and linuxserver.io, please check if your issue is specific to the third-party image. validations: required: true + - type: textarea + id: system-status + attributes: + label: System status + description: If available, copy & paste the system status output from Settings > System Status > Copy + render: json - type: input id: browser attributes: @@ -97,11 +103,6 @@ body: attributes: label: Configuration changes description: Any configuration changes you made in `docker-compose.yml`, `docker-compose.env` or `paperless.conf`. - - type: input - id: other - attributes: - label: Other - description: Any other relevant details. - type: checkboxes id: required-checks attributes: From 2a0c03eda006061f5ca8dbf83ada8be0a482b62e Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 20 May 2024 09:40:19 -0700 Subject: [PATCH 12/51] Enhancement: support custom logo / title on login page (#6775) --- src/documents/context_processors.py | 17 + .../static/{accounts.css => base.css} | 18 + .../templates/paperless-ngx/base.html | 21 +- .../paperless-ngx/snippets/svg_leaf.html | 5 + src/locale/en_US/LC_MESSAGES/django.po | 412 +++++++++--------- 5 files changed, 273 insertions(+), 200 deletions(-) rename src/documents/static/{accounts.css => base.css} (88%) create mode 100644 src/documents/templates/paperless-ngx/snippets/svg_leaf.html diff --git a/src/documents/context_processors.py b/src/documents/context_processors.py index 9f8dacfb3..91a7ce391 100644 --- a/src/documents/context_processors.py +++ b/src/documents/context_processors.py @@ -1,11 +1,28 @@ from django.conf import settings as django_settings +from paperless.config import GeneralConfig + def settings(request): + general_config = GeneralConfig() + + app_title = ( + django_settings.APP_TITLE + if general_config.app_title is None or len(general_config.app_title) == 0 + else general_config.app_title + ) + app_logo = ( + django_settings.APP_LOGO + if general_config.app_logo is None or len(general_config.app_logo) == 0 + else general_config.app_logo + ) + return { "EMAIL_ENABLED": django_settings.EMAIL_HOST != "localhost" or django_settings.EMAIL_HOST_USER != "", "DISABLE_REGULAR_LOGIN": django_settings.DISABLE_REGULAR_LOGIN, "ACCOUNT_ALLOW_SIGNUPS": django_settings.ACCOUNT_ALLOW_SIGNUPS, "domain": getattr(django_settings, "PAPERLESS_URL", request.get_host()), + "APP_TITLE": app_title, + "APP_LOGO": app_logo, } diff --git a/src/documents/static/accounts.css b/src/documents/static/base.css similarity index 88% rename from src/documents/static/accounts.css rename to src/documents/static/base.css index 2a1d905f9..90d8d7b77 100644 --- a/src/documents/static/accounts.css +++ b/src/documents/static/base.css @@ -7,6 +7,19 @@ body { --pngx-primary-active: #0c2c10; } +.logo { + height: auto; +} + +.byline { + font-size: 0.6rem; + letter-spacing: 0.1rem; +} + +.text-primary { + color: var(--pngx-primary) !important; +} + .form-control { --bs-body-bg: #fff; } @@ -28,6 +41,7 @@ body { .form-accounts { max-width: 330px; + min-width: 300px; } .form-stacked-top input { @@ -74,4 +88,8 @@ body { svg.logo .text { fill: #abb2bf !important; } + + .byline { + color: #abb2bf; + } } diff --git a/src/documents/templates/paperless-ngx/base.html b/src/documents/templates/paperless-ngx/base.html index 7a15320fd..49fc0edf4 100644 --- a/src/documents/templates/paperless-ngx/base.html +++ b/src/documents/templates/paperless-ngx/base.html @@ -13,14 +13,31 @@ {% endblock head_title %} - +
{% csrf_token %} - {% include "paperless-ngx/snippets/svg_logo.html" with extra_attrs="width='300' class='logo mb-4'" %} + {% if not APP_LOGO and not APP_TITLE %} + {% include "paperless-ngx/snippets/svg_logo.html" with extra_attrs="width='300' class='logo mb-4'" %} + {% else %} + {% if APP_LOGO %} + +
+ +
+ {% else %} +

+ {% include "paperless-ngx/snippets/svg_leaf.html" with extra_attrs="width='30' class='mt-2'" %} +
+ {{ APP_TITLE }} + +
+

+ {% endif %} + {% endif %} {% for message in messages %}
-
-
- @if (messageBold) { -

{{messageBold}}

- } - @if (message) { -

- } -
-
@if (showPDFNote) {

Note that only PDFs will be rotated.

} - } @else { - @switch (contentRenderType) { + @switch (archiveContentRenderType) { @case (ContentRenderType.PDF) { @if (!useNativePdfViewer) {
diff --git a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts index d27c13ef1..b8a6389f2 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts @@ -81,6 +81,7 @@ import { environment } from 'src/environments/environment' import { RotateConfirmDialogComponent } from '../common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component' import { SplitConfirmDialogComponent } from '../common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component' import { PdfViewerModule } from 'ng2-pdf-viewer' +import { DeletePagesConfirmDialogComponent } from '../common/confirm-dialog/delete-pages-confirm-dialog/delete-pages-confirm-dialog.component' const doc: Document = { id: 3, @@ -178,6 +179,7 @@ describe('DocumentDetailComponent', () => { CustomFieldsDropdownComponent, SplitConfirmDialogComponent, RotateConfirmDialogComponent, + DeletePagesConfirmDialogComponent, ], providers: [ DocumentTitlePipe, @@ -1035,7 +1037,9 @@ describe('DocumentDetailComponent', () => { component.metadata = { has_archive_version: true } initNormally() fixture.detectChanges() - expect(component.contentRenderType).toEqual(component.ContentRenderType.PDF) + expect(component.archiveContentRenderType).toEqual( + component.ContentRenderType.PDF + ) expect( fixture.debugElement.query(By.css('pdf-viewer-container')) ).not.toBeUndefined() @@ -1045,7 +1049,7 @@ describe('DocumentDetailComponent', () => { original_mime_type: 'text/plain', } fixture.detectChanges() - expect(component.contentRenderType).toEqual( + expect(component.archiveContentRenderType).toEqual( component.ContentRenderType.Text ) expect( @@ -1057,7 +1061,7 @@ describe('DocumentDetailComponent', () => { original_mime_type: 'image/jpg', } fixture.detectChanges() - expect(component.contentRenderType).toEqual( + expect(component.archiveContentRenderType).toEqual( component.ContentRenderType.Image ) expect( @@ -1070,7 +1074,7 @@ describe('DocumentDetailComponent', () => { 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', } fixture.detectChanges() - expect(component.contentRenderType).toEqual( + expect(component.archiveContentRenderType).toEqual( component.ContentRenderType.Other ) expect( @@ -1130,6 +1134,31 @@ describe('DocumentDetailComponent', () => { req.flush(true) }) + it('should support delete pages', () => { + let modal: NgbModalRef + modalService.activeInstances.subscribe((m) => (modal = m[0])) + initNormally() + component.deletePages() + expect(modal).not.toBeUndefined() + modal.componentInstance.documentID = doc.id + modal.componentInstance.pages = [1, 2] + modal.componentInstance.confirm() + let req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/bulk_edit/` + ) + expect(req.request.body).toEqual({ + documents: [doc.id], + method: 'delete_pages', + parameters: { pages: [1, 2] }, + }) + req.error(new ProgressEvent('failed')) + modal.componentInstance.confirm() + req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/bulk_edit/` + ) + req.flush(true) + }) + it('should support keyboard shortcuts', () => { initNormally() diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index 820d7fbd5..23753f55b 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -68,6 +68,7 @@ import { CustomFieldInstance } from 'src/app/data/custom-field-instance' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { SplitConfirmDialogComponent } from '../common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component' import { RotateConfirmDialogComponent } from '../common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component' +import { DeletePagesConfirmDialogComponent } from '../common/confirm-dialog/delete-pages-confirm-dialog/delete-pages-confirm-dialog.component' import { HotKeyService } from 'src/app/services/hot-key.service' import { PDFDocumentProxy } from 'ng2-pdf-viewer' @@ -216,19 +217,27 @@ export class DocumentDetailComponent return this.settings.get(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER) } - get contentRenderType(): ContentRenderType { - if (!this.metadata) return ContentRenderType.Unknown - const contentType = this.metadata?.has_archive_version - ? 'application/pdf' - : this.metadata?.original_mime_type + get archiveContentRenderType(): ContentRenderType { + return this.getRenderType( + this.metadata?.has_archive_version + ? 'application/pdf' + : this.metadata?.original_mime_type + ) + } - if (contentType === 'application/pdf') { + get originalContentRenderType(): ContentRenderType { + return this.getRenderType(this.metadata?.original_mime_type) + } + + private getRenderType(mimeType: string): ContentRenderType { + if (!mimeType) return ContentRenderType.Unknown + if (mimeType === 'application/pdf') { return ContentRenderType.PDF } else if ( - ['text/plain', 'application/csv', 'text/csv'].includes(contentType) + ['text/plain', 'application/csv', 'text/csv'].includes(mimeType) ) { return ContentRenderType.Text - } else if (contentType?.indexOf('image/') === 0) { + } else if (mimeType?.indexOf('image/') === 0) { return ContentRenderType.Image } return ContentRenderType.Other @@ -1138,7 +1147,6 @@ export class DocumentDetailComponent }) modal.componentInstance.title = $localize`Rotate confirm` modal.componentInstance.messageBold = $localize`This operation will permanently rotate the original version of the current document.` - modal.componentInstance.message = $localize`This will alter the original copy.` modal.componentInstance.btnCaption = $localize`Proceed` modal.componentInstance.documentID = this.document.id modal.componentInstance.showPDFNote = false @@ -1173,4 +1181,41 @@ export class DocumentDetailComponent }) }) } + + deletePages() { + let modal = this.modalService.open(DeletePagesConfirmDialogComponent, { + backdrop: 'static', + }) + modal.componentInstance.title = $localize`Delete pages confirm` + modal.componentInstance.messageBold = $localize`This operation will permanently delete the selected pages from the original document.` + modal.componentInstance.btnCaption = $localize`Proceed` + modal.componentInstance.documentID = this.document.id + modal.componentInstance.confirmClicked + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe(() => { + modal.componentInstance.buttonsEnabled = false + this.documentsService + .bulkEdit([this.document.id], 'delete_pages', { + pages: modal.componentInstance.pages, + }) + .pipe(first(), takeUntil(this.unsubscribeNotifier)) + .subscribe({ + next: () => { + this.toastService.showInfo( + $localize`Delete pages operation will begin in the background. Close and re-open or reload this document after the operation has completed to see the changes.` + ) + modal.close() + }, + error: (error) => { + if (modal) { + modal.componentInstance.buttonsEnabled = true + } + this.toastService.showError( + $localize`Error executing delete pages operation`, + error + ) + }, + }) + }) + } } diff --git a/src/documents/bulk_edit.py b/src/documents/bulk_edit.py index f59ef1af3..8dbdbc2dd 100644 --- a/src/documents/bulk_edit.py +++ b/src/documents/bulk_edit.py @@ -325,3 +325,29 @@ def split(doc_ids: list[int], pages: list[list[int]]): logger.exception(f"Error splitting document {doc.id}: {e}") return "OK" + + +def delete_pages(doc_ids: list[int], pages: list[int]): + logger.info( + f"Attempting to delete pages {pages} from {len(doc_ids)} documents", + ) + doc = Document.objects.get(id=doc_ids[0]) + pages = sorted(pages) # sort pages to avoid index issues + import pikepdf + + try: + with pikepdf.open(doc.source_path, allow_overwriting_input=True) as pdf: + offset = 1 # pages are 1-indexed + for page_num in pages: + pdf.pages.remove(pdf.pages[page_num - offset]) + offset += 1 # remove() changes the index of the pages + pdf.remove_unreferenced_resources() + pdf.save() + doc.checksum = hashlib.md5(doc.source_path.read_bytes()).hexdigest() + doc.save() + update_document_archive_file.delay(document_id=doc.id) + logger.info(f"Deleted pages {pages} from document {doc.id}") + except Exception as e: + logger.exception(f"Error deleting pages from document {doc.id}: {e}") + + return "OK" diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 9d722ca5d..c92765e69 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -944,6 +944,7 @@ class BulkEditSerializer( "rotate", "merge", "split", + "delete_pages", ], label="Method", write_only=True, @@ -1000,6 +1001,8 @@ class BulkEditSerializer( return bulk_edit.merge elif method == "split": return bulk_edit.split + elif method == "delete_pages": + return bulk_edit.delete_pages else: raise serializers.ValidationError("Unsupported method.") @@ -1128,6 +1131,14 @@ class BulkEditSerializer( except ValueError: raise serializers.ValidationError("invalid pages specified") + def _validate_parameters_delete_pages(self, parameters): + if "pages" not in parameters: + raise serializers.ValidationError("pages not specified") + if not isinstance(parameters["pages"], list): + raise serializers.ValidationError("pages must be a list") + if not all(isinstance(i, int) for i in parameters["pages"]): + raise serializers.ValidationError("pages must be a list of integers") + def validate(self, attrs): method = attrs["method"] parameters = attrs["parameters"] @@ -1154,6 +1165,12 @@ class BulkEditSerializer( "Split method only supports one document", ) self._validate_parameters_split(parameters) + elif method == bulk_edit.delete_pages: + if len(attrs["documents"]) > 1: + raise serializers.ValidationError( + "Delete pages method only supports one document", + ) + self._validate_parameters_delete_pages(parameters) return attrs diff --git a/src/documents/tests/test_api_bulk_edit.py b/src/documents/tests/test_api_bulk_edit.py index c38ed8cfd..7078aca12 100644 --- a/src/documents/tests/test_api_bulk_edit.py +++ b/src/documents/tests/test_api_bulk_edit.py @@ -1065,3 +1065,95 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertIn(b"Split method only supports one document", response.content) + + @mock.patch("documents.serialisers.bulk_edit.delete_pages") + def test_delete_pages(self, m): + m.return_value = "OK" + + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "delete_pages", + "parameters": {"pages": [1, 2, 3, 4]}, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + m.assert_called_once() + args, kwargs = m.call_args + self.assertCountEqual(args[0], [self.doc2.id]) + self.assertEqual(kwargs["pages"], [1, 2, 3, 4]) + + def test_delete_pages_invalid_params(self): + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [ + self.doc1.id, + self.doc2.id, + ], # only one document supported + "method": "delete_pages", + "parameters": { + "pages": [1, 2, 3, 4], + }, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn( + b"Delete pages method only supports one document", + response.content, + ) + + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "delete_pages", + "parameters": {}, # pages not specified + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"pages not specified", response.content) + + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "delete_pages", + "parameters": {"pages": "1-3"}, # not a list + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"pages must be a list", response.content) + + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "delete_pages", + "parameters": {"pages": ["1-3"]}, # not ints + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"pages must be a list of integers", response.content) diff --git a/src/documents/tests/test_bulk_edit.py b/src/documents/tests/test_bulk_edit.py index 831fa9461..16579c887 100644 --- a/src/documents/tests/test_bulk_edit.py +++ b/src/documents/tests/test_bulk_edit.py @@ -585,3 +585,46 @@ class TestPDFActions(DirectoriesMixin, TestCase): mock_update_documents.assert_called_once() mock_chord.assert_called_once() self.assertEqual(result, "OK") + + @mock.patch("documents.tasks.update_document_archive_file.delay") + @mock.patch("pikepdf.Pdf.save") + def test_delete_pages(self, mock_pdf_save, mock_update_archive_file): + """ + GIVEN: + - Existing documents + WHEN: + - Delete pages action is called with 1 document and 2 pages + THEN: + - Save should be called once + - Archive file should be updated once + """ + doc_ids = [self.doc2.id] + pages = [1, 3] + result = bulk_edit.delete_pages(doc_ids, pages) + mock_pdf_save.assert_called_once() + mock_update_archive_file.assert_called_once() + self.assertEqual(result, "OK") + + @mock.patch("documents.tasks.update_document_archive_file.delay") + @mock.patch("pikepdf.Pdf.save") + def test_delete_pages_with_error(self, mock_pdf_save, mock_update_archive_file): + """ + GIVEN: + - Existing documents + WHEN: + - Delete pages action is called with 1 document and 2 pages + - PikePDF raises an error + THEN: + - Save should be called once + - Archive file should not be updated + """ + mock_pdf_save.side_effect = Exception("Error saving PDF") + doc_ids = [self.doc2.id] + pages = [1, 3] + + with self.assertLogs("paperless.bulk_edit", level="ERROR") as cm: + bulk_edit.delete_pages(doc_ids, pages) + error_str = cm.output[0] + expected_str = "Error deleting pages from document" + self.assertIn(expected_str, error_str) + mock_update_archive_file.assert_not_called() From c0c44b512c8cd39cd9b431d06d9812ab9506f24e Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 22 May 2024 16:08:25 -0700 Subject: [PATCH 18/51] Enhancement: accessibility improvements for tags, doc links, dashboard views (#6786) --- src-ui/messages.xlf | 128 ++++++++++++------ .../document-link.component.html | 4 +- .../common/input/tags/tags.component.html | 6 +- .../common/input/tags/tags.component.scss | 4 - .../saved-view-widget.component.html | 14 +- 5 files changed, 95 insertions(+), 61 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 9af66a45d..5edab40e9 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -253,6 +253,18 @@ src/app/app.component.ts 85 + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 37 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 40 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 43 + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 73 @@ -2123,10 +2135,6 @@ src/app/components/common/input/permissions/permissions-form/permissions-form.component.html 53 - - src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 43 - src/app/components/document-list/document-card-large/document-card-large.component.html 57 @@ -4454,6 +4462,24 @@ 158 + + Remove link + + src/app/components/common/input/document-link/document-link.component.html + 30 + + + + Open link + + src/app/components/common/input/document-link/document-link.component.html + 31 + + + src/app/components/common/input/url/url.component.html + 14 + + No documents found @@ -4551,6 +4577,13 @@ 15 + + Remove tag + + src/app/components/common/input/tags/tags.component.html + 20 + + Filter documents with these Tags @@ -4558,13 +4591,6 @@ 41 - - Open link - - src/app/components/common/input/url/url.component.html - 14 - - What's this? @@ -5159,6 +5185,51 @@ 39 + + Filter by correspondent + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 47 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 20 + + + src/app/components/document-list/document-list.component.html + 275 + + + + Filter by document type + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 57 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 79 + + + src/app/components/document-list/document-list.component.html + 310 + + + + Filter by storage path + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 62 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 85 + + + src/app/components/document-list/document-list.component.html + 317 + + View Preview @@ -6348,17 +6419,6 @@ 819 - - Filter by correspondent - - src/app/components/document-list/document-card-large/document-card-large.component.html - 20 - - - src/app/components/document-list/document-list.component.html - 275 - - Filter by tag @@ -6384,30 +6444,8 @@ 75 - - Filter by document type - - src/app/components/document-list/document-card-large/document-card-large.component.html - 79 - - - src/app/components/document-list/document-list.component.html - 310 - - - - Filter by storage path - - src/app/components/document-list/document-card-large/document-card-large.component.html - 85 - - - src/app/components/document-list/document-list.component.html - 317 - - - Created: + Created: src/app/components/document-list/document-card-large/document-card-large.component.html 98,99 diff --git a/src-ui/src/app/components/common/input/document-link/document-link.component.html b/src-ui/src/app/components/common/input/document-link/document-link.component.html index fc4726a55..a8ecce4e6 100644 --- a/src-ui/src/app/components/common/input/document-link/document-link.component.html +++ b/src-ui/src/app/components/common/input/document-link/document-link.component.html @@ -27,8 +27,8 @@ (change)="onChange(selectedDocuments)"> diff --git a/src-ui/src/app/components/common/input/tags/tags.component.html b/src-ui/src/app/components/common/input/tags/tags.component.html index cb8d616b3..8384840a3 100644 --- a/src-ui/src/app/components/common/input/tags/tags.component.html +++ b/src-ui/src/app/components/common/input/tags/tags.component.html @@ -17,12 +17,12 @@ (change)="onChange(value)"> - - +
diff --git a/src-ui/src/app/components/common/input/tags/tags.component.scss b/src-ui/src/app/components/common/input/tags/tags.component.scss index a1d88a3a9..65b8603e0 100644 --- a/src-ui/src/app/components/common/input/tags/tags.component.scss +++ b/src-ui/src/app/components/common/input/tags/tags.component.scss @@ -7,10 +7,6 @@ font-size: 1rem; } -.tag-wrap-delete { - cursor: pointer; -} - .paperless-input-select.disabled { .input-group { cursor: not-allowed; diff --git a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html index 4ea602098..3591f817f 100644 --- a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html +++ b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -34,32 +34,32 @@ @switch (field) { @case (DisplayField.ADDED) { - {{doc.added | customDate}} + {{doc.added | customDate}} } @case (DisplayField.CREATED) { - {{doc.created_date | customDate}} + {{doc.created_date | customDate}} } @case (DisplayField.TITLE) { - {{doc.title | documentTitle}} + {{doc.title | documentTitle}} } @case (DisplayField.CORRESPONDENT) { @if (doc.correspondent) { - {{(doc.correspondent$ | async)?.name}} + {{(doc.correspondent$ | async)?.name}} } } @case (DisplayField.TAGS) { @for (t of doc.tags$ | async; track t) { - + } } @case (DisplayField.DOCUMENT_TYPE) { @if (doc.document_type) { - {{(doc.document_type$ | async)?.name}} + {{(doc.document_type$ | async)?.name}} } } @case (DisplayField.STORAGE_PATH) { @if (doc.storage_path) { - {{(doc.storage_path$ | async)?.name}} + {{(doc.storage_path$ | async)?.name}} } } } From 8abb0cd75dd558eb3fe4a465d4d71367bca5011a Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 22 May 2024 16:15:58 -0700 Subject: [PATCH 19/51] Enhancement: only include correspondent 'last_correspondence' if requested (#6792) --- .../document-detail.component.html | 8 +-- .../document-detail.component.spec.ts | 12 ++--- .../document-detail.component.ts | 51 +++++++++--------- .../correspondent-list.component.ts | 21 ++++++++ .../management-list.component.ts | 6 +-- .../rest/abstract-name-filter-service.ts | 5 +- src/documents/serialisers.py | 2 +- src/documents/tests/test_api_objects.py | 53 +++++++++++++++++++ src/documents/views.py | 22 +++++--- 9 files changed, 131 insertions(+), 49 deletions(-) diff --git a/src-ui/src/app/components/document-detail/document-detail.component.html b/src-ui/src/app/components/document-detail/document-detail.component.html index 86e6398ec..35d252b5b 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.html +++ b/src-ui/src/app/components/document-detail/document-detail.component.html @@ -109,13 +109,13 @@ - - - - + @for (fieldInstance of document?.custom_fields; track fieldInstance.field; let i = $index) {
@switch (getCustomFieldFromInstance(fieldInstance)?.data_type) { diff --git a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts index b8a6389f2..7dcf4e9f7 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts @@ -80,8 +80,9 @@ import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { environment } from 'src/environments/environment' import { RotateConfirmDialogComponent } from '../common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component' import { SplitConfirmDialogComponent } from '../common/confirm-dialog/split-confirm-dialog/split-confirm-dialog.component' -import { PdfViewerModule } from 'ng2-pdf-viewer' import { DeletePagesConfirmDialogComponent } from '../common/confirm-dialog/delete-pages-confirm-dialog/delete-pages-confirm-dialog.component' +import { PdfViewerModule } from 'ng2-pdf-viewer' +import { DataType } from 'src/app/data/datatype' const doc: Document = { id: 3, @@ -783,10 +784,9 @@ describe('DocumentDetailComponent', () => { const object = { id: 22, name: 'Correspondent22', - last_correspondence: new Date().toISOString(), } as Correspondent const qfSpy = jest.spyOn(documentListViewService, 'quickFilter') - component.filterDocuments([object]) + component.filterDocuments([object], DataType.Correspondent) expect(qfSpy).toHaveBeenCalledWith([ { rule_type: FILTER_CORRESPONDENT, @@ -799,7 +799,7 @@ describe('DocumentDetailComponent', () => { initNormally() const object = { id: 22, name: 'DocumentType22' } as DocumentType const qfSpy = jest.spyOn(documentListViewService, 'quickFilter') - component.filterDocuments([object]) + component.filterDocuments([object], DataType.DocumentType) expect(qfSpy).toHaveBeenCalledWith([ { rule_type: FILTER_DOCUMENT_TYPE, @@ -816,7 +816,7 @@ describe('DocumentDetailComponent', () => { path: '/foo/bar/', } as StoragePath const qfSpy = jest.spyOn(documentListViewService, 'quickFilter') - component.filterDocuments([object]) + component.filterDocuments([object], DataType.StoragePath) expect(qfSpy).toHaveBeenCalledWith([ { rule_type: FILTER_STORAGE_PATH, @@ -842,7 +842,7 @@ describe('DocumentDetailComponent', () => { text_color: '#000000', } as Tag const qfSpy = jest.spyOn(documentListViewService, 'quickFilter') - component.filterDocuments([object1, object2]) + component.filterDocuments([object1, object2], DataType.Tag) expect(qfSpy).toHaveBeenCalledWith([ { rule_type: FILTER_HAS_TAGS_ALL, diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index 23753f55b..a80e401e2 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -71,6 +71,7 @@ import { RotateConfirmDialogComponent } from '../common/confirm-dialog/rotate-co import { DeletePagesConfirmDialogComponent } from '../common/confirm-dialog/delete-pages-confirm-dialog/delete-pages-confirm-dialog.component' import { HotKeyService } from 'src/app/services/hot-key.service' import { PDFDocumentProxy } from 'ng2-pdf-viewer' +import { DataType } from 'src/app/data/datatype' enum DocumentDetailNavIDs { Details = 1, @@ -171,6 +172,8 @@ export class DocumentDetailComponent public readonly ContentRenderType = ContentRenderType + public readonly DataType = DataType + @ViewChild('nav') nav: NgbNav @ViewChild('pdfPreview') set pdfPreview(element) { // this gets called when component added or removed from DOM @@ -998,7 +1001,7 @@ export class DocumentDetailComponent ) } - filterDocuments(items: ObjectWithId[] | NgbDateStruct[]) { + filterDocuments(items: ObjectWithId[] | NgbDateStruct[], type?: DataType) { const filterRules: FilterRule[] = items.flatMap((i) => { if (i.hasOwnProperty('year')) { const isoDateAdapter = new ISODateAdapter() @@ -1017,30 +1020,28 @@ export class DocumentDetailComponent value: dateBefore.toISOString().substring(0, 10), }, ] - } else if (i.hasOwnProperty('last_correspondence')) { - // Correspondent - return { - rule_type: FILTER_CORRESPONDENT, - value: (i as Correspondent).id.toString(), - } - } else if (i.hasOwnProperty('path')) { - // Storage Path - return { - rule_type: FILTER_STORAGE_PATH, - value: (i as StoragePath).id.toString(), - } - } else if (i.hasOwnProperty('is_inbox_tag')) { - // Tag - return { - rule_type: FILTER_HAS_TAGS_ALL, - value: (i as Tag).id.toString(), - } - } else { - // Document Type, has no specific props - return { - rule_type: FILTER_DOCUMENT_TYPE, - value: (i as DocumentType).id.toString(), - } + } + switch (type) { + case DataType.Correspondent: + return { + rule_type: FILTER_CORRESPONDENT, + value: (i as Correspondent).id.toString(), + } + case DataType.DocumentType: + return { + rule_type: FILTER_DOCUMENT_TYPE, + value: (i as DocumentType).id.toString(), + } + case DataType.StoragePath: + return { + rule_type: FILTER_STORAGE_PATH, + value: (i as StoragePath).id.toString(), + } + case DataType.Tag: + return { + rule_type: FILTER_HAS_TAGS_ALL, + value: (i as Tag).id.toString(), + } } }) diff --git a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts b/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts index 2d02ba983..c0053353b 100644 --- a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts +++ b/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts @@ -12,6 +12,7 @@ import { CorrespondentService } from 'src/app/services/rest/correspondent.servic import { ToastService } from 'src/app/services/toast.service' import { CorrespondentEditDialogComponent } from '../../common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component' import { ManagementListComponent } from '../management-list/management-list.component' +import { takeUntil } from 'rxjs' @Component({ selector: 'pngx-correspondent-list', @@ -63,6 +64,26 @@ export class CorrespondentListComponent extends ManagementListComponent { + this.data = c.results + this.collectionSize = c.count + this.isLoading = false + }) + } + getDeleteMessage(object: Correspondent) { return $localize`Do you really want to delete the correspondent "${object.name}"?` } diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.ts b/src-ui/src/app/components/manage/management-list/management-list.component.ts index 3fbf18e09..9453affd5 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.ts +++ b/src-ui/src/app/components/manage/management-list/management-list.component.ts @@ -52,7 +52,7 @@ export abstract class ManagementListComponent implements OnInit, OnDestroy { constructor( - private service: AbstractNameFilterService, + protected service: AbstractNameFilterService, private modalService: NgbModal, private editDialogComponent: any, private toastService: ToastService, @@ -81,8 +81,8 @@ export abstract class ManagementListComponent public isLoading: boolean = false private nameFilterDebounce: Subject - private unsubscribeNotifier: Subject = new Subject() - private _nameFilter: string + protected unsubscribeNotifier: Subject = new Subject() + protected _nameFilter: string public selectedObjects: Set = new Set() public togggleAll: boolean = false diff --git a/src-ui/src/app/services/rest/abstract-name-filter-service.ts b/src-ui/src/app/services/rest/abstract-name-filter-service.ts index 1018f0fa2..03c7e5470 100644 --- a/src-ui/src/app/services/rest/abstract-name-filter-service.ts +++ b/src-ui/src/app/services/rest/abstract-name-filter-service.ts @@ -17,9 +17,10 @@ export abstract class AbstractNameFilterService< sortField?: string, sortReverse?: boolean, nameFilter?: string, - fullPerms?: boolean + fullPerms?: boolean, + extraParams?: { [key: string]: any } ) { - let params = {} + let params = extraParams ?? {} if (nameFilter) { params['name__icontains'] = nameFilter } diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index c92765e69..d7a06e181 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -291,7 +291,7 @@ class OwnedObjectSerializer( class CorrespondentSerializer(MatchingModelSerializer, OwnedObjectSerializer): - last_correspondence = serializers.DateTimeField(read_only=True) + last_correspondence = serializers.DateTimeField(read_only=True, required=False) class Meta: model = Correspondent diff --git a/src/documents/tests/test_api_objects.py b/src/documents/tests/test_api_objects.py index 65f379261..1a55a936c 100644 --- a/src/documents/tests/test_api_objects.py +++ b/src/documents/tests/test_api_objects.py @@ -1,8 +1,10 @@ +import datetime import json from unittest import mock from django.contrib.auth.models import Permission from django.contrib.auth.models import User +from django.utils import timezone from rest_framework import status from rest_framework.test import APITestCase @@ -89,6 +91,57 @@ class TestApiObjects(DirectoriesMixin, APITestCase): results = response.data["results"] self.assertEqual(len(results), 2) + def test_correspondent_last_correspondence(self): + """ + GIVEN: + - Correspondent with documents + WHEN: + - API is called + THEN: + - Last correspondence date is returned only if requested for list, and for detail + """ + + Document.objects.create( + mime_type="application/pdf", + correspondent=self.c1, + created=timezone.make_aware(datetime.datetime(2022, 1, 1)), + checksum="123", + ) + Document.objects.create( + mime_type="application/pdf", + correspondent=self.c1, + created=timezone.make_aware(datetime.datetime(2022, 1, 2)), + checksum="456", + ) + + # Only if requested for list + response = self.client.get( + "/api/correspondents/", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertNotIn("last_correspondence", results[0]) + + response = self.client.get( + "/api/correspondents/?last_correspondence=true", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + results = response.data["results"] + self.assertIn( + "2022-01-02", + results[0]["last_correspondence"], + ) + + # Included in detail by default + response = self.client.get( + f"/api/correspondents/{self.c1.id}/", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn( + "2022-01-02", + response.data["last_correspondence"], + ) + class TestApiStoragePaths(DirectoriesMixin, APITestCase): ENDPOINT = "/api/storage_paths/" diff --git a/src/documents/views.py b/src/documents/views.py index 8b3486f76..91b99b610 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -253,14 +253,7 @@ class PermissionsAwareDocumentCountMixin(PassUserMixin): class CorrespondentViewSet(ModelViewSet, PermissionsAwareDocumentCountMixin): model = Correspondent - queryset = ( - Correspondent.objects.prefetch_related("documents") - .annotate( - last_correspondence=Max("documents__created"), - ) - .select_related("owner") - .order_by(Lower("name")) - ) + queryset = Correspondent.objects.select_related("owner").order_by(Lower("name")) serializer_class = CorrespondentSerializer pagination_class = StandardPagination @@ -279,6 +272,19 @@ class CorrespondentViewSet(ModelViewSet, PermissionsAwareDocumentCountMixin): "last_correspondence", ) + def list(self, request, *args, **kwargs): + if request.query_params.get("last_correspondence", None): + self.queryset = self.queryset.annotate( + last_correspondence=Max("documents__created"), + ) + return super().list(request, *args, **kwargs) + + def retrieve(self, request, *args, **kwargs): + self.queryset = self.queryset.annotate( + last_correspondence=Max("documents__created"), + ) + return super().retrieve(request, *args, **kwargs) + class TagViewSet(ModelViewSet, PermissionsAwareDocumentCountMixin): model = Tag From 719f76060b04d746aed806f26bf881bbd18e0ba9 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 22 May 2024 16:19:46 -0700 Subject: [PATCH 20/51] Enhancement: default to title/content search, allow choosing full search link from global search (#6805) --- src-ui/messages.xlf | 186 ++++++++++-------- .../admin/settings/settings.component.html | 18 +- .../admin/settings/settings.component.spec.ts | 2 +- .../admin/settings/settings.component.ts | 10 +- .../global-search.component.html | 8 +- .../global-search.component.spec.ts | 35 +++- .../global-search/global-search.component.ts | 22 ++- src-ui/src/app/data/ui-settings.ts | 11 ++ 8 files changed, 191 insertions(+), 101 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 5edab40e9..37fecf495 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -350,7 +350,7 @@ src/app/components/admin/settings/settings.component.html - 323 + 339 src/app/components/app-frame/app-frame.component.html @@ -563,7 +563,7 @@ src/app/components/admin/settings/settings.component.html - 403 + 419 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -705,7 +705,7 @@ src/app/components/admin/settings/settings.component.html - 391 + 407 src/app/components/admin/tasks/tasks.component.html @@ -1025,21 +1025,50 @@ src/app/components/app-frame/global-search/global-search.component.ts - 93 + 104 - - Search database only (do not include advanced search results) + + Do not include advanced search results src/app/components/admin/settings/settings.component.html 204 + + Full search links to + + src/app/components/admin/settings/settings.component.html + 212 + + + + Title and content search + + src/app/components/admin/settings/settings.component.html + 216 + + + + Advanced search + + src/app/components/admin/settings/settings.component.html + 217 + + + src/app/components/app-frame/global-search/global-search.component.html + 24 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 143 + + Notes src/app/components/admin/settings/settings.component.html - 208 + 224 src/app/components/document-list/document-list.component.html @@ -1058,14 +1087,14 @@ Enable notes src/app/components/admin/settings/settings.component.html - 212 + 228 Permissions src/app/components/admin/settings/settings.component.html - 220 + 236 src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html @@ -1120,28 +1149,28 @@ Default Permissions src/app/components/admin/settings/settings.component.html - 223 + 239 Settings apply to this user account for objects (Tags, Mail Rules, etc.) created via the web UI src/app/components/admin/settings/settings.component.html - 227,229 + 243,245 Default Owner src/app/components/admin/settings/settings.component.html - 234 + 250 Objects without an owner can be viewed and edited by all users src/app/components/admin/settings/settings.component.html - 238 + 254 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html @@ -1152,18 +1181,18 @@ Default View Permissions src/app/components/admin/settings/settings.component.html - 243 + 259 Users: src/app/components/admin/settings/settings.component.html - 248 + 264 src/app/components/admin/settings/settings.component.html - 275 + 291 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -1194,11 +1223,11 @@ Groups: src/app/components/admin/settings/settings.component.html - 258 + 274 src/app/components/admin/settings/settings.component.html - 285 + 301 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -1229,14 +1258,14 @@ Default Edit Permissions src/app/components/admin/settings/settings.component.html - 270 + 286 Edit permissions also grant viewing permissions src/app/components/admin/settings/settings.component.html - 294 + 310 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -1255,56 +1284,56 @@ Notifications src/app/components/admin/settings/settings.component.html - 302 + 318 Document processing src/app/components/admin/settings/settings.component.html - 305 + 321 Show notifications when new documents are detected src/app/components/admin/settings/settings.component.html - 309 + 325 Show notifications when document processing completes successfully src/app/components/admin/settings/settings.component.html - 310 + 326 Show notifications when document processing fails src/app/components/admin/settings/settings.component.html - 311 + 327 Suppress notifications on dashboard src/app/components/admin/settings/settings.component.html - 312 + 328 This will suppress all messages about document processing status on the dashboard. src/app/components/admin/settings/settings.component.html - 312 + 328 Saved views src/app/components/admin/settings/settings.component.html - 320 + 336 src/app/components/app-frame/app-frame.component.html @@ -1315,14 +1344,14 @@ Show warning when closing saved views with unsaved changes src/app/components/admin/settings/settings.component.html - 326 + 342 Views src/app/components/admin/settings/settings.component.html - 330 + 346 src/app/components/document-list/document-list.component.html @@ -1333,7 +1362,7 @@ Show on dashboard src/app/components/admin/settings/settings.component.html - 343 + 359 src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html @@ -1344,7 +1373,7 @@ Show in sidebar src/app/components/admin/settings/settings.component.html - 347 + 363 src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html @@ -1355,7 +1384,7 @@ Actions src/app/components/admin/settings/settings.component.html - 351 + 367 src/app/components/admin/tasks/tasks.component.html @@ -1418,7 +1447,7 @@ Delete src/app/components/admin/settings/settings.component.html - 353 + 369 src/app/components/admin/users-groups/users-groups.component.html @@ -1529,42 +1558,42 @@ Documents page size src/app/components/admin/settings/settings.component.html - 364 + 380 Display as src/app/components/admin/settings/settings.component.html - 367 + 383 Table src/app/components/admin/settings/settings.component.html - 369 + 385 Small Cards src/app/components/admin/settings/settings.component.html - 370 + 386 Large Cards src/app/components/admin/settings/settings.component.html - 371 + 387 Show src/app/components/admin/settings/settings.component.html - 375 + 391 src/app/components/document-list/document-list.component.html @@ -1575,7 +1604,7 @@ Default src/app/components/admin/settings/settings.component.html - 375 + 391 src/app/components/document-detail/document-detail.component.html @@ -1586,14 +1615,14 @@ No saved views defined. src/app/components/admin/settings/settings.component.html - 384 + 400 Cancel src/app/components/admin/settings/settings.component.html - 404 + 420 src/app/components/common/confirm-dialog/confirm-dialog.component.ts @@ -1678,7 +1707,7 @@ Error retrieving users src/app/components/admin/settings/settings.component.ts - 189 + 192 src/app/components/admin/users-groups/users-groups.component.ts @@ -1689,7 +1718,7 @@ Error retrieving groups src/app/components/admin/settings/settings.component.ts - 208 + 211 src/app/components/admin/users-groups/users-groups.component.ts @@ -1700,35 +1729,35 @@ Saved view "" deleted. src/app/components/admin/settings/settings.component.ts - 423 + 427 Settings were saved successfully. src/app/components/admin/settings/settings.component.ts - 553 + 561 Settings were saved successfully. Reload is required to apply some changes. src/app/components/admin/settings/settings.component.ts - 557 + 565 Reload now src/app/components/admin/settings/settings.component.ts - 558 + 566 An error occurred while saving settings. src/app/components/admin/settings/settings.component.ts - 568 + 576 src/app/components/app-frame/app-frame.component.ts @@ -1739,7 +1768,7 @@ Error while storing settings on server. src/app/components/admin/settings/settings.component.ts - 602 + 610 @@ -2125,11 +2154,11 @@ src/app/components/app-frame/global-search/global-search.component.html - 55 + 59 src/app/components/app-frame/global-search/global-search.component.html - 72 + 76 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html @@ -2683,41 +2712,34 @@ src/app/components/app-frame/global-search/global-search.component.html 8 - - - Advanced search src/app/components/app-frame/global-search/global-search.component.html - 23 - - - src/app/components/document-list/filter-editor/filter-editor.component.ts - 143 + 26 Open src/app/components/app-frame/global-search/global-search.component.html - 49 + 53 src/app/components/app-frame/global-search/global-search.component.html - 52 + 56 Filter documents src/app/components/app-frame/global-search/global-search.component.html - 58 + 62 Download src/app/components/app-frame/global-search/global-search.component.html - 69 + 73 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -2744,113 +2766,113 @@ No results src/app/components/app-frame/global-search/global-search.component.html - 83 + 87 Documents src/app/components/app-frame/global-search/global-search.component.html - 86 + 90 Saved Views src/app/components/app-frame/global-search/global-search.component.html - 92 + 96 Tags src/app/components/app-frame/global-search/global-search.component.html - 99 + 103 Correspondents src/app/components/app-frame/global-search/global-search.component.html - 106 + 110 Document types src/app/components/app-frame/global-search/global-search.component.html - 113 + 117 Storage paths src/app/components/app-frame/global-search/global-search.component.html - 120 + 124 Users src/app/components/app-frame/global-search/global-search.component.html - 127 + 131 Groups src/app/components/app-frame/global-search/global-search.component.html - 134 + 138 Custom fields src/app/components/app-frame/global-search/global-search.component.html - 141 + 145 Mail accounts src/app/components/app-frame/global-search/global-search.component.html - 148 + 152 Mail rules src/app/components/app-frame/global-search/global-search.component.html - 155 + 159 Workflows src/app/components/app-frame/global-search/global-search.component.html - 162 + 166 Successfully updated object. src/app/components/app-frame/global-search/global-search.component.ts - 182 + 193 src/app/components/app-frame/global-search/global-search.component.ts - 220 + 231 Error occurred saving object. src/app/components/app-frame/global-search/global-search.component.ts - 185 + 196 src/app/components/app-frame/global-search/global-search.component.ts - 223 + 234 diff --git a/src-ui/src/app/components/admin/settings/settings.component.html b/src-ui/src/app/components/admin/settings/settings.component.html index 87d7ba68a..bcab7de33 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.html +++ b/src-ui/src/app/components/admin/settings/settings.component.html @@ -201,7 +201,23 @@
- + +
+
+ +
+
+
+
+ Full search links to +
+
+ +
+
diff --git a/src-ui/src/app/components/admin/settings/settings.component.spec.ts b/src-ui/src/app/components/admin/settings/settings.component.spec.ts index 71778d394..47581ddba 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.spec.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.spec.ts @@ -309,7 +309,7 @@ describe('SettingsComponent', () => { expect(toastErrorSpy).toHaveBeenCalled() expect(storeSpy).toHaveBeenCalled() expect(appearanceSettingsSpy).not.toHaveBeenCalled() - expect(setSpy).toHaveBeenCalledTimes(26) + expect(setSpy).toHaveBeenCalledTimes(27) // succeed storeSpy.mockReturnValueOnce(of(true)) diff --git a/src-ui/src/app/components/admin/settings/settings.component.ts b/src-ui/src/app/components/admin/settings/settings.component.ts index 036f27f48..fcb7d7c65 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.ts @@ -27,7 +27,7 @@ import { } from 'rxjs' import { Group } from 'src/app/data/group' import { SavedView } from 'src/app/data/saved-view' -import { SETTINGS_KEYS } from 'src/app/data/ui-settings' +import { GlobalSearchType, SETTINGS_KEYS } from 'src/app/data/ui-settings' import { User } from 'src/app/data/user' import { DocumentListViewService } from 'src/app/services/document-list-view.service' import { @@ -101,6 +101,7 @@ export class SettingsComponent defaultPermsEditGroups: new FormControl(null), documentEditingRemoveInboxTags: new FormControl(null), searchDbOnly: new FormControl(null), + searchLink: new FormControl(null), notificationsConsumerNewDocument: new FormControl(null), notificationsConsumerSuccess: new FormControl(null), @@ -129,6 +130,8 @@ export class SettingsComponent public systemStatus: SystemStatus + public readonly GlobalSearchType = GlobalSearchType + get systemStatusHasErrors(): boolean { return ( this.systemStatus.database.status === SystemStatusItemStatus.ERROR || @@ -306,6 +309,7 @@ export class SettingsComponent SETTINGS_KEYS.DOCUMENT_EDITING_REMOVE_INBOX_TAGS ), searchDbOnly: this.settings.get(SETTINGS_KEYS.SEARCH_DB_ONLY), + searchLink: this.settings.get(SETTINGS_KEYS.SEARCH_FULL_TYPE), savedViews: {}, } } @@ -539,6 +543,10 @@ export class SettingsComponent SETTINGS_KEYS.SEARCH_DB_ONLY, this.settingsForm.value.searchDbOnly ) + this.settings.set( + SETTINGS_KEYS.SEARCH_FULL_TYPE, + this.settingsForm.value.searchLink + ) this.settings.setLanguage(this.settingsForm.value.displayLanguage) this.settings .storeSettings() diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.html b/src-ui/src/app/components/app-frame/global-search/global-search.component.html index eeb118967..1e51dc1b6 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.html +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.html @@ -19,8 +19,12 @@
@if (query) { - } diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts b/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts index 076fa95d1..f2a1ac3a6 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts @@ -25,6 +25,7 @@ import { FILTER_HAS_DOCUMENT_TYPE_ANY, FILTER_HAS_STORAGE_PATH_ANY, FILTER_HAS_TAGS_ALL, + FILTER_TITLE_CONTENT, } from 'src/app/data/filter-rule-type' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { DocumentService } from 'src/app/services/rest/document.service' @@ -37,6 +38,8 @@ import { ElementRef } from '@angular/core' import { ToastService } from 'src/app/services/toast.service' import { DataType } from 'src/app/data/datatype' import { queryParamsFromFilterRules } from 'src/app/utils/query-params' +import { SettingsService } from 'src/app/services/settings.service' +import { GlobalSearchType, SETTINGS_KEYS } from 'src/app/data/ui-settings' const searchResults = { total: 11, @@ -130,6 +133,7 @@ describe('GlobalSearchComponent', () => { let documentService: DocumentService let documentListViewService: DocumentListViewService let toastService: ToastService + let settingsService: SettingsService beforeEach(async () => { await TestBed.configureTestingModule({ @@ -150,6 +154,7 @@ describe('GlobalSearchComponent', () => { documentService = TestBed.inject(DocumentService) documentListViewService = TestBed.inject(DocumentListViewService) toastService = TestBed.inject(ToastService) + settingsService = TestBed.inject(SettingsService) fixture = TestBed.createComponent(GlobalSearchComponent) component = fixture.componentInstance @@ -262,7 +267,7 @@ describe('GlobalSearchComponent', () => { component.searchResults = searchResults as any component.resultsDropdown.open() component.query = 'test' - const advancedSearchSpy = jest.spyOn(component, 'runAdvanedSearch') + const advancedSearchSpy = jest.spyOn(component, 'runFullSearch') component.searchInputKeyDown(new KeyboardEvent('keydown', { key: 'Enter' })) expect(advancedSearchSpy).toHaveBeenCalled() }) @@ -499,15 +504,6 @@ describe('GlobalSearchComponent', () => { expect(focusSpy).toHaveBeenCalled() }) - it('should support explicit advanced search', () => { - const qfSpy = jest.spyOn(documentListViewService, 'quickFilter') - component.query = 'test' - component.runAdvanedSearch() - expect(qfSpy).toHaveBeenCalledWith([ - { rule_type: FILTER_FULLTEXT_QUERY, value: 'test' }, - ]) - }) - it('should support open in new window', () => { const openSpy = jest.spyOn(window, 'open') const event = new Event('click') @@ -528,4 +524,23 @@ describe('GlobalSearchComponent', () => { button.dispatchEvent(keyboardEvent) expect(dispatchSpy).toHaveBeenCalledTimes(2) // once for keydown, second for click }) + + it('should support title content search and advanced search', () => { + const qfSpy = jest.spyOn(documentListViewService, 'quickFilter') + component.query = 'test' + component.runFullSearch() + expect(qfSpy).toHaveBeenCalledWith([ + { rule_type: FILTER_TITLE_CONTENT, value: 'test' }, + ]) + + settingsService.set( + SETTINGS_KEYS.SEARCH_FULL_TYPE, + GlobalSearchType.ADVANCED + ) + component.query = 'test' + component.runFullSearch() + expect(qfSpy).toHaveBeenCalledWith([ + { rule_type: FILTER_FULLTEXT_QUERY, value: 'test' }, + ]) + }) }) diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.ts b/src-ui/src/app/components/app-frame/global-search/global-search.component.ts index 2742ff59a..dda1bc5f3 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.ts +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.ts @@ -15,6 +15,7 @@ import { FILTER_HAS_DOCUMENT_TYPE_ANY, FILTER_HAS_STORAGE_PATH_ANY, FILTER_HAS_TAGS_ALL, + FILTER_TITLE_CONTENT, } from 'src/app/data/filter-rule-type' import { DataType } from 'src/app/data/datatype' import { ObjectWithId } from 'src/app/data/object-with-id' @@ -42,6 +43,8 @@ import { UserEditDialogComponent } from '../../common/edit-dialog/user-edit-dial import { WorkflowEditDialogComponent } from '../../common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component' import { HotKeyService } from 'src/app/services/hot-key.service' import { paramsFromViewState } from 'src/app/utils/query-params' +import { SettingsService } from 'src/app/services/settings.service' +import { GlobalSearchType, SETTINGS_KEYS } from 'src/app/data/ui-settings' @Component({ selector: 'pngx-global-search', @@ -63,6 +66,13 @@ export class GlobalSearchComponent implements OnInit { @ViewChildren('primaryButton') primaryButtons: QueryList @ViewChildren('secondaryButton') secondaryButtons: QueryList + get useAdvancedForFullSearch(): boolean { + return ( + this.settingsService.get(SETTINGS_KEYS.SEARCH_FULL_TYPE) === + GlobalSearchType.ADVANCED + ) + } + constructor( public searchService: SearchService, private router: Router, @@ -71,7 +81,8 @@ export class GlobalSearchComponent implements OnInit { private documentListViewService: DocumentListViewService, private permissionsService: PermissionsService, private toastService: ToastService, - private hotkeyService: HotKeyService + private hotkeyService: HotKeyService, + private settingsService: SettingsService ) { this.queryDebounce = new Subject() @@ -282,7 +293,7 @@ export class GlobalSearchComponent implements OnInit { this.primaryButtons.first.nativeElement.click() this.searchInput.nativeElement.blur() } else if (this.query?.length) { - this.runAdvanedSearch() + this.runFullSearch() this.reset(true) } } else if (event.key === 'Escape' && !this.resultsDropdown.isOpen()) { @@ -378,9 +389,12 @@ export class GlobalSearchComponent implements OnInit { ) } - public runAdvanedSearch() { + public runFullSearch() { + const ruleType = this.useAdvancedForFullSearch + ? FILTER_FULLTEXT_QUERY + : FILTER_TITLE_CONTENT this.documentListViewService.quickFilter([ - { rule_type: FILTER_FULLTEXT_QUERY, value: this.query }, + { rule_type: ruleType, value: this.query }, ]) this.reset(true) } diff --git a/src-ui/src/app/data/ui-settings.ts b/src-ui/src/app/data/ui-settings.ts index 6f8f246ff..29ea08786 100644 --- a/src-ui/src/app/data/ui-settings.ts +++ b/src-ui/src/app/data/ui-settings.ts @@ -12,6 +12,11 @@ export interface UiSetting { default: any } +export enum GlobalSearchType { + ADVANCED = 'advanced', + TITLE_CONTENT = 'title-content', +} + export const SETTINGS_KEYS = { LANGUAGE: 'language', APP_LOGO: 'app_logo', @@ -57,6 +62,7 @@ export const SETTINGS_KEYS = { DOCUMENT_EDITING_REMOVE_INBOX_TAGS: 'general-settings:document-editing:remove-inbox-tags', SEARCH_DB_ONLY: 'general-settings:search:db-only', + SEARCH_FULL_TYPE: 'general-settings:search:more-link', } export const SETTINGS: UiSetting[] = [ @@ -225,4 +231,9 @@ export const SETTINGS: UiSetting[] = [ type: 'boolean', default: false, }, + { + key: SETTINGS_KEYS.SEARCH_FULL_TYPE, + type: 'string', + default: GlobalSearchType.TITLE_CONTENT, + }, ] From 02ebcd29eeec6c898e99b67fc574ff9010197c74 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 22 May 2024 23:12:54 -0700 Subject: [PATCH 21/51] Bump @angular/cdk to 17.3.10 Fixes https://github.com/angular/components/issues/29053 --- src-ui/package-lock.json | 8 ++++---- src-ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src-ui/package-lock.json b/src-ui/package-lock.json index ecc954721..b60babda8 100644 --- a/src-ui/package-lock.json +++ b/src-ui/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "hasInstallScript": true, "dependencies": { - "@angular/cdk": "^17.3.9", + "@angular/cdk": "^17.3.10", "@angular/common": "~17.3.9", "@angular/compiler": "~17.3.9", "@angular/core": "~17.3.9", @@ -1206,9 +1206,9 @@ } }, "node_modules/@angular/cdk": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.9.tgz", - "integrity": "sha512-N/7Is+FkIIql5UEL/I+PV6THw+yXNCCGGpwimf/yaNgT9y1fHAmBWhDY0oQqFjCuD+kXl9gQL0ONfsl5Nlnk+w==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.10.tgz", + "integrity": "sha512-b1qktT2c1TTTe5nTji/kFAVW92fULK0YhYAvJ+BjZTPKu2FniZNe8o4qqQ0pUuvtMu+ZQxp/QqFYoidIVCjScg==", "dependencies": { "tslib": "^2.3.0" }, diff --git a/src-ui/package.json b/src-ui/package.json index 101e6700c..28a4a35fc 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -11,7 +11,7 @@ }, "private": true, "dependencies": { - "@angular/cdk": "^17.3.9", + "@angular/cdk": "^17.3.10", "@angular/common": "~17.3.9", "@angular/compiler": "~17.3.9", "@angular/core": "~17.3.9", From e6b856e13f1de2daaf7887a8457044a78bacead5 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 23 May 2024 12:52:40 -0700 Subject: [PATCH 22/51] Documentation: Add PAPERLESS_OCR_LANGUAGE config note (#6821) --- docs/configuration.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/configuration.md b/docs/configuration.md index bbe46f4de..254508f31 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -616,6 +616,8 @@ parsing documents. Keep in mind that Tesseract uses much more CPU time with multiple languages enabled. + If you are including languages that are not installed by default, you will need to also set [`PAPERLESS_OCR_LANGUAGES`](configuration.md#PAPERLESS_OCR_LANGUAGES) for docker deployments or install the tesseract language packages manually for bare metal installations. + Defaults to "eng". !!! note From 2b85e812f8cee84b68807aea548fd26030a7bbd8 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 23 May 2024 13:09:05 -0700 Subject: [PATCH 23/51] Chore(deps): Use psycopg as recommended (#6811) --- Dockerfile | 10 +++++++-- Pipfile | 2 +- Pipfile.lock | 43 ++++++++++++++++++++------------------- src/paperless/settings.py | 2 +- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/Dockerfile b/Dockerfile index d13f1b9ac..d8ff8c8b5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,7 +83,6 @@ ARG RUNTIME_PACKAGES="\ icc-profiles-free \ imagemagick \ # PostgreSQL - libpq5 \ postgresql-client \ # MySQL / MariaDB mariadb-client \ @@ -223,7 +222,13 @@ RUN --mount=type=cache,target=/root/.cache/pip/,id=pip-cache \ && apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \ && python3 -m pip install --no-cache-dir --upgrade wheel \ && echo "Installing Python requirements" \ - && python3 -m pip install --default-timeout=1000 --requirement requirements.txt \ + && curl --fail --silent --show-error --location \ + --output psycopg_c-3.1.19-cp311-cp311-linux_x86_64.whl \ + https://github.com/paperless-ngx/builder/releases/download/psycopg-3.1.19/psycopg_c-3.1.19-cp311-cp311-linux_x86_64.whl \ + && curl --fail --silent --show-error --location \ + --output psycopg_c-3.1.19-cp311-cp311-linux_aarch64.whl \ + https://github.com/paperless-ngx/builder/releases/download/psycopg-3.1.19/psycopg_c-3.1.19-cp311-cp311-linux_aarch64.whl \ + && python3 -m pip install --default-timeout=1000 --find-links . --requirement requirements.txt \ && echo "Patching whitenoise for compression speedup" \ && curl --fail --silent --show-error --location --output 484.patch https://github.com/evansd/whitenoise/pull/484.patch \ && patch -d /usr/local/lib/python3.11/site-packages --verbose -p2 < 484.patch \ @@ -236,6 +241,7 @@ RUN --mount=type=cache,target=/root/.cache/pip/,id=pip-cache \ && apt-get --yes purge ${BUILD_PACKAGES} \ && apt-get --yes autoremove --purge \ && apt-get clean --yes \ + && rm --recursive --force --verbose *.whl \ && rm --recursive --force --verbose /var/lib/apt/lists/* \ && rm --recursive --force --verbose /tmp/* \ && rm --recursive --force --verbose /var/tmp/* \ diff --git a/Pipfile b/Pipfile index aee4c5ba4..7a01efca1 100644 --- a/Pipfile +++ b/Pipfile @@ -37,7 +37,7 @@ nltk = "*" ocrmypdf = "~=15.4" pathvalidate = "*" pdf2image = "*" -psycopg2 = "*" +psycopg = {version = "*", extras = ["c"]} python-dateutil = "*" python-dotenv = "*" python-gnupg = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 0ab8c2316..8bc530b33 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "4bb46e902c6ceb6e3647772809b7941e318f1408472c4eaf0a1d2f0360ddac3a" + "sha256": "01fe0c491cf8d9429174033c720df637a4a1a4c168e79ea2c7c2d482d5f94f07" }, "pipfile-spec": 6, "requires": {}, @@ -900,6 +900,7 @@ "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5", "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab", "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316", + "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6", "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df", "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca", "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264", @@ -955,6 +956,7 @@ "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa", "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48", "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3", + "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184", "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67", "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7", "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34", @@ -972,6 +974,7 @@ "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0", "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b", "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1", + "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f", "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf", "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf", "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0", @@ -990,6 +993,7 @@ "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36", "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b", "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07", + "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c", "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573", "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001", "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9", @@ -1374,25 +1378,22 @@ "markers": "python_full_version >= '3.7.0'", "version": "==3.0.43" }, - "psycopg2": { - "hashes": [ - "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981", - "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516", - "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3", - "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa", - "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a", - "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693", - "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372", - "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e", - "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59", - "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156", - "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024", - "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913", - "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c" + "psycopg": { + "extras": [ + "c" + ], + "hashes": [ + "sha256:92d7b78ad82426cdcf1a0440678209faa890c6e1721361c2f8901f0dccd62961", + "sha256:dca5e5521c859f6606686432ae1c94e8766d29cc91f2ee595378c510cc5b0731" ], - "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==2.9.9" + "version": "==3.1.19" + }, + "psycopg-c": { + "hashes": [ + "sha256:8e90f53c430e7d661cb3a9298e2761847212ead1b24c5fb058fc9d0fd9616017" + ], + "version": "==3.1.19" }, "pycparser": { "hashes": [ @@ -4267,12 +4268,12 @@ }, "types-setuptools": { "hashes": [ - "sha256:3a8ccea3e3f1f639856a1dd622be282f74e94e00fdc364630240f999cc9594fc", - "sha256:bd3964c08cffd5a057d9cabe61641c86a41a1b5dd2b652b8d371eed64d89d726" + "sha256:275fb72048b0203d3fbef268298ea78a0913cd114a74872d93f8638ccc5b7c63", + "sha256:52b264eff8913b5d85848d83bd98efea935fc6129d681d370eb957783880b720" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==69.5.0.20240513" + "version": "==69.5.0.20240519" }, "types-tqdm": { "hashes": [ diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 5c7aa6c19..831e4e953 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -613,7 +613,7 @@ def _parse_db_settings() -> dict: } else: # Default to PostgresDB - engine = "django.db.backends.postgresql_psycopg2" + engine = "django.db.backends.postgresql" options = { "sslmode": os.getenv("PAPERLESS_DBSSLMODE", "prefer"), "sslrootcert": os.getenv("PAPERLESS_DBSSLROOTCERT", None), From 3d56a56eb875decc68367ef69ff3870fd8ca5770 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 25 May 2024 09:59:28 -0500 Subject: [PATCH 24/51] Fix: check original render type for split button --- .../components/document-detail/document-detail.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/src/app/components/document-detail/document-detail.component.html b/src-ui/src/app/components/document-detail/document-detail.component.html index 35d252b5b..0119955d9 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.html +++ b/src-ui/src/app/components/document-detail/document-detail.component.html @@ -53,7 +53,7 @@  More like this - From 180b32651d11a49a89c281582dcc75e5ec049029 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 27 May 2024 15:23:40 -0700 Subject: [PATCH 25/51] Chore: add stale to any-of-labels --- .github/workflows/repo-maintenance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml index c545eee17..c9c134242 100644 --- a/.github/workflows/repo-maintenance.yml +++ b/.github/workflows/repo-maintenance.yml @@ -22,7 +22,7 @@ jobs: with: days-before-stale: 7 days-before-close: 14 - any-of-labels: 'cant-reproduce,not a bug' + any-of-labels: 'stale,cant-reproduce,not a bug' stale-issue-label: stale stale-pr-label: stale stale-issue-message: > From 6d4897a1b81d262f371aa9cb8b3400f716fe9226 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Tue, 28 May 2024 12:56:40 -0700 Subject: [PATCH 26/51] Refresh the document instance before doing workflow work, in case some other process has updated it (#6849) --- src/documents/signals/handlers.py | 414 +++++++++++++++--------------- 1 file changed, 209 insertions(+), 205 deletions(-) diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index cdfedcb4c..68f366f44 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -363,24 +363,22 @@ class CannotMoveFilesException(Exception): pass -def validate_move(instance, old_path, new_path): - if not os.path.isfile(old_path): - # Can't do anything if the old file does not exist anymore. - logger.fatal(f"Document {instance!s}: File {old_path} has gone.") - raise CannotMoveFilesException - - if os.path.isfile(new_path): - # Can't do anything if the new file already exists. Skip updating file. - logger.warning( - f"Document {instance!s}: Cannot rename file " - f"since target path {new_path} already exists.", - ) - raise CannotMoveFilesException - - @receiver(models.signals.m2m_changed, sender=Document.tags.through) @receiver(models.signals.post_save, sender=Document) def update_filename_and_move_files(sender, instance: Document, **kwargs): + def validate_move(instance, old_path, new_path): + if not os.path.isfile(old_path): + # Can't do anything if the old file does not exist anymore. + msg = f"Document {instance!s}: File {old_path} doesn't exist." + logger.fatal(msg) + raise CannotMoveFilesException(msg) + + if os.path.isfile(new_path): + # Can't do anything if the new file already exists. Skip updating file. + msg = f"Document {instance!s}: Cannot rename file since target path {new_path} already exists." + logger.warning(msg) + raise CannotMoveFilesException(msg) + if not instance.filename: # Can't update the filename if there is no filename to begin with # This happens when the consumer creates a new document. @@ -532,6 +530,196 @@ def run_workflow( document: Document, logging_group=None, ): + def assignment_action(): + if action.assign_tags.all().count() > 0: + document.tags.add(*action.assign_tags.all()) + + if action.assign_correspondent is not None: + document.correspondent = action.assign_correspondent + + if action.assign_document_type is not None: + document.document_type = action.assign_document_type + + if action.assign_storage_path is not None: + document.storage_path = action.assign_storage_path + + if action.assign_owner is not None: + document.owner = action.assign_owner + + if action.assign_title is not None: + try: + document.title = parse_doc_title_w_placeholders( + action.assign_title, + ( + document.correspondent.name + if document.correspondent is not None + else "" + ), + ( + document.document_type.name + if document.document_type is not None + else "" + ), + (document.owner.username if document.owner is not None else ""), + timezone.localtime(document.added), + ( + document.original_filename + if document.original_filename is not None + else "" + ), + timezone.localtime(document.created), + ) + except Exception: + logger.exception( + f"Error occurred parsing title assignment '{action.assign_title}', falling back to original", + extra={"group": logging_group}, + ) + + if ( + ( + action.assign_view_users is not None + and action.assign_view_users.count() > 0 + ) + or ( + action.assign_view_groups is not None + and action.assign_view_groups.count() > 0 + ) + or ( + action.assign_change_users is not None + and action.assign_change_users.count() > 0 + ) + or ( + action.assign_change_groups is not None + and action.assign_change_groups.count() > 0 + ) + ): + permissions = { + "view": { + "users": action.assign_view_users.all().values_list( + "id", + ) + or [], + "groups": action.assign_view_groups.all().values_list( + "id", + ) + or [], + }, + "change": { + "users": action.assign_change_users.all().values_list( + "id", + ) + or [], + "groups": action.assign_change_groups.all().values_list( + "id", + ) + or [], + }, + } + set_permissions_for_object( + permissions=permissions, + object=document, + merge=True, + ) + + if action.assign_custom_fields is not None: + for field in action.assign_custom_fields.all(): + if ( + CustomFieldInstance.objects.filter( + field=field, + document=document, + ).count() + == 0 + ): + # can be triggered on existing docs, so only add the field if it doesn't already exist + CustomFieldInstance.objects.create( + field=field, + document=document, + ) + + def removal_action(): + if action.remove_all_tags: + document.tags.clear() + else: + for tag in action.remove_tags.filter( + pk__in=list(document.tags.values_list("pk", flat=True)), + ).all(): + document.tags.remove(tag.pk) + + if action.remove_all_correspondents or ( + document.correspondent + and ( + action.remove_correspondents.filter( + pk=document.correspondent.pk, + ).exists() + ) + ): + document.correspondent = None + + if action.remove_all_document_types or ( + document.document_type + and ( + action.remove_document_types.filter( + pk=document.document_type.pk, + ).exists() + ) + ): + document.document_type = None + + if action.remove_all_storage_paths or ( + document.storage_path + and ( + action.remove_storage_paths.filter( + pk=document.storage_path.pk, + ).exists() + ) + ): + document.storage_path = None + + if action.remove_all_owners or ( + document.owner + and (action.remove_owners.filter(pk=document.owner.pk).exists()) + ): + document.owner = None + + if action.remove_all_permissions: + permissions = { + "view": { + "users": [], + "groups": [], + }, + "change": { + "users": [], + "groups": [], + }, + } + set_permissions_for_object( + permissions=permissions, + object=document, + merge=False, + ) + elif ( + (action.remove_view_users.all().count() > 0) + or (action.remove_view_groups.all().count() > 0) + or (action.remove_change_users.all().count() > 0) + or (action.remove_change_groups.all().count() > 0) + ): + for user in action.remove_view_users.all(): + remove_perm("view_document", user, document) + for user in action.remove_change_users.all(): + remove_perm("change_document", user, document) + for group in action.remove_view_groups.all(): + remove_perm("view_document", group, document) + for group in action.remove_change_groups.all(): + remove_perm("change_document", group, document) + + if action.remove_all_custom_fields: + CustomFieldInstance.objects.filter(document=document).delete() + elif action.remove_custom_fields.all().count() > 0: + CustomFieldInstance.objects.filter( + field__in=action.remove_custom_fields.all(), + document=document, + ).delete() + for workflow in ( Workflow.objects.filter( enabled=True, @@ -552,6 +740,10 @@ def run_workflow( .prefetch_related("triggers") .order_by("order") ): + # This can be called from bulk_update_documents, which may be running multiple times + # Refresh this so the matching data is fresh and instance fields are re-freshed + # Otherwise, this instance might be behind and overwrite the work another process did + document.refresh_from_db() if matching.document_matches_workflow( document, workflow, @@ -565,198 +757,10 @@ def run_workflow( ) if action.type == WorkflowAction.WorkflowActionType.ASSIGNMENT: - if action.assign_tags.all().count() > 0: - document.tags.add(*action.assign_tags.all()) - - if action.assign_correspondent is not None: - document.correspondent = action.assign_correspondent - - if action.assign_document_type is not None: - document.document_type = action.assign_document_type - - if action.assign_storage_path is not None: - document.storage_path = action.assign_storage_path - - if action.assign_owner is not None: - document.owner = action.assign_owner - - if action.assign_title is not None: - try: - document.title = parse_doc_title_w_placeholders( - action.assign_title, - ( - document.correspondent.name - if document.correspondent is not None - else "" - ), - ( - document.document_type.name - if document.document_type is not None - else "" - ), - ( - document.owner.username - if document.owner is not None - else "" - ), - timezone.localtime(document.added), - ( - document.original_filename - if document.original_filename is not None - else "" - ), - timezone.localtime(document.created), - ) - except Exception: - logger.exception( - f"Error occurred parsing title assignment '{action.assign_title}', falling back to original", - extra={"group": logging_group}, - ) - - if ( - ( - action.assign_view_users is not None - and action.assign_view_users.count() > 0 - ) - or ( - action.assign_view_groups is not None - and action.assign_view_groups.count() > 0 - ) - or ( - action.assign_change_users is not None - and action.assign_change_users.count() > 0 - ) - or ( - action.assign_change_groups is not None - and action.assign_change_groups.count() > 0 - ) - ): - permissions = { - "view": { - "users": action.assign_view_users.all().values_list( - "id", - ) - or [], - "groups": action.assign_view_groups.all().values_list( - "id", - ) - or [], - }, - "change": { - "users": action.assign_change_users.all().values_list( - "id", - ) - or [], - "groups": action.assign_change_groups.all().values_list( - "id", - ) - or [], - }, - } - set_permissions_for_object( - permissions=permissions, - object=document, - merge=True, - ) - - if action.assign_custom_fields is not None: - for field in action.assign_custom_fields.all(): - if ( - CustomFieldInstance.objects.filter( - field=field, - document=document, - ).count() - == 0 - ): - # can be triggered on existing docs, so only add the field if it doesn't already exist - CustomFieldInstance.objects.create( - field=field, - document=document, - ) + assignment_action() elif action.type == WorkflowAction.WorkflowActionType.REMOVAL: - if action.remove_all_tags: - document.tags.clear() - else: - for tag in action.remove_tags.filter( - pk__in=list(document.tags.values_list("pk", flat=True)), - ).all(): - document.tags.remove(tag.pk) - - if action.remove_all_correspondents or ( - document.correspondent - and ( - action.remove_correspondents.filter( - pk=document.correspondent.pk, - ).exists() - ) - ): - document.correspondent = None - - if action.remove_all_document_types or ( - document.document_type - and ( - action.remove_document_types.filter( - pk=document.document_type.pk, - ).exists() - ) - ): - document.document_type = None - - if action.remove_all_storage_paths or ( - document.storage_path - and ( - action.remove_storage_paths.filter( - pk=document.storage_path.pk, - ).exists() - ) - ): - document.storage_path = None - - if action.remove_all_owners or ( - document.owner - and (action.remove_owners.filter(pk=document.owner.pk).exists()) - ): - document.owner = None - - if action.remove_all_permissions: - permissions = { - "view": { - "users": [], - "groups": [], - }, - "change": { - "users": [], - "groups": [], - }, - } - set_permissions_for_object( - permissions=permissions, - object=document, - merge=False, - ) - elif ( - (action.remove_view_users.all().count() > 0) - or (action.remove_view_groups.all().count() > 0) - or (action.remove_change_users.all().count() > 0) - or (action.remove_change_groups.all().count() > 0) - ): - for user in action.remove_view_users.all(): - remove_perm("view_document", user, document) - for user in action.remove_change_users.all(): - remove_perm("change_document", user, document) - for group in action.remove_view_groups.all(): - remove_perm("view_document", group, document) - for group in action.remove_change_groups.all(): - remove_perm("change_document", group, document) - - if action.remove_all_custom_fields: - CustomFieldInstance.objects.filter(document=document).delete() - elif action.remove_custom_fields.all().count() > 0: - CustomFieldInstance.objects.filter( - field__in=action.remove_custom_fields.all(), - document=document, - ).delete() + removal_action() document.save() From b9960220037852e7c7b4d044cf68c3a026bc95d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 13:22:44 -0700 Subject: [PATCH 27/51] Chore(deps): Bump the small-changes group with 3 updates (#6843) Bumps the small-changes group with 3 updates: [rapidfuzz](https://github.com/rapidfuzz/RapidFuzz), [scikit-learn](https://github.com/scikit-learn/scikit-learn) and [watchdog](https://github.com/gorakhargosh/watchdog). Updates `rapidfuzz` from 3.9.0 to 3.9.1 - [Release notes](https://github.com/rapidfuzz/RapidFuzz/releases) - [Changelog](https://github.com/rapidfuzz/RapidFuzz/blob/main/CHANGELOG.rst) - [Commits](https://github.com/rapidfuzz/RapidFuzz/compare/v3.9.0...v3.9.1) Updates `scikit-learn` from 1.4.2 to 1.5.0 - [Release notes](https://github.com/scikit-learn/scikit-learn/releases) - [Commits](https://github.com/scikit-learn/scikit-learn/compare/1.4.2...1.5.0) Updates `watchdog` from 4.0.0 to 4.0.1 - [Release notes](https://github.com/gorakhargosh/watchdog/releases) - [Changelog](https://github.com/gorakhargosh/watchdog/blob/master/changelog.rst) - [Commits](https://github.com/gorakhargosh/watchdog/compare/v4.0.0...v4.0.1) --- updated-dependencies: - dependency-name: rapidfuzz dependency-type: direct:production update-type: version-update:semver-patch dependency-group: small-changes - dependency-name: scikit-learn dependency-type: direct:production update-type: version-update:semver-minor dependency-group: small-changes - dependency-name: watchdog dependency-type: direct:production update-type: version-update:semver-patch dependency-group: small-changes ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Pipfile | 2 +- Pipfile.lock | 346 ++++++++++++++++++++++++++------------------------- 2 files changed, 177 insertions(+), 171 deletions(-) diff --git a/Pipfile b/Pipfile index 7a01efca1..da26987cf 100644 --- a/Pipfile +++ b/Pipfile @@ -46,7 +46,7 @@ python-magic = "*" pyzbar = "*" rapidfuzz = "*" redis = {extras = ["hiredis"], version = "*"} -scikit-learn = "~=1.4" +scikit-learn = "~=1.5" setproctitle = "*" tika-client = "*" tqdm = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 8bc530b33..c99c57fae 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "01fe0c491cf8d9429174033c720df637a4a1a4c168e79ea2c7c2d482d5f94f07" + "sha256": "1bf32173eb08a61ff9ce2f3fd4cb968930da3b480583c218d1c439560839c363" }, "pipfile-spec": 6, "requires": {}, @@ -1539,100 +1539,103 @@ }, "rapidfuzz": { "hashes": [ - "sha256:014ac55b03f4074f903248ded181f3000f4cdbd134e6155cbf643f0eceb4f70f", - "sha256:08d8b49b3a4fb8572e480e73fcddc750da9cbb8696752ee12cca4bf8c8220d52", - "sha256:0bb28ab5300cf974c7eb68ea21125c493e74b35b1129e629533468b2064ae0a2", - "sha256:0c5b8f9a7b177af6ce7c6ad5b95588b4b73e37917711aafa33b2e79ee80fe709", - "sha256:0ca799f882364e69d0872619afb19efa3652b7133c18352e4a3d86a324fb2bb1", - "sha256:0dcb95fde22f98e6d0480db8d6038c45fe2d18a338690e6f9bba9b82323f3469", - "sha256:0e2e106cc66453bb80d2ad9c0044f8287415676df5c8036d737d05d4b9cdbf8e", - "sha256:0e86e39c1c1a0816ceda836e6f7bd3743b930cbc51a43a81bb433b552f203f25", - "sha256:1179dcd3d150a67b8a678cd9c84f3baff7413ff13c9e8fe85e52a16c97e24c9b", - "sha256:11a7ec4676242c8a430509cff42ce98bca2fbe30188a63d0f60fdcbfd7e84970", - "sha256:134b7098ac109834eeea81424b6822f33c4c52bf80b81508295611e7a21be12a", - "sha256:13857f9070600ea1f940749f123b02d0b027afbaa45e72186df0f278915761d0", - "sha256:170822a1b1719f02b58e3dce194c8ad7d4c5b39be38c0fdec603bd19c6f9cf81", - "sha256:182b4e11de928fb4834e8f8b5ecd971b5b10a86fabe8636ab65d3a9b7e0e9ca7", - "sha256:1b1f74997b6d94d66375479fa55f70b1c18e4d865d7afcd13f0785bfd40a9d3c", - "sha256:1d536f8beb8dd82d6efb20fe9f82c2cfab9ffa0384b5d184327e393a4edde91d", - "sha256:2003071aa633477a01509890c895f9ef56cf3f2eaa72c7ec0b567f743c1abcba", - "sha256:2444d8155d9846f206e2079bb355b85f365d9457480b0d71677a112d0a7f7128", - "sha256:28da953eb2ef9ad527e536022da7afff6ace7126cdd6f3e21ac20f8762e76d2c", - "sha256:2a96209f046fe328be30fc43f06e3d4b91f0d5b74e9dcd627dbfd65890fa4a5e", - "sha256:2bc5559b9b94326922c096b30ae2d8e5b40b2e9c2c100c2cc396ad91bcb84d30", - "sha256:2d267d4c982ab7d177e994ab1f31b98ff3814f6791b90d35dda38307b9e7c989", - "sha256:3083512e9bf6ed2bb3d25883922974f55e21ae7f8e9f4e298634691ae1aee583", - "sha256:30f7609da871510583f87484a10820b26555a473a90ab356cdda2f3b4456256c", - "sha256:33cfabcb7fd994938a6a08e641613ce5fe46757832edc789c6a5602e7933d6fa", - "sha256:36bf35df2d6c7d5820da20a6720aee34f67c15cd2daf8cf92e8141995c640c25", - "sha256:3733aede16ea112728ffeafeb29ccc62e095ed8ec816822fa2a82e92e2c08696", - "sha256:3904d0084ab51f82e9f353031554965524f535522a48ec75c30b223eb5a0a488", - "sha256:3a16c48c6df8fb633efbbdea744361025d01d79bca988f884a620e63e782fe5b", - "sha256:3c42a238bf9dd48f4ccec4c6934ac718225b00bb3a438a008c219e7ccb3894c7", - "sha256:3f4a2468432a1db491af6f547fad8f6d55fa03e57265c2f20e5eaceb68c7907e", - "sha256:413ac49bae291d7e226a5c9be65c71b2630b3346bce39268d02cb3290232e4b7", - "sha256:4514980a5d204c076dd5b756960f6b1b7598f030009456e6109d76c4c331d03c", - "sha256:47b7c0840afa724db3b1a070bc6ed5beab73b4e659b1d395023617fc51bf68a2", - "sha256:47d97e28c42f1efb7781993b67c749223f198f6653ef177a0c8f2b1c516efcaf", - "sha256:48105991ff6e4a51c7f754df500baa070270ed3d41784ee0d097549bc9fcb16d", - "sha256:488f74126904db6b1bea545c2f3567ea882099f4c13f46012fe8f4b990c683df", - "sha256:491274080742110427f38a6085bb12dffcaff1eef12dccf9e8758398c7e3957e", - "sha256:4eea3bf72c4fe68e957526ffd6bcbb403a21baa6b3344aaae2d3252313df6199", - "sha256:544b0bf9d17170720809918e9ccd0d482d4a3a6eca35630d8e1459f737f71755", - "sha256:55e2c5076f38fc1dbaacb95fa026a3e409eee6ea5ac4016d44fb30e4cad42b20", - "sha256:5c396562d304e974b4b0d5cd3afc4f92c113ea46a36e6bc62e45333d6aa8837e", - "sha256:623883fb78e692d54ed7c43b09beec52c6685f10a45a7518128e25746667403b", - "sha256:633b9d03fc04abc585c197104b1d0af04b1f1db1abc99f674d871224cd15557a", - "sha256:65d9250a4b0bf86320097306084bc3ca479c8f5491927c170d018787793ebe95", - "sha256:68da1b70458fea5290ec9a169fcffe0c17ff7e5bb3c3257e63d7021a50601a8e", - "sha256:6993d361f28b9ef5f0fa4e79b8541c2f3507be7471b9f9cb403a255e123b31e1", - "sha256:6a7f273906b3c7cc6d63a76e088200805947aa0bc1ada42c6a0e582e19c390d7", - "sha256:6a83128d505cac76ea560bb9afcb3f6986e14e50a6f467db9a31faef4bd9b347", - "sha256:6c1ed63345d1581c39d4446b1a8c8f550709656ce2a3c88c47850b258167f3c2", - "sha256:731269812ea837e0b93d913648e404736407408e33a00b75741e8f27c590caa2", - "sha256:7988363b3a415c5194ce1a68d380629247f8713e669ad81db7548eb156c4f365", - "sha256:7c09f4e87e82a164c9db769474bc61f8c8b677f2aeb0234b8abac73d2ecf9799", - "sha256:849160dc0f128acb343af514ca827278005c1d00148d025e4035e034fc2d8c7f", - "sha256:8e5ff882d3a3d081157ceba7e0ebc7fac775f95b08cbb143accd4cece6043819", - "sha256:905b01a9b633394ff6bb5ebb1c5fd660e0e180c03fcf9d90199cc6ed74b87cf7", - "sha256:9a06a99f1335fe43464d7121bc6540de7cd9c9475ac2025babb373fe7f27846b", - "sha256:9bc0f7e6256a9c668482c41c8a3de5d0aa12e8ca346dcc427b97c7edb82cba48", - "sha256:9d6478957fb35c7844ad08f2442b62ba76c1857a56370781a707eefa4f4981e1", - "sha256:a2de844e0e971d7bd8aa41284627dbeacc90e750b90acfb016836553c7a63192", - "sha256:a365886c42177b2beab475a50ba311b59b04f233ceaebc4c341f6f91a86a78e2", - "sha256:ab872cb57ae97c54ba7c71a9e3c9552beb57cb907c789b726895576d1ea9af6f", - "sha256:ae643220584518cbff8bf2974a0494d3e250763af816b73326a512c86ae782ce", - "sha256:b11e602987bcb4ea22b44178851f27406fca59b0836298d0beb009b504dba266", - "sha256:b1256915f7e7a5cf2c151c9ac44834b37f9bd1c97e8dec6f936884f01b9dfc7d", - "sha256:b182f0fb61f6ac435e416eb7ab330d62efdbf9b63cf0c7fa12d1f57c2eaaf6f3", - "sha256:b33c6d4b3a1190bc0b6c158c3981535f9434e8ed9ffa40cf5586d66c1819fb4b", - "sha256:b9bf90b3d96925cbf8ef44e5ee3cf39ef0c422f12d40f7a497e91febec546650", - "sha256:bd375c4830fee11d502dd93ecadef63c137ae88e1aaa29cc15031fa66d1e0abb", - "sha256:bdd8c15c3a14e409507fdf0c0434ec481d85c6cbeec8bdcd342a8cd1eda03825", - "sha256:c4ef34b2ddbf448f1d644b4ec6475df8bbe5b9d0fee173ff2e87322a151663bd", - "sha256:c56d2efdfaa1c642029f3a7a5bb76085c5531f7a530777be98232d2ce142553c", - "sha256:c74f2da334ce597f31670db574766ddeaee5d9430c2c00e28d0fbb7f76172036", - "sha256:cd2e6e97daf17ebb3254285cf8dd86c60d56d6cf35c67f0f9a557ef26bd66290", - "sha256:ce897b5dafb7fb7587a95fe4d449c1ea0b6d9ac4462fbafefdbbeef6eee4cf6a", - "sha256:d20ab9abc7e19767f1951772a6ab14cb4eddd886493c2da5ee12014596ad253f", - "sha256:d5d5684f54d82d9b0cf0b2701e55a630527a9c3dd5ddcf7a2e726a475ac238f2", - "sha256:dcb523243e988c849cf81220164ec3bbed378a699e595a8914fffe80596dc49f", - "sha256:e2218d62ab63f3c5ad48eced898854d0c2c327a48f0fb02e2288d7e5332a22c8", - "sha256:e33362e98c7899b5f60dcb06ada00acd8673ce0d59aefe9a542701251fd00423", - "sha256:e3f2d1ea7cd57dfcd34821e38b4924c80a31bcf8067201b1ab07386996a9faee", - "sha256:e65b8f7921bf60cbb207c132842a6b45eefef48c4c3b510eb16087d6c08c70af", - "sha256:e721842e6b601ebbeb8cc5e12c75bbdd1d9e9561ea932f2f844c418c31256e82", - "sha256:f81fe99a69ac8ee3fd905e70c62f3af033901aeb60b69317d1d43d547b46e510", - "sha256:f83bd3d01f04061c3660742dc85143a89d49fd23eb31eccbf60ad56c4b955617", - "sha256:fb67cf43ad83cb886cbbbff4df7dcaad7aedf94d64fca31aea0da7d26684283c", - "sha256:fc02157f521af15143fae88f92ef3ddcc4e0cff05c40153a9549dc0fbdb9adb3", - "sha256:fc4e26f592b51f97acf0a3f8dfed95e4d830c6a8fbf359361035df836381ab81", - "sha256:ff08081c49b18ba253a99e6a47f492e6ee8019e19bbb6ddc3ed360cd3ecb2f62", - "sha256:ff8982fc3bd49d55a91569fc8a3feba0de4cef0b391ff9091be546e9df075b81" + "sha256:02ed579f35ddd3552c7f74bc0c10800b432d9b09a4cebb19fd7a10b3b4759cc0", + "sha256:03a0a4bc8d4bd3e6f882b4c2ac183825a9b6dabe7e5a97bb6a1075e4635c944d", + "sha256:06879b598e798a4d33a283c2b4fa0d555d7706b6531e3321b161d62e986f7f57", + "sha256:07decc6b058f935d2219423a50aac426027928cc734809f793bc250de4a3756e", + "sha256:08dcd347d408912b6da778a73a0d7a2adad7fe238a44263e5e3789f2a8d84669", + "sha256:08f85d6674d804a493c3e9ec10a807f9bd8f482781487eda064913b537f99d7f", + "sha256:0c568b89a5016e76f0b3f85e9379036da99c5e7ec26b33935453d353a1938b74", + "sha256:0ceb0d7bdec910d93793d32633ba0cb644356cf6778f9d91b727da0075beaec1", + "sha256:0e931539edeb9158ef83537cd571051f8a9608737642c20b088a37bd5d76c5c9", + "sha256:0edc950c6a04c19db10670cd04e33403b3eb0f175deb620f9668595d378b1005", + "sha256:0f906ab6220778404498e0ce255c4cc89f98ea5e656e54cc59c5813c877eb86b", + "sha256:1539e7439b68013c5d2ab7ed9d3d221480a15595207764145ae177077d28016d", + "sha256:177bddf50577db59bcb00b6f7a5c2b70f2ec5a2aba40c8add7a6f7fd8609224e", + "sha256:1e872627d5359c840f3e431b0beb263518048917c3e076f624870552d84e7dc6", + "sha256:25ea055ae40fb60f503f02b44b3ac35a39a9108be33f89e05b81bc4e3c849ec8", + "sha256:2ef42c43c94139c890aeec40bc442c4bf8d48e15b456a88ce0f4cc5cfcad1896", + "sha256:2f9044a4470343087cde10beaa36266519d5da110a9a4597b43e6aa35fa928d3", + "sha256:32718fa69306df969bf4fca1719f8900b83df315a2a8153942d5b8906f4fd1d6", + "sha256:349e9c15092d20a1f6ff1795e068f39a9ee5e84c54b3addbc66d0ac469c4ef43", + "sha256:3ab6ad7e70469aed24e24378b19a9e47fc757c847399b22c612a0fccacc795cb", + "sha256:414644a2fc8a3e5fafda95b430214ed892faa4d0a07401d33892bc9ca5c84974", + "sha256:493354f50b9855271ac846b213e394e08446e70cef5cc033e5302a2220f3ae7b", + "sha256:4a231e8f3bae82f10e7188965b37c91d8bfb80136595c860c8a08eb0dd07764d", + "sha256:50c2f7ad132dfeb6247c90b41431662af939a820f761cf930708d55912377ed8", + "sha256:53477e1e6d85d603c9a319cfd00ab9f0a57b6d68bcdb268d6b15a79e64d693d0", + "sha256:5713c56b30ed75ada3a8f008cf8e8e6323386ce48fac2bf2d07285fe6c91f5a4", + "sha256:5d8eb7fe39e81dc1530a3ec81a35e69770839c76607c461eb9d0902427fab3e1", + "sha256:5dbcc4add07bd60ea73b94392fed28f83dba0fe796097da47627fd539bd6daca", + "sha256:5f897a9bff517d5c6af6a90131796b4298b547b9a9a4df3cf285006be33aae5b", + "sha256:61b343c581f4926260248069d8fdbbbf293c19c12ef440ad5ced15bcff277a84", + "sha256:64058f4a3698c6c8464df47a3b7da303db2477b2447142da3e67fc091f4c366a", + "sha256:678fcaa5117ddb6263160a7c5f33cc9ea3df335465f5d53715707fad103e1d09", + "sha256:7149afaf0294882b6b15bb6fa9fc38ff1d761e50117460ee3561181c1c4e2230", + "sha256:76a55bcc3abc9f8e38a1218cb5a09719126cfc4cba23ebd8caa27dfdc69cedd8", + "sha256:77767b119ac05662d216a8cc4092ac28dbc015d9caabebdbefe371b0dd82a38e", + "sha256:7f006c3af82c478df09a790fb4846b5acd00a187d75715674d71f5dc0ac982ce", + "sha256:829fbad93266fffa0f9d722a94cbb1b95b53e3c04be4e872193496a0cfbd66f0", + "sha256:83c570ce23b447625929c0e7c4f2eab6d90f5a576db2b26a5aa0594a53d560ea", + "sha256:874317057a58a9c6ddf59fe1491e478217daa9fdb043a00358a15de4f62f9a2d", + "sha256:8781e45c56f7f3a64940f4d594a4ffd69360147925a706569b2b0c57347b2225", + "sha256:8e11405d81e8baea4999a5757a982009566cff8f6a121d5ccf042aab81ae0230", + "sha256:8e70605350cb6ec5091e06de62d3dcb058f694b059b4e1a9d85bfbf892f70030", + "sha256:97ab8f153984a5d827ebb5a5b80ee59563efcf2fa3e569dcd46ea7e7c9845e93", + "sha256:998977df2ae01ff8b7bc3b29a860b4a863005e0533e323df3fd555a31ef33f0e", + "sha256:9bfa8c0a8ce09b4bcd36322f8f375750dca160fbdbeb2e763a695cef3ae9133e", + "sha256:9f66f9d5f14141b4b017e76118ec4bda29266f6b281989026e3a9ba1a2aaf032", + "sha256:9f74d93148081049ccc86f276d54cd7c8c0692250245660b4fcd904ed1db1e01", + "sha256:9f8615a2a67a1f80b3aa7a3d7fbe6a2ed062a54c98988e3f9b664b49a3bc115e", + "sha256:9f9dfdcd75e16e5874efee233b28aec1322623b0f1f20641452d06ea2d8ba5ef", + "sha256:a079164675d24eb715230bf9dd252683ae3c9c0c0a236f0b8098630268b899e9", + "sha256:a3a48fc6dc274b803a366a4baec99e212792ae1b1e73d42235b2042cd3ade7c1", + "sha256:a42eb645241f39a59c45a7fc15e3faf61886bff3a4a22263fd0f7cfb90e91b7f", + "sha256:a47550eabf235e5d50e7d448c18f77f6e8082aa3571e9df511c8388525ea9372", + "sha256:a645f362dafc103dbe7f43a2ad34f76284773cd7d1b00514d1c591848a1c817f", + "sha256:a89b219c1a7933a0673b2dbb1ffe701057d82e5cb843552be4f55b61b557031e", + "sha256:aa44aef769e5834fef4fde091fd646cc1c52a2813b3aa241ae54b3028960abaa", + "sha256:aaba665f92c011c6f284e933ab02b5dc129a6d3f48fce913ec4a214bd530135e", + "sha256:b26cc9459e096959fab3a4a8a17b96a6c7c961f9db5c37c1c3c7a06789316cf7", + "sha256:b71e7f99ed048a338e4a1ac34f56b3b3933a3ba2dfbb04450c786a8ddd97f4db", + "sha256:b8a6d5a8edc452920efdf1b499a2a47bb8a28440f7ab3fe28bb7d6636ccf71c3", + "sha256:bc4503841cd3cbe22b5ac44f15bc834ec97d811a3c3943f73f5643266c8674e1", + "sha256:bc68fb8f2a8b5b3a4526b7a65e7d5c7f821882f56d9dcbcce4c6859a9e5bdcd7", + "sha256:bca2b93c75f87cd85832cdd5bb06b4b5642e2a05c8e3550841ddf5d564ce4abb", + "sha256:bcc0ffcaeb1e499e708f32ec30177ed690b3f25455c91ad8c2240986c69f9ebe", + "sha256:bf5184b17e26a82b00c7ee05d9ec5d826113df55830bbc447bf6d6e7469c70fb", + "sha256:c0899de4fc1a7a36f14be556a0dacf40ea5c0fe22c6b45b2ea2674e1ac47e269", + "sha256:c125095d1828fa10ac79077594dd2d8829167d9e184e20baa97620fc52ebdcc9", + "sha256:c6437cba4b9460d5ee0bafd796e13ef9307091b81685bbe745b0f1619fb887ca", + "sha256:c6b11a38b61cc2462a113b123f5e932cda0e525f816d6fe4b68516f97d7f9d49", + "sha256:c883d2d2e31c759af1f3fdeb67ec151cf94e307f745b3d02ab3a2ef6595485f2", + "sha256:c8b0e6640421e55d69e186ce7fb9e6c723cfd3b6f91beaeb28705c2a46c8a194", + "sha256:c99d001c45c31c2cd2f7361bc2036d3062b21db5f43beea8bc5109d43fe9f283", + "sha256:ce3335324198e1388a1c4e50d40f45107367010afe9fa09fd46278160f0ab591", + "sha256:d2ff268a8bf57a76512804d5ca2097afaf98e64e8947d514cde7e2e8446aa5f7", + "sha256:d3397630f22e6c60dda8be3e9dbcf6a341695d487df8a6c92f4a2f7ebcdaecf7", + "sha256:d3da444890c9559fd15717d97f8373b1cd14007f68c9b037aa93ef7ca969b559", + "sha256:da3f495cf4f7a443b34a6d3c6805265595fcd13641b3253a8e2034289d828dd9", + "sha256:dc4b5de5d6f9347d836d849b56bca630169353cbe5c10fa7fe93bb1677b49770", + "sha256:dec2792f864be731c8339cad99001caa6540aa909e6fd8bc688bb0419c501f44", + "sha256:df7bba8d4a8fb8e7559a9e83dfc5385dc6fe89efd73e32d253667242faf1883c", + "sha256:e18f0e9351f7e5d5387774ff4d5cabd824341e16b866eb1c8d3f557111b447ef", + "sha256:e4c6b6455ee8404a663e15477a8bfe98b1afb329ff224bcf6d15f623a3761b95", + "sha256:e58489934d0147f1edda693cb983bea40f2b45ae6756fd47c1005b538f817a2f", + "sha256:e5d7b3154f6df9e05c2016de5e95f8cba4fe636a4e5520ebcd89bc6c54b8e4ed", + "sha256:e9f075366cee63a6b06bd7f9285eb9f1785382a6493afcb7054202e20508bf94", + "sha256:ea62c82eb2c65bd49651e95f4f46874483ae4da1c3b57997e58f1b4fb2de6c05", + "sha256:eadf8c4b24b63aef8810ed585c24ac1fc022ee771211772a6e9f78c63aa949ff", + "sha256:eb023adfefa62410fff877f7cc70cd4758cbfbad963e87d146cf71b022dce197", + "sha256:eb3f1af099cd1d98001691fbdadd422f088f21eadcacf5698b393b7569e24dc4", + "sha256:f6f4e8235d0acf1972f5eb4091c4a0473e5670a754f166c0c718ce21e945f879", + "sha256:f8869dcf072227a40a6f9e87b3fc4eb020055a08ad12b63d751c354e3a973ccb", + "sha256:fb592bad9d58b47c6681f0c180767d2c98775a35f7267131d33723139c3d6c2e", + "sha256:fbce66cb2e331b0888c79b594eab76e2c609c2637050085daadff5325d471dc2" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.9.0" + "version": "==3.9.1" }, "redis": { "extras": [ @@ -1764,62 +1767,62 @@ }, "scikit-learn": { "hashes": [ - "sha256:1d0b25d9c651fd050555aadd57431b53d4cf664e749069da77f3d52c5ad14b3b", - "sha256:36f0ea5d0f693cb247a073d21a4123bdf4172e470e6d163c12b74cbb1536cf38", - "sha256:426d258fddac674fdf33f3cb2d54d26f49406e2599dbf9a32b4d1696091d4256", - "sha256:44c62f2b124848a28fd695db5bc4da019287abf390bfce602ddc8aa1ec186aae", - "sha256:45dee87ac5309bb82e3ea633955030df9bbcb8d2cdb30383c6cd483691c546cc", - "sha256:49d64ef6cb8c093d883e5a36c4766548d974898d378e395ba41a806d0e824db8", - "sha256:5460a1a5b043ae5ae4596b3126a4ec33ccba1b51e7ca2c5d36dac2169f62ab1d", - "sha256:5cd7b524115499b18b63f0c96f4224eb885564937a0b3477531b2b63ce331904", - "sha256:671e2f0c3f2c15409dae4f282a3a619601fa824d2c820e5b608d9d775f91780c", - "sha256:68b8404841f944a4a1459b07198fa2edd41a82f189b44f3e1d55c104dbc2e40c", - "sha256:81bf5d8bbe87643103334032dd82f7419bc8c8d02a763643a6b9a5c7288c5054", - "sha256:8539a41b3d6d1af82eb629f9c57f37428ff1481c1e34dddb3b9d7af8ede67ac5", - "sha256:87440e2e188c87db80ea4023440923dccbd56fbc2d557b18ced00fef79da0727", - "sha256:90378e1747949f90c8f385898fff35d73193dfcaec3dd75d6b542f90c4e89755", - "sha256:b0203c368058ab92efc6168a1507d388d41469c873e96ec220ca8e74079bf62e", - "sha256:c97a50b05c194be9146d61fe87dbf8eac62b203d9e87a3ccc6ae9aed2dfaf361", - "sha256:d36d0bc983336bbc1be22f9b686b50c964f593c8a9a913a792442af9bf4f5e68", - "sha256:d762070980c17ba3e9a4a1e043ba0518ce4c55152032f1af0ca6f39b376b5928", - "sha256:d9993d5e78a8148b1d0fdf5b15ed92452af5581734129998c26f481c46586d68", - "sha256:daa1c471d95bad080c6e44b4946c9390a4842adc3082572c20e4f8884e39e959", - "sha256:ff4effe5a1d4e8fed260a83a163f7dbf4f6087b54528d8880bab1d1377bd78be" + "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c", + "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415", + "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801", + "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac", + "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184", + "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff", + "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71", + "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d", + "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4", + "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2", + "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210", + "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67", + "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622", + "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7", + "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e", + "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40", + "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06", + "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6", + "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8", + "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3", + "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==1.4.2" + "version": "==1.5.0" }, "scipy": { "hashes": [ - "sha256:05f1432ba070e90d42d7fd836462c50bf98bd08bed0aa616c359eed8a04e3922", - "sha256:09c74543c4fbeb67af6ce457f6a6a28e5d3739a87f62412e4a16e46f164f0ae5", - "sha256:0fbcf8abaf5aa2dc8d6400566c1a727aed338b5fe880cde64907596a89d576fa", - "sha256:109d391d720fcebf2fbe008621952b08e52907cf4c8c7efc7376822151820820", - "sha256:1d2f7bb14c178f8b13ebae93f67e42b0a6b0fc50eba1cd8021c9b6e08e8fb1cd", - "sha256:1e7626dfd91cdea5714f343ce1176b6c4745155d234f1033584154f60ef1ff42", - "sha256:22789b56a999265431c417d462e5b7f2b487e831ca7bef5edeb56efe4c93f86e", - "sha256:28e286bf9ac422d6beb559bc61312c348ca9b0f0dae0d7c5afde7f722d6ea13d", - "sha256:33fde20efc380bd23a78a4d26d59fc8704e9b5fd9b08841693eb46716ba13d86", - "sha256:45c08bec71d3546d606989ba6e7daa6f0992918171e2a6f7fbedfa7361c2de1e", - "sha256:4dca18c3ffee287ddd3bc8f1dabaf45f5305c5afc9f8ab9cbfab855e70b2df5c", - "sha256:5407708195cb38d70fd2d6bb04b1b9dd5c92297d86e9f9daae1576bd9e06f602", - "sha256:58569af537ea29d3f78e5abd18398459f195546bb3be23d16677fb26616cc11e", - "sha256:5e4a756355522eb60fcd61f8372ac2549073c8788f6114449b37e9e8104f15a5", - "sha256:6bf9fe63e7a4bf01d3645b13ff2aa6dea023d38993f42aaac81a18b1bda7a82a", - "sha256:8930ae3ea371d6b91c203b1032b9600d69c568e537b7988a3073dfe4d4774f21", - "sha256:9ff7dad5d24a8045d836671e082a490848e8639cabb3dbdacb29f943a678683d", - "sha256:a2f471de4d01200718b2b8927f7d76b5d9bde18047ea0fa8bd15c5ba3f26a1d6", - "sha256:ac38c4c92951ac0f729c4c48c9e13eb3675d9986cc0c83943784d7390d540c78", - "sha256:b2a3ff461ec4756b7e8e42e1c681077349a038f0686132d623fa404c0bee2551", - "sha256:b5acd8e1dbd8dbe38d0004b1497019b2dbbc3d70691e65d69615f8a7292865d7", - "sha256:b8434f6f3fa49f631fae84afee424e2483289dfc30a47755b4b4e6b07b2633a4", - "sha256:ba419578ab343a4e0a77c0ef82f088238a93eef141b2b8017e46149776dfad4d", - "sha256:d0de696f589681c2802f9090fff730c218f7c51ff49bf252b6a97ec4a5d19e8b", - "sha256:dcbb9ea49b0167de4167c40eeee6e167caeef11effb0670b554d10b1e693a8b9" + "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", + "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", + "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", + "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", + "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", + "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", + "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", + "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", + "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", + "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", + "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", + "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", + "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", + "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", + "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", + "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", + "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", + "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", + "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", + "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", + "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", + "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", + "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", + "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", + "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f" ], "markers": "python_version >= '3.9'", - "version": "==1.13.0" + "version": "==1.13.1" }, "setproctitle": { "hashes": [ @@ -2072,39 +2075,42 @@ }, "watchdog": { "hashes": [ - "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257", - "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca", - "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b", - "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85", - "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b", - "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19", - "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50", - "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92", - "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269", - "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f", - "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c", - "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b", - "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87", - "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b", - "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b", - "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8", - "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c", - "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3", - "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7", - "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605", - "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935", - "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b", - "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927", - "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101", - "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07", - "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec", - "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4", - "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245", - "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d" + "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7", + "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767", + "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175", + "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459", + "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5", + "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429", + "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6", + "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d", + "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7", + "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28", + "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235", + "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57", + "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a", + "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5", + "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709", + "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee", + "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84", + "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd", + "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba", + "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db", + "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682", + "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35", + "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d", + "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645", + "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253", + "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193", + "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b", + "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44", + "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b", + "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625", + "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e", + "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==4.0.0" + "version": "==4.0.1" }, "watchfiles": { "hashes": [ From fdf873ad6a13c3b36ced04a9f2f9a2d34d0dec68 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 28 May 2024 23:52:45 -0700 Subject: [PATCH 28/51] Fix: enforce dropdown input min width --- src-ui/src/styles.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src-ui/src/styles.scss b/src-ui/src/styles.scss index 0e084e838..412324142 100644 --- a/src-ui/src/styles.scss +++ b/src-ui/src/styles.scss @@ -259,6 +259,10 @@ a.btn-link:focus-visible, .ng-select-container .ng-value-container .ng-input { top: 7px; + + input { + min-width: 10px; + } } .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-marked { From 235b0a4c33c70f4209c562f3689307ba6da03efa Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 28 May 2024 23:54:51 -0700 Subject: [PATCH 29/51] Update messages.xlf --- src-ui/messages.xlf | 94 ++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 37fecf495..36563485c 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -2286,7 +2286,7 @@
src/app/components/document-detail/document-detail.component.ts - 818 + 821 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -2329,19 +2329,19 @@ src/app/components/document-detail/document-detail.component.ts - 820 + 823 src/app/components/document-detail/document-detail.component.ts - 1113 + 1114 src/app/components/document-detail/document-detail.component.ts - 1150 + 1151 src/app/components/document-detail/document-detail.component.ts - 1191 + 1192 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -5510,7 +5510,7 @@ src/app/components/document-detail/document-detail.component.ts - 1168 + 1169 src/app/guards/dirty-saved-view.guard.ts @@ -5786,56 +5786,56 @@ An error occurred loading content: src/app/components/document-detail/document-detail.component.ts - 339,341 + 342,344
Document changes detected src/app/components/document-detail/document-detail.component.ts - 362 + 365 The version of this document in your browser session appears older than the existing version. src/app/components/document-detail/document-detail.component.ts - 363 + 366 Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. src/app/components/document-detail/document-detail.component.ts - 364 + 367 Ok src/app/components/document-detail/document-detail.component.ts - 366 + 369 Next document src/app/components/document-detail/document-detail.component.ts - 473 + 476 Previous document src/app/components/document-detail/document-detail.component.ts - 483 + 486 Close document src/app/components/document-detail/document-detail.component.ts - 491 + 494 src/app/services/open-documents.service.ts @@ -5846,50 +5846,50 @@ Save document src/app/components/document-detail/document-detail.component.ts - 498 + 501 Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 540 + 543 Error retrieving suggestions. src/app/components/document-detail/document-detail.component.ts - 565 + 568 Document saved successfully. src/app/components/document-detail/document-detail.component.ts - 687 + 690 src/app/components/document-detail/document-detail.component.ts - 701 + 704 Error saving document src/app/components/document-detail/document-detail.component.ts - 705 + 708 src/app/components/document-detail/document-detail.component.ts - 746 + 749 Confirm delete src/app/components/document-detail/document-detail.component.ts - 773 + 776 src/app/components/manage/management-list/management-list.component.ts @@ -5904,35 +5904,35 @@ Do you really want to delete document ""? src/app/components/document-detail/document-detail.component.ts - 774 + 777 The files for this document will be deleted permanently. This operation cannot be undone. src/app/components/document-detail/document-detail.component.ts - 775 + 778 Delete document src/app/components/document-detail/document-detail.component.ts - 777 + 780 Error deleting document src/app/components/document-detail/document-detail.component.ts - 796 + 799 Redo OCR confirm src/app/components/document-detail/document-detail.component.ts - 816 + 819 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -5943,63 +5943,63 @@ This operation will permanently redo OCR for this document. src/app/components/document-detail/document-detail.component.ts - 817 + 820 Redo OCR operation will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 828 + 831 Error executing operation src/app/components/document-detail/document-detail.component.ts - 839 + 842 Page Fit src/app/components/document-detail/document-detail.component.ts - 908 + 911 Split confirm src/app/components/document-detail/document-detail.component.ts - 1111 + 1112 This operation will split the selected document(s) into new documents. src/app/components/document-detail/document-detail.component.ts - 1112 + 1113 Split operation will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1127 + 1128 Error executing split operation src/app/components/document-detail/document-detail.component.ts - 1136 + 1137 Rotate confirm src/app/components/document-detail/document-detail.component.ts - 1148 + 1149 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6010,49 +6010,49 @@ This operation will permanently rotate the original version of the current document. src/app/components/document-detail/document-detail.component.ts - 1149 + 1150 Rotation will begin in the background. Close and re-open the document after the operation has completed to see the changes. src/app/components/document-detail/document-detail.component.ts - 1165 + 1166 Error executing rotate operation src/app/components/document-detail/document-detail.component.ts - 1177 + 1178 Delete pages confirm src/app/components/document-detail/document-detail.component.ts - 1189 + 1190 This operation will permanently delete the selected pages from the original document. src/app/components/document-detail/document-detail.component.ts - 1190 + 1191 Delete pages operation will begin in the background. Close and re-open or reload this document after the operation has completed to see the changes. src/app/components/document-detail/document-detail.component.ts - 1205 + 1206 Error executing delete pages operation src/app/components/document-detail/document-detail.component.ts - 1214 + 1215 @@ -7070,28 +7070,28 @@ correspondent src/app/components/manage/correspondent-list/correspondent-list.component.ts - 39 + 40 correspondents src/app/components/manage/correspondent-list/correspondent-list.component.ts - 40 + 41 Last used src/app/components/manage/correspondent-list/correspondent-list.component.ts - 45 + 46 Do you really want to delete the correspondent ""? src/app/components/manage/correspondent-list/correspondent-list.component.ts - 67 + 88 From ce3d5b006574d8a0cbd451df5882e19602f603a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 07:04:01 +0000 Subject: [PATCH 30/51] Chore(deps-dev): Bump the development group across 1 directory with 2 updates (#6851) * Chore(deps-dev): Bump the development group across 1 directory with 2 updates Bumps the development group with 2 updates in the / directory: [ruff](https://github.com/astral-sh/ruff) and [mkdocs-material](https://github.com/squidfunk/mkdocs-material). Updates `ruff` from 0.4.4 to 0.4.6 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/v0.4.4...v0.4.6) Updates `mkdocs-material` from 9.5.24 to 9.5.25 - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.24...9.5.25) --- updated-dependencies: - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development - dependency-name: mkdocs-material dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development ... Signed-off-by: dependabot[bot] * Updates hook versions to match * New codespell fixes * Remove unneeded i18n --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Trenton H <797416+stumpylog@users.noreply.github.com> Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> --- .codespellrc | 2 +- .pre-commit-config.yaml | 4 +- CODE_OF_CONDUCT.md | 2 +- Pipfile.lock | 117 +++++++++--------- src-ui/messages.xlf | 50 ++++---- .../admin/config/config.component.html | 2 +- src/paperless_tesseract/parsers.py | 2 +- 7 files changed, 89 insertions(+), 90 deletions(-) diff --git a/.codespellrc b/.codespellrc index 5e7cb2b2e..9b2cf624d 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,3 +1,3 @@ [codespell] write-changes = True -ignore-words-list = criterias,afterall,valeu,ureue,equest,ure +ignore-words-list = criterias,afterall,valeu,ureue,equest,ure,assertIn diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 87780b056..026344a2e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: - id: check-case-conflict - id: detect-private-key - repo: https://github.com/codespell-project/codespell - rev: v2.2.6 + rev: v2.3.0 hooks: - id: codespell exclude: "(^src-ui/src/locale/)|(^src-ui/e2e/)|(^src/paperless_mail/tests/samples/)" @@ -47,7 +47,7 @@ repos: exclude: "(^Pipfile\\.lock$)" # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.4.4' + rev: 'v0.4.6' hooks: - id: ruff - id: ruff-format diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index a0c3bb8ee..5debd43b3 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -5,7 +5,7 @@ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, +identity and expression, level of experience, education, socioeconomic status, nationality, personal appearance, race, religion, or sexual identity and orientation. diff --git a/Pipfile.lock b/Pipfile.lock index c99c57fae..6232585de 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -3064,12 +3064,12 @@ }, "mkdocs-material": { "hashes": [ - "sha256:02d5aaba0ee755e707c3ef6e748f9acb7b3011187c0ea766db31af8905078a34", - "sha256:e12cd75954c535b61e716f359cf2a5056bf4514889d17161fdebd5df4b0153c6" + "sha256:68fdab047a0b9bfbefe79ce267e8a7daaf5128bcf7867065fcd201ee335fece1", + "sha256:d0662561efb725b712207e0ee01f035ca15633f29a64628e24f01ec99d7078f4" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==9.5.24" + "version": "==9.5.25" }, "mkdocs-material-extensions": { "hashes": [ @@ -3568,35 +3568,35 @@ }, "requests": { "hashes": [ - "sha256:21ac9465cdf8c1650fe1ecde8a71669a93d4e6f147550483a2967d08396a56a5", - "sha256:eb97e87e64c79e64e5b8ac75cee9dd1f97f49e289b083ee6be96268930725685" + "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289", + "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c" ], "markers": "python_version >= '3.8'", - "version": "==2.32.1" + "version": "==2.32.2" }, "ruff": { "hashes": [ - "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768", - "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6", - "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6", - "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae", - "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15", - "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab", - "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef", - "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95", - "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e", - "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595", - "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36", - "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85", - "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd", - "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891", - "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9", - "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876", - "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af" + "sha256:04a80acfc862e0e1630c8b738e70dcca03f350bad9e106968a8108379e12b31f", + "sha256:0cf5cc02d3ae52dfb0c8a946eb7a1d6ffe4d91846ffc8ce388baa8f627e3bd50", + "sha256:1fa8561489fadf483ffbb091ea94b9c39a00ed63efacd426aae2f197a45e67fc", + "sha256:1ff930d6e05f444090a0139e4e13e1e2e1f02bd51bb4547734823c760c621e79", + "sha256:3a6a0a4f4b5f54fff7c860010ab3dd81425445e37d35701a965c0248819dde7a", + "sha256:3f9ced5cbb7510fd7525448eeb204e0a22cabb6e99a3cb160272262817d49786", + "sha256:4d5b914818d8047270308fe3e85d9d7f4a31ec86c6475c9f418fbd1624d198e0", + "sha256:4f02284335c766678778475e7698b7ab83abaf2f9ff0554a07b6f28df3b5c259", + "sha256:602ebd7ad909eab6e7da65d3c091547781bb06f5f826974a53dbe563d357e53c", + "sha256:735a16407a1a8f58e4c5b913ad6102722e80b562dd17acb88887685ff6f20cf6", + "sha256:9018bf59b3aa8ad4fba2b1dc0299a6e4e60a4c3bc62bbeaea222679865453062", + "sha256:a769ae07ac74ff1a019d6bd529426427c3e30d75bdf1e08bb3d46ac8f417326a", + "sha256:a797a87da50603f71e6d0765282098245aca6e3b94b7c17473115167d8dfb0b7", + "sha256:be47700ecb004dfa3fd4dcdddf7322d4e632de3c06cd05329d69c45c0280e618", + "sha256:ea3424793c29906407e3cf417f28fc33f689dacbbadfb52b7e9a809dd535dcef", + "sha256:ef995583a038cd4a7edf1422c9e19118e2511b8ba0b015861b4abd26ec5367c5", + "sha256:f13410aabd3b5776f9c5699f42b37a3a348d65498c4310589bc6e5c548dc8a2f" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.4.4" + "version": "==0.4.6" }, "scipy": { "hashes": [ @@ -3721,46 +3721,49 @@ }, "watchdog": { "hashes": [ - "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257", - "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca", - "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b", - "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85", - "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b", - "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19", - "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50", - "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92", - "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269", - "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f", - "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c", - "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b", - "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87", - "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b", - "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b", - "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8", - "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c", - "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3", - "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7", - "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605", - "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935", - "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b", - "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927", - "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101", - "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07", - "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec", - "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4", - "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245", - "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d" + "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7", + "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767", + "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175", + "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459", + "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5", + "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429", + "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6", + "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d", + "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7", + "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28", + "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235", + "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57", + "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a", + "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5", + "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709", + "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee", + "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84", + "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd", + "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba", + "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db", + "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682", + "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35", + "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d", + "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645", + "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253", + "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193", + "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b", + "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44", + "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b", + "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625", + "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e", + "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5" ], "markers": "python_version >= '3.8'", - "version": "==4.0.0" + "version": "==4.0.1" }, "zipp": { "hashes": [ - "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059", - "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e" + "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee", + "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec" ], "markers": "python_version >= '3.8'", - "version": "==3.18.2" + "version": "==3.19.0" }, "zope-interface": { "hashes": [ diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 36563485c..edec5cef0 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -503,33 +503,6 @@ 4 - - - - src/app/components/admin/config/config.component.html - 14,15 - - - src/app/components/common/custom-field-display/custom-field-display.component.html - 32 - - - src/app/components/common/input/drag-drop-select/drag-drop-select.component.html - 12 - - - src/app/components/common/input/tags/tags.component.html - 4 - - - src/app/components/common/permissions-select/permissions-select.component.html - 22 - - - src/app/components/document-history/document-history.component.html - 35 - - Read the documentation about this setting @@ -3045,6 +3018,29 @@ 62 + + + + src/app/components/common/custom-field-display/custom-field-display.component.html + 32 + + + src/app/components/common/input/drag-drop-select/drag-drop-select.component.html + 12 + + + src/app/components/common/input/tags/tags.component.html + 4 + + + src/app/components/common/permissions-select/permissions-select.component.html + 22 + + + src/app/components/document-history/document-history.component.html + 35 + + Search fields diff --git a/src-ui/src/app/components/admin/config/config.component.html b/src-ui/src/app/components/admin/config/config.component.html index 03ca04b7b..0f74339fb 100644 --- a/src-ui/src/app/components/admin/config/config.component.html +++ b/src-ui/src/app/components/admin/config/config.component.html @@ -11,7 +11,7 @@
+
+ + +