From c3db681249cc5339245db561643111bb1b5d61a3 Mon Sep 17 00:00:00 2001 From: amrmahdyy Date: Fri, 23 Aug 2024 21:18:49 -0400 Subject: [PATCH] refactored holiday list --- .../holiday-list/holiday-list.component.html | 55 ++------- .../holiday-list/holiday-list.component.ts | 106 ++++-------------- .../holiday-list/holiday-list.service.ts | 38 +++++++ 3 files changed, 71 insertions(+), 128 deletions(-) create mode 100644 src/angular/hq/src/app/holiday/holiday-list/holiday-list.service.ts diff --git a/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.html b/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.html index 897db692..4105d1a6 100644 --- a/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.html +++ b/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.html @@ -4,35 +4,27 @@

Holidays

 
- +
+ +
- + - - @if ((holiday$ | async)?.length === 0) { + + @if ((listService.records$ | async)?.length === 0) { } - @for (member of holiday$ | async; track $index) { + @for (member of listService.records$ | async; track $index) { } -
Name - Date - @@ -56,13 +48,13 @@

Holidays

No matching records found

{{ member.name }} @@ -90,31 +82,4 @@

No matching records found

-
-
- - items per page -
- -
- {{ skipDisplay$ | async }}-{{ takeToDisplay$ | async }} / - {{ totalRecords$ | async }} items -
-
+ diff --git a/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.ts b/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.ts index a4ada5a1..e672a10b 100644 --- a/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.ts +++ b/src/angular/hq/src/app/holiday/holiday-list/holiday-list.component.ts @@ -2,28 +2,18 @@ import { SortColumn } from './../../models/holiday/get-holiday-v1'; import { Component } from '@angular/core'; import { FormControl, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, RouterLink } from '@angular/router'; -import { - startWith, - combineLatest, - map, - tap, - debounceTime, - switchMap, - shareReplay, - BehaviorSubject, -} from 'rxjs'; -import { Observable } from 'rxjs'; -import { ClientDetailsServiceToReplace } from '../../clients/client-details.service'; + import { SortDirection } from '../../models/common/sort-direction'; import { HQService } from '../../services/hq.service'; import { CommonModule } from '@angular/common'; -import { ClientDetailsSearchFilterComponent } from '../../clients/client-details/client-details-search-filter/client-details-search-filter.component'; import { PaginatorComponent } from '../../common/paginator/paginator.component'; import { SortIconComponent } from '../../common/sort-icon/sort-icon.component'; -import { GetHolidayV1Record } from '../../models/holiday/get-holiday-v1'; import { HQRole } from '../../enums/hqrole'; import { InRolePipe } from '../../pipes/in-role.pipe'; import { Jurisdiciton } from '../../enums/jurisdiciton'; +import { CoreModule } from '../../core/core.module'; +import { HolidayListService } from './holiday-list.service'; +import { BaseListService } from '../../core/services/base-list.service'; @Component({ selector: 'hq-holiday-list', @@ -34,20 +24,22 @@ import { Jurisdiciton } from '../../enums/jurisdiciton'; ReactiveFormsModule, PaginatorComponent, SortIconComponent, - ClientDetailsSearchFilterComponent, RouterLink, InRolePipe, + CoreModule, + ], + providers: [ + { + provide: BaseListService, + useExisting: HolidayListService, + }, ], templateUrl: './holiday-list.component.html', }) export class HolidayListComponent { apiErrors: string[] = []; - holiday$: Observable; - skipDisplay$: Observable; - takeToDisplay$: Observable; - totalRecords$: Observable; - sortOption$: BehaviorSubject; - sortDirection$: BehaviorSubject; + sortOption = SortColumn; + sortDirection$ = SortDirection; Jurisdiction = Jurisdiciton; itemsPerPage = new FormControl(20, { nonNullable: true }); @@ -60,77 +52,25 @@ export class HolidayListComponent { constructor( private hqService: HQService, private route: ActivatedRoute, - private clientDetailService: ClientDetailsServiceToReplace, - ) { - const itemsPerPage$ = this.itemsPerPage.valueChanges.pipe( - startWith(this.itemsPerPage.value), - ); - this.sortOption$ = new BehaviorSubject(SortColumn.Name); - this.sortDirection$ = new BehaviorSubject(SortDirection.Asc); - const page$ = this.page.valueChanges.pipe(startWith(this.page.value)); - - const skip$ = combineLatest([itemsPerPage$, page$]).pipe( - map(([itemsPerPage, page]) => (page - 1) * itemsPerPage), - startWith(0), - ); - const search$ = clientDetailService.search.valueChanges.pipe( - tap(() => this.goToPage(1)), - startWith(clientDetailService.search.value), - ); - - this.skipDisplay$ = skip$.pipe(map((skip) => skip + 1)); - - const request$ = combineLatest({ - search: search$, - skip: skip$, - take: itemsPerPage$, - sortBy: this.sortOption$, - sortDirection: this.sortDirection$, - }); - - const response$ = request$.pipe( - debounceTime(500), - switchMap((request) => this.hqService.getHolidayV1(request)), - shareReplay({ bufferSize: 1, refCount: false }), - ); - - this.holiday$ = response$.pipe( - map((response) => { - return response.records; - }), - ); - - this.totalRecords$ = response$.pipe(map((t) => t.total!)); - - this.takeToDisplay$ = combineLatest([ - skip$, - itemsPerPage$, - this.totalRecords$, - ]).pipe( - map(([skip, itemsPerPage, totalRecords]) => - Math.min(skip + itemsPerPage, totalRecords), - ), - ); - - this.clientDetailService.resetFilters(); - this.clientDetailService.hideProjectStatus(); - } + public listService: HolidayListService, + ) {} goToPage(page: number) { - this.page.setValue(page); + this.listService.page.setValue(page); } onSortClick(sortColumn: SortColumn) { - if (this.sortOption$.value == sortColumn) { - this.sortDirection$.next( - this.sortDirection$.value == SortDirection.Asc + if (this.listService.sortOption$.value == sortColumn) { + this.listService.sortDirection$.next( + this.listService.sortDirection$.value == SortDirection.Asc ? SortDirection.Desc : SortDirection.Asc, ); } else { - this.sortOption$.next(sortColumn); - this.sortDirection$.next(SortDirection.Asc); + this.listService.sortOption$.next(sortColumn); + this.listService.sortDirection$.next(SortDirection.Asc); } - this.page.setValue(1); + + this.listService.page.setValue(1); } } diff --git a/src/angular/hq/src/app/holiday/holiday-list/holiday-list.service.ts b/src/angular/hq/src/app/holiday/holiday-list/holiday-list.service.ts new file mode 100644 index 00000000..ab2dc6d0 --- /dev/null +++ b/src/angular/hq/src/app/holiday/holiday-list/holiday-list.service.ts @@ -0,0 +1,38 @@ +import { Observable, combineLatest, debounceTime, tap, switchMap } from 'rxjs'; +import { BaseListService } from '../../core/services/base-list.service'; +import { SortDirection } from '../../models/common/sort-direction'; +import { + GetHolidayV1Record, + GetHolidayV1Response, + SortColumn, +} from '../../models/holiday/get-holiday-v1'; +import { HQService } from '../../services/hq.service'; +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class HolidayListService extends BaseListService< + GetHolidayV1Response, + GetHolidayV1Record, + SortColumn +> { + protected override getResponse(): Observable { + return combineLatest({ + search: this.search$, + skip: this.skip$, + take: this.itemsPerPage$, + sortBy: this.sortOption$, + sortDirection: this.sortDirection$, + }).pipe( + debounceTime(500), + tap(() => this.loadingSubject.next(true)), + switchMap((request) => this.hqService.getHolidayV1(request)), + tap(() => this.loadingSubject.next(false)), + ); + } + + constructor(private hqService: HQService) { + super(SortColumn.Name, SortDirection.Asc); + } +}