From a0f698c31f53f3ec8811f5cb97f206ce4d041d86 Mon Sep 17 00:00:00 2001 From: Cyril Joseph Date: Thu, 6 Nov 2025 22:40:36 -0400 Subject: [PATCH] manage fee and region updates --- src/app/app.routes.ts | 6 +- .../secured-header.component.html | 1 + .../{service-provider => fees}/basic-fee.ts | 0 .../{service-provider => fees}/cargo-rate.ts | 0 .../{service-provider => fees}/carnet-fee.ts | 0 .../continuation-sheet-fee.ts | 0 .../counterfoil-fee.ts | 0 .../expedited-fee.ts | 0 .../security-deposit.ts | 0 .../basic-fee.service.ts | 2 +- .../cargo-rate.service.ts | 2 +- .../carnet-fee.service.ts | 2 +- .../continuation-sheet-fee.service.ts | 2 +- .../counterfoil-fee.service.ts | 2 +- .../expedited-fee.service.ts | 2 +- .../security-deposit.service.ts | 2 +- .../basic-fee/basic-fee.component.html | 0 .../basic-fee/basic-fee.component.scss | 0 .../basic-fee/basic-fee.component.ts | 23 +-- .../cargo-rate/cargo-rate.component.html | 0 .../cargo-rate/cargo-rate.component.scss | 0 .../cargo-rate/cargo-rate.component.ts | 12 +- .../carnet-fee/carnet-fee.component.html | 0 .../carnet-fee/carnet-fee.component.scss | 0 .../carnet-fee/carnet-fee.component.ts | 11 +- .../continuation-sheet-fee.component.html | 0 .../continuation-sheet-fee.component.scss | 0 .../continuation-sheet-fee.component.ts | 11 +- .../counterfoil-fee.component.html | 0 .../counterfoil-fee.component.scss | 0 .../counterfoil-fee.component.ts | 13 +- .../expedited-fee.component.html | 0 .../expedited-fee.component.scss | 0 .../expedited-fee/expedited-fee.component.ts | 11 +- src/app/fees/manage/manage-fee.component.html | 62 ++++++++ src/app/fees/manage/manage-fee.component.scss | 18 +++ src/app/fees/manage/manage-fee.component.ts | 35 +++++ .../security-deposit.component.html | 0 .../security-deposit.component.scss | 0 .../security-deposit.component.ts | 11 +- src/app/region/region.component.html | 2 + src/app/region/region.component.scss | 6 + src/app/region/region.component.ts | 7 +- .../add/add-service-provider.component.html | 4 +- .../add/add-service-provider.component.ts | 16 +-- .../carnet-sequence.component.ts | 7 +- .../contacts/contacts.component.ts | 7 +- .../edit/edit-service-provider.component.html | 2 +- .../edit/edit-service-provider.component.ts | 16 +-- .../region/region.component.html | 55 ++++++++ .../region/region.component.scss | 90 ++++++++++++ .../region/region.component.ts | 133 ++++++++++++++++++ 52 files changed, 473 insertions(+), 100 deletions(-) rename src/app/core/models/{service-provider => fees}/basic-fee.ts (100%) rename src/app/core/models/{service-provider => fees}/cargo-rate.ts (100%) rename src/app/core/models/{service-provider => fees}/carnet-fee.ts (100%) rename src/app/core/models/{service-provider => fees}/continuation-sheet-fee.ts (100%) rename src/app/core/models/{service-provider => fees}/counterfoil-fee.ts (100%) rename src/app/core/models/{service-provider => fees}/expedited-fee.ts (100%) rename src/app/core/models/{service-provider => fees}/security-deposit.ts (100%) rename src/app/core/services/{service-provider => fees}/basic-fee.service.ts (97%) rename src/app/core/services/{service-provider => fees}/cargo-rate.service.ts (96%) rename src/app/core/services/{service-provider => fees}/carnet-fee.service.ts (96%) rename src/app/core/services/{service-provider => fees}/continuation-sheet-fee.service.ts (96%) rename src/app/core/services/{service-provider => fees}/counterfoil-fee.service.ts (96%) rename src/app/core/services/{service-provider => fees}/expedited-fee.service.ts (97%) rename src/app/core/services/{service-provider => fees}/security-deposit.service.ts (96%) rename src/app/{service-provider => fees}/basic-fee/basic-fee.component.html (100%) rename src/app/{service-provider => fees}/basic-fee/basic-fee.component.scss (100%) rename src/app/{service-provider => fees}/basic-fee/basic-fee.component.ts (94%) rename src/app/{service-provider => fees}/cargo-rate/cargo-rate.component.html (100%) rename src/app/{service-provider => fees}/cargo-rate/cargo-rate.component.scss (100%) rename src/app/{service-provider => fees}/cargo-rate/cargo-rate.component.ts (96%) rename src/app/{service-provider => fees}/carnet-fee/carnet-fee.component.html (100%) rename src/app/{service-provider => fees}/carnet-fee/carnet-fee.component.scss (100%) rename src/app/{service-provider => fees}/carnet-fee/carnet-fee.component.ts (96%) rename src/app/{service-provider => fees}/continuation-sheet-fee/continuation-sheet-fee.component.html (100%) rename src/app/{service-provider => fees}/continuation-sheet-fee/continuation-sheet-fee.component.scss (100%) rename src/app/{service-provider => fees}/continuation-sheet-fee/continuation-sheet-fee.component.ts (97%) rename src/app/{service-provider => fees}/counterfoil-fee/counterfoil-fee.component.html (100%) rename src/app/{service-provider => fees}/counterfoil-fee/counterfoil-fee.component.scss (100%) rename src/app/{service-provider => fees}/counterfoil-fee/counterfoil-fee.component.ts (96%) rename src/app/{service-provider => fees}/expedited-fee/expedited-fee.component.html (100%) rename src/app/{service-provider => fees}/expedited-fee/expedited-fee.component.scss (100%) rename src/app/{service-provider => fees}/expedited-fee/expedited-fee.component.ts (97%) create mode 100644 src/app/fees/manage/manage-fee.component.html create mode 100644 src/app/fees/manage/manage-fee.component.scss create mode 100644 src/app/fees/manage/manage-fee.component.ts rename src/app/{service-provider => fees}/security-deposit/security-deposit.component.html (100%) rename src/app/{service-provider => fees}/security-deposit/security-deposit.component.scss (100%) rename src/app/{service-provider => fees}/security-deposit/security-deposit.component.ts (96%) create mode 100644 src/app/service-provider/region/region.component.html create mode 100644 src/app/service-provider/region/region.component.scss create mode 100644 src/app/service-provider/region/region.component.ts diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 762f8c5..248cfe9 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -12,14 +12,16 @@ import { ParamTableComponent } from './param/table/param-table.component'; import { ManageTableRecordComponent } from './param/manage-table-record/manage-table-record.component'; import { ManageParamRecordComponent } from './param/manage-param-record/manage-param-record.component'; import { RegionComponent } from './region/region.component'; +import { ManageFeeComponent } from './fees/manage/manage-fee.component'; export const routes: Routes = [ { path: 'login', component: LoginComponent }, { path: 'register', component: RegisterComponent }, { path: 'forgot-password', component: ForgotPasswordComponent }, - { path: 'table-record', component: ManageTableRecordComponent }, - { path: 'param-record/:id', component: ManageParamRecordComponent }, + { path: 'table-record', component: ManageTableRecordComponent, canActivate: [AuthGuard] }, + { path: 'param-record/:id', component: ManageParamRecordComponent, canActivate: [AuthGuard] }, { path: 'region', component: RegionComponent, canActivate: [AuthGuard] }, + { path: 'fees', component: ManageFeeComponent, canActivate: [AuthGuard] }, { path: 'usersettings', component: UserSettingsComponent, canActivate: [AuthGuard] }, { path: 'home', component: HomeComponent, canActivate: [AuthGuard] }, { path: 'service-provider/:id', component: EditServiceProviderComponent, canActivate: [AuthGuard] }, diff --git a/src/app/common/secured-header/secured-header.component.html b/src/app/common/secured-header/secured-header.component.html index 0845bca..8dd5c3f 100644 --- a/src/app/common/secured-header/secured-header.component.html +++ b/src/app/common/secured-header/secured-header.component.html @@ -10,6 +10,7 @@ +
+ +
+ + + + + Carnet Fee & Commission Setup + + + + + + + Basic Fee Setup + + + + + + + Counterfoil Setup + + + + + + + Continuation Sheet Fee Setup + + + + + + + Expedited Fee Setup + + + + + + + Security Deposit + + + + + + + Cargo Rate Setup + + + + + \ No newline at end of file diff --git a/src/app/fees/manage/manage-fee.component.scss b/src/app/fees/manage/manage-fee.component.scss new file mode 100644 index 0000000..9fe2740 --- /dev/null +++ b/src/app/fees/manage/manage-fee.component.scss @@ -0,0 +1,18 @@ +.page-header { + margin: 0.5rem 0px; + color: var(--mat-sys-primary); + font-weight: 500; +} + +.manage-fees-action-buttons { + padding-bottom: 20px; +} + +.manage-fees-headers-align .mat-expansion-panel-header-description { + justify-content: space-between; + align-items: center; +} + +.manage-fees-headers-align .mat-mdc-form-field+.mat-mdc-form-field { + margin-left: 8px; +} \ No newline at end of file diff --git a/src/app/fees/manage/manage-fee.component.ts b/src/app/fees/manage/manage-fee.component.ts new file mode 100644 index 0000000..58e7547 --- /dev/null +++ b/src/app/fees/manage/manage-fee.component.ts @@ -0,0 +1,35 @@ +import { afterNextRender, Component, viewChild } from '@angular/core'; +import { AngularMaterialModule } from '../../shared/module/angular-material.module'; +import { MatAccordion } from '@angular/material/expansion'; +import { CarnetFeeComponent } from "../carnet-fee/carnet-fee.component"; +import { BasicFeeComponent } from "../basic-fee/basic-fee.component"; +import { CounterfoilFeeComponent } from "../counterfoil-fee/counterfoil-fee.component"; +import { ContinuationSheetFeeComponent } from "../continuation-sheet-fee/continuation-sheet-fee.component"; +import { ExpeditedFeeComponent } from "../expedited-fee/expedited-fee.component"; +import { SecurityDepositComponent } from "../security-deposit/security-deposit.component"; +import { UserPreferences } from '../../core/models/user-preference'; +import { CommonModule } from '@angular/common'; +import { UserPreferencesService } from '../../core/services/user-preference.service'; +import { CargoRateComponent } from '../cargo-rate/cargo-rate.component'; + +@Component({ + selector: 'app-manage-fee', + imports: [AngularMaterialModule, CarnetFeeComponent, BasicFeeComponent, CounterfoilFeeComponent, ContinuationSheetFeeComponent, ExpeditedFeeComponent, SecurityDepositComponent, CommonModule, CargoRateComponent], + templateUrl: './manage-fee.component.html', + styleUrl: './manage-fee.component.scss' +}) +export class ManageFeeComponent { + accordion = viewChild.required(MatAccordion); + isEditMode = true; + spid = 0; + serviceProviderName: string | null = null; + userPreferences: UserPreferences; + + constructor(userPrefenceService: UserPreferencesService) { + this.userPreferences = userPrefenceService.getPreferences(); + afterNextRender(() => { + // Open all panels + this.accordion().openAll(); + }); + } +} diff --git a/src/app/service-provider/security-deposit/security-deposit.component.html b/src/app/fees/security-deposit/security-deposit.component.html similarity index 100% rename from src/app/service-provider/security-deposit/security-deposit.component.html rename to src/app/fees/security-deposit/security-deposit.component.html diff --git a/src/app/service-provider/security-deposit/security-deposit.component.scss b/src/app/fees/security-deposit/security-deposit.component.scss similarity index 100% rename from src/app/service-provider/security-deposit/security-deposit.component.scss rename to src/app/fees/security-deposit/security-deposit.component.scss diff --git a/src/app/service-provider/security-deposit/security-deposit.component.ts b/src/app/fees/security-deposit/security-deposit.component.ts similarity index 96% rename from src/app/service-provider/security-deposit/security-deposit.component.ts rename to src/app/fees/security-deposit/security-deposit.component.ts index d7c6c2e..c9d176d 100644 --- a/src/app/service-provider/security-deposit/security-deposit.component.ts +++ b/src/app/fees/security-deposit/security-deposit.component.ts @@ -7,12 +7,12 @@ import { AngularMaterialModule } from '../../shared/module/angular-material.modu import { CommonModule } from '@angular/common'; import { CustomPaginator } from '../../shared/custom-paginator'; import { Country } from '../../core/models/country'; -import { SecurityDeposit } from '../../core/models/service-provider/security-deposit'; +import { SecurityDeposit } from '../../core/models/fees/security-deposit'; import { UserPreferences } from '../../core/models/user-preference'; import { ApiErrorHandlerService } from '../../core/services/common/api-error-handler.service'; import { CommonService } from '../../core/services/common/common.service'; import { NotificationService } from '../../core/services/common/notification.service'; -import { SecurityDepositService } from '../../core/services/service-provider/security-deposit.service'; +import { SecurityDepositService } from '../../core/services/fees/security-deposit.service'; import { finalize } from 'rxjs'; import { HolderType } from '../../core/models/holder-type'; @@ -28,11 +28,8 @@ export class SecurityDepositComponent implements OnInit { set paginator(value: MatPaginator) { this.dataSource.paginator = value; } - - @ViewChild(MatSort, { static: false }) - set sort(value: MatSort) { - this.dataSource.sort = value; - } + + @ViewChild(MatSort) sort!: MatSort; displayedColumns: string[] = ['holderType', 'uscibMember', 'specialCommodity', 'specialCountry', 'rate', 'rateInPercentage', 'effectiveDate', 'actions']; dataSource = new MatTableDataSource(); diff --git a/src/app/region/region.component.html b/src/app/region/region.component.html index 44e7b3a..4a945f5 100644 --- a/src/app/region/region.component.html +++ b/src/app/region/region.component.html @@ -1,4 +1,6 @@
+ +
diff --git a/src/app/service-provider/add/add-service-provider.component.ts b/src/app/service-provider/add/add-service-provider.component.ts index 80ce7e8..4570934 100644 --- a/src/app/service-provider/add/add-service-provider.component.ts +++ b/src/app/service-provider/add/add-service-provider.component.ts @@ -5,16 +5,16 @@ import { AngularMaterialModule } from '../../shared/module/angular-material.modu import { CommonModule } from '@angular/common'; import { ContactsComponent } from '../contacts/contacts.component'; import { CarnetSequenceComponent } from '../carnet-sequence/carnet-sequence.component'; -import { CarnetFeeComponent } from '../carnet-fee/carnet-fee.component'; -import { BasicFeeComponent } from '../basic-fee/basic-fee.component'; -import { CounterfoilFeeComponent } from '../counterfoil-fee/counterfoil-fee.component'; -import { ExpeditedFeeComponent } from '../expedited-fee/expedited-fee.component'; -import { SecurityDepositComponent } from '../security-deposit/security-deposit.component'; -import { ContinuationSheetFeeComponent } from "../continuation-sheet-fee/continuation-sheet-fee.component"; +import { CarnetFeeComponent } from '../../fees/carnet-fee/carnet-fee.component'; +import { BasicFeeComponent } from '../../fees/basic-fee/basic-fee.component'; +import { CounterfoilFeeComponent } from '../../fees/counterfoil-fee/counterfoil-fee.component'; +import { ExpeditedFeeComponent } from '../../fees/expedited-fee/expedited-fee.component'; +import { SecurityDepositComponent } from '../../fees/security-deposit/security-deposit.component'; +import { ContinuationSheetFeeComponent } from "../../fees/continuation-sheet-fee/continuation-sheet-fee.component"; import { UserPreferences } from '../../core/models/user-preference'; import { UserPreferencesService } from '../../core/services/user-preference.service'; -import { CargoRateComponent } from '../cargo-rate/cargo-rate.component'; -import { RegionComponent } from '../../region/region.component'; +import { CargoRateComponent } from '../../fees/cargo-rate/cargo-rate.component'; +import { RegionComponent } from '../region/region.component'; @Component({ selector: 'app-add-service-provider', diff --git a/src/app/service-provider/carnet-sequence/carnet-sequence.component.ts b/src/app/service-provider/carnet-sequence/carnet-sequence.component.ts index 83775e5..ba53509 100644 --- a/src/app/service-provider/carnet-sequence/carnet-sequence.component.ts +++ b/src/app/service-provider/carnet-sequence/carnet-sequence.component.ts @@ -27,11 +27,8 @@ export class CarnetSequenceComponent implements OnInit { set paginator(value: MatPaginator) { this.dataSource.paginator = value; } - - @ViewChild(MatSort, { static: false }) - set sort(value: MatSort) { - this.dataSource.sort = value; - } + + @ViewChild(MatSort) sort!: MatSort; displayedColumns: string[] = ['carnetType', 'region', 'startNumber', 'endNumber', 'lastNumber']; dataSource = new MatTableDataSource(); diff --git a/src/app/service-provider/contacts/contacts.component.ts b/src/app/service-provider/contacts/contacts.component.ts index 8a0857b..c1d5eaf 100644 --- a/src/app/service-provider/contacts/contacts.component.ts +++ b/src/app/service-provider/contacts/contacts.component.ts @@ -29,11 +29,8 @@ export class ContactsComponent implements OnInit { set paginator(value: MatPaginator) { this.dataSource.paginator = value; } - - @ViewChild(MatSort, { static: false }) - set sort(value: MatSort) { - this.dataSource.sort = value; - } + + @ViewChild(MatSort) sort!: MatSort; displayedColumns: string[] = ['firstName', 'lastName', 'title', 'phone', 'email', 'defaultContact', 'actions']; dataSource = new MatTableDataSource(); diff --git a/src/app/service-provider/edit/edit-service-provider.component.html b/src/app/service-provider/edit/edit-service-provider.component.html index 04cd555..f418777 100644 --- a/src/app/service-provider/edit/edit-service-provider.component.html +++ b/src/app/service-provider/edit/edit-service-provider.component.html @@ -24,7 +24,7 @@ Regions - + diff --git a/src/app/service-provider/edit/edit-service-provider.component.ts b/src/app/service-provider/edit/edit-service-provider.component.ts index 4ba3ada..6760aee 100644 --- a/src/app/service-provider/edit/edit-service-provider.component.ts +++ b/src/app/service-provider/edit/edit-service-provider.component.ts @@ -5,17 +5,17 @@ import { BasicDetailsComponent } from '../basic-details/basic-details.component' import { ContactsComponent } from '../contacts/contacts.component'; import { ActivatedRoute } from '@angular/router'; import { CarnetSequenceComponent } from '../carnet-sequence/carnet-sequence.component'; -import { CarnetFeeComponent } from "../carnet-fee/carnet-fee.component"; -import { BasicFeeComponent } from "../basic-fee/basic-fee.component"; -import { CounterfoilFeeComponent } from "../counterfoil-fee/counterfoil-fee.component"; -import { ContinuationSheetFeeComponent } from "../continuation-sheet-fee/continuation-sheet-fee.component"; -import { ExpeditedFeeComponent } from "../expedited-fee/expedited-fee.component"; -import { SecurityDepositComponent } from "../security-deposit/security-deposit.component"; +import { CarnetFeeComponent } from "../../fees/carnet-fee/carnet-fee.component"; +import { BasicFeeComponent } from "../../fees/basic-fee/basic-fee.component"; +import { CounterfoilFeeComponent } from "../../fees/counterfoil-fee/counterfoil-fee.component"; +import { ContinuationSheetFeeComponent } from "../../fees/continuation-sheet-fee/continuation-sheet-fee.component"; +import { ExpeditedFeeComponent } from "../../fees/expedited-fee/expedited-fee.component"; +import { SecurityDepositComponent } from "../../fees/security-deposit/security-deposit.component"; import { UserPreferences } from '../../core/models/user-preference'; import { CommonModule } from '@angular/common'; import { UserPreferencesService } from '../../core/services/user-preference.service'; -import { CargoRateComponent } from '../cargo-rate/cargo-rate.component'; -import { RegionComponent } from '../../region/region.component'; +import { CargoRateComponent } from '../../fees/cargo-rate/cargo-rate.component'; +import { RegionComponent } from '../region/region.component'; @Component({ selector: 'app-edit-service-provider', diff --git a/src/app/service-provider/region/region.component.html b/src/app/service-provider/region/region.component.html new file mode 100644 index 0000000..bfa988d --- /dev/null +++ b/src/app/service-provider/region/region.component.html @@ -0,0 +1,55 @@ +
+
+ +
+
+ +
+

Available Regions

+ + + + {{region.name}} + + +
+ + +
+
+ + +
+
+ + +
+
+

Selected Regions

+ + + {{region.name}} + + + No regions selected + + +
+
+
+ +
+ +
+
\ No newline at end of file diff --git a/src/app/service-provider/region/region.component.scss b/src/app/service-provider/region/region.component.scss new file mode 100644 index 0000000..62b0e64 --- /dev/null +++ b/src/app/service-provider/region/region.component.scss @@ -0,0 +1,90 @@ +.region-container { + padding: 0.75rem 0 0 0; + margin: 0 auto; + + .region-selection-container { + display: flex; + gap: 24px; + margin-bottom: 12px; + // border: 1px solid; + // border-radius: 4px; + // padding: 20px; + + @media (max-width: 768px) { + flex-direction: column; + } + } + + .available-regions, + .selected-regions { + flex: 1; + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 16px; + overflow: hidden; + + h3 { + margin: 0 0 16px 0; + font-size: 0.875rem; + font-weight: 500; + } + + mat-selection-list { + height: 150px; + overflow-y: auto; + padding: 0; + + mat-list-item { + .empty-message { + font-style: italic; + } + } + } + } + + .controls { + display: flex; + flex-direction: column; + gap: 16px; + width: 150px; + padding: 16px; + + .action-buttons { + display: flex; + flex-direction: column; + gap: 8px; + + button { + width: 100%; + display: flex; + // gap: 8px; + align-items: center; + } + + mat-icon { + margin: 0; + } + + button.icon-end { + flex-direction: row-reverse; + } + } + } + + .selected-regions { + display: flex; + flex-direction: column; + gap: 16px; + + .regions { + flex: 1; + } + } + + .form-actions { + display: flex; + justify-content: flex-end; + padding-top: 12px; + border-top: 1px solid #e0e0e0; + } +} \ No newline at end of file diff --git a/src/app/service-provider/region/region.component.ts b/src/app/service-provider/region/region.component.ts new file mode 100644 index 0000000..5a73dc9 --- /dev/null +++ b/src/app/service-provider/region/region.component.ts @@ -0,0 +1,133 @@ +import { Component, EventEmitter, inject, Input, Output } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { finalize, Subject, takeUntil } from 'rxjs'; +import { ApiErrorHandlerService } from '../../core/services/common/api-error-handler.service'; +import { NotificationService } from '../../core/services/common/notification.service'; +import { AngularMaterialModule } from '../../shared/module/angular-material.module'; +import { CommonModule } from '@angular/common'; +import { MatListModule } from '@angular/material/list'; +import { RegionService } from '../../core/services/region/region.service'; +import { Region } from '../../core/models/region/region'; + +@Component({ + selector: 'app-sp-region', + imports: [AngularMaterialModule, ReactiveFormsModule, CommonModule, MatListModule], + templateUrl: './region.component.html', + styleUrl: './region.component.scss' +}) +export class RegionComponent { + @Input() spid: number = 0; + @Input() isEditMode = false; + @Output() hasRegions = new EventEmitter(); + + private destroy$ = new Subject(); + + private notificationService = inject(NotificationService); + private errorHandler = inject(ApiErrorHandlerService); + private regionService = inject(RegionService); + + isLoading = false; + changeInProgress = false; + + regions: Region[] = []; + selectedRegions: Region[] = []; + + // Currently selected region in the listbox + selectedAvailableRegion: Region | null = null; + selectedRegion: Region | null = null; + + constructor() { + } + + ngOnInit(): void { + this.loadRegions(0); + this.loadRegions(this.spid); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + + loadRegions(spid: number): void { + this.isLoading = true; + + this.regionService.getRegions(spid) + .pipe(takeUntil(this.destroy$), finalize(() => { + this.isLoading = false; + })) + .subscribe({ + next: (regions) => { + if (spid === 0) { + this.regions = regions; + } else { + this.selectedRegions = regions; + } + }, + error: (error) => { + console.error('Failed to load regions', error); + } + }); + } + + onAvailableRegionSelection(event: any) { + this.selectedAvailableRegion = event.value; + } + + onRegionSelection(event: any) { + this.selectedRegion = event.value; + } + + // Add selected region + addRegion(): void { + if (!this.selectedAvailableRegion) return; + + const existingIndex = this.selectedRegions.findIndex( + c => c.value === this.selectedAvailableRegion!.value + ); + + if (existingIndex === -1) { + this.selectedRegions.push({ + ...this.selectedAvailableRegion + }); + } + } + + // Remove region + removeRegion(): void { + if (!this.selectedRegion) return; + + this.selectedRegions = this.selectedRegions.filter( + c => c.value !== this.selectedRegion!.value + ); + } + + // Check if a region is already selected + isRegionSelected(region: Region): boolean { + return this.selectedRegions.some(c => c.value === region.value) + } + + onSubmit(): void { + const region: Region = { + id: 0, + value: this.selectedRegions.map(r => r.value).join(','), + name: this.selectedRegions.map(r => r.name).join(',') + }; + + this.changeInProgress = true; + + this.regionService.createRegion(region, this.spid).pipe(finalize(() => { + this.changeInProgress = false; + })).subscribe({ + next: () => { + this.notificationService.showSuccess('Regions saved successfully'); + this.hasRegions.emit(true); + }, + error: (error) => { + let errorMessage = this.errorHandler.handleApiError(error, 'Failed to save regions'); + this.notificationService.showError(errorMessage); + console.error('Error saving region data : ', error); + } + }); + } +}