Files
cbsnexora/src/app/clients/clients-view/address-tab/address-tab.component.ts
T
Felix van Hove 7fd1486c08 Upgrading to Angular 20:
Replaced checked in package-lock.json by regenerated one.
Ran ng update @angular/core@20 @angular/cli@20
Ran npm install @angular-builders/jest@^20.0.0 @fortawesome/angular-fontawesome@^3.0.0 @swimlane/ngx-graph@^11
Ran npm install ngx-mat-select-search@^8.0.2.
Ran ng update @angular/material@20.
Updated all eslint and typescript to the latest versions.
Removed @angular-devkit/schematics.
Updated fontawesome.
Updated rxjs and tslib.
Moved required node version from 16 to 20.
Updated jest-preset-angular.
Set preserveWhitespaces to false.
Corrected two type declarations in two typescript files to make ng serve run without errors.
Removed unused angular-devkit/schematics from view-user.component.ts .
Updated list of supported browsers.
Upgraded prettier.
Ran prettier . --write the first time.
Ran prettier . --write the second time.
Ran ng generate @angular/core:inject with defaults, excepted a handful of files.
Fixed remaining eslint problems.
Added dist directory to ignores in eslint.config.js.
Let prettier fix formatting, almost everything is just line breaks.
Made htmlhint ignore @if and @for Angular constructs.
Updated node version in Github workflow to 22.12.0 (build.yml).
Updated .env.ts.
Updated Angular datetime format strings from YYYY-MM-DD to yyyy-MM-dd.
Merged changes from dev into angular20 branch.
2025-12-08 11:01:01 +01:00

313 lines
10 KiB
TypeScript

/** Angular Imports */
import { Component, inject } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute } from '@angular/router';
import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
import { InputBase } from 'app/shared/form-dialog/formfield/model/input-base';
import { SelectBase } from 'app/shared/form-dialog/formfield/model/select-base';
/** Custom Components */
import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component';
/** Custom Services */
import { TranslateService } from '@ngx-translate/core';
import { ClientsService } from '../../clients.service';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import {
MatAccordion,
MatExpansionPanel,
MatExpansionPanelHeader,
MatExpansionPanelTitle,
MatExpansionPanelDescription
} from '@angular/material/expansion';
import { MatDivider } from '@angular/material/divider';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
/**
* Clients Address Tab Component
*/
@Component({
selector: 'mifosx-address-tab',
templateUrl: './address-tab.component.html',
styleUrls: ['./address-tab.component.scss'],
imports: [
...STANDALONE_SHARED_IMPORTS,
FaIconComponent,
MatAccordion,
MatExpansionPanel,
MatExpansionPanelHeader,
MatExpansionPanelTitle,
MatExpansionPanelDescription,
MatDivider,
MatSlideToggle
]
})
export class AddressTabComponent {
private route = inject(ActivatedRoute);
private clientService = inject(ClientsService);
private dialog = inject(MatDialog);
private translateService = inject(TranslateService);
/** Client Address Data */
clientAddressData: any;
/** Client Address Field Config */
clientAddressFieldConfig: any;
/** Client Address Template */
clientAddressTemplate: any;
/** Client Id */
clientId: string;
/**
* @param {ActivatedRoute} route Activated Route
* @param {ClientsService} clientService Clients Service
* @param {MatDialog} dialog Mat Dialog
* @param {TranslateService} translateService Translate Service.
*/
constructor() {
this.route.data.subscribe(
(data: { clientAddressData: any; clientAddressFieldConfig: any; clientAddressTemplateData: any }) => {
this.clientAddressData = data.clientAddressData;
this.clientAddressFieldConfig = data.clientAddressFieldConfig;
this.clientAddressTemplate = data.clientAddressTemplateData;
this.clientId = this.route.parent.snapshot.paramMap.get('clientId');
}
);
}
/**
* Adds a client address.
*/
addAddress() {
const data = {
title:
this.translateService.instant('labels.buttons.Add') +
' ' +
this.translateService.instant('labels.catalogs.Client') +
' ' +
this.translateService.instant('labels.heading.Address'),
formfields: this.getAddressFormFields('add')
};
const addAddressDialogRef = this.dialog.open(FormDialogComponent, { data });
addAddressDialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
this.clientService
.createClientAddress(this.clientId, response.data.value.addressType, response.data.value)
.subscribe((res: any) => {
const addressData = response.data.value;
addressData.addressId = res.resourceId;
addressData.addressType = this.getSelectedValue('addressTypeIdOptions', addressData.addressType).name;
addressData.isActive = false;
this.clientAddressData.push(addressData);
});
}
});
}
/**
* Edits an existing address.
* @param {any} address Client address
* @param {number} index address index
*/
editAddress(address: any, index: number) {
const data = {
title:
this.translateService.instant('labels.buttons.Edit') +
' ' +
this.translateService.instant('labels.catalogs.Client') +
' ' +
this.translateService.instant('labels.heading.Address'),
formfields: this.getAddressFormFields('edit', address),
layout: { addButtonText: 'Edit' }
};
const editAddressDialogRef = this.dialog.open(FormDialogComponent, { data });
editAddressDialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
const addressData = response.data.value;
addressData.addressId = address.addressId;
addressData.isActive = address.isActive;
this.clientService
.editClientAddress(this.clientId, address.addressTypeId, addressData)
.subscribe((res: any) => {
addressData.addressTypeId = address.addressTypeId;
addressData.addressType = address.addressType;
this.clientAddressData[index] = addressData;
});
}
});
}
/**
* Toggles address activity.
* @param {any} address Client Address
*/
toggleAddress(address: any) {
const addressData = {
addressId: address.addressId,
isActive: address.isActive ? false : true
};
this.clientService.editClientAddress(this.clientId, address.addressTypeId, addressData).subscribe(() => {
address.isActive = address.isActive ? false : true;
});
}
/**
* Checks if field is enabled in address config.
* @param {any} fieldName Field Name
*/
isFieldEnabled(fieldName: any) {
return this.clientAddressFieldConfig.find((fieldObj: any) => fieldObj.field === fieldName)?.isEnabled;
}
/**
* Find Pipe doesn't work with accordian
* @param {any} fieldName Field Name
* @param {any} fieldId Field Id
*/
getSelectedValue(fieldName: any, fieldId: any) {
return this.clientAddressTemplate[fieldName].find((fieldObj: any) => fieldObj.id === fieldId);
}
/**
* Returns address form fields for form dialog.
* @param {string} formType Form Type
* @param {any} address Address
*/
getAddressFormFields(formType?: string, address?: any) {
let formfields: FormfieldBase[] = [];
for (let index = 0; index < this.clientAddressTemplate.addressTypeIdOptions.length; index++) {
this.clientAddressTemplate.addressTypeIdOptions[index].name = this.translateService.instant(
`labels.catalogs.${this.clientAddressTemplate.addressTypeIdOptions[index].name}`
);
}
if (formType === 'add') {
formfields.push(
this.isFieldEnabled('addressType')
? new SelectBase({
controlName: 'addressType',
label: this.translateService.instant('labels.inputs.Address Type'),
value: address ? address.addressType : '',
options: { label: 'name', value: 'id', data: this.clientAddressTemplate.addressTypeIdOptions },
order: 1
})
: null
);
}
formfields.push(
this.isFieldEnabled('street')
? new InputBase({
controlName: 'street',
label: this.translateService.instant('labels.inputs.Street'),
value: address ? address.street : '',
type: 'text',
required: false,
order: 2
})
: null
);
formfields.push(
this.isFieldEnabled('addressLine1')
? new InputBase({
controlName: 'addressLine1',
label: this.translateService.instant('labels.inputs.Address Line') + ' 1',
value: address ? address.addressLine1 : '',
type: 'text',
order: 3
})
: null
);
formfields.push(
this.isFieldEnabled('addressLine2')
? new InputBase({
controlName: 'addressLine2',
label: this.translateService.instant('labels.inputs.Address Line') + ' 2',
value: address ? address.addressLine2 : '',
type: 'text',
order: 4
})
: null
);
formfields.push(
this.isFieldEnabled('addressLine3')
? new InputBase({
controlName: 'addressLine3',
label: this.translateService.instant('labels.inputs.Address Line') + ' 3',
value: address ? address.addressLine3 : '',
type: 'text',
order: 5
})
: null
);
formfields.push(
this.isFieldEnabled('townVillage')
? new InputBase({
controlName: 'townVillage',
label: this.translateService.instant('labels.inputs.Town / Village'),
value: address ? address.townVillage : '',
type: 'text',
order: 6
})
: null
);
formfields.push(
this.isFieldEnabled('city')
? new InputBase({
controlName: 'city',
label: this.translateService.instant('labels.inputs.City'),
value: address ? address.city : '',
type: 'text',
order: 7
})
: null
);
formfields.push(
this.isFieldEnabled('stateProvinceId')
? new SelectBase({
controlName: 'stateProvinceId',
label: this.translateService.instant('labels.inputs.State / Province'),
value: address ? address.stateProvinceId : '',
options: { label: 'name', value: 'id', data: this.clientAddressTemplate.stateProvinceIdOptions },
order: 8
})
: null
);
formfields.push(
this.isFieldEnabled('countyDistrict')
? new InputBase({
controlName: 'countryDistrict',
label: this.translateService.instant('labels.inputs.State / Province'),
value: address ? address.countyDistrict : '',
type: 'text',
order: 11
})
: null
);
formfields.push(
this.isFieldEnabled('countryId')
? new SelectBase({
controlName: 'countryId',
label: this.translateService.instant('labels.inputs.Country'),
value: address ? address.countryId : '',
options: { label: 'name', value: 'id', data: this.clientAddressTemplate.countryIdOptions },
order: 10
})
: null
);
formfields.push(
this.isFieldEnabled('postalCode')
? new InputBase({
controlName: 'postalCode',
label: this.translateService.instant('labels.inputs.Postal Code'),
value: address ? address.postalCode : '',
type: 'text',
order: 11
})
: null
);
formfields = formfields.filter((field) => field !== null);
return formfields;
}
}