From 3fe3dda3a1cce8cc5b70e3cadb597c2d06efb970 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:26:47 -0700 Subject: [PATCH] Chore: update ng-select to v24, handle breaking changes (#13951) --- src-ui/e2e/backend.py | 11 ++++++ .../e2e/document-list/document-list.spec.ts | 38 +++++++++++++++++++ src-ui/package.json | 2 +- src-ui/pnpm-lock.yaml | 12 +++--- ...ustom-fields-query-dropdown.component.html | 9 +++-- .../custom-fields-query-dropdown.component.ts | 13 +++++++ .../dates-dropdown.component.html | 4 +- .../dates-dropdown.component.ts | 5 +++ .../document-link.component.html | 1 + .../document-link/document-link.component.ts | 6 +++ .../common/input/tags/tags.component.scss | 8 ++-- ...permissions-filter-dropdown.component.html | 8 +++- ...permissions-filter-dropdown.component.scss | 15 ++++++++ ...missions-filter-dropdown.component.spec.ts | 15 ++++++++ .../permissions-filter-dropdown.component.ts | 11 ++++++ src-ui/src/styles.scss | 27 +++++++------ src-ui/src/theme.scss | 4 +- 17 files changed, 160 insertions(+), 29 deletions(-) diff --git a/src-ui/e2e/backend.py b/src-ui/e2e/backend.py index 693c713ed..e706b0f8a 100644 --- a/src-ui/e2e/backend.py +++ b/src-ui/e2e/backend.py @@ -48,6 +48,7 @@ def seed_database() -> None: from django.utils import timezone from documents.models import Correspondent + from documents.models import CustomField from documents.models import Document from documents.models import DocumentType from documents.models import Note @@ -81,6 +82,16 @@ def seed_database() -> None: path="e2e/{created_year}/{title}", owner=admin, ) + CustomField.objects.create( + name="Test Select Field", + data_type=CustomField.FieldDataType.SELECT, + extra_data={ + "select_options": [ + {"id": "abc123", "label": "Alpha"}, + {"id": "def456", "label": "Beta"}, + ], + }, + ) today = timezone.localdate() documents = [] diff --git a/src-ui/e2e/document-list/document-list.spec.ts b/src-ui/e2e/document-list/document-list.spec.ts index 45a0c1976..5365b4826 100644 --- a/src-ui/e2e/document-list/document-list.spec.ts +++ b/src-ui/e2e/document-list/document-list.spec.ts @@ -207,3 +207,41 @@ test('bulk edit', async ({ page }) => { await page.getByRole('button', { name: 'Confirm' }).click() await bulkEditPromise }) + +test('permissions dropdown stays open when selecting a user', async ({ + page, +}) => { + await page.goto('/documents') + await page.getByRole('button', { name: 'Permissions' }).click() + const dropdown = page.locator( + 'pngx-permissions-filter-dropdown .dropdown-menu' + ) + await expect(dropdown).toBeVisible() + await dropdown.locator('ng-select').click() + await page.getByRole('option', { name: 'playwright' }).click() + await expect(dropdown).toBeVisible() + await expect(dropdown.locator('.ng-value-label')).toHaveText('playwright') +}) + +test('custom fields query dropdown stays open when building a query', async ({ + page, +}) => { + await page.goto('/documents') + await page.getByRole('button', { name: 'Custom fields' }).click() + const dropdown = page.locator( + 'pngx-custom-fields-query-dropdown .dropdown-menu' + ) + await expect(dropdown).toBeVisible() + + // field picker + await dropdown.locator('ng-select').first().click() + await page.getByRole('option', { name: 'Test Select Field' }).click() + await expect(dropdown).toBeVisible() + + // value picker, shown once the operator takes a list of options + await dropdown.locator('select').first().selectOption({ label: 'In' }) + await dropdown.locator('ng-select').last().click() + await page.getByRole('option', { name: 'Alpha' }).click() + await expect(dropdown).toBeVisible() + await expect(dropdown.locator('.ng-value-label').last()).toHaveText('Alpha') +}) diff --git a/src-ui/package.json b/src-ui/package.json index 1e48d0456..3486583c3 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -24,7 +24,7 @@ "@angular/platform-browser": "~22.1.3", "@angular/router": "~22.1.3", "@ng-bootstrap/ng-bootstrap": "^21.0.0", - "@ng-select/ng-select": "~23.6.0", + "@ng-select/ng-select": "~24.0.2", "@ngneat/dirty-check-forms": "^3.0.3", "@popperjs/core": "^2.11.8", "bootstrap": "^5.3.8", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 115263417..2acb64294 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: ^21.0.0 version: 21.0.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/localize@22.1.3(@angular/compiler-cli@22.1.3(@angular/compiler@22.1.3)(typescript@6.0.3))(@angular/compiler@22.1.3))(@popperjs/core@2.11.8)(rxjs@7.8.2) '@ng-select/ng-select': - specifier: ~23.6.0 - version: 23.6.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2)) + specifier: ~24.0.2 + version: 24.0.2(@angular/cdk@22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2)) '@ngneat/dirty-check-forms': specifier: ^3.0.3 version: 3.0.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(lodash-es@4.18.1)(rxjs@7.8.2) @@ -1490,10 +1490,11 @@ packages: '@popperjs/core': ^2.11.8 rxjs: ^6.5.3 || ^7.4.0 - '@ng-select/ng-select@23.6.0': - resolution: {integrity: sha512-0I84OZ9gncphNR26zuqOwpB/XWhPav+IP+EfJd9lDNeu3UT9Y0JhTBburCXEXcbltwQkiN6bMCKdRF93hrFHxw==} + '@ng-select/ng-select@24.0.2': + resolution: {integrity: sha512-EcOQanLp5dNxkDOxK75z7+B3gZW8LvQofzwL5AgWUn04EkJOXRI7Wi6Ylp7+jIAi9yPsTwjznrRd+wSl9EZGAQ==} engines: {node: ^22.12.0 || ^24.0.0 || ^26.0.0} peerDependencies: + '@angular/cdk': ^22.0.0 '@angular/common': ^22.0.0 '@angular/core': ^22.0.0 '@angular/forms': ^22.0.0 @@ -5769,8 +5770,9 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@ng-select/ng-select@23.6.0(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))': + '@ng-select/ng-select@24.0.2(@angular/cdk@22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/forms@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2))': dependencies: + '@angular/cdk': 22.1.4(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/common': 22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/core': 22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2) '@angular/forms': 22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(@angular/platform-browser@22.1.3(@angular/common@22.1.3(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.1.3(@angular/compiler@22.1.3)(rxjs@7.8.2)))(rxjs@7.8.2) diff --git a/src-ui/src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html b/src-ui/src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html index ceec0269e..2c1431a13 100644 --- a/src-ui/src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html +++ b/src-ui/src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html @@ -6,7 +6,7 @@ } -
+
@@ -64,10 +64,11 @@ [disabled]="disabled" [virtualScroll]="getSelectOptionsForField(atom.field)?.length > 100" [searchFn]="selectOptionSearchFn" + [appendTo]="selectAppendTo" (mousedown)="$event.stopImmediatePropagation()" > } @else if (getCustomFieldByID(atom.field)?.data_type === CustomFieldDataType.DocumentLink) { - + } @else if (getCustomFieldByID(atom.field)?.data_type === CustomFieldDataType.Monetary) {