diff --git a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html index 742af4c11c..80054796cf 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html +++ b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.html @@ -172,6 +172,16 @@

{{ 'Candidates' | translate }}

@if (assignment?.candidates?.length) {
+
+ + +
{ let component: AssignmentDetailComponent; @@ -21,4 +23,34 @@ xdescribe(`AssignmentDetailComponent`, () => { it(`should create`, () => { expect(component).toBeTruthy(); }); + + describe('candidate sorting', () => { + let candidates: ViewAssignmentCandidate[]; + let onSortingChangeSpy: jasmine.Spy; + + beforeEach(() => { + candidates = [ + {user: {first_name: 'Karl', last_name: 'Marx'}, id: 1} as ViewAssignmentCandidate, + {user: {first_name: 'Rosa', last_name: 'Luxemburg'}, id: 2} as ViewAssignmentCandidate, + {user: {first_name: 'Kurt', last_name: 'Eisner'}, id: 3} as ViewAssignmentCandidate, + {user: {first_name: 'Clara', last_name: 'Zetkin'}, id: 4} as ViewAssignmentCandidate + ]; + (component as any)._assignmentCandidates = candidates; + onSortingChangeSpy = spyOn(component, 'onSortingChange').and.returnValue(Promise.resolve()); + }); + + it('should sort candidates by first name', async () => { + await component.sortCandidatesByFirstName(); + const sortedCandidates = onSortingChangeSpy.calls.mostRecent().args[0]; + expect(sortedCandidates.map((c: ViewAssignmentCandidate) => c.user.first_name)).toEqual(['Clara', 'Karl', 'Karl', 'Kurt', 'Rosa']); + expect(sortedCandidates.map((c: ViewAssignmentCandidate) => c.user.last_name)).toEqual(['Zetkin', 'Liebknecht', 'Marx', 'Eisner', 'Luxemburg']); + }); + + it('should sort candidates by last name', async () => { + await component.sortCandidatesByLastName(); + const sortedCandidates = onSortingChangeSpy.calls.mostRecent().args[0]; + expect(sortedCandidates.map((c: ViewAssignmentCandidate) => c.user.last_name)).toEqual(['Eisner', 'Liebknecht', 'Luxemburg', 'Marx', 'Zetkin']); + expect(sortedCandidates.map((c: ViewAssignmentCandidate) => c.user.first_name)).toEqual(['Kurt', 'Karl', 'Rosa', 'Karl', 'Clara']); + }); + }); }); diff --git a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts index 031105702b..d4a94bf8e2 100644 --- a/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts +++ b/client/src/app/site/pages/meetings/pages/assignments/pages/assignment-detail/components/assignment-detail/assignment-detail.component.ts @@ -432,6 +432,29 @@ export class AssignmentDetailComponent extends BaseMeetingComponent implements O this.itemRepo.removeFromAgenda(this.assignment.agenda_item_id!); } + /** + * Sorts the assignment candidates by their last name in ascending order. + * Calls onSortingChange with the sorted array. + */ + public async sortCandidatesByLastName(): Promise { + const sorted = [...this.assignmentCandidates].sort((a, b) => + a.user?.last_name?.localeCompare(b.user?.last_name ?? '') ?? 0 + ); + await this.onSortingChange(sorted); + } + + /** + * Sorts the assignment candidates by their first name in ascending order. + * Calls onSortingChange with the sorted array. + */ + public async sortCandidatesByFirstName(): Promise { + const sorted = [...this.assignmentCandidates].sort((a, b) => + a.user?.first_name?.localeCompare(b.user?.first_name ?? '') ?? 0 + ); + await this.onSortingChange(sorted); + } + + public override ngOnDestroy(): void { super.ngOnDestroy(); if (this._navigationSubscription) { @@ -457,6 +480,6 @@ export class AssignmentDetailComponent extends BaseMeetingComponent implements O } public goToHistory(): void { - this.router.navigate([this.activeMeetingId!, `history`], { queryParams: { fqid: this.assignment.fqid } }); + this.router.navigate([this.activeMeetingId!, `history`], {queryParams: {fqid: this.assignment.fqid}}); } }