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
-
+
Name
-
|
Date
-
|
@@ -56,13 +48,13 @@ Holidays
|
-
- @if ((holiday$ | async)?.length === 0) {
+
+ @if ((listService.records$ | async)?.length === 0) {
No matching records found
|
}
- @for (member of holiday$ | async; track $index) {
+ @for (member of listService.records$ | async; track $index) {
{{ 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);
+ }
+}