From 23337a5cc275c8d31105ddb1a44056d49647c225 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 2 Aug 2026 16:54:09 -0700 Subject: [PATCH] Actually at this point lets split the dialogs --- ...-as-versions-confirm-dialog.component.html | 52 +++++++++++++ ...-as-versions-confirm-dialog.component.scss | 3 + ...-versions-confirm-dialog.component.spec.ts | 70 ++++++++++++++++++ ...ge-as-versions-confirm-dialog.component.ts | 73 +++++++++++++++++++ .../merge-confirm-dialog.component.html | 51 +++++-------- .../merge-confirm-dialog.component.spec.ts | 14 ---- .../merge-confirm-dialog.component.ts | 36 +-------- .../bulk-editor/bulk-editor.component.spec.ts | 1 - .../bulk-editor/bulk-editor.component.ts | 7 +- 9 files changed, 226 insertions(+), 81 deletions(-) create mode 100644 src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.html create mode 100644 src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.scss create mode 100644 src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.spec.ts create mode 100644 src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.ts diff --git a/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.html b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.html new file mode 100644 index 000000000..dea378d06 --- /dev/null +++ b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.html @@ -0,0 +1,52 @@ + + + diff --git a/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.scss b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.scss new file mode 100644 index 000000000..c780e5a35 --- /dev/null +++ b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.scss @@ -0,0 +1,3 @@ +.list-group-item { + cursor: move; +} diff --git a/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.spec.ts b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.spec.ts new file mode 100644 index 000000000..6f1f4c7c0 --- /dev/null +++ b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.spec.ts @@ -0,0 +1,70 @@ +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' +import { provideHttpClientTesting } from '@angular/common/http/testing' +import { ComponentFixture, TestBed } from '@angular/core/testing' +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' +import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { of } from 'rxjs' +import { DocumentService } from 'src/app/services/rest/document.service' +import { MergeAsVersionsConfirmDialogComponent } from './merge-as-versions-confirm-dialog.component' + +describe('MergeAsVersionsConfirmDialogComponent', () => { + let component: MergeAsVersionsConfirmDialogComponent + let fixture: ComponentFixture + let documentService: DocumentService + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + NgxBootstrapIconsModule.pick(allIcons), + MergeAsVersionsConfirmDialogComponent, + ], + providers: [ + NgbActiveModal, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting(), + ], + }).compileComponents() + + fixture = TestBed.createComponent(MergeAsVersionsConfirmDialogComponent) + documentService = TestBed.inject(DocumentService) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should fetch selected documents', () => { + const documents = [ + { id: 1, title: 'Document 1' }, + { id: 2, title: 'Document 2' }, + ] + jest.spyOn(documentService, 'getFew').mockReturnValue( + of({ + all: [1, 2], + count: 2, + results: documents, + }) + ) + component.documentIDs.set([1, 2]) + + component.ngOnInit() + + expect(component.documents()).toEqual(documents) + expect(documentService.getFew).toHaveBeenCalledWith([1, 2]) + }) + + it('should exclude the root from the draggable documents', () => { + component.documentIDs.set([1, 2, 3]) + component.rootDocumentID.set(2) + + expect(component.draggableDocumentIDs()).toEqual([1, 3]) + }) + + it('should move draggable documents while keeping the root fixed', () => { + component.documentIDs.set([1, 2, 3]) + component.rootDocumentID.set(1) + + component.onDrop({ previousIndex: 1, currentIndex: 0 } as any) + + expect(component.documentIDs()).toEqual([1, 3, 2]) + expect(component.draggableDocumentIDs()).toEqual([3, 2]) + }) +}) diff --git a/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.ts b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.ts new file mode 100644 index 000000000..8a1632c9b --- /dev/null +++ b/src-ui/src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.ts @@ -0,0 +1,73 @@ +import { + CdkDragDrop, + DragDropModule, + moveItemInArray, +} from '@angular/cdk/drag-drop' +import { AsyncPipe } from '@angular/common' +import { Component, OnInit, computed, inject, signal } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { takeUntil } from 'rxjs' +import { Document } from 'src/app/data/document' +import { CorrespondentNamePipe } from 'src/app/pipes/correspondent-name.pipe' +import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' +import { DocumentService } from 'src/app/services/rest/document.service' +import { ConfirmDialogComponent } from '../confirm-dialog.component' + +@Component({ + selector: 'pngx-merge-as-versions-confirm-dialog', + templateUrl: './merge-as-versions-confirm-dialog.component.html', + styleUrl: './merge-as-versions-confirm-dialog.component.scss', + imports: [ + AsyncPipe, + CorrespondentNamePipe, + CustomDatePipe, + DragDropModule, + FormsModule, + NgxBootstrapIconsModule, + ], +}) +export class MergeAsVersionsConfirmDialogComponent + extends ConfirmDialogComponent + implements OnInit +{ + private documentService = inject(DocumentService) + + readonly documentIDs = signal([]) + readonly documents = signal([]) + readonly rootDocumentID = signal(-1) + readonly draggableDocumentIDs = computed(() => + this.documentIDs().filter( + (documentID) => documentID !== this.rootDocumentID() + ) + ) + + ngOnInit() { + this.documentService + .getFew(this.documentIDs()) + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe((response) => this.documents.set(response.results)) + } + + onDrop(event: CdkDragDrop) { + const draggableDocumentIDs = this.draggableDocumentIDs().concat() + moveItemInArray( + draggableDocumentIDs, + event.previousIndex, + event.currentIndex + ) + + let draggableIndex = 0 + this.documentIDs.update((documentIDs) => + documentIDs.map((documentID) => + documentID === this.rootDocumentID() + ? documentID + : draggableDocumentIDs[draggableIndex++] + ) + ) + } + + getDocument(documentID: number): Document { + return this.documents().find((document) => document.id === documentID) + } +} diff --git a/src-ui/src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html b/src-ui/src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html index 53e50144c..6e6a81d43 100644 --- a/src-ui/src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html +++ b/src-ui/src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html @@ -9,9 +9,9 @@
    - @for (documentID of draggableDocumentIDs(); track documentID) { + @for (documentID of documentIDs(); track documentID) { @let document = getDocument(documentID); @if (document) {
  • @@ -34,36 +34,25 @@ }
- @if (mergeAsVersions) { -
- - + + @for (document of documents(); track document.id) { + + } -
- } @else { -
- - -
-
- - -
-
- - -
- @if (!archiveFallback()) { -

Note that only PDFs will be included.

- } + +
+ + +
+
+ + +
+ @if (!archiveFallback()) { +

Note that only PDFs will be included.

}