diff --git a/apps/dafa-web/src/app/pages/participants/components/participants-list/participants-list.component.ts b/apps/dafa-web/src/app/pages/participants/components/participants-list/participants-list.component.ts index 44cd6a7..addd00f 100644 --- a/apps/dafa-web/src/app/pages/participants/components/participants-list/participants-list.component.ts +++ b/apps/dafa-web/src/app/pages/participants/components/participants-list/participants-list.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Participant } from '@dafa-models/participant.model'; import { SortBy } from '@dafa-models/sort-by.model'; import { ParticipantsService } from '@dafa-services/api/participants.service'; @@ -12,10 +12,11 @@ import { ParticipantsService } from '@dafa-services/api/participants.service'; export class ParticipantsListComponent { @Input() participants: Participant[]; @Input() sortBy: SortBy | null; + @Output() sorted = new EventEmitter(); constructor(private participantsService: ParticipantsService) {} handleSort(key: keyof Participant): void { - this.participantsService.setSortKey(key); + this.sorted.emit(key); } } diff --git a/apps/dafa-web/src/app/pages/participants/participants.component.html b/apps/dafa-web/src/app/pages/participants/participants.component.html index 6c0ac12..a9da538 100644 --- a/apps/dafa-web/src/app/pages/participants/participants.component.html +++ b/apps/dafa-web/src/app/pages/participants/participants.component.html @@ -17,9 +17,17 @@ + + diff --git a/apps/dafa-web/src/app/pages/participants/participants.component.ts b/apps/dafa-web/src/app/pages/participants/participants.component.ts index c495a54..d070f09 100644 --- a/apps/dafa-web/src/app/pages/participants/participants.component.ts +++ b/apps/dafa-web/src/app/pages/participants/participants.component.ts @@ -12,8 +12,10 @@ import { BehaviorSubject, Observable } from 'rxjs'; }) export class ParticipantsComponent { private _searchValue$ = new BehaviorSubject(''); - participants$: Observable = this.participantsService.participants$; - sortBy$: Observable = this.participantsService.sortBy$; + activeParticipants$: Observable = this.participantsService.activeParticipants$; + followUpParticipants$: Observable = this.participantsService.followUpParticipants$; + activeParticipantsSortBy$: Observable = this.participantsService.activeParticipantsSortBy$; + followUpParticipantsSortBy$: Observable = this.participantsService.followUpParticipantsSortBy$; constructor(private participantsService: ParticipantsService) {} @@ -28,4 +30,12 @@ export class ParticipantsComponent { handleSearchInput($event: CustomEvent): void { this._searchValue$.next($event.detail.target.value); } + + handleActiveParticipantsSort(key: keyof Participant): void { + this.participantsService.setActiveParticipantsSortKey(key); + } + + handleFollowUpParticipantsSort(key: keyof Participant): void { + this.participantsService.setFollowUpParticipantsSortKey(key); + } } diff --git a/apps/dafa-web/src/app/services/api/participants.service.ts b/apps/dafa-web/src/app/services/api/participants.service.ts index 5626aa9..002e5b9 100644 --- a/apps/dafa-web/src/app/services/api/participants.service.ts +++ b/apps/dafa-web/src/app/services/api/participants.service.ts @@ -3,14 +3,24 @@ import { Injectable } from '@angular/core'; import { environment } from '@dafa-environment'; import { Participant } from '@dafa-models/participant.model'; import { SortBy } from '@dafa-models/sort-by.model'; +import { sort } from '@dafa-utils/sort.util'; import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +function filterParticipants(participants: Participant[], searchFilter: string): Participant[] { + return participants.filter(participant => { + const searchValueExistsInName = participant.fullName.toLowerCase().includes(searchFilter.toLowerCase()); + const searchValueExistsInErrandNumber = participant.errandNumber.toString().includes(searchFilter); + + return searchValueExistsInName || searchValueExistsInErrandNumber; + }); +} + @Injectable({ providedIn: 'root', }) export class ParticipantsService { - private _participants$: Observable = this.httpClient + private _allParticipants$: Observable = this.httpClient .get(`${environment.apiBase}/participants`) .pipe( map(participants => @@ -20,34 +30,33 @@ export class ParticipantsService { })) ) ); - private _sortBy$ = new BehaviorSubject({ key: 'handleBefore', reverse: false }); - public sortBy$: Observable = this._sortBy$.asObservable(); + private _activeParticipantsSortBy$ = new BehaviorSubject({ key: 'handleBefore', reverse: false }); + public activeParticipantsSortBy$: Observable = this._activeParticipantsSortBy$.asObservable(); + private _followUpParticipantsSortBy$ = new BehaviorSubject({ key: 'handleBefore', reverse: false }); + public followUpParticipantsSortBy$: Observable = this._followUpParticipantsSortBy$.asObservable(); private _searchFilter$ = new BehaviorSubject(''); public searchFilter$: Observable = this._searchFilter$.asObservable(); - public participants$: Observable = combineLatest([ - this._sortBy$, - this._participants$, + public filteredParticipants$: Observable = combineLatest([ + this._allParticipants$, this._searchFilter$, + ]).pipe(map(([participants, searchFilter]) => filterParticipants(participants, searchFilter))); + + public activeParticipants$: Observable = combineLatest([ + this.filteredParticipants$, + this._activeParticipantsSortBy$, ]).pipe( - map(([sortBy, participants, searchFilter]) => { - const filteredParticipants = participants.filter(participant => { - const searchValueExistsInName = participant.fullName.toLowerCase().includes(searchFilter.toLowerCase()); - const searchValueExistsInErrandNumber = participant.errandNumber.toString().includes(searchFilter); + map(([participants, sortBy]) => { + return sortBy ? sort(participants, sortBy) : participants; + }) + ); - return searchValueExistsInName || searchValueExistsInErrandNumber; - }); - - if (sortBy) { - const reverse = sortBy.reverse ? -1 : 1; - return [...filteredParticipants].sort((a, b) => { - const first = a[sortBy.key]; - const second = b[sortBy.key]; - - return reverse * (+(first > second) - +(second > first)); - }); - } - return participants; + public followUpParticipants$: Observable = combineLatest([ + this.filteredParticipants$, + this._followUpParticipantsSortBy$, + ]).pipe( + map(([participants, sortBy]) => { + return sortBy ? sort(participants, sortBy) : participants; }) ); @@ -55,15 +64,16 @@ export class ParticipantsService { this._searchFilter$.next(value); } - public setSortKey(key: keyof Participant) { - const currentSortBy = this._sortBy$.getValue(); - let reverse = false; + public setActiveParticipantsSortKey(key: keyof Participant) { + const currentSortBy = this._activeParticipantsSortBy$.getValue(); + const reverse = currentSortBy?.key === key ? !currentSortBy.reverse : false; + this._activeParticipantsSortBy$.next({ key, reverse }); + } - if (currentSortBy?.key === key) { - reverse = !currentSortBy.reverse; - } - - this._sortBy$.next({ key, reverse }); + public setFollowUpParticipantsSortKey(key: keyof Participant) { + const currentSortBy = this._followUpParticipantsSortBy$.getValue(); + const reverse = currentSortBy?.key === key ? !currentSortBy.reverse : false; + this._followUpParticipantsSortBy$.next({ key, reverse }); } constructor(private httpClient: HttpClient) {} diff --git a/apps/dafa-web/src/app/utils/sort.util.ts b/apps/dafa-web/src/app/utils/sort.util.ts new file mode 100644 index 0000000..6cb5bc4 --- /dev/null +++ b/apps/dafa-web/src/app/utils/sort.util.ts @@ -0,0 +1,12 @@ +import { SortBy } from '@dafa-models/sort-by.model'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function sort(data: any[], sortBy: SortBy): any[] { + const reverse = sortBy.reverse ? -1 : 1; + return [...data].sort((a, b) => { + const first = a[sortBy.key]; + const second = b[sortBy.key]; + + return reverse * (+(first > second) - +(second > first)); + }); +}