@rangertechnologies/fusion-ui 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"rangertechnologies-fusion-ui.mjs","names":["i1","i1","i1","i1","i2.ConfigService","i1.ApiService","i1.GlobalValuesService","i2","i3","i1.GlobalValuesService","i2","i3","i4","i1","i2","i1","i2","i1","i2","i1","i2","i1","i1","i1","i2","i3","i4","i1","i1","i1","i1","i2.AlertService","i1.LoaderService","i2","i3.GlobalValuesService","i4.ApiService","i5","i6.AlertService","i7.ErrorHandlerService","i8.ConfigService","i9.TabDataService","i10","i1","i1.ScrollService","i2","i3.GlobalValuesService","i4.ApiService","i5.AlertService","i6.ErrorHandlerService","i7.LoaderService","i8","i9","i11","i12","i2.ApiService","i3","i4.LoaderService","i5","i1.ToastService","i2","i1","i7","i1.AlertService","i2"],"sources":["../../src/lib/pipes/custom-translate.pipe.ts","../../src/lib/components/fusion-button/fusion-button.component.ts","../../src/lib/components/fusion-button/fusion-button.component.html","../../src/lib/pipes/search-filter/search-filter.pipe.ts","../../src/lib/services/config.service.ts","../../src/lib/services/api.service.ts","../../src/lib/services/global-values.service.ts","../../src/lib/components/search-filter/search-filter.component.ts","../../src/lib/components/search-filter/search-filter.component.html","../../src/lib/components/multi-checkbox/multi-checkbox.component.ts","../../src/lib/components/multi-checkbox/multi-checkbox.component.html","../../src/lib/components/drop-down/drop-down.component.ts","../../src/lib/components/drop-down/drop-down.component.html","../../src/lib/components/multiple-filter/multiple-filter.component.ts","../../src/lib/components/multiple-filter/multiple-filter.component.html","../../src/lib/components/pagination/pagination.component.ts","../../src/lib/components/pagination/pagination.component.html","../../src/lib/components/popover/popover.component.ts","../../src/lib/components/popover/popover.component.html","../../src/lib/components/modal/modal.component.ts","../../src/lib/components/modal/modal.component.html","../../src/lib/components/file-upload/file-upload.component.ts","../../src/lib/components/file-upload/file-upload.component.html","../../src/lib/models/Constants.ts","../../src/lib/components/side-screen/side-screen.component.ts","../../src/lib/components/side-screen/side-screen.component.html","../../src/lib/components/side-screen/common-screen/common-screen.component.ts","../../src/lib/components/side-screen/common-screen/common-screen.component.html","../../src/lib/components/side-screen/approval-screen/approval-screen.component.ts","../../src/lib/components/side-screen/approval-screen/approval-screen.component.html","../../src/lib/components/browse/browse.component.ts","../../src/lib/services/loading.service.ts","../../src/lib/services/alert.service.ts","../../src/lib/services/error-handler.service.ts","../../src/lib/services/tab-data.service.ts","../../src/lib/components/forms/forms.component.ts","../../src/lib/components/forms/forms.component.html","../../src/lib/pipes/get-value.pipe.ts","../../src/lib/pipes/data-table/edit-column-check.pipe.ts","../../src/lib/pipes/data-table/edit-column-type.pipe.ts","../../src/lib/pipes/data-table/edit-column-dropdown.pipe.ts","../../src/lib/pipes/data-table/total-colum-sum.pipe.ts","../../src/lib/shared/custom-paginator-intl.ts","../../src/lib/pipes/custom-date.pipe.ts","../../src/lib/pipes/custom-time.pipe.ts","../../src/lib/services/scroll.service.ts","../../src/lib/components/data-table/data-table.component.ts","../../src/lib/components/data-table/data-table.component.html","../../src/lib/components/fusion-card/fusion-card.component.ts","../../src/lib/components/fusion-card/fusion-card.component.html","../../src/lib/components/toast/toast.tokens.ts","../../src/lib/components/toast/toast.service.ts","../../src/lib/components/toast/toast.component.ts","../../src/lib/components/toast/toast.component.html","../../src/lib/components/multi-select-dropdown/multi-select-dropdown.component.ts","../../src/lib/components/multi-select-dropdown/multi-select-dropdown.component.html","../../src/lib/components/alert/alert.component.ts","../../src/lib/components/alert/alert.component.html","../../src/lib/services/pdf-font.service.ts","../../src/lib/pipes/amount-to-words.pipe.ts"],"sourcesContent":["// MR 02NOV26 CustomTranslatePipe for Payroll MFE\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Pipe({\n name: 'customTranslate',\n standalone: true\n})\nexport class CustomTranslatePipe implements PipeTransform {\n constructor(private translate: TranslateService) {}\n\n transform(key: string, defaultTranslation: string = ''): string {\n if (!key) return defaultTranslation;\n const translated = this.translate?.instant ? this.translate.instant(key) : null;\n return translated && translated !== key ? translated : (defaultTranslation || key);\n }\n}\n\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n@Component({\n selector: 'app-fusion-button',\n standalone: true,\n imports: [CommonModule,AngularSvgIconModule, CustomTranslatePipe],\n templateUrl: './fusion-button.component.html',\n styleUrls: ['./fusion-button.component.css']\n})\nexport class FusionButtonComponent implements OnInit {\n \n @Input() buttonValue: string = ''; //SKS24JAN25 button text \n @Input() buttonValuePath: string = ''; //SK04SEP25\n @Input() buttonType: string = 'primary'; //SKS24JAN25 If the button type is 'text-only', it should display only the text without a border or outline. For 'grey-text', the button should have a border and a background color, but the text color should be gray, similar to 'blue-text'\n @Input() type: string = 'button'; //SKS24JAN25 The button types are \"button,\" \"group,\" and \"dropdown.\"\n @Input() buttonDisable: boolean = false; //SKS24JAN25 use this input to disable a button when needed.\n @Input() fcBtnBgColor: string = ''; // Use this input to set a custom background color for the button.\n @Input() fcBtnBorder: string = ''; // Use this input to set a custom border style for the button.\n @Input() fcBtnTextColor: string = ''; // Use this input to set a custom text color for the button.\n @Input() fcBtnHeight: string = ''; // Use this input to set a custom height for the button.\n @Input() fcBtnWidth: string = ''; // Use this input to set a custom width for the button.\n @Input() fcBtnIconLeftSrc: string = ''; // Use this input to set the source of the left-side icon for the button.\n @Input() fcBtnIconRightSrc: string = ''; // Use this input to set the source of the right-side icon for the button.\n @Input() fcBtnHoverBgColor: string = ''; // Use this input to set the background color of the button on hover.\n @Input() fcBtnHoverTextColor: string = ''; // Use this input to set the text color of the button on hover.\n @Input() fcBtnId: string = 'default'; // Use this input to set a custom ID for the button. Default is 'default'.\n @Input() dataDismiss: string = ''; // Use this input to specify the dismiss action for the button (e.g., 'modal' to close a modal).\n @Input() fcButtonBorder: string = '0px'; // Use this input to set the border size of the button. Default is '0px' for no border.\n @Input() modalToTrigger: string = ''; // Use this input to specify the ID or target of the modal to be triggered.\n @Input() isImageSvg: boolean = false; // Use this input to determine if the image is an SVG. Default is false (non-SVG).\n @Input() tabIndex: any = '';// Use this input to set the tab index for the element, controlling the focus order.\n @Input() buttonConfig: any = ''; // Use this input to pass configuration settings for the group and dropdown buttons (e.g., styles, actions).\n @Input() buttonLoadingSpinner: boolean = false; //SK04SEP25 button loader\n @Output() buttonClickEmit:EventEmitter<any> = new EventEmitter<any>();\n iconSrc: any = ''; // Ensure it's always a string\n isDropdownOpen = false;\n\n \n\n // SKS24JAN25 dropdown button config\n\n // dropdownButton = {\n // fcBtnBgColor: '#007bff',\n // fcBtnBorder: '1px solid #0056b3',\n // fcBtnTextColor: '#ffffff',\n // fcBtnHeight: '40px',\n // fcBtnWidth: '150px',\n // fcBtnHoverBgColor: '#0056b3',\n // fcBtnHoverTextColor: '#ffffff',\n // label: 'Dropdown',\n // iconSrc: '',\n // items: [\n // { label: 'Action 1',iconSrc: '', hover: false },\n // { label: 'Action 2',iconSrc: '', hover: false },\n // { label: 'Action 3',iconSrc: '', hover: false }\n // ]\n // };\n constructor(private elementRef: ElementRef, private cdr: ChangeDetectorRef) { }\n\n ngOnInit(): void {}\n\n // SK04SEP25 loader input changes\n ngOnChanges(change:SimpleChanges): void {\n if(change[\"buttonLoadingSpinner\"]){\n this.buttonLoadingSpinner = change[\"buttonLoadingSpinner\"].currentValue;\n this.cdr.markForCheck();\n }\n }\n //SKS24JAN25 Function to get styles for dropdown and group buttons based on the provided configuration.\n getButtonStyles(config: any): { [key: string]: string } {\n return {\n '--fc-button-custom-bg': config.fcBtnBgColor || '',\n '--fc-button-custom-border': config.fcBtnBorder || '',\n '--fc-button-custom-color': config.fcBtnTextColor || '',\n '--fc-button-custom-height': config.fcBtnHeight || '',\n '--fc-button-custom-width': config.fcBtnWidth || '',\n '--fc-button-hover-bg': config.fcBtnHoverBgColor || '',\n '--fc-button-hover-text-color': config.fcBtnHoverTextColor || ''\n };\n }\n \n\n buttonClicked($event:any){\n this.buttonClickEmit.emit($event);\n if(this.isDropdownOpen){\n this.isDropdownOpen=false\n }\n }\n\n toggleDropdown() {\n this.isDropdownOpen = !this.isDropdownOpen;\n }\n//SKS24JAN25 Listener for clicks outside the dropdown button to close or manage its state.\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent) {\n if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)\n ) {\n this.isDropdownOpen = false;\n }\n }\n}\n","<!-- SKS24JAN25 group button -->\n<div *ngIf=\"type === 'group'\" class=\"btn-group\" role=\"group\" aria-label=\"Button Group\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.fcBtnId !== 'default' ? btn.fcBtnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <div class=\"custom-tooltip\" \n [ngStyle]=\"{\n 'background-color': btn.tooltipBcColor,\n 'color': btn.tooltipColor,\n 'font-size': btn.tooltipFSize\n }\">\n {{ btn.tooltip }}\n <div class=\"tooltip-pointer\" [ngStyle]=\"{'background-color': btn.tooltipBcColor}\"></div>\n </div>\n </button>\n</div>\n \n<!-- SKS24JAN25 single button -->\n<button type=\"button\" *ngIf=\"type !== 'group' && type !== 'dropdown'\" class=\"btn btn-primary fc-button flex {{buttonType}}\" [tabindex]=\"tabIndex\"\n [attr.data-bs-toggle]=\"modalToTrigger != '' ? 'modal' : ''\"\n [attr.data-bs-target]=\"modalToTrigger != '' ? '#'+modalToTrigger : ''\"\n style=\"--fc-button-custom-bg: {{fcBtnBgColor}};--fc-button-custom-border: {{fcBtnBorder}};--fc-button-custom-color: {{fcBtnTextColor}};--fc-button-custom-height: {{fcBtnHeight}};--fc-button-custom-width: {{fcBtnWidth}};--fc-button-hover-bg: {{fcBtnHoverBgColor}};--fc-button-hover-text-color: {{fcBtnHoverTextColor}};\"\n [disabled]=\"buttonDisable || buttonLoadingSpinner\" [attr.data-bs-dismiss]='dataDismiss' (click)=\"buttonClicked($event)\"\n [attr.id]=\"fcBtnId != 'default' ? fcBtnId : null\">\n <img *ngIf=\"fcBtnIconLeftSrc && fcBtnIconLeftSrc != '' && isImageSvg\" src=\"{{fcBtnIconLeftSrc}}\"\n class=\"fc-btn-icon left-icon\">\n <img *ngIf=\"fcBtnIconLeftSrc && fcBtnIconLeftSrc != '' && !isImageSvg\" src=\"{{fcBtnIconLeftSrc}}\" class=\"fc-btn-icon left-icon\">\n <!-- <div class=\"fc-btn-text\">{{buttonValue}}</div> -->\n <img *ngIf=\"fcBtnIconRightSrc && fcBtnIconRightSrc != '' && isImageSvg\" src=\"{{fcBtnIconRightSrc}}\"\n class=\"fc-btn-icon right-icon\">\n <img *ngIf=\"fcBtnIconRightSrc && fcBtnIconRightSrc != '' && !isImageSvg\" src=\"{{fcBtnIconRightSrc}}\" class=\"fc-btn-icon right-icon\">\n <!-- SK04SEP25 loader -->\n <!-- MY 15OCT26 adjust margin spacing on spinner-grow -->\n <div class=\"{{ buttonLoadingSpinner ? 'spinner-grow me-1' : '' }} spinner-grow-sm\" role=\"buttonValue\"\n aria-hidden=\"true\"></div>\n <div style=\"font-size: var(--fs-medium); line-height: normal !important;\">{{ buttonLoadingSpinner ? ('APP_SETTINGS_APPS.LOADING' | customTranslate : 'Loading') + '...' : (buttonValuePath | customTranslate : buttonValue) }}\n </div>\n</button>\n\n<!-- SKS24JAN25 dropdown button -->\n<div *ngIf=\"type === 'dropdown'\" class=\"dropdown\">\n <img src=\"../assets/images/icons/general/others.svg\" class=\"clickable-img\" (click)=\"toggleDropdown()\" />\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.fcBtnId !== 'default' ? btn.fcBtnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 12px;\">{{btn.name}}</div>\n </button>\n </div>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n\n@Pipe({\n name: 'searchFilter',\n standalone: true\n})\nexport class SearchFilterPipe implements PipeTransform {\n\n\n //getting the array datas and search data from pipe element on every change\n transform(items: any[], searchText: string, ele?:any): any[] {\n if (!items) return [];\n if (!searchText) return items;\n return this.searchItems(items, searchText.toLowerCase(), ele);\n }\n // passing that data here, and if the search element included in that array, that element will be returned in new array\n private searchItems(items: any[], searchText: string, ele?:any): any[] {\n let results: any[] = [];\n items.forEach((data: any) => {\n if(ele){\n if (data[ele]?.toLowerCase().includes(searchText)) {\n results.push(data);\n }\n } else {\n if (data?.toLowerCase().includes(searchText)) {\n results.push(data);\n }\n }\n });\n return results;\n }\n}","// MR 09NOV26 Synchronous host contract resolution for apiUrl and appUrl\nimport { Injectable } from \"@angular/core\";\nimport { HttpClient } from \"@angular/common/http\";\nimport { firstValueFrom } from \"rxjs\";\n\nexport interface HostContract {\n version: string;\n apiUrl: string;\n appUrl: string;\n publishedAt: string;\n}\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class ConfigService {\n private config: any;\n private static runtimeConfig: any;\n private readonly defaultApiUrl = \"https://dev-api.rangerfusion.com\";\n private static readonly hostContractGlobal = \"__FUSION_HOST_RUNTIME_CONTRACT__\";\n\n constructor(private http: HttpClient) { }\n\n async loadConfig(): Promise<any> {\n const hostContract = this.getHostContract();\n if (hostContract) {\n this.config = {\n serviceConfig: {\n apiUrl: hostContract.apiUrl,\n API_URL: hostContract.apiUrl,\n appUrl: hostContract.appUrl,\n APP_URL: hostContract.appUrl\n },\n hostContract\n };\n ConfigService.runtimeConfig = this.config;\n return this.config;\n }\n\n try {\n const loadedConfig = await firstValueFrom(this.http.get<any>(\"assets/settings/config.json\"));\n if (loadedConfig?.serviceConfig?.apiUrl || loadedConfig?.serviceConfig?.API_URL) {\n this.config = loadedConfig;\n ConfigService.runtimeConfig = this.config;\n return loadedConfig;\n }\n } catch {\n // Fall through to default\n }\n\n this.config = {\n serviceConfig: {\n apiUrl: this.defaultApiUrl,\n API_URL: this.defaultApiUrl\n }\n };\n ConfigService.runtimeConfig = this.config;\n return this.config;\n }\n\n getConfig(key: any) {\n return this.config?.[key];\n }\n\n getServiceConfig(key: any) {\n return this.config?.serviceConfig?.[key];\n }\n\n static getServiceConfig(key: any) {\n return ConfigService.runtimeConfig?.serviceConfig?.[key];\n }\n\n getApiUrl(): string {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = this.getHostContract();\n if (hostContract?.apiUrl) {\n return hostContract.apiUrl;\n }\n\n // 2. Fallback: Standalone local configuration or default\n return this.config?.serviceConfig?.apiUrl || this.config?.serviceConfig?.API_URL || this.defaultApiUrl;\n }\n\n static getApiUrl(): string | undefined {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = ConfigService.getHostContract();\n if (hostContract?.apiUrl) {\n return hostContract.apiUrl;\n }\n\n // 2. Fallback: Standalone local configuration\n const serviceConfig = ConfigService.runtimeConfig?.serviceConfig;\n return serviceConfig?.API_URL || serviceConfig?.apiUrl;\n }\n\n getAppUrl(): string | undefined {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = this.getHostContract();\n if (hostContract?.appUrl) {\n return hostContract.appUrl;\n }\n\n // 2. Fallback: Standalone local configuration\n return this.config?.serviceConfig?.appUrl || this.config?.serviceConfig?.APP_URL;\n }\n\n static getAppUrl(): string | undefined {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = ConfigService.getHostContract();\n if (hostContract?.appUrl) {\n return hostContract.appUrl;\n }\n\n // 2. Fallback: Standalone local configuration\n const serviceConfig = ConfigService.runtimeConfig?.serviceConfig;\n return serviceConfig?.APP_URL || serviceConfig?.appUrl;\n }\n\n isSplitUserBootstrap(): boolean {\n return Boolean(this.getServiceConfig(\"splitUserBootstrap\"));\n }\n\n static getHostContract(): HostContract | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n const contract = (window as any)[ConfigService.hostContractGlobal];\n return contract?.apiUrl ? contract : null;\n }\n\n getHostContract(): HostContract | null {\n return ConfigService.getHostContract();\n }\n}\n","// MR 02NOV26 API Service for Payroll MFE\nimport { Injectable } from \"@angular/core\";\nimport { HttpClient, HttpParams, HttpHeaders, HttpResponse } from \"@angular/common/http\";\nimport { Observable, firstValueFrom, catchError, throwError, shareReplay } from \"rxjs\";\nimport { ConfigService } from \"./config.service\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class ApiService {\n constructor(private http: HttpClient, private configService: ConfigService) {}\n\n private getUrl(path: string): string {\n const base = this.configService.getApiUrl() || \"\";\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path;\n }\n const cleanPath = path.startsWith(\"/\") ? path : \"/\" + path;\n return `${base}${cleanPath}`;\n }\n\n fetchValue(path: string, params?: any, componentId: string = \"default\"): Observable<any> {\n const url = this.getUrl(path);\n const options: any = {};\n if (params) {\n options.params = params;\n }\n return this.http.get<any>(url, options).pipe(\n shareReplay({ bufferSize: 1, refCount: false }),\n catchError(err => throwError(() => err))\n );\n }\n\n fetchData(url: any, paramsOrComponentId?: any, componentId: string = \"default\"): Observable<any> {\n const targetUrl = this.getUrl(url);\n const options: any = {};\n if (paramsOrComponentId && typeof paramsOrComponentId === \"object\") {\n options.params = paramsOrComponentId;\n }\n return this.http.get<any>(targetUrl, options).pipe(\n shareReplay({ bufferSize: 1, refCount: false }),\n catchError(err => throwError(() => err))\n );\n }\n\n fetchDataAsPromise(url: any, componentId: string = \"default\"): Promise<any> {\n return firstValueFrom(this.fetchData(url, null, componentId));\n }\n\n writeValue(writeType: string, path: string, body?: any, componentId: string = \"default\", customHeaders?: HttpHeaders): Observable<any> {\n const url = this.getUrl(path);\n const options: any = {};\n if (customHeaders) {\n options.headers = customHeaders;\n }\n\n switch (writeType?.toLowerCase()) {\n case \"patch\":\n return this.http.patch<any>(url, body, options).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n case \"put\":\n return this.http.put<any>(url, body, options).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n case \"post\":\n return this.http.post<any>(url, body, options).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n case \"delete\":\n options.body = body;\n return this.http.delete<any>(url, options).pipe(\n catchError(err => throwError(() => err))\n );\n default:\n return throwError(() => new Error(`Unsupported writeType: ${writeType}`));\n }\n }\n\n getCSVTemplates(type: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(\"/template?type=\" + encodeURIComponent(type.trim()));\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n getEsiPFTemplates(type: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(\"/template?type=\" + encodeURIComponent(type.trim()));\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n getXlsx(type: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(type);\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n uploadFiles(endpoint: any, file: FormData, componentId: string = \"default\"): Observable<any> {\n const url = this.getUrl(endpoint);\n return this.http.post<any>(url, file).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n }\n\n uploadDataAsPromise(url: any, file: FormData, componentId: string = \"default\"): Promise<any> {\n return firstValueFrom(this.uploadFiles(url, file, componentId));\n }\n\n getFile(apiPath: string, httpsParams?: HttpParams, componentId: string = \"default\"): Observable<HttpResponse<Blob>> {\n const url = this.getUrl(apiPath);\n return this.http.get(url, { params: httpsParams, observe: \"response\", responseType: \"blob\" });\n }\n\n getAttendance(apiPath: string, month: string, accessor: string, startDate: string, endDate: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(`/template?type=${encodeURIComponent(apiPath.trim())}&month=${encodeURIComponent(month)}&accessor=${encodeURIComponent(accessor)}&startDate=${encodeURIComponent(startDate)}&endDate=${encodeURIComponent(endDate)}`);\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n uploadAttendance(url: any, file: any, accessor: any, month: any, componentId: string = \"default\"): Observable<any> {\n const endpoint = url?.includes(\"?\")\n ? `${url}&accessor=${encodeURIComponent(accessor)}&month=${encodeURIComponent(month)}`\n : `${url}?accessor=${encodeURIComponent(accessor)}&month=${encodeURIComponent(month)}`;\n return this.http.patch(this.getUrl(endpoint), file).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n }\n}\n","// MR 02NOV26 Complete GlobalValuesService for Payroll MFE\nimport { Injectable } from \"@angular/core\";\nimport { Subject, Observable, firstValueFrom } from \"rxjs\";\nimport { ApiService } from \"./api.service\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class GlobalValuesService {\n settingsData: any;\n orgId: any = \"\";\n superUser = false;\n hrmUser = false;\n hrmManager = false;\n empId: any;\n loginName: any;\n loginFirstName: any;\n loginLastName: any;\n fullLoginName: any;\n compFullName: any;\n userId: any;\n allEmployeeData: any;\n allNotificationData: any;\n loggedInUserData: any;\n tokenVariable: any;\n permissions: any;\n localStorageKeys: any;\n notificationCount: number = 0;\n\n laguageChanges$ = new Subject<string>();\n\n private activeBox: any;\n private activeFilter = new Subject<any>();\n activeFilterChange$ = this.activeFilter.asObservable();\n\n private selectedEmp = new Subject<any>();\n selectedEmpChange$ = this.selectedEmp.asObservable();\n\n private selectedEmpSubTab = new Subject<any>();\n selectedEmpSubTabChange$ = this.selectedEmpSubTab.asObservable();\n\n private refreshEmp = new Subject<any>();\n refreshEmp$ = this.refreshEmp.asObservable();\n\n private tablPageParams = new Subject<any>();\n tablPageParamsValue$ = this.tablPageParams.asObservable();\n\n private cachedPayslipTemplate: any = null;\n private payslipTemplateInFlight: Promise<any> | null = null;\n\n constructor(private apiService: ApiService) {\n this.initFromStorage();\n }\n\n private initFromStorage(): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n const rawUser = localStorage.getItem(\"userData\");\n if (rawUser) {\n const parsed = JSON.parse(rawUser);\n this.loggedInUserData = parsed;\n this.orgId = parsed?.companyId || parsed?.orgId || \"\";\n this.empId = parsed?.empId || parsed?.id;\n this.userId = parsed?.userId;\n this.loginName = parsed?.userName || parsed?.loginName;\n }\n const rawSettings = localStorage.getItem(\"settingsData\");\n if (rawSettings) {\n this.settingsData = JSON.parse(rawSettings);\n }\n } catch (e) {\n console.warn(\"[GlobalValuesService] Failed parsing storage data:\", e);\n }\n }\n\n getItem(key: string): string | null {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(key);\n }\n\n setItem(key: string, value: string): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(key, value);\n }\n\n activeFilterBox(data: any): void {\n this.activeBox = data.activeBox;\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(\"activeSearchFilter\", JSON.stringify(data.filterKeys));\n }\n this.activeFilter.next(data);\n }\n\n getActiveFilterBox(): any {\n return this.activeBox;\n }\n\n selectedEmpGet(data: any): void {\n this.selectedEmp.next(data);\n }\n\n selectedEmpSubTabGet(data: any): void {\n this.selectedEmpSubTab.next(data);\n }\n\n triggerRefreshEmp(element: any): void {\n this.refreshEmp.next(element);\n }\n\n setTablePageParams(data: any): void {\n this.tablPageParams.next(data);\n }\n\n getValue(element: any, column: string): any {\n if (!element || !column) return \"\";\n let current = element;\n const flds = column.split(\".\");\n for (const field of flds) {\n if (!current) return \"\";\n const splitFlds = field.split(\"[\");\n if (splitFlds.length === 1) {\n current = current[field] ?? \"\";\n } else {\n const index = Number(splitFlds[1].split(\"]\")[0]);\n current = current[splitFlds[0]]?.[index] ?? \"\";\n }\n }\n return current;\n }\n\n formatKey(value: any): string {\n if (!value || typeof value !== \"string\") return \"\";\n return value.replace(/[\\s-]/g, \"_\").toUpperCase();\n }\n\n async getSettingsAPI(): Promise<any> {\n try {\n const response = await firstValueFrom(this.apiService.fetchValue(\"/settings/finance\"));\n this.settingsData = response;\n this.setItem(\"settingsData\", JSON.stringify(response));\n return response;\n } catch {\n return null;\n }\n }\n\n async getPayslipTemplateAPI(): Promise<any> {\n try {\n if (this.cachedPayslipTemplate !== null && this.cachedPayslipTemplate !== undefined) {\n return this.cachedPayslipTemplate;\n }\n if (this.payslipTemplateInFlight) {\n return await this.payslipTemplateInFlight;\n }\n this.payslipTemplateInFlight = (async () => {\n const data: any = await this.apiService.fetchDataAsPromise(\"/user/payslipTemplate\");\n const template = data?.payslipTemplate !== undefined ? data.payslipTemplate : data;\n this.cachedPayslipTemplate = template;\n return template;\n })();\n const result = await this.payslipTemplateInFlight;\n this.payslipTemplateInFlight = null;\n return result;\n } catch (error) {\n this.payslipTemplateInFlight = null;\n console.error(\"Failed to fetch payslip template from /user/payslipTemplate\", error);\n return null;\n }\n }\n\n invalidatePayslipTemplate(): void {\n this.cachedPayslipTemplate = null;\n }\n\n filterObjectKeys(arrayOfObjects: any[], keys: string[]): any[] {\n let filteredObjects: any[] = [];\n if (!Array.isArray(arrayOfObjects)) return filteredObjects;\n arrayOfObjects.forEach((obj: any) =>\n filteredObjects.push(\n keys.reduce((acc: any, key: any) => {\n if (obj && Object.prototype.hasOwnProperty.call(obj, key)) {\n acc[key] = obj[key];\n }\n return acc;\n }, {})\n )\n );\n return filteredObjects;\n }\n\n convertToCsv2(objArray: any[], fields: any): string {\n if (!Array.isArray(objArray) || !Array.isArray(fields)) return \"\";\n let filterteData: any[] = [];\n objArray.forEach((element) => {\n let objs: any = {};\n fields.forEach((key: any) => {\n if (!Object.keys(element).includes(key)) {\n element[key] = \"-\";\n } else {\n objs[key] = this.getValue(element, key);\n }\n });\n filterteData.push(objs);\n });\n\n const selectedObjectsForCSV = this.filterObjectKeys(objArray, fields);\n const array = typeof selectedObjectsForCSV !== \"object\" ? JSON.parse(selectedObjectsForCSV) : selectedObjectsForCSV;\n let str = \"\";\n let header: any = {};\n fields.forEach((head: any) => {\n header[head] = head;\n });\n array.unshift(header);\n for (let i = 0; i < array.length; i++) {\n let line = \"\";\n for (const index in array[i]) {\n if (line !== \"\") {\n line += \",\";\n }\n if (typeof array[i][index] === \"object\") {\n line += JSON.stringify(array[i][index]).replace(/,/g, \"++\");\n } else {\n if (String(array[i][index])?.includes(\",\")) {\n array[i][index] = '\"' + array[i][index] + '\"';\n } else if (array[i][index] === \"\" || array[i][index] === null || array[i][index] === undefined) {\n array[i][index] = \"-\";\n }\n line += array[i][index];\n }\n }\n str += line + \"\\r\\n\";\n }\n return str;\n }\n\n deepMerge(target: any, source: any): any {\n for (let key in source) {\n if (source[key] && typeof source[key] === \"object\" && !Array.isArray(source[key])) {\n if (!target[key] || typeof target[key] !== \"object\") {\n target[key] = {};\n }\n this.deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n return target;\n }\n\n async base64ToFile(base64: string, fileName: string, mimeType: string): Promise<File> {\n const byteString = atob(base64.split(\",\")[1]);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([ab], { type: mimeType });\n return new File([blob], fileName, { type: mimeType });\n }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SearchFilterPipe } from \"../../pipes/search-filter/search-filter.pipe\";\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { GlobalValuesService } from \"../../services/global-values.service\";\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n\n@Component({\n selector: 'app-search-filter',\n standalone: true,\n imports: [CommonModule, SearchFilterPipe, ReactiveFormsModule, FormsModule, CustomTranslatePipe],\n templateUrl: './search-filter.component.html',\n styleUrls: ['./search-filter.component.css']\n})\nexport class SearchFilterComponent implements OnInit {\n //emits the checked data in a array\n @Output() emitValues = new EventEmitter();\n \n\n /* getting the data to be listed in filter as a input\n The array should be in the format of\n (foe example)\n filterItems = [\n 'All', 'Admin', 'Accounts', 'Marketing', 'Sales', 'Human Resources', 'IT', 'Civil', 'Mech'\n ]\n */\n\n @Input() filterItems: Array<any> = []; \n selectedFilter: Array<any> = [];\n selectArry: any[] = [];\n searchText: any;\n viewAll = false;\n\n //MV24AUG24 Subscribes to active filter changes from GlobalValuesService and restores the checkbox state based on the received filterKeys and activeBox.\n constructor(private globalValues:GlobalValuesService) {}\n\n ngOnInit(): void {}\n\n //SKS24JAN25 Function for emitting the checked data in an array to its parent component\n checkedData(event:any) {\n const activeFilterKey = this.globalValues.getActiveFilterBox();\n const activeSearchFilter = localStorage.getItem('activeSearchFilter');\n let selectedArray = []\n if (activeSearchFilter != undefined && activeSearchFilter != \"undefined\" && activeFilterKey != undefined && activeFilterKey != \"undefined\" ) {\n let parsedFilter = JSON.parse(activeSearchFilter); //SKS24JAN25 Parse the string into an array\n selectedArray = parsedFilter[activeFilterKey] ? parsedFilter[activeFilterKey] : []\n if (selectedArray && selectedArray.includes(event)) {\n selectedArray = selectedArray.filter((item: any) => item !== event);\n } else {\n selectedArray.push(event);\n }\n parsedFilter[activeFilterKey] = selectedArray\n localStorage.setItem('activeSearchFilter',JSON.stringify(parsedFilter));\n }\n if(this.selectArry){\n if (this.selectArry.includes(event)) {\n //SKS24JAN25 If the event is already in the array, remove it\n this.selectArry = this.selectArry.filter(item => item !== event);\n } else {\n //SKS24JAN25 If the event is not in the array, add it\n this.selectArry.push(event);\n }\n }\n this.emitValues.emit(this.selectArry);\n }\n\n isSelected(event:any){\n const activeFilterKey = this.globalValues.getActiveFilterBox();\n const activeSearchFilter = localStorage.getItem('activeSearchFilter');\n if (activeSearchFilter != undefined && activeSearchFilter != \"undefined\" && activeFilterKey != undefined && activeFilterKey != \"undefined\" ) {\n try {\n const parsedFilter = JSON.parse(activeSearchFilter); //SKS24JAN25 Parse the string into an array\n this.selectArry = parsedFilter[activeFilterKey] ? parsedFilter[activeFilterKey] : []\n } catch (error) {\n // console.error(\"Error parsing activeSearchFilter:\", error);\n }\n } else {\n }\n if(this.selectArry){\n if(this.selectArry.includes(event)){\n return true\n } else {\n return false\n }\n } else {\n return false\n }\n }\n get isResized(): boolean {\n return (this.selectArry?.length ?? 0) > 0;\n }\n closefilter(){\n const activeFilterKey = this.globalValues.getActiveFilterBox();\n const activeSearchFilter = localStorage.getItem('activeSearchFilter');\n let selectedArray = []\n if (activeSearchFilter != undefined && activeSearchFilter != \"undefined\" && activeFilterKey != undefined && activeFilterKey != \"undefined\" ) {\n let parsedFilter = JSON.parse(activeSearchFilter); // Parse the string into an array\n selectedArray = parsedFilter[activeFilterKey] ? parsedFilter[activeFilterKey] : []\n if (selectedArray) {\n parsedFilter[activeFilterKey] = []\n localStorage.setItem('activeSearchFilter',JSON.stringify(parsedFilter));\n } \n this.selectArry = []\n }\n this.emitValues.emit([]);\n }\n}\n\n","<div class=\"card\">\n <div class=\"content\">\n <div class=\"flex\">\n <div class=\"search\" [class.resized]=\"isResized\">\n <div class=\"search-bar\">\n <svg class=\"searchSvg\" width=\"18\" height=\"20\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M21.6295 20.1667L19.7271 18.3333\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg> \n <input class=\" width-100\" type=\"text\" placeholder=\"{{ 'APP.SEARCH' | customTranslate : 'Search' }}\" [(ngModel)]=\"searchText\" class=\"searchinput\">\n </div>\n </div>\n <svg *ngIf=\"isResized\" (click)=\"closefilter()\" class=\"close-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.16998 14.83L14.83 9.17001\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M14.83 14.83L9.16998 9.17001\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"filter-content\" [style]=\"'overflow-y: auto'\">\n <div *ngFor=\"let data of filterItems | searchFilter : searchText\">\n <div class=\"mt-3 mb-3 checkboxdiv\">\n <input type=\"checkbox\" class=\"checkbox-small\" [checked]=\"isSelected(data)\" [value]=\"data\" [id]=\"data\"\n (change)=\"checkedData(data)\">\n <label class=\"ms-2 label-data\">{{data}}</label>\n </div>\n </div>\n </div>\n </div>\n</div>","import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnInit, Output, QueryList, SimpleChanges, ViewChild, ViewChildren } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { FormsModule } from '@angular/forms';\nimport { SearchFilterPipe } from \"../../pipes/search-filter/search-filter.pipe\";\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { GlobalValuesService } from \"../../services/global-values.service\";\n\n@Component({\n selector: 'app-multi-checkbox',\n standalone: true,\n imports: [CommonModule,MatCheckboxModule, FusionButtonComponent, FormsModule, SearchFilterPipe,CustomTranslatePipe],\n templateUrl: './multi-checkbox.component.html', \n styleUrls: ['./multi-checkbox.component.css']\n})\nexport class MultiCheckboxComponent implements OnInit {\n\n @Input() label!:string; // SK15FEB24 label for card\n @Input() checkboxList:Array<any> = []; // SK15FEB24 the list that to to dispolayed in card\n @Input() activeCheckboxList:Array<any> = []; // the active list that to be check \n @Input() cardSize = \"col-md-6\"; // SK15FEB24 card size\n @Input() componentData:any; // SK15FEB24 component data\n @Input() cardInlineSize = \"col-md-2\"; // SK15FEB24 inline chek box size\n @Input() buttonList:Array<any> = []; // SK15FEB24 button list in component\n @Input() cardClass : string = \"\"; //SK03OCT24\n @Input() clearSelection : boolean = false; //SK27OCT24\n @Input() displayValues:any = {\n keyString:\"\",\n valueString:\"\"\n };\n @Input() checkBoxStyles : string = \"\";\n @Input() contentCardStyle : string = \"\"; //SK12SEP25 \n @Input() cardStyle : string = \"\"; //SK12SEP25 \n \n @Output() compDataEmit: EventEmitter<any> = new EventEmitter<any>(); // SK15FEB24 emit action while clicking save\n @Output() checkEmit: EventEmitter<any> = new EventEmitter<any>();\n checkboxSelection:any;\n @Input() radioCheck = false; // SK14MAR24 to select only one checkbox at a time\n isArrayofObj = false; //SK20FEB24 to check the list if 'array' / 'array of objects's\n @ViewChildren('allCheck') allCheck!:QueryList<any>; // SK14MAR24 to clear or check check the \"Select/UnSelect All\" checkbox\n searchText:any; //SK03OCT24\n @Input() isButtonLoadingSpinner: boolean = false; //SK07NOV25\n\n constructor(public globalValues: GlobalValuesService, public cdr: ChangeDetectorRef) { } // MY 15OCT26 inject ChangeDetectorRef\n\n ngOnInit(): void {\n }\n\n ngOnChanges(changes:SimpleChanges){\n // MY 15OCT26 trigger change detection on input changes\n this.cdr.markForCheck();\n // SK15FEB24 the avtive element made true from checkBoxList\n // MY 15OCT26 preserve existing checkboxSelection when only non-list inputs (such as isButtonLoadingSpinner) change\n if (!this.checkboxSelection || changes[\"checkboxList\"] || changes[\"activeCheckboxList\"]) {\n this.checkboxSelection = new SelectionModel<any>(true, []);\n }\n if(changes[\"clearSelection\"]){\n if(this.clearSelection){\n this.checkboxSelection.clear();\n }\n }\n if(changes[\"checkboxList\"] || changes[\"activeCheckboxList\"]){\n if(this.checkboxList?.length > 0)this.isArrayofObj = typeof this.checkboxList[0] === \"string\" ? false : true;\n //SK20FEB24 checking the array of objects condition is true\n if(this.isArrayofObj){\n const checkboxList:any = [];\n const endpoint = this.componentData?.config?.endPoint.filter((obj:any)=>obj.name === 'checkboxList')\n // SK25JUL24\n if(endpoint){\n this.checkboxList?.forEach((element:any) => {\n // SK20FEB24, creating an element and assigning the value to a variable, that to be displayed in list\n const dupElement = {label:this.globalValues.getValue(element, endpoint[0].checkBoxLabelKey),labelPath:this.globalValues.getValue(element, \"labelPath\"),value:this.globalValues.getValue(element, endpoint[0].checkBoxPatchKey)};\n checkboxList.push(dupElement);\n this.checkboxList = checkboxList;\n });\n } else {\n // SK03OCT24 displayValyes fetch the label/value keys from array list from parent\n if(this.displayValues == null || this.displayValues == undefined ){\n this.checkboxList?.forEach((element:any) => {\n // SK03OCT24, creating an element and assigning the value to a variable, that to be displayed in list\n const dupElement = {label:this.globalValues.getValue(element, \"label\"),labelPath:this.globalValues.getValue(element, \"labelPath\"),value:this.globalValues.getValue(element, \"value\")};\n checkboxList.push(dupElement);\n this.checkboxList = checkboxList;\n });\n }\n }\n \n //SK20FEB24, selecting the checked element in list \n // SK03OCT24 binding the keys and values as per parent data\n const activeCBList = typeof this.activeCheckboxList[0] === \"string\" ? this.activeCheckboxList : this.activeCheckboxList.map((data:any)=> data[this.displayValues?.valueString] || data.value)\n this.checkboxList?.forEach((element1:any) => {\n const val = element1[this.displayValues?.valueString] || element1.value;\n // //SK15JAN25\n if(activeCBList?.includes(val)){\n this.checkboxSelection.select(element1);\n }\n });\n } else {\n this.checkboxList?.forEach((element:any) => {\n if(this.activeCheckboxList?.includes(element)){\n this.checkboxSelection.select(element);\n }\n });\n }\n }\n }\n\n // SK15FEB24 basid on action the event emits\n buttonClick(event:any){\n // MY 15OCT26 prevent click while button is in loading state\n if (event?.buttonLoadingSpinner || event?.isButtonLoadingSpinner || this.isButtonLoadingSpinner || this.componentData?.isButtonLoadingSpinner) {\n return;\n }\n if(event.buttonAction ===\"cancel\"){\n this.allCheck.toArray()[0].checked = false; //SK14MAR24 to uncheck \"Select/UnSelect All\" checkbox on cancl button\n this.checkboxSelection.clear();\n } else {\n this.compDataEmit.emit({checkListArray:this.checkboxSelection.selected, compData:this.componentData, button:event});\n }\n }\n\n // SK14MAR24 on check/uncheck the checkbox list, the selction data is emitted to parent\n checkAction(evt:any, event:any){\n if(evt === \"Select/UnSelect All\"){\n if(event.checked){\n this.checkboxList.forEach((ele:any)=>this.checkboxSelection.select(ele))\n } else {\n this.checkboxSelection.clear();\n }\n } else {\n if(this.radioCheck){\n this.checkboxSelection.clear();\n if(event.checked){\n this.checkboxSelection.select(evt);\n }\n }\n }\n if(this.checkboxSelection.selected.length > 0 && evt !== \"Select/UnSelect All\") this.allCheck.toArray()[0].checked = false;\n if(this.checkboxSelection.selected.length === this.checkboxList.length) this.allCheck.toArray()[0].checked = true;\n this.checkEmit.emit(this.checkboxSelection.selected);\n }\n}\n","<!-- SK15FEB24 Multi check component -->\n<div class=\"card flex {{cardClass}} {{cardSize}}\" style=\"{{cardStyle}}\">\n <div>\n <div class=\"fw-bold\" style=\"padding: 5px 10px 5px;\">{{label | customTranslate : label}}</div>\n </div>\n <!-- SK03OCT24 search filter in multiple checkbox -->\n <div class=\"search\" style=\"margin: 0px 10px 0px;\">\n <div class=\"search-bar flex\">\n <input class=\"width-100\" type=\"text\" placeholder=\"{{ 'APP.SEARCH' | customTranslate : 'Search' }}\" [(ngModel)]=\"searchText\"\n style=\"border:none;\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n </div>\n </div>\n <!-- SK20FEB24 if the list is array, the list will be shown as it is -->\n <!-- SK14MAR24 fixed stylings and added Select All/ Unselect Allcheckbox -->\n <div *ngIf=\"!isArrayofObj\" style=\"{{checkBoxStyles}}\">\n <!-- SK12SEP25 card inline style modified -->\n <div class=\"flex flex-wrap\" style=\"{{contentCardStyle}}\" >\n <mat-checkbox class=\"col-md-12\" #allCheck *ngIf=\"!radioCheck\" (click)=\"$event.stopPropagation()\" (change)=\"checkAction('Select/UnSelect All', $event)\">\n <span class=\"text-wrap\" style=\"font-size: small;\" >{{\"APP.SELECT_OR_UNSELECT_ALL\" | customTranslate : 'Select/UnSelect All'}}</span>\n </mat-checkbox>\n <div *ngIf=\"radioCheck\" #allCheck ></div>\n <div class=\"{{cardInlineSize}} flex\" *ngFor=\"let list of checkboxList | searchFilter : searchText; let i = index\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? checkboxSelection.toggle(list) : null\" (change)=\"checkAction(list, $event)\"\n [checked]=\"checkboxSelection.isSelected(list)\">\n <span class=\" text-wrap\" style=\"font-size: small;\" >{{list}}</span>\n </mat-checkbox>\n </div>\n </div>\n </div>\n <!-- SK20FEB24 if the list is array of objects, the mopdified list will be shown -->\n <!-- SK14MAR24 fixed stylings and added Select All/ Unselect Allcheckbox -->\n <div *ngIf=\"isArrayofObj\" style=\"{{checkBoxStyles}}\">\n <!-- //SK12SEP25 card inline style -->\n <div class=\"flex flex-wrap\" style=\"{{contentCardStyle}}\">\n <mat-checkbox #allCheck *ngIf=\"!radioCheck\" (click)=\"$event.stopPropagation()\" (change)=\"checkAction('Select/UnSelect All', $event)\">\n <span class=\" text-wrap\" style=\"font-size: small;\" >{{\"APP.SELECT_OR_UNSELECT_ALL\" | customTranslate : \"Select/UnSelect All\"}} </span>\n </mat-checkbox>\n <div class=\"{{cardInlineSize}} flex\" *ngFor=\"let list of checkboxList | searchFilter : searchText : (displayValues?.keyString || 'label | customTranslate : label'); let i = index\">\n <mat-checkbox class=\" flex-wrap\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? checkboxSelection.toggle(list) : null\" (change)=\"checkAction(list, $event)\"\n [checked]=\"checkboxSelection.isSelected(list)\">\n <span class=\" text-wrap\" style=\"font-size: small;\" >{{ displayValues?.keyString ? (list[displayValues.keyString] | customTranslate : list[displayValues.keyString] ) : (list.labelPath || list.label | customTranslate : list.label) }}\n </span>\n </mat-checkbox>\n </div>\n </div>\n </div>\n <div class=\"m-2 d-flex justify-content-end\">\n <!-- MY 16OCT26 support button loader on save/action button and disable cancel while loading -->\n <app-fusion-button *ngFor=\"let button of buttonList\" [buttonLoadingSpinner]=\"button.buttonLoadingSpinner || button.isButtonLoadingSpinner || (button.buttonAction !== 'cancel' && (isButtonLoadingSpinner || componentData?.isButtonLoadingSpinner))\" [buttonDisable]=\"button.buttonDisable || (button.buttonAction === 'cancel' && (isButtonLoadingSpinner || componentData?.isButtonLoadingSpinner))\" [buttonType]=\"button.class\" [buttonValue]=\"button.labelPath || button.label | customTranslate : button.label\"\n (buttonClickEmit)=\"buttonClick(button)\">\n </app-fusion-button>\n </div>\n</div>\n<!-- [disabled]=\"checkboxSelection.isSelected('No Access') && days !== 'No Access'\" -->","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { FormsModule } from '@angular/forms';\nimport { SearchFilterPipe } from \"../../pipes/search-filter/search-filter.pipe\";\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n@Component({\n selector: 'app-drop-down',\n standalone: true,\n imports: [CommonModule, AngularSvgIconModule, FormsModule, SearchFilterPipe, CustomTranslatePipe],\n templateUrl: './drop-down.component.html',\n styleUrls: ['./drop-down.component.css']\n})\nexport class DropDownComponent implements OnInit {\n @Input() lists! : Array<any>; // dropdown datas are reveived as input in form of array from child component\n @Input() title! : String; //SC04DEC2025 for dropdown title\n @Output() dataEmit = new EventEmitter(); //emits the selected data from dropdown to child component\n @Input() dropDownWidth= ''; // width value for dropdown to increase/decrease width size\n @Input() selectBoxWidth= ''; // SKS15MAR25 width value for select box to increase/decrease width size\n @Input() dropDownHeight= ''; // increase/decrease the height of drop down box\n @Input() selectBoxHeight= ''; //SKS15MAR25 increase/decrease the height of select box\n @Input() selectBoxBorder= ''; //SKS15MAR25 true or none the border size of select box\n @Input() dropBorderRadius= '5px'; // to style the of the border;\n @Input() selectedData :any = 'Select'; // default value from array list can be sent in this variable\n @Input() controlName: string = '';\n @Input() multipleSelect: boolean = false; //SK03OCT24\n @Input() multipleSelectedData: Array<any> = []; //SK03OCT24\n @Input() multipleSelectedView: Array<any> = []; //SK03OCT24\n\n /*the 'errorValue' (or) 'defaultValue', any one can be used. If we want to display error while selecting the data, \n then 'errorValue' variable can be used, else, if we want to select none from list, we can use default value*/\n @Input() errorValue = ''; \n @Input() defaultValue = '';\n @Input() isDisabled = false;\n @Input() isRequired = false; // input property to indicate whether the dropdown is required or not\n @Input() isError: boolean = false;\n @Input() bindKey!: string; //SK24DEC24\n @Input() bindValue!: string; //SK14AUG25 Dropdown bindvalue\n @Input() sortData: any; //SK24DEC24\n @Input() ddConfigs: any; //SK24DEC24\n @Output() errorEmit = new EventEmitter();\n @Output() multipleSelectDataEmit = new EventEmitter(); //SK03OCT24\n\n //error message to be displayed if we displaying a error\n @Input() errorMessage = '';\n searchText = \"\"; //SK03OCT24\n\n private clickListener!: (event: MouseEvent) => void;\n currentSelectedValue: any; //SC13AUG2025 to store the selected options from dropdown\n\n\n constructor(private readonly elementRef: ElementRef) { }\n\n ngOnInit(): void {\n // add an event listener to the document object that listens for a click event.\n this.clickListener = this.handleDocumentClick.bind(this);\n document.addEventListener('click', this.clickListener);\n }\n \n ngOnDestroy(): void {\n // remove the event listener from the document object to prevent memory leaks\n document.removeEventListener('click', this.clickListener);\n }\n\n ddType:any\n // SK24DEC24 to detect changes on lists\n ngOnChanges(changes:SimpleChanges): void {\n if(changes['lists']){\n if(this.lists){\n if(this.lists instanceof Set) this.lists = Array.from(this.lists) //SK20JAN25 convert to array from set\n if(typeof this.lists[0] === \"string\" || typeof this.lists[0] === \"number\"){\n this.ddType = 'string';\n } else if (Array.isArray(this.lists)) {\n this.ddType = 'object';\n if (this.sortData?.sortType === 'ascending') {\n this.lists.sort((a, b) => a[this.sortData?.sortKey] - b[this.sortData?.sortKey]);\n } else {\n this.lists.sort((a, b) => b[this.sortData?.sortKey] - a[this.sortData?.sortKey]);\n }\n }\n }\n } \n // SKS26MAR25 Added null and type checks to prevent errors when accessing `selectedData` properties.\n if (changes['selectedData']) { \n const currentValue = changes['selectedData'].currentValue;\n if (currentValue && typeof this.selectedData !== \"string\" && typeof this.selectedData !== \"number\") {\n if (this.selectedData) this.selectedData = currentValue[this.bindKey] || null;\n this.dataEmit.emit({ event: \"\", data: currentValue, controlName: this.controlName, comps: this.ddConfigs });\n }\n // SK14AUG25 display the selected Key not value\n if(typeof this.lists[0] === 'object' && this.bindValue){\n let selectData = this.lists.find((item, index) => item[this.bindValue] === this.selectedData)\n this.selectedData = selectData?.[this.bindKey] || this.selectedData;\n }\n }\n }\n\n dropDown = false;\n showError = false;\n\n listValue(event: any, data:any, type:string){\n // SK03OCT24 dropdown from single or multiple select\n this.currentSelectedValue = data; //SC13AUG2025 to store the selected value \n if(type===\"singleSelect\"){\n // SK24DEC24 check if the list is array of object\n if(typeof data === \"string\" || typeof data === \"number\"){\n this.selectedData = data;\n } else {\n this.selectedData = data?.[this.bindKey];\n }\n \n this.dataEmit.emit({event: event, data:data, controlName: this.controlName, comps:this.ddConfigs});\n this.isError = false;\n } else if(type===\"multipleSelect\"){\n let list = Array.from(this.multipleSelectedView);\n list.push(data)\n this.multipleSelectedView = new Set(list) as any ;\n this.multipleSelectDataEmit.emit({event: event, data:Array.from(this.multipleSelectedView), controlName: this.controlName});\n this.isError = false;\n }\n }\n\n // first check if the click event occurred inside the dropdown component or not by calling the contains method on the nativeElement property of the elementRef object. \n // If the click event occurred outside the component, we set the dropDown property to false, which will close the dropdown\n private handleDocumentClick(event: MouseEvent): void {\n const isClickInside = this.elementRef.nativeElement.contains(event.target);\n if (!isClickInside) {\n this.dropDown = false;\n }\n }\n // when outside click if the selected data and error value is equlas then show the error message\n outsideClick(){\n if(this.selectedData == this.errorValue){\n this.isError = true;\n this.errorEmit.emit(true);\n }else{\n this.isError = false;\n this.errorEmit.emit(false);\n }\n }\n\n // SK03OCT24 removing the values, if multiple select values in filter, \n removeSelectedFilter(data:string, index:number){\n let list = Array.from(this.multipleSelectedView);\n list.splice(index,1);\n this.multipleSelectedView = list as any;\n this.multipleSelectDataEmit.emit({data:Array.from(this.multipleSelectedView), controlName: this.controlName});\n }\n}\n","<div>\n <div class=\"position-relative\">\n <!-- SK03OCT24 if not multiple select dropdown -->\n <!-- SC04DEC2025 for dropdown title -->\n <small *ngIf=\"title\">{{title}}</small> \n <div style=\"width: {{selectBoxWidth ? '' : dropDownWidth}};\" *ngIf=\"!multipleSelect\">\n <button type=\"button\" class=\"button-fc {{isError ? 'button-error' : ''}}\" (blur)=\"outsideClick()\"\n (click)=\"dropDown = !dropDown\" [disabled]=\"isDisabled\"\n style=\"width:{{selectBoxWidth ? selectBoxWidth : dropDownWidth}}; border-radius:{{dropBorderRadius}} ; border:{{selectBoxBorder}}; height: {{selectBoxHeight}}\">\n <div class=\"select-content\">\n <!-- SC13AUG2025 to set the translation -->\n <div class=\"btn-font-size selected-value\" [attr.data-selected]=\"selectedData\">\n \n <ng-container *ngIf=\"ddType === 'object' && selectedData !== 'Select'; else stringType\">\n <ng-container *ngIf=\"currentSelectedValue?.labelPath; else noLabelPath\">\n {{ currentSelectedValue.labelPath | customTranslate : selectedData }}\n </ng-container>\n <ng-template #noLabelPath>\n {{selectedData}}\n </ng-template>\n </ng-container>\n\n <ng-template #stringType>\n {{ selectedData === 'Select' ? ('APP.SELECT' | customTranslate : 'Select') : selectedData }}\n </ng-template>\n </div>\n <div class=\"arrow {{dropDown === true }}\"></div>\n </div>\n <div class=\"border\" *ngIf=\"dropDown\" style=\"width: {{dropDownWidth}};\">\n <div *ngFor=\"let list of lists\" (click)=\"listValue($event,list, 'singleSelect');dropDown = false\"\n [style]=\"((list === selectedData) || (list?.[bindKey] === selectedData)) ? 'background: rgba(0, 123, 255, 0.1)' : 'background : white' \">\n <div class=\"drop-list\">\n <!-- SK24DEC24 to dispay array of objects list too -->\n <div *ngIf=\"ddType === 'string'\" class=\"list-select\">{{list}}</div>\n <div *ngIf=\"ddType === 'object'\" class=\"list-select\">\n <!-- SC13AUG2025 for apply translation -->\n @if (list.labelPath) {\n {{ list.labelPath | customTranslate : list[bindKey] }}\n }@else{\n {{list[bindKey]}}\n }\n </div>\n </div>\n </div>\n </div>\n </button>\n </div>\n\n <!-- SK03OCT24 if multiple select dropdown. This selects the multiple data from dropdown -->\n <div style=\"width: {{dropDownWidth}};\" *ngIf=\"multipleSelect\">\n <button type=\"button\" class=\"button-fc {{isError ? 'button-error' : ''}}\" (blur)=\"outsideClick()\"\n [disabled]=\"isDisabled\" style=\"height:{{dropDownHeight}}; border-radius:{{dropBorderRadius}} \">\n <div class=\"select-content flex justify-content-end h-100 align-items-center\"\n (click)=\"dropDown = !dropDown\">\n <div *ngFor=\"let sel of multipleSelectedView; let i=index\" class=\"btn-font-size selected-value me-2\"\n [attr.data-selected]=\"selectedData\">\n <div class=\"flex justify-center\" style=\"gap: 3px; align-items: center;\">\n {{sel}}\n <div *ngIf=\"i >= 0\" (click)=\"removeSelectedFilter(sel,i)\" class=\"close-hover\">×</div>\n </div>\n </div>\n <div class=\"arrow {{dropDown === true }}\"></div>\n </div>\n <div class=\"border\" *ngIf=\"dropDown\" style=\"width: {{dropDownWidth}};\">\n <div class=\"search m-3\">\n <div class=\"search-bar flex\">\n <input class=\"width-100\" type=\"text\" placeholder=\"'APP.SEARCH' | customTranslate : 'Search'\"\n [(ngModel)]=\"searchText\" style=\"border:none;\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n </div>\n </div>\n <div *ngFor=\"let list of lists | searchFilter : searchText\"\n (click)=\"listValue($event,list, 'multipleSelect');dropDown = false\"\n [style]=\"list === selectedData ? 'background: rgba(0, 123, 255, 0.1)' : 'background : white' \">\n <div class=\"drop-list\">\n <div class=\"list-select\">{{list}}</div>\n </div>\n </div>\n </div>\n </button>\n </div>\n <div *ngIf=\"isError\" class=\"flex flex-row\">\n <img src=\"../assets/images/icons/general/warning icon.svg\">\n <p class=\"margin-top-auto\">\n <span class=\"error-msg\">{{errorMessage}}</span>\n </p>\n </div>\n </div>\n</div>","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, QueryList, SimpleChanges, ViewChild, ViewChildren } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { FormsModule } from '@angular/forms';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n@Component({\n selector: 'app-multiple-filter',\n standalone: true,\n imports: [CommonModule,MatCheckboxModule, FusionButtonComponent, FormsModule, DropDownComponent,TranslateModule,CustomTranslatePipe],\n templateUrl: './multiple-filter.component.html',\n styleUrls: ['./multiple-filter.component.css']\n})\nexport class MultipleFilterComponent implements OnInit {\n\n @Input() label!:string; // SK03OCT24 label for card\n @Input() checkboxList:Array<any> = []; // SK03OCT24 the list that to to dispolayed in card\n @Input() activeCheckboxList:Array<any> = []; // the active list that to be check \n @Input() cardSize = \"col-md-6\"; // SK03OCT24 card size\n @Input() componentData:any; // SK03OCT24 component data\n @Input() cardInlineSize = \"col-md-2\"; // SK03OCT24 inline chek box size\n @Input() buttonList:Array<any> = []; // SK03OCT24 button list in component\n @Input() cardClass : string = \"\";\n @Input() displayValues:any = {\n keyString:\"\",\n valueString:\"\"\n };\n @Input() checkBoxStyles : string = \"\";\n @Input() selectionData:Array<any> = [];\n @Input() isDateFilter : boolean = false;\n @Input() isButtonLoadingSpinner: boolean = false; // MY 15OCT26 button loader input\n @Output() compDataEmit: EventEmitter<any> = new EventEmitter<any>(); // SK15FEB24 emit action while clicking save\n @Output() checkEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() selectedValuesEmit: EventEmitter<any> = new EventEmitter<any>();\n searchText:any;\n startDate: any;\n endDate: any;\n\n constructor(public cdr: ChangeDetectorRef) { } // MY 15OCT26 inject ChangeDetectorRef\n\n ngOnInit(): void {\n // SK03OCT24 sample date for filter \n // this.selectionData = [\n // {\"label\":\"Department\", \"$opMap\":\"workinfo.department\", \"allValues\":[\"IT\", \"Finance\", \"Admin\"], \"selectedValues\":[\"IT\", \"Finance\"]},\n // {\"label\":\"Designation\", \"$opMap\":\"workinfo.designation\", \"allValues\":[\"Developer\", \"Accountant\", \"HR\"], \"selectedValues\":[\"Developer\", \"Accountant\"]},\n // {\"label\":\"Gender\", \"$opMap\":\"personalinfo.gender\", \"allValues\":[\"Male\", \"Female\", \"Others\"], \"selectedValues\":[ \"Female\", \"Others\"]},\n // {\"label\":\"Location\", \"$opMap\":\"workinfo.officeLocation\", \"allValues\":[\"Chennai\", \"Tirunelveli\", \"Coimbatore\"], \"selectedValues\":[\"Chennai\", \"Tirunelveli\", \"Coimbatore\"]},\n // ]\n }\n\n ngOnChanges(changes:SimpleChanges){\n // MY 15OCT26 trigger change detection on input changes\n this.cdr.markForCheck();\n }\n\n // SK03OCT24 basid on action the event emits\n buttonClick(event:any){\n // MY 15OCT26 prevent click while button is in loading state\n if (event?.buttonLoadingSpinner || event?.isButtonLoadingSpinner || this.isButtonLoadingSpinner || this.componentData?.isButtonLoadingSpinner) {\n return;\n }\n this.compDataEmit.emit({compData:this.componentData, button:event});\n }\n\n multipleSelectDataEmit(event:any, list:any){\n if(event.controlName === \"crossFilter\"){ //SKS10JAN25 for cross filter val emit\n list.filterFields = event.data;\n } else{\n list.selectedValues = event.data;\n this.selectedValuesEmit.emit({list:list})\n }\n }\n\n dateErr: boolean = false\n leaveCalc(){\n let stDt:any = new Date(this.startDate);\n let edDt:any = new Date(this.endDate);\n this.dateErr = ((edDt - stDt) < 0) ? true : false;\n this.filterDateEmit.emit({startDate:this.startDate, endDate:this.endDate })\n }\n\n @Output() filterDateEmit : EventEmitter<any> = new EventEmitter<any>();\n // SK03OCT24 dates emit\n buttonClickDate(){\n this.filterDateEmit.emit({startDate:this.startDate, endDate:this.endDate })\n }\n}\n","<!-- SK03OCT24 Multi Filter component -->\n<div class=\"card flex {{cardClass}} {{cardSize}}\">\n <div>\n <div class=\"fw-bold\" style=\"padding: 5px 10px 5px;\">{{label}}</div>\n </div>\n <!-- <div class=\"search m-3\">\n <div class=\"search-bar flex\">\n <input class=\"medium-font width-100\" type=\"text\" placeholder=\"Search\" [(ngModel)]=\"searchText\"\n style=\"border:none;\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n </div>\n </div> -->\n <div style=\"{{checkBoxStyles}}\">\n <div class=\"flex flex-wrap px-2\" *ngIf=\"!isDateFilter\">\n <div class=\"{{cardInlineSize}}\" *ngFor=\"let list of selectionData; let i = index\">\n <div class=\"\">\n <label class=\"text-wrap align-self-center\" style=\"font-size: small;\" >{{list.labelPath || list.label | customTranslate : list.label}}</label>\n <div *ngIf=\"componentData.type !== 'crossFilter'\">\n <app-drop-down [lists]=\"list.allValues\" [multipleSelectedView]=\"list.selectedValues\" selectedData=\"Select\" [multipleSelect]=\"true\" (multipleSelectDataEmit)=\"multipleSelectDataEmit($event, list)\"></app-drop-down>\n </div>\n <!-- SKS10JAN25 for cross filter check box -->\n <div *ngIf=\"componentData.type === 'crossFilter'\">\n <app-drop-down [lists]=\"list.allValues\" [multipleSelectedView]=\"list.filterFields\" selectedData=\"Select\" [controlName]=\"componentData.type\" [multipleSelect]=\"true\" (multipleSelectDataEmit)=\"multipleSelectDataEmit($event, list)\"></app-drop-down>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap\" *ngIf=\"isDateFilter\">\n <div class=\"d-flex justify-content-between px-2\" [class]=\"cardInlineSize\">\n <!-- SK03OCT24 startDate and endDate inputs -->\n <div class=\"field-input\">\n <label class=\"modal-field-label\" for=\"end-date\">{{'APP.START_DATE' | customTranslate : 'Start Date' }}*</label>\n <input type=\"date\" max=\"9999-12-31\" [(ngModel)]=\"startDate\" id=\"start-date\" [max]=\"endDate\" name=\"startDate\"\n format=\"mm-dd-yyyy\" class=\"input-border\" (change)=\"leaveCalc()\"/>\n </div>\n\n <div class=\"field-input\"\n [class]=\"dateErr ? 'has-error' : '' \">\n <label class=\"modal-field-label\" for=\"end-date\">{{'APP.END_DATE' | customTranslate : 'End Date' }}*</label>\n <input type=\"date\" max=\"9999-12-31\" [(ngModel)]=\"endDate\" id=\"end-date\" [min]=\"startDate\" name=\"endDate\"\n format=\"mm-dd-yyyy\" class=\"input-border\" (change)=\"leaveCalc()\" />\n <p *ngIf=\"dateErr\" class=\"error-msg\">\n <span> {{ 'APP.SELECT_VALID_DATE' | customTranslate : 'Select valid date' }}\n </span>\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"m-2 d-flex justify-content-end\" *ngIf=\"!isDateFilter\">\n <!-- MY 15OCT26 support button loader on button item, componentData, or multiple-filter input -->\n <app-fusion-button *ngFor=\"let button of buttonList\" [buttonLoadingSpinner]=\"button.buttonLoadingSpinner || button.isButtonLoadingSpinner || isButtonLoadingSpinner || componentData?.isButtonLoadingSpinner\" [buttonType]=\"button.class\" [buttonValue]=\"button.labelPath || button.label | customTranslate : button.label\"\n (buttonClickEmit)=\"buttonClick(button)\">\n </app-fusion-button>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n\n@Component({\n selector: 'app-pagination',\n standalone: true,\n imports: [CommonModule, FormsModule, CustomTranslatePipe],\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.css'\n})\nexport class PaginationComponent implements OnInit {\n @Output() event = new EventEmitter<any>;\n // page size Options\n @Input() pageSizeOptions: number[] = [5, 10, 15, 20, 50];\n /** The total number of records */\n @Input() collectionSize = 0;\n \n /** The number of records to display */\n @Input() pageSize = 10;\n \n /** Current page */\n @Input() currentPage = 1;\n \n /** The number of buttons to show either side of the current page */\n @Input() maxSize = 2;\n \n /** Display the First/Last buttons */\n @Input() firstLastButtons = false;\n \n /** Display the Next/Previous buttons */\n @Input() nextPreviousButtons = true;\n \n /** Display small pagination buttons */\n @Input() small = false;\n \n totalPages: any[] = [];\n \n constructor() {}\n \n ngOnInit(): void {\n this.pageSize = this.pageSize ?? 10; // Ensure a default value\n this.currentPage = this.currentPage === 0 ? 1 : this.currentPage\n if (this.collectionSize) {\n this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));\n }\n }\n \n ngOnChanges(changes: SimpleChanges) {\n this.pageSize = this.pageSize ?? 10; // Ensure a default value\n this.currentPage = this.currentPage === 0 ? 1 : this.currentPage ?? 1\n if (this.collectionSize) {\n this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));\n }\n }\n get startIndex(): number {\n return (this.currentPage - 1) * Number(this.pageSize);\n }\n\n get endIndex(): number {\n return Math.min( Number(this.startIndex) + Number(this.pageSize), this.collectionSize);\n }\n /** Set page number */\n selectPageNumber(pageNumber: number) {\n this.currentPage = pageNumber;\n this.emit()\n }\n \n /** Set next page number */\n next() {\n const nextPage = this.currentPage + 1;\n nextPage <= this.totalPages.length && this.selectPageNumber(nextPage);\n }\n \n /** Set previous page number */\n previous() {\n const previousPage = this.currentPage - 1;\n previousPage >= 1 && this.selectPageNumber(previousPage);\n }\n onPageSizeChange(newSize:any): void {\n this.pageSize = newSize; // Update the pageSize\n this.totalPages = new Array(Math.ceil(this.collectionSize / this.pageSize));\n // Ensure the current page is within bounds\n // if (this.currentPage > this.totalPages.length) {\n // this.currentPage = this.totalPages.length;\n // }\n this.currentPage = 1\n this.emit(); // Emit an event if necessary\n } \n emit(){\n this.event.emit({\"length\":this.collectionSize, \"pageSize\": this.pageSize, \"pageIndex\" : this.currentPage})\n }\n }","<!-- SKS24JAN25 -->\n<div class=\"flex content-space-between main-cont\">\n <div class=\"info\">\n <div *ngIf=\"endIndex\">\n {{'APP.SHOWING_DATA' | customTranslate : 'Showing data'}} {{ startIndex + 1 }} {{'APP.TO' | customTranslate : 'to'}} {{ endIndex }} {{'APP.OF' | customTranslate : 'of'}} {{ collectionSize }} {{'APP.ENTRIES' | customTranslate : 'entries'}}\n </div>\n </div>\n <nav style=\"padding-top: 16px;\">\n <ul [class]=\"small ? 'pagination pagination-sm' : 'pagination'\" style=\"align-items: center;\">\n <!-- select button -->\n <label style=\"font-size: 14px; font-weight: var(--fw-400); padding-right: 10px; color: var(--fb-text-secondary, #64748b);\" for=\"perPage\">{{'APP.RESULTS_PER_PAGE' | customTranslate : 'Results per page'}}</label>\n <div class=\"dropdown-wrapper\">\n <select id=\"perPage\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n <svg class=\"dropdown-arrow\" width=\"9\" height=\"6\" viewBox=\"0 0 9 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0.684136 0.767477C0.922999 0.5378 1.30282 0.545248 1.5325 0.784111L4.5 3.93431L7.4675 0.784111C7.69718 0.545248 8.077 0.5378 8.31587 0.767477C8.55473 0.997153 8.56218 1.37698 8.3325 1.61584L4.9325 5.21584C4.81938 5.33349 4.66321 5.39998 4.5 5.39998C4.33679 5.39998 4.18062 5.33349 4.0675 5.21584L0.667501 1.61584C0.437825 1.37698 0.445272 0.997153 0.684136 0.767477Z\" fill=\"currentColor\"/>\n </svg> \n </div> \n <!-- first button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\" >\n <button class=\"page-link\" (click)=\"selectPageNumber(1)\">««</button>\n </li>\n <!-- last button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\">\n <button class=\"page-link\" (click)=\"selectPageNumber(totalPages.length)\">»»</button>\n </li>\n <!-- previous button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\" >\n <button class=\"page-link\" (click)=\"previous()\">«</button>\n </li>\n <!-- page numbers -->\n <ng-container *ngFor=\"let p of totalPages; index as i\">\n <li *ngIf=\"i + 1 >= currentPage - maxSize && i + 1 <= currentPage + maxSize\" [class]=\"currentPage === i + 1 ? 'page-item active' : 'page-item'\">\n <button class=\"page-link\" (click)=\"selectPageNumber(i + 1)\">\n {{ i + 1 }}\n </button>\n </li>\n </ng-container>\n <!-- next button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\">\n <button class=\"page-link\" (click)=\"next()\">»</button>\n </li>\n </ul>\n </nav>\n</div>\n ","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Popover } from 'bootstrap';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Overlay, OverlayModule, ScrollStrategy } from '@angular/cdk/overlay';\n\n// MR 19SEP26 Fix popover dismissal under OnPush with 1s stay delay\n@Component({\n selector: 'app-popover',\n standalone: true,\n imports: [CommonModule, TranslateModule, OverlayModule],\n templateUrl: './popover.component.html',\n styleUrls: ['./popover.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PopoverComponent implements OnInit, OnDestroy {\n private static activePopover: PopoverComponent | null = null;\n\n isPopoverOpen = false;\n private popoverTimeout: any;\n\n @Input() isBootstrap: boolean = false;\n @Input() dynamicPopover: string = '';\n @Input() closeDelay: number = 1000; // 1 second stay duration\n\n constructor(\n private overlay: Overlay,\n private cdr: ChangeDetectorRef\n ) { }\n\n ngOnInit(): void {\n }\n\n ngOnDestroy(): void {\n this.clearCloseTimeout();\n if (PopoverComponent.activePopover === this) {\n PopoverComponent.activePopover = null;\n }\n }\n\n createScrollStrategy(): ScrollStrategy {\n return this.overlay.scrollStrategies.reposition();\n }\n\n ngAfterViewInit(): void {\n if (this.isBootstrap) {\n Array.from(document.querySelectorAll('[data-bs-toggle=\"popover\"]'))\n .forEach(popoverNode => new Popover(popoverNode));\n }\n }\n\n openPopover(): void {\n this.clearCloseTimeout();\n if (PopoverComponent.activePopover && PopoverComponent.activePopover !== this) {\n PopoverComponent.activePopover.closeImmediately();\n }\n PopoverComponent.activePopover = this;\n this.isPopoverOpen = true;\n this.cdr.markForCheck();\n }\n\n keepPopoverOpen(): void {\n this.clearCloseTimeout();\n if (!this.isPopoverOpen) {\n this.openPopover();\n }\n }\n\n closePopoverWithDelay(): void {\n this.clearCloseTimeout();\n this.popoverTimeout = setTimeout(() => {\n this.closeImmediately();\n }, this.closeDelay);\n }\n\n closeImmediately(): void {\n this.clearCloseTimeout();\n if (PopoverComponent.activePopover === this) {\n PopoverComponent.activePopover = null;\n }\n this.isPopoverOpen = false;\n this.cdr.markForCheck();\n }\n\n private clearCloseTimeout(): void {\n if (this.popoverTimeout) {\n clearTimeout(this.popoverTimeout);\n this.popoverTimeout = null;\n }\n }\n}\n","<!--SKS4FEB25 Hover Trigger Element -->\n<div cdk-overlay-origin #trigger=\"cdkOverlayOrigin\" class=\"hover-base\" \n (mouseenter)=\"openPopover()\" \n (mouseleave)=\"closePopoverWithDelay()\">\n <ng-content select=\".hover-base\"></ng-content>\n</div>\n<!--SKS4FEB25 Popover Content Template -->\n<ng-template #popoverContent>\n <ng-content select=\".hover-content\"></ng-content>\n</ng-template>\n\n\n<!-- Bootstrap Popover -->\n<div *ngIf=\"isBootstrap\" class=\"bc-popover\">\n <div class=\"btn btn-secondary me-2\" data-bs-container=\"body\" data-bs-trigger=\"hover\" data-bs-toggle=\"popover\" data-bs-placement=\"top\" [attr.data-bs-content]=\"dynamicPopover\">\n <ng-container *ngTemplateOutlet=\"popoverContent\"></ng-container>\n </div>\n</div>\n\n<!-- Fusion Custom Popover -->\n<!-- MR 19SEP26 Popover Overlay with outside-click and hover handlers -->\n<ng-template cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isPopoverOpen\"\n [cdkConnectedOverlayScrollStrategy]=\"createScrollStrategy()\"\n (overlayOutsideClick)=\"closeImmediately()\">\n <div *ngIf=\"!isBootstrap\" class=\"fusion-popover popover-base\"\n (mouseenter)=\"keepPopoverOpen()\" \n (mouseleave)=\"closePopoverWithDelay()\">\n <ng-container *ngTemplateOutlet=\"popoverContent\"></ng-container>\n </div>\n</ng-template>","import { Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { Modal } from 'bootstrap';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n@Component({\n selector: 'app-modal',\n standalone: true,\n imports: [CommonModule, FusionButtonComponent, CustomTranslatePipe],\n templateUrl: './modal.component.html',\n styleUrls: ['./modal.component.css']\n})\nexport class ModalComponent implements OnInit {\n @Input() modalTitle: any;\n @Input() isModalOpen = false;\n @Input() modalSize = '';\n @Input() saveButtonValue = 'Save';\n @Input() modalFooter = true;\n @Input() cancelNXTEmit : any;\n @Output() saveButtonEmit = new EventEmitter<any>;\n @Output() cancelButtonEmit = new EventEmitter<any>;\n modalDirect!: Modal;\n @ViewChild('demoModal') demoModal!: ElementRef<any>; //to open the bootstrap modal based on click function in ts file\n\n\n constructor() { }\n // SKS17JUL26 Listen for the Escape key press to close the modal if it's open\n @HostListener('document:keydown.escape', ['$event'])\n onKeydownHandler(event: any) {\n if (this.isModalOpen) {\n this.closeModal();\n }\n }\n\n ngOnChanges(changes: SimpleChanges){\n if(changes['isModalOpen']){\n if(this.isModalOpen === true){\n this.modalOpen();\n } \n }\n\n if(changes['cancelNXTEmit']){\n if(this.cancelNXTEmit === true){\n this.closeModal();\n }\n }\n }\n\n ngOnInit(): void {\n }\n\n closeModal() {\n this.cancelButtonEmit.emit(false);\n }\n\n saveModal() {\n this.saveButtonEmit.emit();\n }\n\n modalOpen(){\n if(this.demoModal){\n this.modalDirect = new Modal(this.demoModal.nativeElement, { backdrop: 'static' });\n this.modalDirect.show();\n }\n }\n\n}\n","<div class=\"modal fade container-md\" [class]=\"isModalOpen ? 'show d-block modal-bg' : 'd-none' \" tabindex=\"1\" >\n <div class=\"modal-dialog\" [ngClass]=\"modalSize ? modalSize : 'modal-lg'\"> <!-- SC26DEC2025 modal size based on modalSize parms issue fixed -->\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title mb-0\" id=\"openModal\">{{modalTitle}}</b>\n <button type=\"button\" class=\"btn-close\" tabindex=\"-1\" data-bs-dismiss=\"modal\" (click)=\"closeModal()\"\n aria-label=\"Close\"></button>\n </div>\n <div>\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <div class=\"modal-footer\" *ngIf=\"modalFooter\">\n <app-fusion-button buttonType=\"btn ms-2\" (buttonClickEmit)=\"saveModal()\"\n data-bs-dismiss=\"modal\" [buttonValue]=\"'APP.SAVE' | customTranslate : 'Save'\">\n </app-fusion-button>\n <app-fusion-button buttonType=\"btn text-only ms-2\" (buttonClickEmit)=\"closeModal()\"\n data-bs-dismiss=\"modal\" buttonValue=\"{{'APP.CANCEL' | customTranslate : 'Cancel'}}\">\n </app-fusion-button>\n </div>\n </div>\n </div>\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { NxtButtonComponent, NxtFileUpload } from '@rangertechnologies/ngnxt';\n@Component({\n selector: 'app-file-upload',\n standalone: true,\n imports: [CommonModule,CustomTranslatePipe, NxtFileUpload, NxtButtonComponent],\n templateUrl: './file-upload.component.html',\n styleUrls: ['./file-upload.component.css']\n})\nexport class FileUploadComponent implements OnInit {\n \n @Output() fileSelected = new EventEmitter<any>();\n @Output() fileDeleted = new EventEmitter<any>();\n @Output() closeEmit = new EventEmitter<any>();\n @Output() templateDownload = new EventEmitter<any>();\n @Output() upload = new EventEmitter<any>();\n @Output() radioSelectEmit = new EventEmitter<any>();\n\n @Input() id = 'fileUpload';\n @Input() headerName: any\n @Input() bodyHeaderName: any\n @Input() isTemplate: boolean = false\n @Input() bodyContent: any = []\n @Input() saveButtonName: any\n @Input() isLoading: boolean = false\n @Input() showFileModal: boolean = false\n @Input() fileRestrictions: any = {}; // contains file size and file type in it\n @Input() uploadedFiles: Array<any> = []; // This array holds the dropped or selected files. Which later needs to be emitted to the parrent.\n @Input() importButtonConfig: Array<any> = [];\n @Input() defaultBodyRadioName: any;\n @Input() bodyRadioConfig: any\n @Input() templateContent: any = null\n public allowedFileTypes: string[] = [];\n\n constructor() { }\n\n ngOnInit(): void {\n this.allowedFileTypes = (this.fileRestrictions?.allowedTypes || []).map((ext: any) => ext.toLowerCase().startsWith('.') ? ext.toLowerCase() : '.' + ext.toLowerCase());\n }\n deleteFile(removedFile: any) {\n this.uploadedFiles = this.uploadedFiles.filter(\n file =>\n file.name !== removedFile?.name ||\n file.size !== removedFile?.size\n );\n this.fileDeleted.emit(this.uploadedFiles);\n }\n onFileSelected(event: any){\n this.uploadedFiles = event?.value?.valueObj || this.uploadedFiles\n this.fileSelected.emit(this.uploadedFiles);\n }\n uploadFile(){\n this.upload.emit(this.uploadedFiles || [])\n }\n close(){\n this.closeEmit.emit()\n }\n downloadTemplate(){\n this.templateDownload.emit()\n }\n radioSelect(event: any){\n this.radioSelectEmit.emit(event)\n }\n }\n\n","<div class=\"file-modal-backdrop\" *ngIf=\"showFileModal\">\n <div class=\"file-modal\">\n <!-- Body -->\n <div class=\"file-modal-body\">\n <!-- SKS3APR26 Header -->\n <div class=\"file-modal-header\">\n <h2>{{ headerName }}</h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <!-- MR 19OCT26 {refactor inline html template styling to theme tokens} -->\n <i class=\"fusion-icon fusion-icon-size-xl fusion-icon-close-square header-sub-icon\" style=\"color: var(--fc-text-color-dark, #000000);\"></i>\n </button>\n </div>\n <p *ngIf=\"bodyHeaderName\" class=\"steps-title\">{{ bodyHeaderName }}</p>\n <ol *ngIf=\"isTemplate || bodyContent.length > 1\" class=\"steps-list\" style=\"font-size: 13px;\">\n @if(isTemplate){\n <li class=\"fc-lite\" style=\"font-size: 13px;\">\n @if(templateContent){\n {{ templateContent }}\n }\n <span class=\"step-link\" style=\"font-size: 13px;\" (click)=\"downloadTemplate()\">\n {{ 'APP_HRM_EMPLOYEES_EMPLOYEES.HERE' | customTranslate : 'here'}}\n </span>.\n </li>\n }\n @if(bodyContent.length > 1 || isTemplate){\n <ng-container *ngFor=\"let cont of bodyContent\">\n <li style=\"font-size: 13px;\" class=\"fc-lite\">{{ cont }}</li>\n </ng-container>\n } \n </ol>\n @if(bodyContent.length === 1 && !isTemplate) {\n <div style=\"margin-bottom: 10px; font-size: 13px;\" class=\"fc-lite\"> {{ bodyContent?.[0] }} </div>\n }\n <nxt-file-upload [allFiles]=\"uploadedFiles\" mode=\"edit\" [fileConfig]=\"fileRestrictions\" [dragAndDrop]=\"true\"\n (selectedFileData)=\"onFileSelected($event)\" [hideSubtext]=\"true\"\n (deletedFileData)=\"deleteFile($event)\">\n </nxt-file-upload>\n <div style=\"margin-bottom: 5px; font-size: 13px;\" class=\"fc-lite\"> \n @if(allowedFileTypes.length > 0) {\n Only support {{ allowedFileTypes.join(', ') }}\n }\n </div>\n </div>\n <!-- MR 18OCT26 Refactor action button styles to theme tokens -->\n <div class=\"file-modal-footer\">\n <nxt-button class=\"data-table-fsbtn\"\n (buttonClickEmit)=\"uploadFile()\" [btnTextColor]=\"'var(--fc-text-color, #ffffff)'\"\n [buttonDisable]=\"isLoading\"\n [btnBorder]=\"'1'\" [btnBorderColor]=\"'var(--border-color)'\"\n [btnBorderRadius]=\"'8'\" \n [buttonType]=\"'custom-btn'\" [isLoading]=\"isLoading\"\n [buttonValue]=\"'APP_HRM_EMPLOYEES_EMPLOYEES.SAVE' | customTranslate :'Save'\">\n </nxt-button>\n <nxt-button (buttonClickEmit)=\"close()\" [buttonValue]=\"'APP_HRM_EMPLOYEES_EMPLOYEES.CANCEL' | customTranslate :'Cancel'\"\n [btnBgColor]=\"'var(--comp-bg-color)'\" [btnTextColor]=\"'var(--fc-primary-color)'\" [btnBorder]=\"'1'\"\n [btnBorderColor]=\"'var(--border-color)'\" [btnBorderRadius]=\"'8'\"\n [buttonType]=\"'custom-btn'\">\n </nxt-button>\n </div>\n </div>\n</div>","export class Constants {\n // static SERVER_BASE_URL: string = \"http://arabic-api.rangerfusion.com\";\n // static SERVER_BASE_URL: string = \"https://dev-api.rangerfusion.com\"; // MR 26NOV24 Docker Compose Changes\n static SUCCESS_MESSAGE: string = \"Data saved successfully\";\n static DELETE_SUCCESS_MESSAGE: string = \"Data deleted successfully\";\n static APPROVE_MESSAGE: string = \"Approval request approved successfully\";\n static REJECT_MESSAGE: string = \"Approval request rejected successfully\";\n static DOWNLOAD_TEMPLATE: string = \"template downloaded successfully\";\n static PAGE_SIZE_OPTIONS: Array<any> = ['5', '10', '25', '50', '100', '200'];\n static leaveTypes: any[] = ['Casual leave', 'Sick leave', 'Maternity leave', 'Paternity leave', 'Marriage leave', 'Compensation Off', 'Loss of Pay', 'Compoff Leave'];\n static BASIC: string = 'Basic';\n static DA: string = 'Dearness Allowance'; //SK20JUN25 DA added\n static HRA: string = 'House Rent Allowance';\n static EPF: string = 'Employee Provident Fund';\n static VPF: string = 'Voluntary Provident Fund';\n static ESI: string = 'Employee State Insurance';\n static PT: string = 'Professional Tax';\n static TDS: string = 'TDS'; //SK28FEB26\n static EMPLOYER_PF: string = 'Employer Provident Fund';\n static EMPLOYER_ESI: string = \"Employer State Insurance\";\n static SD: string = \"Standard Deduction\";\n static EARNINGS: string = \"Earnings\";\n static ALLOWANCES: string = \"Allowances\";\n static DEDUCTIONS: string = \"Deductions\";\n static BENEFITS: string = \"Benefits\"; //SK18JUN24 to add benefits as separate component in compensation\n static FLEXI_BENEFITS: string = \"Flexi Benefits\"; //SK12JUN25 to add flexi benefits as separate component in compensation\n static REIMBURSEMENTS: string = \"Reimbursements\";\n static OTHER_INVESTMENTS: string = 'Other Investments and Exemptions'; //SK06MAY25\n static INCOME_FROM_OTHERSOUCES: string = 'Income from Other Sources';\n static LEAVE_TRAVEL_ALLOWANCE: string = 'Leave Travel Allowance'; //SK20JUN25\n static FOOD_COUPONS: string = 'Food Coupons'; //SK20JUN25\n static TELEPHONE_ALLOWANCE = 'Telephone Allowance'; //SK20JUN25\n\n // SK21AUG24 static modules in all apps\n static hrmStaticModules: Array<any> = [\"dashboard\", \"employees\", \"compensation\", \"payroll\", \"leaveAllocation\", \"attendance\", \"approvals\"];\n static essStaticModules: Array<any> = [\"dashboard\", \"details\", \"leaves\", \"expenses\", \"payslips\", \"taxdeclarations\"]\n // SKS29SEP26 Settings (/settings route) — company-level settings\n // MR 29OCT26 Integrate Theme Builder as a native module under Settings page architecture\n static settingsStaticModules: Array<any> = [\"company\", \"localization\", \"leaveMaster\", \"bankInfo\", \"time\", \"translation\", \"dropdownManagement\", \"theme-builder\", \"theme\", \"themeBuilder\"]\n // SKS29SEP26 Admin (/admin route) — super-user administrative configuration\n static adminStaticModules: Array<any> = [\"apps\", \"component\", \"components\"]\n static staticHRMEmployeesDetailsTabs = [\"basic\", \"work\", \"education\", \"experience\", \"documents\", \"dependents\", \"bank\", \"leaves\", \"expenses\", \"leaveAllocation\", \"compensation\", \"taxDeclaration\"] //SK19MAR25 static HRM employees details tabs\n static staticHRMPayrollTabs = [\"payroll\", \"forms\", \"settings\", \"taxDeclarations\", \"payslips\"] //SK31DEC25\n static staticApps = ['admin', 'hrm', 'settings', 'ess', 'nxt']\n\n static TRANSLATION: any = {\n \"en\": {\n \"SCREEN_DIRECTION\": \"ltr\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"Log in to your Account\",\n \"WELCOME_TEXT\": \"Welcome back!\",\n \"USER_NAME\": \"Username\",\n \"USER_NAME_PLACEHOLDER\": \"Enter Username\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_PLACEHOLDER\": \"Enter Password\",\n \"USER_NAME_ERROR\": \"Username is required\",\n \"PASSWORD_REQ_ERROR\": \"Password is required\",\n \"PASSWORD_ERROR\": \"Password must contain at least 6 characters\",\n \"LOGIN\": \"Login to Account\",\n \"LOGIN_LOAD\": \"Login\",\n \"BACK\": \"Back\",\n \"RESEND_LINK\": \"Resend Link\",\n \"FORGOT_PASSWORD\": \"Forgot Password\",\n \"PASSWORD_RESET\": \"Password Reset\",\n \"RESET_MAIL\": \"Please enter your registered Username to receive password reset instructions\", // SKS4AUG26 Prompt Username for password reset\n \"EMAIL_ADDRESS\": \"Email Address\",\n \"ENTER_EMAIL_ADDRESS\": \"Enter Email Address\",\n \"EMAIL_REQUIRED\": \"Email is required\",\n \"ENTER_VALID_EMAIL\": \"Enter a valid email\",\n \"SENDING\": \"Sending\",\n \"SEND_RESET_LINK\": \"Send link\",\n \"GO_BACK_TO_LOGIN\": \"Go back to Login\",\n \"EMAIL_SENT\": \"Email Sent\",\n \"CHECK_INBOX\": \"Check your inbox and open the link we sent to\",\n \"REMEMBER_PASS\": \"Remember Password\",\n \"DONT_HAVE_ACC\": \"Don't have an account?\",\n \"CREATE_AN_ACCOUNT\": \"Create an account\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"Register your Account\",\n \"WELCOME_TEXT\": \"Fill out the following to SignUp:\",\n \"FIRST_NAME\": \"First Name\",\n \"ENTER_FIRST_NAME\": \"Enter First Name\",\n \"FIRST_NAME_REQUIRED\": \"First Name is required\",\n \"LAST_NAME\": \"Last Name\",\n \"ENTER_LAST_NAME\": \"Enter Last Name\",\n \"LAST_NAME_REQUIRED\": \"Last Name is required\",\n \"EMAIL_ADDRESS\": \"Email Address\",\n \"ENTER_EMAIL_ADDRESS\": \"Enter Email Address\",\n \"EMAIL_ADDRESS_REQUIRED\": \"Email Address is required\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"Enter valid Email Address\",\n \"MOBILE_NUMBER\": \"Mobile Number\",\n \"ENTER_MOBILE_NUMBER\": \"Enter Mobile Number\",\n \"MOBILE_NUMBER_REQUIRED\": \"Mobile Number is required\",\n \"COUNTRY\": \"Country\",\n \"ENTER_COUNTRY\": \"Select Country\",\n \"COUNTRY_REQUIRED\": \"Country is required\",\n \"COMPANY_NAME\": \"Company Name\",\n \"ENTER_COMPANY_NAME\": \"Enter Company Name\",\n \"COMPANY_NAME_REQUIRED\": \"Company Name is required\",\n \"DESIGNATION\": \"Designation\",\n \"ENTER_ROLE\": \"Enter Role\",\n \"DESIGNATION_REQUIRED\": \"Designation is required\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"Enter a valid Mobile Number\",\n \"PASSWORD\": \"Password\",\n \"ENTER_PASSWORD\": \"Enter Password\",\n \"PASSWORD_REQUIRED\": \"Password is required\",\n \"PASSWORD_ERROR\": \"Password must contain at least 6 characters\",\n \"CONFIRM_PASSWORD\": \"Confirm Password\",\n \"ENTER_CONFIRM_PASSWORD\": \"Enter Confirm Password\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"Confirm Password is required\",\n \"PASSWORDS_MATCH\": \"Passwords do not match\",\n \"REGISTER_ACCOUNT\": \"Register a Account\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"Email Address Verification code\",\n \"RESEND_OTP_IN\": \"Resend OTP in\",\n \"RESEND_OTP\": \"Resend OTP\",\n \"CONFIRMATION_ACCOUNT\": \"Confirmation Account\",\n \"DO_HAVE_ACCOUNT\": \"Do you have an account?\",\n \"SIGN_IN\": \"Sign - In\",\n \"OTP_SENT_SUCCESSFULLY \": \"OTP sent successfully\",\n \"USER_ALREADY_EXISTS\": \"user already exists\",\n \"INTERNAL_SERVER_ERROR\": \"Internal Server Error\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"The OTP you entered is incorrect.\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"Registration Complete. Your account has been successfully created.\",\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"Welcome, Please login into your account\",\n \"USER_NAME\": \"Username/Email\",\n \"PASSWORD\": \"Password\",\n \"USER_NAME_ERROR\": \"Please enter a valid email address\",\n \"PASSWORD_ERROR\": \"Password must contain at least 6 characters\",\n \"LOGIN\": \"Login\",\n \"BACK\": \"Back\",\n \"RESEND_LINK\": \"Resend Link\",\n \"FORGOT_PASSWORD\": \"Forgot your Password?\",\n \"PASSWORD_RESET\": \"Password Reset\",\n \"RESET_MAIL\": \"Please enter your registered Username to receive password reset instructions.\",\n \"SEND_RESET_LINK\": \"Send link to email\",\n \"GO_BACK_TO_LOGIN\": \"Go back to Login\",\n \"EMAIL_SENT\": \"Email Sent\",\n \"CHECK_INBOX\": \"Check your inbox and open the link we sent to\",\n \"ENTER_NEW_PASSWORD\": \"Enter a new password\",\n \"NEW_PASSWORD\": \"New password\",\n \"CONFIRM_PASSWORD\": \"Confirm password\",\n \"PASSWORD_MISMATCH\": \"Password mismatch\",\n \"WELL_DONE\": \"Well Done!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"Your password has been changed successfully. Please use your new password to login!\",\n \"REMEMBER_ME\": \"Remember me\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"password changed successfully\",\n \"ENTER_CORRECT_PASSWORD\": \"Enter correct password\",\n \"INTERNAL_SERVER_ERROR\": \"Internal Server Error\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"Invalid link or link expired\",\n \"USER_DOES_NOT_EXIST\": 'User does not Exist',\n \"PASSWORD_RESET_SUCCESSFULLY\": \"password reset sucessfully\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"password reset link sent to your email account\"\n }\n },\n \"ar\": {\n \"SCREEN_DIRECTION\": \"rtl\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"تسجيل الدخول\",\n \"WELCOME_TEXT\": \"مرحبًا بك!\",\n \"USER_NAME\": \"اسم المستخدم\",\n \"USER_NAME_PLACEHOLDER\": \"أدخل الاسم\",\n \"PASSWORD\": \"كلمة المرور\",\n \"PASSWORD_PLACEHOLDER\": \"أدخل كلمة المرور\",\n \"USER_NAME_ERROR\": \"الاسم مطلوب\",\n \"PASSWORD_REQ_ERROR\": \"كلمة المرور مطلوبة\",\n \"PASSWORD_ERROR\": \"يجب أن تكون 6 أحرف على الأقل\",\n \"LOGIN\": \"تسجيل الدخول\",\n \"LOGIN_LOAD\": \"جارٍ الدخول\",\n \"BACK\": \"رجوع\",\n \"RESEND_LINK\": \"إعادة الإرسال\",\n \"FORGOT_PASSWORD\": \"نسيت كلمة المرور\",\n \"PASSWORD_RESET\": \"إعادة تعيين\",\n \"RESET_MAIL\": \"الرجاء إدخال اسم المستخدم المسجل الخاص بك لتلقي تعليمات إعادة تعيين كلمة المرور.\",\n \"EMAIL_ADDRESS\": \"البريد الإلكتروني\",\n \"ENTER_EMAIL_ADDRESS\": \"أدخل البريد\",\n \"EMAIL_REQUIRED\": \"البريد مطلوب\",\n \"ENTER_VALID_EMAIL\": \"أدخل بريدًا صحيحًا\",\n \"SENDING\": \"جارٍ الإرسال\",\n \"SEND_RESET_LINK\": \"إرسال الرابط\",\n \"GO_BACK_TO_LOGIN\": \"عودة للدخول\",\n \"EMAIL_SENT\": \"تم الإرسال\",\n \"CHECK_INBOX\": \"تحقق من بريدك\",\n \"REMEMBER_PASS\": \"تذكر كلمة المرور؟\",\n \"DONT_HAVE_ACC\": \"ليس لديك حساب؟\",\n \"CREATE_AN_ACCOUNT\": \"إنشاء حساب\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"تسجيل الحساب\",\n \"WELCOME_TEXT\": \"أكمل التسجيل:\",\n \"FIRST_NAME\": \"الاسم الأول\",\n \"ENTER_FIRST_NAME\": \"أدخل الاسم الأول\",\n \"FIRST_NAME_REQUIRED\": \"الاسم الأول مطلوب\",\n \"LAST_NAME\": \"الاسم الأخير\",\n \"ENTER_LAST_NAME\": \"أدخل الاسم الأخير\",\n \"LAST_NAME_REQUIRED\": \"الاسم الأخير مطلوب\",\n \"EMAIL_ADDRESS\": \"البريد الإلكتروني\",\n \"ENTER_EMAIL_ADDRESS\": \"أدخل البريد\",\n \"EMAIL_ADDRESS_REQUIRED\": \"البريد مطلوب\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"بريد غير صالح\",\n \"MOBILE_NUMBER\": \"رقم الجوال\",\n \"ENTER_MOBILE_NUMBER\": \"أدخل الجوال\",\n \"MOBILE_NUMBER_REQUIRED\": \"الجوال مطلوب\",\n \"COUNTRY\": \"الدولة\",\n \"ENTER_COUNTRY\": \"اختر الدولة\",\n \"COUNTRY_REQUIRED\": \"الدولة مطلوبة\",\n \"COMPANY_NAME\": \"اسم الشركة\",\n \"ENTER_COMPANY_NAME\": \"أدخل الشركة\",\n \"COMPANY_NAME_REQUIRED\": \"الشركة مطلوبة\",\n \"DESIGNATION\": \"المسمى الوظيفي\",\n \"ENTER_ROLE\": \"أدخل المسمى\",\n \"DESIGNATION_REQUIRED\": \"المسمى مطلوب\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"جوال غير صالح\",\n \"PASSWORD\": \"كلمة المرور\",\n \"ENTER_PASSWORD\": \"أدخل كلمة المرور\",\n \"PASSWORD_REQUIRED\": \"كلمة المرور مطلوبة\",\n \"PASSWORD_ERROR\": \"6 أحرف على الأقل\",\n \"CONFIRM_PASSWORD\": \"تأكيد كلمة المرور\",\n \"ENTER_CONFIRM_PASSWORD\": \"أدخل التأكيد\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"التأكيد مطلوب\",\n \"PASSWORDS_MATCH\": \"كلمات المرور غير متطابقة\",\n \"REGISTER_ACCOUNT\": \"تسجيل الحساب\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"رمز التحقق\",\n \"RESEND_OTP_IN\": \"إعادة الإرسال بعد\",\n \"RESEND_OTP\": \"إعادة الإرسال\",\n \"CONFIRMATION_ACCOUNT\": \"تأكيد الحساب\",\n \"DO_HAVE_ACCOUNT\": \"لديك حساب؟\",\n \"SIGN_IN\": \"تسجيل الدخول\",\n \"OTP_SENT_SUCCESSFULLY\": \"تم إرسال رمز التحقق بنجاح\",\n \"USER_ALREADY_EXISTS\": \"المستخدم موجود بالفعل\",\n \"INTERNAL_SERVER_ERROR\": \"خطأ في الخادم الداخلي\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"رمز التحقق الذي أدخلته غير صحيح.\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"اكتمل التسجيل. تم إنشاء حسابك بنجاح.\"\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"مرحبًا، سجل الدخول\",\n \"USER_NAME\": \"اسم المستخدم/البريد\",\n \"PASSWORD\": \"كلمة المرور\",\n \"USER_NAME_ERROR\": \"بريد غير صالح\",\n \"PASSWORD_ERROR\": \"6 أحرف على الأقل\",\n \"LOGIN\": \"تسجيل الدخول\",\n \"BACK\": \"رجوع\",\n \"RESEND_LINK\": \"إعادة الإرسال\",\n \"FORGOT_PASSWORD\": \"نسيت كلمة المرور؟\",\n \"PASSWORD_RESET\": \"إعادة تعيين\",\n \"RESET_MAIL\": \"الرجاء إدخال اسم المستخدم المسجل الخاص بك لتلقي تعليمات إعادة تعيين كلمة المرور.\",\n \"SEND_RESET_LINK\": \"إرسال الرابط\",\n \"GO_BACK_TO_LOGIN\": \"عودة للدخول\",\n \"EMAIL_SENT\": \"تم الإرسال\",\n \"CHECK_INBOX\": \"تحقق من بريدك\",\n \"ENTER_NEW_PASSWORD\": \"أدخل كلمة مرور جديدة\",\n \"NEW_PASSWORD\": \"كلمة مرور جديدة\",\n \"CONFIRM_PASSWORD\": \"تأكيد كلمة المرور\",\n \"PASSWORD_MISMATCH\": \"كلمات المرور غير متطابقة\",\n \"WELL_DONE\": \"تم بنجاح!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"تم التغيير بنجاح\",\n \"REMEMBER_ME\": \"تذكرني\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"تم تغيير كلمة المرور بنجاح\",\n \"ENTER_CORRECT_PASSWORD\": \"أدخل كلمة المرور الصحيحة\",\n \"INTERNAL_SERVER_ERROR\": \"خطأ في الخادم الداخلي\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"الرابط غير صالح أو انتهت صلاحيته\",\n \"USER_DOES_NOT_EXIST\": \"المستخدم غير موجود\",\n \"PASSWORD_RESET_SUCCESSFULLY\": \"تم إعادة تعيين كلمة المرور بنجاح\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"تم إرسال رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني\"\n }\n },\n \"ta\": {\n \"SCREEN_DIRECTION\": \"ltr\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"உங்கள் கணக்கில் உள்நுழைக\",\n \"WELCOME_TEXT\": \"திரும்ப வந்ததற்கு நன்றி!\",\n \"USER_NAME\": \"பயனர்பெயர்\",\n \"USER_NAME_PLACEHOLDER\": \"பயனர்பெயர் உள்ளிடுக\",\n \"PASSWORD\": \"கடவுச்சொல்\",\n \"PASSWORD_PLACEHOLDER\": \"கடவுச்சொல் உள்ளிடுக\",\n \"USER_NAME_ERROR\": \"பயனர்பெயர் தேவையானது\",\n \"PASSWORD_REQ_ERROR\": \"கடவுச்சொல் தேவையானது\",\n \"PASSWORD_ERROR\": \"6 எழுத்துகளுக்கு மேல் இருக்க வேண்டும்\",\n \"LOGIN\": \"உள்நுழைக\",\n \"LOGIN_LOAD\": \"உள்நுழைக\",\n \"BACK\": \"பின்செல்\",\n \"RESEND_LINK\": \"இணைப்பை மீண்டும் அனுப்பு\",\n \"FORGOT_PASSWORD\": \"கடவுச்சொல் மறந்துவிட்டீர்களா?\",\n \"PASSWORD_RESET\": \"கடவுச்சொல் மாற்றம்\",\n \"RESET_MAIL\": \"கடவுச்சொல் மீட்டமைப்பு வழிமுறைகளைப் பெற உங்கள் பதிவு செய்யப்பட்ட பயனர் பெயரை உள்ளிடவும்.\",\n \"EMAIL_ADDRESS\": \"மின்னஞ்சல்\",\n \"ENTER_EMAIL_ADDRESS\": \"மின்னஞ்சல் உள்ளிடுக\",\n \"EMAIL_REQUIRED\": \"மின்னஞ்சல் தேவையானது\",\n \"ENTER_VALID_EMAIL\": \"சரியான மின்னஞ்சல் உள்ளிடுக\",\n \"SENDING\": \"அனுப்புகிறது\",\n \"SEND_RESET_LINK\": \"இணைப்பு அனுப்பு\",\n \"GO_BACK_TO_LOGIN\": \"உள்நுழைவுக்கு செல்லவும்\",\n \"EMAIL_SENT\": \"மின்னஞ்சல் அனுப்பப்பட்டது\",\n \"CHECK_INBOX\": \"உங்கள் அஞ்சல்பெட்டியை சரிபார்க்கவும்\",\n \"REMEMBER_PASS\": \"கடவுச்சொல் ஞாபகம் இருக்கிறதா?\",\n \"DONT_HAVE_ACC\": \"கணக்கு இல்லையா?\",\n \"CREATE_AN_ACCOUNT\": \"கணக்கு உருவாக்குக\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"உங்கள் கணக்கை பதிவு செய்யவும்\",\n \"WELCOME_TEXT\": \"படிவத்தை பூர்த்தி செய்யவும்\",\n \"FIRST_NAME\": \"முதல் பெயர்\",\n \"ENTER_FIRST_NAME\": \"முதல் பெயர் உள்ளிடுக\",\n \"FIRST_NAME_REQUIRED\": \"முதல் பெயர் தேவையானது\",\n \"LAST_NAME\": \"கடைசி பெயர்\",\n \"ENTER_LAST_NAME\": \"கடைசி பெயர் உள்ளிடுக\",\n \"LAST_NAME_REQUIRED\": \"கடைசி பெயர் தேவையானது\",\n \"EMAIL_ADDRESS\": \"மின்னஞ்சல்\",\n \"ENTER_EMAIL_ADDRESS\": \"மின்னஞ்சல் உள்ளிடுக\",\n \"EMAIL_ADDRESS_REQUIRED\": \"மின்னஞ்சல் தேவையானது\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"சரியான மின்னஞ்சல் உள்ளிடுக\",\n \"MOBILE_NUMBER\": \"மொபைல் எண்\",\n \"ENTER_MOBILE_NUMBER\": \"மொபைல் எண் உள்ளிடுக\",\n \"MOBILE_NUMBER_REQUIRED\": \"மொபைல் எண் தேவையானது\",\n \"COMPANY_NAME\": \"நிறுவனத்தின் பெயர்\",\n \"ENTER_COMPANY_NAME\": \"நிறுவனத்தின் பெயர் உள்ளிடுக\",\n \"COMPANY_NAME_REQUIRED\": \"நிறுவனத்தின் பெயர் தேவையானது\",\n \"DESIGNATION\": \"பணி\",\n \"ENTER_ROLE\": \"பணியை உள்ளிடுக\",\n \"DESIGNATION_REQUIRED\": \"பணி தேவையானது\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"சரியான மொபைல் எண் உள்ளிடுக\",\n \"PASSWORD\": \"கடவுச்சொல்\",\n \"ENTER_PASSWORD\": \"கடவுச்சொல் உள்ளிடுக\",\n \"PASSWORD_REQUIRED\": \"கடவுச்சொல் தேவையானது\",\n \"PASSWORD_ERROR\": \"6 எழுத்துகளுக்கு மேல் இருக்க வேண்டும்\",\n \"CONFIRM_PASSWORD\": \"கடவுச்சொல் உறுதிப்படுத்துக\",\n \"ENTER_CONFIRM_PASSWORD\": \"கடவுச்சொல் உள்ளிடுக\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"உறுதிப்படுத்தல் தேவையானது\",\n \"PASSWORDS_MATCH\": \"கடவுச்சொல் பொருந்தவில்லை\",\n \"REGISTER_ACCOUNT\": \"கணக்கு பதிவு செய்யவும்\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"மின்னஞ்சல் சரிபார்ப்பு குறியீடு\",\n \"RESEND_OTP_IN\": \"OTP மீண்டும் அனுப்புக\",\n \"RESEND_OTP\": \"OTP மீண்டும் அனுப்பு\",\n \"CONFIRMATION_ACCOUNT\": \"கணக்கு உறுதிப்படுத்தல்\",\n \"DO_HAVE_ACCOUNT\": \"கணக்கு உள்ளதா?\",\n \"SIGN_IN\": \"உள்நுழை\",\n \"OTP_SENT_SUCCESSFULLY\": \"OTP வெற்றிகரமாக அனுப்பப்பட்டது\",\n \"USER_ALREADY_EXISTS\": \"பயனர் ஏற்கனவே உள்ளது\",\n \"INTERNAL_SERVER_ERROR\": \"உள் சேவையகத் தவறு\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"நீங்கள் உள்ளீட்ட OTP தவறானது.\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"பதிவு முடிந்தது. உங்கள் கணக்கு வெற்றிகரமாக உருவாக்கப்பட்டது.\"\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"உங்கள் கணக்கில் உள்நுழைக\",\n \"USER_NAME\": \"பயனர்பெயர்/மின்னஞ்சல்\",\n \"PASSWORD\": \"கடவுச்சொல்\",\n \"USER_NAME_ERROR\": \"சரியான மின்னஞ்சல் உள்ளிடுக\",\n \"PASSWORD_ERROR\": \"6 எழுத்துகளுக்கு மேல் இருக்க வேண்டும்\",\n \"LOGIN\": \"உள்நுழைக\",\n \"BACK\": \"பின்செல்\",\n \"RESEND_LINK\": \"இணைப்பை மீண்டும் அனுப்பு\",\n \"FORGOT_PASSWORD\": \"கடவுச்சொல் மறந்துவிட்டீர்களா?\",\n \"PASSWORD_RESET\": \"கடவுச்சொல் மாற்றம்\",\n \"RESET_MAIL\": \"கடவுச்சொல் மீட்டமைப்பு வழிமுறைகளைப் பெற உங்கள் பதிவு செய்யப்பட்ட பயனர் பெயரை உள்ளிடவும்.\",\n \"SEND_RESET_LINK\": \"இணைப்பு அனுப்பு\",\n \"GO_BACK_TO_LOGIN\": \"உள்நுழைவுக்கு செல்லவும்\",\n \"EMAIL_SENT\": \"மின்னஞ்சல் அனுப்பப்பட்டது\",\n \"CHECK_INBOX\": \"அஞ்சல்பெட்டியை சரிபார்க்கவும்\",\n \"ENTER_NEW_PASSWORD\": \"புதிய கடவுச்சொல் உள்ளிடுக\",\n \"NEW_PASSWORD\": \"புதிய கடவுச்சொல்\",\n \"CONFIRM_PASSWORD\": \"உறுதிப்படுத்தல்\",\n \"PASSWORD_MISMATCH\": \"பொருந்தவில்லை\",\n \"WELL_DONE\": \"அருமை!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"கடவுச்சொல் மாற்றம் வெற்றி\",\n \"REMEMBER_ME\": \"என்னை நினைவில் கொள்\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"கடவுச்சொல் வெற்றிகரமாக மாற்றப்பட்டது\",\n \"ENTER_CORRECT_PASSWORD\": \"சரியான கடவுச்சொல்லை உள்ளிடுங்கள்\",\n \"INTERNAL_SERVER_ERROR\": \"உள் சேவையகத் தவறு\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"தவறான இணைப்பு அல்லது இணைப்பு காலாவதியானது\",\n \"USER_DOES_NOT_EXIST\": \"பயனர் இல்லை\",\n \"PASSWORD_RESET_SUCCESSFULLY\": \"கடவுச்சொல் வெற்றிகரமாக மீட்டமைக்கப்பட்டது\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"உங்கள் மின்னஞ்சலுக்கு கடவுச்சொல் மீட்டமைப்பு இணைப்பு அனுப்பப்பட்டுள்ளது\"\n }\n },\n \"hi\": {\n \"SCREEN_DIRECTION\": \"ltr\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"खाते में लॉगिन करें\",\n \"WELCOME_TEXT\": \"वापसी पर स्वागत है!\",\n \"USER_NAME\": \"उपयोगकर्ता नाम\",\n \"USER_NAME_PLACEHOLDER\": \"उपयोगकर्ता नाम दर्ज करें\",\n \"PASSWORD\": \"पासवर्ड\",\n \"PASSWORD_PLACEHOLDER\": \"पासवर्ड दर्ज करें\",\n \"USER_NAME_ERROR\": \"उपयोगकर्ता नाम आवश्यक है\",\n \"PASSWORD_REQ_ERROR\": \"पासवर्ड आवश्यक है\",\n \"PASSWORD_ERROR\": \"पासवर्ड कम से कम 6 अक्षरों का होना चाहिए\",\n \"LOGIN\": \"लॉगिन करें\",\n \"LOGIN_LOAD\": \"लॉगिन\",\n \"BACK\": \"वापस\",\n \"RESEND_LINK\": \"लिंक फिर से भेजें\",\n \"FORGOT_PASSWORD\": \"पासवर्ड भूल गए\",\n \"PASSWORD_RESET\": \"पासवर्ड रीसेट\",\n \"RESET_MAIL\": \"पासवर्ड रीसेट निर्देश प्राप्त करने के लिए कृपया अपना पंजीकृत उपयोगकर्ता नाम दर्ज करें।\",\n \"EMAIL_ADDRESS\": \"ईमेल पता\",\n \"ENTER_EMAIL_ADDRESS\": \"ईमेल दर्ज करें\",\n \"EMAIL_REQUIRED\": \"ईमेल आवश्यक है\",\n \"ENTER_VALID_EMAIL\": \"मान्य ईमेल दर्ज करें\",\n \"SENDING\": \"भेज रहे हैं\",\n \"SEND_RESET_LINK\": \"लिंक भेजें\",\n \"GO_BACK_TO_LOGIN\": \"लॉगिन पर जाएं\",\n \"EMAIL_SENT\": \"ईमेल भेजा गया\",\n \"CHECK_INBOX\": \"इनबॉक्स चेक करें और लिंक खोलें\",\n \"REMEMBER_PASS\": \"पासवर्ड याद रखें\",\n \"DONT_HAVE_ACC\": \"खाता नहीं है?\",\n \"CREATE_AN_ACCOUNT\": \"खाता बनाएं\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"खाता रजिस्टर करें\",\n \"WELCOME_TEXT\": \"साइनअप के लिए जानकारी भरें:\",\n \"FIRST_NAME\": \"पहला नाम\",\n \"ENTER_FIRST_NAME\": \"पहला नाम दर्ज करें\",\n \"FIRST_NAME_REQUIRED\": \"पहला नाम आवश्यक है\",\n \"LAST_NAME\": \"अंतिम नाम\",\n \"ENTER_LAST_NAME\": \"अंतिम नाम दर्ज करें\",\n \"LAST_NAME_REQUIRED\": \"अंतिम नाम आवश्यक है\",\n \"EMAIL_ADDRESS\": \"ईमेल पता\",\n \"ENTER_EMAIL_ADDRESS\": \"ईमेल दर्ज करें\",\n \"EMAIL_ADDRESS_REQUIRED\": \"ईमेल आवश्यक है\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"मान्य ईमेल दर्ज करें\",\n \"MOBILE_NUMBER\": \"मोबाइल नंबर\",\n \"ENTER_MOBILE_NUMBER\": \"मोबाइल नंबर दर्ज करें\",\n \"MOBILE_NUMBER_REQUIRED\": \"मोबाइल नंबर आवश्यक है\",\n \"COMPANY_NAME\": \"कंपनी का नाम\",\n \"ENTER_COMPANY_NAME\": \"कंपनी का नाम दर्ज करें\",\n \"COMPANY_NAME_REQUIRED\": \"कंपनी का नाम आवश्यक है\",\n \"DESIGNATION\": \"पद\",\n \"ENTER_ROLE\": \"पद दर्ज करें\",\n \"DESIGNATION_REQUIRED\": \"पद आवश्यक है\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"मान्य मोबाइल नंबर दर्ज करें\",\n \"PASSWORD\": \"पासवर्ड\",\n \"ENTER_PASSWORD\": \"पासवर्ड दर्ज करें\",\n \"PASSWORD_REQUIRED\": \"पासवर्ड आवश्यक है\",\n \"PASSWORD_ERROR\": \"पासवर्ड कम से कम 6 अक्षरों का होना चाहिए\",\n \"CONFIRM_PASSWORD\": \"पासवर्ड पुष्टि\",\n \"ENTER_CONFIRM_PASSWORD\": \"पासवर्ड पुष्टि दर्ज करें\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"पासवर्ड पुष्टि आवश्यक है\",\n \"PASSWORDS_MATCH\": \"पासवर्ड मेल नहीं खा रहे\",\n \"REGISTER_ACCOUNT\": \"खाता रजिस्टर करें\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"ईमेल सत्यापन कोड\",\n \"RESEND_OTP_IN\": \"ओटीपी फिर से भेजें\",\n \"RESEND_OTP\": \"ओटीपी भेजें\",\n \"CONFIRMATION_ACCOUNT\": \"खाता पुष्टि\",\n \"DO_HAVE_ACCOUNT\": \"खाता है?\",\n \"SIGN_IN\": \"साइन इन करें\",\n \"OTP_SENT_SUCCESSFULLY\": \"ओटीपी सफलतापूर्वक भेजा गया\",\n \"USER_ALREADY_EXISTS\": \"उपयोगकर्ता पहले से मौजूद है\",\n \"INTERNAL_SERVER_ERROR\": \"आंतरिक सर्वर त्रुटि\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"आपके द्वारा दर्ज किया गया ओटीपी गलत है।\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"पंजीकरण पूर्ण हुआ। आपका खाता सफलतापूर्वक बना लिया गया है।\"\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"स्वागत है, लॉगिन करें\",\n \"USER_NAME\": \"उपयोगकर्ता नाम/ईमेल\",\n \"PASSWORD\": \"पासवर्ड\",\n \"USER_NAME_ERROR\": \"मान्य ईमेल दर्ज करें\",\n \"PASSWORD_ERROR\": \"पासवर्ड कम से कम 6 अक्षरों का होना चाहिए\",\n \"LOGIN\": \"लॉगिन करें\",\n \"BACK\": \"वापस\",\n \"RESEND_LINK\": \"लिंक फिर से भेजें\",\n \"FORGOT_PASSWORD\": \"पासवर्ड भूल गए?\",\n \"PASSWORD_RESET\": \"पासवर्ड रीसेट\",\n \"RESET_MAIL\": \"पासवर्ड रीसेट निर्देश प्राप्त करने के लिए कृपया अपना पंजीकृत उपयोगकर्ता नाम दर्ज करें।\",\n \"SEND_RESET_LINK\": \"लिंक भेजें\",\n \"GO_BACK_TO_LOGIN\": \"लॉगिन पर जाएं\",\n \"EMAIL_SENT\": \"ईमेल भेजा गया\",\n \"CHECK_INBOX\": \"इनबॉक्स चेक करें और लिंक खोलें\",\n \"ENTER_NEW_PASSWORD\": \"नया पासवर्ड दर्ज करें\",\n \"NEW_PASSWORD\": \"नया पासवर्ड\",\n \"CONFIRM_PASSWORD\": \"पासवर्ड पुष्टि\",\n \"PASSWORD_MISMATCH\": \"पासवर्ड मेल नहीं खा रहे\",\n \"WELL_DONE\": \"बधाई हो!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"पासवर्ड सफलतापूर्वक बदला गया\",\n \"REMEMBER_ME\": \"मुझे याद रखें\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"पासवर्ड सफलतापूर्वक बदला गया\",\n \"ENTER_CORRECT_PASSWORD\": \"कृपया सही पासवर्ड दर्ज करें\",\n \"INTERNAL_SERVER_ERROR\": \"आंतरिक सर्वर त्रुटि\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"लिंक अमान्य है या इसकी समय सीमा समाप्त हो गई है\",\n \"USER_DOES_NOT_EXIST\": \"उपयोगकर्ता मौजूद नहीं है\",\n \"PASSWORD_RESET_SUCCESSFULLY\": \"पासवर्ड सफलतापूर्वक रीसेट किया गया\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"पासवर्ड रीसेट लिंक आपके ईमेल पते पर भेजा गया है\"\n }\n }\n\n };\n /*\n static configJSON: Array<any> = [\n {eventName: 'parking', icon: '../assets/images/icons/app-launcher/ess.svg', access: true,\n roles : ['App User'],\n fromJSON: true,\n modules:{\n label: 'Parking',\n switchCaseName:'Parking',\n defaultModule: 'details',\n list: [\n {navName:'home', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Home', \n tabs:[\n {\n tabName:'Entries', \n path:'entries_button', \n type: 'nxtPage',\n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNxtButtonPage', \n apiCall: \"get\",\n endpoint : \"/nxt?name=a033t00000rRXl5AAG\",\n },\n \n },\n ]\n },\n {navName:'dashboard', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Dashboard', \n tabs:[\n {\n tabName:\"Today's Status\", \n path:'today_dashboard', \n type: 'dashboard',\n inputs: {\n endpoint: '/parking/dashboard',\n apiCall: 'post',\n metrics : {\n noncomparison : [\n {key:'currentDate', name:'currentDate', chart:'Pie', filterType: 'noncomparison', label: \"Today's Status\"},\n ],\n }\n }\n \n },\n {\n tabName:'Weekly Status', \n path:'weekly_dashboard', \n type: 'dashboard',\n inputs: {\n endpoint: '/parking/dashboard',\n apiCall: 'post',\n metrics : {\n noncomparison : [\n {key:'previousWeek', name:'previousWeek', chart:'Advanced Pie', filterType: 'noncomparison', label: 'Last Week Entries'},\n ],\n }\n }\n \n },\n {\n tabName:'Monthly Status', \n path:'monthly_dashboard', \n type: 'dashboard',\n inputs: {\n endpoint: '/parking/dashboard',\n apiCall: 'post',\n metrics : {\n noncomparison : [\n {key:'previousMonth', name:'previousMonth', chart:'Advanced Pie', filterType: 'noncomparison', label: 'Last Month Entries'},\n ],\n }\n }\n \n },\n ]\n },\n {navName:'employees', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Employees', \n tabs:[\n {\n tabName:'Employees', \n path:'parking_employees', \n type: 'table',\n inputs: {\n endpoint: '/parking/employees',\n apiCall: 'get',\n inputs :{},\n responseObject : true,\n responseObjectKey:'employees',\n responseArray : false,\n searchBar: true,\n headerLabels:['Employee Id', 'First Name', 'Last Name', 'Number Plate', 'Division'],\n displayedColumns:['employeeId', 'firstName', 'lastName', 'numberPlate', 'division'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Employee', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n type:'openNXTPage', \n pageContent:'a033t00000rRUKcAAO', \n modalTitle: 'New Employee',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/employees',\n successMessage:'Employee added succesfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n {navName:'entries', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Parking Entries', \n tabs:[\n { \n tabName:'Parking Entries', \n path:'parking_entries', \n type: 'table',\n inputs: {\n endpoint: '/parking/entries',\n apiCall: 'get',\n inputs :{},\n type : 'nxtGetCall',\n responseObject : true,\n responseObjectKey:'entries',\n responseArray : false,\n searchBar: true,\n headerLabels:['First Name', 'Last Name', 'Number Plate', 'Division', 'Parking Date', 'Parking Time', 'Parking ticket'],\n displayedColumns:['firstName', 'lastName', 'numberPlate', 'division', 'date','time', 'parkingTicket'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Entry', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n type:'openNXTPage', \n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n pageContent:'a033t00000rRTDpAAO',\n modalTitle: 'New Entry',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/entries',\n successMessage:'Parking entry added succesfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n {navName:'visitorLog', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Visitor Log', \n tabs:[\n { \n tabName:'Visitor Entries', \n path:'visitor_entries', \n type: 'table',\n inputs: {\n endpoint: '/parking/visitors',\n apiCall: 'get',\n inputs :{},\n type : 'nxtGetCall',\n responseObject : true,\n responseObjectKey:'visitors',\n responseArray : false,\n searchBar: true,\n headerLabels:['Employee Id', 'Visitor Name', 'Visit Purpose', 'Visit Date', 'Visitor Type', 'Visitor Id', 'Time In', 'Time Out', 'Signature'],\n displayedColumns:['employeeId', 'visitorName', 'visitPurpose', 'visitDate', 'visitorType', 'visitorId', 'timeIn', 'timeOut', 'signature'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Visitor', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n type:'openNXTPage', \n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n pageContent:'a033t00000rRUKwAAO',\n modalTitle: 'New Visitor Entry',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new-visitor',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/visitors',\n successMessage:'Visitor entry added successfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n {navName:'stationary', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Stationary Entries', \n tabs:[\n { \n tabName:'Stationary Entries', \n path:'stationary_entries', \n type: 'table',\n inputs: {\n endpoint: '/parking/stationaries',\n apiCall: 'get',\n inputs :{},\n type : 'nxtGetCall',\n responseObject : true,\n responseObjectKey:'stationaries',\n responseArray : false,\n searchBar: true,\n headerLabels:['Employee Id', 'Item Type', 'Item Details', 'Number of Items', 'Date & Time'],\n displayedColumns:['employeeId', 'itemType', 'itemDetails', 'noOfItems', 'date'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Stationary Entry', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n type:'openNXTPage', \n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n pageContent:'a033t00000rRUL1AAO',\n modalTitle: 'New Stationary Entry',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new-stationary ',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/stationaries',\n successMessage:'Stationary entry added succesfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n ]\n }\n }, \n ];\n */\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { Constants } from \"../../models/Constants\";\nimport { TranslateModule,TranslateService } from '@ngx-translate/core';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { MatTooltipModule } from '@angular/material/tooltip';\n@Component({\n selector: 'app-side-screen',\n standalone: true,\n imports: [AngularSvgIconModule, DropDownComponent,CommonModule,ReactiveFormsModule, MatCheckboxModule,FusionButtonComponent,TranslateModule,CustomTranslatePipe, MatTooltipModule],\n templateUrl: './side-screen.component.html',\n styleUrls: ['./side-screen.component.css']\n})\nexport class SideScreenComponent implements OnInit {\n\n @Input() headerTitle: string = '';\n @Input() onLoadData: any = \"\";\n @Input() buttonLoadingSpinner: boolean = false; // MY 15OCT26 save button loader input\n @Output() sideScreenEmittedEvent = new EventEmitter<{}>;\n\n selectedComponentType: string = 'Select';\n componentTypeList: Array<string | number> = [Constants.EARNINGS,Constants.DEDUCTIONS];\n nameList: Array<any> =[];\n addPayRollComponent!: FormGroup;\n selectedComp = 'Select';\n otherSection = 'Add Other';\n basicPay = Constants.BASIC;\n \n\n constructor(private formBuilder: FormBuilder) { \n this.addPayRollComponent = this.formBuilder.group({ // this will be the default data when user opens the side component to add a new salary-setting-component\n 'type': [\"\", [Validators.required]],\n 'name': [\"\", [Validators.required, Validators.pattern('^[a-zA-Z ]+$')]],\n 'nameInPaySlip': [\"\", [Validators.required]],\n 'payType': \"fixed\",\n 'proRataBasis': [\"regular\"],\n 'calculationType': 'flat',\n 'amount': '',\n 'isEmployerContribution': false,\n 'taxable': false,\n 'active': true,\n 'maxReimburse': 0,\n 'deductionFrequency': '',\n 'isExempted' : false,\n 'isVariablePay': [false], //SK15JUL24\n 'isPartOfCTC': [true],\n 'isFlexiBenefitComponent':false\n });\n }\n\n ngOnInit(): void {\n if(Object.keys(this.onLoadData).length > 0){\n this.selectedComponentType = this.onLoadData.type; // for the dropdown value \n this.selectedComp = this.onLoadData.name;\n // on editing the component, the dropdown values are listed based on component type\n if(this.onLoadData.type === Constants.EARNINGS){\n this.nameList = [this.basicPay, 'Bonus', Constants.DA, 'Commission', Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (this.onLoadData.type === Constants.ALLOWANCES){\n this.nameList = [Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (this.onLoadData.type === Constants.DEDUCTIONS){\n this.nameList = [Constants.PT, Constants.EPF, Constants.VPF, Constants.EMPLOYER_PF, Constants.TDS, Constants.ESI, Constants.EMPLOYER_ESI, this.otherSection];\n }\n \n this.addPayRollComponent.patchValue({\n 'type': this.onLoadData.type,\n 'name': this.onLoadData.name,\n 'nameInPaySlip': this.onLoadData.nameInPaySlip,\n 'payType': this.onLoadData.payType,\n 'proRataBasis': this.onLoadData.proRataBasis,\n 'calculationType': this.onLoadData.calculationType,\n 'amount': this.onLoadData.amount,\n 'isEmployerContribution': this.onLoadData.isEmployerContribution,\n 'taxable': this.onLoadData.taxable,\n 'active': this.onLoadData.active,\n 'maxReimburse': this.onLoadData.maxReimburse,\n 'deductionFrequency': this.onLoadData.deductionFrequency,\n 'isExempted' : this.onLoadData.isExempted,\n \"isVariablePay\": this.onLoadData?.isVariablePay, //SK15JUL24\n \"isPartOfCTC\": this.onLoadData?.isPartOfCTC, //SK20JUN25\n \"isFlexiBenefitComponent\":this.onLoadData?.isFlexiBenefitComponent, //SK20JUN25\n });\n }\n }\n\n dropdownEmitFunction(event: any, form:any){\n this.addPayRollComponent.controls[form].patchValue(event?.data);\n // should do patch value for the type dropdown\n // assigning the data to formcontrol based on the dropdown type selected\n this.selectedComp = 'Select';\n if(form === 'type'){\n this.selectedComponentType = event?.data;\n if(event?.data === Constants.EARNINGS){\n this.nameList = [this.basicPay, 'Bonus', 'Commission', Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (event?.data === Constants.ALLOWANCES){\n this.nameList = [Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (event?.data === Constants.DEDUCTIONS){\n this.nameList = [Constants.PT, Constants.EPF, Constants.VPF, Constants.EMPLOYER_PF, Constants.TDS, Constants.ESI, Constants.EMPLOYER_ESI, this.otherSection];\n } else if (event?.data === Constants.FLEXI_BENEFITS){ //SK20JUN25\n this.nameList = [Constants.LEAVE_TRAVEL_ALLOWANCE, Constants.FOOD_COUPONS, Constants.TELEPHONE_ALLOWANCE, this.otherSection];\n }\n } \n else if (form === 'name'){\n if(event?.data === this.otherSection){\n this.addPayRollComponent.controls['name'].patchValue('');\n }\n this.selectedComp = event?.data;\n if(event?.data === this.basicPay){\n this.addPayRollComponent.controls['calculationType'].patchValue('fixed');\n }\n }\n\n }\n\n submitPayRollComponent(){\n }\n\n prorataToggle($event: any){\n }\n\n // sending the form data to hrm component and sent to database\n hitPayrollSettingComponentApi($event: any){\n // MY 15OCT26 prevent submission while in loading state\n if (this.buttonLoadingSpinner) return;\n this.sideScreenEmittedEvent.emit({'formData': this.addPayRollComponent.value})\n }\n\n // MY 15OCT26 handle cancel button click with loading guard\n cancelSideScreen() {\n if (this.buttonLoadingSpinner) return;\n this.addPayRollComponent.reset();\n this.sideScreenEmittedEvent.emit({ open: false });\n }\n\n // SK20JUN25 radio emit for fixed/variable component changes\n radioEmit(formName: string, value: any){\n if(formName === \"isVariablePay\" && !value){\n this.addPayRollComponent.patchValue({\n \"isPartOfCTC\" : true\n })\n }\n }\n\n}\n","<!-- <div class=\"side-screen\">\n <div class=\"side-header\">\n <p class=\"flex content-space-between mb-0\">{{headerTitle}}\n <span class=\"close-icon\"><img src=\"../assets/images/icons/general/cross-icon.svg\" (click)=\"sideScreenEmittedEvent.emit({'open': false})\" style=\"cursor: pointer;\" class=\"svg-icon-white\"></span>\n </p>\n </div>\n <div class=\"side-content\"> -->\n <form class=\"addPayRollComponent\" [formGroup]=\"addPayRollComponent\" (ngSubmit)=\"submitPayRollComponent()\">\n <!-- <div class=\"scrollable-content\"> -->\n <div class=\"row\">\n <div class=\"col-md-10\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.COMPONENT_TYPE' | customTranslate : 'Component Type' }}<span style=\"color: var(--clr-error, #dc3545);\">*</span></label> \n <app-drop-down [lists]='componentTypeList' tabindex=\"1\" dropDownHeight=\"38px\" dropDownWidth=\"100%\" (dataEmit)=\"dropdownEmitFunction($event, 'type')\" [selectedData]=\"selectedComponentType\"></app-drop-down>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-10 mt-2\">\n <label class=\"label-txt\">{{'APP_HRM_PAYROLL_SETTINGS.COMPONENT_NAME' | customTranslate : 'Component Name' }}<span style=\"color: var(--clr-error, #dc3545);\">*</span></label>\n <app-drop-down [lists]=\"nameList\" tabindex=\"1\" dropDownHeight=\"38px\" dropDownWidth=\"100%\"\n (dataEmit)=\"dropdownEmitFunction($event, 'name')\" [selectedData]=\"selectedComp\">\n </app-drop-down>\n <div *ngIf=\"selectedComp === otherSection || selectedComp === 'Reimbursements' \" [class]=\"addPayRollComponent.controls['name'].invalid && addPayRollComponent.controls['name'].touched ? 'has-error' : '' \">\n <input [matTooltip]=\"'APP_HRM_PAYROLL_SETTINGS.COMPONENT_NAME_TOOL_TIP' | customTranslate : 'Underscores and Spaces are not allowed'\" type=\"text\" class=\"form-control\" tabindex=\"2\" [placeholder]=\"'APP_HRM_PAYROLL_SETTINGS.COMPONENT_NAME' | customTranslate : 'Component Name'\"\n aria-label=\"Text input with dropdown button\" formControlName=\"name\">\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['name'].invalid && addPayRollComponent.controls['name'].touched && addPayRollComponent.controls['name'].hasError('pattern') ? 'display: block' : 'display: none'\">{{ 'APP_HRM_PAYROLL_SETTINGS.VAL_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-10 mt-2\">\n <label class=\"label-txt\">{{'APP_HRM_PAYROLL_SETTINGS.NAME_IN_PAYSLIP' | customTranslate : 'Name in Payslip' }}<span style=\"color: var(--clr-error, #dc3545);\">*</span></label>\n <div [class]=\"addPayRollComponent.controls['nameInPaySlip'].invalid && addPayRollComponent.controls['nameInPaySlip'].touched ? 'has-error' : '' \">\n <input type=\"text\" class=\"form-control\" tabindex=\"3\" [placeholder]=\"'APP_HRM_PAYROLL_SETTINGS.NAME_IN_PAYSLIP' | customTranslate : 'Name in Payslip'\"\n aria-label=\"Text input with dropdown button\" formControlName=\"nameInPaySlip\">\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['nameInPaySlip'].invalid && addPayRollComponent.controls['nameInPaySlip'].touched ? 'display: block' : 'display: none' \">{{ 'APP_HRM_PAYROLL_SETTINGS.VAL_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n <!-- SK15JUL24 adding isVariable type -->\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['type'].value === 'Earnings'\">\n <div class=\"col-md-11 mt-2\">\n <!-- SK02JUN25 fixed and variable components added -->\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.PAY_TYPE' | customTranslate : 'Pay Type' }}</label>\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isVariablePay\" tabindex=\"12\"\n formControlName=\"isVariablePay\" [value]=\"false\" (click)=\"radioEmit('isVariablePay', false)\" />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.FIXED_COMPONENT' | customTranslate : 'Fixed Component' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isVariablePay\" tabindex=\"11\"\n formControlName=\"isVariablePay\" [value]=\"true\" (click)=\"radioEmit('isVariablePay', true)\"/>\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.VARIABLE_COMPONENT' | customTranslate : 'Variable Component' }}</span>\n </label>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['isVariablePay'].value === true || addPayRollComponent.controls['type'].value === 'Deductions'\">\n <div class=\"col-md-11 mt-2\">\n <!-- SK02JUN25 fixed and variable components added -->\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.IS_PART_OF_CTC' | customTranslate : 'Is Part of CTC' }}</label>\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isPartOfCTC\" tabindex=\"12\"\n formControlName=\"isPartOfCTC\" [value]=\"true\" />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.YES' | customTranslate : 'Yes' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isPartOfCTC\" tabindex=\"11\"\n formControlName=\"isPartOfCTC\" [value]=\"false\"/>\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.NO' | customTranslate : 'No' }}</span>\n </label>\n </div>\n </div>\n </div>\n <div class=\"show-only-if type-is-deduction\" *ngIf=\"addPayRollComponent.controls['type'].value == 'Allowances' || addPayRollComponent.controls['type'].value == 'Earnings' \" >\n <div class=\"col-md-11 mt-2\" *ngIf=\"addPayRollComponent.controls['isVariablePay'].value\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.FREQUENCY' | customTranslate : 'Frequency' }}</label>\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"proRataBasis\" tabindex=\"12\"\n formControlName=\"proRataBasis\" [value]=\"'regular'\" />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.REGULAR' | customTranslate : 'Regular' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"proRataBasis\" tabindex=\"11\"\n formControlName=\"proRataBasis\" [value]=\"'oneTime'\"/>\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.ONE_TIME' | customTranslate : 'One Time' }}</span>\n </label>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-11 mt-2\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.CALCULATION_TYPE' | customTranslate : 'Calculation Type' }}</label>\n <div class=\"flex flex-direction-row\">\n <div class=\"ms-4\">\n <label *ngIf=\"selectedComp !== basicPay \" class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"7\"\n formControlName=\"calculationType\" [value]=\"'flat'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.FLAT_AMOUNT' | customTranslate : 'Flat Amount' }}</span>\n </label>\n <label *ngIf=\"selectedComp !== basicPay \" class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"8\"\n formControlName=\"calculationType\" [value]=\"'percentage'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.PERCENTAGE_BASIC' | customTranslate : 'Percentage of Basic' }}</span>\n </label>\n <label *ngIf=\"selectedComp !== basicPay \" class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"8\"\n formControlName=\"calculationType\" [value]=\"'basicAndDA'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.PERCENTAGE_BASIC_DA' | customTranslate : 'Percentage of Basic and DA' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"9\"\n formControlName=\"calculationType\" [value]=\"'fixed'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.GROSS_PER' | customTranslate : 'Percentage of Gross' }}</span>\n </label>\n <!-- SK02JUN25 % of CTC added -->\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"9\"\n formControlName=\"calculationType\" [value]=\"'ctc'\"\n />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.CTC_PER' | customTranslate : 'Percentage of CTC' }}</span>\n </label>\n </div>\n </div>\n <p class=\"error-msg\" *ngIf=\"addPayRollComponent.controls['calculationType'].invalid && addPayRollComponent.controls['calculationType'].touched\">\n <span>\n <img src=\"../assets/images/icons/general/warning icon.svg\">{{ 'APP_HRM_PAYROLL_SETTINGS.REQUIRED_FIELD' | customTranslate : 'This field is required.' }}\n </span>\n </p>\n </div>\n </div>\n <!-- SK25AUG25 if it is one time componente, amount input will will be disabled -->\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['proRataBasis'].value != 'oneTime' \">\n <div class=\"col-md-10 mt-2\">\n <label class=\"label-txt\">Enter {{addPayRollComponent.controls['calculationType'].value == 'flat' ? 'Amount' : 'Percentage'}}</label>\n <div [class]=\"addPayRollComponent.controls['amount'].invalid && addPayRollComponent.controls['amount'].touched ? 'has-error' : '' \" class=\"flex flex-row\">\n <input type=\"number\" class=\"form-control\" tabindex=\"10\" placeholder=\"\" [ngClass]=\"{'w-25':(addPayRollComponent.controls['calculationType'].value == 'percentage' || addPayRollComponent.controls['calculationType'].value == 'fixed' || addPayRollComponent.controls['calculationType'].value == 'ctc')}\"\n aria-label=\"Text input with dropdown button\" formControlName=\"amount\">\n <div class=\"ms-2 flex\" style=\"align-items: center;\">\n <div class=\"label-txt\" *ngIf=\"addPayRollComponent.controls['calculationType'].value == 'percentage'\">{{ 'APP_HRM_PAYROLL_SETTINGS.OF_BASIC' | customTranslate : 'of Basic' }}</div>\n <div *ngIf=\"addPayRollComponent.controls['calculationType'].value == 'fixed'\">{{ 'APP_HRM_PAYROLL_SETTINGS.OF_GROSS' | customTranslate : 'of Gross' }}</div>\n <div *ngIf=\"addPayRollComponent.controls['calculationType'].value == 'ctc'\">{{ 'APP_HRM_PAYROLL_SETTINGS.OF_CTC' | customTranslate : 'of CTC' }}</div>\n </div>\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['amount'].invalid && addPayRollComponent.controls['amount'].touched ? 'display: block' : 'display: none' \">{{ 'APP_HRM_PAYROLL_SETTINGS.ENTER_VALID_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n </div>\n <!-- <div class=\"show-only-if type-is-allowance-or-earnings\" *ngIf=\"addPayRollComponent.controls['type'].value == 'Deductions'\">\n <div class=\"row\">\n <div class=\"col-md-11 mt-2 pe-0\">\n <label class=\"label-txt\">Deduction frequency</label>\n <div class=\"flex flex-direction-row\">\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"deductionFrequency\" tabindex=\"4\"\n formControlName=\"deductionFrequency\" [value]=\"'recurring'\"\n />\n <span class=\"radio-text\">Recurring</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"deductionFrequency\" tabindex=\"5\"\n formControlName=\"deductionFrequency\" [value]=\"'one-time'\"\n />\n <span class=\"radio-text\">One time deduction</span>\n </label>\n </div>\n </div>\n <p class=\"error-msg\" *ngIf=\"addPayRollComponent.controls['deductionFrequency'].invalid && addPayRollComponent.controls['deductionFrequency'].touched\">\n <span>\n <img src=\"../assets/images/icons/general/warning icon.svg\">This field is required.\n </span>\n </p>\n </div>\n </div>\n </div> -->\n <div class=\"show-only-if type-is-allowance-or-reimbursements\" *ngIf=\"addPayRollComponent.controls['type'].value == 'Reimbursements'\">\n <div class=\"row\">\n <div class=\"col-md-11 mt-2 pe-0\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.MAX_REIMBURSABLE_AMT' | customTranslate : 'Maximum Reimbursable Amount' }}</label>\n <div [class]=\"addPayRollComponent.controls['maxReimburse'].invalid && addPayRollComponent.controls['maxReimburse'].touched ? 'has-error' : '' \">\n <input type=\"text\" class=\"form-control\" tabindex=\"4\" placeholder=\"1000\"\n aria-label=\"Text input with dropdown button\" formControlName=\"maxReimburse\">\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['maxReimburse'].invalid && addPayRollComponent.controls['maxReimburse'].touched ? 'display: block' : 'display: none' \">{{ 'APP_HRM_PAYROLL_SETTINGS.ENTER_VALID_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n </div>\n <!-- SK20JUN25flexi benefit added -->\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['type'].value === 'Earnings' \">\n <div class=\"col-md-11 mt-2\">\n <mat-checkbox formControlName=\"isFlexiBenefitComponent\" tabindex=\"10\"><p class=\"label-txt mb-0\">{{'APP_HRM_PAYROLL_SETTINGS.IS_FLEXI_BENEFIT' | customTranslate : \"Is Flexi Benefit Component\" }}</p></mat-checkbox>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['type'].value === 'Deductions' \">\n <div class=\"col-md-11 mt-2\">\n <mat-checkbox formControlName=\"isEmployerContribution\" tabindex=\"10\"><p class=\"label-txt mb-0\">{{'APP_HRM_PAYROLL_SETTINGS.IS_EMPLOYERS_CONTRIBUTION' | customTranslate : \"Is Employer's contribution\" }}</p></mat-checkbox>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-11 mt-2\">\n <!-- SK28FEB26 changes from 'Taxable' to 'Tax Exempted', so what components are exempted from tax is checked -->\n <mat-checkbox formControlName=\"taxable\" tabindex=\"13\" ><p class=\"label-txt mb-0\">{{ 'APP_HRM_PAYROLL_SETTINGS.TAXABLE_EXEMPTED' | customTranslate : 'Tax Exempted' }}</p></mat-checkbox>\n </div>\n </div>\n <div *ngIf=\"addPayRollComponent.controls['taxable'].value == true && addPayRollComponent.controls['type'].value == 'Deductions'\">\n <div class=\"row\">\n <div class=\"col-md-11 mt-2 pe-0\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.UNDER_NEW_TAX' | customTranslate : 'Is Exempted under New Tax Regime' }}</label>\n <div class=\"flex flex-direction-row\">\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isExempted\" tabindex=\"13\"\n formControlName=\"isExempted\" [value]=\"true\"\n />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.YES' | customTranslate : 'Yes' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isExempted\" tabindex=\"14\"\n formControlName=\"isExempted\" [value]=\"false\"\n />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.NO' | customTranslate : 'No' }}</span>\n </label>\n <!-- <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isExempted\" tabindex=\"14\"\n formControlName=\"isExempted\" [value]=\"'bothRegime'\"\n />\n <span class=\"radio-text\">Both</span>\n </label> -->\n </div>\n </div>\n <p class=\"error-msg\" *ngIf=\"addPayRollComponent.controls['deductionFrequency'].invalid && addPayRollComponent.controls['deductionFrequency'].touched\">\n <span>\n <img src=\"../assets/images/icons/general/warning icon.svg\">{{ 'APP_HRM_PAYROLL_SETTINGS.REQUIRED_FIELD' | customTranslate : 'This field is required.' }}\n </span>\n </p>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-11 mt-2\">\n <mat-checkbox formControlName=\"active\" tabindex=\"15\"><p class=\"label-txt mb-0\">{{ 'APP_HRM_PAYROLL_SETTINGS.MARK_AS_ACTIVE' | customTranslate : 'Mark this as Active' }}</p></mat-checkbox>\n </div>\n </div>\n <!-- MY 15OCT26 support button loader on save button and disable buttons while loading -->\n <div class=\"button-wrapper flex text-right mb-5\">\n <app-fusion-button [buttonLoadingSpinner]=\"buttonLoadingSpinner\" [buttonDisable]=\"!addPayRollComponent.valid || buttonLoadingSpinner\" [buttonType]=\"'ms-2 side-save-component'\" [tabIndex]=\"12\" buttonValue=\"{{ 'APP_HRM_PAYROLL_SETTINGS.SAVE' | customTranslate : 'Save' }}\" (buttonClickEmit)=\"hitPayrollSettingComponentApi($event)\"></app-fusion-button>\n <app-fusion-button [buttonDisable]=\"buttonLoadingSpinner\" [buttonType]=\"'text-only side-cancel-component'\" [tabIndex]=\"13\" buttonValue=\"{{ 'APP_HRM_PAYROLL_SETTINGS.CANCEL' | customTranslate : 'Cancel' }}\" (buttonClickEmit)=\"cancelSideScreen()\"></app-fusion-button>\n </div>\n </form>\n <!-- </div>\n</div> -->","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\n\n@Component({\n selector: 'app-common-screen',\n standalone: true,\n imports: [CommonModule, AngularSvgIconModule],\n templateUrl: './common-screen.component.html',\n styleUrls: ['./common-screen.component.css']\n})\nexport class CommonScreenComponent implements OnInit {\n\n @Input() headerTitle: string = '';\n @Input() dynamicScreenStyle = ''; //SK30JAN25 dynamic style for right nav\n @Output() sideScreenEmittedEvent = new EventEmitter<{}>;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","<div class=\"side-screen\" [style]=\"dynamicScreenStyle\">\n <div class=\"side-header\">\n <p class=\"flex content-space-between mb-0\">{{headerTitle}}\n <span class=\"close-icon\"><img src=\"../assets/images/icons/general/cross-icon.svg\" (click)=\"sideScreenEmittedEvent.emit({'open': false})\" style=\"cursor: pointer; height: 25px; width: 25px;\" class=\"svg-icon-white\"></span>\n </p>\n </div>\n <div class=\"side-content\">\n <div class=\"scrollable-content\">\n <ng-content select=\".side-main-content\"></ng-content>\n </div>\n </div>\n</div>","import { Component, EventEmitter, Input, Output, Optional } from '@angular/core';\nimport { CommonScreenComponent } from '../common-screen/common-screen.component';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { CustomTranslatePipe } from \"../../../pipes/custom-translate.pipe\";\n\n// MR 02NOV26 ApprovalScreenComponent in @rangertechnologies/fusion-ui\n@Component({\n selector: 'app-approval-screen',\n standalone: true,\n imports: [CommonScreenComponent, CommonModule, CustomTranslatePipe],\n providers: [DatePipe],\n templateUrl: './approval-screen.component.html',\n styleUrl: './approval-screen.component.css'\n})\nexport class ApprovalScreenComponent {\n constructor(@Optional() private datePipe?: DatePipe) {}\n @Input() infoData : any;\n @Input() hideFields : Array<any> = []; //SK10OCT25 to hide fields on approval managers side nav\n @Output() approve = new EventEmitter();\n sideScreenEmitted(){\n this.approve.emit();\n }\n}\n","<app-common-screen headerTitle=\"Approval Details\" (sideScreenEmittedEvent)=\"sideScreenEmitted()\">\n <div class=\"side-main-content container\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <!-- Approval Info -->\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.NAME' | customTranslate : 'Name'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.name }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.status === 'Approved', \n 'bg-warning': infoData.status === 'Pending',\n 'bg-danger': infoData.status === 'Rejected'}\">\n {{ infoData.status }}</span>\n </div>\n </div>\n <div class=\"row mb-3\" *ngIf=\"!hideFields.includes('leaveStatus')\">\n <!-- SK21DEC24 to add Approval status in side screen-->\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_STATUS' | customTranslate : 'Approval Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.leaveStatus === 'Approved', \n 'bg-warning': infoData.leaveStatus === 'Pending',\n 'bg-danger': infoData.leaveStatus === 'Rejected'}\">\n {{ infoData.leaveStatus || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.REASON' | customTranslate : 'Reason'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.reason }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.TYPE' | customTranslate : 'Type'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.type }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPLIED_ON' | customTranslate : 'Applied On'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.appliedOn | date:'short' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVED_COUNT' | customTranslate : 'Approved Count'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.approvedCount }}</div>\n </div>\n </div>\n </div>\n \n <!-- Approval Managers -->\n <!-- SK03DEC24 show approval managers list only if applicable -->\n <h3 *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"text-center mb-3 mt-4\" style=\"font-size: 20px\">{{'APP.APPROVAL_MANAGERS' | customTranslate : 'Approval Managers'}}</h3>\n <ul *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"list-group mt-4\">\n <li *ngFor=\"let manager of infoData.approvalManagers\" class=\"list-group-item\">\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_ID' | customTranslate : 'Employee ID'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.employeeId }}</div>\n </div>\n <div class=\"row mb-3\">\n <!-- SK10DEC24 to show manager name -->\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_NAME' | customTranslate : 'Employee Name'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.name }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_ORDER' | customTranslate : 'Approval Order'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.approvalOrder }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': manager.status === 'Approved', \n 'bg-warning': manager.status === 'Pending',\n 'bg-danger': manager.status === 'Rejected'}\">\n {{ manager.status }}\n </span>\n </div>\n </div>\n <div class=\"row mb-3\" *ngIf=\"manager.viewedOn\">\n <div class=\"col-6 text-start\">{{'APP.VIEWED_ON' | customTranslate : 'Viewed On'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.viewedOn | date:'short' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.IS_OPTIONAL' | customTranslate : 'Is Optional'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.isOptional ? \"Yes\" : \"No\" }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.COMMENTS' | customTranslate : 'Comments'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.rejectionReason }}</div>\n </div>\n </li>\n </ul>\n </div>\n \n \n \n </app-common-screen>","// MR 02NOV26 Internal Browse placeholder for FormsComponent modal in @rangertechnologies/fusion-ui\nimport { Component, OnInit, Input, Output, EventEmitter } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\n\n@Component({\n selector: \"app-browse\",\n standalone: true,\n imports: [CommonModule],\n template: `<div class=\"mfe-browse-placeholder\" *ngIf=\"false\"></div>`\n})\nexport class BrowseComponent implements OnInit {\n @Input() selectedEmployee: any;\n @Input() employeeFinanceInfo: any;\n @Input() employeeLeaves: any;\n @Input() employeeExpenses: any;\n @Input() nxtJSON: any;\n @Input() bookValue: any;\n @Input() languageCode: any;\n @Input() bookletId: any;\n @Input() dataPatchProperties: any;\n @Input() nxtEdit: boolean = false;\n @Input() staticComp = false;\n @Input() nxtFormBuilder = false;\n @Input() type = \"\";\n @Input() broadcast = false;\n @Input() isPDFPreview = false;\n @Input() dashboardBuilder: any;\n @Input() allData: any;\n @Input() isLoading: any;\n @Input() componentJson: any;\n @Input() modalProperties: any;\n @Input() buttons: any;\n\n @Output() nxtFormHandlerEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() formEditEvent: EventEmitter<any> = new EventEmitter<any>();\n @Output() nxtButtonHandlerEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() handleCalendarDateEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() handleCalendarEventDateEmit: EventEmitter<any> = new EventEmitter<any>();\n\n ngOnInit(): void {}\n}\n\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LoaderService {\n private loadingStates: { [componentId: string]: string[] } = {};\n private loadingSubject = new BehaviorSubject<{ [componentId: string]: string[] }>({});\n loading = this.loadingSubject.asObservable();\n nxtLoaderId: any =[]\n\n private emitState() {\n //SKS2SEP25 Always emit a deep copy so subscribers detect changes\n const clonedState = Object.keys(this.loadingStates).reduce((acc, key) => {\n acc[key] = [...this.loadingStates[key]];\n return acc;\n }, {} as Record<string, string[]>);\n\n this.loadingSubject.next(clonedState);\n }\n\n show(componentId: string, requestId: string) {\n if (!this.loadingStates[componentId]) {\n this.loadingStates[componentId] = [];\n }\n\n this.loadingStates[componentId] = [...this.loadingStates[componentId], requestId];\n this.emitState();\n }\n\n hide(componentId: string, requestId: string) {\n if (this.loadingStates[componentId]) {\n const index = this.loadingStates[componentId].indexOf(requestId);\n if (index !== -1) {\n this.loadingStates[componentId] = [\n ...this.loadingStates[componentId].slice(0, index),\n ...this.loadingStates[componentId].slice(index + 1)\n ];\n }\n\n if (this.loadingStates[componentId].length === 0) {\n delete this.loadingStates[componentId];\n }\n\n this.emitState();\n }\n }\n // SKS4SEP25 nxt form action button loader \n nxtLoader(id:any){\n if(this.nxtLoaderId.includes(id)) return\n this.nxtLoaderId.push(id)\n }\n // SKS4SEP25 nxt form action button id get \n getNxtLoader(){\n return this.nxtLoaderId\n }\n isLoading(componentId: string): boolean {\n return !!this.loadingStates[componentId]?.length;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AlertService {\n private static instance: AlertService | null = null;\n\n constructor(private translate: TranslateService) {\n AlertService.instance = this;\n }\n\n // Observable string sources\n private passType = new Subject<any>();\n\n // Observable string streams\n passAlertType$ = this.passType.asObservable();\n messageData!:{}\n\n // Service message commands\n messageOnPass(condition: string, message: any, keys?: any, defaultMessage?:any) {\n let finalMessage = this.translateMessage(message, keys )\n if(`RESPONSE_MESSAGE.${message}` === finalMessage || message === finalMessage){\n finalMessage = defaultMessage || message\n }\n this.messageData = {\n type: condition,\n message: finalMessage\n };\n this.passType.next(this.messageData);\n }\n\n // MR 01AUG26 allows route config error paths (non-DI context) to show app alerts.\n static messageOnPassStatic(condition: string, message: any, keys?: any, defaultMessage?: any) {\n if (AlertService.instance) {\n AlertService.instance.messageOnPass(condition, message, keys, defaultMessage);\n return;\n }\n\n // Fallback if service isn't initialized yet.\n const fallbackMessage = defaultMessage || message || 'Something went wrong';\n window.alert(fallbackMessage);\n }\n \n\n // Service message commands\n messageOnFetch(condition: string, identifier: string, message:any, keys?:any, defaultMessage?:any){\n let finalMessage = this.translateMessage(message, keys )\n if(`RESPONSE_MESSAGE.${message}` === finalMessage || message === finalMessage){\n finalMessage = defaultMessage || message\n }\n this.messageData = {\n type: condition,\n fetchId: identifier,\n message: finalMessage\n }\n this.passType.next(this.messageData);\n }\n\n translateMessage(message: any,keys?: any ){\n // If message is all uppercase, treat it as a translation key\n if (message === message.toUpperCase()) {\n message = this.translate.instant(`RESPONSE_MESSAGE.${message}`);\n }\n \n const regex = /\\{\\{(.*?)\\}\\}/g;\n const matches = [...message.matchAll(regex)].map(m => m[1]);\n \n let finalMessage = message;\n if (matches.length > 0 && keys !== undefined) {\n if (Array.isArray(keys)) {\n matches.forEach((key, index) => {\n const raw = keys[index] !== undefined ? keys[index] : '';\n const translated = this.translate.instant(`${key}.${raw}`);\n const value = translated !== `${key}.${raw}` ? translated : raw;\n const keyRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n finalMessage = finalMessage.replace(keyRegex, value);\n });\n } else if (typeof keys === 'string') {\n matches.forEach((key) => {\n const translated = this.translate.instant(`${key}.${keys}`);\n const value = translated !== `${key}.${keys}` ? translated : keys;\n const keyRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n finalMessage = finalMessage.replace(keyRegex, value);\n });\n } else if (typeof keys === 'object' && keys !== null) {\n matches.forEach((key) => {\n const raw = keys[key] !== undefined ? keys[key] : '';\n const translated = this.translate.instant(`${key}.${raw}`);\n const value = translated !== `${key}.${raw}` ? translated : raw;\n const keyRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n finalMessage = finalMessage.replace(keyRegex, value);\n });\n }\n }\n return finalMessage\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AlertService } from './alert.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ErrorHandlerService {\n public errorMessage: any = '';\n public transKeys: any;\n\n constructor(private router: Router, private alertService: AlertService) { }\n\n public handleError = (error: HttpErrorResponse) => {\n if (error.status === 500) {\n this.handle500Error(error);\n }\n else if (error.status === 404) {\n this.handle404Error(error)\n }\n else {\n this.handleOtherError(error);\n }\n }\n\n private handle500Error = (error: HttpErrorResponse) => {\n this.createErrorMessage(error);\n // this.router.navigate(['/500']);\n }\n\n private handle404Error = (error: HttpErrorResponse) => {\n this.createErrorMessage(error);\n // this.router.navigate(['/404']);\n }\n private handleOtherError = (error: HttpErrorResponse) => {\n this.createErrorMessage(error); //TODO: this will be fixed later; \n }\n\n // MY 27OCT26 Helper to extract user-facing message and transKey from any backend payload or string\n private extractMessageFromPayload(payload: any): { message: string; transKey: any } {\n let message = '';\n let transKey: any = null;\n\n if (!payload) {\n return { message, transKey };\n }\n\n // If payload is a string, check if it's JSON or plain text\n if (typeof payload === 'string') {\n const trimmed = payload.trim();\n if ((trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'))) {\n try {\n payload = JSON.parse(trimmed);\n } catch {\n if (!trimmed.startsWith('Http failure response for ')) {\n message = trimmed;\n }\n return { message, transKey };\n }\n } else {\n if (!trimmed.startsWith('Http failure response for ')) {\n message = trimmed;\n }\n return { message, transKey };\n }\n }\n\n if (payload && typeof payload === 'object') {\n if (typeof payload.message === 'string' && payload.message.trim() && !payload.message.startsWith('Http failure response for ')) {\n message = payload.message.trim();\n } else if (typeof payload.error === 'string' && payload.error.trim()) {\n message = payload.error.trim();\n } else if (payload.error && typeof payload.error === 'object') {\n const nestedMsg = payload.error.message || payload.error.error || '';\n if (typeof nestedMsg === 'string' && nestedMsg.trim() && !nestedMsg.startsWith('Http failure response for ')) {\n message = nestedMsg.trim();\n }\n } else if (typeof payload.msg === 'string' && payload.msg.trim()) {\n message = payload.msg.trim();\n }\n\n transKey = payload.TRANS_KEY || payload?.error?.TRANS_KEY || null;\n }\n\n return { message, transKey };\n }\n\n // MY 27OCT26 Extract exact error message from backend HttpErrorResponse payload or fallback cleanly\n private createErrorMessage = (error: HttpErrorResponse | any) => {\n let message: string = '';\n let transKey: any = null;\n let statusText: string = '';\n let status: number | null = null;\n\n // 1. Check if error itself is a string\n if (typeof error === 'string') {\n const extracted = this.extractMessageFromPayload(error);\n message = extracted.message;\n transKey = extracted.transKey;\n }\n\n // 2. Check direct backend payload on HttpErrorResponse (error.error)\n if (!message && error?.error) {\n const extracted = this.extractMessageFromPayload(error.error);\n message = extracted.message;\n transKey = extracted.transKey || transKey;\n }\n\n // Capture direct status & statusText if present\n if (error?.statusText && error.statusText !== 'Unknown Error' && error.statusText !== 'OK') {\n statusText = error.statusText;\n }\n if (error?.status) {\n status = error.status;\n }\n\n // 3. Check error.message (e.g. from ApiService new Error(JSON.stringify(error)))\n if (!message && typeof error?.message === 'string') {\n try {\n const parsed = JSON.parse(error.message);\n if (parsed && typeof parsed === 'object') {\n // If parsed object has an .error property (standard for serialized HttpErrorResponse), inspect it FIRST\n if (parsed.error) {\n const extracted = this.extractMessageFromPayload(parsed.error);\n message = extracted.message;\n transKey = extracted.transKey || transKey;\n }\n\n // If no message in parsed.error, inspect parsed itself (e.g. if parsed was { message: '...' })\n if (!message) {\n const extracted = this.extractMessageFromPayload(parsed);\n message = extracted.message;\n transKey = extracted.transKey || transKey;\n }\n\n // Extract status / statusText from parsed serialized HttpErrorResponse if not already set\n if (!statusText && parsed.statusText && parsed.statusText !== 'Unknown Error' && parsed.statusText !== 'OK') {\n statusText = parsed.statusText;\n }\n if (!status && parsed.status) {\n status = parsed.status;\n }\n if (!transKey) {\n transKey = parsed.TRANS_KEY || parsed?.error?.TRANS_KEY || null;\n }\n }\n } catch {\n // Not a JSON string - standard JS Error\n if (!error.message.startsWith('Http failure response for ')) {\n message = error.message;\n }\n }\n }\n\n // 4. Fallback if no specific business message was found\n if (!message) {\n if (statusText) {\n message = statusText;\n } else if (status) {\n message = `Error ${status}: Something went wrong`;\n } else {\n message = 'Something went wrong';\n }\n }\n\n // Guard: Guarantee that raw \"Http failure response for ...\" is NEVER surfaced\n if (message.startsWith('Http failure response for ')) {\n message = statusText || (status ? `Error ${status}: Something went wrong` : 'Something went wrong');\n }\n\n this.errorMessage = message;\n this.transKeys = transKey;\n this.alertService.messageOnPass('error', this.errorMessage || 'error', this.transKeys);\n }\n}","// MR 02NOV26 TabDataService for Payroll MFE\nimport { Injectable } from \"@angular/core\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class TabDataService {\n private cache: Map<string, any> = new Map();\n private nxtBooks: Map<string, any> = new Map();\n\n constructor() {}\n\n getCachedData(tabName: string, componentId: string): any {\n const key = `${tabName}_${componentId}`;\n return this.cache.get(key) || null;\n }\n\n setCachedData(tabName: string, data: any, componentId: string): void {\n const key = `${tabName}_${componentId}`;\n this.cache.set(key, data);\n }\n\n getNxtBook(endpoint: string): any {\n return this.nxtBooks.get(endpoint) || null;\n }\n\n setNxtBook(endpoint: string, book: any): void {\n this.nxtBooks.set(endpoint, book);\n }\n\n clearCache(): void {\n this.cache.clear();\n this.nxtBooks.clear();\n }\n}\n","import { CommonModule, DatePipe } from '@angular/common';\nimport { ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { NxtAppModule } from '@rangertechnologies/ngnxt';\nimport { LangChangeEvent, TranslateService } from '@ngx-translate/core';\nimport { LoaderService } from \"../../services/loading.service\";\nimport { GlobalValuesService } from \"../../services/global-values.service\";\nimport { ApiService } from \"../../services/api.service\";\nimport { BrowseComponent } from '../browse/browse.component';\nimport { ModalComponent } from '../modal/modal.component';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { AlertService } from \"../../services/alert.service\";\nimport { ErrorHandlerService } from \"../../services/error-handler.service\";\nimport { ConfigService } from \"../../services/config.service\";\nimport { saveAs } from 'file-saver';\nimport { TabDataService } from \"../../services/tab-data.service\";\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'app-forms',\n imports: [CommonModule, CustomTranslatePipe, FusionButtonComponent, NxtAppModule, BrowseComponent, ModalComponent, DropDownComponent, AngularSvgIconModule, FusionButtonComponent],\n templateUrl: './forms.component.html',\n styleUrl: './forms.component.css'\n})\nexport class FormsComponent {\n formJson: any\n tabs: Array<any> = [];\n eachTypeOfTab: string = \"\";\n settingsData: any;\n components: Array<any> = [];\n direction: any;\n languageCode: any;\n isLoading: any;\n listViews: any;\n multipleFilter: Array<any> = []\n tableFilterData: any;\n selectedQuarterData: string = \"Select Quarter\"\n selectedFYData: string = \"Select FY\"\n fyList: Array<any> = [];\n dataPatchProperties: any;\n bookletId: any;\n apiUrl: string = '';\n defaultFormJson: any;\n modalProperties: any;\n tableData: any;\n nxtCompID:string = \"\";\n nxtTabName:string = \"\";\n nxtLoader: any = [];\n nxtJSON: any;\n bookValue: any;\n challans: Array<any> = [];\n @Input() tab: any;\n\n constructor(private loaderService: LoaderService, private translate: TranslateService, private globalValues: GlobalValuesService, private apiService: ApiService, private datePipe: DatePipe, private alertService: AlertService, private errorHandler: ErrorHandlerService, private globalValueService: GlobalValuesService, private configService: ConfigService, private tabDataService: TabDataService, private cdr: ChangeDetectorRef) {\n this.tabs = [\n { name: \"details\", label: \"Details\", order: 1 },\n { name: \"challans\", label: \"Challans\", order: 2 },\n { name: \"deductees\", label: \"Deductees\", order: 3 },\n { name: \"fileUpload\", label: \"Files\", order: 4 }\n ]\n\n // SK05DEC25 default fields\n this.defaultFormJson = {\n \"file_header\": {\n \"upload_type\": \"R\",\n \"date\": `${new Date().getDate()}${new Date().getMonth() + 1}${new Date().getFullYear()}`, //creation date REQUIRED\n \"file_sequence_number\": 1, //fixed \"1\" REQUIRED\n \"tan\": \"\", // company TAN need to get in settings model REQUIRED\n \"consolidated_file_hash\": \"\",\n },\n \"batch_header\": {\n \"challan_count\": 0, //based on challans received (Refer: fieldno.52, field no.9) //INPUT_FIELD REQUIRED\n \"transaction_type\": \"\",\n \"regular_statement_token_no\": \"\",\n \"last_tan_of_deductor\": \"\",\n \"previous_regular_statement_token_no\": \"\", //optional //INPUT_FIELD\n \"financial_year\": \"\", // based on financial year selection //INPUT_FIELD REQUIRED\n \"assessment_year\": \"\", // based on selected financial year, the next F.Y. should be entered //INPUT_FIELD REQUIRED\n \"period\": \"\", // Select the Period (Q1, Q2, Q3, Q4) //INPUT_FIELD REQUIRED\n \"employer_name\": \"\", // fetch the company name from settings REQUIRED\n \"employer_branch\": \"\", // company type/branch to be added in settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address1\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address2\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address3\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address4\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address5\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_state\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_pin\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_email\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_std_code\": \"\", // need to add in settings model //SETTINGS_ADDRESSES REQUIRED\n \"employer_telno\": \"\", // need to add in settings model //SETTINGS_ADDRESSES\n \"tan_of_deductor\": \"\", // need to add in settings model //SETTINGS_FINANCE\n \"pan_of_deductor\": \"\", // companys PAN will be fetched from Org Bank Info //SETTINGS_BANKINFO\n \"change_of_address_employer\": \"\", //INPUT_FIELD\n \"deductor_type\": \"\", //INPUT_FIELD\n \"responsible_person_name\": \"\", // need to fetch the current employee\n \"responsible_person_designation\": \"\",// fetch the company name from settings\n \"responsible_address1\": \"\",// fetch the company name from settings\n \"responsible_address2\": \"\",// fetch the company name from settings\n \"responsible_address3\": \"\",// fetch the company name from settings\n \"responsible_address4\": \"\",// fetch the company name from settings\n \"responsible_address5\": \"\",// fetch the company name from settings\n \"responsible_state\": \"\",// fetch the company name from settings\n \"responsible_pin\": \"\",\n \"responsible_email\": \"\",// fetch the company name from settings\n \"mobile_number\": \"\",// fetch the company name from settings\n \"responsible_state_code\": \"\", // need to add in settings model\n \"responsible_telno\": \"\", // need to add in settings model\n \"pan_of_responsible_person\": \"\",// fetch the company name from settings\n \"change_of_address_responsible_person\": \"\", //INPUT_FIELD\n \"batch_total_deposit_amount\": \"\",// sum of all challans total //INPUT_FIELD\n \"unmatched_challan_count\": \"\",\n \"count_of_salary_details\": 0, //INPUT_FIELD\n \"batch_total_gross\": \"\",\n \"regular_statement_filed_earlier\": \"\", //INPUT_FIELD\n \"state_name\": \"\",\n \"pao_code\": \"\",\n \"ddo_code\": \"\",\n \"ministry_name\": \"\", // field 57, excel 101 //INPUT_FIELD\n \"ministry_name_other\": \"\",\n \"pao_registration_no\": \"\",\n \"ddo_registration_no\": \"\",\n \"employer_std_code_alternate\": \"\",\n \"employer_tel_phone_no_alternate\": \"\",\n \"employer_email_id_alternate\": \"\",\n \"responsible_person_std_code_alternate\": \"\",\n \"responsible_person_tel_phone_no_alternate\": \"\",\n \"responsible_person_email_id_alternate\": \"\",\n \"account_office_identification_number\": \"\",\n \"gst_number\": \"\",\n \"count_of_section_194p_details_records\": \"\",\n \"batch_total_gross_total_income_section_194p\": \"\",\n \"last_deductor_type\": \"\",\n \"record_hash_bh\": \"\"\n }\n }\n this.formJson = this.defaultFormJson;\n this.eachTypeOfTab = this.tabs[0]?.name;\n this.tab = this.tabs[0];\n this.settingsData = JSON.parse(this.globalValues.getItem('settingsData') as any);\n const userDataConst: any = JSON.parse(this.globalValues.getItem('userData') as any);\n this.languageCode = localStorage.getItem('language') || userDataConst?.languageCode || \"en\";\n this.translate.onLangChange.subscribe((event: LangChangeEvent) => {\n this.languageCode = event.lang || \"en\";\n });\n this.loaderService.loading.subscribe((loadingStates) => {\n this.isLoading = loadingStates;\n this.cdr.markForCheck();\n });\n //SK05DEC25 get components data\n if (userDataConst) {\n const loggedInUserData = userDataConst?.apps;\n loggedInUserData?.forEach((appArr: any) => {\n if (appArr.name === 'hrm') {\n appArr?.modules?.forEach((modArr: any) => {\n if (modArr?.name === 'payroll') {\n modArr?.tabs.forEach((tabArr: any) => {\n if (tabArr?.name === 'forms' || tabArr?.name === 'form24q') { //SK05DEC25 check the condition for tabname\n tabArr?.components.forEach((element: any) => {\n if (element.type === \"subTab\") {\n this.tabs = element.config.subTab;\n this.tab = element.config.subTab[0];\n this.eachTypeOfTab = this.tabs[0]?.name;\n }\n });\n }\n });\n }\n });\n }\n });\n }\n }\n\n async ngOnInit(){\n this.loaderService.loading.subscribe((loadingStates) => {\n this.isLoading = loadingStates;\n this.nxtLoader = this.loaderService.getNxtLoader()\n this.nxtLoader = this.nxtLoader.filter((nxtId: any) => {\n return this.isLoading[nxtId] && this.isLoading[nxtId]?.length > 0;\n });\n this.cdr.markForCheck();\n });\n // SK05DEC25 file header datas assignment\n this.formJson[\"file_header\"][\"date\"] = `${new Date().getDate()}${new Date().getMonth() + 1}${new Date().getFullYear()}`;\n const nowYear = new Date().getFullYear();\n for (let i = 0; i < 5; i++) {\n this.fyList.push(nowYear - i + '-' + (nowYear - (i - 1)));\n };\n const currentMonth = (new Date().getMonth() + 1);\n if ((currentMonth >= 4) && (currentMonth <= 12)) {\n this.selectedFYData = this.fyList[0];\n } else {\n this.selectedFYData = this.fyList[1];\n };\n this.selectedQuarterData = \"Q1\";\n await this.getFormData(this.selectedFYData, this.selectedQuarterData);\n this.apiUrl = this.configService.getServiceConfig('apiUrl');\n this.currentTabNav(this.tab)\n }\n\n //SK05DEC25 selected subtab navigation\n async currentTabNav(tab: any) {\n this.tab = tab;\n this.components = [{type: 'default'}];\n this.eachTypeOfTab = \"eachTypeOfTab\"\n this.modalProperties = tab?.modalProperties;\n this.components = tab.components;\n this.eachTypeOfTab = tab.name;\n if (tab.components) {\n for (const comps of tab.components) {\n const compType = comps?.type;\n const cachedCompData = this.tabDataService.getCachedData(tab.name, comps._id);\n if (cachedCompData !== undefined){ //SK05DEC25 cache for nxt form data\n // SKS17JUL26 mail campaign added to cache check\n if (compType === 'nxtPage' || compType === 'broadcast' || compType === 'mailCampaign' || compType === 'pdf' || compType === 'invoice') {\n this.bookValue = this.tabDataService.getCachedData(tab.name, comps._id)\n this.nxtJSON = this.tabDataService.getNxtBook(comps?.config?.endpoint);\n comps.config['nxtJSON'] = this.nxtJSON\n } \n } else {\n // SK05DEC25 table data assignemnt\n if (compType === 'table') {\n if (!comps?.config?.endpoint && !comps?.config?.pagination) {\n const formS = this.formJson;\n if (tab.name === 'challans') { // SK05DEC25 for challan table\n comps.config.data = formS.challans\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formS;\n })\n this.challans = formS.challans\n } else if (tab.name === 'deductees') {\n comps.config.data = formS.deductees\n if (comps.name === 'deducteeTable') {\n comps.config.data = formS.deductees;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formS;\n })\n } else { //SK05DEC25 for fetchedDeductee table\n comps.config.data = formS.fetchedDeductees;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formS;\n })\n }\n }\n // this.bookValue = this.formJson\n }\n } else if ((compType === 'nxtPage')) { //SK05DEC25 nxt page component\n this.nxtCompID = comps._id;\n this.nxtTabName = tab.name;\n this.modalProperties = comps.config.modalProperties;\n this.dataPatchProperties = comps.config.dataPatchProperties;\n if (comps?.config?.apiCall && comps?.config?.endpoint) {\n await this.getData(comps?.config?.apiCall, comps?.config?.endpoint, comps, undefined, undefined, comps._id, {data:this.formJson});\n comps.config.nxtJSON = { ...this.nxtJSON }\n if (this.nxtJSON) this.tabDataService.setNxtBook(comps?.config?.endpoint, this.nxtJSON);\n comps.config.nxtJSON = { ...this.nxtJSON }\n this.tabDataService.setCachedData(tab.name, this.bookValue, comps._id)\n }\n if (comps?.config?.dataGetProperties?.endpoint) {\n const data = await this.apiService.fetchDataAsPromise(comps?.config?.dataGetProperties?.endpoint + (compType === 'pdf' ? '' : tab?.name, compType._id));\n if (comps?.config?.dataGetProperties.responseObject) {\n comps.config.tabBrowseContent = this.globalValues.getValue(data, comps?.config?.dataGetProperties.responseObjectKey);\n this.bookValue = this.globalValues.getValue(data, comps?.config?.dataGetProperties.responseObjectKey);\n } else if (comps?.config?.dataGetProperties.responseArray) {\n comps.config.tabBrowseContent = data[0];\n this.bookValue = data[0];\n }\n }\n }\n } \n }\n }\n }\n\n async getData(apiCall: any, endPoint: any, event: any, parentData: any | undefined = undefined, params: any | undefined = undefined, compId?: any, tableData?: any): Promise<void> {\n if (apiCall === 'get') {\n let finalGetCall: any = endPoint;\n if (event?.config?.isQueryParams || event?.config?.isParams) {\n if (event?.config?.paramsValue) {\n finalGetCall = endPoint + event.config?.paramsKey + event.config?.paramsValue;\n } else if (event?.config?.paramsKey && parentData) {\n finalGetCall = endPoint + this.globalValues.getValue(parentData, event?.config?.paramsKey);\n }\n } else {\n finalGetCall = endPoint;\n }\n if (event?.config?.searchConfigs?.searchFilterVal) {\n if (event.config.searchConfigs?.paramKeys && (event.config.searchConfigs?.searchFilterVal?.trim() != '')) {\n event.config.searchConfigs?.paramKeys.forEach((ele: any) => {\n if (finalGetCall?.includes(\"?\")) {\n finalGetCall += `&${ele}=${event.config.searchConfigs?.searchFilterVal}`\n } else {\n finalGetCall += `?${ele}=${event.config.searchConfigs?.searchFilterVal}`\n }\n });\n }\n }\n if (params) {\n if (finalGetCall?.includes(\"?\")) {\n finalGetCall += `&${params}`\n } else {\n finalGetCall += `?${params}`\n }\n }\n try {\n const getData = await this.apiService.fetchDataAsPromise(finalGetCall, compId); //123check\n this.multipleFilter = getData?.distinctValues\n if (event.config.responseObject) {\n const key = event.config.responseObjectKey;\n if (event.config.type == 'openNXTPage') {\n this.nxtJSON = {\n ...(this.globalValues.getValue(getData, key) ?? getData),\n loaderId: compId\n };\n event.config.nxtJSON = {\n ...(this.globalValues.getValue(getData, key) ?? getData),\n loaderId: compId\n };\n this.bookValue = tableData.data\n } else if (event.config.type === \"table\" || event.config.type === \"tableData\") {\n event.config.data = [];\n if (!event.config.tableParams) {\n event.config.tableParams = {};\n }\n event.config.tableParams = {\n ...event.config.tableParams, // clone existing\n pagination: {\n ...(event.config.tableParams.pagination || {}),\n totalRecords: getData[\"totalRecords\"]\n }\n };\n event.config.data = this.globalValues.getValue(getData, key);\n } else {\n event.config.data = this.globalValues.getValue(getData, key);\n if (event.config.type === 'nxtGetCall') {\n event.config.data.forEach((data: any) => {\n const date: any = this.datePipe.transform(data.parkingDate, 'short');\n data.time = date?.split(',')[1];\n data.date = this.datePipe.transform(date?.split(',')[0], 'mediumDate');\n delete data._id;\n delete data.parkingDate;\n })\n }\n }\n } else if (event?.config?.responseArray) {\n if (event.config.type === 'tableData') { \n event.config.data = structuredClone(getData);;\n }\n }\n } catch (error) {\n // console.error('Error fetching data', error);\n }\n }\n }\n\n openModal: boolean = false;\n async commonButtonClickEmit(event: any, index?: any, allEvent?: any) {\n if (event.buttonAction === 'openModal') {\n this.openModal = true;\n if (event.buttonType === 'newRecord') {\n // this.nxtJSON = {}\n this.bookValue = undefined;\n }\n this.modalProperties = event.modalProperties;\n if (this.modalProperties?.type === 'openNXTPage' || this.modalProperties?.type === 'calendar') { //SK13SEP24 adding calendar type check\n const url = '/nxt?name=' + this.modalProperties.pageContent;\n await this.getData('get', url, this.modalProperties, index, undefined, this.modalProperties._id, allEvent);\n if (this.nxtJSON) this.tabDataService.setNxtBook(url, this.nxtJSON);\n }\n } else if (event.buttonAction === 'save') { // SK05DEC25 to sync fetchedDeductees and current deductees\n const fJS = this.formJson;\n this.bookValue = undefined;\n this.checkedDeductees.forEach(element => {\n const filtDeductee = this.formJson.deductees.findIndex((js: any) => js.employeeId === element.employeeId);\n if (filtDeductee >= 0) {\n this.formJson.deductees[filtDeductee] = element;\n } else {\n this.formJson.deductees.push(element);\n }\n });\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.challans = formJsonData.json.challans\n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, 'syncDeductees').subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n // this.currentTabNav(this.tab);\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n }\n\n async selectedDropdownValue(event: any, from?: string) {\n if (from === \"fyYear\") {\n this.selectedFYData = event.data\n } else if (from === \"quarter\") {\n this.selectedQuarterData = event.data\n }\n await this.getFormData(this.selectedFYData, this.selectedQuarterData)\n }\n\n checkedDeductees: Array<any> = [];\n tableCheckedDataa(event: any) {\n this.checkedDeductees = event;\n }\n\n tablePageDetails(comp: any, event: any) {\n }\n\n hyperLinkColumnEmit(comp: any, event: any) {\n }\n\n saveButtonData(event: any) {\n }\n\n // SK05DEC25 delete challan.deductee\n onDeleteRecord(event: any, comp: any) {\n const data = event?.data;\n if(comp.name === \"deducteeTable\"){\n this.formJson.deductees.splice(event.index, 1);\n } else { \n this.formJson.challans.splice(event.index, 1)\n }\n // this.bookValue = this.formJson;\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n formJsonData.json.batch_header.challanCount = formJsonData.json.challans.length\n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, 'onDeleteRecord').subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = {...formJsonData.json};\n })\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n\n tableParamsEmit(tab: any, event: any, comp: any) {\n }\n\n actionButtonEmit(evt: any, compId?: string) { //SK10OCT25 compId passed fro reload page\n this.commonButtonClickEmit(evt.event, evt.event, evt)\n }\n\n nxtTableFilterEmit(event: any, comp: any) {\n }\n\n // SK05DEC25 saving/editing challan entry, deductee entry, details data\n async nxtFormHandler(event: any) {\n if (event.action === \"close\") {\n this.openModal = false;\n } else {\n let nxtLoaderId: any;\n if (event?.jsonBook?.questionbook?.action) {\n event.jsonBook.questionbook.action.forEach((element: any) => {\n if (element.eventtoemit === event.action) {\n nxtLoaderId = element.id\n }\n });\n if (!nxtLoaderId) {\n event.jsonBook.questionbook.action.forEach((element: any) => {\n if (element.eventtoemit === 'submit') {\n nxtLoaderId = element.id\n }\n });\n }\n }\n this.loaderService.nxtLoader(nxtLoaderId)\n this.formJson[\"financialYear\"] = this.selectedFYData\n this.formJson[\"quarter\"] = this.selectedQuarterData\n this.formJson['formId'] = `${this.selectedFYData}_${this.selectedQuarterData}`\n this.formJson[\"file_header\"][\"tan\"] = this.settingsData.finance.tan;\n this.formJson[\"batch_header\"][\"employer_name\"] = this.settingsData.companyName;\n this.formJson[\"batch_header\"][\"tan_of_deductor\"] = this.settingsData.finance.tan;\n this.formJson[\"batch_header\"][\"pan_of_deductor\"] = this.settingsData.finance.pan;\n this.formJson[\"batch_header\"][\"assessment_year\"] = Number(`${Number(this.selectedFYData.split('-')[0]) + 1}${Number((this.selectedFYData.split('-')[1]).slice(-2)) + 1}`);\n this.formJson[\"batch_header\"][\"financial_year\"] = Number(`${this.selectedFYData.split('-')[0]}${(this.selectedFYData.split('-')[1]).slice(-2)}`);\n this.formJson[\"batch_header\"][\"period\"] = this.selectedQuarterData;\n if (event.action === \"close\") {\n this.openModal = false;\n } else if (event.action === \"submit\" && event.actionData === \"challanSubmit\") {\n let challanJson: any = {\n \"line_number\": \"\",\n \"challan_detail_record_number\": \"\",\n \"count_of_deductee_party_records\": \"\",\n \"nil_challan_indicator\": \"\", //INPUT_FIELD\n \"bank_challan_no\": \"\", //INPUT_FIELD\n \"ddo_serial_no_form_24g\": \"\",\n \"bank_branch_code_or_24g_receipt_number\": \"\", //INPUT_FIELD\n \"date_of_bank_challan\": \"\", //TOBE ADDED\n \"oltas_income_tax\": \"\", // exel 141 field 22 //INPUT_FIELD\n \"oltas_surcharge\": 0, //INPUT_FIELD\n \"oltas_cess\": 0, //INPUT_FIELD\n \"oltas_interest_amount\": 0, //INPUT_FIELD\n \"oltas_others_amount\": 0, //INPUT_FIELD\n \"total_deposit_amount\": \"\", //exel 146 field 27 //INPUT_FIELD\n \"last_total_deposit_amount\": \"\", //INPUT_FIELD\n \"total_tax_deposit_as_per_deductee_annexure\": \"\", //INPUT_FIELD\n \"tds_tcs_income_tax\": \"\", //INPUT_FIELD\n \"tds_tcs_surcharge\": 0, //INPUT_FIELD\n \"tds_tcs_cess\": 0, //INPUT_FIELD\n \"sum_of_total_income_tax_deducted\": \"\", //INPUT_FIELD\n \"tds_tcs_interest_amount\": 0, //INPUT_FIELD\n \"tds_tcs_others_amount\": 0, //INPUT_FIELD\n \"cheque_or_dd_no\": \"\", //INPUT_FIELD\n \"by_book_entry_cash\": \"\", //INPUT_FIELD\n \"fee\": \"\", //INPUT_FIELD\n \"minor_head_of_challan\": \"\", //INPUT_FIELD\n \"last_challan_serial_no\": \"\",\n \"last_transfer_voucher_no\": \"\",\n \"last_bank_branch_code_or_24g_receipt_number\": \"\",\n \"last_date_of_bank_challan\": \"\",\n \"record_hash_cd\": \"\"\n };\n event.data.forEach((element: any) => {\n if (element?.referenceField) {\n challanJson[element?.referenceField] = element?.input ? element?.input : (element.type === \"Text\" ? \"\" : 0) ;\n }\n });\n if (challanJson?.challanUID) {\n const ind = this.formJson.challans.findIndex((ch: any) => ch.challanUID === challanJson?.challanUID);\n this.formJson.challans[ind] = challanJson\n } else {\n challanJson.challanUID = new Date().toString()\n this.formJson.challans.push(challanJson);\n }\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n formJsonData.json.batch_header.challanCount = formJsonData.json.challans.length\n \n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.challans = formJsonData.json.challans\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n } else if (event.action === \"submit\" && event.actionData === \"deducteeSubmit\") {\n let deducteeJson: any = {\n \"line_number\": \"\",\n \"challan_detail_record_number\": \"\",\n \"deductee_detail_record_no\": \"\",\n \"mode\": \"\",\n \"employee_reference_no\": \"\",\n \"employee_pan\": \"\",\n \"pan_ref_no\": \"\",\n \"name_of_employee\": \"\",\n \"tds_income_tax\": \"\",\n \"tds_surcharge\": 0,\n \"health_and_education_cess\": 0,\n \"total_income_tax_deducted\": \"\",\n \"total_tax_deposited\": \"\",\n \"amount_paid_or_credited\": \"\",\n \"date_of_payment_or_credit\": \"\", // NEED TO CHANGE\n \"date_on_which_tax_deducted\": \"\",\n \"date_of_deposit\": \"\",// NEED TO CHANGE\n \"remarks_1\": \"\",\n \"section_code_under_which_payment_made\": \"\",\n \"certificate_number_issued_by_ao_section_197\": \"\",\n \"batch_number\": \"\",\n \"last_employee_reference_no\": \"\",\n \"last_employee_pan\": \"\",\n \"last_total_income_tax_deducted\": \"\",\n \"last_total_tax_deposited\": \"\",\n \"record_hash_dd\": \"\",\n \"employeeId\":\"\"\n };\n event.data.forEach((element: any) => {\n if (element?.referenceField) {\n // deducteeJson[element?.referenceField] = element?.input;\n deducteeJson[element?.referenceField] = element?.input ? element?.input : (element.type === \"Text\" ? \"\" : 0) ;\n // this.assignByPath(this.formJson, element?.referenceField, element?.input)\n if(element?.referenceField === 'date_of_deposit_D'){\n deducteeJson['date_of_deposit'] = `${String(new Date(element?.input).getDate()).padStart(2, \"0\")}${String(new Date(element?.input).getMonth()+1).padStart(2, \"0\")}${(new Date(element?.input).getFullYear())}`\n } else if(element?.referenceField === 'date_of_payment_or_credit_D'){\n deducteeJson['date_of_payment_or_credit'] = `${String(new Date(element?.input).getDate()).padStart(2, \"0\")}${String(new Date(element?.input).getMonth()+1).padStart(2, \"0\")}${(new Date(element?.input).getFullYear())}`\n } else if(element?.referenceField === 'date_on_which_tax_deducted_D'){\n deducteeJson['date_on_which_tax_deducted'] = `${String(new Date(element?.input).getDate()).padStart(2, \"0\")}${String(new Date(element?.input).getMonth()+1).padStart(2, \"0\")}${(new Date(element?.input).getFullYear())}`\n }\n }\n });\n if (deducteeJson?.employeeId) {\n const ind = this.formJson.deductees.findIndex((ch: any) => ch.employeeId === deducteeJson?.employeeId);\n this.formJson.deductees[ind] = deducteeJson\n } else {\n this.formJson.deductees.push(deducteeJson);\n }\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n \n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n } else if (event.action === \"submit\") {\n let filterEmployee = event.data.find((emp: any) => emp.referenceField === \"searchPerson\");\n let filterAddress = event.data.find((emp: any) => emp.referenceField === \"searchAddress\");\n if (filterEmployee.input) {\n try {\n let empl: any = await this.apiService.fetchDataAsPromise(`/employee/employeeDetail?apiRequestType=findOne&employeeId=${filterEmployee.input}`)\n let emp = empl.employee\n this.formJson[\"batch_header\"][\"responsible_person_name\"] = emp.fullName;\n this.formJson[\"batch_header\"][\"responsible_person_designation\"] = emp.workinfo.designation;\n this.formJson[\"batch_header\"][\"responsible_address1\"] = emp.addressinfo.currentaddress.address1;\n this.formJson[\"batch_header\"][\"responsible_address2\"] = emp.addressinfo.currentaddress.address2;\n this.formJson[\"batch_header\"][\"responsible_address3\"] = emp.addressinfo.currentaddress.city;\n this.formJson[\"batch_header\"][\"responsible_state\"] = this.getStateCodes(emp.addressinfo.currentaddress.state).tin;\n this.formJson[\"batch_header\"][\"responsible_pin\"] = emp.addressinfo.currentaddress.postalcode;\n this.formJson[\"batch_header\"][\"responsible_email\"] = emp.email;\n this.formJson[\"batch_header\"][\"mobile_number\"] = Number(emp.phone.slice(-10));\n this.formJson[\"batch_header\"][\"responsible_state_code\"] = emp.additionalContacts[0].stdCode;\n this.formJson[\"batch_header\"][\"responsible_telno\"] = emp.additionalContacts[0].telephoneNumber;\n this.formJson[\"batch_header\"][\"pan_of_responsible_person\"] = empl.finance.panNumber;\n } catch (error) {\n\n }\n }\n if (filterAddress.input) {\n let addr = this.settingsData?.addresses?.find((id: any) => id._id === filterAddress.input)\n this.formJson[\"batch_header\"][\"employer_branch\"] = addr.label;\n this.formJson[\"batch_header\"][\"employer_address1\"] = addr.line1;\n this.formJson[\"batch_header\"][\"employer_address2\"] = addr.line2;\n this.formJson[\"batch_header\"][\"employer_address3\"] = addr.city;\n this.formJson[\"batch_header\"][\"employer_state\"] = this.getStateCodes(addr.state).tin;\n this.formJson[\"batch_header\"][\"employer_pin\"] = addr.zip;\n this.formJson[\"batch_header\"][\"employer_email\"] = addr.email;\n this.formJson[\"batch_header\"][\"employer_std_code\"] = (addr.stdCode);\n this.formJson[\"batch_header\"][\"employer_telno\"] = addr.telephoneNumber;\n }\n\n event.data.forEach((element: any) => {\n if (element?.referenceField) {\n this.assignByPath(this.formJson, element?.referenceField, element?.input)\n }\n });\n\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n \n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n\n } else if (event.action === \"save\") {\n let filterEmployee = event.data.find((emp: any) => emp.referenceField === \"searchPerson\");\n let filterAddress = event.data.find((emp: any) => emp.referenceField === \"searchAddress\");\n this.apiService.writeValue('patch', '/hrm/forms?formType=form24q', this.formJson, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.tableData = {};\n setTimeout(()=>{ //SK12DEC25 settimeout to update table\n this.tableData = this.formJson;\n })\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n }\n }\n\n // SK05DEC25 assigning the nested loop JSON data\n assignByPath(obj: any, path: string, value: any) {\n const keys = path?.split('.');\n let current = obj;\n keys?.forEach((key, index) => {\n if (index === keys.length - 1) {\n current[key] = value; // Assign here\n } else {\n current[key] = current[key] || {}; // Create if missing\n current = current[key];\n }\n });\n }\n\n saveSuccess(event: any, key?: any, defaultMessage?: any) {\n this.alertService.messageOnPass('success', event, key, defaultMessage);\n }\n\n nxtButtonHandler(event: any) {\n }\n\n handleCalendarDate(event: any) {\n }\n\n handleCalendarEventDate(event: any) {\n }\n\n onClickEdit(card: any) {\n if (card.event) {\n if (card.event.buttonAction === \"edit\") {\n this.modalProperties = card.event.actionButtonProperties\n this.commonButtonClickEmit(this.modalProperties, card.card?.config?.configData ? card.card?.config?.configData : this.bookValue ? this.bookValue : card.card)\n }\n }\n }\n\n multiCheckEmit(event: any) {\n }\n\n currentSubTabNav(event: any) {\n }\n\n onSideNav(event: any) {\n }\n\n emitAttachmentClick(event: any) {\n }\n\n modalClose(event: any) {\n this.openModal = false;\n }\n\n // SK05DEC25 form24q data get\n async getFormData(fyYear: string, quarter: string) {\n try {\n this.tableData = undefined\n const datum = await this.apiService.fetchDataAsPromise(`/hrm/forms?formType=form24q&formId=${fyYear}_${quarter}&quarter=${quarter}&fyYear=${fyYear}`, 'getFormData');\n const defJS = this.defaultFormJson;\n let formJS = this.globalValueService.deepMerge(defJS, datum?.forms?.json);\n this.formJson = formJS;\n // let formJS = { ...defJS, ...datum?.forms?.json };\n // this.formJson = datum?.forms?.json;\n this.tableData = this.formJson;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = this.formJson;\n })\n this.tabDataService.setCachedData(this.nxtTabName, this.bookValue, this.nxtCompID)\n } catch (error) {\n }\n }\n // SK05DEC25 Submit form 24Q\n submitButtonLoader : boolean = false;\n async submitClick(from: string) {\n if (from === 'submit24Q') {\n const data = {\n \"json\": {\n \"file_header\": this.formJson.file_header,\n \"batch_header\": this.formJson.batch_header,\n \"challans\": this.formJson.challans,\n \"deductees\": this.formJson.deductees,\n\n },\n \"csiBase64\": this.formJson?.csiFileNXT?.[0]?.doc?.split(',')[1] || \"\"\n }\n this.submitButtonLoader = true;\n this.apiService.writeValue('post', '/hrm/forms?apiType=form24q', data).subscribe({\n next: (savedData: any) => {\n this.submitButtonLoader = false;\n this.saveSuccess('Save Success', 'Save Success');\n const file = new Blob([savedData.data], { type: 'fvu' }); // This matches the content type of the response\n saveAs(file, '24Q_Export_' + new Date().toLocaleDateString() + '.fvu'); //name should be dynamic\n },\n error: (err: any) => {\n this.submitButtonLoader = false;\n this.errorHandler.handleError(err);\n let err1 = JSON.parse(err?.message)?.error?.content\n const blob = new Blob([err1], { type: 'text/plain' });\n saveAs(blob, 'Error_' + new Date().toLocaleDateString() + '.txt'); //name should be dynamic\n }\n })\n } else {\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData).subscribe({\n next: (savedData: any) => {\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n }\n\n // SK05DEC25 state codes return\n getStateCodes(stateText: string) {\n const arr = [\n { state: [\"Andhra Pradesh\", \"AP\"], code: \"AP\", tin: 37 },\n { state: [\"Arunachal Pradesh\", \"AR\"], code: \"AR\", tin: 12 },\n { state: [\"Assam\", \"AS\"], code: \"AS\", tin: 18 },\n { state: [\"Bihar\", \"BR\"], code: \"BR\", tin: 10 },\n { state: [\"Chhattisgarh\", \"CG\", \"Chattisgarh\"], code: \"CG\", tin: 22 },\n { state: [\"Goa\", \"GA\"], code: \"GA\", tin: 30 },\n { state: [\"Gujarat\", \"GJ\"], code: \"GJ\", tin: 24 },\n { state: [\"Haryana\", \"HR\"], code: \"HR\", tin: 6 },\n { state: [\"Himachal Pradesh\", \"HP\"], code: \"HP\", tin: 2 },\n { state: [\"Jharkhand\", \"JH\"], code: \"JH\", tin: 20 },\n { state: [\"Karnataka\", \"KA\"], code: \"KA\", tin: 29 },\n { state: [\"Kerala\", \"KL\"], code: \"KL\", tin: 32 },\n { state: [\"Madhya Pradesh\", \"MP\"], code: \"MP\", tin: 23 },\n { state: [\"Maharashtra\", \"MH\"], code: \"MH\", tin: 27 },\n { state: [\"Manipur\", \"MN\"], code: \"MN\", tin: 14 },\n { state: [\"Meghalaya\", \"ML\"], code: \"ML\", tin: 17 },\n { state: [\"Mizoram\", \"MZ\"], code: \"MZ\", tin: 15 },\n { state: [\"Nagaland\", \"NL\"], code: \"NL\", tin: 13 },\n { state: [\"Odisha\", \"Orissa\", \"OD\", \"OR\"], code: \"OD\", tin: 21 },\n { state: [\"Punjab\", \"PB\"], code: \"PB\", tin: 3 },\n { state: [\"Rajasthan\", \"RJ\"], code: \"RJ\", tin: 8 },\n { state: [\"Sikkim\", \"SK\"], code: \"SK\", tin: 11 },\n { state: [\"Tamil Nadu\", \"Tamilnadu\", \"TN\"], code: \"TN\", tin: 33 },\n { state: [\"Telangana\", \"TS\", \"TG\"], code: \"TS\", tin: 36 },\n { state: [\"Tripura\", \"TR\"], code: \"TR\", tin: 16 },\n { state: [\"Uttar Pradesh\", \"UP\"], code: \"UP\", tin: 9 },\n { state: [\"Uttarakhand\", \"UK\", \"UA\", \"Uttaranchal\"], code: \"UK\", tin: 5 },\n { state: [\"West Bengal\", \"WB\"], code: \"WB\", tin: 19 },\n { state: [\"Andaman and Nicobar Islands\", \"AN\"], code: \"AN\", tin: 35 },\n { state: [\"Chandigarh\", \"CH\"], code: \"CH\", tin: 4 },\n { state: [\"Dadra and Nagar Haveli and Daman and Diu\", \"DNHDD\", \"DNH\", \"DD\"], code: \"DH\", tin: 26 },\n { state: [\"Lakshadweep\", \"LD\"], code: \"LD\", tin: 31 },\n { state: [\"Delhi\", \"DL\", \"NCT\", \"New Delhi\"], code: \"DL\", tin: 7 },\n { state: [\"Puducherry\", \"Pondicherry\", \"PY\"], code: \"PY\", tin: 34 },\n { state: [\"Jammu and Kashmir\", \"JK\"], code: \"JK\", tin: 1 },\n { state: [\"Ladakh\", \"LA\"], code: \"LA\", tin: 38 }\n ]\n\n let code = arr.find((st:any)=> st.state.includes(stateText));\n if(code){\n return code\n } else{\n return { state: undefined, code: \"\", tin: undefined }\n }\n }\n}","<div class=\"flex justify-content-between\">\n <div>\n <!-- SK05DEC25 sub tabs list -->\n <div class=\"tab-box flex flex-direction-row tab-view-buttons w-100\">\n <div *ngFor=\"let tab of tabs; let i=index \">\n <div class=\"tabCls d-flex p-2 cursor-pointer\"\n [class]=\"eachTypeOfTab === tab.name ? 'tab-active-color' : 'tab-color'\"\n [class.active]=\"eachTypeOfTab === tab.name\" (click)=\"currentTabNav(tab)\">\n <span class=\"sub-tab-text fs-6\">\n {{tab.labelPath || tab.label | customTranslate : tab.label }}\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex ms-2\">\n <!-- SK05DEC25 FY dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"fyList\" [selectedData]=\"selectedFYData\" dropDownHeight=\"32px\"\n dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\"\n dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'fyYear')\">\n </app-drop-down>\n <!-- SK05DEC25 Quarter Dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"['Q1', 'Q2', 'Q3', 'Q4']\" [selectedData]=\"selectedQuarterData\"\n dropDownHeight=\"32px\" dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\"\n dropBorderRadius=\"5px\" dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'quarter')\">\n </app-drop-down>\n <!-- SK05DEC25 Submit Form24Q button -->\n <div class=\"align-self-center me-3\">\n <app-fusion-button [buttonValue]=\" 'APP_HRM_PAYROLL_FORM24Q.SUBMIT_24Q' | customTranslate : 'Submit 24Q' \"\n (buttonClickEmit)=\"submitClick('submit24Q')\" [buttonLoadingSpinner]=\"submitButtonLoader\">\n </app-fusion-button>\n </div>\n </div>\n</div>\n\n\n<div class=\"row\">\n <ng-container *ngFor=\"let comp of components; let j=index\">\n <!-- {{comp._id}} -->\n <div class=\"{{comp.size}}\">\n <!-- SK05DEC25 button component -->\n <div *ngIf=\"comp.type === 'buttons'\" class=\"mb-1\" style=\"display: flex; justify-content: end;\">\n <app-fusion-button *ngFor=\"let button of comp?.config?.buttons\"\n (buttonClickEmit)=\"commonButtonClickEmit(button)\" [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\">\n </app-fusion-button>\n </div>\n <!-- SK05DEC25 table for challans -->\n <div *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'challans' \" class=\"comp-wrap mt-2\">\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\" [data]=tableData.challans\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 table for deductees and fetched deductees -->\n <div class=\"mb-3 comp-wrap mt-2\" *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'deductees' \" >\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0 || isLoading['syncDeductees']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\"\n [data]=\"comp.name === 'deducteeTable' ? tableData.deductees : tableData.fetchedDeductees \"\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 nxtpage for details/batchheader/fileheader -->\n <div *ngIf=\"comp.type === 'nxtPage'\">\n <lib-booklet *ngIf=\"!isLoading[comp._id] && !isLoading['getFormData']\" [bookletJSON]=\"comp.config.nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet>\n <div *ngIf=\"isLoading[comp._id]?.length > 0 || isLoading['getFormData']?.length > 0 || (modalProperties ? isLoading[modalProperties?._id]?.length > 0 : false)\" class=\"row my-1\">\n <div class=\"col-md-12\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- SK05DEC25 if condition to open modal -->\n<app-modal \n [modalTitle]=\"modalProperties?.modalTitlePath || modalProperties?.modalTitle || isLoading['deducteeSubmit']?.length > 0 || isLoading['challanSubmit']?.length > 0 || isLoading['detailSubmit']?.length > 0 || 'NXT BOOK' | customTranslate : modalProperties?.modalTitle\"\n [modalFooter]=\"modalProperties?.isModalFooter\" [saveButtonValue]=\"modalProperties?.modalSaveButtonValue\"\n [isModalOpen]=\"openModal\" (cancelButtonEmit)=\"modalClose($event)\" [modalSize]=\"modalProperties?.modalSize\">\n <div class=\"modal-body\">\n <div>\n <!-- <lib-booklet [bookletJSON]=\"nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet> -->\n <!-- SK24JUN24 language code update to nxt -->\n <app-browse [nxtJSON]=\"nxtJSON\" [modalProperties]=\"modalProperties\" [nxtEdit]=\"true\" [bookValue]=\"bookValue\"\n [languageCode]=\"languageCode\" (nxtFormHandlerEmit)=\"nxtFormHandler($event)\">\n </app-browse>\n </div>\n </div>\n</app-modal>","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'getValue',\n standalone: true\n})\nexport class GetValuePipe implements PipeTransform {\n\n // SK10APR24 pipe to get the value from object by passing the key\n transform(arg:any, element: any, column: any): any {\n const initialEl = element; // SK21DEC23 fixed table search issue\n let flds = column?.split('.');\n for(let i=0; i<flds?.length; i++){\n let splitFlds = flds[i].split('[');\n // SK18JUN24 validating number and text fields\n if(splitFlds.length === 1){\n if (element != null && element != undefined) {\n if(typeof element[flds[i]] === \"number\"){\n element = element[flds[i]] || 0 as any;\n } else if(typeof element[flds[i]] === \"boolean\"){\n element = element[flds[i]]; // SK21AUG24 for boolean type\n } else {\n //SC25DEC2025 existing behavior\n let value = element[flds[i]] || '' as any;\n\n //SC25DEC2025 format date strings DD/MM/YYYYY\n if (typeof value === 'string' && this.looksLikeDate(value)) {\n value = this.formatShortDate(value);\n }\n element = value;\n }\n }\n } else {\n let index = Number(splitFlds[1].split(']')[0]);\n if(typeof element[flds[i]] === \"number\"){\n element = element[splitFlds[0]][index] || 0 as any;\n } else if(typeof element[flds[i]] === \"boolean\"){\n element = element[flds[i]]; // SK21AUG24 for boolean type\n } else {\n element = element[splitFlds[0]][index] || '' as any; //SK 20DEC23 To solve undefined error\n }\n }\n }\n if (element != null && element != undefined) {\n Object.assign(initialEl, { [column]: element }); // HA 11-DEC-23 Fixed Expression changed issue\n }\n if (element === null || element === undefined || element === '') {\n return '';\n }\n return element;\n }\n\n//SC26DEC2025 detects most readable date formats\nprivate looksLikeDate(value: string): boolean {\n value = value.trim().replace(',', '');\n return (\n /^[0-9]{1,2}\\s+[A-Za-z]+\\s+[0-9]{4}$/i.test(value) || \n /^[A-Za-z]+\\s+[0-9]{1,2}\\s+[0-9]{4}$/i.test(value) || \n /^[A-Za-z]+\\s+[0-9]{4}$/i.test(value) \n );\n}\n\nprivate formatShortDate(value: string): string {\n value = value.replace(',', '').replace(/\\s+/g, ' ').trim();\n\n const short = (m: string) =>\n m.substring(0, 3).toLowerCase().replace(/^./, c => c.toUpperCase());\n\n //SC26DEC2025 day first: dd/mm/yyyy\n let m = value.match(/^([0-9]{1,2})\\s+([A-Za-z]+)\\s+([0-9]{4})$/i);\n if (m) {\n const day = m[1].padStart(2, '0');\n const monthShort = short(m[2]);\n const year = m[3];\n return `${day} ${monthShort} ${year}`;\n }\n\n //SC26DEC2025 mm/dd/yyyy\n m = value.match(/^([A-Za-z]+)\\s+([0-9]{1,2})\\s+([0-9]{4})$/i);\n if (m) {\n const day = m[2].padStart(2, '0');\n const monthShort = short(m[1]);\n const year = m[3];\n return `${day} ${monthShort} ${year}`;\n }\n\n // SC26DEC2025 — mm/yy\n m = value.match(/^([A-Za-z]+)\\s+([0-9]{4})$/i);\n if (m) {\n const monthShort = short(m[1]);\n const year = m[2];\n return `${monthShort} ${year}`;\n }\n return value;\n}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'editColumnCheck',\n standalone: true\n})\nexport class EditColumnCheckPipe implements PipeTransform {\n\n // SK10APR24 condition to check the edit column\n transform(arg:any, element: any, editCol: any): any {\n var returnVal = \"\";\n if(editCol.length > 0){\n if(typeof editCol[0] === 'string'){\n if(editCol.includes(element)) returnVal = \"string\";\n } else if(typeof editCol[0] === 'object'){\n returnVal = (editCol.filter((col:any)=>col.name === element)).length > 0 ? \"object\" : \"\";\n }\n }\n return returnVal \n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'editColumnType',\n standalone: true\n})\nexport class EditColumnTypePipe implements PipeTransform {\n // SK10APR24 to check the type of edit column in table\n transform(arg:any, element: any, editCol: any): any {\n var returnVal :any ;\n returnVal = (editCol.filter((col:any)=>col.name === element));\n return returnVal[0].type; \n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'editColumnDropdown',\n standalone: true\n})\nexport class EditColumnDropdownPipe implements PipeTransform {\n\n // SK10APR24 to check the data type of table value is dropdown\n transform(arg:any, element: any, editCol: any): any {\n var returnVal :any ;\n returnVal = (editCol.filter((col:any)=>col.name === element));\n return returnVal[0].values;\n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'totalColumSum',\n standalone: true\n})\nexport class TotalColumSumPipe implements PipeTransform {\n // SK16JUL24 to sum the column data\n\n transform(arg:any, data: any, cumulativeDataColumns: any, column:string): any {\n if(cumulativeDataColumns.includes(column)){\n const value = cumulativeDataColumns.includes(column) ? data?.reduce((accum: number, curr: any ) => (Number(this.currencyToNumber(accum))) + (Number(this.currencyToNumber(curr[column])) || 0), 0) : null;\n // return Number((value || 0).toFixed(2)).toFixed(2) //SK19JUL24 decimal fix in column sum\n return this.currencyReturn(value, \"INR\");\n } else {\n return ''\n }\n \n\n \n }\n\n /** SK25JUL24 This function will convert a sting to number, for converting rupees to numbers */\n currencyToNumber(data:any){\n // const removeComma = data?.replace(/\\,/g, '') // to remove commas from the string\n // return Number(removeComma.substring(1));\n if(data && typeof data === 'string'){\n const removeComma = Number(data?.replace(/[^0-9.-]+/g,\"\"));\n return Number(removeComma);\n } else if(data && typeof data === 'number'){\n return Number(data);\n } {\n return 0\n }\n }\n\n currencyReturn(rupee: number, code:string){\n let formatter = new Intl.NumberFormat(navigator.language, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n });\n const amt = formatter.format(rupee);\n return `${amt}`;\n }\n\n}\n","import { Injectable, ChangeDetectorRef, EventEmitter } from '@angular/core';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\nimport { LangChangeEvent, TranslateService } from '@ngx-translate/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CustomPaginatorIntl extends MatPaginatorIntl {\n public labelChange: EventEmitter<void> = new EventEmitter<void>(); // Define the labelChange event\n\n constructor(private translate: TranslateService, private cdr: ChangeDetectorRef) {\n super();\n this.updateTranslations(); // Initialize translations\n\n // Subscribe to language changes\n this.translate.onLangChange.subscribe((event: LangChangeEvent) => {\n this.updateTranslations(); // Update translations\n this.labelChange.emit(); // Emit the label change event\n this.cdr.detectChanges(); // Trigger change detection\n });\n }\n\n private updateTranslations() {\n if(this.translate.instant('APP.ITEMS_PER_PAGE') === \"APP.ITEMS_PER_PAGE\"){\n this.itemsPerPageLabel = \"Item per page\";\n }else{\n this.itemsPerPageLabel = this.translate.instant('APP.ITEMS_PER_PAGE')\n }\n this.nextPageLabel = this.translate.instant('NEXT_PAGE');\n this.previousPageLabel = this.translate.instant('PREVIOUS_PAGE');\n this.firstPageLabel = this.translate.instant('FIRST_PAGE');\n this.lastPageLabel = this.translate.instant('LAST_PAGE');\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'customDate',\n standalone: true\n})\nexport class CustomDatePipe implements PipeTransform {\n\n transform(value: any, type: 'date' | 'datetime' | 'time' = 'date'): any {\n\n const date = new Date(value);\n\n if (isNaN(date.getTime())) {\n return value;\n }\n\n const day = String(date.getDate()).padStart(2, '0');\n const month = date.toLocaleString('en-US', { month: 'short' });\n const year = date.getFullYear();\n\n const time = date.toLocaleString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n\n if (type === 'date') {\n return `${day} ${month} ${year}`;\n }\n\n if (type === 'time') {\n return time;\n }\n\n if (type === 'datetime') {\n return `${day} ${month} ${year} ${time}`;\n }\n\n return value;\n }\n}","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'customTime',\n pure: false,\n standalone: true\n})\nexport class CustomTimePipe implements PipeTransform {\n\n transform(value: any, timeFormat: string = 'HH:mm'): any {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n const date = new Date(value);\n\n // Check if the input is a valid time\n if (isNaN(date.getTime())) {\n return value; // Return the original value if invalid\n }\n\n // Extract hours and minutes from the valid time\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n return `${hours}:${minutes}`; // Return the formatted time\n }\n}","// scroll.service.ts\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ScrollService {\n private scrollPositionSubject = new BehaviorSubject<number>(0);\n scrollPosition$ = this.scrollPositionSubject.asObservable();\n\n setScrollPosition(position: number): void {\n this.scrollPositionSubject.next(position);\n }\n}\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Component, OnInit, ViewChild, Input, Output, EventEmitter, ElementRef, HostListener, isDevMode, ViewChildren, QueryList, ChangeDetectorRef, SimpleChanges, ChangeDetectionStrategy, OnChanges } from '@angular/core';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSortModule, MatSort } from '@angular/material/sort';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { CommonModule } from '@angular/common';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { SearchFilterComponent } from '../search-filter/search-filter.component';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { PopoverComponent } from '../popover/popover.component';\nimport { Constants } from \"../../models/Constants\";\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Subscription } from 'rxjs';\nimport { GlobalValuesService } from \"../../services/global-values.service\";\nimport { GetValuePipe } from \"../../pipes/get-value.pipe\";\nimport { EditColumnCheckPipe } from \"../../pipes/data-table/edit-column-check.pipe\";\nimport { EditColumnTypePipe } from \"../../pipes/data-table/edit-column-type.pipe\";\nimport { EditColumnDropdownPipe } from \"../../pipes/data-table/edit-column-dropdown.pipe\";\nimport { LangChangeEvent, TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { TotalColumSumPipe } from \"../../pipes/data-table/total-colum-sum.pipe\";\nimport { CommonScreenComponent } from '../side-screen/common-screen/common-screen.component';\nimport { MultiCheckboxComponent } from '../multi-checkbox/multi-checkbox.component';\nimport { MultipleFilterComponent } from '../multiple-filter/multiple-filter.component';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { CustomPaginatorIntl } from \"../../shared/custom-paginator-intl\";\nimport { ApiService } from \"../../services/api.service\";\nimport { saveAs } from 'file-saver';\nimport { AlertService } from \"../../services/alert.service\";\nimport { ErrorHandlerService } from \"../../services/error-handler.service\";\nimport { FileUploadComponent } from '../file-upload/file-upload.component';\nimport { CustomDatePipe } from \"../../pipes/custom-date.pipe\";\nimport { CustomTimePipe } from \"../../pipes/custom-time.pipe\";\nimport { LoaderService } from \"../../services/loading.service\";\nimport { Overlay, OverlayModule, ScrollStrategy } from '@angular/cdk/overlay';\nimport { PaginationComponent } from '../pagination/pagination.component';\nimport { ScrollService } from \"../../services/scroll.service\";\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\n@Component({\n selector: 'app-data-table, app-data-table-two',\n templateUrl: './data-table.component.html',\n imports: [\n CommonModule,\n MatTableModule,\n MatPaginatorModule,\n MatSortModule,\n MatCheckboxModule,\n ReactiveFormsModule,\n FormsModule,\n SearchFilterComponent,\n FusionButtonComponent,\n PopoverComponent,\n MatTooltipModule,\n GetValuePipe,\n EditColumnCheckPipe,\n EditColumnTypePipe,\n EditColumnDropdownPipe,\n TranslateModule,\n TotalColumSumPipe,\n CommonScreenComponent,\n MultiCheckboxComponent,\n MultipleFilterComponent,\n CustomTranslatePipe,\n FileUploadComponent, //SKS25OCT24\n CustomDatePipe, //SKS21NOV24\n CustomTimePipe, //SKS21NOV24\n OverlayModule, //SKS24JAN25\n PaginationComponent, //SKS24JAN25\n DropDownComponent\n ],\n styleUrls: ['./data-table.component.css'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: MatPaginatorIntl, useClass: CustomPaginatorIntl }] // Provide the custom paginator\n})\n\nexport class DataTableComponent implements OnInit {\n @Input () data!: any[]; // get data that to be displayed in a array\n @Input () displayedColumns: Array<string> = []; // get columns values to display\n @Input () headerLabels!: string[]; // columns porper label that to be displayed in header\n @Input () translatePath!: any;\n // MY 22OCT26 Input getters and setters to ensure array properties are never null/undefined and prevent change-detection runtime errors\n private _hyperLinkColumns: Array<string> = [];\n @Input() set hyperLinkColumns(val: any) {\n this._hyperLinkColumns = Array.isArray(val) ? val : [];\n }\n get hyperLinkColumns(): Array<string> {\n return this._hyperLinkColumns;\n }\n @Input () withCheckBox: boolean = false; // get if with or without checkbox in table\n @Input () searchBar = false; // if it is true, the search bar will be displayed on table\n private _editColumn: Array<any> = [];\n @Input() set editColumn(val: any) {\n this._editColumn = Array.isArray(val) ? val : [];\n }\n get editColumn(): Array<any> {\n return this._editColumn;\n }\n @Input () notes: String = '';\n private _filterColumns: Array<any> = [];\n @Input() set filterColumns(val: any) {\n this._filterColumns = Array.isArray(val) ? val : [];\n }\n get filterColumns(): Array<any> {\n return this._filterColumns;\n }\n @Input () tableSaveButton = false; // save button for editing LOP in payroll table, SK13MAR24 changed name from 'saveLOP'\n @Input () stickyColumn = false; // if the last column should be sticky, it should be sent as boolean value\n @Input () tableWidth = '100%'; // width of table can be adjusted from parent, by default it is 100%\n @Input () actionColumHeader = 'APP.ACTION'; // to change the header for action column\n @Input () multipleFilter : any;\n @Input () actionButton:boolean = false; //to show button colum as action\n @Input () fromWhere:string = ''; // to show the different action buttons based on the component like If I provide 'expense' will show te expense action button only\n @Input () receiptImg:boolean = false; // to implement receipt icon in approval-expense;\n @Input () titleOn= false; // to include titles for the table;\n @Input () title:any;// the title for the table;\n @Input () isButtons:any;// is button present in table;\n @Input () buttonArray:any;// buttons to be displayed;\n @Input () list:any;\n @Input () selectedData:any;\n @Input () isDatePicker:boolean = false;\n @Input () tableId:any;\n @Input () isEditRow = false;\n @Input () isDeleteRow = false;\n @Input () addInlineRecord = false; //SK23FEB24 \n @Input () inlineElement:any //SK23FEB24\n @Input () editIconTooltip : any //SK27FEB24\n @Input () viewIcon = false; //SK02APR24\n @Input () downloadIcon = false; //SK02APR24\n @Input () cumulativeDataColumns! : Array<any>; //SK16JUL24\n @Input () filterDataArray:any //MV24AUG24 Receives input data for Tab\n @Input () tableCallDetails:any;\n @Input () totalRecords!: number;\n @Input () filterScreenConfigs :any\n @Input () exportFieldsListConfigs : any;\n @Input () exportFilterListConfigs : any;\n @Input () moudleName : any; //SKS25OCT24 for table name\n @Input () pageSize: any = 10; //SK01NOV24\n @Input () pageIndex: any = 0 ; //SK01NOV24\n @Input () tableConfigurations: any; //SK06NOV24\n @Input () actionButtonCondition: any; //SKS16NOV24\n @Input () dateColumns: any; //SKS18NOV24\n @Input () timeColumns: any; //SKS18NOV24\n @Input () searchConfigs: any;\n @Input () sideScreenColumn: any;\n @Input () sendButton:any; //SKS23DEC24\n @Input () deactiveButton:any; //SKS25DEC24\n @Input () activeButton:any;//SKS25DEC24\n @Input () cloneButton:any;//SKS25DEC24\n @Input () objectColumns: any; //SKS7JAN25\n @Input() buttonLoadingSpinner:boolean = false; //SK04SEP25 delete button loader\n @Input() tableSaveLoadingSpinner:boolean = false; //SK29OCT25\n // MY 22OCT26 Input getter and setter for stickyColumns to prevent undefined access\n private _stickyColumns: Array<any> = [];\n @Input() set stickyColumns(val: any) {\n this._stickyColumns = Array.isArray(val) ? val : [];\n }\n get stickyColumns(): Array<any> {\n return this._stickyColumns;\n }\n @Input () searchTextValue : string = \"\" ; //SK29OCT25\n @Input () dropdownSelectedData : any;\n @Input () dropdownLists : any;\n @Input () dateDropdown : boolean = false;\n @Input() from: any;\n\n // MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\n @Input() isSandwichLeave: boolean = false;\n @Input() isCheckButton: boolean = false;\n @Input() monthArray: any;\n @Input() yearArray: any;\n @Input() year: any;\n @Input() month: any;\n @Input() button: any;\n @Input() exportDisable: boolean = true;\n @Input() defaultWorkingHours: number = -1;\n @Input() set saveLOP(val: boolean) {\n this.tableSaveButton = val;\n }\n get saveLOP(): boolean {\n return this.tableSaveButton;\n }\n @Input() isAttendanceTable: boolean = false;\n\n\n @Output() dateEmit = new EventEmitter<any>();\n @Output() selectedValues = new EventEmitter<any[]>(); // to pass the selected checkbox values\n @Output() tableRowClick = new EventEmitter<any>; // datas to be passed when table row is clicked\n @Output() rowClick = new EventEmitter<any>; // MR 09NOV26 alias for tableRowClick\n @Output() filteredArray = new EventEmitter<any>; // filtered data from heqder icon is sent in an array\n @Output() searchFilterData = new EventEmitter<any>; // search filter data from search bar is sent to its parent\n @Output() searchValueChange = new EventEmitter<any>; // MR 09NOV26 search filter value change\n @Output() onEditData = new EventEmitter<any>;\n @Output() onCloneData = new EventEmitter<any>; //SKS25DEC24\n @Output() onSendData = new EventEmitter<any>; //SKS25DEC24\n @Output() onActivateData = new EventEmitter<any>; //SKS25DEC24\n @Output() onDeactivateData = new EventEmitter<any>; //SKS25DEC24\n @Output() onToggleChange = new EventEmitter<any>;\n @Output() saveButtonData = new EventEmitter<any>;\n @Output() OnDeleteData = new EventEmitter<any>; // when delete button clicked pass the data\n @Output() onDownload = new EventEmitter<any>; // when download button is clicked to pass the data\n @Output() approveData = new EventEmitter<{empId:any,id:any, data:any}>; //emit when apporve the leave \n @Output() rejectData = new EventEmitter<{empId:any,id:any}>; // emit when reject the leave\n @Output() expenseAttachmentEmit = new EventEmitter<any>;\n @Output() commonButtonClickEmit = new EventEmitter<any>;\n @Output() hyperLinkColumnEmit = new EventEmitter<any>;\n @Output() viewIconEmit = new EventEmitter<any>;\n @Output() downloadIconEmit = new EventEmitter<any>;\n @Output() pageDetails = new EventEmitter<any>;\n @Output() importButton = new EventEmitter<any>;\n @Output() exportButton = new EventEmitter<any>;\n @Output() sideNavButtons = new EventEmitter<any>;\n @Output() exportReports = new EventEmitter<any>;\n @Output() multipleSelectFilterExport = new EventEmitter<any>;\n @Output() filterDateEmitEvt : EventEmitter<any> = new EventEmitter<any>();\n @Output() sideNavEmit =new EventEmitter<{data:any,col:any, config:any}>; //SKS9JAN25 rightnav column emit\n @Output() searchText =new EventEmitter<string>; //SK29OCT25\n @Output() dropdownDataEmit = new EventEmitter<any>;\n // MR 09NOV26 Attendance and toolbar event emitters\n @Output() checkClicked = new EventEmitter<any>();\n @Output() yearDataEmit = new EventEmitter<any>();\n @Output() selectedValueEmit = new EventEmitter<any>();\n @Output() monthDataEmit = new EventEmitter<any>();\n @Output() doubleClickEmit = new EventEmitter<any>();\n @Output() hyperLinkClickEmit = new EventEmitter<any>();\n @Output() tableParamsChange = new EventEmitter<any>();\n\n\n \n @ViewChild(\"paginator\") paginator!: MatPaginator; //get references to the MatPaginator and MatSort components\n @ViewChild(MatSort) sort!: MatSort;\n @ViewChild('editInput') editInput!: ElementRef\n @ViewChild('tablePaginator') tablePaginator! : ElementRef;\n @ViewChildren('editColElement', { read: ElementRef }) editColElement!: QueryList<any>;\n\n selection: any;\n stickyCondition!: number;\n searchFilter = false;\n filterArray: Array<any> = [];\n selectedFilter: any;\n filterCheckBox: any;\n selectedFilterColumn: any;\n selectedFilterKey: Array<any> = [];\n renderColumns: string = 'displayedColumns';\n isDevMode: boolean = false;\n itemsPerPage = Constants.PAGE_SIZE_OPTIONS;\n dataSource!: MatTableDataSource<any>; // Declare a MatTableDataSource property for the table data.\n tableServiceData!: Subscription; //SK23FEB24 to detech table data changes\n exportSidescreen:boolean = false;\n headerTranslateLabels: any;\n exportReportsData: any; //SKS25OCT24\n uploadModal: boolean = false\n templateDownlaod = Constants.DOWNLOAD_TEMPLATE;\n errorMessage = '';\n importButtonData : any\n @Input() exportButtonLoadingSpinner: boolean = false; // MY 15OCT26 export file button loader\n @Input () pageTotal:any = 100;\n totalCount!:number\n type:any;\n conditionDeleteButton:any; //SKS21NOV24\n conditionEditButton:any; //SKS23DEC24\n conditionSendButton:any; //SKS25DEC24\n conditionDeactivateButton:any; //SKS25DEC24\n conditionActivateButton:any; //SKS25DEC24\n conditionCloneButton:any; //SKS25DEC24\n searchBoxValue: any;\n infoData: any;\n infoSidescreen = false;\n prevSearch: any;\n isLoading: any; // MSM28JAN25 initialize the loader value\n activeColumn: string | null = null; //SKS31JAN25 Track the active column\n private scrollSubscription!: Subscription; //SKS4FEB25 Scroll Service Subscription \n tablePageSubscription!: Subscription; //SK10OCT25\n isChecked: boolean = false;\n constructor(private scrollService: ScrollService, private overlay: Overlay ,private globalValues:GlobalValuesService, private apiService: ApiService, private alertService: AlertService, private errorHandler: ErrorHandlerService, private loaderService: LoaderService, public cdr: ChangeDetectorRef) { // MY 15OCT26 make cdr public for external change detection\n //SK10OCT25 page retain on data save\n this.tablePageSubscription = this.globalValues.tablPageParamsValue$.subscribe((data:any)=>{\n this.pageParams(data)\n })\n }\n\n // MY 15OCT26 trigger change detection on data-table and child components\n triggerChangeDetection() {\n this.cdr.markForCheck();\n this.cdr.detectChanges();\n }\n\n ngOnChanges(changes: SimpleChanges){\n // MY 22OCT26 Defensive array normalization to prevent template TypeError on undefined columns\n this.hyperLinkColumns = Array.isArray(this.hyperLinkColumns) ? this.hyperLinkColumns : [];\n this.stickyColumns = Array.isArray(this.stickyColumns) ? this.stickyColumns : [];\n this.editColumn = Array.isArray(this.editColumn) ? this.editColumn : [];\n this.filterColumns = Array.isArray(this.filterColumns) ? this.filterColumns : [];\n this.dateColumns = Array.isArray(this.dateColumns) ? this.dateColumns : [];\n this.timeColumns = Array.isArray(this.timeColumns) ? this.timeColumns : [];\n this.sideScreenColumn = Array.isArray(this.sideScreenColumn) ? this.sideScreenColumn : [];\n this.objectColumns = Array.isArray(this.objectColumns) ? this.objectColumns : [];\n\n if (changes['buttonLoadingSpinner'] || changes['tableSaveLoadingSpinner']) {\n this.cdr.markForCheck();\n }\n // MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui: Attendance & Month-Year sync\n if (changes['month']?.currentValue) {\n this.selectedMonth = this.getMonthNumber(changes['month']?.currentValue);\n }\n if (changes['year']?.currentValue) {\n this.selectedYear = Number(changes['year']?.currentValue) || this.selectedYear;\n }\n if (changes['headerLabels'] || changes['displayedColumns']) {\n this.updateDateLookups();\n }\n // SK01NOV24 pagination in table, getting pageSize and pageIndez form local storage\n this.dataSource = new MatTableDataSource(this.data);\n this.selection = new SelectionModel<any>(true, []);\n this.filterCheckBox = new SelectionModel<any>(true, []);\n if(!this.totalRecords && this.data){\n // SK10OCT25 page retain on save\n if(this.pageSize && this.pageIndex){\n const start = (Number(this.pageIndex) - 1) * Number(this.pageSize);\n const end = start + Number(this.pageSize);\n this.dataSource.data = this.data?.slice(start, end);\n } else {\n this.dataSource.data = this.data?.slice(0, 10);\n }\n \n }\n setTimeout(() => {\n this.dataSource.sort = this.sort;\n },100)\n // SK29OCT25 to retain search filter value on page navigate\n if(this.searchTextValue){\n this.searchBoxValue = this.searchTextValue;\n this.dataSource.data = this.data;\n this.dataSource.filter = this.searchTextValue.trim().toLowerCase();\n this.dataSource.data = this.dataSource.filteredData;\n this.totalCount = this.dataSource.filteredData.length;\n } else {\n this.totalCount = this.totalRecords || this.data?.length;\n }\n\n if (this.stickyColumn === true && this.displayedColumns) {\n this.stickyCondition = this.displayedColumns?.length;\n } else {\n this.stickyCondition = this.displayedColumns?.length + 1;\n }\n // SK13MAR24\n if(this.withCheckBox && this.actionButton){\n this.renderColumns = 'both';\n } else if(this.withCheckBox){\n this.renderColumns = 'select';\n } else if(this.actionButton){\n this.renderColumns = 'tableAction'; //SK19MAR25\n } \n if (this.searchConfigs?.searchFilterVal) {\n this.searchBoxValue = this.searchConfigs?.searchFilterVal; // Show value in the search box\n this.prevSearch = this.searchConfigs?.searchFilterVal;\n }\n // SKS21NOV24 Check and assign the delete button condition if it exists.\n this.conditionDeleteButton=undefined\n this.conditionEditButton=undefined\n this.conditionSendButton=undefined\n this.conditionActivateButton=undefined\n this.conditionDeactivateButton=undefined\n this.conditionCloneButton=undefined\n if(this.actionButtonCondition){\n this.actionButtonCondition.forEach((button: any)=>{\n if(button.actionButton === \"delete\"){\n this.conditionDeleteButton = button\n }\n if(button.actionButton === \"edit\"){ //SKS25DEC24 edit button config get\n this.conditionEditButton = button\n }\n if(button.actionButton === \"send\"){ //SKS25DEC24 send button config get\n this.conditionSendButton = button\n }\n if(button.actionButton === \"deactivate\"){ //SKS25DEC24 deactive button config get\n this.conditionDeactivateButton = button\n }\n if(button.actionButton === \"active\"){ //SKS25DEC24 active button config get\n this.conditionActivateButton = button\n }\n if(button.actionButton === \"clone\"){ //SKS25DEC24 clone button config get\n this.conditionCloneButton = button\n }\n })\n } \n\n // SK04SEP25 button loader check\n if(changes[\"buttonLoadingSpinner\"]){\n this.buttonLoadingSpinner = changes[\"buttonLoadingSpinner\"].currentValue\n }\n if(changes[\"deleteModal\"]){\n this.deleteModal = changes[\"deleteModal\"].currentValue\n }\n }\n\n ngOnInit(): void {\n // SKS4FEB25 if scroll event emit then searchFilter close\n this.scrollSubscription = this.scrollService.scrollPosition$.subscribe(position => {\n if(position > 0) {\n this.searchFilter = false\n }\n });\n // MSM28JAN25 subscribe the loader value\n this.loaderService.loading.subscribe((loadingStates) => {\n this.isLoading = loadingStates;\n this.cdr.markForCheck();\n });\n // this.isDevMode = isDevMode();\n // // The dataSource property is set to a new MatTableDataSource instance that contains table data\n // // Create a new selection model that allows multiple items to be selected\n this.dataSource = new MatTableDataSource(this.data);\n if(!this.totalRecords && this.data){\n // SK10OCT25\n if(this.pageSize && this.pageIndex){\n const start = (Number(this.pageIndex) - 1) * Number(this.pageSize);\n const end = start + Number(this.pageSize);\n this.dataSource.data = this.data?.slice(start, end);\n } else {\n this.dataSource.data = this.data?.slice(0, 10);\n }\n }\n this.selection = new SelectionModel<any>(true, []);\n this.filterCheckBox = new SelectionModel<any>(true, []);\n setTimeout(() => {\n this.dataSource.sort = this.sort;\n },0)\n\n // SK29OCT25 retain search filter value\n if(this.searchTextValue){\n this.searchBoxValue = this.searchTextValue;\n this.dataSource.data = this.data;\n this.dataSource.filter = this.searchTextValue.trim().toLowerCase();\n this.dataSource.data = this.dataSource.filteredData;\n this.totalCount = this.dataSource.filteredData.length;\n } else {\n this.totalCount = this.totalRecords || this.data?.length;\n }\n\n if (this.stickyColumn === true && this.displayedColumns) {\n this.stickyCondition = this.displayedColumns?.length;\n } else {\n this.stickyCondition = this.displayedColumns?.length + 1;\n }\n if(this.withCheckBox && this.actionButton){\n this.renderColumns = 'both';\n } else if(this.withCheckBox){\n this.renderColumns = 'select';\n } else if(this.actionButton){\n this.renderColumns = 'tableAction'; //SK19MAR25\n }\n }\n ngOnDestroy(): void {\n if (this.scrollSubscription) {\n this.scrollSubscription.unsubscribe();\n }\n }\n createScrollStrategy(): ScrollStrategy {\n return this.overlay.scrollStrategies.close();\n }\n // closing the filter component when the mouse is clicked outside table\n @HostListener('document:click', ['$event']) onDocumentClick(event: any) {\n this.searchFilter = false;\n event.stopPropagation(); // prevents any other default action\n }\n clearCheckBox(){\n this.selection.clear();\n }\n\n // filter data that to be displayed in header filter icon is passed in 'filterArray' array\n filter(datas: any) {\n this.filterArray = [];\n this.selectedFilter = datas;\n this.filterArray = this.multipleFilter[datas];\n this.searchFilter = !this.searchFilter;\n this.selectedFilterColumn = datas\n // MV24AUG24 Determines the data source and updates the active filter box with the corresponding filter data and selected box.\n this.globalValues.activeFilterBox({filterKeys:this.filterDataArray,activeBox:datas}) \n }\n // SK01NOV24 emitting pagr size and index to parent on paginating\n pageParams(event:any){\n if(!this.totalRecords && this.data){\n const start = (Number(event.pageIndex) - 1) * Number(event.pageSize);\n const end = start + Number(event.pageSize);\n this.dataSource.data = this.data?.slice(start, end);\n }\n localStorage.setItem(\"tablePageSize\",event.pageSize);\n localStorage.setItem(\"tablePageIndex\",event.pageIndex);\n this.pageSize = event.pageSize; //SK10OCT25\n this.pageIndex = event.pageIndex; //SK10OCT25\n const datum:any = {pageSize:event.pageSize, pageIndex:Number(event.pageIndex), tableDetails:this.tableCallDetails, length: event.length}\n this.pageDetails.emit(datum);\n }\n\n isFirstCell(column: string): boolean {\n return this.displayedColumns.indexOf(column) === 0;\n }\n \n\n // apply search bar filter using mat\n applyFilter(event: Event) {\n this.dataSource.data = this.data; //SK29OCT25\n const filterValue = (event.target as HTMLInputElement).value;\n this.dataSource.filter = filterValue.trim().toLowerCase();\n this.searchFilterData.emit(this.dataSource.filteredData);\n this.searchText.emit(filterValue); //SK29OCT25 emit filter values as text\n this.searchValueChange.emit(filterValue); // MR 09NOV26 emit searchValueChange\n this.totalCount = this.dataSource.filteredData.length;\n if (this.dataSource.paginator) {\n this.dataSource.paginator.firstPage();\n }\n this.cdr.markForCheck();\n }\n\n /** Whether the number of selected elements matches the total number of rows. */\n isAllSelected() {\n // check if all rows are selected\n const numSelected = this.selection.selected.length;\n const numRows = this.dataSource.data.length;\n return numSelected === numRows;\n }\n\n /** Selects all rows if they are not all selected; otherwise clear selection. */\n masterToggle() {\n // if there is a selection then clear that selection\n // emit the selected value only to parent\n if (this.isSomeSelected()) {\n // SK10APR24 to remove the editRow, if the checkbox is unchecked\n this.selection.selected.forEach((element:any) => {\n if(element?.editRow) element.editRow = false;\n });\n this.selection.clear();\n this.selectedValues.emit(this.selection.selected);\n } else {\n // If no items are selected, either select all items or clear the selection\n // emit the selected values to parent\n this.isAllSelected()\n ? this.selection.clear()\n : \n // this.selection.select(...this.data) //SK21FEB25 commented to select all data rows\n this.data.forEach(row => {\n if(this.fromWhere === 'paySlip'){\n if(row?.isPayProcessed === true){\n this.selection.select(row);\n } \n } else if (this.fromWhere === 'payrollTable'){\n if(row?.isPayProcessed === false){\n this.selection.select(row);\n } \n } else {\n this.selection.select(row);\n }\n \n });\n this.selectedValues.emit(this.selection.selected);\n }\n }\n \n\n\n // Checks whether any items are currently selected in the table.\n isSomeSelected() {\n return this.selection.selected.length > 0;\n }\n\n\n // emit the check box values, that selected separately\n // MY 05OCT26 Toggle selection, exit edit mode on deselect, and emit selected rows\n separateRowSelect(element: any, maybeElement?: any) {\n const target = maybeElement || element;\n if (!maybeElement) {\n this.selection.toggle(target);\n }\n if (!this.selection.isSelected(target) && target?.editRow) {\n target.editRow = false;\n }\n this.selectedValues.emit(this.selection.selected);\n }\n\n // data that to be passed, when table row is clicked\n tableClick(data: any) {\n this.tableRowClick.emit(data);\n this.rowClick.emit(data);\n }\n\n // the selected filter data in header is passed as aray with that column name as first array and checked data as second array\n filteredData(filterItems: any) {\n const st = this.selectedFilterColumn.toLocaleString(); \n const arr = [st, filterItems]\n this.filteredArray.emit(arr);\n }\n //to carryout delete functionality in child component;\n delete(data:any, index:any){\n // data.emitted = true;\n // SK27FEB24 added elements to emit ondeleting the record(made changes on wherever used)\n let orderData = this.dataSource._orderData(this.data);\n this.OnDeleteData.emit({data:data, index:index, allData:orderData, tableConfigs:(this.tableConfigurations || {})});\n }\n\n deleteData:any;\n deleteIndex!:number\n deleteOrderedData:any;\n @Input() deleteModal:boolean = false; //SK04SEP25 made as input\n // SK06NOV24 on delete click save the data in variables\n deleteRecord(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n this.deleteData = data;\n this.deleteIndex = index;\n this.deleteOrderedData = orderData;\n this.deleteModal = true;\n }\n\n // SK06NOV24 after clicking yes in delete alert modal, emit to parent\n deleteRecordData(){\n this.OnDeleteData.emit({data:this.deleteData, index:this.deleteIndex, allData:this.deleteOrderedData, tableConfigs:(this.tableConfigurations || {})});\n this.deleteModal = false;\n }\n // to emit data to document component on clicking download;\n downloadPdf(data:any){\n this.onDownload.emit(data);\n \n }\n\n\n //to save the edited data in table;\n saveButton(){\n // MY 05OCT26 Clear editRow on all rows when saving\n this.data.forEach((element: any) => {\n if (element?.editRow) element.editRow = false;\n });\n // SK10APR24 emitting all data with selected data\n this.saveButtonData.emit({selectedData:this.selection.selected, allData:this.data});\n }\n\n // pass the rejected reason\n onEdit(data:any, index:any, status?:string, fromWhere?: string){\n // MY 23OCT26 Do not allow editing approved expenses\n const rowStatus = status || data?.status;\n if (this.fromWhere === 'expense' && rowStatus && rowStatus.toLowerCase() === 'approved') {\n return;\n }\n // SK10APR24 for payroll condtions added on editng LOP, if payroll processed, checkbox will be disabled\n let orderData = this.dataSource._orderData(this.data);\n if (this.fromWhere === 'payrollTable'){\n if(data.payrollStatus === 'Run Payroll'){\n this.selection.select(data);\n if(typeof data === 'object') data.editRow = true;\n }\n } else {\n if(typeof data === 'object') data.editRow = true; // made editing row as true //SK06MAR24 solve undefined error on string\n this.selection.select(data);\n }\n this.onEditData.emit({data:data, index:index, allData:orderData, isEdited: true, selectedData:this.selection.selected, status: status}); //SK25AUG25 selected list sent on edit emit //SK20FEB26 status sent to child\n }\n onClone(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.cloneRow = true; // made cloneRow row as true //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onCloneData.emit({data:data, index:index, allData:orderData});\n }\n onSend(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.sendRow = true; // made sendRow row as true //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onSendData.emit({data:data, index:index, allData:orderData});\n }\n onActivate(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.isActive = true; // made isActive row as true //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onActivateData.emit({data:data, index:index, allData:orderData});\n }\n onDeactivate(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.isActive = false; // made isActive row as false //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onDeactivateData.emit({data:data, index:index, allData:orderData});\n }\n// on approve the leave \n onApprove(empId:string,id:string,data:string){\n this.approveData.emit({empId,id,data});\n\n }\n // on reject the leave\n onReject(empId:string,id:string){\n this.rejectData.emit({empId,id});\n }\n\n expenseAttachment(event:any,element:any){\n this.expenseAttachmentEmit.emit({event,element});\n }\n\n //SC20NOV2025 month picker emit \n dateFilter(event: any){\n this.dateEmit.emit(event);\n }\n\n dropdownEmitFunction(event: any){\n this.dropdownDataEmit.emit(event);\n }\n\n commonButtonClick(buttonClickData:any, button:any){\n // SK04FEB25 buttom emit code updated\n if(button.name === \"Import\" || buttonClickData.name === \"Import\" ){\n if(button.name === \"Import\" ){\n this.importButtonEmit(button)\n } else {\n this.importButtonEmit(buttonClickData)\n }\n } else if(button.name === \"Export\" || buttonClickData.name === \"Export\" ){\n if(this.from === 'expense' || this.from === 'ess'){\n this.exportButtonSideNav(button)\n } else if(button.name === \"Export\" ){\n this.exportButtonEmit(button)\n } else {\n this.exportButtonEmit(buttonClickData)\n }\n } else if(button.type === \"group\" || button.type === \"dropdown\") {\n this.commonButtonClickEmit.emit(buttonClickData);\n } else {\n this.commonButtonClickEmit.emit(button);\n }\n }\n\n onClickHyperlink(column:any, element:any, index:number, isHyperLink:any){ \n if(isHyperLink) this.hyperLinkColumnEmit.emit({column:column, element:element, index:index}); //SK13MAR24 hyperlinl columns only emitted\n }\n\n // SK19JAN24 to check whether the hyperlink action is present in that column\n checkHyperlinkCheck(col:any){\n return this.hyperLinkColumns?.includes(col) ? true: false; \n }\n\n fileNameArray(event:any){\n }\n\n //SK23FEB24 on add record in table, the 'inlineElement' values will be assigned to the table data \n addTableRecord(element:any){\n var obj:any = {};\n const keys = Object.keys(element[0]);\n keys.forEach((elementKey:any) => {\n obj[elementKey]='';\n });\n this.data.push(obj);\n const data:any = this.data;\n this.dataSource = new MatTableDataSource(data);\n this.selection = new SelectionModel<any>(true, []);\n this.filterCheckBox = new SelectionModel<any>(true, []);\n this.dataSource.sort = this.sort;\n // this.dataSource.paginator = this.paginator;\n\n if (this.stickyColumn === true && this.displayedColumns ) {\n this.stickyCondition = this.displayedColumns?.length;\n } else {\n this.stickyCondition = this.displayedColumns?.length + 1;\n }\n }\n\n // SK27FEB24 to edit the specifific element(alternate solution)\n doubleclickEdit(i:number, j:number, ele:any, col:any){\n const editColIndex = this.editColumn.findIndex((data:any)=>data === col);\n const ind = (this.data?.length * editColIndex) + j;\n if(!this.editColElement.toArray()[ind].nativeElement.classList.contains(\"input-box\")){\n this.editColElement.toArray()[ind].nativeElement.classList.toggle(\"input-box\");\n this.editColElement.toArray()[ind].nativeElement.readOnly = false;\n }\n }\n\n viewIconClick(element:any){\n this.viewIconEmit.emit({element:element});\n } \n\n downloadIconClick(element:any){\n this.downloadIconEmit.emit({element:element});\n }\n\n\n observableOf(arg0: null): any {\n throw new Error('Function not implemented.');\n }\n\n // SK03OCT24 table import button function\n importButtonEmit(event : any){\n this.uploadModal = true //SKS25OCT24 for popup upload card\n this.importButtonData = event;\n }\n\n // SK03OCT24 table export button function\n exportButtonEmit(event: any){\n this.exportButton.emit(event);\n this.exportReportsData =event\n this.exportSidescreen = true \n }\n\n // SK03OCT24 multipleCheckBox button emit function\n exportFieldsButtonEmit(event:any){\n this.sideNavButtons.emit(event)\n }\n\n // SK03OCT24 multipleFilter button emit function\n exportFilterButtonEmit(event:any){\n this.sideNavButtons.emit(event)\n }\n\n // SK03OCT24 side nav export button function\n exportButtonSideNav(button?:any){\n // MY 15OCT26 prevent export trigger while export is already in progress\n if (this.exportButtonLoadingSpinner) return;\n if(this.selectedValues){\n this.exportReports.emit(button)\n } else { // SKS17JUL26 alert message if no data selected for export\n this.alertService.messageOnPass('error', \"No data selected.\");\n }\n }\n\n // SK03OCT24 this function emit while selecting values in filter box\n selectedValuesEmit(event:any){\n this.multipleSelectFilterExport.emit(event)\n }\n\n // SK03OCT24 if date filter, emits the slected dates function\n filterDateEmit(event:any){\n this.filterDateEmitEvt.emit(event)\n }\n\n downloadTemplate(){\n this.apiService.getCSVTemplates(this.importButtonData.tableName).subscribe({\n next: (v: any) => {\n const file = new Blob([v], { type: 'text/csv' }); //SKS25OCT24 This matches the content type of the response\n saveAs(file, this.importButtonData.fileName+this.importButtonData.fileFormat); //SKS25OCT24 name should be dynamic\n this.saveSuccess(this.importButtonData.fileName +\" \"+ this.templateDownlaod, v.TRANS_KEY)\n },\n error: (e: HttpErrorResponse) => {\n this.errorHandler.handleError(e);\n }\n });\n }\n //SKS25OCT24 Alert Message functions\n saveSuccess(event:any, kay?:any){\n this.alertService.messageOnPass('success', event, kay);\n }\n //SKS25OCT24 Upload the excel to add data to Employee record\n async uploadRecordsFile(event: any){\n const fd = new FormData();\n const file = await this.globalValues.base64ToFile( event[0].doc, event[0].name, event[0].type);\n fd.append('create_file', file, file.name);\n this.uploadModal = false // MR 11JAN24 to close the pop-up after upload button click\n this.apiService.writeValue(this.importButtonData.apiCall,this.importButtonData.endPoint,fd).subscribe({\n next: (response:any) => { \n //SKS25OCT24 Convert base64 string to binary data\n const byteCharacters = atob(response.data); //SKS25OCT24 Decode base64\n const byteNumbers = new Uint8Array(byteCharacters.length);\n \n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const blob = new Blob([byteNumbers], { type: 'text/xlsx' }); //SKS25OCT24 Create a Blob\n \n //SKS25OCT24 Use FileSaver.js's saveAs to trigger the download\n this.alertService.messageOnFetch('successFetch',event.name, \"The report file has been downloaded successfully.\");\n saveAs(blob,this.importButtonData.fileName+ this.importButtonData.fileFormat);\n this.uploadModal = false\n },\n error: (e: HttpErrorResponse) => {\n this.errorHandler.handleError(e);\n }\n });\n }\n\n // MY 22OCT26 Safe condition checking with null-coalescing and array checks\n isConditionMet(element: any, conditions: any): boolean {\n const { andConditionList, orConditionList } = conditions || {};\n \n //SKS21NOV24 If andConditionList exists, check that all conditions are met\n const isAndConditionMet = andConditionList ? andConditionList.every((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond?.condition) ? cond.condition.includes(element?.[cond?.column]) : (cond?.condition === element?.[cond?.column])\n ) : true; //SKS21NOV24 If no andConditionList, consider it as always met\n \n //SKS21NOV24 If orConditionList exists, check if at least one condition is met\n const isOrConditionMet = orConditionList ? orConditionList.some((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond?.condition) ? cond.condition.includes(element?.[cond?.column]) : (cond?.condition === element?.[cond?.column])\n ) : true; //SKS21NOV24 If no orConditionList, consider it as always met\n \n //SKS21NOV24 Return true if the AND condition is met and the OR condition is met\n return isAndConditionMet && isOrConditionMet;\n } \n //SKS21NOV24 Check if the column is a date column\n isDateColumn(column: string): boolean {\n return this.dateColumns?.includes(column) ?? false;\n }\n\n //SKS21NOV24 Check if the column is a time column\n isTimeColumn(column: string): boolean {\n return this.timeColumns?.includes(column) ?? false;\n }\n onInfoClick(ele:any,col:any,index:any){ //SKS27NOV24 infoSidescreen emit\n this.infoData = ele\n this.infoSidescreen = true\n }\n onSearch(event:any){\n this.searchBoxValue = event; // SKS28NOV24 Update the displayed value in the search box\n if (this.searchConfigs) {\n this.searchFilterData.emit(event); \n }\n }\n emptySearch(event:any){ // SKS28NOV24 If the value in the search box is empty, call the onSearch function automatically\n if(!(event.target as HTMLInputElement).value.trim() && (this.prevSearch != (event.target as HTMLInputElement).value.trim())){\n this.onSearch((event.target as HTMLInputElement).value)\n }\n this.prevSearch =(event.target as HTMLInputElement).value.trim()\n this.searchText.emit((event.target as HTMLInputElement).value) //SK29OCT25\n }\n isObjectColumn(column: string): boolean {\n return this.objectColumns?.includes(column) ?? false;\n }\n onSideNavInfoClick(data:any,col:any,config:any){ //SKS7JAN25 infoSidescreen emit \n this.sideNavEmit.emit({data,col,config})\n }\n //SKS31JAN25 for active column select\n onColumnClick(column: string) {\n this.activeColumn = column;\n }\n\n // MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui: Attendance & Month-Year picker state & methods\n selectedMonth: number = 0;\n selectedYear: number = new Date().getFullYear();\n popupOpen: boolean = false;\n confirmModal: boolean = false;\n months: string[] = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n weekendColumnsSet: Set<string> = new Set();\n futureColumnsSet: Set<string> = new Set();\n todayColumn: string | null = null;\n leaveTypeSet: Set<string> = new Set(['casual leave', 'sick leave', 'earned leave', 'lop', 'loss of pay', 'maternity leave', 'paternity leave', 'compensatory off', 'comp off']);\n\n updateDateLookups(): void {\n this.weekendColumnsSet.clear();\n this.futureColumnsSet.clear();\n this.todayColumn = null;\n if (!this.headerLabels || !this.displayedColumns) return;\n\n const now = new Date();\n const todayZero = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const todayDate = now.getDate();\n const todayMonth = now.getMonth() + 1;\n const todayYear = now.getFullYear();\n\n for (let i = 0; i < this.displayedColumns.length; i++) {\n const col = this.displayedColumns[i];\n const header: any = this.headerLabels[i];\n if (header && header.year && header.month && header.date) {\n const d = new Date(header.year, header.month - 1, header.date);\n const dayOfWeek = d.getDay();\n if (dayOfWeek === 0 || dayOfWeek === 6) {\n this.weekendColumnsSet.add(col);\n }\n if (d.getTime() > todayZero) {\n this.futureColumnsSet.add(col);\n }\n if (header.date === todayDate && header.month === todayMonth && header.year === todayYear) {\n this.todayColumn = col;\n }\n }\n }\n }\n\n isWeekend(column: string): boolean {\n return this.weekendColumnsSet.has(column);\n }\n\n isToday(column: string): boolean {\n return this.todayColumn === column;\n }\n\n isFutureDate(column: string): boolean {\n return this.futureColumnsSet.has(column);\n }\n\n getInitials(name: string): string {\n if (!name || typeof name !== 'string') return '';\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].substring(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n isNearTarget(workingDays: any, totalDays: any): boolean {\n const w = Number(workingDays);\n const t = Number(totalDays);\n if (!t || t <= 0) return false;\n return (w / t) >= 0.8;\n }\n\n isLeaveType(status: any): boolean {\n if (!status || typeof status !== 'string') return false;\n const s = status.toLowerCase().trim();\n return s === 'absent' || this.leaveTypeSet.has(s);\n }\n\n prevMonth(): void {\n if (this.selectedMonth === 0) {\n this.selectedMonth = 11;\n this.selectedYear--;\n } else {\n this.selectedMonth--;\n }\n this.emitSelection();\n this.cdr.markForCheck();\n }\n\n nextMonth(): void {\n if (this.selectedMonth === 11) {\n this.selectedMonth = 0;\n this.selectedYear++;\n } else {\n this.selectedMonth++;\n }\n this.emitSelection();\n this.cdr.markForCheck();\n }\n\n togglePopup(): void {\n this.popupOpen = !this.popupOpen;\n this.cdr.markForCheck();\n }\n\n selectMonth(monthIndex: number): void {\n this.selectedMonth = monthIndex;\n this.emitSelection();\n this.togglePopup();\n }\n\n changeYear(step: number): void {\n this.selectedYear += step;\n this.emitSelection();\n this.cdr.markForCheck();\n }\n\n emitSelection(): void {\n const monthVal = this.monthArray ? this.monthArray[this.selectedMonth] : this.months[this.selectedMonth];\n this.monthDataEmit.emit(monthVal);\n this.yearDataEmit.emit(this.selectedYear);\n this.selectedValueEmit.emit({\n month: monthVal,\n year: this.selectedYear\n });\n }\n\n checkButtonClicked(): void {\n this.checkClicked.emit();\n }\n\n doubleClickFunction(element: any, data: any, presentData: any): void {\n if (element?.isSkeleton) return;\n this.doubleClickEmit.emit({ employeeDetail: element.employeeDetail, date: data, data: presentData });\n }\n\n getMonthNumber(month: any): number {\n if (typeof month === 'number') return month;\n if (!month) return 0;\n const mStr = String(month).toLowerCase().slice(0, 3);\n const mList = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\n const idx = mList.indexOf(mStr);\n return idx >= 0 ? idx : 0;\n }\n}\n","<div class=\"table-layout\" [id]=\"tableId\" style=\"padding-top: 1px;\">\n <div>\n <!-- SK30JAN25 title added -->\n <div class=\"d-flex justify-content-center table-title align-text-center\">\n {{title}}\n </div>\n \n <div class=\"flex justify-content-between\" style=\"padding-bottom: 5px;\">\n <div class=\"d-flex align-items-center\">\n <!-- MR 09NOV26 table-toolbar-left projection slot -->\n <ng-content select=\"[table-toolbar-left]\"></ng-content>\n\n <!-- MR 09NOV26 Month / Year Picker -->\n <div class=\"picker-container\" *ngIf=\"monthArray && monthArray.length > 0\">\n <i class=\"arrow-btn fusion-icon fusion-icon-size-lg fusion-icon-arrow-left-1 nav-icon\"\n (click)=\"prevMonth()\" style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n <span class=\"month-label\" (click)=\"togglePopup()\">\n {{ months[selectedMonth] }} {{ selectedYear }}\n </span>\n <i class=\"arrow-btn fusion-icon fusion-icon-size-lg fusion-icon-arrow-right-1 nav-icon\"\n (click)=\"nextMonth()\" style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n </div>\n <div class=\"popup\" *ngIf=\"popupOpen\">\n <div class=\"year-section\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-arrow-left-1 nav-icon\" (click)=\"changeYear(-1)\"\n style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n <span>{{ selectedYear }}</span>\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-arrow-right-1 nav-icon\" (click)=\"changeYear(1)\"\n style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n </div>\n\n <div class=\"month-grid\">\n <div class=\"month-item\" *ngFor=\"let m of (monthArray || months); let i = index\" [class.active]=\"i === selectedMonth\"\n (click)=\"selectMonth(i)\">\n {{ m | slice:0:3 }}\n </div>\n </div>\n </div>\n\n <div *ngIf=\"dateDropdown \">\n <app-drop-down class=\"field-input\" [lists]='dropdownLists' dropDownHeight=\"38px\" dropDownWidth=\"200px\"\n (dataEmit)=\"dropdownEmitFunction($event)\" [selectedData]=\"dropdownSelectedData\"></app-drop-down>\n </div>\n <!-- SC11NOV2025 if isDatePicker is true then show the date picker -->\n <div *ngIf=\"isDatePicker\">\n <app-drop-down [lists]='list' [selectedData]=\"selectedData\" dropDownHeight=\"42px\" dropFontWeight=\"500\"\n dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\" dropDownWidth=\"200px\"\n (dataEmit)=\"dateFilter($event)\"></app-drop-down>\n </div>\n </div>\n <!-- SKS24JAN25 show Nos in table -->\n <!-- <div style=\"display: flex; align-items: center;\">\n <p *ngIf=\"totalRecords || totalCount\" style=\"font-weight: var(--fw-500); margin-right: 5px; margin-bottom: 0px;\">{{'APP.NOS' | customTranslate : 'Nos'}} </p> <span style=\"color: var(--fc-primary-color, rgb(43, 87, 249));\">{{totalRecords || totalCount}}</span>\n </div> -->\n <!-- SKS24JAN25 search bar config and nonconfig -->\n <div style=\"margin-left:auto;\">\n <div class=\"flex\" style=\"align-items: center;\">\n <!-- MR 09NOV26 table-toolbar-right projection slot -->\n <ng-content select=\"[table-toolbar-right]\"></ng-content>\n\n <!-- MR 09NOV26 Sandwich leave check button -->\n <button *ngIf=\"isSandwichLeave && isCheckButton !== false\" class=\"btn btn-primary me-2\"\n (click)=\"confirmModal = true\">\n {{ 'APP_HRM_ATTENDANCE.CHECK' | customTranslate : 'Check' }}\n </button>\n\n <div class=\"search\">\n <div class=\"search-bar\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n <input type=\"text\" placeholder=\"{{ 'APP.SEARCH' | customTranslate : 'Search' }}\" matInput\n (keyup)=\"searchConfigs ? emptySearch($event) : applyFilter($event)\"\n [value]=\" (searchConfigs || searchTextValue) ? searchBoxValue || '' : '' \" #input\n style=\"font-size: 13px !important;\">\n <img *ngIf=\"searchConfigs && searchBar\" (click)=\"onSearch(input.value)\"\n src=\"../assets/images/icons/general/configSearch.svg\" class=\"configSearch\">\n </div>\n </div>\n\n <!-- MR 09NOV26 Single toolbar button support from second-data-table -->\n <div class=\"flex\" *ngIf=\"button\">\n <app-fusion-button class=\"data-table-fsbtn ms-2 me-2\" (buttonClickEmit)=\"commonButtonClick($event, button)\"\n [buttonType]=\"button?.class || button?.buttonType\" [buttonValue]=\"button?.namePath || button?.labelPath || button?.name | customTranslate : button?.label || button?.name\"\n [buttonConfig]=\"button?.buttonConfig\" [type]=\"button?.type\" [fcBtnIconLeftSrc]=\"button?.btnIconLeftSrc || button?.fcBtnIconLeftSrc\"\n [isImageSvg]=\"button?.isImageSvg\">\n </app-fusion-button>\n </div>\n\n <!-- SKS24JAN25 single, group and dropdown dynamic buttons -->\n <div class=\"flex\" *ngIf=\"isButtons\" style=\"padding-left: 7px;\">\n <div class=\"flex\" *ngFor=\"let button of buttonArray\">\n <app-fusion-button class=\"data-table-fsbtn\" [buttonDisable]=\"button.buttonDisable\"\n [buttonLoadingSpinner]=\"buttonLoadingSpinner\" (buttonClickEmit)=\"commonButtonClick($event,button)\"\n [buttonType]=\"button.label === 'Export' ? 'grey-border rounded-3 bg-white text-dark' : button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\"\n [buttonConfig]=\"button.buttonConfig\" [type]=\"button.type\" class=\"ms-2 me-2\"\n [fcBtnIconLeftSrc]=\"button.label === 'Export' ? '../assets/images/icons/general/upload-icon.svg' : button.fcBtnIconLeftSrc\" [isImageSvg]=\"button.label === 'Export' ? true : button.isImageSvg\">\n <!--SKS25OCT24 If the value is 'Import' or 'Export', this button does not work-->\n </app-fusion-button>\n </div>\n </div>\n \n </div>\n\n <!-- SK23FEB24 for adding new record in table -->\n <div class=\"flex cursor-pointer\" *ngIf=\"addInlineRecord\" (click)=\"addTableRecord(inlineElement)\"\n [matTooltip]=\"'APP.ADD_NEW_RECORD' | customTranslate : 'Add New Record'\">\n <div class=\"ms-1 me-1\">\n <!-- MR 30OCT26 Refactor inline html template styling to theme tokens -->\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-add-square nav-icon\"\n style=\"color: var(--fb-text-primary, #0f172a) !important;\"></i>\n </div>\n </div>\n </div>\n </div>\n\n <!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui: Attendance Top Legend Bar -->\n <div class=\"d-flex justify-content-between align-items-center top-legend-bar\" *ngIf=\"isAttendanceTable || displayedColumns.includes('employeeDetail') || (monthArray && monthArray.length > 0)\">\n <div class=\"d-flex align-items-center gap-3 flex-wrap\">\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-present\">&#10003;</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.PREsENT' | customTranslate : 'Present' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-absent\">&#10005;</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.ABSENT' | customTranslate : 'Absent' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-half\">½</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.HALF_DAY' | customTranslate : 'Half day' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-holiday\">H</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.HOLIDAY' | customTranslate : 'Holiday' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-weekoff\">-</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.WEEK_OFF' | customTranslate : 'Week Off' }}</span>\n </div>\n </div>\n <div class=\"table-subtitle\" *ngIf=\"titleOn && title\">\n {{ title | customTranslate : title }}\n </div>\n </div>\n\n <div class=\"table-margin\">\n <div class=\"table-container\" cdkScrollable> <!-- SKS3FEB25 The search filter closes when scrolling the table-->\n <!-- MSM28JAN25 skeleton loader condition --> \n <ng-container *ngIf=\"!isLoading[tableId] || isLoading[tableId]?.length === 0; else loadingTemplate\">\n <table mat-table [dataSource]=\"dataSource || []\" [ngStyle]=\"{ width: tableWidth }\" matSort>\n <!-- Checkbox Columns -->\n <ng-container [sticky]=\"true\" class=\"checkboxCol\" *ngIf=\"withCheckBox\" matColumnDef=\"select\" sticky>\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column head-color\" style=\"border-left: 1px solid var(--fb-border-default, #e2e8f0);\">\n <input type=\"checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"masterToggle()\"\n [checked]=\"selection?.hasValue()\" [indeterminate]=\"selection?.hasValue() && !isAllSelected()\"\n class=\"custom-checkbox\" />\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"body-color\" >\n <!-- SK18OCT24 check payroll Inprogress/Completed from backend data -->\n <input type=\"checkbox\" class=\"custom-checkbox\"\n [title]=\"(fromWhere === 'payrollTable' || fromWhere === 'paySlip') ? (row?.payProcessComment || '') : ''\"\n (click)=\"$event.stopPropagation()\" (change)=\"separateRowSelect(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"(fromWhere === 'payrollTable' && row.isPayProcessed === true) || (fromWhere === 'paySlip' && row.isPayProcessed === false)\" />\n </td>\n <td mat-footer-cell *matFooterCellDef>\n {{ \"\" }}\n </td>\n </ng-container>\n\n <!-- data Columns -->\n <!-- set the matColumnDef attribute to the column name and use interpolation to dynamically generate the mat-header-cell and mat-cell elements based on the column name-->\n <ng-container *ngFor=\"let column of displayedColumns; let i=index\" [matColumnDef]=\"column\"\n [stickyEnd]=\"i === (stickyCondition - 1) ? true : false\" [sticky]=\"stickyColumns.includes(column)\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header\n style=\"border-right: 1px solid var(--fb-border-default, #e2e8f0);\" class=\"head-color ms-2 ps-2 pe-2\" \n [ngClass]=\"{'sticky-column': i === (stickyCondition - 1),'active-column': activeColumn === column,'first-header-border': i === 0}\"\n (click)=\"$event.stopPropagation(); onColumnClick(column)\">\n <span [class]=\"fromWhere === 'payrollTable' || fromWhere === 'paySlip' ? 'table-width' : '' \">{{\n (\n translatePath && translatePath[displayedColumns.indexOf(column)]\n ? translatePath[displayedColumns.indexOf(column)]\n : headerLabels[displayedColumns.indexOf(column)]\n )\n | customTranslate : headerLabels[displayedColumns.indexOf(column)]\n }}\n </span>\n <div (click)=\"$event.stopPropagation()\" class=\"position-relative\" cdk-overlay-origin\n #trigger=\"cdkOverlayOrigin\">\n <img class=\"ms-1\" *ngIf=\"filterColumns.includes(column)\" style=\"margin-bottom: 2px;\"\n (click)=\"filter(column)\" src=\"../assets/images/icons/general/filter-icon.svg\">\n </div>\n <ng-template cdk-connected-overlay [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"searchFilter === true && column === selectedFilter\"\n [cdkConnectedOverlayScrollStrategy]=\"createScrollStrategy()\"\n (overlayOutsideClick)=\"searchFilter = false\" (detach)=\"searchFilter = false\">\n <app-search-filter class=\"search-component position-absolute\"\n [class]=\"searchFilter === true && column === selectedFilter ? 'd-block' : 'd-none'\"\n [filterItems]=\"filterArray\" (emitValues)=\"filteredData($event)\" (click)=\"$event.stopPropagation()\">\n </app-search-filter>\n </ng-template>\n </th>\n <ng-container *ngIf=\"dataSource.data.length > 0\">\n <td mat-cell class=\"body-color ps-2 pe-2\" *matCellDef=\"let element; let j = index\"\n [class.active-column]=\"activeColumn === column\">\n <!-- SK29OCT25 employee detail column -->\n <div *ngIf=\"column === 'employeeDetail'\">\n <div class=\"d-flex flex-row\" style=\"left:0;\">\n <div *ngIf=\"element['employeeName'] || element['name']\"\n [class]=\"hyperLinkColumns.includes(column) ? 'hyper-link' : '' \"\n style=\"font-size: var(--fs-small);color: var(--fb-text-primary, #0f172a);font-weight: var(--fw-600);\">\n {{element[\"employeeName\"] || element[\"name\"] || ''}}</div>\n <div *ngIf=\"element['employeeId']\"\n style=\"font-size: 11px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-400);\" class=\"ms-1\">\n [{{element[\"employeeId\"] || ''}}]</div>\n </div>\n <div class=\"d-flex flex-row\" *ngIf=\"element['designation'] && element['designation'] !== ''\">\n <div style=\"font-size: 10px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-600);\">\n {{element[\"designation\"] || ''}}\n </div>\n <div *ngIf=\"element['designation'] && element['designation'] !== '' && element['location'] && element['location'] !== ''\"\n style=\"font-size: 10px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-600);\">,</div>\n <div *ngIf=\"element['location'] && element['location'] !== ''\" style=\"font-size: 10px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-600);\">\n {{element[\"location\"] || ''}}\n </div>\n </div>\n </div>\n <div *ngIf=\"column !== 'combinedColumn' && column !== 'employeeDetail' && fromWhere !== 'leaveMaster' && (column !== 'active' && (fromWhere === 'hrmTaxComponent' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrm' || fromWhere === 'compensation'|| fromWhere === 'payrollTable'|| fromWhere === 'payrollCompare'|| fromWhere === 'paySlip' || fromWhere === 'approval' || fromWhere === 'leave' || fromWhere === 'expense' || fromWhere === 'expenseApproval' || fromWhere === 'leaveAllocation' ||fromWhere === 'parkingApp' ||(fromWhere === 'common' && column != 'signature')))\">\n <!-- SK10APR24 getting the table values using pipe instead of function to increase performance-->\n <div *ngIf=\" ('-' | editColumnCheck: column : editColumn) === ('') \">\n <span class=\"font-size-13 {{checkHyperlinkCheck(column) || fromWhere === 'hrm' || fromWhere === 'compensation' || fromWhere === 'parkingApp' ? ' hyper-link clickable ' : ''}} {{fromWhere === 'payrollTable' || fromWhere === 'paySlip' ? 'table-width' : '' }}\"\n *ngIf=\"hyperLinkColumns.includes(column) || isFirstCell(column)\"\n (click)=\"tableClick(element); onClickHyperlink(column,element, j, checkHyperlinkCheck(column))\">\n <!--SKS21NOV24 Use customDateTime Pipe for both Date and Time -->\n <ng-container *ngIf=\"isDateColumn(column)\">\n {{ element[column] | customDate }}\n </ng-container>\n\n <ng-container *ngIf=\"isTimeColumn(column)\">\n {{ element[column] | customTime }}\n </ng-container>\n\n <!--SKS21NOV24 For other columns, display raw value -->\n <ng-container *ngIf=\"!isDateColumn(column) && !isTimeColumn(column)\">\n {{ '-' | getValue: element : column }}\n </ng-container>\n <!--SKS27NOV24 Check if the current column is in buttonColumn array -->\n <ng-container *ngIf=\"sideScreenColumn?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onInfoClick(element, column, j)\">\n </ng-container>\n <!--SKS9JAN25 rightnav column -->\n <ng-container *ngIf=\"objectColumns?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onSideNavInfoClick(element, column, j)\">\n </ng-container>\n </span>\n <div *ngIf=\"!isFirstCell(column) && !editColumn.includes(column) && column != 'receipt'\"\n [class]=\"fromWhere === 'payrollTable' || fromWhere === 'paySlip' ? 'table-width' : '' \">\n <div *ngIf=\"!checkHyperlinkCheck(column)\" class=\"font-size-13\">\n <!--SKS21NOV24 Use customDateTime Pipe for both Date and Time -->\n <ng-container *ngIf=\"isDateColumn(column)\">\n {{ element[column] | customDate }}\n </ng-container>\n\n <ng-container *ngIf=\"isTimeColumn(column)\">\n {{ element[column] | customTime }}\n </ng-container>\n\n <!--SKS21NOV24 For other columns, display raw value -->\n <ng-container *ngIf=\"!isDateColumn(column) && !isTimeColumn(column)\">\n {{ '-' | getValue: element : column }}\n </ng-container>\n <!--SKS27NOV24 Check if the current column is in buttonColumn array -->\n <ng-container *ngIf=\"sideScreenColumn?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onInfoClick(element, column, j)\">\n </ng-container>\n <!--SKS9JAN25 rightnav column -->\n <ng-container *ngIf=\"objectColumns?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onSideNavInfoClick(element, column, j)\">\n </ng-container>\n </div>\n </div>\n </div>\n <!-- SK27FEB24 added input box for inline edit input-->\n <div *ngIf=\"editColumn.length > 0\">\n <div *ngIf=\" ('-' | editColumnCheck: column : editColumn) === ('string') \" class=\"on-edit d-flex\">\n <input #editColElement class=\"lop-input table-width\" [class]=\"element?.editRow ? 'input-box' : '' \"\n matInput [placeholder]=\"'APP.ENTER' | customTranslate : 'Enter'\" [value]=\"element[column]\"\n [(ngModel)]=\"element[column]\" [readOnly]=\"element?.editRow ? false : true\">\n </div>\n <!-- SK10APR24 In table, like text input, added drop down and time inputs as well -->\n <div *ngIf=\" ('-' | editColumnCheck: column : editColumn) === ('object') \" class=\"on-edit d-flex\">\n <input *ngIf=\" ('-' | editColumnType: column : editColumn) === ('text') \" #editColElement\n class=\"lop-input table-width\" [class]=\"element?.editRow ? 'input-box' : '' \" matInput\n [placeholder]=\"'APP.ENTER' | customTranslate : 'Enter'\" [value]=\"element[column]\"\n [(ngModel)]=\"element[column]\" [readOnly]=\"element?.editRow ? false : true\">\n <input *ngIf=\" ('-' | editColumnType: column : editColumn) === ('time') \" type=\"time\"\n class=\"lop-input table-width\" matInput [class]=\"element?.editRow ? 'input-box' : '' \"\n placeholder=\"HH:mm:ss\" [(ngModel)]=\"element[column]\"\n [disabled]=\"element?.editRow ? false : true\" />\n <div *ngIf=\" ('-' | editColumnType: column : editColumn) === ('dropdown') \">\n <select type=\"dropdown\" *ngIf=\"element?.editRow\" class=\"lop-input table-width\" matInput\n [class]=\"element?.editRow ? 'input-box' : '' \" [(ngModel)]=\"element[column]\">\n <option [disabled]=\"element?.editRow ? false : true\"\n *ngFor=\"let data of [] | editColumnDropdown: column : editColumn \"\n [value]=\"data.value || data.name\">{{data.name}}</option>\n </select>\n <input *ngIf=\"!element?.editRow\" #editColElement class=\"lop-input table-width\"\n [class]=\"element?.editRow ? 'input-box' : '' \" matInput\n [placeholder]=\"'APP.ENTER' | customTranslate : 'Enter'\" [value]=\"element[column]\"\n [(ngModel)]=\"element[column]\" [readOnly]=\"true\">\n </div>\n\n </div>\n </div>\n <app-popover\n *ngIf=\"column === 'receipt' && !editColumn.includes(column) && receiptImg == true && element[column] && element[column].length != 0\"\n [isBootstrap]=\"false\" [dynamicPopover]=\"'Popover string comes here'\">\n <div class=\"hover-base\">\n <img class=\"ms-1\" src=\"../../../assets/images/icons/general/file-attach.svg\">\n </div>\n <div class=\"hover-content\">\n <div class=\"expenseCon\">\n <div *ngFor=\"let data of element[column] || []\">\n <div class=\"cursor-pointer expense-file\" (click)=\"expenseAttachment(data,element)\">{{data?.name}}\n <!-- SK20FEB26 loader in expense list-->\n <svg *ngIf=\"data?.loader\"\n class=\"svg-spinner card-icon color\"\n width=\"22\" height=\"22\" viewBox=\"0 0 50 50\"\n style=\"cursor: wait;\">\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\n </svg>\n </div>\n </div>\n </div>\n </div>\n </app-popover>\n </div>\n <div *ngIf=\"fromWhere === 'leaveMaster' && column !== 'employeeDetail' \">\n <div [class]=\"(element[column]) === 'Week Off' ? 'weekoff-color' : '' \" class=\"font-size-13\">{{\n (column == 'default' || column == 'active' || column == 'paidLeave') ? '' : element[column] }}</div>\n <input *ngIf=\"(column === 'default' || column === 'active' || column === 'paidLeave')\"\n class=\"custom-checkbox\" [checked]=\"element[column] == true\" type=\"checkbox\" disabled>\n </div>\n <div *ngIf=\"fromWhere === 'payrollSettingComponent' && column === 'combinedColumn'\">\n <!-- for the Payroll Settings Component ( Side Screen Component )-->\n <!-- Since the last column is a combination of data and it is also conditional based on the paytype and calculation type we are using this div-->\n <!-- if Component type is Earnings and\n calculationType is 'flat' then output should be => \"'payType\": Flat, Amount of 'amount'\"\n calculationType is 'percentage' then output should be => \"'payType': 'amount' % of Basic \"\n calculationType is 'fixed' then output should be => \"'payType': 'calculationType'\" -->\n <!-- SK20JUN25 to display in table -->\n <ng-container *ngIf=\"\n element?.calculationType === 'flat' ||\n element?.calculationType === 'percentage' ||\n element?.calculationType === 'basicAndDA' ||\n element?.calculationType === 'fixed' ||\n element?.calculationType === 'ctc';\n else noCalculation\n \">\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'flat' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE_FLAT_AMOUNT'\n | customTranslate : 'Variable: Flat Amount: ' }}{{ (element['amount'] || 0)}}</span>\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'flat' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED_FLAT_AMOUNT'\n | customTranslate : 'Fixed: Flat Amount: ' }}{{ (element['amount'] || 0)}}</span>\n\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'percentage' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC' |\n customTranslate : '% of Basic'}}</span>\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'percentage' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }}{{ element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC' |\n customTranslate : '% of Basic'}}</span>\n\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'basicAndDA' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{ element['amount']}}{{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC_AND_DA' | customTranslate : '% of Basic and DA'}}</span>\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'basicAndDA' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }}{{ element['amount']}}{{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC_AND_DA' | customTranslate : '% of Basic and DA'}}</span>\n\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'fixed' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{ element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_GROSS'\n | customTranslate : '% of Gross'}}</span>\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'fixed' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }}{{ element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_GROSS' |\n customTranslate : '% of Gross'}}</span>\n\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'ctc' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\"> {{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }} {{ element['amount'] }} {{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_FIXED_CTC' | customTranslate : '% of Fixed CTC'}}</span>\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'ctc' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{ element['amount'] }}{{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_VARIABLE_CTC' | customTranslate : '% of Variable CTC'}}</span>\n </ng-container>\n\n <ng-template #noCalculation>\n <span class=\"spanFontSize\">-</span>\n </ng-template>\n </div>\n <div *ngIf=\"fromWhere === 'payrollSettingComponent' && column === 'active'\">\n <div class=\"form-check form-switch\">\n <input class=\"custom-checkbox\" type=\"checkbox\" [checked]=\"(element != null && element['active'] === true) ? true : false\"\n (click)=\"element[column]=!element[column]; onToggleChange.emit(fromWhere === 'payrollSettingComponent' ? element : '')\">\n </div>\n </div>\n </td>\n </ng-container>\n <!-- SK16JUL24 to get the sum of column data -->\n <td class=\"ps-2 pe-2 \" mat-footer-cell *matFooterCellDef=\"let element; let j = index\">\n {{ '-' | totalColumSum: data : cumulativeDataColumns : column }}\n </td>\n </ng-container>\n <!-- action button Columns -->\n <!-- SK19MAR25 \"action\" key is changed to \"tableAction\" wherever used, since, it has duplicate error -->\n <ng-container [stickyEnd]=\"true\" *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n matColumnDef=\"tableAction\">\n <th mat-header-cell *matHeaderCellDef\n class=\"head-color action-size sticky-column actionCol text-center\" style=\"border-right: 1px solid var(--border-color, rgba(0, 0, 0, 0.12));\">{{ actionColumHeader |\n customTranslate : 'Action'}}</th>\n <td mat-cell *matCellDef=\"let element; let i=index\" class=\"body-color actionCol\">\n <!-- SKS25DEC24 clone button -->\n <div class=\"d-flex flex-row actionButton\"\n [style.justify-content]=\"conditionSendButton ? 'none' : 'center'\">\n <div *ngIf=\"(!conditionCloneButton) && cloneButton\" class=\"imgBtnDiv\">\n <img style=\"padding: 0px;\" (click)=\"onClone(element , i)\"\n src=\"../assets/images/icons/general/clone.svg\" class=\"imgBtn\" data-bs-toggle=\"modal\">\n </div>\n <div *ngIf=\"(conditionCloneButton) && isConditionMet(element, conditionCloneButton.conditions)\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 6px;\">\n <img style=\"padding: 0px;\" (click)=\"onClone(element , i)\"\n src=\"../assets/images/icons/general/clone.svg\" class=\"imgBtn\" data-bs-toggle=\"modal\">\n </div>\n <!-- SK20FEB26 Expense edit on Pending status -->\n <div *ngIf=\"element?.status === 'Rejected'|| fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isEditRow || (fromWhere == 'expense' && element?.status === 'Pending' )\">\n <app-fusion-button *ngIf=\"fromWhere == 'leave'\" [buttonType]=\"'text-only'\"\n [buttonValue]=\"'APP.COMMENTS' | customTranslate : 'comments' \"\n (buttonClickEmit)=\"onEdit(element?.rejectionReason, i, element?.status)\" data-bs-toggle=\"modal\"\n data-bs-target=\"#rejectInfoModal\">\n </app-fusion-button>\n <div class=\"imgBtnDiv\"\n *ngIf=\"((!conditionEditButton)&& ((fromWhere == 'expense' ) || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isEditRow)) || (conditionEditButton && isConditionMet(element, conditionEditButton.conditions))\">\n <!-- MY 23OCT26 Disable edit action when expense is already Approved -->\n <i *ngIf=\"(!conditionEditButton)&& ((fromWhere == 'expense' ) || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isEditRow)\"\n (click)=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? null : onEdit(fromWhere === 'payrollSettingComponent' || isEditRow ? element : element?._id, i, element?.status)\"\n [matTooltip]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? ('APP_EXPENSE.CANNOT_EDIT_APPROVED' | customTranslate : 'Approved expenses cannot be edited') : ('APP.EDIT' | customTranslate : 'Edit')\"\n [style.opacity]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? '0.35' : '1'\"\n [style.cursor]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? 'not-allowed' : 'pointer'\"\n class=\"fusion-icon nav-icon fusion-icon-edit_pencil\" style=\"margin: 0px !important; font-size: var(--fs-normal, 16px) !important; color: var(--fc-sub-lite, #787486);\">\n </i>\n <i *ngIf=\"conditionEditButton && isConditionMet(element, conditionEditButton.conditions)\"\n [matTooltip]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? ('APP_EXPENSE.CANNOT_EDIT_APPROVED' | customTranslate : 'Approved expenses cannot be edited') : ('APP.EDIT' | customTranslate : 'Edit')\"\n [style.opacity]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? '0.35' : '1'\"\n [style.cursor]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? 'not-allowed' : 'pointer'\"\n (click)=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? null : onEdit(fromWhere === 'payrollSettingComponent' || isEditRow ? element : element?._id, i)\"\n class=\"fusion-icon nav-icon fusion-icon-edit_pencil\" style=\"margin: 0px !important; font-size: var(--fs-normal, 16px) !important; color: var(--fc-sub-lite, #787486);\">\n </i>\n </div>\n <!-- <img *ngIf=\"fromWhere == 'expense'\" (click)=\"delete(element?._id)\" src=\"../assets/images/icons/Vectordelete.svg\"> -->\n </div>\n <div *ngIf=\"element?.leaveStatus === 'New' || element?.status === 'New' || element?.status === 'Pending' || element?.leaveStatus === 'Pending' || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || fromWhere == 'expenseApproval' || isDeleteRow\">\n <app-fusion-button *ngIf=\"fromWhere == 'leave'\" [buttonType]=\"'text-only'\"\n [buttonValue]=\"'APP.CANCEL' | customTranslate : 'Cancel'\" (buttonClickEmit)=\"delete(element, i)\"\n data-bs-toggle=\"modal\" data-bs-target=\"#cancelLeave\"></app-fusion-button>\n <!-- SKS21NOV24 Conditional rendering of delete icon based on various conditions -->\n <!-- Show the delete icon if 'conditionDeleteButton' is false and 'fromWhere' matches specific components or 'isDeleteRow' is true -->\n <div class=\"imgBtnDiv\"\n *ngIf=\"((!conditionDeleteButton)&&(fromWhere == 'expense' || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isDeleteRow) )|| (conditionDeleteButton && isConditionMet(element, conditionDeleteButton.conditions))\">\n <img\n *ngIf=\"(!conditionDeleteButton)&&(fromWhere == 'expense' || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isDeleteRow)\"\n class=\"imgBtn\" [matTooltip]=\"'APP.DELETE_RECORD' | customTranslate : 'Delete Record'\"\n (click)=\"deleteRecord(fromWhere === 'payrollSettingComponent' || isDeleteRow ? element : element?._id, i)\"\n src=\"../assets/images/icons/Vectordelete.svg\">\n <img *ngIf=\"conditionDeleteButton && isConditionMet(element, conditionDeleteButton.conditions)\"\n [matTooltip]=\"'APP.DELETE_RECORD' | customTranslate : 'Delete Record'\"\n (click)=\"deleteRecord(isDeleteRow ? element : element?._id, i)\" class=\"imgBtn\"\n src=\"../assets/images/icons/Vectordelete.svg\">\n </div>\n <div *ngIf=\"fromWhere == 'approval' || fromWhere == 'expenseApproval'\" class=\"flex imgBtnDiv\">\n <img\n *ngIf=\"(fromWhere === 'expenseApproval' && element?.status === 'Approved'&& element?.reImbursed !== 'Reimbursed') || fromWhere == 'approval'\"\n class=\"approval-image me-2\" style=\"padding: 0px; width: 24px !important;\"\n (click)=\"onApprove( element?.employeeId, element?._id, element?.reImbursed )\"\n src=\"../assets/images/icons/general/Approved.svg\">\n <img *ngIf=\"fromWhere !== 'expenseApproval'\" class=\"approval-image\"\n style=\"padding: 0px; width: 24px !important;\"\n (click)=\"onReject( element?.employeeId, element?._id )\"\n src=\"../assets/images/icons/general/Declined.svg\" class=\"\" data-bs-toggle=\"modal\"\n data-bs-target=\"#approvalReject\">\n </div>\n </div>\n <!-- SK02APR24 added preview and download icons -->\n <div *ngIf=\"viewIcon\" class=\"ms-2 imgBtnDiv\">\n <!-- <img [src]=\"('post.svg' | svgIcon:'#000000') | async\" class=\"card-icon color\" title=\"preview\" (click)=\"viewIconClick(element)\" style=\"cursor: pointer;\" /> -->\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-eye nav-icon\" matTooltip=\"Preview\"\n matTooltipPosition=\"above\" style=\"color: var(--fc-text-color-light) !important; cursor: pointer;\"\n (click)=\"viewIconClick(element)\"></i>\n\n </div>\n <div *ngIf=\"downloadIcon\" class=\"ms-2 imgBtnDiv\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-document-download card-icon color imgBtn\"\n matTooltip=\"Download\" matTooltipPosition=\"above\"\n style=\"cursor: pointer; color: var(--fc-text-color-light) !important;\"\n (click)=\"downloadIconClick(element)\">\n </i>\n </div>\n <!-- SKS25DEC24 send button -->\n <div *ngIf=\"(!conditionSendButton) && sendButton\" class=\"ms-2 imgBtnDiv\" style=\"margin-top: 6px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-send-2 card-icon color imgBtn\"\n style=\"cursor: pointer\" (click)=\"onSend(element, i)\"\n [matTooltip]=\"'APP.SEND' | customTranslate : 'Send'\"></i>\n </div>\n <div\n *ngIf=\"(conditionSendButton) && isConditionMet(element, conditionSendButton.conditions) && sendButton\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 6px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-send-2 card-icon color imgBtn\"\n style=\"cursor: pointer\" (click)=\"onSend(element, i)\"\n [matTooltip]=\"'APP.SEND' | customTranslate : 'Send'\"></i>\n </div>\n <!-- SKS25DEC24 active button -->\n <div *ngIf=\"(!conditionActivateButton) && activeButton\" class=\"ms-2 imgBtnDiv\"\n style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n <div\n *ngIf=\"(conditionActivateButton) && isConditionMet(element, conditionActivateButton.conditions) && activeButton\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n <!-- SKS25DEC24 deactive button -->\n <div *ngIf=\"(!conditionDeactivateButton) && deactiveButton\" class=\"ms-2 imgBtnDiv\"\n style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n <div\n *ngIf=\"(conditionDeactivateButton) && isConditionMet(element, conditionDeactivateButton.conditions) && deactiveButton\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n </div>\n <div>\n\n <app-fusion-button *ngIf=\"fromWhere == 'document-icons'\" [buttonType]=\"'custom-btn'\"\n [fcBtnIconLeftSrc]=\"'../assets/images/icons/general/downloadfile.svg'\"\n (buttonClickEmit)=\"downloadPdf(element)\"></app-fusion-button>\n <app-fusion-button *ngIf=\"fromWhere == 'document-icons'\" [buttonType]=\"'custom-btn'\"\n [fcBtnIconLeftSrc]=\"'../assets/images/icons/general/pencil-icon.svg'\"\n (buttonClickEmit)=\"delete(element, i)\" data-bs-toggle=\"modal\"\n data-bs-target=\"#documentsInfoModal\"></app-fusion-button>\n <app-fusion-button *ngIf=\"fromWhere == 'document-icons'\" [buttonType]=\"'custom-btn'\"\n [fcBtnIconLeftSrc]=\"'../assets/images/icons/Vectordelete.svg'\"\n (buttonClickEmit)=\"delete(element, i)\" data-bs-toggle=\"modal\"\n data-bs-target=\"#deleteDocModal\"></app-fusion-button>\n </div>\n </td>\n <td mat-footer-cell *matFooterCellDef=\"let element; let i=index\">{{ \"\" }}\n </td>\n </ng-container>\n\n <!-- total Row -->\n <ng-container [sticky]=\"true\" matColumnDef=\"total\">\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column head-color\">\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"body-color\">\n </td>\n <!-- RS27AUG24 -->\n <!-- Used the translate pipe to successfully implement the translation -->\n <td mat-footer-cell *matFooterCellDef >{{'APP.TOTAL' | customTranslate : 'Total' }}\n </td>\n </ng-container>\n\n <!-- Render the columns -->\n <!-- SK16JUL24 adding the cumulative data row as footer -->\n <!-- <ng-container *ngIf=\"dataSource?.data?.length !== 0\"> -->\n <div [ngSwitch]=\"renderColumns\">\n <div *ngSwitchCase=\"'select'\">\n <tr mat-header-row *matHeaderRowDef=\"['select'].concat(displayedColumns) sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['select'].concat(displayedColumns);\"></tr>\n <!-- SK19JUL24 table total update -->\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? '' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns) : null \">\n </tr>\n </div>\n <div *ngSwitchCase=\"'tableAction'\">\n <tr mat-header-row\n *matHeaderRowDef=\" displayedColumns ? displayedColumns.concat(['tableAction']) : [] ;sticky: true\">\n </tr>\n <tr mat-row\n *matRowDef=\"let row; columns: displayedColumns ? displayedColumns.concat(['tableAction']) : []; \">\n </tr>\n <ng-container *ngIf=\"cumulativeDataColumns\">\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? '' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns).concat('tableAction') : null\">\n </tr>\n </ng-container>\n </div>\n <!-- 30JAN24 for both checkbox and action columns-->\n <div *ngSwitchCase=\"'both'\">\n <tr mat-header-row\n *matHeaderRowDef=\"['select'].concat(displayedColumns).concat('tableAction') sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['select'].concat(displayedColumns).concat('tableAction')\"\n (click)=\"tableClick(row)\"></tr>\n <ng-container *ngIf=\"cumulativeDataColumns\">\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? '' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns).concat('tableAction') : null\">\n </tr>\n </ng-container>\n </div>\n <div *ngSwitchDefault>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row;let i =index; columns: displayedColumns;\"></tr>\n <ng-container *ngIf=\"cumulativeDataColumns\">\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? 'd-block' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns) : null\">\n </tr>\n </ng-container>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <tr class=\"mat-row \" *matNoDataRow> -->\n <!-- SK9JAN24 Removed attr.colspan since it throws undefined error -->\n <!-- <td class=\"mat-cell \">\n {{'APP.NO_RECORDS' | customTranslate : 'No records/data found.' }}\n </td>\n </tr> -->\n\n </table>\n <div class=\"no-data-cell text-center my-3 \" *ngIf=\"!dataSource || !dataSource.data || dataSource.data.length === 0\">\n {{ 'APP.NO_RECORDS' | customTranslate : 'No records/data found.' }}\n </div>\n </ng-container>\n <!-- MSM28JAN25 skeleton loader template -->\n <ng-template #loadingTemplate>\n <table>\n <tr style=\"height: 40px;\" *ngFor=\"let _ of [1, 2, 3, 4,5,6]\">\n <td colspan=\"3\" class=\"skeleton-card\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </td>\n </tr>\n </table>\n </ng-template>\n </div>\n <!-- SK23FEB24 table input save button changes -->\n <div class=\"d-flex justify-content-end\">\n <div class=\"flex mt-4 me-2 cursor-pointer\" *ngIf=\"addInlineRecord \" (click)=\"addTableRecord(inlineElement)\"\n [matTooltip]=\"'APP.ADD_NEW_RECORD' | customTranslate : 'Add New Record'\">\n <div class=\"ms-1 me-1\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-add-square nav-icon\"\n style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n </div>\n </div>\n <!-- SK27FEB24 removed button disable logic, SK13MAR24 added another condition for button showing-->\n <!-- SR06JAN2025 button disable logic for not select any employee-->\n <div class=\"d-flex justify-content-between align-items-end\">\n <div class=\"px-2\">\n {{notes}}</div>\n\n <app-fusion-button [buttonLoadingSpinner]=\"tableSaveLoadingSpinner\"\n *ngIf=\"editColumn.length > 0 || tableSaveButton\" buttonType=\"btn btn-primary mt-4 me-2\"\n [buttonDisable]=\"selection?.selected?.length === 0\" (buttonClickEmit)=\"saveButton()\"\n buttonValue=\"{{ 'APP.SAVE' | customTranslate : 'Save' }}\"></app-fusion-button>\n </div>\n </div>\n <!-- SKS24JAN25 custom paginator -->\n <app-pagination #paginator [pageSizeOptions]=\"itemsPerPage\" [collectionSize]=\"totalCount\" [pageSize]=\"pageSize\"\n [currentPage]=\"pageIndex\" [firstLastButtons]=\"true\" (event)=\"pageParams($event)\" >\n </app-pagination>\n </div>\n </div>\n</div>\n\n<!-- SK03OCT24 while clicking export button, side screen will be displayed, with fields selection and filter boxes -->\n<app-common-screen *ngIf=\"exportSidescreen\" headerTitle=\"{{'APP.EXPORT_DATA' | customTranslate : 'Export Data'}}\"\n (sideScreenEmittedEvent)=\"exportSidescreen = false\">\n <div class=\"side-main-content\">\n <!-- MY 15OCT26 export file button loader -->\n <div\n class=\"d-flex align-items-center flex-row p-3 justify-content-center cursor-pointer short-button-white-bg button-hov\"\n [class.disabled]=\"exportButtonLoadingSpinner\"\n (click)=\"!exportButtonLoadingSpinner ? exportButtonSideNav() : null\">\n <div *ngIf=\"exportButtonLoadingSpinner\" class=\"spinner-grow spinner-grow-sm me-2\" role=\"status\" aria-hidden=\"true\"></div>\n <i *ngIf=\"!exportButtonLoadingSpinner\" class=\"fusion-icon fusion-icon-size-lg fusion-icon-document-upload card-icon color me-1\"></i>\n <div>{{ exportButtonLoadingSpinner ? (('APP_SETTINGS_APPS.LOADING' | customTranslate : 'Loading') + '...') : ('APP.EXPORT_FILE' | customTranslate : 'Export File') }}</div>\n </div>\n <!-- SK03OCT24 displaying components from parent (multipleCheckBox/multipleFilter) -->\n <div *ngFor=\"let type of filterScreenConfigs\">\n <!-- MY 15OCT26 pass button loader state to multi-checkbox and multiple-filter -->\n <app-multi-checkbox *ngIf=\"type.type === 'multipleCheckBox' \" class=\"ms-2 me-2\"\n [label]=\"type?.labelPath || type?.label | customTranslate : type?.label\" [cardSize]=\"type?.cardSize\"\n [cardInlineSize]=\"type?.cardInlineSize\" [checkboxList]=\"type?.checkboxList\"\n [activeCheckboxList]=\"type?.activeCheckboxList\" [buttonList]=\"type?.buttons\"\n [displayValues]=\"type?.displayValues\" [componentData]=\"type\" [checkBoxStyles]=\"type?.checkBoxStyles\"\n [isButtonLoadingSpinner]=\"type?.isButtonLoadingSpinner || false\"\n (compDataEmit)=\"exportFieldsButtonEmit($event)\">\n </app-multi-checkbox>\n <app-multiple-filter *ngIf=\"type.type === 'multipleFilter' \" class=\"ms-2 me-2\"\n [isDateFilter]=\"type?.isDateFilter || false\"\n [label]=\"type?.labelPath || type?.label | customTranslate : type?.label\" [cardSize]=\"type?.cardSize\"\n [cardInlineSize]=\"type?.cardInlineSize\" [buttonList]=\"type?.buttons\" [displayValues]=\"type?.displayValues\"\n [componentData]=\"type\" [checkBoxStyles]=\"type?.checkBoxStyles\" [selectionData]=\"type?.selectionData\"\n [isButtonLoadingSpinner]=\"type?.isButtonLoadingSpinner || false\"\n (compDataEmit)=\"exportFilterButtonEmit($event)\" (selectedValuesEmit)=\"selectedValuesEmit($event)\"\n (filterDateEmit)=\"filterDateEmit($event)\">\n </app-multiple-filter>\n </div>\n </div>\n</app-common-screen>\n<!-- SKS15DEC25 bulk upload -->\n<app-file-upload [id]=\"'uploadEmployee'\" [headerName]=\"moudleName\" [showFileModal]=\"uploadModal\"\n (closeEmit)=\"uploadModal = false\"\n [bodyHeaderName]=\"('APP.STEPS_TO_UPLOAD' | customTranslate : 'Steps to upload')+moudleName\" [isTemplate]=true\n [templateContent]=\"('APP.DOWNLOAD_THE' | customTranslate : 'Download the')+ moudleName +('APP.TEMPLATE' | customTranslate : 'template')\"\n (templateDownload)=\"downloadTemplate()\"\n [bodyContent]=\"[(('APP.FILL_THE_APPROP' | customTranslate : 'Fill the appropriate')+moudleName+('APP.DETAILS_AND_UPLOAD_ITS_BELOW' | customTranslate : 'Details and upload it below'))]\"\n [fileRestrictions]=\"{\n allowedTypes: ['.csv', '.xlsx', '.xls'],\n maxFileSize: 10,\n maxFiles: 1\n }\" [uploadedFiles]=\"[]\" [saveButtonName]=\"'APP.UPLOAD' | customTranslate : 'Upload'\"\n (upload)=\"uploadRecordsFile($event)\">\n</app-file-upload>\n<!-- SK06NOV24 alert on deleting record -->\n<div *ngIf=\"deleteModal\" class=\"modal modal-backdrop show d-block\" id=\"deleteRecord\" tabindex=\"-1\"\n aria-labelledby=\"deleteRecordLabel\" [attr.aria-hidden]=\"!deleteModal\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title fs-5\" id=\"deleteRecordLabel\">{{'APP.DELETE_RECORD' | customTranslate : 'Delete Record'}}</b>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteModal = false\"></button>\n </div>\n <div class=\"modal-body\">\n {{'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC' | customTranslate : 'Are you sure want to delete the record'}} ?\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"!buttonLoadingSpinner ? deleteRecordData() : null\">\n <!-- SK04SEP25 button loader -->\n <span class=\"{{ buttonLoadingSpinner ? 'spinner-grow' : '' }} spinner-grow-sm\" role=\"buttonValue\"\n aria-hidden=\"true\"></span>\n <span>{{ buttonLoadingSpinner ? ('APP_SETTINGS_APPS.LOADING' | customTranslate : 'Loading') + '...' :\n ('APP.YES' | customTranslate : 'Yes') }}\n </span>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\" (click)=\"deleteModal = false\">{{'APP.NO'\n | customTranslate : 'No'}}</button>\n </div>\n </div>\n </div>\n</div>\n\n<app-common-screen *ngIf=\"infoSidescreen\" [headerTitle]=\"'APP.APPROVAL_DETAILS' | customTranslate : 'Approval Details'\"\n (sideScreenEmittedEvent)=\"infoSidescreen = false\">\n <div class=\"side-main-content container\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <!-- Approval Info -->\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.NAME' | customTranslate : 'Name'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.name || ''}}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span\n *ngIf=\"infoData.status === 'Approved' || infoData.status === 'Pending' || infoData.status === 'Rejected' \"\n class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.status === 'Approved', \n 'bg-warning': infoData.status === 'Pending',\n 'bg-danger': infoData.status === 'Rejected'}\">\n {{ infoData.status }}</span>\n <span\n *ngIf=\"infoData.status !== 'Approved' && infoData.status !== 'Pending' && infoData.status !== 'Rejected' \">{{\n infoData.status || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\">\n <!-- SK21DEC24 to add Approval status in side screen-->\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_STATUS' | customTranslate : 'Approval Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span\n *ngIf=\"infoData.leaveStatus === 'Approved' || infoData.leaveStatus === 'Pending' || infoData.leaveStatus === 'Rejected'\"\n class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.leaveStatus === 'Approved', \n 'bg-warning': infoData.leaveStatus === 'Pending',\n 'bg-danger': infoData.leaveStatus === 'Rejected'}\">\n {{ infoData.leaveStatus || '' }}</span>\n <span\n *ngIf=\"infoData.leaveStatus !== 'Approved' && infoData.leaveStatus !== 'Pending' && infoData.leaveStatus !== 'Rejected'\">{{\n infoData.leaveStatus || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.REASON' | customTranslate : 'Reason'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.reason || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.TYPE' | customTranslate : 'Type'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.type || ''}}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPLIED_ON' | customTranslate : 'Applied On'}}:</div>\n <div class=\"col-6 text-start\">{{ (infoData.appliedOn | date:'short') || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVED_COUNT' | customTranslate : 'Approved Count'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.approvedCount || '' }}</div>\n </div>\n </div>\n </div>\n <!-- Approval Managers -->\n <!-- SK03DEC24 show approval managers list only if applicable -->\n <h3 *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"text-center mb-3\">\n {{'APP.APPROVAL_MANAGERS' | customTranslate : 'Approval Managers'}}</h3>\n <ul *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"list-group\">\n <li *ngFor=\"let manager of infoData.approvalManagers\" class=\"list-group-item\">\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_ID' | customTranslate : 'Employee ID'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.employeeId || ''}}</div>\n </div>\n <div class=\"row mb-3\">\n <!-- SK10DEC24 to show manager name -->\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_NAME' | customTranslate : 'Employee Name'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.name || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_ORDER' | customTranslate : 'Approval Order'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.approvalOrder || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span *ngIf=\"manager.status === 'Approved' || manager.status === 'Pending' || manager.status === 'Rejected'\"\n class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': manager.status === 'Approved', \n 'bg-warning': manager.status === 'Pending',\n 'bg-danger': manager.status === 'Rejected'}\">\n {{ manager.status || '' }}\n </span>\n <span\n *ngIf=\"manager.status !== 'Approved' && manager.status !== 'Pending' && manager.status !== 'Rejected'\"> {{\n manager.status || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\" *ngIf=\"manager.viewedOn\">\n <div class=\"col-6 text-start\">{{'APP.VIEWED_ON' | customTranslate : 'Viewed On'}}:</div>\n <div class=\"col-6 text-start\">{{ (manager.viewedOn | date:'short') || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.IS_OPTIONAL' | customTranslate : 'Is Optional'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.isOptional ? \"Yes\" : \"No\" }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.COMMENTS' | customTranslate : 'Comments'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.rejectionReason || '' }}</div>\n </div>\n </li>\n </ul>\n </div>\n</app-common-screen>\n\n<!-- MR 09NOV26 Sandwich Leave Confirmation Modal -->\n<div *ngIf=\"confirmModal\" class=\"custom-modal-overlay\">\n <div class=\"custom-modal\">\n <div class=\"custom-modal-header\">\n <b>{{ 'APP_HRM_ATTENDANCE.CHECK_ATTENDANCE' | customTranslate : 'Check Attendance' }}</b>\n <button class=\"close-button\" (click)=\"confirmModal = false\">×</button>\n </div>\n <div class=\"custom-modal-body\">\n {{ 'APP_HRM_ATTENDANCE.CONFIRM_CHECK' | customTranslate : 'Are you sure you want to run attendance check?' }}\n </div>\n <div class=\"custom-modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"checkButtonClicked(); confirmModal = false\">{{ 'APP.YES' | customTranslate : 'Yes' }}</button>\n <button class=\"btn btn-secondary ms-2\" (click)=\"confirmModal = false\">{{ 'APP.NO' | customTranslate : 'No' }}</button>\n </div>\n </div>\n</div>","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnInit, Output, Renderer2, ViewChild } from '@angular/core';\nimport { ApiService } from '../../services/api.service';\nimport { CustomTranslatePipe } from '../../pipes/custom-translate.pipe';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Modal } from 'bootstrap';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { CustomDatePipe } from '../../pipes/custom-date.pipe';\nimport { LoaderService } from '../../services/loading.service';\n\n@Component({\n selector: 'fusion-card',\n standalone: true,\n imports: [CommonModule, CustomTranslatePipe, MatTooltipModule, CustomDatePipe],\n providers: [DatePipe],\n templateUrl: './fusion-card.component.html',\n styleUrl: './fusion-card.component.css'\n})\nexport class FusionCardComponent implements OnInit {\n // MR 28SEP26 Reactive setter & loader sync for cardData input lifecycle\n private _cardData: any[] = [];\n\n @Input()\n set cardData(data: any) {\n if (Array.isArray(data)) {\n this._cardData = data;\n this.calculateCardMarginTop();\n } else {\n this._cardData = [];\n }\n this.cdr.markForCheck();\n }\n get cardData(): any[] {\n return this._cardData;\n }\n\n @Input() from: any;\n @Input() comp: any = {};\n\n @Output() cardButtonEmit = new EventEmitter<any>();\n\n deleteModal = false; // SKS30MAY25 for confirmation popup\n deleteData: any; // SKS30MAY25 to get the delete row\n currentOpenIndex: number | null = null; // track the current open action dropdown icon index\n clickListener: any; // SKS30MAY25 action column dropdown button click listener\n modalDirect!: Modal; // SKS30MAY25 bootstrap modal\n safeSrc: SafeResourceUrl | null = null;\n isLoading: boolean[] = []; // SKS18NOV25 download loader\n isViewLoading: boolean[] = []; // SKS18NOV25 view/preview loader\n popupTitle: any;\n @ViewChild('file') file!: ElementRef<any>;\n isCardLoading: any;\n\n constructor(\n private sanitizer: DomSanitizer,\n private renderer: Renderer2,\n private apiService: ApiService,\n private datePipe: DatePipe,\n private loaderService: LoaderService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.loaderService.loading.subscribe((loadingStates) => {\n this.isCardLoading = loadingStates;\n this.cdr.markForCheck();\n });\n }\n\n // MR 28SEP26 Calculate card top margins safely for valid cardData arrays\n private calculateCardMarginTop(): void {\n let total = 0;\n for (const card of this._cardData) {\n const size = Number(card?.cardSize?.split('-')?.[2]);\n total += size;\n card.marginTop = total < 13 ? '0px' : '10px';\n }\n }\n\n // SKS15FEB25 on delete click save the data in variables\n deleteRecord(data: any) {\n this.deleteData = data;\n this.deleteModal = true;\n }\n\n // SKS15FEB25 after clicking yes in delete alert modal, emit to parent\n deleteRecordData() {\n this.cardButtonEmit.emit(this.deleteData);\n this.deleteModal = false;\n }\n\n actionButtonClicked(event: any, card: any) {\n if (event.type === 'delete') {\n this.deleteRecord({ event, card });\n } else {\n this.cardButtonEmit.emit({ event, card });\n }\n }\n\n // SKS15FEB25 Action button conditionally displayed function\n isConditionMet(element: any, conditions: any): boolean {\n if (conditions !== undefined) {\n const { andConditionList, orConditionList } = conditions;\n const isAndConditionMet = andConditionList ? andConditionList.every((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond.condition) ? cond.condition.includes(element[cond.column]) : cond.condition === element[cond.column]\n ) : true;\n const isOrConditionMet = orConditionList ? orConditionList.some((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond.condition) ? cond.condition.includes(element[cond.column]) : cond.condition === element[cond.column]\n ) : true;\n return isAndConditionMet && isOrConditionMet;\n } else {\n return true;\n }\n }\n\n // SKS15FEB25 action column dropdown buttons open / close\n toggleDropdown(index: number) {\n this.currentOpenIndex = this.currentOpenIndex === index ? null : index;\n this.addClickOutsideListener();\n }\n\n private addClickOutsideListener() {\n if (!this.clickListener) {\n this.clickListener = this.renderer.listen('document', 'click', (event: any) => {\n if (!event.target.closest('.dropdown')) {\n this.currentOpenIndex = null;\n this.removeClickListener();\n }\n });\n }\n }\n\n private removeClickListener() {\n if (this.clickListener) {\n this.clickListener();\n this.clickListener = null;\n }\n }\n\n onMouseEnter(event: MouseEvent, styleName: any, color: string): void {\n (event.target as HTMLElement).style[styleName] = styleName === 'border' ? `1px solid ${color}` : color;\n }\n\n onMouseLeave(event: MouseEvent, styleName: any, color: string): void {\n (event.target as HTMLElement).style[styleName] = styleName === 'border' ? `1px solid ${color}` : color;\n }\n\n fileClick(evt: any, index: number) {\n this.isViewLoading[index] = true;\n this.cdr.markForCheck();\n let event = evt?.file || evt;\n const fileId = evt?.id || evt?._id || evt?.fileID || evt?.fileId;\n\n if (fileId) {\n this.apiService.fetchData('/file?id=' + fileId).subscribe({\n next: (file: any) => {\n this.popupTitle = file.name || evt?.name || 'File Preview';\n const buffer = new Uint8Array(file.content.data);\n const blob = new Blob([buffer], { type: file?.type || evt?.fileType || 'application/pdf' });\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const fileOutput = e.target.result;\n this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(fileOutput);\n if (this.file?.nativeElement) {\n this.modalDirect = new Modal(this.file.nativeElement, { backdrop: 'static' });\n this.modalDirect.show();\n }\n this.stopViewLoader(index);\n this.cdr.markForCheck();\n };\n reader.readAsDataURL(blob);\n },\n error: () => this.stopViewLoader(index)\n });\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', event, true);\n request.responseType = 'blob';\n\n request.onload = () => {\n this.popupTitle = evt?.name || 'File Preview';\n const blob = request.response;\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const fileOutput = e.target.result;\n this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(fileOutput);\n if (this.file?.nativeElement) {\n this.modalDirect = new Modal(this.file.nativeElement, { backdrop: 'static' });\n this.modalDirect.show();\n }\n this.stopViewLoader(index);\n this.cdr.markForCheck();\n };\n reader.readAsDataURL(blob);\n };\n request.onerror = () => this.stopViewLoader(index);\n request.send();\n }\n }\n\n closeModal() {\n this.safeSrc = null;\n this.popupTitle = '';\n this.cdr.markForCheck();\n }\n\n private stopViewLoader(index: number) {\n setTimeout(() => {\n this.isViewLoading[index] = false;\n this.cdr.markForCheck();\n }, 300);\n }\n\n downloadFile(evt: any, index: number) {\n this.isLoading[index] = true;\n this.cdr.markForCheck();\n const fileId = evt?.id || evt?._id || evt?.fileID || evt?.fileId;\n\n if (fileId) {\n this.apiService.fetchData('/file?id=' + fileId).subscribe({\n next: (file: any) => {\n const buffer = new Uint8Array(file.content.data);\n const blob = new Blob([buffer], { type: file?.type || evt?.fileType });\n const url = window.URL.createObjectURL(blob);\n this.triggerDownload(url, evt.name || file.name);\n this.stopLoader(index);\n },\n error: () => this.stopLoader(index)\n });\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', evt?.file || evt, true);\n request.responseType = 'blob';\n request.onload = () => {\n const url = window.URL.createObjectURL(request.response);\n this.triggerDownload(url, evt.name);\n this.stopLoader(index);\n };\n request.onerror = () => this.stopLoader(index);\n request.send();\n }\n }\n\n private triggerDownload(url: string, name: string) {\n const a = document.createElement('a');\n a.href = url;\n a.download = name || 'downloaded-file';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n\n private stopLoader(index: number) {\n setTimeout(() => {\n this.isLoading[index] = false;\n this.cdr.markForCheck();\n }, 400);\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<div *ngIf=\"!(isCardLoading?.[comp?._id]?.length > 0) && (!cardData || cardData.length === 0)\" class=\"no-records-container\">\n <div class=\"text-center p-4\">\n <div class=\"no-records-message\">\n <div class=\"mt-3 mb-2\">{{'APP.NO_RECORDS_AVAILABLE' | customTranslate : 'No Records Available'}}</div>\n </div>\n </div>\n</div>\n<div *ngIf=\"isCardLoading?.[comp?._id]?.length > 0; else viewCard\">\n <div class=\"card fc-card fc-card-light skeleton-card\" style=\"height: 200px; border: none;\">\n <div *ngFor=\"let n of [1, 2]\" class=\"flex\" style=\"padding: 25px 0px;\">\n <div *ngFor=\"let e of [1, 2]\" style=\"width: 50%; padding: 5px;\">\n <div class=\"\" style=\"height: 25px;\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\" style=\"width: 95%;\"></div>\n <div class=\"skeleton skeleton-text\" style=\"width: 65%;\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #viewCard>\n <div *ngIf=\"cardData && cardData.length > 0\" [class.col-md-12]=\"cardData.length > 0\" [class.dashboard-card-grid]=\"from === 'dashboard'\" style=\"height: 100%;\">\n <div class=\"row\" [ngClass]=\"{\n 'g-2': cardData.length > 1 && from !== 'dashboard',\n 'gutter-remove': from === 'dashboard'\n }\">\n <div *ngFor=\"let card of cardData; let i = index\" class=\"{{card.cardSize}} inside-card\" [ngClass]=\"{'no-padding-margin':from ==='dashboard' ? cardData.length === 1 : false, 'multy-card':from ==='dashboard' ? cardData.length > 1 : false}\" style=\"height: 100%;\" [ngStyle]=\"{'margin-top': card.marginTop}\">\n <div *ngIf=\"card?.config?.details\" style=\"height: 100%;\">\n <div class=\"width-100\" [ngClass]=\"{'static-width-for-card': from === 'dashboard' ? cardData.length != 1 : true}\" [style.border]=\"(from === 'dashboard' && cardData.length === 1 ) ? 'none' : ''\" style=\"height: 100%;\" [ngStyle]=\"from === 'dashboard' && cardData.length === 1 \n ? {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)'\n } \n : null\">\n <div *ngIf=\"card.isTitleHide ? card.isTitleHide === 'true' ? false : true : true\" class=\"header-section flex content-space-between\" style=\"align-items: center;\">\n <div class=\"section-title\">{{card.labelPath || card.label | customTranslate : card.label}}</div>\n <div class=\"actionButton\" style=\"display: flex; align-items: center;\">\n <div *ngFor=\"let button of card?.actionButton?.buttonArray; let i = index\">\n <div *ngIf=\"i < card?.actionButton?.size\"\n style=\"margin-left: 3px; margin-right: 3px;\">\n <div *ngIf=\"isConditionMet(card, button.conditions)\"\n [matTooltip]=\"button.tooltipPath || button.tooltip | customTranslate : button.tooltip\"\n (click)=\"actionButtonClicked(button,card)\"\n (mouseenter)=\"onMouseEnter($event,'border', button.hoverBorderColor)\"\n (mouseleave)=\"onMouseLeave($event,'border', button.borderColor)\"\n style=\"padding: 2px; border-radius: {{button.borderRadius}}px; border: 1px solid {{button.borderColor}};\">\n <div (mouseenter)=\"onMouseEnter($event,'backgroundColor', button.hoverBackgroundColor)\"\n (mouseleave)=\"onMouseLeave($event,'backgroundColor', button.backgroundColor)\"\n style=\"padding: {{button.padding}}px; border-radius: {{button.borderRadius}}px; background-color: {{button.backgroundColor}}; display: flex; gap: 2px; align-items: center;\">\n <img *ngIf=\"button.iconSrc && (button.iconSrc?.startsWith('data:') || button.iconSrc?.startsWith('http'))\"\n #imgElement\n [src]=\"button.iconSrc\"\n style=\"cursor: pointer;\"\n (mouseenter)=\"imgElement.src = button.hoverIconSrc || button.iconSrc\"\n (mouseleave)=\"imgElement.src = button.iconSrc\"/>\n <i *ngIf=\"!(button.iconSrc?.startsWith('data:') || button.iconSrc?.startsWith('http'))\"\n class=\"fusion-icon nav-icon\"\n [ngClass]=\"button.iconSrc\"\n style=\"margin: 0px !important; font-size: var(--fs-normal, 16px) !important; color: var(--fc-sub-lite, #787486);\">\n </i>\n <div *ngIf=\"button.isLabel\" style=\"color: {{button.labelColor}}; font-size: 12px;\"> {{button.label || button.tooltip | customTranslate : button.label || button.tooltip}}</div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"card?.actionButton?.buttonArray && card?.actionButton?.buttonArray?.length > 0 && card?.actionButton?.buttonArray?.slice(card?.actionButton?.size) && card?.actionButton?.buttonArray?.slice(card?.actionButton?.size).length > 0\"\n class=\"dropdown\">\n <div class=\"clickable-img\" (click)=\"toggleDropdown(i)\"\n style=\"margin-left: 3px; margin-right: 3px;\">\n <div style=\"background-color: var(--comp-bg-secondary, #f5f5f5); padding: 2px 2px; border-radius: var(--radius-small, 5px);\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-arrow-square-down nav-icon\" style=\"background-color: var(--comp-bg-secondary, #f5f5f5); border-radius: var(--radius-small, 5px); border: 1px solid var(--border-color, #6c757d);\"></i>\n </div>\n </div>\n\n <div class=\"dropdown-menu\"\n [style.right]=\"(((card?.actionButton?.size ?? 0) - (card?.actionButton?.buttonArray?.size ?? 0) + ((card?.actionButton?.buttonArray?.slice(card?.actionButton?.size)?.length ?? 0) > 0 ? 1 : 0)) * 100) + '%'\"\n *ngIf=\"currentOpenIndex === i\">\n <div *ngFor=\"let btn of card?.actionButton?.buttonArray?.slice(card?.actionButton?.size)\">\n <button *ngIf=\"isConditionMet(card, btn.conditions)\" \n style=\"display: flex;\" type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [matTooltip]=\"btn.tooltipPath || btn.tooltip | customTranslate : btn.tooltip\" [disabled]=\"btn.buttonDisable\"\n (click)=\"actionButtonClicked(btn,card)\">\n <img *ngIf=\"btn.iconSrc\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 10px;\">\n {{btn.labelPath || btn.namePath || btn.name | customTranslate : btn.label || btn.name}}</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"body-section card-text\" style=\"height: 100%;\" [ngStyle]=\"{ padding: card?.config?.padding || null }\">\n <div class=\"flex w-100\" [ngClass]=\"{\n 'row': card?.config?.details?.length > 1,\n 'gutter-remove': from === 'dashboard' && card?.config?.details?.length > 1\n }\" style=\"height: 100%;\">\n <ng-container *ngFor=\"let detail of card?.config?.details\">\n <div *ngIf=\"!detail?.hideFromCard\" class=\"{{detail.size || card.cardInlineSize}} card-detail d-flex flex-column\" [ngClass]=\"detail.alignment\">\n <div *ngIf=\"detail.iconSrc && detail.iconPosition !== 'end'\" class=\"icon-container d-flex\">\n <div class=\"icon-wrapper\" [style.border]=\"'4px solid gray'\">\n <img [src]=\"detail.iconSrc\" alt=\"Icon\">\n </div>\n </div>\n\n <div *ngIf=\"!detail.isLabelHide && detail?.type !== 'image'\" class=\"label-head\" [ngClass]=\"detail.labelFont\">{{detail.labelPath || detail.label | customTranslate : detail.label}}</div>\n\n <div [ngClass]=\"detail?.type !== 'image' && detail?.type !== 'file' ? 'flex-column' : ''\" [class.detail-value-wrapper]=\"detail?.type !== 'image' && detail.truncate\">\n <div *ngIf=\"detail?.type !== 'date' && detail?.type !== 'time' && detail?.type !== 'datetime' && detail?.type !== 'label' && detail?.type !== 'image' && detail?.type !== 'file'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">\n {{\n (detail?.type === 'boolean' || (detail?.value === true || detail?.value === false))\n ? (detail?.value === true ? 'True' : 'False')\n : (detail?.value || detail.value === 0)\n ? detail.value\n : '-'\n }}\n </div>\n <div *ngIf=\"detail?.type === 'date'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">{{ (detail?.value | customDate) || '-' }}</div>\n <div *ngIf=\"detail?.type === 'datetime'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">{{ (detail?.value | customDate : 'datetime') || '-' }}</div>\n <div *ngIf=\"detail?.type === 'time'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">{{ (detail?.value | customDate : 'time') || '-' }}</div>\n <div *ngIf=\"detail?.type === 'link'\" class=\"ms-2\">\n <a *ngIf=\"detail?.redirectOnClick\"\n [href]=\"'//'+detail?.value\"\n [target]=\"detail?.openInNewTab ? '_blank' : '_self'\"\n class=\"form-label label-head\">\n <img [src]=\"detail?.srcImg\" />\n </a>\n </div>\n <div *ngIf=\"detail?.type === 'image'\">\n <img [style.height.%]=\"detail.imgHeight\" [src]=\"(detail?.value || detail?.defaultValue)\" style=\"width: 100%; max-height: 100%; object-fit: contain;\"/>\n </div>\n <div *ngIf=\"detail?.type === 'file'\">\n <div class=\"cursor-pointer label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\" (click)=\"fileClick(detail.value, i)\">{{detail?.isLabel ? detail.value.name : ''}}</div>\n <div class=\"flex\" *ngIf=\"detail?.value\">\n <img *ngIf=\"detail?.type === 'file' && !isLoading[i]\"\n src=\"../assets/images/icons/general/download-icon.svg\"\n class=\"card-icon color\"\n title=\"download\"\n (click)=\"downloadFile(detail.value, i)\"\n style=\"cursor: pointer; width:17px\">\n <svg *ngIf=\"detail?.type === 'file' && isLoading[i]\"\n class=\"svg-spinner card-icon color\"\n width=\"22\" height=\"22\" viewBox=\"0 0 50 50\"\n style=\"cursor: wait;\">\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\n </svg>\n <img *ngIf=\"detail?.isView && !isViewLoading[i]\"\n src=\"../assets/images/icons/general/preview.svg\"\n class=\"card-icon color\"\n title=\"preview\"\n (click)=\"fileClick(detail.value, i)\"\n style=\"cursor: pointer; width:20px\">\n <svg *ngIf=\"detail?.isView && isViewLoading[i]\"\n class=\"svg-spinner card-icon color\"\n width=\"22\" height=\"22\" viewBox=\"0 0 50 50\"\n style=\"cursor: wait;\">\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\n </svg>\n </div>\n </div>\n </div>\n <div *ngIf=\"detail.iconSrc && detail.iconPosition === 'end'\" class=\"icon-container d-flex\">\n <div class=\"icon-wrapper\" [style.border]=\"'4px solid gray'\">\n <img [src]=\"detail.iconSrc\" alt=\"Icon\">\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div *ngIf=\"deleteModal\" class=\"custom-modal-overlay\">\n <div class=\"custom-modal\">\n <div class=\"custom-modal-header\">\n <b>{{ 'APP.DELETE_RECORD'| customTranslate : 'Delete Record'}}</b>\n <button class=\"close-button\" (click)=\"deleteModal = false\">×</button>\n </div>\n <div class=\"custom-modal-body\">\n {{ 'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC'| customTranslate : 'Are you sure you want to delete the record'}} ?\n </div>\n <div class=\"custom-modal-footer\">\n <button class=\"confirm-button\" (click)=\"deleteRecordData()\">{{ 'APP.YES'| customTranslate : 'Yes'}}</button>\n <button class=\"cancel-button\" (click)=\"deleteModal = false\">{{ 'APP.NO'| customTranslate : 'No'}}</button>\n </div>\n </div>\n</div>\n\n<div class=\"modal fade container-sm\" id=\"file\" aria-labelledby=\"file\" \naria-hidden=\"true\" #file>\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <div class=\"modal-title fs-5\" id=\"expenseReceiptModelLabel\">{{popupTitle}}</div>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" (click)=\"closeModal()\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <iframe class=\"receipt-view\" *ngIf=\"safeSrc\" [src]=\"safeSrc\" style=\"width: 100%; height: 500px; border: none;\"></iframe>\n </div>\n </div>\n </div>\n</div>\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { InjectionToken } from '@angular/core';\nimport { ToastGlobalConfig } from './toast.model';\n\nexport const TOAST_GLOBAL_CONFIG = new InjectionToken<ToastGlobalConfig>('TOAST_GLOBAL_CONFIG');\n\nexport function provideToastConfig(config: ToastGlobalConfig) {\n return [{ provide: TOAST_GLOBAL_CONFIG, useValue: config }];\n}\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Injectable, Inject, Optional } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ToastConfig, ToastGlobalConfig } from './toast.model';\nimport { TOAST_GLOBAL_CONFIG } from './toast.tokens';\n\nfunction generateToastId(): string {\n return Math.random().toString(36).slice(2, 9);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n private _toasts$ = new BehaviorSubject<ToastConfig[]>([]);\n readonly toasts$ = this._toasts$.asObservable();\n\n private global: ToastGlobalConfig = {};\n private removalTimers = new Map<string, any>();\n\n constructor(@Optional() @Inject(TOAST_GLOBAL_CONFIG) cfg?: ToastGlobalConfig) {\n this.global = cfg || {};\n }\n\n private get toasts(): ToastConfig[] {\n return this._toasts$.value;\n }\n\n private emit(toasts: ToastConfig[]): void {\n this._toasts$.next([...toasts]);\n }\n\n private scheduleRemoval(t: ToastConfig): void {\n if (!t.duration || t.duration <= 0) return;\n const handle = setTimeout(() => this.startLeavingAndRemove(t.id!), t.duration);\n this.removalTimers.set(t.id!, handle);\n }\n\n private clearRemovalTimer(id: string): void {\n const h = this.removalTimers.get(id);\n if (h) {\n clearTimeout(h);\n this.removalTimers.delete(id);\n }\n }\n\n show(cfg: ToastConfig): string {\n const toast: ToastConfig = {\n id: generateToastId(),\n type: 'info',\n duration: this.global.defaultDuration ?? 5000,\n ...cfg\n };\n\n const list = [toast, ...this.toasts];\n if (this.global.maxToasts && list.length > this.global.maxToasts) {\n list.splice(this.global.maxToasts);\n }\n\n this.emit(list);\n this.scheduleRemoval(toast);\n return toast.id!;\n }\n\n showSuccess(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'success', ...opts });\n }\n\n showError(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'error', ...opts });\n }\n\n showInfo(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'info', ...opts });\n }\n\n showWarning(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'warning', ...opts });\n }\n\n startLeavingAndRemove(id: string): void {\n const list = this.toasts.map(t => (t.id === id ? { ...t, _leaving: true } : t));\n this.emit(list);\n setTimeout(() => this.remove(id), 220);\n this.clearRemovalTimer(id);\n }\n\n remove(id: string): void {\n this.clearRemovalTimer(id);\n this.emit(this.toasts.filter(t => t.id !== id));\n }\n\n clear(): void {\n this.removalTimers.forEach(h => clearTimeout(h));\n this.removalTimers.clear();\n this.emit([]);\n }\n\n pause(id: string): void {\n this.clearRemovalTimer(id);\n }\n\n resume(id: string, remaining?: number): void {\n const t = this.toasts.find(x => x.id === id);\n if (t) {\n const dur = remaining ?? t.duration ?? this.global.defaultDuration ?? 5000;\n this.scheduleRemoval({ ...t, duration: dur });\n }\n }\n}\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Component, OnInit, OnDestroy, Input, ElementRef, ChangeDetectorRef, ChangeDetectionStrategy, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { ToastConfig, ToastGlobalConfig } from './toast.model';\nimport { ToastService } from './toast.service';\nimport { TOAST_GLOBAL_CONFIG } from './toast.tokens';\n\n@Component({\n selector: 'app-toast, fusion-toast',\n templateUrl: './toast.component.html',\n styleUrls: ['./toast.component.css'],\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ToastComponent implements OnInit, OnDestroy {\n toasts: ToastConfig[] = [];\n private sub = new Subscription();\n\n @Input() position: ToastGlobalConfig['position'];\n @Input() enableAnimation?: boolean;\n @Input() pauseOnHover?: boolean;\n @Input() defaultDuration?: number = 5000;\n\n positionClass = 'top-right';\n\n constructor(\n private toastService: ToastService,\n private el: ElementRef,\n private cdr: ChangeDetectorRef,\n @Optional() @Inject(TOAST_GLOBAL_CONFIG) private globalCfg?: ToastGlobalConfig\n ) {}\n\n ngOnInit(): void {\n const merged: ToastGlobalConfig = {\n ...(this.globalCfg || {}),\n position: this.position ?? this.globalCfg?.position,\n enableAnimation: this.enableAnimation ?? this.globalCfg?.enableAnimation,\n pauseOnHover: this.pauseOnHover ?? this.globalCfg?.pauseOnHover,\n defaultDuration: this.defaultDuration ?? this.globalCfg?.defaultDuration\n };\n this.positionClass = merged.position ?? 'top-right';\n this.defaultDuration = merged.defaultDuration ?? 5000;\n\n this.sub.add(\n this.toastService.toasts$.subscribe((list) => {\n this.toasts = list;\n this.cdr.markForCheck();\n })\n );\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n }\n\n trackById(_: number, t: ToastConfig): string | undefined {\n return t.id;\n }\n\n dismiss(id?: string): void {\n if (id) {\n this.toastService.startLeavingAndRemove(id);\n }\n }\n\n onMouseEnter(t: ToastConfig, e: MouseEvent): void {\n if (this.pauseOnHover ?? this.globalCfg?.pauseOnHover) {\n const el = e.currentTarget as HTMLElement;\n el.style.setProperty('--toast-playstate', 'paused');\n this.toastService.pause(t.id!);\n }\n }\n\n onMouseLeave(t: ToastConfig, e: MouseEvent): void {\n if (this.pauseOnHover ?? this.globalCfg?.pauseOnHover) {\n const el = e.currentTarget as HTMLElement;\n el.style.setProperty('--toast-playstate', 'running');\n this.toastService.resume(t.id!, t.duration);\n }\n }\n\n progressState(): string {\n return 'var(--toast-playstate, running)';\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<div class=\"toast-container\" [class]=\"positionClass\">\n <div\n class=\"toast\"\n *ngFor=\"let t of toasts; trackBy: trackById\"\n [class.leaving]=\"t._leaving\"\n [attr.data-type]=\"t.type\"\n [style.background]=\"t.background || ''\"\n [style.color]=\"t.textColor || ''\"\n (mouseenter)=\"onMouseEnter(t, $event)\"\n (mouseleave)=\"onMouseLeave(t, $event)\"\n >\n <div style=\"display: flex; width: 100%; align-items: center;\">\n <div class=\"toast-left\">\n <i *ngIf=\"t.icon\" class=\"fusion-icon fusion-icon-size-lg {{t.icon}} nav-icon icon\" style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n <div class=\"icon default\" *ngIf=\"!t.icon\">\n @switch (t.type) {\n @case ('success') {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M9 16.2l-3.5-3.5L4 14l5 5 12-12-1.5-1.5z\"/>\n </svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm5 13.6L13.6 17 12 15.4 10.4 17 7 13.6 8.6 12 7 10.4 10.4 7 12 8.6 13.6 7 17 10.4 15.4 12 17 13.6z\"/>\n </svg>\n }\n @case ('warning') {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n }\n @default {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M12 2v20M2 12h20\"/>\n </svg>\n }\n }\n </div>\n </div>\n\n <div class=\"toast-body\">\n <div class=\"title\" *ngIf=\"t.title\">{{ t.title }}</div>\n <div class=\"message\">{{ t.message }}</div>\n </div>\n\n <button class=\"close\" (click)=\"dismiss(t.id)\" aria-label=\"Close\">×</button>\n </div>\n\n <div class=\"progress\" *ngIf=\"t.duration && t.duration > 0\">\n <div class=\"bar\" [style.--toast-duration]=\"t.duration + 'ms'\" [style.animation-play-state]=\"progressState()\"></div>\n </div>\n </div>\n</div>\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n OnInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRippleModule } from '@angular/material/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'app-multi-select-dropdown, fusion-multi-select-dropdown',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatCheckboxModule,\n MatRippleModule,\n MatChipsModule,\n ],\n templateUrl: './multi-select-dropdown.component.html',\n styleUrls: ['./multi-select-dropdown.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiSelectDropdownComponent implements OnChanges, OnInit, OnDestroy {\n @Input() public label: string = 'Select';\n @Input() public list: any[] = [];\n @Input() public isAll: boolean = false;\n @Output() public shareCheckedList = new EventEmitter<string[]>();\n\n public control = new FormControl<any[]>([]);\n public filteredItemList: any[] = [];\n public selectedItemList: any[] = [];\n public value: string = '';\n\n private destroy$ = new Subject<void>();\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['list']) {\n this.filteredItemList = [...(this.list || [])];\n this.cdr.markForCheck();\n }\n }\n\n ngOnInit(): void {\n this.control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((selected) => {\n this.selectedItemList = selected || [];\n this.emitSelectedIds();\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n compareItems(o1: any, o2: any): boolean {\n return o1 && o2 ? o1._id === o2._id : o1 === o2;\n }\n\n toggleSelectAll(): void {\n if (this.isAllSelected()) {\n this.control.setValue([], { emitEvent: false });\n this.selectedItemList = [];\n } else {\n this.control.setValue([...this.filteredItemList], { emitEvent: false });\n this.selectedItemList = [...this.filteredItemList];\n }\n this.emitSelectedIds();\n this.cdr.markForCheck();\n }\n\n isAllSelected(): boolean {\n return (\n this.filteredItemList.length > 0 &&\n this.filteredItemList.every((item) =>\n this.control.value?.some((selected) => selected._id === item._id)\n )\n );\n }\n\n onFilterChange(event: string): void {\n const lower = event?.toLowerCase() || '';\n this.filteredItemList = (this.list || []).filter(\n (option) =>\n option?._id?.toString().toLowerCase().includes(lower) ||\n option?.label?.toLowerCase().includes(lower)\n );\n this.cdr.markForCheck();\n }\n\n clearFilter(): void {\n this.value = '';\n this.filteredItemList = [...(this.list || [])];\n this.cdr.markForCheck();\n }\n\n removeChip(item: any): void {\n const updated = this.control.value?.filter((i) => i._id !== item._id) || [];\n this.control.setValue(updated, { emitEvent: false });\n this.selectedItemList = updated;\n this.emitSelectedIds();\n this.cdr.markForCheck();\n }\n\n private emitSelectedIds(): void {\n const ids = this.selectedItemList.map((i) => i._id);\n this.shareCheckedList.emit(ids);\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<mat-form-field style=\"width: 100%;\">\n <mat-label>{{ label }}</mat-label>\n\n <div style=\"margin-bottom: 5px;\">\n @for (selectedItem of selectedItemList; track selectedItem) {\n <mat-chip style=\"margin: 5px;\" [removable]=\"true\" (removed)=\"removeChip(selectedItem)\">\n {{ selectedItem._id }} ({{ selectedItem.label }})\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n }\n </div>\n\n <mat-select [formControl]=\"control\" multiple [compareWith]=\"compareItems\">\n <mat-select-trigger></mat-select-trigger>\n\n <mat-form-field style=\"width: 100%;\" appearance=\"outline\">\n <mat-label>Search {{ label }}</mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"value\" (ngModelChange)=\"onFilterChange($event)\" />\n @if (value) {\n <button style=\"position: absolute; right: -10px; top: 5px;\" mat-icon-button aria-label=\"Clear\"\n (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n @if (filteredItemList.length > 0 && isAll) {\n <mat-checkbox color=\"primary\" style=\"user-select: none; width: 100%; cursor: pointer; padding: 5px;\" matRipple\n [checked]=\"isAllSelected()\" (click)=\"toggleSelectAll()\">\n <span [style.color]=\"isAllSelected() ? 'var(--fc-primary-color, #0070d2)' : 'inherit'\" style=\"font-size: var(--fs-normal, 16px);\">All</span>\n </mat-checkbox>\n }\n\n @for (item of filteredItemList; track item) {\n <mat-option [value]=\"item\">\n {{ item._id }} ({{ item.label }})\n </mat-option>\n }\n\n @if (filteredItemList.length == 0) {\n <div style=\"padding: 5px 10px;\">No results found!</div>\n }\n </mat-select>\n</mat-form-field>\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { AlertService } from '../../services/alert.service';\n\nexport type AlertType = 'success' | 'failure' | 'error' | 'warning' | 'info';\n\n@Component({\n selector: 'fusion-alert, app-success-failure-message',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './alert.component.html',\n styleUrls: ['./alert.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AlertMessageComponent implements OnInit, OnDestroy {\n @Input() type: AlertType = 'info';\n @Input() message: string = '';\n @Input() dismissible: boolean = true;\n @Input() autoSubscribeAlertService: boolean = false;\n\n @Output() dismiss = new EventEmitter<void>();\n\n visible: boolean = true;\n private sub?: Subscription;\n\n constructor(\n private cdr: ChangeDetectorRef,\n @Optional() private alertService?: AlertService\n ) {}\n\n ngOnInit(): void {\n if (this.autoSubscribeAlertService && this.alertService) {\n this.sub = this.alertService.passAlertType$.subscribe((data: any) => {\n if (data) {\n this.type = (data.type === 'failure' || data.type === 'error') ? 'error' : (data.type || 'info');\n this.message = data.message || '';\n this.visible = true;\n this.cdr.markForCheck();\n }\n });\n }\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n onDismiss(): void {\n this.visible = false;\n this.dismiss.emit();\n this.cdr.markForCheck();\n }\n\n get normalizedType(): string {\n if (this.type === 'failure' || this.type === 'error') return 'failure';\n return this.type || 'info';\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<div *ngIf=\"visible && (message || true)\" class=\"alert alert-dismissible fade show form-submission-message\" [ngClass]=\"normalizedType\" role=\"alert\">\n <div class=\"info\">\n <div class=\"alert-icon\">\n <ng-content select=\"[alert-icon]\">\n @switch (normalizedType) {\n @case ('success') {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M9 16.2l-3.5-3.5L4 14l5 5 12-12-1.5-1.5z\"/>\n </svg>\n }\n @case ('failure') {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm5 13.6L13.6 17 12 15.4 10.4 17 7 13.6 8.6 12 7 10.4 10.4 7 12 8.6 13.6 7 17 10.4 15.4 12 17 13.6z\"/>\n </svg>\n }\n @case ('warning') {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n }\n @default {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12 2v20M2 12h20\"/>\n </svg>\n }\n }\n </ng-content>\n </div>\n\n <div class=\"alert-content\">\n <ng-content>{{ message }}</ng-content>\n </div>\n\n <button *ngIf=\"dismissible\" type=\"button\" class=\"close-btn\" (click)=\"onDismiss()\" aria-label=\"Close\">\n <svg viewBox=\"0 0 24 24\" class=\"cross-icon\">\n <path fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n </div>\n</div>\n\n","/* MR 18OCT26 On-demand Amiri font loading for pdfMake to reduce initial bundle and TBT */\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PdfFontService {\n private fontLoadedPromise: Promise<void> | null = null;\n\n /**\n * Safely configures pdfMake fonts and vfs.\n * Max 2 fallbacks: 1. window.vfs if already loaded -> 2. Empty vfs map\n */\n configurePdfMake(pdfMakeInstance: any): void {\n if (!pdfMakeInstance) return;\n const win = typeof window !== 'undefined' ? (window as any) : {};\n pdfMakeInstance.vfs = win.vfs || {};\n pdfMakeInstance.fonts = {\n Amiri: {\n normal: 'Amiri-Regular.ttf',\n bold: 'Amiri-Regular.ttf',\n italics: 'Amiri-Regular.ttf',\n bolditalics: 'Amiri-Regular.ttf'\n }\n };\n }\n\n /**\n * Dynamically loads vfs-amiri.js when PDF export is needed.\n * Max 2 fallbacks:\n * Fallback 1: Dynamic script load of /assets/fonts/vfs-amiri.js\n * Fallback 2: Graceful degradation to default pdfMake fonts if script fails to load\n */\n async ensureAmiriFont(pdfMakeInstance?: any): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n const win = window as any;\n if (win.vfs && win.vfs['Amiri-Regular.ttf']) {\n if (pdfMakeInstance) {\n this.configurePdfMake(pdfMakeInstance);\n }\n return;\n }\n\n if (!this.fontLoadedPromise) {\n this.fontLoadedPromise = new Promise<void>((resolve) => {\n const existing = document.querySelector('script[src*=\"vfs-amiri.js\"]');\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => resolve(), { once: true });\n return;\n }\n\n const script = document.createElement('script');\n script.src = '/assets/fonts/vfs-amiri.js';\n script.async = true;\n script.onload = () => {\n resolve();\n };\n script.onerror = (err) => {\n console.warn('MR 18OCT26 Unable to load Amiri font dynamically, falling back to default pdfMake fonts', err);\n resolve();\n };\n document.head.appendChild(script);\n });\n }\n\n await this.fontLoadedPromise;\n if (pdfMakeInstance) {\n this.configurePdfMake(pdfMakeInstance);\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport * as numberToWords from 'number-to-words';\n\n@Pipe({\n name: 'amountToWords',\n standalone: true\n})\nexport class AmountToWordsPipe implements PipeTransform {\n \n /* This pipe is used to convert the amount to words. For that, we need to install the plugin 'num-to-words' */ \n // MY 05OCT26 Add 'and' between thousand and remaining amount or after hundreds\n transform(value: number): string {\n if (value === null || value === undefined || isNaN(value)) {\n return '';\n }\n let words = numberToWords.toWords(value);\n words = words.replace(/thousand,\\s+(?!.*hundred)/i, 'thousand and ');\n words = words.replace(/hundred\\s+(?!(?:and|thousand|million|billion)\\b)/i, 'hundred and ');\n words = words.replace(/thousand,\\s+/i, 'thousand ');\n return words;\n }\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rangertechnologies-fusion-ui.mjs","names":["i1","i1","i1","i1","i2.ConfigService","i1.ApiService","i1.GlobalValuesService","i2","i3","i1.GlobalValuesService","i2","i3","i4","i1","i2","i1","i2","i1","i2","i1","i2","i1","i1","i1","i2","i3","i4","i1","i1","i1","i1","i2.AlertService","i1.LoaderService","i2","i3.GlobalValuesService","i4.ApiService","i5","i6.AlertService","i7.ErrorHandlerService","i8.ConfigService","i9.TabDataService","i10","i1","i1.ScrollService","i2","i3.GlobalValuesService","i4.ApiService","i5.AlertService","i6.ErrorHandlerService","i7.LoaderService","i8","i9","i11","i12","i2.ApiService","i3","i4.LoaderService","i5","i1.ToastService","i2","i1","i7","i1.AlertService","i2"],"sources":["../../src/lib/pipes/custom-translate.pipe.ts","../../src/lib/components/fusion-button/fusion-button.component.ts","../../src/lib/components/fusion-button/fusion-button.component.html","../../src/lib/pipes/search-filter/search-filter.pipe.ts","../../src/lib/services/config.service.ts","../../src/lib/services/api.service.ts","../../src/lib/services/global-values.service.ts","../../src/lib/components/search-filter/search-filter.component.ts","../../src/lib/components/search-filter/search-filter.component.html","../../src/lib/components/multi-checkbox/multi-checkbox.component.ts","../../src/lib/components/multi-checkbox/multi-checkbox.component.html","../../src/lib/components/drop-down/drop-down.component.ts","../../src/lib/components/drop-down/drop-down.component.html","../../src/lib/components/multiple-filter/multiple-filter.component.ts","../../src/lib/components/multiple-filter/multiple-filter.component.html","../../src/lib/components/pagination/pagination.component.ts","../../src/lib/components/pagination/pagination.component.html","../../src/lib/components/popover/popover.component.ts","../../src/lib/components/popover/popover.component.html","../../src/lib/components/modal/modal.component.ts","../../src/lib/components/modal/modal.component.html","../../src/lib/components/file-upload/file-upload.component.ts","../../src/lib/components/file-upload/file-upload.component.html","../../src/lib/models/Constants.ts","../../src/lib/components/side-screen/side-screen.component.ts","../../src/lib/components/side-screen/side-screen.component.html","../../src/lib/components/side-screen/common-screen/common-screen.component.ts","../../src/lib/components/side-screen/common-screen/common-screen.component.html","../../src/lib/components/side-screen/approval-screen/approval-screen.component.ts","../../src/lib/components/side-screen/approval-screen/approval-screen.component.html","../../src/lib/components/browse/browse.component.ts","../../src/lib/services/loading.service.ts","../../src/lib/services/alert.service.ts","../../src/lib/services/error-handler.service.ts","../../src/lib/services/tab-data.service.ts","../../src/lib/components/forms/forms.component.ts","../../src/lib/components/forms/forms.component.html","../../src/lib/pipes/get-value.pipe.ts","../../src/lib/pipes/data-table/edit-column-check.pipe.ts","../../src/lib/pipes/data-table/edit-column-type.pipe.ts","../../src/lib/pipes/data-table/edit-column-dropdown.pipe.ts","../../src/lib/pipes/data-table/total-colum-sum.pipe.ts","../../src/lib/shared/custom-paginator-intl.ts","../../src/lib/pipes/custom-date.pipe.ts","../../src/lib/pipes/custom-time.pipe.ts","../../src/lib/services/scroll.service.ts","../../src/lib/components/data-table/data-table.component.ts","../../src/lib/components/data-table/data-table.component.html","../../src/lib/components/fusion-card/fusion-card.component.ts","../../src/lib/components/fusion-card/fusion-card.component.html","../../src/lib/components/toast/toast.tokens.ts","../../src/lib/components/toast/toast.service.ts","../../src/lib/components/toast/toast.component.ts","../../src/lib/components/toast/toast.component.html","../../src/lib/components/multi-select-dropdown/multi-select-dropdown.component.ts","../../src/lib/components/multi-select-dropdown/multi-select-dropdown.component.html","../../src/lib/components/alert/alert.component.ts","../../src/lib/components/alert/alert.component.html","../../src/lib/services/pdf-font.service.ts","../../src/lib/pipes/amount-to-words.pipe.ts"],"sourcesContent":["// MR 02NOV26 CustomTranslatePipe for Payroll MFE\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Pipe({\n name: 'customTranslate',\n standalone: true\n})\nexport class CustomTranslatePipe implements PipeTransform {\n constructor(private translate: TranslateService) {}\n\n transform(key: string, defaultTranslation: string = ''): string {\n if (!key) return defaultTranslation;\n const translated = this.translate?.instant ? this.translate.instant(key) : null;\n return translated && translated !== key ? translated : (defaultTranslation || key);\n }\n}\n\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n@Component({\n selector: 'app-fusion-button',\n standalone: true,\n imports: [CommonModule,AngularSvgIconModule, CustomTranslatePipe],\n templateUrl: './fusion-button.component.html',\n styleUrls: ['./fusion-button.component.css']\n})\nexport class FusionButtonComponent implements OnInit {\n \n @Input() buttonValue: string = ''; //SKS24JAN25 button text \n @Input() buttonValuePath: string = ''; //SK04SEP25\n @Input() buttonType: string = 'primary'; //SKS24JAN25 If the button type is 'text-only', it should display only the text without a border or outline. For 'grey-text', the button should have a border and a background color, but the text color should be gray, similar to 'blue-text'\n @Input() type: string = 'button'; //SKS24JAN25 The button types are \"button,\" \"group,\" and \"dropdown.\"\n @Input() buttonDisable: boolean = false; //SKS24JAN25 use this input to disable a button when needed.\n @Input() fcBtnBgColor: string = ''; // Use this input to set a custom background color for the button.\n @Input() fcBtnBorder: string = ''; // Use this input to set a custom border style for the button.\n @Input() fcBtnTextColor: string = ''; // Use this input to set a custom text color for the button.\n @Input() fcBtnHeight: string = ''; // Use this input to set a custom height for the button.\n @Input() fcBtnWidth: string = ''; // Use this input to set a custom width for the button.\n @Input() fcBtnIconLeftSrc: string = ''; // Use this input to set the source of the left-side icon for the button.\n @Input() fcBtnIconRightSrc: string = ''; // Use this input to set the source of the right-side icon for the button.\n @Input() fcBtnHoverBgColor: string = ''; // Use this input to set the background color of the button on hover.\n @Input() fcBtnHoverTextColor: string = ''; // Use this input to set the text color of the button on hover.\n @Input() fcBtnId: string = 'default'; // Use this input to set a custom ID for the button. Default is 'default'.\n @Input() dataDismiss: string = ''; // Use this input to specify the dismiss action for the button (e.g., 'modal' to close a modal).\n @Input() fcButtonBorder: string = '0px'; // Use this input to set the border size of the button. Default is '0px' for no border.\n @Input() modalToTrigger: string = ''; // Use this input to specify the ID or target of the modal to be triggered.\n @Input() isImageSvg: boolean = false; // Use this input to determine if the image is an SVG. Default is false (non-SVG).\n @Input() tabIndex: any = '';// Use this input to set the tab index for the element, controlling the focus order.\n @Input() buttonConfig: any = ''; // Use this input to pass configuration settings for the group and dropdown buttons (e.g., styles, actions).\n @Input() buttonLoadingSpinner: boolean = false; //SK04SEP25 button loader\n @Output() buttonClickEmit:EventEmitter<any> = new EventEmitter<any>();\n iconSrc: any = ''; // Ensure it's always a string\n isDropdownOpen = false;\n\n \n\n // SKS24JAN25 dropdown button config\n\n // dropdownButton = {\n // fcBtnBgColor: '#007bff',\n // fcBtnBorder: '1px solid #0056b3',\n // fcBtnTextColor: '#ffffff',\n // fcBtnHeight: '40px',\n // fcBtnWidth: '150px',\n // fcBtnHoverBgColor: '#0056b3',\n // fcBtnHoverTextColor: '#ffffff',\n // label: 'Dropdown',\n // iconSrc: '',\n // items: [\n // { label: 'Action 1',iconSrc: '', hover: false },\n // { label: 'Action 2',iconSrc: '', hover: false },\n // { label: 'Action 3',iconSrc: '', hover: false }\n // ]\n // };\n constructor(private elementRef: ElementRef, private cdr: ChangeDetectorRef) { }\n\n ngOnInit(): void {}\n\n // SK04SEP25 loader input changes\n ngOnChanges(change:SimpleChanges): void {\n if(change[\"buttonLoadingSpinner\"]){\n this.buttonLoadingSpinner = change[\"buttonLoadingSpinner\"].currentValue;\n this.cdr.markForCheck();\n }\n }\n //SKS24JAN25 Function to get styles for dropdown and group buttons based on the provided configuration.\n getButtonStyles(config: any): { [key: string]: string } {\n return {\n '--fc-button-custom-bg': config.fcBtnBgColor || '',\n '--fc-button-custom-border': config.fcBtnBorder || '',\n '--fc-button-custom-color': config.fcBtnTextColor || '',\n '--fc-button-custom-height': config.fcBtnHeight || '',\n '--fc-button-custom-width': config.fcBtnWidth || '',\n '--fc-button-hover-bg': config.fcBtnHoverBgColor || '',\n '--fc-button-hover-text-color': config.fcBtnHoverTextColor || ''\n };\n }\n \n\n buttonClicked($event:any){\n this.buttonClickEmit.emit($event);\n if(this.isDropdownOpen){\n this.isDropdownOpen=false\n }\n }\n\n toggleDropdown() {\n this.isDropdownOpen = !this.isDropdownOpen;\n }\n//SKS24JAN25 Listener for clicks outside the dropdown button to close or manage its state.\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent) {\n if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)\n ) {\n this.isDropdownOpen = false;\n }\n }\n}\n","<!-- SKS24JAN25 group button -->\n<div *ngIf=\"type === 'group'\" class=\"btn-group\" role=\"group\" aria-label=\"Button Group\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.fcBtnId !== 'default' ? btn.fcBtnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <div class=\"custom-tooltip\" \n [ngStyle]=\"{\n 'background-color': btn.tooltipBcColor,\n 'color': btn.tooltipColor,\n 'font-size': btn.tooltipFSize\n }\">\n {{ btn.tooltip }}\n <div class=\"tooltip-pointer\" [ngStyle]=\"{'background-color': btn.tooltipBcColor}\"></div>\n </div>\n </button>\n</div>\n \n<!-- SKS24JAN25 single button -->\n<button type=\"button\" *ngIf=\"type !== 'group' && type !== 'dropdown'\" class=\"btn btn-primary fc-button flex {{buttonType}}\" [tabindex]=\"tabIndex\"\n [attr.data-bs-toggle]=\"modalToTrigger != '' ? 'modal' : ''\"\n [attr.data-bs-target]=\"modalToTrigger != '' ? '#'+modalToTrigger : ''\"\n style=\"--fc-button-custom-bg: {{fcBtnBgColor}};--fc-button-custom-border: {{fcBtnBorder}};--fc-button-custom-color: {{fcBtnTextColor}};--fc-button-custom-height: {{fcBtnHeight}};--fc-button-custom-width: {{fcBtnWidth}};--fc-button-hover-bg: {{fcBtnHoverBgColor}};--fc-button-hover-text-color: {{fcBtnHoverTextColor}};\"\n [disabled]=\"buttonDisable || buttonLoadingSpinner\" [attr.data-bs-dismiss]='dataDismiss' (click)=\"buttonClicked($event)\"\n [attr.id]=\"fcBtnId != 'default' ? fcBtnId : null\">\n <img *ngIf=\"fcBtnIconLeftSrc && fcBtnIconLeftSrc != '' && isImageSvg\" src=\"{{fcBtnIconLeftSrc}}\"\n class=\"fc-btn-icon left-icon\">\n <img *ngIf=\"fcBtnIconLeftSrc && fcBtnIconLeftSrc != '' && !isImageSvg\" src=\"{{fcBtnIconLeftSrc}}\" class=\"fc-btn-icon left-icon\">\n <!-- <div class=\"fc-btn-text\">{{buttonValue}}</div> -->\n <img *ngIf=\"fcBtnIconRightSrc && fcBtnIconRightSrc != '' && isImageSvg\" src=\"{{fcBtnIconRightSrc}}\"\n class=\"fc-btn-icon right-icon\">\n <img *ngIf=\"fcBtnIconRightSrc && fcBtnIconRightSrc != '' && !isImageSvg\" src=\"{{fcBtnIconRightSrc}}\" class=\"fc-btn-icon right-icon\">\n <!-- SK04SEP25 loader -->\n <!-- MY 15OCT26 adjust margin spacing on spinner-grow -->\n <div class=\"{{ buttonLoadingSpinner ? 'spinner-grow me-1' : '' }} spinner-grow-sm\" role=\"buttonValue\"\n aria-hidden=\"true\"></div>\n <div style=\"font-size: var(--fs-medium); line-height: normal !important;\">{{ buttonLoadingSpinner ? ('APP_SETTINGS_APPS.LOADING' | customTranslate : 'Loading') + '...' : (buttonValuePath | customTranslate : buttonValue) }}\n </div>\n</button>\n\n<!-- SKS24JAN25 dropdown button -->\n<div *ngIf=\"type === 'dropdown'\" class=\"dropdown\">\n <img src=\"../assets/images/icons/general/others.svg\" class=\"clickable-img\" (click)=\"toggleDropdown()\" />\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.fcBtnId !== 'default' ? btn.fcBtnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 12px;\">{{btn.name}}</div>\n </button>\n </div>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n\n@Pipe({\n name: 'searchFilter',\n standalone: true\n})\nexport class SearchFilterPipe implements PipeTransform {\n\n\n //getting the array datas and search data from pipe element on every change\n transform(items: any[], searchText: string, ele?:any): any[] {\n if (!items) return [];\n if (!searchText) return items;\n return this.searchItems(items, searchText.toLowerCase(), ele);\n }\n // passing that data here, and if the search element included in that array, that element will be returned in new array\n private searchItems(items: any[], searchText: string, ele?:any): any[] {\n let results: any[] = [];\n items.forEach((data: any) => {\n if(ele){\n if (data[ele]?.toLowerCase().includes(searchText)) {\n results.push(data);\n }\n } else {\n if (data?.toLowerCase().includes(searchText)) {\n results.push(data);\n }\n }\n });\n return results;\n }\n}","// MR 09NOV26 Synchronous host contract resolution for apiUrl and appUrl\nimport { Injectable } from \"@angular/core\";\nimport { HttpClient } from \"@angular/common/http\";\nimport { firstValueFrom } from \"rxjs\";\n\nexport interface HostContract {\n version: string;\n apiUrl: string;\n appUrl: string;\n publishedAt: string;\n}\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class ConfigService {\n private config: any;\n private static runtimeConfig: any;\n private readonly defaultApiUrl = \"https://dev-api.rangerfusion.com\";\n private static readonly hostContractGlobal = \"__FUSION_HOST_RUNTIME_CONTRACT__\";\n\n constructor(private http: HttpClient) { }\n\n async loadConfig(): Promise<any> {\n const hostContract = this.getHostContract();\n if (hostContract) {\n this.config = {\n serviceConfig: {\n apiUrl: hostContract.apiUrl,\n API_URL: hostContract.apiUrl,\n appUrl: hostContract.appUrl,\n APP_URL: hostContract.appUrl\n },\n hostContract\n };\n ConfigService.runtimeConfig = this.config;\n return this.config;\n }\n\n try {\n const loadedConfig = await firstValueFrom(this.http.get<any>(\"assets/settings/config.json\"));\n if (loadedConfig?.serviceConfig?.apiUrl || loadedConfig?.serviceConfig?.API_URL) {\n this.config = loadedConfig;\n ConfigService.runtimeConfig = this.config;\n return loadedConfig;\n }\n } catch {\n // Fall through to default\n }\n\n this.config = {\n serviceConfig: {\n apiUrl: this.defaultApiUrl,\n API_URL: this.defaultApiUrl\n }\n };\n ConfigService.runtimeConfig = this.config;\n return this.config;\n }\n\n getConfig(key: any) {\n return this.config?.[key];\n }\n\n getServiceConfig(key: any) {\n return this.config?.serviceConfig?.[key];\n }\n\n static getServiceConfig(key: any) {\n return ConfigService.runtimeConfig?.serviceConfig?.[key];\n }\n\n getApiUrl(): string {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = this.getHostContract();\n if (hostContract?.apiUrl) {\n return hostContract.apiUrl;\n }\n\n // 2. Fallback: Standalone local configuration or default\n return this.config?.serviceConfig?.apiUrl || this.config?.serviceConfig?.API_URL || this.defaultApiUrl;\n }\n\n static getApiUrl(): string | undefined {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = ConfigService.getHostContract();\n if (hostContract?.apiUrl) {\n return hostContract.apiUrl;\n }\n\n // 2. Fallback: Standalone local configuration\n const serviceConfig = ConfigService.runtimeConfig?.serviceConfig;\n return serviceConfig?.API_URL || serviceConfig?.apiUrl;\n }\n\n getAppUrl(): string | undefined {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = this.getHostContract();\n if (hostContract?.appUrl) {\n return hostContract.appUrl;\n }\n\n // 2. Fallback: Standalone local configuration\n return this.config?.serviceConfig?.appUrl || this.config?.serviceConfig?.APP_URL;\n }\n\n static getAppUrl(): string | undefined {\n // 1. Primary: Active host runtime contract published by the host shell\n const hostContract = ConfigService.getHostContract();\n if (hostContract?.appUrl) {\n return hostContract.appUrl;\n }\n\n // 2. Fallback: Standalone local configuration\n const serviceConfig = ConfigService.runtimeConfig?.serviceConfig;\n return serviceConfig?.APP_URL || serviceConfig?.appUrl;\n }\n\n isSplitUserBootstrap(): boolean {\n return Boolean(this.getServiceConfig(\"splitUserBootstrap\"));\n }\n\n static getHostContract(): HostContract | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n const contract = (window as any)[ConfigService.hostContractGlobal];\n return contract?.apiUrl ? contract : null;\n }\n\n getHostContract(): HostContract | null {\n return ConfigService.getHostContract();\n }\n}\n","// MR 02NOV26 API Service for Payroll MFE\nimport { Injectable } from \"@angular/core\";\nimport { HttpClient, HttpParams, HttpHeaders, HttpResponse } from \"@angular/common/http\";\nimport { Observable, firstValueFrom, catchError, throwError, shareReplay } from \"rxjs\";\nimport { ConfigService } from \"./config.service\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class ApiService {\n constructor(private http: HttpClient, private configService: ConfigService) {}\n\n private getUrl(path: string): string {\n const base = this.configService.getApiUrl() || \"\";\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path;\n }\n const cleanPath = path.startsWith(\"/\") ? path : \"/\" + path;\n return `${base}${cleanPath}`;\n }\n\n fetchValue(path: string, params?: any, componentId: string = \"default\"): Observable<any> {\n const url = this.getUrl(path);\n const options: any = {};\n if (params) {\n options.params = params;\n }\n return this.http.get<any>(url, options).pipe(\n shareReplay({ bufferSize: 1, refCount: false }),\n catchError(err => throwError(() => err))\n );\n }\n\n fetchData(url: any, paramsOrComponentId?: any, componentId: string = \"default\"): Observable<any> {\n const targetUrl = this.getUrl(url);\n const options: any = {};\n if (paramsOrComponentId && typeof paramsOrComponentId === \"object\") {\n options.params = paramsOrComponentId;\n }\n return this.http.get<any>(targetUrl, options).pipe(\n shareReplay({ bufferSize: 1, refCount: false }),\n catchError(err => throwError(() => err))\n );\n }\n\n fetchDataAsPromise(url: any, componentId: string = \"default\"): Promise<any> {\n return firstValueFrom(this.fetchData(url, null, componentId));\n }\n\n writeValue(writeType: string, path: string, body?: any, componentId: string = \"default\", customHeaders?: HttpHeaders): Observable<any> {\n const url = this.getUrl(path);\n const options: any = {};\n if (customHeaders) {\n options.headers = customHeaders;\n }\n\n switch (writeType?.toLowerCase()) {\n case \"patch\":\n return this.http.patch<any>(url, body, options).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n case \"put\":\n return this.http.put<any>(url, body, options).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n case \"post\":\n return this.http.post<any>(url, body, options).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n case \"delete\":\n options.body = body;\n return this.http.delete<any>(url, options).pipe(\n catchError(err => throwError(() => err))\n );\n default:\n return throwError(() => new Error(`Unsupported writeType: ${writeType}`));\n }\n }\n\n getCSVTemplates(type: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(\"/template?type=\" + encodeURIComponent(type.trim()));\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n getEsiPFTemplates(type: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(\"/template?type=\" + encodeURIComponent(type.trim()));\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n getXlsx(type: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(type);\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n uploadFiles(endpoint: any, file: FormData, componentId: string = \"default\"): Observable<any> {\n const url = this.getUrl(endpoint);\n return this.http.post<any>(url, file).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n }\n\n uploadDataAsPromise(url: any, file: FormData, componentId: string = \"default\"): Promise<any> {\n return firstValueFrom(this.uploadFiles(url, file, componentId));\n }\n\n getFile(apiPath: string, httpsParams?: HttpParams, componentId: string = \"default\"): Observable<HttpResponse<Blob>> {\n const url = this.getUrl(apiPath);\n return this.http.get(url, { params: httpsParams, observe: \"response\", responseType: \"blob\" });\n }\n\n getAttendance(apiPath: string, month: string, accessor: string, startDate: string, endDate: string, componentId: string = \"default\"): Observable<Blob> {\n const url = this.getUrl(`/template?type=${encodeURIComponent(apiPath.trim())}&month=${encodeURIComponent(month)}&accessor=${encodeURIComponent(accessor)}&startDate=${encodeURIComponent(startDate)}&endDate=${encodeURIComponent(endDate)}`);\n return this.http.get(url, { responseType: \"blob\" });\n }\n\n uploadAttendance(url: any, file: any, accessor: any, month: any, componentId: string = \"default\"): Observable<any> {\n const endpoint = url?.includes(\"?\")\n ? `${url}&accessor=${encodeURIComponent(accessor)}&month=${encodeURIComponent(month)}`\n : `${url}?accessor=${encodeURIComponent(accessor)}&month=${encodeURIComponent(month)}`;\n return this.http.patch(this.getUrl(endpoint), file).pipe(\n shareReplay(1),\n catchError(err => throwError(() => err))\n );\n }\n}\n","// MR 02NOV26 Complete GlobalValuesService for Payroll MFE\nimport { Injectable } from \"@angular/core\";\nimport { Subject, Observable, firstValueFrom } from \"rxjs\";\nimport { ApiService } from \"./api.service\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class GlobalValuesService {\n settingsData: any;\n orgId: any = \"\";\n superUser = false;\n hrmUser = false;\n hrmManager = false;\n empId: any;\n loginName: any;\n loginFirstName: any;\n loginLastName: any;\n fullLoginName: any;\n compFullName: any;\n userId: any;\n allEmployeeData: any;\n allNotificationData: any;\n loggedInUserData: any;\n tokenVariable: any;\n permissions: any;\n localStorageKeys: any;\n notificationCount: number = 0;\n\n laguageChanges$ = new Subject<string>();\n\n private activeBox: any;\n private activeFilter = new Subject<any>();\n activeFilterChange$ = this.activeFilter.asObservable();\n\n private selectedEmp = new Subject<any>();\n selectedEmpChange$ = this.selectedEmp.asObservable();\n\n private selectedEmpSubTab = new Subject<any>();\n selectedEmpSubTabChange$ = this.selectedEmpSubTab.asObservable();\n\n private refreshEmp = new Subject<any>();\n refreshEmp$ = this.refreshEmp.asObservable();\n\n private tablPageParams = new Subject<any>();\n tablPageParamsValue$ = this.tablPageParams.asObservable();\n\n private cachedPayslipTemplate: any = null;\n private payslipTemplateInFlight: Promise<any> | null = null;\n\n constructor(private apiService: ApiService) {\n this.initFromStorage();\n }\n\n private initFromStorage(): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n const rawUser = localStorage.getItem(\"userData\");\n if (rawUser) {\n const parsed = JSON.parse(rawUser);\n this.loggedInUserData = parsed;\n this.orgId = parsed?.companyId || parsed?.orgId || \"\";\n this.empId = parsed?.empId || parsed?.id;\n this.userId = parsed?.userId;\n this.loginName = parsed?.userName || parsed?.loginName;\n }\n const rawSettings = localStorage.getItem(\"settingsData\");\n if (rawSettings) {\n this.settingsData = JSON.parse(rawSettings);\n }\n } catch (e) {\n console.warn(\"[GlobalValuesService] Failed parsing storage data:\", e);\n }\n }\n\n getItem(key: string): string | null {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(key);\n }\n\n setItem(key: string, value: string): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(key, value);\n }\n\n activeFilterBox(data: any): void {\n this.activeBox = data.activeBox;\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(\"activeSearchFilter\", JSON.stringify(data.filterKeys));\n }\n this.activeFilter.next(data);\n }\n\n getActiveFilterBox(): any {\n return this.activeBox;\n }\n\n selectedEmpGet(data: any): void {\n this.selectedEmp.next(data);\n }\n\n selectedEmpSubTabGet(data: any): void {\n this.selectedEmpSubTab.next(data);\n }\n\n triggerRefreshEmp(element: any): void {\n this.refreshEmp.next(element);\n }\n\n setTablePageParams(data: any): void {\n this.tablPageParams.next(data);\n }\n\n getValue(element: any, column: string): any {\n if (!element || !column) return \"\";\n let current = element;\n const flds = column.split(\".\");\n for (const field of flds) {\n if (!current) return \"\";\n const splitFlds = field.split(\"[\");\n if (splitFlds.length === 1) {\n current = current[field] ?? \"\";\n } else {\n const index = Number(splitFlds[1].split(\"]\")[0]);\n current = current[splitFlds[0]]?.[index] ?? \"\";\n }\n }\n return current;\n }\n\n formatKey(value: any): string {\n if (!value || typeof value !== \"string\") return \"\";\n return value.replace(/[\\s-]/g, \"_\").toUpperCase();\n }\n\n async getSettingsAPI(): Promise<any> {\n try {\n const response = await firstValueFrom(this.apiService.fetchValue(\"/settings/finance\"));\n this.settingsData = response;\n this.setItem(\"settingsData\", JSON.stringify(response));\n return response;\n } catch {\n return null;\n }\n }\n\n async getPayslipTemplateAPI(): Promise<any> {\n try {\n if (this.cachedPayslipTemplate !== null && this.cachedPayslipTemplate !== undefined) {\n return this.cachedPayslipTemplate;\n }\n if (this.payslipTemplateInFlight) {\n return await this.payslipTemplateInFlight;\n }\n this.payslipTemplateInFlight = (async () => {\n const data: any = await this.apiService.fetchDataAsPromise(\"/user/payslipTemplate\");\n const template = data?.payslipTemplate !== undefined ? data.payslipTemplate : data;\n this.cachedPayslipTemplate = template;\n return template;\n })();\n const result = await this.payslipTemplateInFlight;\n this.payslipTemplateInFlight = null;\n return result;\n } catch (error) {\n this.payslipTemplateInFlight = null;\n console.error(\"Failed to fetch payslip template from /user/payslipTemplate\", error);\n return null;\n }\n }\n\n invalidatePayslipTemplate(): void {\n this.cachedPayslipTemplate = null;\n }\n\n filterObjectKeys(arrayOfObjects: any[], keys: string[]): any[] {\n let filteredObjects: any[] = [];\n if (!Array.isArray(arrayOfObjects)) return filteredObjects;\n arrayOfObjects.forEach((obj: any) =>\n filteredObjects.push(\n keys.reduce((acc: any, key: any) => {\n if (obj && Object.prototype.hasOwnProperty.call(obj, key)) {\n acc[key] = obj[key];\n }\n return acc;\n }, {})\n )\n );\n return filteredObjects;\n }\n\n convertToCsv2(objArray: any[], fields: any): string {\n if (!Array.isArray(objArray) || !Array.isArray(fields)) return \"\";\n let filterteData: any[] = [];\n objArray.forEach((element) => {\n let objs: any = {};\n fields.forEach((key: any) => {\n if (!Object.keys(element).includes(key)) {\n element[key] = \"-\";\n } else {\n objs[key] = this.getValue(element, key);\n }\n });\n filterteData.push(objs);\n });\n\n const selectedObjectsForCSV = this.filterObjectKeys(objArray, fields);\n const array = typeof selectedObjectsForCSV !== \"object\" ? JSON.parse(selectedObjectsForCSV) : selectedObjectsForCSV;\n let str = \"\";\n let header: any = {};\n fields.forEach((head: any) => {\n header[head] = head;\n });\n array.unshift(header);\n for (let i = 0; i < array.length; i++) {\n let line = \"\";\n for (const index in array[i]) {\n if (line !== \"\") {\n line += \",\";\n }\n if (typeof array[i][index] === \"object\") {\n line += JSON.stringify(array[i][index]).replace(/,/g, \"++\");\n } else {\n if (String(array[i][index])?.includes(\",\")) {\n array[i][index] = '\"' + array[i][index] + '\"';\n } else if (array[i][index] === \"\" || array[i][index] === null || array[i][index] === undefined) {\n array[i][index] = \"-\";\n }\n line += array[i][index];\n }\n }\n str += line + \"\\r\\n\";\n }\n return str;\n }\n\n deepMerge(target: any, source: any): any {\n for (let key in source) {\n if (source[key] && typeof source[key] === \"object\" && !Array.isArray(source[key])) {\n if (!target[key] || typeof target[key] !== \"object\") {\n target[key] = {};\n }\n this.deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n return target;\n }\n\n async base64ToFile(base64: string, fileName: string, mimeType: string): Promise<File> {\n const byteString = atob(base64.split(\",\")[1]);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([ab], { type: mimeType });\n return new File([blob], fileName, { type: mimeType });\n }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SearchFilterPipe } from \"../../pipes/search-filter/search-filter.pipe\";\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { GlobalValuesService } from \"../../services/global-values.service\";\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n\n@Component({\n selector: 'app-search-filter',\n standalone: true,\n imports: [CommonModule, SearchFilterPipe, ReactiveFormsModule, FormsModule, CustomTranslatePipe],\n templateUrl: './search-filter.component.html',\n styleUrls: ['./search-filter.component.css']\n})\nexport class SearchFilterComponent implements OnInit {\n //emits the checked data in a array\n @Output() emitValues = new EventEmitter();\n \n\n /* getting the data to be listed in filter as a input\n The array should be in the format of\n (foe example)\n filterItems = [\n 'All', 'Admin', 'Accounts', 'Marketing', 'Sales', 'Human Resources', 'IT', 'Civil', 'Mech'\n ]\n */\n\n @Input() filterItems: Array<any> = []; \n selectedFilter: Array<any> = [];\n selectArry: any[] = [];\n searchText: any;\n viewAll = false;\n\n //MV24AUG24 Subscribes to active filter changes from GlobalValuesService and restores the checkbox state based on the received filterKeys and activeBox.\n constructor(private globalValues:GlobalValuesService) {}\n\n ngOnInit(): void {}\n\n //SKS24JAN25 Function for emitting the checked data in an array to its parent component\n checkedData(event:any) {\n const activeFilterKey = this.globalValues.getActiveFilterBox();\n const activeSearchFilter = localStorage.getItem('activeSearchFilter');\n let selectedArray = []\n if (activeSearchFilter != undefined && activeSearchFilter != \"undefined\" && activeFilterKey != undefined && activeFilterKey != \"undefined\" ) {\n let parsedFilter = JSON.parse(activeSearchFilter); //SKS24JAN25 Parse the string into an array\n selectedArray = parsedFilter[activeFilterKey] ? parsedFilter[activeFilterKey] : []\n if (selectedArray && selectedArray.includes(event)) {\n selectedArray = selectedArray.filter((item: any) => item !== event);\n } else {\n selectedArray.push(event);\n }\n parsedFilter[activeFilterKey] = selectedArray\n localStorage.setItem('activeSearchFilter',JSON.stringify(parsedFilter));\n }\n if(this.selectArry){\n if (this.selectArry.includes(event)) {\n //SKS24JAN25 If the event is already in the array, remove it\n this.selectArry = this.selectArry.filter(item => item !== event);\n } else {\n //SKS24JAN25 If the event is not in the array, add it\n this.selectArry.push(event);\n }\n }\n this.emitValues.emit(this.selectArry);\n }\n\n isSelected(event:any){\n const activeFilterKey = this.globalValues.getActiveFilterBox();\n const activeSearchFilter = localStorage.getItem('activeSearchFilter');\n if (activeSearchFilter != undefined && activeSearchFilter != \"undefined\" && activeFilterKey != undefined && activeFilterKey != \"undefined\" ) {\n try {\n const parsedFilter = JSON.parse(activeSearchFilter); //SKS24JAN25 Parse the string into an array\n this.selectArry = parsedFilter[activeFilterKey] ? parsedFilter[activeFilterKey] : []\n } catch (error) {\n // console.error(\"Error parsing activeSearchFilter:\", error);\n }\n } else {\n }\n if(this.selectArry){\n if(this.selectArry.includes(event)){\n return true\n } else {\n return false\n }\n } else {\n return false\n }\n }\n get isResized(): boolean {\n return (this.selectArry?.length ?? 0) > 0;\n }\n closefilter(){\n const activeFilterKey = this.globalValues.getActiveFilterBox();\n const activeSearchFilter = localStorage.getItem('activeSearchFilter');\n let selectedArray = []\n if (activeSearchFilter != undefined && activeSearchFilter != \"undefined\" && activeFilterKey != undefined && activeFilterKey != \"undefined\" ) {\n let parsedFilter = JSON.parse(activeSearchFilter); // Parse the string into an array\n selectedArray = parsedFilter[activeFilterKey] ? parsedFilter[activeFilterKey] : []\n if (selectedArray) {\n parsedFilter[activeFilterKey] = []\n localStorage.setItem('activeSearchFilter',JSON.stringify(parsedFilter));\n } \n this.selectArry = []\n }\n this.emitValues.emit([]);\n }\n}\n\n","<div class=\"card\">\n <div class=\"content\">\n <div class=\"flex\">\n <div class=\"search\" [class.resized]=\"isResized\">\n <div class=\"search-bar\">\n <svg class=\"searchSvg\" width=\"18\" height=\"20\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M21.6295 20.1667L19.7271 18.3333\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg> \n <input class=\" width-100\" type=\"text\" placeholder=\"{{ 'APP.SEARCH' | customTranslate : 'Search' }}\" [(ngModel)]=\"searchText\" class=\"searchinput\">\n </div>\n </div>\n <svg *ngIf=\"isResized\" (click)=\"closefilter()\" class=\"close-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.16998 14.83L14.83 9.17001\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M14.83 14.83L9.16998 9.17001\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"filter-content\" [style]=\"'overflow-y: auto'\">\n <div *ngFor=\"let data of filterItems | searchFilter : searchText\">\n <div class=\"mt-3 mb-3 checkboxdiv\">\n <input type=\"checkbox\" class=\"checkbox-small\" [checked]=\"isSelected(data)\" [value]=\"data\" [id]=\"data\"\n (change)=\"checkedData(data)\">\n <label class=\"ms-2 label-data\">{{data}}</label>\n </div>\n </div>\n </div>\n </div>\n</div>","import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnInit, Output, QueryList, SimpleChanges, ViewChild, ViewChildren } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { FormsModule } from '@angular/forms';\nimport { SearchFilterPipe } from \"../../pipes/search-filter/search-filter.pipe\";\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { GlobalValuesService } from \"../../services/global-values.service\";\n\n@Component({\n selector: 'app-multi-checkbox',\n standalone: true,\n imports: [CommonModule,MatCheckboxModule, FusionButtonComponent, FormsModule, SearchFilterPipe,CustomTranslatePipe],\n templateUrl: './multi-checkbox.component.html', \n styleUrls: ['./multi-checkbox.component.css']\n})\nexport class MultiCheckboxComponent implements OnInit {\n\n @Input() label!:string; // SK15FEB24 label for card\n @Input() checkboxList:Array<any> = []; // SK15FEB24 the list that to to dispolayed in card\n @Input() activeCheckboxList:Array<any> = []; // the active list that to be check \n @Input() cardSize = \"col-md-6\"; // SK15FEB24 card size\n @Input() componentData:any; // SK15FEB24 component data\n @Input() cardInlineSize = \"col-md-2\"; // SK15FEB24 inline chek box size\n @Input() buttonList:Array<any> = []; // SK15FEB24 button list in component\n @Input() cardClass : string = \"\"; //SK03OCT24\n @Input() clearSelection : boolean = false; //SK27OCT24\n @Input() displayValues:any = {\n keyString:\"\",\n valueString:\"\"\n };\n @Input() checkBoxStyles : string = \"\";\n @Input() contentCardStyle : string = \"\"; //SK12SEP25 \n @Input() cardStyle : string = \"\"; //SK12SEP25 \n \n @Output() compDataEmit: EventEmitter<any> = new EventEmitter<any>(); // SK15FEB24 emit action while clicking save\n @Output() checkEmit: EventEmitter<any> = new EventEmitter<any>();\n checkboxSelection:any;\n @Input() radioCheck = false; // SK14MAR24 to select only one checkbox at a time\n isArrayofObj = false; //SK20FEB24 to check the list if 'array' / 'array of objects's\n @ViewChildren('allCheck') allCheck!:QueryList<any>; // SK14MAR24 to clear or check check the \"Select/UnSelect All\" checkbox\n searchText:any; //SK03OCT24\n @Input() isButtonLoadingSpinner: boolean = false; //SK07NOV25\n\n constructor(public globalValues: GlobalValuesService, public cdr: ChangeDetectorRef) { } // MY 15OCT26 inject ChangeDetectorRef\n\n ngOnInit(): void {\n }\n\n ngOnChanges(changes:SimpleChanges){\n // MY 15OCT26 trigger change detection on input changes\n this.cdr.markForCheck();\n // SK15FEB24 the avtive element made true from checkBoxList\n // MY 15OCT26 preserve existing checkboxSelection when only non-list inputs (such as isButtonLoadingSpinner) change\n if (!this.checkboxSelection || changes[\"checkboxList\"] || changes[\"activeCheckboxList\"]) {\n this.checkboxSelection = new SelectionModel<any>(true, []);\n }\n if(changes[\"clearSelection\"]){\n if(this.clearSelection){\n this.checkboxSelection.clear();\n }\n }\n if(changes[\"checkboxList\"] || changes[\"activeCheckboxList\"]){\n if(this.checkboxList?.length > 0)this.isArrayofObj = typeof this.checkboxList[0] === \"string\" ? false : true;\n //SK20FEB24 checking the array of objects condition is true\n if(this.isArrayofObj){\n const checkboxList:any = [];\n const endpoint = this.componentData?.config?.endPoint.filter((obj:any)=>obj.name === 'checkboxList')\n // SK25JUL24\n if(endpoint){\n this.checkboxList?.forEach((element:any) => {\n // SK20FEB24, creating an element and assigning the value to a variable, that to be displayed in list\n const dupElement = {label:this.globalValues.getValue(element, endpoint[0].checkBoxLabelKey),labelPath:this.globalValues.getValue(element, \"labelPath\"),value:this.globalValues.getValue(element, endpoint[0].checkBoxPatchKey)};\n checkboxList.push(dupElement);\n this.checkboxList = checkboxList;\n });\n } else {\n // SK03OCT24 displayValyes fetch the label/value keys from array list from parent\n if(this.displayValues == null || this.displayValues == undefined ){\n this.checkboxList?.forEach((element:any) => {\n // SK03OCT24, creating an element and assigning the value to a variable, that to be displayed in list\n const dupElement = {label:this.globalValues.getValue(element, \"label\"),labelPath:this.globalValues.getValue(element, \"labelPath\"),value:this.globalValues.getValue(element, \"value\")};\n checkboxList.push(dupElement);\n this.checkboxList = checkboxList;\n });\n }\n }\n \n //SK20FEB24, selecting the checked element in list \n // SK03OCT24 binding the keys and values as per parent data\n const activeCBList = typeof this.activeCheckboxList[0] === \"string\" ? this.activeCheckboxList : this.activeCheckboxList.map((data:any)=> data[this.displayValues?.valueString] || data.value)\n this.checkboxList?.forEach((element1:any) => {\n const val = element1[this.displayValues?.valueString] || element1.value;\n // //SK15JAN25\n if(activeCBList?.includes(val)){\n this.checkboxSelection.select(element1);\n }\n });\n } else {\n this.checkboxList?.forEach((element:any) => {\n if(this.activeCheckboxList?.includes(element)){\n this.checkboxSelection.select(element);\n }\n });\n }\n }\n }\n\n // SK15FEB24 basid on action the event emits\n buttonClick(event:any){\n // MY 15OCT26 prevent click while button is in loading state\n if (event?.buttonLoadingSpinner || event?.isButtonLoadingSpinner || this.isButtonLoadingSpinner || this.componentData?.isButtonLoadingSpinner) {\n return;\n }\n if(event.buttonAction ===\"cancel\"){\n this.allCheck.toArray()[0].checked = false; //SK14MAR24 to uncheck \"Select/UnSelect All\" checkbox on cancl button\n this.checkboxSelection.clear();\n } else {\n this.compDataEmit.emit({checkListArray:this.checkboxSelection.selected, compData:this.componentData, button:event});\n }\n }\n\n // SK14MAR24 on check/uncheck the checkbox list, the selction data is emitted to parent\n checkAction(evt:any, event:any){\n if(evt === \"Select/UnSelect All\"){\n if(event.checked){\n this.checkboxList.forEach((ele:any)=>this.checkboxSelection.select(ele))\n } else {\n this.checkboxSelection.clear();\n }\n } else {\n if(this.radioCheck){\n this.checkboxSelection.clear();\n if(event.checked){\n this.checkboxSelection.select(evt);\n }\n }\n }\n if(this.checkboxSelection.selected.length > 0 && evt !== \"Select/UnSelect All\") this.allCheck.toArray()[0].checked = false;\n if(this.checkboxSelection.selected.length === this.checkboxList.length) this.allCheck.toArray()[0].checked = true;\n this.checkEmit.emit(this.checkboxSelection.selected);\n }\n}\n","<!-- SK15FEB24 Multi check component -->\n<div class=\"card flex {{cardClass}} {{cardSize}}\" style=\"{{cardStyle}}\">\n <div>\n <div class=\"fw-bold\" style=\"padding: 5px 10px 5px;\">{{label | customTranslate : label}}</div>\n </div>\n <!-- SK03OCT24 search filter in multiple checkbox -->\n <div class=\"search\" style=\"margin: 0px 10px 0px;\">\n <div class=\"search-bar flex\">\n <input class=\"width-100\" type=\"text\" placeholder=\"{{ 'APP.SEARCH' | customTranslate : 'Search' }}\" [(ngModel)]=\"searchText\"\n style=\"border:none;\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n </div>\n </div>\n <!-- SK20FEB24 if the list is array, the list will be shown as it is -->\n <!-- SK14MAR24 fixed stylings and added Select All/ Unselect Allcheckbox -->\n <div *ngIf=\"!isArrayofObj\" style=\"{{checkBoxStyles}}\">\n <!-- SK12SEP25 card inline style modified -->\n <div class=\"flex flex-wrap\" style=\"{{contentCardStyle}}\" >\n <mat-checkbox class=\"col-md-12\" #allCheck *ngIf=\"!radioCheck\" (click)=\"$event.stopPropagation()\" (change)=\"checkAction('Select/UnSelect All', $event)\">\n <span class=\"text-wrap\" style=\"font-size: small;\" >{{\"APP.SELECT_OR_UNSELECT_ALL\" | customTranslate : 'Select/UnSelect All'}}</span>\n </mat-checkbox>\n <div *ngIf=\"radioCheck\" #allCheck ></div>\n <div class=\"{{cardInlineSize}} flex\" *ngFor=\"let list of checkboxList | searchFilter : searchText; let i = index\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? checkboxSelection.toggle(list) : null\" (change)=\"checkAction(list, $event)\"\n [checked]=\"checkboxSelection.isSelected(list)\">\n <span class=\" text-wrap\" style=\"font-size: small;\" >{{list}}</span>\n </mat-checkbox>\n </div>\n </div>\n </div>\n <!-- SK20FEB24 if the list is array of objects, the mopdified list will be shown -->\n <!-- SK14MAR24 fixed stylings and added Select All/ Unselect Allcheckbox -->\n <div *ngIf=\"isArrayofObj\" style=\"{{checkBoxStyles}}\">\n <!-- //SK12SEP25 card inline style -->\n <div class=\"flex flex-wrap\" style=\"{{contentCardStyle}}\">\n <mat-checkbox #allCheck *ngIf=\"!radioCheck\" (click)=\"$event.stopPropagation()\" (change)=\"checkAction('Select/UnSelect All', $event)\">\n <span class=\" text-wrap\" style=\"font-size: small;\" >{{\"APP.SELECT_OR_UNSELECT_ALL\" | customTranslate : \"Select/UnSelect All\"}} </span>\n </mat-checkbox>\n <div class=\"{{cardInlineSize}} flex\" *ngFor=\"let list of checkboxList | searchFilter : searchText : (displayValues?.keyString || 'label | customTranslate : label'); let i = index\">\n <mat-checkbox class=\" flex-wrap\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? checkboxSelection.toggle(list) : null\" (change)=\"checkAction(list, $event)\"\n [checked]=\"checkboxSelection.isSelected(list)\">\n <span class=\" text-wrap\" style=\"font-size: small;\" >{{ displayValues?.keyString ? (list[displayValues.keyString] | customTranslate : list[displayValues.keyString] ) : (list.labelPath || list.label | customTranslate : list.label) }}\n </span>\n </mat-checkbox>\n </div>\n </div>\n </div>\n <div class=\"m-2 d-flex justify-content-end\">\n <!-- MY 16OCT26 support button loader on save/action button and disable cancel while loading -->\n <app-fusion-button *ngFor=\"let button of buttonList\" [buttonLoadingSpinner]=\"button.buttonLoadingSpinner || button.isButtonLoadingSpinner || (button.buttonAction !== 'cancel' && (isButtonLoadingSpinner || componentData?.isButtonLoadingSpinner))\" [buttonDisable]=\"button.buttonDisable || (button.buttonAction === 'cancel' && (isButtonLoadingSpinner || componentData?.isButtonLoadingSpinner))\" [buttonType]=\"button.class\" [buttonValue]=\"button.labelPath || button.label | customTranslate : button.label\"\n (buttonClickEmit)=\"buttonClick(button)\">\n </app-fusion-button>\n </div>\n</div>\n<!-- [disabled]=\"checkboxSelection.isSelected('No Access') && days !== 'No Access'\" -->","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { FormsModule } from '@angular/forms';\nimport { SearchFilterPipe } from \"../../pipes/search-filter/search-filter.pipe\";\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n@Component({\n selector: 'app-drop-down',\n standalone: true,\n imports: [CommonModule, AngularSvgIconModule, FormsModule, SearchFilterPipe, CustomTranslatePipe],\n templateUrl: './drop-down.component.html',\n styleUrls: ['./drop-down.component.css']\n})\nexport class DropDownComponent implements OnInit {\n @Input() lists! : Array<any>; // dropdown datas are reveived as input in form of array from child component\n @Input() title! : String; //SC04DEC2025 for dropdown title\n @Output() dataEmit = new EventEmitter(); //emits the selected data from dropdown to child component\n @Input() dropDownWidth= ''; // width value for dropdown to increase/decrease width size\n @Input() selectBoxWidth= ''; // SKS15MAR25 width value for select box to increase/decrease width size\n @Input() dropDownHeight= ''; // increase/decrease the height of drop down box\n @Input() selectBoxHeight= ''; //SKS15MAR25 increase/decrease the height of select box\n @Input() selectBoxBorder= ''; //SKS15MAR25 true or none the border size of select box\n @Input() dropBorderRadius= '5px'; // to style the of the border;\n @Input() selectedData :any = 'Select'; // default value from array list can be sent in this variable\n @Input() controlName: string = '';\n @Input() multipleSelect: boolean = false; //SK03OCT24\n @Input() multipleSelectedData: Array<any> = []; //SK03OCT24\n @Input() multipleSelectedView: Array<any> = []; //SK03OCT24\n\n /*the 'errorValue' (or) 'defaultValue', any one can be used. If we want to display error while selecting the data, \n then 'errorValue' variable can be used, else, if we want to select none from list, we can use default value*/\n @Input() errorValue = ''; \n @Input() defaultValue = '';\n @Input() isDisabled = false;\n @Input() isRequired = false; // input property to indicate whether the dropdown is required or not\n @Input() isError: boolean = false;\n @Input() bindKey!: string; //SK24DEC24\n @Input() bindValue!: string; //SK14AUG25 Dropdown bindvalue\n @Input() sortData: any; //SK24DEC24\n @Input() ddConfigs: any; //SK24DEC24\n @Output() errorEmit = new EventEmitter();\n @Output() multipleSelectDataEmit = new EventEmitter(); //SK03OCT24\n\n //error message to be displayed if we displaying a error\n @Input() errorMessage = '';\n searchText = \"\"; //SK03OCT24\n\n private clickListener!: (event: MouseEvent) => void;\n currentSelectedValue: any; //SC13AUG2025 to store the selected options from dropdown\n\n\n constructor(private readonly elementRef: ElementRef) { }\n\n ngOnInit(): void {\n // add an event listener to the document object that listens for a click event.\n this.clickListener = this.handleDocumentClick.bind(this);\n document.addEventListener('click', this.clickListener);\n }\n \n ngOnDestroy(): void {\n // remove the event listener from the document object to prevent memory leaks\n document.removeEventListener('click', this.clickListener);\n }\n\n ddType:any\n // SK24DEC24 to detect changes on lists\n ngOnChanges(changes:SimpleChanges): void {\n if(changes['lists']){\n if(this.lists){\n if(this.lists instanceof Set) this.lists = Array.from(this.lists) //SK20JAN25 convert to array from set\n if(typeof this.lists[0] === \"string\" || typeof this.lists[0] === \"number\"){\n this.ddType = 'string';\n } else if (Array.isArray(this.lists)) {\n this.ddType = 'object';\n if (this.sortData?.sortType === 'ascending') {\n this.lists.sort((a, b) => a[this.sortData?.sortKey] - b[this.sortData?.sortKey]);\n } else {\n this.lists.sort((a, b) => b[this.sortData?.sortKey] - a[this.sortData?.sortKey]);\n }\n }\n }\n } \n // SKS26MAR25 Added null and type checks to prevent errors when accessing `selectedData` properties.\n if (changes['selectedData']) { \n const currentValue = changes['selectedData'].currentValue;\n if (currentValue && typeof this.selectedData !== \"string\" && typeof this.selectedData !== \"number\") {\n if (this.selectedData) this.selectedData = currentValue[this.bindKey] || null;\n this.dataEmit.emit({ event: \"\", data: currentValue, controlName: this.controlName, comps: this.ddConfigs });\n }\n // SK14AUG25 display the selected Key not value\n if(typeof this.lists[0] === 'object' && this.bindValue){\n let selectData = this.lists.find((item, index) => item[this.bindValue] === this.selectedData)\n this.selectedData = selectData?.[this.bindKey] || this.selectedData;\n }\n }\n }\n\n dropDown = false;\n showError = false;\n\n listValue(event: any, data:any, type:string){\n // SK03OCT24 dropdown from single or multiple select\n this.currentSelectedValue = data; //SC13AUG2025 to store the selected value \n if(type===\"singleSelect\"){\n // SK24DEC24 check if the list is array of object\n if(typeof data === \"string\" || typeof data === \"number\"){\n this.selectedData = data;\n } else {\n this.selectedData = data?.[this.bindKey];\n }\n \n this.dataEmit.emit({event: event, data:data, controlName: this.controlName, comps:this.ddConfigs});\n this.isError = false;\n } else if(type===\"multipleSelect\"){\n let list = Array.from(this.multipleSelectedView);\n list.push(data)\n this.multipleSelectedView = new Set(list) as any ;\n this.multipleSelectDataEmit.emit({event: event, data:Array.from(this.multipleSelectedView), controlName: this.controlName});\n this.isError = false;\n }\n }\n\n // first check if the click event occurred inside the dropdown component or not by calling the contains method on the nativeElement property of the elementRef object. \n // If the click event occurred outside the component, we set the dropDown property to false, which will close the dropdown\n private handleDocumentClick(event: MouseEvent): void {\n const isClickInside = this.elementRef.nativeElement.contains(event.target);\n if (!isClickInside) {\n this.dropDown = false;\n }\n }\n // when outside click if the selected data and error value is equlas then show the error message\n outsideClick(){\n if(this.selectedData == this.errorValue){\n this.isError = true;\n this.errorEmit.emit(true);\n }else{\n this.isError = false;\n this.errorEmit.emit(false);\n }\n }\n\n // SK03OCT24 removing the values, if multiple select values in filter, \n removeSelectedFilter(data:string, index:number){\n let list = Array.from(this.multipleSelectedView);\n list.splice(index,1);\n this.multipleSelectedView = list as any;\n this.multipleSelectDataEmit.emit({data:Array.from(this.multipleSelectedView), controlName: this.controlName});\n }\n}\n","<div>\n <div class=\"position-relative\">\n <!-- SK03OCT24 if not multiple select dropdown -->\n <!-- SC04DEC2025 for dropdown title -->\n <small *ngIf=\"title\">{{title}}</small> \n <div style=\"width: {{selectBoxWidth ? '' : dropDownWidth}};\" *ngIf=\"!multipleSelect\">\n <button type=\"button\" class=\"button-fc {{isError ? 'button-error' : ''}}\" (blur)=\"outsideClick()\"\n (click)=\"dropDown = !dropDown\" [disabled]=\"isDisabled\"\n style=\"width:{{selectBoxWidth ? selectBoxWidth : dropDownWidth}}; border-radius:{{dropBorderRadius}} ; border:{{selectBoxBorder}}; height: {{selectBoxHeight}}\">\n <div class=\"select-content\">\n <!-- SC13AUG2025 to set the translation -->\n <div class=\"btn-font-size selected-value\" [attr.data-selected]=\"selectedData\">\n \n <ng-container *ngIf=\"ddType === 'object' && selectedData !== 'Select'; else stringType\">\n <ng-container *ngIf=\"currentSelectedValue?.labelPath; else noLabelPath\">\n {{ currentSelectedValue.labelPath | customTranslate : selectedData }}\n </ng-container>\n <ng-template #noLabelPath>\n {{selectedData}}\n </ng-template>\n </ng-container>\n\n <ng-template #stringType>\n {{ selectedData === 'Select' ? ('APP.SELECT' | customTranslate : 'Select') : selectedData }}\n </ng-template>\n </div>\n <div class=\"arrow {{dropDown === true }}\"></div>\n </div>\n <div class=\"border\" *ngIf=\"dropDown\" style=\"width: {{dropDownWidth}};\">\n <div *ngFor=\"let list of lists\" (click)=\"listValue($event,list, 'singleSelect');dropDown = false\"\n [style]=\"((list === selectedData) || (list?.[bindKey] === selectedData)) ? 'background: rgba(0, 123, 255, 0.1)' : 'background : white' \">\n <div class=\"drop-list\">\n <!-- SK24DEC24 to dispay array of objects list too -->\n <div *ngIf=\"ddType === 'string'\" class=\"list-select\">{{list}}</div>\n <div *ngIf=\"ddType === 'object'\" class=\"list-select\">\n <!-- SC13AUG2025 for apply translation -->\n @if (list.labelPath) {\n {{ list.labelPath | customTranslate : list[bindKey] }}\n }@else{\n {{list[bindKey]}}\n }\n </div>\n </div>\n </div>\n </div>\n </button>\n </div>\n\n <!-- SK03OCT24 if multiple select dropdown. This selects the multiple data from dropdown -->\n <div style=\"width: {{dropDownWidth}};\" *ngIf=\"multipleSelect\">\n <button type=\"button\" class=\"button-fc {{isError ? 'button-error' : ''}}\" (blur)=\"outsideClick()\"\n [disabled]=\"isDisabled\" style=\"height:{{dropDownHeight}}; border-radius:{{dropBorderRadius}} \">\n <div class=\"select-content flex justify-content-end h-100 align-items-center\"\n (click)=\"dropDown = !dropDown\">\n <div *ngFor=\"let sel of multipleSelectedView; let i=index\" class=\"btn-font-size selected-value me-2\"\n [attr.data-selected]=\"selectedData\">\n <div class=\"flex justify-center\" style=\"gap: 3px; align-items: center;\">\n {{sel}}\n <div *ngIf=\"i >= 0\" (click)=\"removeSelectedFilter(sel,i)\" class=\"close-hover\">×</div>\n </div>\n </div>\n <div class=\"arrow {{dropDown === true }}\"></div>\n </div>\n <div class=\"border\" *ngIf=\"dropDown\" style=\"width: {{dropDownWidth}};\">\n <div class=\"search m-3\">\n <div class=\"search-bar flex\">\n <input class=\"width-100\" type=\"text\" placeholder=\"'APP.SEARCH' | customTranslate : 'Search'\"\n [(ngModel)]=\"searchText\" style=\"border:none;\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n </div>\n </div>\n <div *ngFor=\"let list of lists | searchFilter : searchText\"\n (click)=\"listValue($event,list, 'multipleSelect');dropDown = false\"\n [style]=\"list === selectedData ? 'background: rgba(0, 123, 255, 0.1)' : 'background : white' \">\n <div class=\"drop-list\">\n <div class=\"list-select\">{{list}}</div>\n </div>\n </div>\n </div>\n </button>\n </div>\n <div *ngIf=\"isError\" class=\"flex flex-row\">\n <img src=\"../assets/images/icons/general/warning icon.svg\">\n <p class=\"margin-top-auto\">\n <span class=\"error-msg\">{{errorMessage}}</span>\n </p>\n </div>\n </div>\n</div>","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, QueryList, SimpleChanges, ViewChild, ViewChildren } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { FormsModule } from '@angular/forms';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n@Component({\n selector: 'app-multiple-filter',\n standalone: true,\n imports: [CommonModule,MatCheckboxModule, FusionButtonComponent, FormsModule, DropDownComponent,TranslateModule,CustomTranslatePipe],\n templateUrl: './multiple-filter.component.html',\n styleUrls: ['./multiple-filter.component.css']\n})\nexport class MultipleFilterComponent implements OnInit {\n\n @Input() label!:string; // SK03OCT24 label for card\n @Input() checkboxList:Array<any> = []; // SK03OCT24 the list that to to dispolayed in card\n @Input() activeCheckboxList:Array<any> = []; // the active list that to be check \n @Input() cardSize = \"col-md-6\"; // SK03OCT24 card size\n @Input() componentData:any; // SK03OCT24 component data\n @Input() cardInlineSize = \"col-md-2\"; // SK03OCT24 inline chek box size\n @Input() buttonList:Array<any> = []; // SK03OCT24 button list in component\n @Input() cardClass : string = \"\";\n @Input() displayValues:any = {\n keyString:\"\",\n valueString:\"\"\n };\n @Input() checkBoxStyles : string = \"\";\n @Input() selectionData:Array<any> = [];\n @Input() isDateFilter : boolean = false;\n @Input() isButtonLoadingSpinner: boolean = false; // MY 15OCT26 button loader input\n @Output() compDataEmit: EventEmitter<any> = new EventEmitter<any>(); // SK15FEB24 emit action while clicking save\n @Output() checkEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() selectedValuesEmit: EventEmitter<any> = new EventEmitter<any>();\n searchText:any;\n startDate: any;\n endDate: any;\n\n constructor(public cdr: ChangeDetectorRef) { } // MY 15OCT26 inject ChangeDetectorRef\n\n ngOnInit(): void {\n // SK03OCT24 sample date for filter \n // this.selectionData = [\n // {\"label\":\"Department\", \"$opMap\":\"workinfo.department\", \"allValues\":[\"IT\", \"Finance\", \"Admin\"], \"selectedValues\":[\"IT\", \"Finance\"]},\n // {\"label\":\"Designation\", \"$opMap\":\"workinfo.designation\", \"allValues\":[\"Developer\", \"Accountant\", \"HR\"], \"selectedValues\":[\"Developer\", \"Accountant\"]},\n // {\"label\":\"Gender\", \"$opMap\":\"personalinfo.gender\", \"allValues\":[\"Male\", \"Female\", \"Others\"], \"selectedValues\":[ \"Female\", \"Others\"]},\n // {\"label\":\"Location\", \"$opMap\":\"workinfo.officeLocation\", \"allValues\":[\"Chennai\", \"Tirunelveli\", \"Coimbatore\"], \"selectedValues\":[\"Chennai\", \"Tirunelveli\", \"Coimbatore\"]},\n // ]\n }\n\n ngOnChanges(changes:SimpleChanges){\n // MY 15OCT26 trigger change detection on input changes\n this.cdr.markForCheck();\n }\n\n // SK03OCT24 basid on action the event emits\n buttonClick(event:any){\n // MY 15OCT26 prevent click while button is in loading state\n if (event?.buttonLoadingSpinner || event?.isButtonLoadingSpinner || this.isButtonLoadingSpinner || this.componentData?.isButtonLoadingSpinner) {\n return;\n }\n this.compDataEmit.emit({compData:this.componentData, button:event});\n }\n\n multipleSelectDataEmit(event:any, list:any){\n if(event.controlName === \"crossFilter\"){ //SKS10JAN25 for cross filter val emit\n list.filterFields = event.data;\n } else{\n list.selectedValues = event.data;\n this.selectedValuesEmit.emit({list:list})\n }\n }\n\n dateErr: boolean = false\n leaveCalc(){\n let stDt:any = new Date(this.startDate);\n let edDt:any = new Date(this.endDate);\n this.dateErr = ((edDt - stDt) < 0) ? true : false;\n this.filterDateEmit.emit({startDate:this.startDate, endDate:this.endDate })\n }\n\n @Output() filterDateEmit : EventEmitter<any> = new EventEmitter<any>();\n // SK03OCT24 dates emit\n buttonClickDate(){\n this.filterDateEmit.emit({startDate:this.startDate, endDate:this.endDate })\n }\n}\n","<!-- SK03OCT24 Multi Filter component -->\n<div class=\"card flex {{cardClass}} {{cardSize}}\">\n <div>\n <div class=\"fw-bold\" style=\"padding: 5px 10px 5px;\">{{label}}</div>\n </div>\n <!-- <div class=\"search m-3\">\n <div class=\"search-bar flex\">\n <input class=\"medium-font width-100\" type=\"text\" placeholder=\"Search\" [(ngModel)]=\"searchText\"\n style=\"border:none;\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n </div>\n </div> -->\n <div style=\"{{checkBoxStyles}}\">\n <div class=\"flex flex-wrap px-2\" *ngIf=\"!isDateFilter\">\n <div class=\"{{cardInlineSize}}\" *ngFor=\"let list of selectionData; let i = index\">\n <div class=\"\">\n <label class=\"text-wrap align-self-center\" style=\"font-size: small;\" >{{list.labelPath || list.label | customTranslate : list.label}}</label>\n <div *ngIf=\"componentData.type !== 'crossFilter'\">\n <app-drop-down [lists]=\"list.allValues\" [multipleSelectedView]=\"list.selectedValues\" selectedData=\"Select\" [multipleSelect]=\"true\" (multipleSelectDataEmit)=\"multipleSelectDataEmit($event, list)\"></app-drop-down>\n </div>\n <!-- SKS10JAN25 for cross filter check box -->\n <div *ngIf=\"componentData.type === 'crossFilter'\">\n <app-drop-down [lists]=\"list.allValues\" [multipleSelectedView]=\"list.filterFields\" selectedData=\"Select\" [controlName]=\"componentData.type\" [multipleSelect]=\"true\" (multipleSelectDataEmit)=\"multipleSelectDataEmit($event, list)\"></app-drop-down>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap\" *ngIf=\"isDateFilter\">\n <div class=\"d-flex justify-content-between px-2\" [class]=\"cardInlineSize\">\n <!-- SK03OCT24 startDate and endDate inputs -->\n <div class=\"field-input\">\n <label class=\"modal-field-label\" for=\"end-date\">{{'APP.START_DATE' | customTranslate : 'Start Date' }}*</label>\n <input type=\"date\" max=\"9999-12-31\" [(ngModel)]=\"startDate\" id=\"start-date\" [max]=\"endDate\" name=\"startDate\"\n format=\"mm-dd-yyyy\" class=\"input-border\" (change)=\"leaveCalc()\"/>\n </div>\n\n <div class=\"field-input\"\n [class]=\"dateErr ? 'has-error' : '' \">\n <label class=\"modal-field-label\" for=\"end-date\">{{'APP.END_DATE' | customTranslate : 'End Date' }}*</label>\n <input type=\"date\" max=\"9999-12-31\" [(ngModel)]=\"endDate\" id=\"end-date\" [min]=\"startDate\" name=\"endDate\"\n format=\"mm-dd-yyyy\" class=\"input-border\" (change)=\"leaveCalc()\" />\n <p *ngIf=\"dateErr\" class=\"error-msg\">\n <span> {{ 'APP.SELECT_VALID_DATE' | customTranslate : 'Select valid date' }}\n </span>\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"m-2 d-flex justify-content-end\" *ngIf=\"!isDateFilter\">\n <!-- MY 15OCT26 support button loader on button item, componentData, or multiple-filter input -->\n <app-fusion-button *ngFor=\"let button of buttonList\" [buttonLoadingSpinner]=\"button.buttonLoadingSpinner || button.isButtonLoadingSpinner || isButtonLoadingSpinner || componentData?.isButtonLoadingSpinner\" [buttonType]=\"button.class\" [buttonValue]=\"button.labelPath || button.label | customTranslate : button.label\"\n (buttonClickEmit)=\"buttonClick(button)\">\n </app-fusion-button>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n\n@Component({\n selector: 'app-pagination',\n standalone: true,\n imports: [CommonModule, FormsModule, CustomTranslatePipe],\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.css'\n})\nexport class PaginationComponent implements OnInit {\n @Output() event = new EventEmitter<any>;\n // page size Options\n @Input() pageSizeOptions: number[] = [5, 10, 15, 20, 50];\n /** The total number of records */\n @Input() collectionSize = 0;\n \n /** The number of records to display */\n @Input() pageSize = 10;\n \n /** Current page */\n @Input() currentPage = 1;\n \n /** The number of buttons to show either side of the current page */\n @Input() maxSize = 2;\n \n /** Display the First/Last buttons */\n @Input() firstLastButtons = false;\n \n /** Display the Next/Previous buttons */\n @Input() nextPreviousButtons = true;\n \n /** Display small pagination buttons */\n @Input() small = false;\n \n totalPages: any[] = [];\n \n constructor() {}\n \n ngOnInit(): void {\n this.pageSize = this.pageSize ?? 10; // Ensure a default value\n this.currentPage = this.currentPage === 0 ? 1 : this.currentPage\n if (this.collectionSize) {\n this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));\n }\n }\n \n ngOnChanges(changes: SimpleChanges) {\n this.pageSize = this.pageSize ?? 10; // Ensure a default value\n this.currentPage = this.currentPage === 0 ? 1 : this.currentPage ?? 1\n if (this.collectionSize) {\n this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));\n }\n }\n get startIndex(): number {\n return (this.currentPage - 1) * Number(this.pageSize);\n }\n\n get endIndex(): number {\n return Math.min( Number(this.startIndex) + Number(this.pageSize), this.collectionSize);\n }\n /** Set page number */\n selectPageNumber(pageNumber: number) {\n this.currentPage = pageNumber;\n this.emit()\n }\n \n /** Set next page number */\n next() {\n const nextPage = this.currentPage + 1;\n nextPage <= this.totalPages.length && this.selectPageNumber(nextPage);\n }\n \n /** Set previous page number */\n previous() {\n const previousPage = this.currentPage - 1;\n previousPage >= 1 && this.selectPageNumber(previousPage);\n }\n onPageSizeChange(newSize:any): void {\n this.pageSize = newSize; // Update the pageSize\n this.totalPages = new Array(Math.ceil(this.collectionSize / this.pageSize));\n // Ensure the current page is within bounds\n // if (this.currentPage > this.totalPages.length) {\n // this.currentPage = this.totalPages.length;\n // }\n this.currentPage = 1\n this.emit(); // Emit an event if necessary\n } \n emit(){\n this.event.emit({\"length\":this.collectionSize, \"pageSize\": this.pageSize, \"pageIndex\" : this.currentPage})\n }\n }","<!-- SKS24JAN25 -->\n<div class=\"flex content-space-between main-cont\">\n <div class=\"info\">\n <div *ngIf=\"endIndex\">\n {{'APP.SHOWING_DATA' | customTranslate : 'Showing data'}} {{ startIndex + 1 }} {{'APP.TO' | customTranslate : 'to'}} {{ endIndex }} {{'APP.OF' | customTranslate : 'of'}} {{ collectionSize }} {{'APP.ENTRIES' | customTranslate : 'entries'}}\n </div>\n </div>\n <nav style=\"padding-top: 16px;\">\n <ul [class]=\"small ? 'pagination pagination-sm' : 'pagination'\" style=\"align-items: center;\">\n <!-- select button -->\n <label style=\"font-size: 14px; font-weight: var(--fw-400); padding-right: 10px; color: var(--fb-text-secondary, #64748b);\" for=\"perPage\">{{'APP.RESULTS_PER_PAGE' | customTranslate : 'Results per page'}}</label>\n <div class=\"dropdown-wrapper\">\n <select id=\"perPage\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n <svg class=\"dropdown-arrow\" width=\"9\" height=\"6\" viewBox=\"0 0 9 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0.684136 0.767477C0.922999 0.5378 1.30282 0.545248 1.5325 0.784111L4.5 3.93431L7.4675 0.784111C7.69718 0.545248 8.077 0.5378 8.31587 0.767477C8.55473 0.997153 8.56218 1.37698 8.3325 1.61584L4.9325 5.21584C4.81938 5.33349 4.66321 5.39998 4.5 5.39998C4.33679 5.39998 4.18062 5.33349 4.0675 5.21584L0.667501 1.61584C0.437825 1.37698 0.445272 0.997153 0.684136 0.767477Z\" fill=\"currentColor\"/>\n </svg> \n </div> \n <!-- first button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\" >\n <button class=\"page-link\" (click)=\"selectPageNumber(1)\">««</button>\n </li>\n <!-- last button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\">\n <button class=\"page-link\" (click)=\"selectPageNumber(totalPages.length)\">»»</button>\n </li>\n <!-- previous button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\" >\n <button class=\"page-link\" (click)=\"previous()\">«</button>\n </li>\n <!-- page numbers -->\n <ng-container *ngFor=\"let p of totalPages; index as i\">\n <li *ngIf=\"i + 1 >= currentPage - maxSize && i + 1 <= currentPage + maxSize\" [class]=\"currentPage === i + 1 ? 'page-item active' : 'page-item'\">\n <button class=\"page-link\" (click)=\"selectPageNumber(i + 1)\">\n {{ i + 1 }}\n </button>\n </li>\n </ng-container>\n <!-- next button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\">\n <button class=\"page-link\" (click)=\"next()\">»</button>\n </li>\n </ul>\n </nav>\n</div>\n ","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { Popover } from 'bootstrap';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Overlay, OverlayModule, ScrollStrategy } from '@angular/cdk/overlay';\n\n// MR 19SEP26 Fix popover dismissal under OnPush with 1s stay delay\n@Component({\n selector: 'app-popover',\n standalone: true,\n imports: [CommonModule, TranslateModule, OverlayModule],\n templateUrl: './popover.component.html',\n styleUrls: ['./popover.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PopoverComponent implements OnInit, OnDestroy {\n private static activePopover: PopoverComponent | null = null;\n\n isPopoverOpen = false;\n private popoverTimeout: any;\n\n @Input() isBootstrap: boolean = false;\n @Input() dynamicPopover: string = '';\n @Input() closeDelay: number = 1000; // 1 second stay duration\n\n constructor(\n private overlay: Overlay,\n private cdr: ChangeDetectorRef\n ) { }\n\n ngOnInit(): void {\n }\n\n ngOnDestroy(): void {\n this.clearCloseTimeout();\n if (PopoverComponent.activePopover === this) {\n PopoverComponent.activePopover = null;\n }\n }\n\n createScrollStrategy(): ScrollStrategy {\n return this.overlay.scrollStrategies.reposition();\n }\n\n ngAfterViewInit(): void {\n if (this.isBootstrap) {\n Array.from(document.querySelectorAll('[data-bs-toggle=\"popover\"]'))\n .forEach(popoverNode => new Popover(popoverNode));\n }\n }\n\n openPopover(): void {\n this.clearCloseTimeout();\n if (PopoverComponent.activePopover && PopoverComponent.activePopover !== this) {\n PopoverComponent.activePopover.closeImmediately();\n }\n PopoverComponent.activePopover = this;\n this.isPopoverOpen = true;\n this.cdr.markForCheck();\n }\n\n keepPopoverOpen(): void {\n this.clearCloseTimeout();\n if (!this.isPopoverOpen) {\n this.openPopover();\n }\n }\n\n closePopoverWithDelay(): void {\n this.clearCloseTimeout();\n this.popoverTimeout = setTimeout(() => {\n this.closeImmediately();\n }, this.closeDelay);\n }\n\n closeImmediately(): void {\n this.clearCloseTimeout();\n if (PopoverComponent.activePopover === this) {\n PopoverComponent.activePopover = null;\n }\n this.isPopoverOpen = false;\n this.cdr.markForCheck();\n }\n\n private clearCloseTimeout(): void {\n if (this.popoverTimeout) {\n clearTimeout(this.popoverTimeout);\n this.popoverTimeout = null;\n }\n }\n}\n","<!--SKS4FEB25 Hover Trigger Element -->\n<div cdk-overlay-origin #trigger=\"cdkOverlayOrigin\" class=\"hover-base\" \n (mouseenter)=\"openPopover()\" \n (mouseleave)=\"closePopoverWithDelay()\">\n <ng-content select=\".hover-base\"></ng-content>\n</div>\n<!--SKS4FEB25 Popover Content Template -->\n<ng-template #popoverContent>\n <ng-content select=\".hover-content\"></ng-content>\n</ng-template>\n\n\n<!-- Bootstrap Popover -->\n<div *ngIf=\"isBootstrap\" class=\"bc-popover\">\n <div class=\"btn btn-secondary me-2\" data-bs-container=\"body\" data-bs-trigger=\"hover\" data-bs-toggle=\"popover\" data-bs-placement=\"top\" [attr.data-bs-content]=\"dynamicPopover\">\n <ng-container *ngTemplateOutlet=\"popoverContent\"></ng-container>\n </div>\n</div>\n\n<!-- Fusion Custom Popover -->\n<!-- MR 19SEP26 Popover Overlay with outside-click and hover handlers -->\n<ng-template cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isPopoverOpen\"\n [cdkConnectedOverlayScrollStrategy]=\"createScrollStrategy()\"\n (overlayOutsideClick)=\"closeImmediately()\">\n <div *ngIf=\"!isBootstrap\" class=\"fusion-popover popover-base\"\n (mouseenter)=\"keepPopoverOpen()\" \n (mouseleave)=\"closePopoverWithDelay()\">\n <ng-container *ngTemplateOutlet=\"popoverContent\"></ng-container>\n </div>\n</ng-template>","import { Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { Modal } from 'bootstrap';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\n\n@Component({\n selector: 'app-modal',\n standalone: true,\n imports: [CommonModule, FusionButtonComponent, CustomTranslatePipe],\n templateUrl: './modal.component.html',\n styleUrls: ['./modal.component.css']\n})\nexport class ModalComponent implements OnInit {\n @Input() modalTitle: any;\n @Input() isModalOpen = false;\n @Input() modalSize = '';\n @Input() saveButtonValue = 'Save';\n @Input() modalFooter = true;\n @Input() cancelNXTEmit : any;\n @Output() saveButtonEmit = new EventEmitter<any>;\n @Output() cancelButtonEmit = new EventEmitter<any>;\n modalDirect!: Modal;\n @ViewChild('demoModal') demoModal!: ElementRef<any>; //to open the bootstrap modal based on click function in ts file\n\n\n constructor() { }\n // SKS17JUL26 Listen for the Escape key press to close the modal if it's open\n @HostListener('document:keydown.escape', ['$event'])\n onKeydownHandler(event: any) {\n if (this.isModalOpen) {\n this.closeModal();\n }\n }\n\n ngOnChanges(changes: SimpleChanges){\n if(changes['isModalOpen']){\n if(this.isModalOpen === true){\n this.modalOpen();\n } \n }\n\n if(changes['cancelNXTEmit']){\n if(this.cancelNXTEmit === true){\n this.closeModal();\n }\n }\n }\n\n ngOnInit(): void {\n }\n\n closeModal() {\n this.cancelButtonEmit.emit(false);\n }\n\n saveModal() {\n this.saveButtonEmit.emit();\n }\n\n modalOpen(){\n if(this.demoModal){\n this.modalDirect = new Modal(this.demoModal.nativeElement, { backdrop: 'static' });\n this.modalDirect.show();\n }\n }\n\n}\n","<div class=\"modal fade container-md\" [class]=\"isModalOpen ? 'show d-block modal-bg' : 'd-none' \" tabindex=\"1\" >\n <div class=\"modal-dialog\" [ngClass]=\"modalSize ? modalSize : 'modal-lg'\"> <!-- SC26DEC2025 modal size based on modalSize parms issue fixed -->\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title mb-0\" id=\"openModal\">{{modalTitle}}</b>\n <button type=\"button\" class=\"btn-close\" tabindex=\"-1\" data-bs-dismiss=\"modal\" (click)=\"closeModal()\"\n aria-label=\"Close\"></button>\n </div>\n <div>\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <div class=\"modal-footer\" *ngIf=\"modalFooter\">\n <app-fusion-button buttonType=\"btn ms-2\" (buttonClickEmit)=\"saveModal()\"\n data-bs-dismiss=\"modal\" [buttonValue]=\"'APP.SAVE' | customTranslate : 'Save'\">\n </app-fusion-button>\n <app-fusion-button buttonType=\"btn text-only ms-2\" (buttonClickEmit)=\"closeModal()\"\n data-bs-dismiss=\"modal\" buttonValue=\"{{'APP.CANCEL' | customTranslate : 'Cancel'}}\">\n </app-fusion-button>\n </div>\n </div>\n </div>\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { NxtButtonComponent, NxtFileUpload } from '@rangertechnologies/ngnxt';\n@Component({\n selector: 'app-file-upload',\n standalone: true,\n imports: [CommonModule,CustomTranslatePipe, NxtFileUpload, NxtButtonComponent],\n templateUrl: './file-upload.component.html',\n styleUrls: ['./file-upload.component.css']\n})\nexport class FileUploadComponent implements OnInit {\n \n @Output() fileSelected = new EventEmitter<any>();\n @Output() fileDeleted = new EventEmitter<any>();\n @Output() closeEmit = new EventEmitter<any>();\n @Output() templateDownload = new EventEmitter<any>();\n @Output() upload = new EventEmitter<any>();\n @Output() radioSelectEmit = new EventEmitter<any>();\n\n @Input() id = 'fileUpload';\n @Input() headerName: any\n @Input() bodyHeaderName: any\n @Input() isTemplate: boolean = false\n @Input() bodyContent: any = []\n @Input() saveButtonName: any\n @Input() isLoading: boolean = false\n @Input() showFileModal: boolean = false\n @Input() fileRestrictions: any = {}; // contains file size and file type in it\n @Input() uploadedFiles: Array<any> = []; // This array holds the dropped or selected files. Which later needs to be emitted to the parrent.\n @Input() importButtonConfig: Array<any> = [];\n @Input() defaultBodyRadioName: any;\n @Input() bodyRadioConfig: any\n @Input() templateContent: any = null\n public allowedFileTypes: string[] = [];\n\n constructor() { }\n\n ngOnInit(): void {\n this.allowedFileTypes = (this.fileRestrictions?.allowedTypes || []).map((ext: any) => ext.toLowerCase().startsWith('.') ? ext.toLowerCase() : '.' + ext.toLowerCase());\n }\n deleteFile(removedFile: any) {\n this.uploadedFiles = this.uploadedFiles.filter(\n file =>\n file.name !== removedFile?.name ||\n file.size !== removedFile?.size\n );\n this.fileDeleted.emit(this.uploadedFiles);\n }\n onFileSelected(event: any){\n this.uploadedFiles = event?.value?.valueObj || this.uploadedFiles\n this.fileSelected.emit(this.uploadedFiles);\n }\n uploadFile(){\n this.upload.emit(this.uploadedFiles || [])\n }\n close(){\n this.closeEmit.emit()\n }\n downloadTemplate(){\n this.templateDownload.emit()\n }\n radioSelect(event: any){\n this.radioSelectEmit.emit(event)\n }\n }\n\n","<div class=\"file-modal-backdrop\" *ngIf=\"showFileModal\">\n <div class=\"file-modal\">\n <!-- Body -->\n <div class=\"file-modal-body\">\n <!-- SKS3APR26 Header -->\n <div class=\"file-modal-header\">\n <h2>{{ headerName }}</h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <!-- MR 19OCT26 {refactor inline html template styling to theme tokens} -->\n <i class=\"fusion-icon fusion-icon-size-xl fusion-icon-close-square header-sub-icon\" style=\"color: var(--fc-text-color-dark, #000000);\"></i>\n </button>\n </div>\n <p *ngIf=\"bodyHeaderName\" class=\"steps-title\">{{ bodyHeaderName }}</p>\n <ol *ngIf=\"isTemplate || bodyContent.length > 1\" class=\"steps-list\" style=\"font-size: 13px;\">\n @if(isTemplate){\n <li class=\"fc-lite\" style=\"font-size: 13px;\">\n @if(templateContent){\n {{ templateContent }}\n }\n <span class=\"step-link\" style=\"font-size: 13px;\" (click)=\"downloadTemplate()\">\n {{ 'APP_HRM_EMPLOYEES_EMPLOYEES.HERE' | customTranslate : 'here'}}\n </span>.\n </li>\n }\n @if(bodyContent.length > 1 || isTemplate){\n <ng-container *ngFor=\"let cont of bodyContent\">\n <li style=\"font-size: 13px;\" class=\"fc-lite\">{{ cont }}</li>\n </ng-container>\n } \n </ol>\n @if(bodyContent.length === 1 && !isTemplate) {\n <div style=\"margin-bottom: 10px; font-size: 13px;\" class=\"fc-lite\"> {{ bodyContent?.[0] }} </div>\n }\n <nxt-file-upload [allFiles]=\"uploadedFiles\" mode=\"edit\" [fileConfig]=\"fileRestrictions\" [dragAndDrop]=\"true\"\n (selectedFileData)=\"onFileSelected($event)\" [hideSubtext]=\"true\"\n (deletedFileData)=\"deleteFile($event)\">\n </nxt-file-upload>\n <div style=\"margin-bottom: 5px; font-size: 13px;\" class=\"fc-lite\"> \n @if(allowedFileTypes.length > 0) {\n Only support {{ allowedFileTypes.join(', ') }}\n }\n </div>\n </div>\n <!-- MR 18OCT26 Refactor action button styles to theme tokens -->\n <div class=\"file-modal-footer\">\n <nxt-button class=\"data-table-fsbtn\"\n (buttonClickEmit)=\"uploadFile()\" [btnTextColor]=\"'var(--fc-text-color, #ffffff)'\"\n [buttonDisable]=\"isLoading\"\n [btnBorder]=\"'1'\" [btnBorderColor]=\"'var(--border-color)'\"\n [btnBorderRadius]=\"'8'\" \n [buttonType]=\"'custom-btn'\" [isLoading]=\"isLoading\"\n [buttonValue]=\"'APP_HRM_EMPLOYEES_EMPLOYEES.SAVE' | customTranslate :'Save'\">\n </nxt-button>\n <nxt-button (buttonClickEmit)=\"close()\" [buttonValue]=\"'APP_HRM_EMPLOYEES_EMPLOYEES.CANCEL' | customTranslate :'Cancel'\"\n [btnBgColor]=\"'var(--comp-bg-color)'\" [btnTextColor]=\"'var(--fc-primary-color)'\" [btnBorder]=\"'1'\"\n [btnBorderColor]=\"'var(--border-color)'\" [btnBorderRadius]=\"'8'\"\n [buttonType]=\"'custom-btn'\">\n </nxt-button>\n </div>\n </div>\n</div>","export class Constants {\n // static SERVER_BASE_URL: string = \"http://arabic-api.rangerfusion.com\";\n // static SERVER_BASE_URL: string = \"https://dev-api.rangerfusion.com\"; // MR 26NOV24 Docker Compose Changes\n static SUCCESS_MESSAGE: string = \"Data saved successfully\";\n static DELETE_SUCCESS_MESSAGE: string = \"Data deleted successfully\";\n static APPROVE_MESSAGE: string = \"Approval request approved successfully\";\n static REJECT_MESSAGE: string = \"Approval request rejected successfully\";\n static DOWNLOAD_TEMPLATE: string = \"template downloaded successfully\";\n static PAGE_SIZE_OPTIONS: Array<any> = ['5', '10', '25', '50', '100', '200'];\n static leaveTypes: any[] = ['Casual leave', 'Sick leave', 'Maternity leave', 'Paternity leave', 'Marriage leave', 'Compensation Off', 'Loss of Pay', 'Compoff Leave'];\n static BASIC: string = 'Basic';\n static DA: string = 'Dearness Allowance'; //SK20JUN25 DA added\n static HRA: string = 'House Rent Allowance';\n static EPF: string = 'Employee Provident Fund';\n static VPF: string = 'Voluntary Provident Fund';\n static ESI: string = 'Employee State Insurance';\n static PT: string = 'Professional Tax';\n static TDS: string = 'TDS'; //SK28FEB26\n static EMPLOYER_PF: string = 'Employer Provident Fund';\n static EMPLOYER_ESI: string = \"Employer State Insurance\";\n static SD: string = \"Standard Deduction\";\n static EARNINGS: string = \"Earnings\";\n static ALLOWANCES: string = \"Allowances\";\n static DEDUCTIONS: string = \"Deductions\";\n static BENEFITS: string = \"Benefits\"; //SK18JUN24 to add benefits as separate component in compensation\n static FLEXI_BENEFITS: string = \"Flexi Benefits\"; //SK12JUN25 to add flexi benefits as separate component in compensation\n static REIMBURSEMENTS: string = \"Reimbursements\";\n static OTHER_INVESTMENTS: string = 'Other Investments and Exemptions'; //SK06MAY25\n static INCOME_FROM_OTHERSOUCES: string = 'Income from Other Sources';\n static LEAVE_TRAVEL_ALLOWANCE: string = 'Leave Travel Allowance'; //SK20JUN25\n static FOOD_COUPONS: string = 'Food Coupons'; //SK20JUN25\n static TELEPHONE_ALLOWANCE = 'Telephone Allowance'; //SK20JUN25\n\n // SK21AUG24 static modules in all apps\n static hrmStaticModules: Array<any> = [\"dashboard\", \"employees\", \"compensation\", \"payroll\", \"leaveAllocation\", \"attendance\", \"approvals\"];\n static essStaticModules: Array<any> = [\"dashboard\", \"details\", \"leaves\", \"expenses\", \"payslips\", \"taxdeclarations\"]\n // SKS29SEP26 Settings (/settings route) — company-level settings\n // MR 29OCT26 Integrate Theme Builder as a native module under Settings page architecture\n static settingsStaticModules: Array<any> = [\"company\", \"localization\", \"leaveMaster\", \"bankInfo\", \"time\", \"translation\", \"dropdownManagement\", \"theme-builder\", \"theme\", \"themeBuilder\"]\n // SKS29SEP26 Admin (/admin route) — super-user administrative configuration\n static adminStaticModules: Array<any> = [\"apps\", \"component\", \"components\"]\n static staticHRMEmployeesDetailsTabs = [\"basic\", \"work\", \"education\", \"experience\", \"documents\", \"dependents\", \"bank\", \"leaves\", \"expenses\", \"leaveAllocation\", \"compensation\", \"taxDeclaration\"] //SK19MAR25 static HRM employees details tabs\n static staticHRMPayrollTabs = [\"payroll\", \"forms\", \"settings\", \"taxDeclarations\", \"payslips\"] //SK31DEC25\n static staticApps = ['admin', 'hrm', 'settings', 'ess', 'nxt']\n\n static TRANSLATION: any = {\n \"en\": {\n \"SCREEN_DIRECTION\": \"ltr\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"Log in to your Account\",\n \"WELCOME_TEXT\": \"Welcome back!\",\n \"USER_NAME\": \"Username\",\n \"USER_NAME_PLACEHOLDER\": \"Enter Username\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_PLACEHOLDER\": \"Enter Password\",\n \"USER_NAME_ERROR\": \"Username is required\",\n \"PASSWORD_REQ_ERROR\": \"Password is required\",\n \"PASSWORD_ERROR\": \"Password must contain at least 6 characters\",\n \"LOGIN\": \"Login to Account\",\n \"LOGIN_LOAD\": \"Login\",\n \"BACK\": \"Back\",\n \"RESEND_LINK\": \"Resend Link\",\n \"FORGOT_PASSWORD\": \"Forgot Password\",\n \"PASSWORD_RESET\": \"Password Reset\",\n \"RESET_MAIL\": \"Please enter your registered Username to receive password reset instructions\", // SKS4AUG26 Prompt Username for password reset\n \"EMAIL_ADDRESS\": \"Email Address\",\n \"ENTER_EMAIL_ADDRESS\": \"Enter Email Address\",\n \"EMAIL_REQUIRED\": \"Email is required\",\n \"ENTER_VALID_EMAIL\": \"Enter a valid email\",\n \"SENDING\": \"Sending\",\n \"SEND_RESET_LINK\": \"Send link\",\n \"GO_BACK_TO_LOGIN\": \"Go back to Login\",\n \"EMAIL_SENT\": \"Email Sent\",\n \"CHECK_INBOX\": \"Check your inbox and open the link we sent to\",\n \"REMEMBER_PASS\": \"Remember Password\",\n \"DONT_HAVE_ACC\": \"Don't have an account?\",\n \"CREATE_AN_ACCOUNT\": \"Create an account\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"Register your Account\",\n \"WELCOME_TEXT\": \"Fill out the following to SignUp:\",\n \"FIRST_NAME\": \"First Name\",\n \"ENTER_FIRST_NAME\": \"Enter First Name\",\n \"FIRST_NAME_REQUIRED\": \"First Name is required\",\n \"LAST_NAME\": \"Last Name\",\n \"ENTER_LAST_NAME\": \"Enter Last Name\",\n \"LAST_NAME_REQUIRED\": \"Last Name is required\",\n \"EMAIL_ADDRESS\": \"Email Address\",\n \"ENTER_EMAIL_ADDRESS\": \"Enter Email Address\",\n \"EMAIL_ADDRESS_REQUIRED\": \"Email Address is required\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"Enter valid Email Address\",\n \"MOBILE_NUMBER\": \"Mobile Number\",\n \"ENTER_MOBILE_NUMBER\": \"Enter Mobile Number\",\n \"MOBILE_NUMBER_REQUIRED\": \"Mobile Number is required\",\n \"COUNTRY\": \"Country\",\n \"ENTER_COUNTRY\": \"Select Country\",\n \"COUNTRY_REQUIRED\": \"Country is required\",\n \"COMPANY_NAME\": \"Company Name\",\n \"ENTER_COMPANY_NAME\": \"Enter Company Name\",\n \"COMPANY_NAME_REQUIRED\": \"Company Name is required\",\n \"DESIGNATION\": \"Designation\",\n \"ENTER_ROLE\": \"Enter Role\",\n \"DESIGNATION_REQUIRED\": \"Designation is required\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"Enter a valid Mobile Number\",\n \"PASSWORD\": \"Password\",\n \"ENTER_PASSWORD\": \"Enter Password\",\n \"PASSWORD_REQUIRED\": \"Password is required\",\n \"PASSWORD_ERROR\": \"Password must contain at least 6 characters\",\n \"CONFIRM_PASSWORD\": \"Confirm Password\",\n \"ENTER_CONFIRM_PASSWORD\": \"Enter Confirm Password\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"Confirm Password is required\",\n \"PASSWORDS_MATCH\": \"Passwords do not match\",\n \"REGISTER_ACCOUNT\": \"Register a Account\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"Email Address Verification code\",\n \"RESEND_OTP_IN\": \"Resend OTP in\",\n \"RESEND_OTP\": \"Resend OTP\",\n \"CONFIRMATION_ACCOUNT\": \"Confirmation Account\",\n \"DO_HAVE_ACCOUNT\": \"Do you have an account?\",\n \"SIGN_IN\": \"Sign - In\",\n \"OTP_SENT_SUCCESSFULLY \": \"OTP sent successfully\",\n \"USER_ALREADY_EXISTS\": \"user already exists\",\n \"INTERNAL_SERVER_ERROR\": \"Internal Server Error\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"The OTP you entered is incorrect.\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"Registration Complete. Your account has been successfully created.\",\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"Welcome, Please login into your account\",\n \"USER_NAME\": \"Username/Email\",\n \"PASSWORD\": \"Password\",\n \"USER_NAME_ERROR\": \"Please enter a valid email address\",\n \"PASSWORD_ERROR\": \"Password must contain at least 6 characters\",\n \"LOGIN\": \"Login\",\n \"BACK\": \"Back\",\n \"RESEND_LINK\": \"Resend Link\",\n \"FORGOT_PASSWORD\": \"Forgot your Password?\",\n \"PASSWORD_RESET\": \"Password Reset\",\n \"RESET_MAIL\": \"Please enter your registered Username to receive password reset instructions.\",\n \"SEND_RESET_LINK\": \"Send link to email\",\n \"GO_BACK_TO_LOGIN\": \"Go back to Login\",\n \"EMAIL_SENT\": \"Email Sent\",\n \"CHECK_INBOX\": \"Check your inbox and open the link we sent to\",\n \"ENTER_NEW_PASSWORD\": \"Enter a new password\",\n \"NEW_PASSWORD\": \"New password\",\n \"CONFIRM_PASSWORD\": \"Confirm password\",\n \"PASSWORD_MISMATCH\": \"Password mismatch\",\n \"WELL_DONE\": \"Well Done!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"Your password has been changed successfully. Please use your new password to login!\",\n \"REMEMBER_ME\": \"Remember me\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"password changed successfully\",\n \"ENTER_CORRECT_PASSWORD\": \"Enter correct password\",\n \"INTERNAL_SERVER_ERROR\": \"Internal Server Error\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"Invalid link or link expired\",\n \"USER_DOES_NOT_EXIST\": 'User does not Exist',\n \"PASSWORD_RESET_SUCCESSFULLY\": \"password reset sucessfully\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"password reset link sent to your email account\"\n }\n },\n \"ar\": {\n \"SCREEN_DIRECTION\": \"rtl\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"تسجيل الدخول\",\n \"WELCOME_TEXT\": \"مرحبًا بك!\",\n \"USER_NAME\": \"اسم المستخدم\",\n \"USER_NAME_PLACEHOLDER\": \"أدخل الاسم\",\n \"PASSWORD\": \"كلمة المرور\",\n \"PASSWORD_PLACEHOLDER\": \"أدخل كلمة المرور\",\n \"USER_NAME_ERROR\": \"الاسم مطلوب\",\n \"PASSWORD_REQ_ERROR\": \"كلمة المرور مطلوبة\",\n \"PASSWORD_ERROR\": \"يجب أن تكون 6 أحرف على الأقل\",\n \"LOGIN\": \"تسجيل الدخول\",\n \"LOGIN_LOAD\": \"جارٍ الدخول\",\n \"BACK\": \"رجوع\",\n \"RESEND_LINK\": \"إعادة الإرسال\",\n \"FORGOT_PASSWORD\": \"نسيت كلمة المرور\",\n \"PASSWORD_RESET\": \"إعادة تعيين\",\n \"RESET_MAIL\": \"الرجاء إدخال اسم المستخدم المسجل الخاص بك لتلقي تعليمات إعادة تعيين كلمة المرور.\",\n \"EMAIL_ADDRESS\": \"البريد الإلكتروني\",\n \"ENTER_EMAIL_ADDRESS\": \"أدخل البريد\",\n \"EMAIL_REQUIRED\": \"البريد مطلوب\",\n \"ENTER_VALID_EMAIL\": \"أدخل بريدًا صحيحًا\",\n \"SENDING\": \"جارٍ الإرسال\",\n \"SEND_RESET_LINK\": \"إرسال الرابط\",\n \"GO_BACK_TO_LOGIN\": \"عودة للدخول\",\n \"EMAIL_SENT\": \"تم الإرسال\",\n \"CHECK_INBOX\": \"تحقق من بريدك\",\n \"REMEMBER_PASS\": \"تذكر كلمة المرور؟\",\n \"DONT_HAVE_ACC\": \"ليس لديك حساب؟\",\n \"CREATE_AN_ACCOUNT\": \"إنشاء حساب\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"تسجيل الحساب\",\n \"WELCOME_TEXT\": \"أكمل التسجيل:\",\n \"FIRST_NAME\": \"الاسم الأول\",\n \"ENTER_FIRST_NAME\": \"أدخل الاسم الأول\",\n \"FIRST_NAME_REQUIRED\": \"الاسم الأول مطلوب\",\n \"LAST_NAME\": \"الاسم الأخير\",\n \"ENTER_LAST_NAME\": \"أدخل الاسم الأخير\",\n \"LAST_NAME_REQUIRED\": \"الاسم الأخير مطلوب\",\n \"EMAIL_ADDRESS\": \"البريد الإلكتروني\",\n \"ENTER_EMAIL_ADDRESS\": \"أدخل البريد\",\n \"EMAIL_ADDRESS_REQUIRED\": \"البريد مطلوب\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"بريد غير صالح\",\n \"MOBILE_NUMBER\": \"رقم الجوال\",\n \"ENTER_MOBILE_NUMBER\": \"أدخل الجوال\",\n \"MOBILE_NUMBER_REQUIRED\": \"الجوال مطلوب\",\n \"COUNTRY\": \"الدولة\",\n \"ENTER_COUNTRY\": \"اختر الدولة\",\n \"COUNTRY_REQUIRED\": \"الدولة مطلوبة\",\n \"COMPANY_NAME\": \"اسم الشركة\",\n \"ENTER_COMPANY_NAME\": \"أدخل الشركة\",\n \"COMPANY_NAME_REQUIRED\": \"الشركة مطلوبة\",\n \"DESIGNATION\": \"المسمى الوظيفي\",\n \"ENTER_ROLE\": \"أدخل المسمى\",\n \"DESIGNATION_REQUIRED\": \"المسمى مطلوب\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"جوال غير صالح\",\n \"PASSWORD\": \"كلمة المرور\",\n \"ENTER_PASSWORD\": \"أدخل كلمة المرور\",\n \"PASSWORD_REQUIRED\": \"كلمة المرور مطلوبة\",\n \"PASSWORD_ERROR\": \"6 أحرف على الأقل\",\n \"CONFIRM_PASSWORD\": \"تأكيد كلمة المرور\",\n \"ENTER_CONFIRM_PASSWORD\": \"أدخل التأكيد\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"التأكيد مطلوب\",\n \"PASSWORDS_MATCH\": \"كلمات المرور غير متطابقة\",\n \"REGISTER_ACCOUNT\": \"تسجيل الحساب\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"رمز التحقق\",\n \"RESEND_OTP_IN\": \"إعادة الإرسال بعد\",\n \"RESEND_OTP\": \"إعادة الإرسال\",\n \"CONFIRMATION_ACCOUNT\": \"تأكيد الحساب\",\n \"DO_HAVE_ACCOUNT\": \"لديك حساب؟\",\n \"SIGN_IN\": \"تسجيل الدخول\",\n \"OTP_SENT_SUCCESSFULLY\": \"تم إرسال رمز التحقق بنجاح\",\n \"USER_ALREADY_EXISTS\": \"المستخدم موجود بالفعل\",\n \"INTERNAL_SERVER_ERROR\": \"خطأ في الخادم الداخلي\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"رمز التحقق الذي أدخلته غير صحيح.\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"اكتمل التسجيل. تم إنشاء حسابك بنجاح.\"\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"مرحبًا، سجل الدخول\",\n \"USER_NAME\": \"اسم المستخدم/البريد\",\n \"PASSWORD\": \"كلمة المرور\",\n \"USER_NAME_ERROR\": \"بريد غير صالح\",\n \"PASSWORD_ERROR\": \"6 أحرف على الأقل\",\n \"LOGIN\": \"تسجيل الدخول\",\n \"BACK\": \"رجوع\",\n \"RESEND_LINK\": \"إعادة الإرسال\",\n \"FORGOT_PASSWORD\": \"نسيت كلمة المرور؟\",\n \"PASSWORD_RESET\": \"إعادة تعيين\",\n \"RESET_MAIL\": \"الرجاء إدخال اسم المستخدم المسجل الخاص بك لتلقي تعليمات إعادة تعيين كلمة المرور.\",\n \"SEND_RESET_LINK\": \"إرسال الرابط\",\n \"GO_BACK_TO_LOGIN\": \"عودة للدخول\",\n \"EMAIL_SENT\": \"تم الإرسال\",\n \"CHECK_INBOX\": \"تحقق من بريدك\",\n \"ENTER_NEW_PASSWORD\": \"أدخل كلمة مرور جديدة\",\n \"NEW_PASSWORD\": \"كلمة مرور جديدة\",\n \"CONFIRM_PASSWORD\": \"تأكيد كلمة المرور\",\n \"PASSWORD_MISMATCH\": \"كلمات المرور غير متطابقة\",\n \"WELL_DONE\": \"تم بنجاح!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"تم التغيير بنجاح\",\n \"REMEMBER_ME\": \"تذكرني\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"تم تغيير كلمة المرور بنجاح\",\n \"ENTER_CORRECT_PASSWORD\": \"أدخل كلمة المرور الصحيحة\",\n \"INTERNAL_SERVER_ERROR\": \"خطأ في الخادم الداخلي\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"الرابط غير صالح أو انتهت صلاحيته\",\n \"USER_DOES_NOT_EXIST\": \"المستخدم غير موجود\",\n \"PASSWORD_RESET_SUCCESSFULLY\": \"تم إعادة تعيين كلمة المرور بنجاح\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"تم إرسال رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني\"\n }\n },\n \"ta\": {\n \"SCREEN_DIRECTION\": \"ltr\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"உங்கள் கணக்கில் உள்நுழைக\",\n \"WELCOME_TEXT\": \"திரும்ப வந்ததற்கு நன்றி!\",\n \"USER_NAME\": \"பயனர்பெயர்\",\n \"USER_NAME_PLACEHOLDER\": \"பயனர்பெயர் உள்ளிடுக\",\n \"PASSWORD\": \"கடவுச்சொல்\",\n \"PASSWORD_PLACEHOLDER\": \"கடவுச்சொல் உள்ளிடுக\",\n \"USER_NAME_ERROR\": \"பயனர்பெயர் தேவையானது\",\n \"PASSWORD_REQ_ERROR\": \"கடவுச்சொல் தேவையானது\",\n \"PASSWORD_ERROR\": \"6 எழுத்துகளுக்கு மேல் இருக்க வேண்டும்\",\n \"LOGIN\": \"உள்நுழைக\",\n \"LOGIN_LOAD\": \"உள்நுழைக\",\n \"BACK\": \"பின்செல்\",\n \"RESEND_LINK\": \"இணைப்பை மீண்டும் அனுப்பு\",\n \"FORGOT_PASSWORD\": \"கடவுச்சொல் மறந்துவிட்டீர்களா?\",\n \"PASSWORD_RESET\": \"கடவுச்சொல் மாற்றம்\",\n \"RESET_MAIL\": \"கடவுச்சொல் மீட்டமைப்பு வழிமுறைகளைப் பெற உங்கள் பதிவு செய்யப்பட்ட பயனர் பெயரை உள்ளிடவும்.\",\n \"EMAIL_ADDRESS\": \"மின்னஞ்சல்\",\n \"ENTER_EMAIL_ADDRESS\": \"மின்னஞ்சல் உள்ளிடுக\",\n \"EMAIL_REQUIRED\": \"மின்னஞ்சல் தேவையானது\",\n \"ENTER_VALID_EMAIL\": \"சரியான மின்னஞ்சல் உள்ளிடுக\",\n \"SENDING\": \"அனுப்புகிறது\",\n \"SEND_RESET_LINK\": \"இணைப்பு அனுப்பு\",\n \"GO_BACK_TO_LOGIN\": \"உள்நுழைவுக்கு செல்லவும்\",\n \"EMAIL_SENT\": \"மின்னஞ்சல் அனுப்பப்பட்டது\",\n \"CHECK_INBOX\": \"உங்கள் அஞ்சல்பெட்டியை சரிபார்க்கவும்\",\n \"REMEMBER_PASS\": \"கடவுச்சொல் ஞாபகம் இருக்கிறதா?\",\n \"DONT_HAVE_ACC\": \"கணக்கு இல்லையா?\",\n \"CREATE_AN_ACCOUNT\": \"கணக்கு உருவாக்குக\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"உங்கள் கணக்கை பதிவு செய்யவும்\",\n \"WELCOME_TEXT\": \"படிவத்தை பூர்த்தி செய்யவும்\",\n \"FIRST_NAME\": \"முதல் பெயர்\",\n \"ENTER_FIRST_NAME\": \"முதல் பெயர் உள்ளிடுக\",\n \"FIRST_NAME_REQUIRED\": \"முதல் பெயர் தேவையானது\",\n \"LAST_NAME\": \"கடைசி பெயர்\",\n \"ENTER_LAST_NAME\": \"கடைசி பெயர் உள்ளிடுக\",\n \"LAST_NAME_REQUIRED\": \"கடைசி பெயர் தேவையானது\",\n \"EMAIL_ADDRESS\": \"மின்னஞ்சல்\",\n \"ENTER_EMAIL_ADDRESS\": \"மின்னஞ்சல் உள்ளிடுக\",\n \"EMAIL_ADDRESS_REQUIRED\": \"மின்னஞ்சல் தேவையானது\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"சரியான மின்னஞ்சல் உள்ளிடுக\",\n \"MOBILE_NUMBER\": \"மொபைல் எண்\",\n \"ENTER_MOBILE_NUMBER\": \"மொபைல் எண் உள்ளிடுக\",\n \"MOBILE_NUMBER_REQUIRED\": \"மொபைல் எண் தேவையானது\",\n \"COMPANY_NAME\": \"நிறுவனத்தின் பெயர்\",\n \"ENTER_COMPANY_NAME\": \"நிறுவனத்தின் பெயர் உள்ளிடுக\",\n \"COMPANY_NAME_REQUIRED\": \"நிறுவனத்தின் பெயர் தேவையானது\",\n \"DESIGNATION\": \"பணி\",\n \"ENTER_ROLE\": \"பணியை உள்ளிடுக\",\n \"DESIGNATION_REQUIRED\": \"பணி தேவையானது\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"சரியான மொபைல் எண் உள்ளிடுக\",\n \"PASSWORD\": \"கடவுச்சொல்\",\n \"ENTER_PASSWORD\": \"கடவுச்சொல் உள்ளிடுக\",\n \"PASSWORD_REQUIRED\": \"கடவுச்சொல் தேவையானது\",\n \"PASSWORD_ERROR\": \"6 எழுத்துகளுக்கு மேல் இருக்க வேண்டும்\",\n \"CONFIRM_PASSWORD\": \"கடவுச்சொல் உறுதிப்படுத்துக\",\n \"ENTER_CONFIRM_PASSWORD\": \"கடவுச்சொல் உள்ளிடுக\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"உறுதிப்படுத்தல் தேவையானது\",\n \"PASSWORDS_MATCH\": \"கடவுச்சொல் பொருந்தவில்லை\",\n \"REGISTER_ACCOUNT\": \"கணக்கு பதிவு செய்யவும்\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"மின்னஞ்சல் சரிபார்ப்பு குறியீடு\",\n \"RESEND_OTP_IN\": \"OTP மீண்டும் அனுப்புக\",\n \"RESEND_OTP\": \"OTP மீண்டும் அனுப்பு\",\n \"CONFIRMATION_ACCOUNT\": \"கணக்கு உறுதிப்படுத்தல்\",\n \"DO_HAVE_ACCOUNT\": \"கணக்கு உள்ளதா?\",\n \"SIGN_IN\": \"உள்நுழை\",\n \"OTP_SENT_SUCCESSFULLY\": \"OTP வெற்றிகரமாக அனுப்பப்பட்டது\",\n \"USER_ALREADY_EXISTS\": \"பயனர் ஏற்கனவே உள்ளது\",\n \"INTERNAL_SERVER_ERROR\": \"உள் சேவையகத் தவறு\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"நீங்கள் உள்ளீட்ட OTP தவறானது.\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"பதிவு முடிந்தது. உங்கள் கணக்கு வெற்றிகரமாக உருவாக்கப்பட்டது.\"\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"உங்கள் கணக்கில் உள்நுழைக\",\n \"USER_NAME\": \"பயனர்பெயர்/மின்னஞ்சல்\",\n \"PASSWORD\": \"கடவுச்சொல்\",\n \"USER_NAME_ERROR\": \"சரியான மின்னஞ்சல் உள்ளிடுக\",\n \"PASSWORD_ERROR\": \"6 எழுத்துகளுக்கு மேல் இருக்க வேண்டும்\",\n \"LOGIN\": \"உள்நுழைக\",\n \"BACK\": \"பின்செல்\",\n \"RESEND_LINK\": \"இணைப்பை மீண்டும் அனுப்பு\",\n \"FORGOT_PASSWORD\": \"கடவுச்சொல் மறந்துவிட்டீர்களா?\",\n \"PASSWORD_RESET\": \"கடவுச்சொல் மாற்றம்\",\n \"RESET_MAIL\": \"கடவுச்சொல் மீட்டமைப்பு வழிமுறைகளைப் பெற உங்கள் பதிவு செய்யப்பட்ட பயனர் பெயரை உள்ளிடவும்.\",\n \"SEND_RESET_LINK\": \"இணைப்பு அனுப்பு\",\n \"GO_BACK_TO_LOGIN\": \"உள்நுழைவுக்கு செல்லவும்\",\n \"EMAIL_SENT\": \"மின்னஞ்சல் அனுப்பப்பட்டது\",\n \"CHECK_INBOX\": \"அஞ்சல்பெட்டியை சரிபார்க்கவும்\",\n \"ENTER_NEW_PASSWORD\": \"புதிய கடவுச்சொல் உள்ளிடுக\",\n \"NEW_PASSWORD\": \"புதிய கடவுச்சொல்\",\n \"CONFIRM_PASSWORD\": \"உறுதிப்படுத்தல்\",\n \"PASSWORD_MISMATCH\": \"பொருந்தவில்லை\",\n \"WELL_DONE\": \"அருமை!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"கடவுச்சொல் மாற்றம் வெற்றி\",\n \"REMEMBER_ME\": \"என்னை நினைவில் கொள்\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"கடவுச்சொல் வெற்றிகரமாக மாற்றப்பட்டது\",\n \"ENTER_CORRECT_PASSWORD\": \"சரியான கடவுச்சொல்லை உள்ளிடுங்கள்\",\n \"INTERNAL_SERVER_ERROR\": \"உள் சேவையகத் தவறு\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"தவறான இணைப்பு அல்லது இணைப்பு காலாவதியானது\",\n \"USER_DOES_NOT_EXIST\": \"பயனர் இல்லை\",\n \"PASSWORD_RESET_SUCCESSFULLY\": \"கடவுச்சொல் வெற்றிகரமாக மீட்டமைக்கப்பட்டது\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"உங்கள் மின்னஞ்சலுக்கு கடவுச்சொல் மீட்டமைப்பு இணைப்பு அனுப்பப்பட்டுள்ளது\"\n }\n },\n \"hi\": {\n \"SCREEN_DIRECTION\": \"ltr\",\n \"LOGIN_PAGE\": {\n \"TITLE\": \"खाते में लॉगिन करें\",\n \"WELCOME_TEXT\": \"वापसी पर स्वागत है!\",\n \"USER_NAME\": \"उपयोगकर्ता नाम\",\n \"USER_NAME_PLACEHOLDER\": \"उपयोगकर्ता नाम दर्ज करें\",\n \"PASSWORD\": \"पासवर्ड\",\n \"PASSWORD_PLACEHOLDER\": \"पासवर्ड दर्ज करें\",\n \"USER_NAME_ERROR\": \"उपयोगकर्ता नाम आवश्यक है\",\n \"PASSWORD_REQ_ERROR\": \"पासवर्ड आवश्यक है\",\n \"PASSWORD_ERROR\": \"पासवर्ड कम से कम 6 अक्षरों का होना चाहिए\",\n \"LOGIN\": \"लॉगिन करें\",\n \"LOGIN_LOAD\": \"लॉगिन\",\n \"BACK\": \"वापस\",\n \"RESEND_LINK\": \"लिंक फिर से भेजें\",\n \"FORGOT_PASSWORD\": \"पासवर्ड भूल गए\",\n \"PASSWORD_RESET\": \"पासवर्ड रीसेट\",\n \"RESET_MAIL\": \"पासवर्ड रीसेट निर्देश प्राप्त करने के लिए कृपया अपना पंजीकृत उपयोगकर्ता नाम दर्ज करें।\",\n \"EMAIL_ADDRESS\": \"ईमेल पता\",\n \"ENTER_EMAIL_ADDRESS\": \"ईमेल दर्ज करें\",\n \"EMAIL_REQUIRED\": \"ईमेल आवश्यक है\",\n \"ENTER_VALID_EMAIL\": \"मान्य ईमेल दर्ज करें\",\n \"SENDING\": \"भेज रहे हैं\",\n \"SEND_RESET_LINK\": \"लिंक भेजें\",\n \"GO_BACK_TO_LOGIN\": \"लॉगिन पर जाएं\",\n \"EMAIL_SENT\": \"ईमेल भेजा गया\",\n \"CHECK_INBOX\": \"इनबॉक्स चेक करें और लिंक खोलें\",\n \"REMEMBER_PASS\": \"पासवर्ड याद रखें\",\n \"DONT_HAVE_ACC\": \"खाता नहीं है?\",\n \"CREATE_AN_ACCOUNT\": \"खाता बनाएं\"\n },\n \"REG_PAGE\": {\n \"TITLE\": \"खाता रजिस्टर करें\",\n \"WELCOME_TEXT\": \"साइनअप के लिए जानकारी भरें:\",\n \"FIRST_NAME\": \"पहला नाम\",\n \"ENTER_FIRST_NAME\": \"पहला नाम दर्ज करें\",\n \"FIRST_NAME_REQUIRED\": \"पहला नाम आवश्यक है\",\n \"LAST_NAME\": \"अंतिम नाम\",\n \"ENTER_LAST_NAME\": \"अंतिम नाम दर्ज करें\",\n \"LAST_NAME_REQUIRED\": \"अंतिम नाम आवश्यक है\",\n \"EMAIL_ADDRESS\": \"ईमेल पता\",\n \"ENTER_EMAIL_ADDRESS\": \"ईमेल दर्ज करें\",\n \"EMAIL_ADDRESS_REQUIRED\": \"ईमेल आवश्यक है\",\n \"ENTER_VALID_EMAIL_ADDRESS\": \"मान्य ईमेल दर्ज करें\",\n \"MOBILE_NUMBER\": \"मोबाइल नंबर\",\n \"ENTER_MOBILE_NUMBER\": \"मोबाइल नंबर दर्ज करें\",\n \"MOBILE_NUMBER_REQUIRED\": \"मोबाइल नंबर आवश्यक है\",\n \"COMPANY_NAME\": \"कंपनी का नाम\",\n \"ENTER_COMPANY_NAME\": \"कंपनी का नाम दर्ज करें\",\n \"COMPANY_NAME_REQUIRED\": \"कंपनी का नाम आवश्यक है\",\n \"DESIGNATION\": \"पद\",\n \"ENTER_ROLE\": \"पद दर्ज करें\",\n \"DESIGNATION_REQUIRED\": \"पद आवश्यक है\",\n \"ENTER_VALID_MOBILE_NUMBER\": \"मान्य मोबाइल नंबर दर्ज करें\",\n \"PASSWORD\": \"पासवर्ड\",\n \"ENTER_PASSWORD\": \"पासवर्ड दर्ज करें\",\n \"PASSWORD_REQUIRED\": \"पासवर्ड आवश्यक है\",\n \"PASSWORD_ERROR\": \"पासवर्ड कम से कम 6 अक्षरों का होना चाहिए\",\n \"CONFIRM_PASSWORD\": \"पासवर्ड पुष्टि\",\n \"ENTER_CONFIRM_PASSWORD\": \"पासवर्ड पुष्टि दर्ज करें\",\n \"CONFIRM_PASSWORD_REQUIRED\": \"पासवर्ड पुष्टि आवश्यक है\",\n \"PASSWORDS_MATCH\": \"पासवर्ड मेल नहीं खा रहे\",\n \"REGISTER_ACCOUNT\": \"खाता रजिस्टर करें\",\n \"EMAIL_ADDRESS_VERIFICATION\": \"ईमेल सत्यापन कोड\",\n \"RESEND_OTP_IN\": \"ओटीपी फिर से भेजें\",\n \"RESEND_OTP\": \"ओटीपी भेजें\",\n \"CONFIRMATION_ACCOUNT\": \"खाता पुष्टि\",\n \"DO_HAVE_ACCOUNT\": \"खाता है?\",\n \"SIGN_IN\": \"साइन इन करें\",\n \"OTP_SENT_SUCCESSFULLY\": \"ओटीपी सफलतापूर्वक भेजा गया\",\n \"USER_ALREADY_EXISTS\": \"उपयोगकर्ता पहले से मौजूद है\",\n \"INTERNAL_SERVER_ERROR\": \"आंतरिक सर्वर त्रुटि\",\n \"THE_OTP_YOU_ENTERED_IS_INCORRECT\": \"आपके द्वारा दर्ज किया गया ओटीपी गलत है।\",\n \"REGISTRATION_COMPLETE_YOUR_ACCOUNT_HAS_BEEN_SUCCESSFULLY_CREATED\": \"पंजीकरण पूर्ण हुआ। आपका खाता सफलतापूर्वक बना लिया गया है।\"\n },\n \"PASS_PAGE\": {\n \"WELCOME_TEXT\": \"स्वागत है, लॉगिन करें\",\n \"USER_NAME\": \"उपयोगकर्ता नाम/ईमेल\",\n \"PASSWORD\": \"पासवर्ड\",\n \"USER_NAME_ERROR\": \"मान्य ईमेल दर्ज करें\",\n \"PASSWORD_ERROR\": \"पासवर्ड कम से कम 6 अक्षरों का होना चाहिए\",\n \"LOGIN\": \"लॉगिन करें\",\n \"BACK\": \"वापस\",\n \"RESEND_LINK\": \"लिंक फिर से भेजें\",\n \"FORGOT_PASSWORD\": \"पासवर्ड भूल गए?\",\n \"PASSWORD_RESET\": \"पासवर्ड रीसेट\",\n \"RESET_MAIL\": \"पासवर्ड रीसेट निर्देश प्राप्त करने के लिए कृपया अपना पंजीकृत उपयोगकर्ता नाम दर्ज करें।\",\n \"SEND_RESET_LINK\": \"लिंक भेजें\",\n \"GO_BACK_TO_LOGIN\": \"लॉगिन पर जाएं\",\n \"EMAIL_SENT\": \"ईमेल भेजा गया\",\n \"CHECK_INBOX\": \"इनबॉक्स चेक करें और लिंक खोलें\",\n \"ENTER_NEW_PASSWORD\": \"नया पासवर्ड दर्ज करें\",\n \"NEW_PASSWORD\": \"नया पासवर्ड\",\n \"CONFIRM_PASSWORD\": \"पासवर्ड पुष्टि\",\n \"PASSWORD_MISMATCH\": \"पासवर्ड मेल नहीं खा रहे\",\n \"WELL_DONE\": \"बधाई हो!\",\n \"PASSWORD_CHANGE_SUCCESS\": \"पासवर्ड सफलतापूर्वक बदला गया\",\n \"REMEMBER_ME\": \"मुझे याद रखें\",\n \"PASSWORD_CHANGED_SUCCESSFULLY\": \"पासवर्ड सफलतापूर्वक बदला गया\",\n \"ENTER_CORRECT_PASSWORD\": \"कृपया सही पासवर्ड दर्ज करें\",\n \"INTERNAL_SERVER_ERROR\": \"आंतरिक सर्वर त्रुटि\",\n \"INVALID_LINK_OR_LINK_EXPIRED\": \"लिंक अमान्य है या इसकी समय सीमा समाप्त हो गई है\",\n \"USER_DOES_NOT_EXIST\": \"उपयोगकर्ता मौजूद नहीं है\",\n \"PASSWORD_RESET_SUCCESSFULLY\": \"पासवर्ड सफलतापूर्वक रीसेट किया गया\",\n \"PASSWORD_RESET_LINK_SENT_TO_YOUR_EMAIL_ACCOUNT\": \"पासवर्ड रीसेट लिंक आपके ईमेल पते पर भेजा गया है\"\n }\n }\n\n };\n /*\n static configJSON: Array<any> = [\n {eventName: 'parking', icon: '../assets/images/icons/app-launcher/ess.svg', access: true,\n roles : ['App User'],\n fromJSON: true,\n modules:{\n label: 'Parking',\n switchCaseName:'Parking',\n defaultModule: 'details',\n list: [\n {navName:'home', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Home', \n tabs:[\n {\n tabName:'Entries', \n path:'entries_button', \n type: 'nxtPage',\n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNxtButtonPage', \n apiCall: \"get\",\n endpoint : \"/nxt?name=a033t00000rRXl5AAG\",\n },\n \n },\n ]\n },\n {navName:'dashboard', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Dashboard', \n tabs:[\n {\n tabName:\"Today's Status\", \n path:'today_dashboard', \n type: 'dashboard',\n inputs: {\n endpoint: '/parking/dashboard',\n apiCall: 'post',\n metrics : {\n noncomparison : [\n {key:'currentDate', name:'currentDate', chart:'Pie', filterType: 'noncomparison', label: \"Today's Status\"},\n ],\n }\n }\n \n },\n {\n tabName:'Weekly Status', \n path:'weekly_dashboard', \n type: 'dashboard',\n inputs: {\n endpoint: '/parking/dashboard',\n apiCall: 'post',\n metrics : {\n noncomparison : [\n {key:'previousWeek', name:'previousWeek', chart:'Advanced Pie', filterType: 'noncomparison', label: 'Last Week Entries'},\n ],\n }\n }\n \n },\n {\n tabName:'Monthly Status', \n path:'monthly_dashboard', \n type: 'dashboard',\n inputs: {\n endpoint: '/parking/dashboard',\n apiCall: 'post',\n metrics : {\n noncomparison : [\n {key:'previousMonth', name:'previousMonth', chart:'Advanced Pie', filterType: 'noncomparison', label: 'Last Month Entries'},\n ],\n }\n }\n \n },\n ]\n },\n {navName:'employees', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Employees', \n tabs:[\n {\n tabName:'Employees', \n path:'parking_employees', \n type: 'table',\n inputs: {\n endpoint: '/parking/employees',\n apiCall: 'get',\n inputs :{},\n responseObject : true,\n responseObjectKey:'employees',\n responseArray : false,\n searchBar: true,\n headerLabels:['Employee Id', 'First Name', 'Last Name', 'Number Plate', 'Division'],\n displayedColumns:['employeeId', 'firstName', 'lastName', 'numberPlate', 'division'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Employee', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n type:'openNXTPage', \n pageContent:'a033t00000rRUKcAAO', \n modalTitle: 'New Employee',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/employees',\n successMessage:'Employee added succesfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n {navName:'entries', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Parking Entries', \n tabs:[\n { \n tabName:'Parking Entries', \n path:'parking_entries', \n type: 'table',\n inputs: {\n endpoint: '/parking/entries',\n apiCall: 'get',\n inputs :{},\n type : 'nxtGetCall',\n responseObject : true,\n responseObjectKey:'entries',\n responseArray : false,\n searchBar: true,\n headerLabels:['First Name', 'Last Name', 'Number Plate', 'Division', 'Parking Date', 'Parking Time', 'Parking ticket'],\n displayedColumns:['firstName', 'lastName', 'numberPlate', 'division', 'date','time', 'parkingTicket'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Entry', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n type:'openNXTPage', \n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n pageContent:'a033t00000rRTDpAAO',\n modalTitle: 'New Entry',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/entries',\n successMessage:'Parking entry added succesfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n {navName:'visitorLog', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Visitor Log', \n tabs:[\n { \n tabName:'Visitor Entries', \n path:'visitor_entries', \n type: 'table',\n inputs: {\n endpoint: '/parking/visitors',\n apiCall: 'get',\n inputs :{},\n type : 'nxtGetCall',\n responseObject : true,\n responseObjectKey:'visitors',\n responseArray : false,\n searchBar: true,\n headerLabels:['Employee Id', 'Visitor Name', 'Visit Purpose', 'Visit Date', 'Visitor Type', 'Visitor Id', 'Time In', 'Time Out', 'Signature'],\n displayedColumns:['employeeId', 'visitorName', 'visitPurpose', 'visitDate', 'visitorType', 'visitorId', 'timeIn', 'timeOut', 'signature'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Visitor', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n type:'openNXTPage', \n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n pageContent:'a033t00000rRUKwAAO',\n modalTitle: 'New Visitor Entry',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new-visitor',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/visitors',\n successMessage:'Visitor entry added successfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n {navName:'stationary', icon:'../assets/images/icons/side-nav/bill-line.svg', label:'Stationary Entries', \n tabs:[\n { \n tabName:'Stationary Entries', \n path:'stationary_entries', \n type: 'table',\n inputs: {\n endpoint: '/parking/stationaries',\n apiCall: 'get',\n inputs :{},\n type : 'nxtGetCall',\n responseObject : true,\n responseObjectKey:'stationaries',\n responseArray : false,\n searchBar: true,\n headerLabels:['Employee Id', 'Item Type', 'Item Details', 'Number of Items', 'Date & Time'],\n displayedColumns:['employeeId', 'itemType', 'itemDetails', 'noOfItems', 'date'],\n fromWhere: 'common',\n isButtons: true,\n withCheckBox:true,\n buttons: [\n { name: 'New Stationary Entry', class: 'btn btn-primary', buttonType:'newRecord', buttonAction:'openModal', \n modalProperties:{\n type:'openNXTPage', \n inputs:{\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n type:'openNXTPage', \n },\n pageContent:'a033t00000rRUL1AAO',\n modalTitle: 'New Stationary Entry',\n modalSaveButtonValue:'Save',\n modalCancelButtonValue:'Cancel',\n modalSize:'modal-lg',\n isModalFooter: false,\n responseObject : true,\n responseObjectKey:'jsonBody',\n responseArray : false,\n nxtAPI:'/parking/new-stationary ',\n tableGetAPICall:'get',\n tableGetAPIPath:'/parking/stationaries',\n successMessage:'Stationary entry added succesfully',\n } \n },\n { name: 'Export Selected', buttonType:'exportSelected' , class: 'grey-border rounded-3 bg-white text-dark', buttonAction:'downloadCSV'},\n ]\n },\n },\n ]\n },\n ]\n }\n }, \n ];\n */\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { Constants } from \"../../models/Constants\";\nimport { TranslateModule,TranslateService } from '@ngx-translate/core';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { MatTooltipModule } from '@angular/material/tooltip';\n@Component({\n selector: 'app-side-screen',\n standalone: true,\n imports: [AngularSvgIconModule, DropDownComponent,CommonModule,ReactiveFormsModule, MatCheckboxModule,FusionButtonComponent,TranslateModule,CustomTranslatePipe, MatTooltipModule],\n templateUrl: './side-screen.component.html',\n styleUrls: ['./side-screen.component.css']\n})\nexport class SideScreenComponent implements OnInit {\n\n @Input() headerTitle: string = '';\n @Input() onLoadData: any = \"\";\n @Input() buttonLoadingSpinner: boolean = false; // MY 15OCT26 save button loader input\n @Output() sideScreenEmittedEvent = new EventEmitter<{}>;\n\n selectedComponentType: string = 'Select';\n componentTypeList: Array<string | number> = [Constants.EARNINGS,Constants.DEDUCTIONS];\n nameList: Array<any> =[];\n addPayRollComponent!: FormGroup;\n selectedComp = 'Select';\n otherSection = 'Add Other';\n basicPay = Constants.BASIC;\n \n\n constructor(private formBuilder: FormBuilder) { \n this.addPayRollComponent = this.formBuilder.group({ // this will be the default data when user opens the side component to add a new salary-setting-component\n 'type': [\"\", [Validators.required]],\n 'name': [\"\", [Validators.required, Validators.pattern('^[a-zA-Z ]+$')]],\n 'nameInPaySlip': [\"\", [Validators.required]],\n 'payType': \"fixed\",\n 'proRataBasis': [\"regular\"],\n 'calculationType': 'flat',\n 'amount': '',\n 'isEmployerContribution': false,\n 'taxable': false,\n 'active': true,\n 'maxReimburse': 0,\n 'deductionFrequency': '',\n 'isExempted' : false,\n 'isVariablePay': [false], //SK15JUL24\n 'isPartOfCTC': [true],\n 'isFlexiBenefitComponent':false\n });\n }\n\n ngOnInit(): void {\n if(Object.keys(this.onLoadData).length > 0){\n this.selectedComponentType = this.onLoadData.type; // for the dropdown value \n this.selectedComp = this.onLoadData.name;\n // on editing the component, the dropdown values are listed based on component type\n if(this.onLoadData.type === Constants.EARNINGS){\n this.nameList = [this.basicPay, 'Bonus', Constants.DA, 'Commission', Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (this.onLoadData.type === Constants.ALLOWANCES){\n this.nameList = [Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (this.onLoadData.type === Constants.DEDUCTIONS){\n this.nameList = [Constants.PT, Constants.EPF, Constants.VPF, Constants.EMPLOYER_PF, Constants.TDS, Constants.ESI, Constants.EMPLOYER_ESI, this.otherSection];\n }\n \n this.addPayRollComponent.patchValue({\n 'type': this.onLoadData.type,\n 'name': this.onLoadData.name,\n 'nameInPaySlip': this.onLoadData.nameInPaySlip,\n 'payType': this.onLoadData.payType,\n 'proRataBasis': this.onLoadData.proRataBasis,\n 'calculationType': this.onLoadData.calculationType,\n 'amount': this.onLoadData.amount,\n 'isEmployerContribution': this.onLoadData.isEmployerContribution,\n 'taxable': this.onLoadData.taxable,\n 'active': this.onLoadData.active,\n 'maxReimburse': this.onLoadData.maxReimburse,\n 'deductionFrequency': this.onLoadData.deductionFrequency,\n 'isExempted' : this.onLoadData.isExempted,\n \"isVariablePay\": this.onLoadData?.isVariablePay, //SK15JUL24\n \"isPartOfCTC\": this.onLoadData?.isPartOfCTC, //SK20JUN25\n \"isFlexiBenefitComponent\":this.onLoadData?.isFlexiBenefitComponent, //SK20JUN25\n });\n }\n }\n\n dropdownEmitFunction(event: any, form:any){\n this.addPayRollComponent.controls[form].patchValue(event?.data);\n // should do patch value for the type dropdown\n // assigning the data to formcontrol based on the dropdown type selected\n this.selectedComp = 'Select';\n if(form === 'type'){\n this.selectedComponentType = event?.data;\n if(event?.data === Constants.EARNINGS){\n this.nameList = [this.basicPay, 'Bonus', 'Commission', Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (event?.data === Constants.ALLOWANCES){\n this.nameList = [Constants.HRA, 'Special Allowance', 'Conveyance Allowance', 'Travel Allowance', 'Medical Allowance', this.otherSection];\n } else if (event?.data === Constants.DEDUCTIONS){\n this.nameList = [Constants.PT, Constants.EPF, Constants.VPF, Constants.EMPLOYER_PF, Constants.TDS, Constants.ESI, Constants.EMPLOYER_ESI, this.otherSection];\n } else if (event?.data === Constants.FLEXI_BENEFITS){ //SK20JUN25\n this.nameList = [Constants.LEAVE_TRAVEL_ALLOWANCE, Constants.FOOD_COUPONS, Constants.TELEPHONE_ALLOWANCE, this.otherSection];\n }\n } \n else if (form === 'name'){\n if(event?.data === this.otherSection){\n this.addPayRollComponent.controls['name'].patchValue('');\n }\n this.selectedComp = event?.data;\n if(event?.data === this.basicPay){\n this.addPayRollComponent.controls['calculationType'].patchValue('fixed');\n }\n }\n\n }\n\n submitPayRollComponent(){\n }\n\n prorataToggle($event: any){\n }\n\n // sending the form data to hrm component and sent to database\n hitPayrollSettingComponentApi($event: any){\n // MY 15OCT26 prevent submission while in loading state\n if (this.buttonLoadingSpinner) return;\n this.sideScreenEmittedEvent.emit({'formData': this.addPayRollComponent.value})\n }\n\n // MY 15OCT26 handle cancel button click with loading guard\n cancelSideScreen() {\n if (this.buttonLoadingSpinner) return;\n this.addPayRollComponent.reset();\n this.sideScreenEmittedEvent.emit({ open: false });\n }\n\n // SK20JUN25 radio emit for fixed/variable component changes\n radioEmit(formName: string, value: any){\n if(formName === \"isVariablePay\" && !value){\n this.addPayRollComponent.patchValue({\n \"isPartOfCTC\" : true\n })\n }\n }\n\n}\n","<!-- <div class=\"side-screen\">\n <div class=\"side-header\">\n <p class=\"flex content-space-between mb-0\">{{headerTitle}}\n <span class=\"close-icon\"><img src=\"../assets/images/icons/general/cross-icon.svg\" (click)=\"sideScreenEmittedEvent.emit({'open': false})\" style=\"cursor: pointer;\" class=\"svg-icon-white\"></span>\n </p>\n </div>\n <div class=\"side-content\"> -->\n <form class=\"addPayRollComponent\" [formGroup]=\"addPayRollComponent\" (ngSubmit)=\"submitPayRollComponent()\">\n <!-- <div class=\"scrollable-content\"> -->\n <div class=\"row\">\n <div class=\"col-md-10\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.COMPONENT_TYPE' | customTranslate : 'Component Type' }}<span style=\"color: var(--clr-error, #dc3545);\">*</span></label> \n <app-drop-down [lists]='componentTypeList' tabindex=\"1\" dropDownHeight=\"38px\" dropDownWidth=\"100%\" (dataEmit)=\"dropdownEmitFunction($event, 'type')\" [selectedData]=\"selectedComponentType\"></app-drop-down>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-10 mt-2\">\n <label class=\"label-txt\">{{'APP_HRM_PAYROLL_SETTINGS.COMPONENT_NAME' | customTranslate : 'Component Name' }}<span style=\"color: var(--clr-error, #dc3545);\">*</span></label>\n <app-drop-down [lists]=\"nameList\" tabindex=\"1\" dropDownHeight=\"38px\" dropDownWidth=\"100%\"\n (dataEmit)=\"dropdownEmitFunction($event, 'name')\" [selectedData]=\"selectedComp\">\n </app-drop-down>\n <div *ngIf=\"selectedComp === otherSection || selectedComp === 'Reimbursements' \" [class]=\"addPayRollComponent.controls['name'].invalid && addPayRollComponent.controls['name'].touched ? 'has-error' : '' \">\n <input [matTooltip]=\"'APP_HRM_PAYROLL_SETTINGS.COMPONENT_NAME_TOOL_TIP' | customTranslate : 'Underscores and Spaces are not allowed'\" type=\"text\" class=\"form-control\" tabindex=\"2\" [placeholder]=\"'APP_HRM_PAYROLL_SETTINGS.COMPONENT_NAME' | customTranslate : 'Component Name'\"\n aria-label=\"Text input with dropdown button\" formControlName=\"name\">\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['name'].invalid && addPayRollComponent.controls['name'].touched && addPayRollComponent.controls['name'].hasError('pattern') ? 'display: block' : 'display: none'\">{{ 'APP_HRM_PAYROLL_SETTINGS.VAL_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-10 mt-2\">\n <label class=\"label-txt\">{{'APP_HRM_PAYROLL_SETTINGS.NAME_IN_PAYSLIP' | customTranslate : 'Name in Payslip' }}<span style=\"color: var(--clr-error, #dc3545);\">*</span></label>\n <div [class]=\"addPayRollComponent.controls['nameInPaySlip'].invalid && addPayRollComponent.controls['nameInPaySlip'].touched ? 'has-error' : '' \">\n <input type=\"text\" class=\"form-control\" tabindex=\"3\" [placeholder]=\"'APP_HRM_PAYROLL_SETTINGS.NAME_IN_PAYSLIP' | customTranslate : 'Name in Payslip'\"\n aria-label=\"Text input with dropdown button\" formControlName=\"nameInPaySlip\">\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['nameInPaySlip'].invalid && addPayRollComponent.controls['nameInPaySlip'].touched ? 'display: block' : 'display: none' \">{{ 'APP_HRM_PAYROLL_SETTINGS.VAL_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n <!-- SK15JUL24 adding isVariable type -->\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['type'].value === 'Earnings'\">\n <div class=\"col-md-11 mt-2\">\n <!-- SK02JUN25 fixed and variable components added -->\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.PAY_TYPE' | customTranslate : 'Pay Type' }}</label>\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isVariablePay\" tabindex=\"12\"\n formControlName=\"isVariablePay\" [value]=\"false\" (click)=\"radioEmit('isVariablePay', false)\" />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.FIXED_COMPONENT' | customTranslate : 'Fixed Component' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isVariablePay\" tabindex=\"11\"\n formControlName=\"isVariablePay\" [value]=\"true\" (click)=\"radioEmit('isVariablePay', true)\"/>\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.VARIABLE_COMPONENT' | customTranslate : 'Variable Component' }}</span>\n </label>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['isVariablePay'].value === true || addPayRollComponent.controls['type'].value === 'Deductions'\">\n <div class=\"col-md-11 mt-2\">\n <!-- SK02JUN25 fixed and variable components added -->\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.IS_PART_OF_CTC' | customTranslate : 'Is Part of CTC' }}</label>\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isPartOfCTC\" tabindex=\"12\"\n formControlName=\"isPartOfCTC\" [value]=\"true\" />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.YES' | customTranslate : 'Yes' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isPartOfCTC\" tabindex=\"11\"\n formControlName=\"isPartOfCTC\" [value]=\"false\"/>\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.NO' | customTranslate : 'No' }}</span>\n </label>\n </div>\n </div>\n </div>\n <div class=\"show-only-if type-is-deduction\" *ngIf=\"addPayRollComponent.controls['type'].value == 'Allowances' || addPayRollComponent.controls['type'].value == 'Earnings' \" >\n <div class=\"col-md-11 mt-2\" *ngIf=\"addPayRollComponent.controls['isVariablePay'].value\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.FREQUENCY' | customTranslate : 'Frequency' }}</label>\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"proRataBasis\" tabindex=\"12\"\n formControlName=\"proRataBasis\" [value]=\"'regular'\" />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.REGULAR' | customTranslate : 'Regular' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"proRataBasis\" tabindex=\"11\"\n formControlName=\"proRataBasis\" [value]=\"'oneTime'\"/>\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.ONE_TIME' | customTranslate : 'One Time' }}</span>\n </label>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-11 mt-2\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.CALCULATION_TYPE' | customTranslate : 'Calculation Type' }}</label>\n <div class=\"flex flex-direction-row\">\n <div class=\"ms-4\">\n <label *ngIf=\"selectedComp !== basicPay \" class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"7\"\n formControlName=\"calculationType\" [value]=\"'flat'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.FLAT_AMOUNT' | customTranslate : 'Flat Amount' }}</span>\n </label>\n <label *ngIf=\"selectedComp !== basicPay \" class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"8\"\n formControlName=\"calculationType\" [value]=\"'percentage'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.PERCENTAGE_BASIC' | customTranslate : 'Percentage of Basic' }}</span>\n </label>\n <label *ngIf=\"selectedComp !== basicPay \" class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"8\"\n formControlName=\"calculationType\" [value]=\"'basicAndDA'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.PERCENTAGE_BASIC_DA' | customTranslate : 'Percentage of Basic and DA' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"9\"\n formControlName=\"calculationType\" [value]=\"'fixed'\"\n /> <!-- (focusout)=\"handlePayType($event)\"\n (keyup)=\"handlePayType($event)\" -->\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.GROSS_PER' | customTranslate : 'Percentage of Gross' }}</span>\n </label>\n <!-- SK02JUN25 % of CTC added -->\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"calculationType\" tabindex=\"9\"\n formControlName=\"calculationType\" [value]=\"'ctc'\"\n />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.CTC_PER' | customTranslate : 'Percentage of CTC' }}</span>\n </label>\n </div>\n </div>\n <p class=\"error-msg\" *ngIf=\"addPayRollComponent.controls['calculationType'].invalid && addPayRollComponent.controls['calculationType'].touched\">\n <span>\n <img src=\"../assets/images/icons/general/warning icon.svg\">{{ 'APP_HRM_PAYROLL_SETTINGS.REQUIRED_FIELD' | customTranslate : 'This field is required.' }}\n </span>\n </p>\n </div>\n </div>\n <!-- SK25AUG25 if it is one time componente, amount input will will be disabled -->\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['proRataBasis'].value != 'oneTime' \">\n <div class=\"col-md-10 mt-2\">\n <label class=\"label-txt\">Enter {{addPayRollComponent.controls['calculationType'].value == 'flat' ? 'Amount' : 'Percentage'}}</label>\n <div [class]=\"addPayRollComponent.controls['amount'].invalid && addPayRollComponent.controls['amount'].touched ? 'has-error' : '' \" class=\"flex flex-row\">\n <input type=\"number\" class=\"form-control\" tabindex=\"10\" placeholder=\"\" [ngClass]=\"{'w-25':(addPayRollComponent.controls['calculationType'].value == 'percentage' || addPayRollComponent.controls['calculationType'].value == 'fixed' || addPayRollComponent.controls['calculationType'].value == 'ctc')}\"\n aria-label=\"Text input with dropdown button\" formControlName=\"amount\">\n <div class=\"ms-2 flex\" style=\"align-items: center;\">\n <div class=\"label-txt\" *ngIf=\"addPayRollComponent.controls['calculationType'].value == 'percentage'\">{{ 'APP_HRM_PAYROLL_SETTINGS.OF_BASIC' | customTranslate : 'of Basic' }}</div>\n <div *ngIf=\"addPayRollComponent.controls['calculationType'].value == 'fixed'\">{{ 'APP_HRM_PAYROLL_SETTINGS.OF_GROSS' | customTranslate : 'of Gross' }}</div>\n <div *ngIf=\"addPayRollComponent.controls['calculationType'].value == 'ctc'\">{{ 'APP_HRM_PAYROLL_SETTINGS.OF_CTC' | customTranslate : 'of CTC' }}</div>\n </div>\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['amount'].invalid && addPayRollComponent.controls['amount'].touched ? 'display: block' : 'display: none' \">{{ 'APP_HRM_PAYROLL_SETTINGS.ENTER_VALID_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n </div>\n <!-- <div class=\"show-only-if type-is-allowance-or-earnings\" *ngIf=\"addPayRollComponent.controls['type'].value == 'Deductions'\">\n <div class=\"row\">\n <div class=\"col-md-11 mt-2 pe-0\">\n <label class=\"label-txt\">Deduction frequency</label>\n <div class=\"flex flex-direction-row\">\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"deductionFrequency\" tabindex=\"4\"\n formControlName=\"deductionFrequency\" [value]=\"'recurring'\"\n />\n <span class=\"radio-text\">Recurring</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"deductionFrequency\" tabindex=\"5\"\n formControlName=\"deductionFrequency\" [value]=\"'one-time'\"\n />\n <span class=\"radio-text\">One time deduction</span>\n </label>\n </div>\n </div>\n <p class=\"error-msg\" *ngIf=\"addPayRollComponent.controls['deductionFrequency'].invalid && addPayRollComponent.controls['deductionFrequency'].touched\">\n <span>\n <img src=\"../assets/images/icons/general/warning icon.svg\">This field is required.\n </span>\n </p>\n </div>\n </div>\n </div> -->\n <div class=\"show-only-if type-is-allowance-or-reimbursements\" *ngIf=\"addPayRollComponent.controls['type'].value == 'Reimbursements'\">\n <div class=\"row\">\n <div class=\"col-md-11 mt-2 pe-0\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.MAX_REIMBURSABLE_AMT' | customTranslate : 'Maximum Reimbursable Amount' }}</label>\n <div [class]=\"addPayRollComponent.controls['maxReimburse'].invalid && addPayRollComponent.controls['maxReimburse'].touched ? 'has-error' : '' \">\n <input type=\"text\" class=\"form-control\" tabindex=\"4\" placeholder=\"1000\"\n aria-label=\"Text input with dropdown button\" formControlName=\"maxReimburse\">\n </div>\n <p class=\"error-fields\"\n [style]=\"addPayRollComponent.controls['maxReimburse'].invalid && addPayRollComponent.controls['maxReimburse'].touched ? 'display: block' : 'display: none' \">{{ 'APP_HRM_PAYROLL_SETTINGS.ENTER_VALID_INPUT' | customTranslate : 'Enter valid input' }}</p>\n </div>\n </div>\n </div>\n <!-- SK20JUN25flexi benefit added -->\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['type'].value === 'Earnings' \">\n <div class=\"col-md-11 mt-2\">\n <mat-checkbox formControlName=\"isFlexiBenefitComponent\" tabindex=\"10\"><p class=\"label-txt mb-0\">{{'APP_HRM_PAYROLL_SETTINGS.IS_FLEXI_BENEFIT' | customTranslate : \"Is Flexi Benefit Component\" }}</p></mat-checkbox>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"addPayRollComponent.controls['type'].value === 'Deductions' \">\n <div class=\"col-md-11 mt-2\">\n <mat-checkbox formControlName=\"isEmployerContribution\" tabindex=\"10\"><p class=\"label-txt mb-0\">{{'APP_HRM_PAYROLL_SETTINGS.IS_EMPLOYERS_CONTRIBUTION' | customTranslate : \"Is Employer's contribution\" }}</p></mat-checkbox>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-11 mt-2\">\n <!-- SK28FEB26 changes from 'Taxable' to 'Tax Exempted', so what components are exempted from tax is checked -->\n <mat-checkbox formControlName=\"taxable\" tabindex=\"13\" ><p class=\"label-txt mb-0\">{{ 'APP_HRM_PAYROLL_SETTINGS.TAXABLE_EXEMPTED' | customTranslate : 'Tax Exempted' }}</p></mat-checkbox>\n </div>\n </div>\n <div *ngIf=\"addPayRollComponent.controls['taxable'].value == true && addPayRollComponent.controls['type'].value == 'Deductions'\">\n <div class=\"row\">\n <div class=\"col-md-11 mt-2 pe-0\">\n <label class=\"label-txt\">{{ 'APP_HRM_PAYROLL_SETTINGS.UNDER_NEW_TAX' | customTranslate : 'Is Exempted under New Tax Regime' }}</label>\n <div class=\"flex flex-direction-row\">\n <div class=\"ms-4\">\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isExempted\" tabindex=\"13\"\n formControlName=\"isExempted\" [value]=\"true\"\n />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.YES' | customTranslate : 'Yes' }}</span>\n </label>\n <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isExempted\" tabindex=\"14\"\n formControlName=\"isExempted\" [value]=\"false\"\n />\n <span class=\"radio-text\">{{ 'APP_HRM_PAYROLL_SETTINGS.NO' | customTranslate : 'No' }}</span>\n </label>\n <!-- <label class=\"label-txt increase-text flex\" style=\"margin-left:-20px;\">\n <input type=\"radio\" name=\"isExempted\" tabindex=\"14\"\n formControlName=\"isExempted\" [value]=\"'bothRegime'\"\n />\n <span class=\"radio-text\">Both</span>\n </label> -->\n </div>\n </div>\n <p class=\"error-msg\" *ngIf=\"addPayRollComponent.controls['deductionFrequency'].invalid && addPayRollComponent.controls['deductionFrequency'].touched\">\n <span>\n <img src=\"../assets/images/icons/general/warning icon.svg\">{{ 'APP_HRM_PAYROLL_SETTINGS.REQUIRED_FIELD' | customTranslate : 'This field is required.' }}\n </span>\n </p>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-11 mt-2\">\n <mat-checkbox formControlName=\"active\" tabindex=\"15\"><p class=\"label-txt mb-0\">{{ 'APP_HRM_PAYROLL_SETTINGS.MARK_AS_ACTIVE' | customTranslate : 'Mark this as Active' }}</p></mat-checkbox>\n </div>\n </div>\n <!-- MY 15OCT26 support button loader on save button and disable buttons while loading -->\n <div class=\"button-wrapper flex text-right mb-5\">\n <app-fusion-button [buttonLoadingSpinner]=\"buttonLoadingSpinner\" [buttonDisable]=\"!addPayRollComponent.valid || buttonLoadingSpinner\" [buttonType]=\"'ms-2 side-save-component'\" [tabIndex]=\"12\" buttonValue=\"{{ 'APP_HRM_PAYROLL_SETTINGS.SAVE' | customTranslate : 'Save' }}\" (buttonClickEmit)=\"hitPayrollSettingComponentApi($event)\"></app-fusion-button>\n <app-fusion-button [buttonDisable]=\"buttonLoadingSpinner\" [buttonType]=\"'text-only side-cancel-component'\" [tabIndex]=\"13\" buttonValue=\"{{ 'APP_HRM_PAYROLL_SETTINGS.CANCEL' | customTranslate : 'Cancel' }}\" (buttonClickEmit)=\"cancelSideScreen()\"></app-fusion-button>\n </div>\n </form>\n <!-- </div>\n</div> -->","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\n\n@Component({\n selector: 'app-common-screen',\n standalone: true,\n imports: [CommonModule, AngularSvgIconModule],\n templateUrl: './common-screen.component.html',\n styleUrls: ['./common-screen.component.css']\n})\nexport class CommonScreenComponent implements OnInit {\n\n @Input() headerTitle: string = '';\n @Input() dynamicScreenStyle = ''; //SK30JAN25 dynamic style for right nav\n @Output() sideScreenEmittedEvent = new EventEmitter<{}>;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","<div class=\"side-screen\" [style]=\"dynamicScreenStyle\">\n <div class=\"side-header\">\n <p class=\"flex content-space-between mb-0\">{{headerTitle}}\n <span class=\"close-icon\"><img src=\"../assets/images/icons/general/cross-icon.svg\" (click)=\"sideScreenEmittedEvent.emit({'open': false})\" style=\"cursor: pointer; height: 25px; width: 25px;\" class=\"svg-icon-white\"></span>\n </p>\n </div>\n <div class=\"side-content\">\n <div class=\"scrollable-content\">\n <ng-content select=\".side-main-content\"></ng-content>\n </div>\n </div>\n</div>","import { Component, EventEmitter, Input, Output, Optional } from '@angular/core';\nimport { CommonScreenComponent } from '../common-screen/common-screen.component';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { CustomTranslatePipe } from \"../../../pipes/custom-translate.pipe\";\n\n// MR 02NOV26 ApprovalScreenComponent in @rangertechnologies/fusion-ui\n@Component({\n selector: 'app-approval-screen',\n standalone: true,\n imports: [CommonScreenComponent, CommonModule, CustomTranslatePipe],\n providers: [DatePipe],\n templateUrl: './approval-screen.component.html',\n styleUrl: './approval-screen.component.css'\n})\nexport class ApprovalScreenComponent {\n constructor(@Optional() private datePipe?: DatePipe) {}\n @Input() infoData : any;\n @Input() hideFields : Array<any> = []; //SK10OCT25 to hide fields on approval managers side nav\n @Output() approve = new EventEmitter();\n sideScreenEmitted(){\n this.approve.emit();\n }\n}\n","<app-common-screen headerTitle=\"Approval Details\" (sideScreenEmittedEvent)=\"sideScreenEmitted()\">\n <div class=\"side-main-content container\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <!-- Approval Info -->\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.NAME' | customTranslate : 'Name'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.name }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.status === 'Approved', \n 'bg-warning': infoData.status === 'Pending',\n 'bg-danger': infoData.status === 'Rejected'}\">\n {{ infoData.status }}</span>\n </div>\n </div>\n <div class=\"row mb-3\" *ngIf=\"!hideFields.includes('leaveStatus')\">\n <!-- SK21DEC24 to add Approval status in side screen-->\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_STATUS' | customTranslate : 'Approval Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.leaveStatus === 'Approved', \n 'bg-warning': infoData.leaveStatus === 'Pending',\n 'bg-danger': infoData.leaveStatus === 'Rejected'}\">\n {{ infoData.leaveStatus || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.REASON' | customTranslate : 'Reason'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.reason }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.TYPE' | customTranslate : 'Type'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.type }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPLIED_ON' | customTranslate : 'Applied On'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.appliedOn | date:'short' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVED_COUNT' | customTranslate : 'Approved Count'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.approvedCount }}</div>\n </div>\n </div>\n </div>\n \n <!-- Approval Managers -->\n <!-- SK03DEC24 show approval managers list only if applicable -->\n <h3 *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"text-center mb-3 mt-4\" style=\"font-size: 20px\">{{'APP.APPROVAL_MANAGERS' | customTranslate : 'Approval Managers'}}</h3>\n <ul *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"list-group mt-4\">\n <li *ngFor=\"let manager of infoData.approvalManagers\" class=\"list-group-item\">\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_ID' | customTranslate : 'Employee ID'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.employeeId }}</div>\n </div>\n <div class=\"row mb-3\">\n <!-- SK10DEC24 to show manager name -->\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_NAME' | customTranslate : 'Employee Name'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.name }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_ORDER' | customTranslate : 'Approval Order'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.approvalOrder }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': manager.status === 'Approved', \n 'bg-warning': manager.status === 'Pending',\n 'bg-danger': manager.status === 'Rejected'}\">\n {{ manager.status }}\n </span>\n </div>\n </div>\n <div class=\"row mb-3\" *ngIf=\"manager.viewedOn\">\n <div class=\"col-6 text-start\">{{'APP.VIEWED_ON' | customTranslate : 'Viewed On'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.viewedOn | date:'short' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.IS_OPTIONAL' | customTranslate : 'Is Optional'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.isOptional ? \"Yes\" : \"No\" }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.COMMENTS' | customTranslate : 'Comments'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.rejectionReason }}</div>\n </div>\n </li>\n </ul>\n </div>\n \n \n \n </app-common-screen>","// MR 02NOV26 Internal Browse placeholder for FormsComponent modal in @rangertechnologies/fusion-ui\nimport { Component, OnInit, Input, Output, EventEmitter } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\n\n@Component({\n selector: \"app-browse\",\n standalone: true,\n imports: [CommonModule],\n template: `<div class=\"mfe-browse-placeholder\" *ngIf=\"false\"></div>`\n})\nexport class BrowseComponent implements OnInit {\n @Input() selectedEmployee: any;\n @Input() employeeFinanceInfo: any;\n @Input() employeeLeaves: any;\n @Input() employeeExpenses: any;\n @Input() nxtJSON: any;\n @Input() bookValue: any;\n @Input() languageCode: any;\n @Input() bookletId: any;\n @Input() dataPatchProperties: any;\n @Input() nxtEdit: boolean = false;\n @Input() staticComp = false;\n @Input() nxtFormBuilder = false;\n @Input() type = \"\";\n @Input() broadcast = false;\n @Input() isPDFPreview = false;\n @Input() dashboardBuilder: any;\n @Input() allData: any;\n @Input() isLoading: any;\n @Input() componentJson: any;\n @Input() modalProperties: any;\n @Input() buttons: any;\n\n @Output() nxtFormHandlerEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() formEditEvent: EventEmitter<any> = new EventEmitter<any>();\n @Output() nxtButtonHandlerEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() handleCalendarDateEmit: EventEmitter<any> = new EventEmitter<any>();\n @Output() handleCalendarEventDateEmit: EventEmitter<any> = new EventEmitter<any>();\n\n ngOnInit(): void {}\n}\n\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LoaderService {\n private loadingStates: { [componentId: string]: string[] } = {};\n private loadingSubject = new BehaviorSubject<{ [componentId: string]: string[] }>({});\n loading = this.loadingSubject.asObservable();\n nxtLoaderId: any =[]\n\n private emitState() {\n //SKS2SEP25 Always emit a deep copy so subscribers detect changes\n const clonedState = Object.keys(this.loadingStates).reduce((acc, key) => {\n acc[key] = [...this.loadingStates[key]];\n return acc;\n }, {} as Record<string, string[]>);\n\n this.loadingSubject.next(clonedState);\n }\n\n show(componentId: string, requestId: string) {\n if (!this.loadingStates[componentId]) {\n this.loadingStates[componentId] = [];\n }\n\n this.loadingStates[componentId] = [...this.loadingStates[componentId], requestId];\n this.emitState();\n }\n\n hide(componentId: string, requestId: string) {\n if (this.loadingStates[componentId]) {\n const index = this.loadingStates[componentId].indexOf(requestId);\n if (index !== -1) {\n this.loadingStates[componentId] = [\n ...this.loadingStates[componentId].slice(0, index),\n ...this.loadingStates[componentId].slice(index + 1)\n ];\n }\n\n if (this.loadingStates[componentId].length === 0) {\n delete this.loadingStates[componentId];\n }\n\n this.emitState();\n }\n }\n // SKS4SEP25 nxt form action button loader \n nxtLoader(id:any){\n if(this.nxtLoaderId.includes(id)) return\n this.nxtLoaderId.push(id)\n }\n // SKS4SEP25 nxt form action button id get \n getNxtLoader(){\n return this.nxtLoaderId\n }\n isLoading(componentId: string): boolean {\n return !!this.loadingStates[componentId]?.length;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AlertService {\n private static instance: AlertService | null = null;\n\n constructor(private translate: TranslateService) {\n AlertService.instance = this;\n }\n\n // Observable string sources\n private passType = new Subject<any>();\n\n // Observable string streams\n passAlertType$ = this.passType.asObservable();\n messageData!:{}\n\n // Service message commands\n messageOnPass(condition: string, message: any, keys?: any, defaultMessage?:any) {\n let finalMessage = this.translateMessage(message, keys )\n if(`RESPONSE_MESSAGE.${message}` === finalMessage || message === finalMessage){\n finalMessage = defaultMessage || message\n }\n this.messageData = {\n type: condition,\n message: finalMessage\n };\n this.passType.next(this.messageData);\n }\n\n // MR 01AUG26 allows route config error paths (non-DI context) to show app alerts.\n static messageOnPassStatic(condition: string, message: any, keys?: any, defaultMessage?: any) {\n if (AlertService.instance) {\n AlertService.instance.messageOnPass(condition, message, keys, defaultMessage);\n return;\n }\n\n // Fallback if service isn't initialized yet.\n const fallbackMessage = defaultMessage || message || 'Something went wrong';\n window.alert(fallbackMessage);\n }\n \n\n // Service message commands\n messageOnFetch(condition: string, identifier: string, message:any, keys?:any, defaultMessage?:any){\n let finalMessage = this.translateMessage(message, keys )\n if(`RESPONSE_MESSAGE.${message}` === finalMessage || message === finalMessage){\n finalMessage = defaultMessage || message\n }\n this.messageData = {\n type: condition,\n fetchId: identifier,\n message: finalMessage\n }\n this.passType.next(this.messageData);\n }\n\n translateMessage(message: any,keys?: any ){\n // If message is all uppercase, treat it as a translation key\n if (message === message.toUpperCase()) {\n message = this.translate.instant(`RESPONSE_MESSAGE.${message}`);\n }\n \n const regex = /\\{\\{(.*?)\\}\\}/g;\n const matches = [...message.matchAll(regex)].map(m => m[1]);\n \n let finalMessage = message;\n if (matches.length > 0 && keys !== undefined) {\n if (Array.isArray(keys)) {\n matches.forEach((key, index) => {\n const raw = keys[index] !== undefined ? keys[index] : '';\n const translated = this.translate.instant(`${key}.${raw}`);\n const value = translated !== `${key}.${raw}` ? translated : raw;\n const keyRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n finalMessage = finalMessage.replace(keyRegex, value);\n });\n } else if (typeof keys === 'string') {\n matches.forEach((key) => {\n const translated = this.translate.instant(`${key}.${keys}`);\n const value = translated !== `${key}.${keys}` ? translated : keys;\n const keyRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n finalMessage = finalMessage.replace(keyRegex, value);\n });\n } else if (typeof keys === 'object' && keys !== null) {\n matches.forEach((key) => {\n const raw = keys[key] !== undefined ? keys[key] : '';\n const translated = this.translate.instant(`${key}.${raw}`);\n const value = translated !== `${key}.${raw}` ? translated : raw;\n const keyRegex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g');\n finalMessage = finalMessage.replace(keyRegex, value);\n });\n }\n }\n return finalMessage\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AlertService } from './alert.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ErrorHandlerService {\n public errorMessage: any = '';\n public transKeys: any;\n\n constructor(private router: Router, private alertService: AlertService) { }\n\n public handleError = (error: HttpErrorResponse) => {\n if (error.status === 500) {\n this.handle500Error(error);\n }\n else if (error.status === 404) {\n this.handle404Error(error)\n }\n else {\n this.handleOtherError(error);\n }\n }\n\n private handle500Error = (error: HttpErrorResponse) => {\n this.createErrorMessage(error);\n // this.router.navigate(['/500']);\n }\n\n private handle404Error = (error: HttpErrorResponse) => {\n this.createErrorMessage(error);\n // this.router.navigate(['/404']);\n }\n private handleOtherError = (error: HttpErrorResponse) => {\n this.createErrorMessage(error); //TODO: this will be fixed later; \n }\n\n // MY 27OCT26 Helper to extract user-facing message and transKey from any backend payload or string\n private extractMessageFromPayload(payload: any): { message: string; transKey: any } {\n let message = '';\n let transKey: any = null;\n\n if (!payload) {\n return { message, transKey };\n }\n\n // If payload is a string, check if it's JSON or plain text\n if (typeof payload === 'string') {\n const trimmed = payload.trim();\n if ((trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'))) {\n try {\n payload = JSON.parse(trimmed);\n } catch {\n if (!trimmed.startsWith('Http failure response for ')) {\n message = trimmed;\n }\n return { message, transKey };\n }\n } else {\n if (!trimmed.startsWith('Http failure response for ')) {\n message = trimmed;\n }\n return { message, transKey };\n }\n }\n\n if (payload && typeof payload === 'object') {\n if (typeof payload.message === 'string' && payload.message.trim() && !payload.message.startsWith('Http failure response for ')) {\n message = payload.message.trim();\n } else if (typeof payload.error === 'string' && payload.error.trim()) {\n message = payload.error.trim();\n } else if (payload.error && typeof payload.error === 'object') {\n const nestedMsg = payload.error.message || payload.error.error || '';\n if (typeof nestedMsg === 'string' && nestedMsg.trim() && !nestedMsg.startsWith('Http failure response for ')) {\n message = nestedMsg.trim();\n }\n } else if (typeof payload.msg === 'string' && payload.msg.trim()) {\n message = payload.msg.trim();\n }\n\n transKey = payload.TRANS_KEY || payload?.error?.TRANS_KEY || null;\n }\n\n return { message, transKey };\n }\n\n // MY 27OCT26 Extract exact error message from backend HttpErrorResponse payload or fallback cleanly\n private createErrorMessage = (error: HttpErrorResponse | any) => {\n let message: string = '';\n let transKey: any = null;\n let statusText: string = '';\n let status: number | null = null;\n\n // 1. Check if error itself is a string\n if (typeof error === 'string') {\n const extracted = this.extractMessageFromPayload(error);\n message = extracted.message;\n transKey = extracted.transKey;\n }\n\n // 2. Check direct backend payload on HttpErrorResponse (error.error)\n if (!message && error?.error) {\n const extracted = this.extractMessageFromPayload(error.error);\n message = extracted.message;\n transKey = extracted.transKey || transKey;\n }\n\n // Capture direct status & statusText if present\n if (error?.statusText && error.statusText !== 'Unknown Error' && error.statusText !== 'OK') {\n statusText = error.statusText;\n }\n if (error?.status) {\n status = error.status;\n }\n\n // 3. Check error.message (e.g. from ApiService new Error(JSON.stringify(error)))\n if (!message && typeof error?.message === 'string') {\n try {\n const parsed = JSON.parse(error.message);\n if (parsed && typeof parsed === 'object') {\n // If parsed object has an .error property (standard for serialized HttpErrorResponse), inspect it FIRST\n if (parsed.error) {\n const extracted = this.extractMessageFromPayload(parsed.error);\n message = extracted.message;\n transKey = extracted.transKey || transKey;\n }\n\n // If no message in parsed.error, inspect parsed itself (e.g. if parsed was { message: '...' })\n if (!message) {\n const extracted = this.extractMessageFromPayload(parsed);\n message = extracted.message;\n transKey = extracted.transKey || transKey;\n }\n\n // Extract status / statusText from parsed serialized HttpErrorResponse if not already set\n if (!statusText && parsed.statusText && parsed.statusText !== 'Unknown Error' && parsed.statusText !== 'OK') {\n statusText = parsed.statusText;\n }\n if (!status && parsed.status) {\n status = parsed.status;\n }\n if (!transKey) {\n transKey = parsed.TRANS_KEY || parsed?.error?.TRANS_KEY || null;\n }\n }\n } catch {\n // Not a JSON string - standard JS Error\n if (!error.message.startsWith('Http failure response for ')) {\n message = error.message;\n }\n }\n }\n\n // 4. Fallback if no specific business message was found\n if (!message) {\n if (statusText) {\n message = statusText;\n } else if (status) {\n message = `Error ${status}: Something went wrong`;\n } else {\n message = 'Something went wrong';\n }\n }\n\n // Guard: Guarantee that raw \"Http failure response for ...\" is NEVER surfaced\n if (message.startsWith('Http failure response for ')) {\n message = statusText || (status ? `Error ${status}: Something went wrong` : 'Something went wrong');\n }\n\n this.errorMessage = message;\n this.transKeys = transKey;\n this.alertService.messageOnPass('error', this.errorMessage || 'error', this.transKeys);\n }\n}","// MR 02NOV26 TabDataService for Payroll MFE\nimport { Injectable } from \"@angular/core\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class TabDataService {\n private cache: Map<string, any> = new Map();\n private nxtBooks: Map<string, any> = new Map();\n\n constructor() {}\n\n getCachedData(tabName: string, componentId: string): any {\n const key = `${tabName}_${componentId}`;\n return this.cache.get(key) || null;\n }\n\n setCachedData(tabName: string, data: any, componentId: string): void {\n const key = `${tabName}_${componentId}`;\n this.cache.set(key, data);\n }\n\n getNxtBook(endpoint: string): any {\n return this.nxtBooks.get(endpoint) || null;\n }\n\n setNxtBook(endpoint: string, book: any): void {\n this.nxtBooks.set(endpoint, book);\n }\n\n clearCache(): void {\n this.cache.clear();\n this.nxtBooks.clear();\n }\n}\n","import { CommonModule, DatePipe } from '@angular/common';\nimport { ChangeDetectorRef, Component, Input } from '@angular/core';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { NxtAppModule } from '@rangertechnologies/ngnxt';\nimport { LangChangeEvent, TranslateService } from '@ngx-translate/core';\nimport { LoaderService } from \"../../services/loading.service\";\nimport { GlobalValuesService } from \"../../services/global-values.service\";\nimport { ApiService } from \"../../services/api.service\";\nimport { BrowseComponent } from '../browse/browse.component';\nimport { ModalComponent } from '../modal/modal.component';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\nimport { AngularSvgIconModule } from 'angular-svg-icon';\nimport { AlertService } from \"../../services/alert.service\";\nimport { ErrorHandlerService } from \"../../services/error-handler.service\";\nimport { ConfigService } from \"../../services/config.service\";\nimport { saveAs } from 'file-saver';\nimport { TabDataService } from \"../../services/tab-data.service\";\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'app-forms',\n imports: [CommonModule, CustomTranslatePipe, FusionButtonComponent, NxtAppModule, BrowseComponent, ModalComponent, DropDownComponent, AngularSvgIconModule, FusionButtonComponent],\n templateUrl: './forms.component.html',\n styleUrl: './forms.component.css'\n})\nexport class FormsComponent {\n formJson: any\n tabs: Array<any> = [];\n eachTypeOfTab: string = \"\";\n settingsData: any;\n components: Array<any> = [];\n direction: any;\n languageCode: any;\n isLoading: any;\n listViews: any;\n multipleFilter: Array<any> = []\n tableFilterData: any;\n selectedQuarterData: string = \"Select Quarter\"\n selectedFYData: string = \"Select FY\"\n fyList: Array<any> = [];\n dataPatchProperties: any;\n bookletId: any;\n apiUrl: string = '';\n defaultFormJson: any;\n modalProperties: any;\n tableData: any;\n nxtCompID:string = \"\";\n nxtTabName:string = \"\";\n nxtLoader: any = [];\n nxtJSON: any;\n bookValue: any;\n challans: Array<any> = [];\n @Input() tab: any;\n\n constructor(private loaderService: LoaderService, private translate: TranslateService, private globalValues: GlobalValuesService, private apiService: ApiService, private datePipe: DatePipe, private alertService: AlertService, private errorHandler: ErrorHandlerService, private globalValueService: GlobalValuesService, private configService: ConfigService, private tabDataService: TabDataService, private cdr: ChangeDetectorRef) {\n this.tabs = [\n { name: \"details\", label: \"Details\", order: 1 },\n { name: \"challans\", label: \"Challans\", order: 2 },\n { name: \"deductees\", label: \"Deductees\", order: 3 },\n { name: \"fileUpload\", label: \"Files\", order: 4 }\n ]\n\n // SK05DEC25 default fields\n this.defaultFormJson = {\n \"file_header\": {\n \"upload_type\": \"R\",\n \"date\": `${new Date().getDate()}${new Date().getMonth() + 1}${new Date().getFullYear()}`, //creation date REQUIRED\n \"file_sequence_number\": 1, //fixed \"1\" REQUIRED\n \"tan\": \"\", // company TAN need to get in settings model REQUIRED\n \"consolidated_file_hash\": \"\",\n },\n \"batch_header\": {\n \"challan_count\": 0, //based on challans received (Refer: fieldno.52, field no.9) //INPUT_FIELD REQUIRED\n \"transaction_type\": \"\",\n \"regular_statement_token_no\": \"\",\n \"last_tan_of_deductor\": \"\",\n \"previous_regular_statement_token_no\": \"\", //optional //INPUT_FIELD\n \"financial_year\": \"\", // based on financial year selection //INPUT_FIELD REQUIRED\n \"assessment_year\": \"\", // based on selected financial year, the next F.Y. should be entered //INPUT_FIELD REQUIRED\n \"period\": \"\", // Select the Period (Q1, Q2, Q3, Q4) //INPUT_FIELD REQUIRED\n \"employer_name\": \"\", // fetch the company name from settings REQUIRED\n \"employer_branch\": \"\", // company type/branch to be added in settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address1\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address2\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address3\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address4\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_address5\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_state\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_pin\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_email\": \"\", // fetch the company name from settings //SETTINGS_ADDRESSES REQUIRED\n \"employer_std_code\": \"\", // need to add in settings model //SETTINGS_ADDRESSES REQUIRED\n \"employer_telno\": \"\", // need to add in settings model //SETTINGS_ADDRESSES\n \"tan_of_deductor\": \"\", // need to add in settings model //SETTINGS_FINANCE\n \"pan_of_deductor\": \"\", // companys PAN will be fetched from Org Bank Info //SETTINGS_BANKINFO\n \"change_of_address_employer\": \"\", //INPUT_FIELD\n \"deductor_type\": \"\", //INPUT_FIELD\n \"responsible_person_name\": \"\", // need to fetch the current employee\n \"responsible_person_designation\": \"\",// fetch the company name from settings\n \"responsible_address1\": \"\",// fetch the company name from settings\n \"responsible_address2\": \"\",// fetch the company name from settings\n \"responsible_address3\": \"\",// fetch the company name from settings\n \"responsible_address4\": \"\",// fetch the company name from settings\n \"responsible_address5\": \"\",// fetch the company name from settings\n \"responsible_state\": \"\",// fetch the company name from settings\n \"responsible_pin\": \"\",\n \"responsible_email\": \"\",// fetch the company name from settings\n \"mobile_number\": \"\",// fetch the company name from settings\n \"responsible_state_code\": \"\", // need to add in settings model\n \"responsible_telno\": \"\", // need to add in settings model\n \"pan_of_responsible_person\": \"\",// fetch the company name from settings\n \"change_of_address_responsible_person\": \"\", //INPUT_FIELD\n \"batch_total_deposit_amount\": \"\",// sum of all challans total //INPUT_FIELD\n \"unmatched_challan_count\": \"\",\n \"count_of_salary_details\": 0, //INPUT_FIELD\n \"batch_total_gross\": \"\",\n \"regular_statement_filed_earlier\": \"\", //INPUT_FIELD\n \"state_name\": \"\",\n \"pao_code\": \"\",\n \"ddo_code\": \"\",\n \"ministry_name\": \"\", // field 57, excel 101 //INPUT_FIELD\n \"ministry_name_other\": \"\",\n \"pao_registration_no\": \"\",\n \"ddo_registration_no\": \"\",\n \"employer_std_code_alternate\": \"\",\n \"employer_tel_phone_no_alternate\": \"\",\n \"employer_email_id_alternate\": \"\",\n \"responsible_person_std_code_alternate\": \"\",\n \"responsible_person_tel_phone_no_alternate\": \"\",\n \"responsible_person_email_id_alternate\": \"\",\n \"account_office_identification_number\": \"\",\n \"gst_number\": \"\",\n \"count_of_section_194p_details_records\": \"\",\n \"batch_total_gross_total_income_section_194p\": \"\",\n \"last_deductor_type\": \"\",\n \"record_hash_bh\": \"\"\n }\n }\n this.formJson = this.defaultFormJson;\n this.eachTypeOfTab = this.tabs[0]?.name;\n this.tab = this.tabs[0];\n this.settingsData = JSON.parse(this.globalValues.getItem('settingsData') as any);\n const userDataConst: any = JSON.parse(this.globalValues.getItem('userData') as any);\n this.languageCode = localStorage.getItem('language') || userDataConst?.languageCode || \"en\";\n this.translate.onLangChange.subscribe((event: LangChangeEvent) => {\n this.languageCode = event.lang || \"en\";\n });\n this.loaderService.loading.subscribe((loadingStates) => {\n this.isLoading = loadingStates;\n this.cdr.markForCheck();\n });\n //SK05DEC25 get components data\n if (userDataConst) {\n const loggedInUserData = userDataConst?.apps;\n loggedInUserData?.forEach((appArr: any) => {\n if (appArr.name === 'hrm') {\n appArr?.modules?.forEach((modArr: any) => {\n if (modArr?.name === 'payroll') {\n modArr?.tabs.forEach((tabArr: any) => {\n if (tabArr?.name === 'forms' || tabArr?.name === 'form24q') { //SK05DEC25 check the condition for tabname\n tabArr?.components.forEach((element: any) => {\n if (element.type === \"subTab\") {\n this.tabs = element.config.subTab;\n this.tab = element.config.subTab[0];\n this.eachTypeOfTab = this.tabs[0]?.name;\n }\n });\n }\n });\n }\n });\n }\n });\n }\n }\n\n async ngOnInit(){\n this.loaderService.loading.subscribe((loadingStates) => {\n this.isLoading = loadingStates;\n this.nxtLoader = this.loaderService.getNxtLoader()\n this.nxtLoader = this.nxtLoader.filter((nxtId: any) => {\n return this.isLoading[nxtId] && this.isLoading[nxtId]?.length > 0;\n });\n this.cdr.markForCheck();\n });\n // SK05DEC25 file header datas assignment\n this.formJson[\"file_header\"][\"date\"] = `${new Date().getDate()}${new Date().getMonth() + 1}${new Date().getFullYear()}`;\n const nowYear = new Date().getFullYear();\n for (let i = 0; i < 5; i++) {\n this.fyList.push(nowYear - i + '-' + (nowYear - (i - 1)));\n };\n const currentMonth = (new Date().getMonth() + 1);\n if ((currentMonth >= 4) && (currentMonth <= 12)) {\n this.selectedFYData = this.fyList[0];\n } else {\n this.selectedFYData = this.fyList[1];\n };\n this.selectedQuarterData = \"Q1\";\n await this.getFormData(this.selectedFYData, this.selectedQuarterData);\n this.apiUrl = this.configService.getServiceConfig('apiUrl');\n this.currentTabNav(this.tab)\n }\n\n //SK05DEC25 selected subtab navigation\n async currentTabNav(tab: any) {\n this.tab = tab;\n this.components = [{type: 'default'}];\n this.eachTypeOfTab = \"eachTypeOfTab\"\n this.modalProperties = tab?.modalProperties;\n this.components = tab.components;\n this.eachTypeOfTab = tab.name;\n if (tab.components) {\n for (const comps of tab.components) {\n const compType = comps?.type;\n const cachedCompData = this.tabDataService.getCachedData(tab.name, comps._id);\n if (cachedCompData !== undefined){ //SK05DEC25 cache for nxt form data\n // SKS17JUL26 mail campaign added to cache check\n if (compType === 'nxtPage' || compType === 'broadcast' || compType === 'mailCampaign' || compType === 'pdf' || compType === 'invoice') {\n this.bookValue = this.tabDataService.getCachedData(tab.name, comps._id)\n this.nxtJSON = this.tabDataService.getNxtBook(comps?.config?.endpoint);\n comps.config['nxtJSON'] = this.nxtJSON\n } \n } else {\n // SK05DEC25 table data assignemnt\n if (compType === 'table') {\n if (!comps?.config?.endpoint && !comps?.config?.pagination) {\n const formS = this.formJson;\n if (tab.name === 'challans') { // SK05DEC25 for challan table\n comps.config.data = formS.challans\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formS;\n })\n this.challans = formS.challans\n } else if (tab.name === 'deductees') {\n comps.config.data = formS.deductees\n if (comps.name === 'deducteeTable') {\n comps.config.data = formS.deductees;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formS;\n })\n } else { //SK05DEC25 for fetchedDeductee table\n comps.config.data = formS.fetchedDeductees;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formS;\n })\n }\n }\n // this.bookValue = this.formJson\n }\n } else if ((compType === 'nxtPage')) { //SK05DEC25 nxt page component\n this.nxtCompID = comps._id;\n this.nxtTabName = tab.name;\n this.modalProperties = comps.config.modalProperties;\n this.dataPatchProperties = comps.config.dataPatchProperties;\n if (comps?.config?.apiCall && comps?.config?.endpoint) {\n await this.getData(comps?.config?.apiCall, comps?.config?.endpoint, comps, undefined, undefined, comps._id, {data:this.formJson});\n comps.config.nxtJSON = { ...this.nxtJSON }\n if (this.nxtJSON) this.tabDataService.setNxtBook(comps?.config?.endpoint, this.nxtJSON);\n comps.config.nxtJSON = { ...this.nxtJSON }\n this.tabDataService.setCachedData(tab.name, this.bookValue, comps._id)\n }\n if (comps?.config?.dataGetProperties?.endpoint) {\n const data = await this.apiService.fetchDataAsPromise(comps?.config?.dataGetProperties?.endpoint + (compType === 'pdf' ? '' : tab?.name, compType._id));\n if (comps?.config?.dataGetProperties.responseObject) {\n comps.config.tabBrowseContent = this.globalValues.getValue(data, comps?.config?.dataGetProperties.responseObjectKey);\n this.bookValue = this.globalValues.getValue(data, comps?.config?.dataGetProperties.responseObjectKey);\n } else if (comps?.config?.dataGetProperties.responseArray) {\n comps.config.tabBrowseContent = data[0];\n this.bookValue = data[0];\n }\n }\n }\n } \n }\n }\n }\n\n async getData(apiCall: any, endPoint: any, event: any, parentData: any | undefined = undefined, params: any | undefined = undefined, compId?: any, tableData?: any): Promise<void> {\n if (apiCall === 'get') {\n let finalGetCall: any = endPoint;\n if (event?.config?.isQueryParams || event?.config?.isParams) {\n if (event?.config?.paramsValue) {\n finalGetCall = endPoint + event.config?.paramsKey + event.config?.paramsValue;\n } else if (event?.config?.paramsKey && parentData) {\n finalGetCall = endPoint + this.globalValues.getValue(parentData, event?.config?.paramsKey);\n }\n } else {\n finalGetCall = endPoint;\n }\n if (event?.config?.searchConfigs?.searchFilterVal) {\n if (event.config.searchConfigs?.paramKeys && (event.config.searchConfigs?.searchFilterVal?.trim() != '')) {\n event.config.searchConfigs?.paramKeys.forEach((ele: any) => {\n if (finalGetCall?.includes(\"?\")) {\n finalGetCall += `&${ele}=${event.config.searchConfigs?.searchFilterVal}`\n } else {\n finalGetCall += `?${ele}=${event.config.searchConfigs?.searchFilterVal}`\n }\n });\n }\n }\n if (params) {\n if (finalGetCall?.includes(\"?\")) {\n finalGetCall += `&${params}`\n } else {\n finalGetCall += `?${params}`\n }\n }\n try {\n const getData = await this.apiService.fetchDataAsPromise(finalGetCall, compId); //123check\n this.multipleFilter = getData?.distinctValues\n if (event.config.responseObject) {\n const key = event.config.responseObjectKey;\n if (event.config.type == 'openNXTPage') {\n this.nxtJSON = {\n ...(this.globalValues.getValue(getData, key) ?? getData),\n loaderId: compId\n };\n event.config.nxtJSON = {\n ...(this.globalValues.getValue(getData, key) ?? getData),\n loaderId: compId\n };\n this.bookValue = tableData.data\n } else if (event.config.type === \"table\" || event.config.type === \"tableData\") {\n event.config.data = [];\n if (!event.config.tableParams) {\n event.config.tableParams = {};\n }\n event.config.tableParams = {\n ...event.config.tableParams, // clone existing\n pagination: {\n ...(event.config.tableParams.pagination || {}),\n totalRecords: getData[\"totalRecords\"]\n }\n };\n event.config.data = this.globalValues.getValue(getData, key);\n } else {\n event.config.data = this.globalValues.getValue(getData, key);\n if (event.config.type === 'nxtGetCall') {\n event.config.data.forEach((data: any) => {\n const date: any = this.datePipe.transform(data.parkingDate, 'short');\n data.time = date?.split(',')[1];\n data.date = this.datePipe.transform(date?.split(',')[0], 'mediumDate');\n delete data._id;\n delete data.parkingDate;\n })\n }\n }\n } else if (event?.config?.responseArray) {\n if (event.config.type === 'tableData') { \n event.config.data = structuredClone(getData);;\n }\n }\n } catch (error) {\n // console.error('Error fetching data', error);\n }\n }\n }\n\n openModal: boolean = false;\n async commonButtonClickEmit(event: any, index?: any, allEvent?: any) {\n if (event.buttonAction === 'openModal') {\n this.openModal = true;\n if (event.buttonType === 'newRecord') {\n // this.nxtJSON = {}\n this.bookValue = undefined;\n }\n this.modalProperties = event.modalProperties;\n if (this.modalProperties?.type === 'openNXTPage' || this.modalProperties?.type === 'calendar') { //SK13SEP24 adding calendar type check\n const url = '/nxt?name=' + this.modalProperties.pageContent;\n await this.getData('get', url, this.modalProperties, index, undefined, this.modalProperties._id, allEvent);\n if (this.nxtJSON) this.tabDataService.setNxtBook(url, this.nxtJSON);\n }\n } else if (event.buttonAction === 'save') { // SK05DEC25 to sync fetchedDeductees and current deductees\n const fJS = this.formJson;\n this.bookValue = undefined;\n this.checkedDeductees.forEach(element => {\n const filtDeductee = this.formJson.deductees.findIndex((js: any) => js.employeeId === element.employeeId);\n if (filtDeductee >= 0) {\n this.formJson.deductees[filtDeductee] = element;\n } else {\n this.formJson.deductees.push(element);\n }\n });\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.challans = formJsonData.json.challans\n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, 'syncDeductees').subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n // this.currentTabNav(this.tab);\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n }\n\n async selectedDropdownValue(event: any, from?: string) {\n if (from === \"fyYear\") {\n this.selectedFYData = event.data\n } else if (from === \"quarter\") {\n this.selectedQuarterData = event.data\n }\n await this.getFormData(this.selectedFYData, this.selectedQuarterData)\n }\n\n checkedDeductees: Array<any> = [];\n tableCheckedDataa(event: any) {\n this.checkedDeductees = event;\n }\n\n tablePageDetails(comp: any, event: any) {\n }\n\n hyperLinkColumnEmit(comp: any, event: any) {\n }\n\n saveButtonData(event: any) {\n }\n\n // SK05DEC25 delete challan.deductee\n onDeleteRecord(event: any, comp: any) {\n const data = event?.data;\n if(comp.name === \"deducteeTable\"){\n this.formJson.deductees.splice(event.index, 1);\n } else { \n this.formJson.challans.splice(event.index, 1)\n }\n // this.bookValue = this.formJson;\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n formJsonData.json.batch_header.challanCount = formJsonData.json.challans.length\n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, 'onDeleteRecord').subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = {...formJsonData.json};\n })\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n\n tableParamsEmit(tab: any, event: any, comp: any) {\n }\n\n actionButtonEmit(evt: any, compId?: string) { //SK10OCT25 compId passed fro reload page\n this.commonButtonClickEmit(evt.event, evt.event, evt)\n }\n\n nxtTableFilterEmit(event: any, comp: any) {\n }\n\n // SK05DEC25 saving/editing challan entry, deductee entry, details data\n async nxtFormHandler(event: any) {\n if (event.action === \"close\") {\n this.openModal = false;\n } else {\n let nxtLoaderId: any;\n if (event?.jsonBook?.questionbook?.action) {\n event.jsonBook.questionbook.action.forEach((element: any) => {\n if (element.eventtoemit === event.action) {\n nxtLoaderId = element.id\n }\n });\n if (!nxtLoaderId) {\n event.jsonBook.questionbook.action.forEach((element: any) => {\n if (element.eventtoemit === 'submit') {\n nxtLoaderId = element.id\n }\n });\n }\n }\n this.loaderService.nxtLoader(nxtLoaderId)\n this.formJson[\"financialYear\"] = this.selectedFYData\n this.formJson[\"quarter\"] = this.selectedQuarterData\n this.formJson['formId'] = `${this.selectedFYData}_${this.selectedQuarterData}`\n this.formJson[\"file_header\"][\"tan\"] = this.settingsData.finance.tan;\n this.formJson[\"batch_header\"][\"employer_name\"] = this.settingsData.companyName;\n this.formJson[\"batch_header\"][\"tan_of_deductor\"] = this.settingsData.finance.tan;\n this.formJson[\"batch_header\"][\"pan_of_deductor\"] = this.settingsData.finance.pan;\n this.formJson[\"batch_header\"][\"assessment_year\"] = Number(`${Number(this.selectedFYData.split('-')[0]) + 1}${Number((this.selectedFYData.split('-')[1]).slice(-2)) + 1}`);\n this.formJson[\"batch_header\"][\"financial_year\"] = Number(`${this.selectedFYData.split('-')[0]}${(this.selectedFYData.split('-')[1]).slice(-2)}`);\n this.formJson[\"batch_header\"][\"period\"] = this.selectedQuarterData;\n if (event.action === \"close\") {\n this.openModal = false;\n } else if (event.action === \"submit\" && event.actionData === \"challanSubmit\") {\n let challanJson: any = {\n \"line_number\": \"\",\n \"challan_detail_record_number\": \"\",\n \"count_of_deductee_party_records\": \"\",\n \"nil_challan_indicator\": \"\", //INPUT_FIELD\n \"bank_challan_no\": \"\", //INPUT_FIELD\n \"ddo_serial_no_form_24g\": \"\",\n \"bank_branch_code_or_24g_receipt_number\": \"\", //INPUT_FIELD\n \"date_of_bank_challan\": \"\", //TOBE ADDED\n \"oltas_income_tax\": \"\", // exel 141 field 22 //INPUT_FIELD\n \"oltas_surcharge\": 0, //INPUT_FIELD\n \"oltas_cess\": 0, //INPUT_FIELD\n \"oltas_interest_amount\": 0, //INPUT_FIELD\n \"oltas_others_amount\": 0, //INPUT_FIELD\n \"total_deposit_amount\": \"\", //exel 146 field 27 //INPUT_FIELD\n \"last_total_deposit_amount\": \"\", //INPUT_FIELD\n \"total_tax_deposit_as_per_deductee_annexure\": \"\", //INPUT_FIELD\n \"tds_tcs_income_tax\": \"\", //INPUT_FIELD\n \"tds_tcs_surcharge\": 0, //INPUT_FIELD\n \"tds_tcs_cess\": 0, //INPUT_FIELD\n \"sum_of_total_income_tax_deducted\": \"\", //INPUT_FIELD\n \"tds_tcs_interest_amount\": 0, //INPUT_FIELD\n \"tds_tcs_others_amount\": 0, //INPUT_FIELD\n \"cheque_or_dd_no\": \"\", //INPUT_FIELD\n \"by_book_entry_cash\": \"\", //INPUT_FIELD\n \"fee\": \"\", //INPUT_FIELD\n \"minor_head_of_challan\": \"\", //INPUT_FIELD\n \"last_challan_serial_no\": \"\",\n \"last_transfer_voucher_no\": \"\",\n \"last_bank_branch_code_or_24g_receipt_number\": \"\",\n \"last_date_of_bank_challan\": \"\",\n \"record_hash_cd\": \"\"\n };\n event.data.forEach((element: any) => {\n if (element?.referenceField) {\n challanJson[element?.referenceField] = element?.input ? element?.input : (element.type === \"Text\" ? \"\" : 0) ;\n }\n });\n if (challanJson?.challanUID) {\n const ind = this.formJson.challans.findIndex((ch: any) => ch.challanUID === challanJson?.challanUID);\n this.formJson.challans[ind] = challanJson\n } else {\n challanJson.challanUID = new Date().toString()\n this.formJson.challans.push(challanJson);\n }\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n formJsonData.json.batch_header.challanCount = formJsonData.json.challans.length\n \n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.challans = formJsonData.json.challans\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n } else if (event.action === \"submit\" && event.actionData === \"deducteeSubmit\") {\n let deducteeJson: any = {\n \"line_number\": \"\",\n \"challan_detail_record_number\": \"\",\n \"deductee_detail_record_no\": \"\",\n \"mode\": \"\",\n \"employee_reference_no\": \"\",\n \"employee_pan\": \"\",\n \"pan_ref_no\": \"\",\n \"name_of_employee\": \"\",\n \"tds_income_tax\": \"\",\n \"tds_surcharge\": 0,\n \"health_and_education_cess\": 0,\n \"total_income_tax_deducted\": \"\",\n \"total_tax_deposited\": \"\",\n \"amount_paid_or_credited\": \"\",\n \"date_of_payment_or_credit\": \"\", // NEED TO CHANGE\n \"date_on_which_tax_deducted\": \"\",\n \"date_of_deposit\": \"\",// NEED TO CHANGE\n \"remarks_1\": \"\",\n \"section_code_under_which_payment_made\": \"\",\n \"certificate_number_issued_by_ao_section_197\": \"\",\n \"batch_number\": \"\",\n \"last_employee_reference_no\": \"\",\n \"last_employee_pan\": \"\",\n \"last_total_income_tax_deducted\": \"\",\n \"last_total_tax_deposited\": \"\",\n \"record_hash_dd\": \"\",\n \"employeeId\":\"\"\n };\n event.data.forEach((element: any) => {\n if (element?.referenceField) {\n // deducteeJson[element?.referenceField] = element?.input;\n deducteeJson[element?.referenceField] = element?.input ? element?.input : (element.type === \"Text\" ? \"\" : 0) ;\n // this.assignByPath(this.formJson, element?.referenceField, element?.input)\n if(element?.referenceField === 'date_of_deposit_D'){\n deducteeJson['date_of_deposit'] = `${String(new Date(element?.input).getDate()).padStart(2, \"0\")}${String(new Date(element?.input).getMonth()+1).padStart(2, \"0\")}${(new Date(element?.input).getFullYear())}`\n } else if(element?.referenceField === 'date_of_payment_or_credit_D'){\n deducteeJson['date_of_payment_or_credit'] = `${String(new Date(element?.input).getDate()).padStart(2, \"0\")}${String(new Date(element?.input).getMonth()+1).padStart(2, \"0\")}${(new Date(element?.input).getFullYear())}`\n } else if(element?.referenceField === 'date_on_which_tax_deducted_D'){\n deducteeJson['date_on_which_tax_deducted'] = `${String(new Date(element?.input).getDate()).padStart(2, \"0\")}${String(new Date(element?.input).getMonth()+1).padStart(2, \"0\")}${(new Date(element?.input).getFullYear())}`\n }\n }\n });\n if (deducteeJson?.employeeId) {\n const ind = this.formJson.deductees.findIndex((ch: any) => ch.employeeId === deducteeJson?.employeeId);\n this.formJson.deductees[ind] = deducteeJson\n } else {\n this.formJson.deductees.push(deducteeJson);\n }\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n \n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.openModal = false;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n } else if (event.action === \"submit\") {\n let filterEmployee = event.data.find((emp: any) => emp.referenceField === \"searchPerson\");\n let filterAddress = event.data.find((emp: any) => emp.referenceField === \"searchAddress\");\n if (filterEmployee.input) {\n try {\n let empl: any = await this.apiService.fetchDataAsPromise(`/employee/employeeDetail?apiRequestType=findOne&employeeId=${filterEmployee.input}`)\n let emp = empl.employee\n this.formJson[\"batch_header\"][\"responsible_person_name\"] = emp.fullName;\n this.formJson[\"batch_header\"][\"responsible_person_designation\"] = emp.workinfo.designation;\n this.formJson[\"batch_header\"][\"responsible_address1\"] = emp.addressinfo.currentaddress.address1;\n this.formJson[\"batch_header\"][\"responsible_address2\"] = emp.addressinfo.currentaddress.address2;\n this.formJson[\"batch_header\"][\"responsible_address3\"] = emp.addressinfo.currentaddress.city;\n this.formJson[\"batch_header\"][\"responsible_state\"] = this.getStateCodes(emp.addressinfo.currentaddress.state).tin;\n this.formJson[\"batch_header\"][\"responsible_pin\"] = emp.addressinfo.currentaddress.postalcode;\n this.formJson[\"batch_header\"][\"responsible_email\"] = emp.email;\n this.formJson[\"batch_header\"][\"mobile_number\"] = Number(emp.phone.slice(-10));\n this.formJson[\"batch_header\"][\"responsible_state_code\"] = emp.additionalContacts[0].stdCode;\n this.formJson[\"batch_header\"][\"responsible_telno\"] = emp.additionalContacts[0].telephoneNumber;\n this.formJson[\"batch_header\"][\"pan_of_responsible_person\"] = empl.finance.panNumber;\n } catch (error) {\n\n }\n }\n if (filterAddress.input) {\n let addr = this.settingsData?.addresses?.find((id: any) => id._id === filterAddress.input)\n this.formJson[\"batch_header\"][\"employer_branch\"] = addr.label;\n this.formJson[\"batch_header\"][\"employer_address1\"] = addr.line1;\n this.formJson[\"batch_header\"][\"employer_address2\"] = addr.line2;\n this.formJson[\"batch_header\"][\"employer_address3\"] = addr.city;\n this.formJson[\"batch_header\"][\"employer_state\"] = this.getStateCodes(addr.state).tin;\n this.formJson[\"batch_header\"][\"employer_pin\"] = addr.zip;\n this.formJson[\"batch_header\"][\"employer_email\"] = addr.email;\n this.formJson[\"batch_header\"][\"employer_std_code\"] = (addr.stdCode);\n this.formJson[\"batch_header\"][\"employer_telno\"] = addr.telephoneNumber;\n }\n\n event.data.forEach((element: any) => {\n if (element?.referenceField) {\n this.assignByPath(this.formJson, element?.referenceField, element?.input)\n }\n });\n\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n \n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = formJsonData.json;\n })\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n\n } else if (event.action === \"save\") {\n let filterEmployee = event.data.find((emp: any) => emp.referenceField === \"searchPerson\");\n let filterAddress = event.data.find((emp: any) => emp.referenceField === \"searchAddress\");\n this.apiService.writeValue('patch', '/hrm/forms?formType=form24q', this.formJson, nxtLoaderId).subscribe({\n next: (savedData: any) => {\n this.tableData = {};\n setTimeout(()=>{ //SK12DEC25 settimeout to update table\n this.tableData = this.formJson;\n })\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n }\n }\n\n // SK05DEC25 assigning the nested loop JSON data\n assignByPath(obj: any, path: string, value: any) {\n const keys = path?.split('.');\n let current = obj;\n keys?.forEach((key, index) => {\n if (index === keys.length - 1) {\n current[key] = value; // Assign here\n } else {\n current[key] = current[key] || {}; // Create if missing\n current = current[key];\n }\n });\n }\n\n saveSuccess(event: any, key?: any, defaultMessage?: any) {\n this.alertService.messageOnPass('success', event, key, defaultMessage);\n }\n\n nxtButtonHandler(event: any) {\n }\n\n handleCalendarDate(event: any) {\n }\n\n handleCalendarEventDate(event: any) {\n }\n\n onClickEdit(card: any) {\n if (card.event) {\n if (card.event.buttonAction === \"edit\") {\n this.modalProperties = card.event.actionButtonProperties\n this.commonButtonClickEmit(this.modalProperties, card.card?.config?.configData ? card.card?.config?.configData : this.bookValue ? this.bookValue : card.card)\n }\n }\n }\n\n multiCheckEmit(event: any) {\n }\n\n currentSubTabNav(event: any) {\n }\n\n onSideNav(event: any) {\n }\n\n emitAttachmentClick(event: any) {\n }\n\n modalClose(event: any) {\n this.openModal = false;\n }\n\n // SK05DEC25 form24q data get\n async getFormData(fyYear: string, quarter: string) {\n try {\n this.tableData = undefined\n const datum = await this.apiService.fetchDataAsPromise(`/hrm/forms?formType=form24q&formId=${fyYear}_${quarter}&quarter=${quarter}&fyYear=${fyYear}`, 'getFormData');\n const defJS = this.defaultFormJson;\n let formJS = this.globalValueService.deepMerge(defJS, datum?.forms?.json);\n this.formJson = formJS;\n // let formJS = { ...defJS, ...datum?.forms?.json };\n // this.formJson = datum?.forms?.json;\n this.tableData = this.formJson;\n this.tableData = {};\n setTimeout(()=>{//SK12DEC25 settimeout to update table\n this.tableData = this.formJson;\n })\n this.tabDataService.setCachedData(this.nxtTabName, this.bookValue, this.nxtCompID)\n } catch (error) {\n }\n }\n // SK05DEC25 Submit form 24Q\n submitButtonLoader : boolean = false;\n async submitClick(from: string) {\n if (from === 'submit24Q') {\n const data = {\n \"json\": {\n \"file_header\": this.formJson.file_header,\n \"batch_header\": this.formJson.batch_header,\n \"challans\": this.formJson.challans,\n \"deductees\": this.formJson.deductees,\n\n },\n \"csiBase64\": this.formJson?.csiFileNXT?.[0]?.doc?.split(',')[1] || \"\"\n }\n this.submitButtonLoader = true;\n this.apiService.writeValue('post', '/hrm/forms?apiType=form24q', data).subscribe({\n next: (savedData: any) => {\n this.submitButtonLoader = false;\n this.saveSuccess('Save Success', 'Save Success');\n const file = new Blob([savedData.data], { type: 'fvu' }); // This matches the content type of the response\n saveAs(file, '24Q_Export_' + new Date().toLocaleDateString() + '.fvu'); //name should be dynamic\n },\n error: (err: any) => {\n this.submitButtonLoader = false;\n this.errorHandler.handleError(err);\n let err1 = JSON.parse(err?.message)?.error?.content\n const blob = new Blob([err1], { type: 'text/plain' });\n saveAs(blob, 'Error_' + new Date().toLocaleDateString() + '.txt'); //name should be dynamic\n }\n })\n } else {\n let formJsonData = {\n financialYear: this.selectedFYData,\n quarter: this.selectedQuarterData,\n json: this.formJson,\n formId: `${this.selectedFYData}_${this.selectedQuarterData}`\n }\n this.apiService.writeValue('post', '/hrm/forms?formType=form24q', formJsonData).subscribe({\n next: (savedData: any) => {\n this.saveSuccess(savedData.message, savedData.TRANS_KEY);\n },\n error: (err: HttpErrorResponse) => {\n this.errorHandler.handleError(err);\n }\n })\n }\n }\n\n // SK05DEC25 state codes return\n getStateCodes(stateText: string) {\n const arr = [\n { state: [\"Andhra Pradesh\", \"AP\"], code: \"AP\", tin: 37 },\n { state: [\"Arunachal Pradesh\", \"AR\"], code: \"AR\", tin: 12 },\n { state: [\"Assam\", \"AS\"], code: \"AS\", tin: 18 },\n { state: [\"Bihar\", \"BR\"], code: \"BR\", tin: 10 },\n { state: [\"Chhattisgarh\", \"CG\", \"Chattisgarh\"], code: \"CG\", tin: 22 },\n { state: [\"Goa\", \"GA\"], code: \"GA\", tin: 30 },\n { state: [\"Gujarat\", \"GJ\"], code: \"GJ\", tin: 24 },\n { state: [\"Haryana\", \"HR\"], code: \"HR\", tin: 6 },\n { state: [\"Himachal Pradesh\", \"HP\"], code: \"HP\", tin: 2 },\n { state: [\"Jharkhand\", \"JH\"], code: \"JH\", tin: 20 },\n { state: [\"Karnataka\", \"KA\"], code: \"KA\", tin: 29 },\n { state: [\"Kerala\", \"KL\"], code: \"KL\", tin: 32 },\n { state: [\"Madhya Pradesh\", \"MP\"], code: \"MP\", tin: 23 },\n { state: [\"Maharashtra\", \"MH\"], code: \"MH\", tin: 27 },\n { state: [\"Manipur\", \"MN\"], code: \"MN\", tin: 14 },\n { state: [\"Meghalaya\", \"ML\"], code: \"ML\", tin: 17 },\n { state: [\"Mizoram\", \"MZ\"], code: \"MZ\", tin: 15 },\n { state: [\"Nagaland\", \"NL\"], code: \"NL\", tin: 13 },\n { state: [\"Odisha\", \"Orissa\", \"OD\", \"OR\"], code: \"OD\", tin: 21 },\n { state: [\"Punjab\", \"PB\"], code: \"PB\", tin: 3 },\n { state: [\"Rajasthan\", \"RJ\"], code: \"RJ\", tin: 8 },\n { state: [\"Sikkim\", \"SK\"], code: \"SK\", tin: 11 },\n { state: [\"Tamil Nadu\", \"Tamilnadu\", \"TN\"], code: \"TN\", tin: 33 },\n { state: [\"Telangana\", \"TS\", \"TG\"], code: \"TS\", tin: 36 },\n { state: [\"Tripura\", \"TR\"], code: \"TR\", tin: 16 },\n { state: [\"Uttar Pradesh\", \"UP\"], code: \"UP\", tin: 9 },\n { state: [\"Uttarakhand\", \"UK\", \"UA\", \"Uttaranchal\"], code: \"UK\", tin: 5 },\n { state: [\"West Bengal\", \"WB\"], code: \"WB\", tin: 19 },\n { state: [\"Andaman and Nicobar Islands\", \"AN\"], code: \"AN\", tin: 35 },\n { state: [\"Chandigarh\", \"CH\"], code: \"CH\", tin: 4 },\n { state: [\"Dadra and Nagar Haveli and Daman and Diu\", \"DNHDD\", \"DNH\", \"DD\"], code: \"DH\", tin: 26 },\n { state: [\"Lakshadweep\", \"LD\"], code: \"LD\", tin: 31 },\n { state: [\"Delhi\", \"DL\", \"NCT\", \"New Delhi\"], code: \"DL\", tin: 7 },\n { state: [\"Puducherry\", \"Pondicherry\", \"PY\"], code: \"PY\", tin: 34 },\n { state: [\"Jammu and Kashmir\", \"JK\"], code: \"JK\", tin: 1 },\n { state: [\"Ladakh\", \"LA\"], code: \"LA\", tin: 38 }\n ]\n\n let code = arr.find((st:any)=> st.state.includes(stateText));\n if(code){\n return code\n } else{\n return { state: undefined, code: \"\", tin: undefined }\n }\n }\n}","<div class=\"flex justify-content-between\">\n <div>\n <!-- SK05DEC25 MR 09NOV26 Standardize sub-nav tabs with modern underline indicator -->\n <ul class=\"nav sub-nav-head tab-view-buttons w-100\" role=\"tablist\">\n <li class=\"nav-item\" role=\"presentation\" *ngFor=\"let tab of tabs; let i = index\">\n <button type=\"button\"\n class=\"nav-link sub-nav\"\n [class.active]=\"eachTypeOfTab === tab.name\"\n role=\"tab\"\n [attr.aria-selected]=\"eachTypeOfTab === tab.name\"\n (click)=\"currentTabNav(tab)\">\n <span class=\"sub-tab-text\">\n {{tab.labelPath || tab.label | customTranslate : tab.label }}\n </span>\n </button>\n </li>\n </ul>\n </div>\n <div class=\"flex ms-2\">\n <!-- SK05DEC25 FY dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"fyList\" [selectedData]=\"selectedFYData\" dropDownHeight=\"32px\"\n dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\"\n dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'fyYear')\">\n </app-drop-down>\n <!-- SK05DEC25 Quarter Dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"['Q1', 'Q2', 'Q3', 'Q4']\" [selectedData]=\"selectedQuarterData\"\n dropDownHeight=\"32px\" dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\"\n dropBorderRadius=\"5px\" dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'quarter')\">\n </app-drop-down>\n <!-- SK05DEC25 Submit Form24Q button -->\n <div class=\"align-self-center me-3\">\n <app-fusion-button [buttonValue]=\" 'APP_HRM_PAYROLL_FORM24Q.SUBMIT_24Q' | customTranslate : 'Submit 24Q' \"\n (buttonClickEmit)=\"submitClick('submit24Q')\" [buttonLoadingSpinner]=\"submitButtonLoader\">\n </app-fusion-button>\n </div>\n </div>\n</div>\n\n\n<div class=\"row\">\n <ng-container *ngFor=\"let comp of components; let j=index\">\n <!-- {{comp._id}} -->\n <div class=\"{{comp.size}}\">\n <!-- SK05DEC25 button component -->\n <div *ngIf=\"comp.type === 'buttons'\" class=\"mb-1\" style=\"display: flex; justify-content: end;\">\n <app-fusion-button *ngFor=\"let button of comp?.config?.buttons\"\n (buttonClickEmit)=\"commonButtonClickEmit(button)\" [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\">\n </app-fusion-button>\n </div>\n <!-- SK05DEC25 table for challans -->\n <div *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'challans' \" class=\"comp-wrap mt-2\">\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\" [data]=tableData.challans\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 table for deductees and fetched deductees -->\n <div class=\"mb-3 comp-wrap mt-2\" *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'deductees' \" >\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0 || isLoading['syncDeductees']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\"\n [data]=\"comp.name === 'deducteeTable' ? tableData.deductees : tableData.fetchedDeductees \"\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 nxtpage for details/batchheader/fileheader -->\n <div *ngIf=\"comp.type === 'nxtPage'\">\n <lib-booklet *ngIf=\"!isLoading[comp._id] && !isLoading['getFormData']\" [bookletJSON]=\"comp.config.nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet>\n <div *ngIf=\"isLoading[comp._id]?.length > 0 || isLoading['getFormData']?.length > 0 || (modalProperties ? isLoading[modalProperties?._id]?.length > 0 : false)\" class=\"row my-1\">\n <div class=\"col-md-12\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- SK05DEC25 if condition to open modal -->\n<app-modal \n [modalTitle]=\"modalProperties?.modalTitlePath || modalProperties?.modalTitle || isLoading['deducteeSubmit']?.length > 0 || isLoading['challanSubmit']?.length > 0 || isLoading['detailSubmit']?.length > 0 || 'NXT BOOK' | customTranslate : modalProperties?.modalTitle\"\n [modalFooter]=\"modalProperties?.isModalFooter\" [saveButtonValue]=\"modalProperties?.modalSaveButtonValue\"\n [isModalOpen]=\"openModal\" (cancelButtonEmit)=\"modalClose($event)\" [modalSize]=\"modalProperties?.modalSize\">\n <div class=\"modal-body\">\n <div>\n <!-- <lib-booklet [bookletJSON]=\"nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet> -->\n <!-- SK24JUN24 language code update to nxt -->\n <app-browse [nxtJSON]=\"nxtJSON\" [modalProperties]=\"modalProperties\" [nxtEdit]=\"true\" [bookValue]=\"bookValue\"\n [languageCode]=\"languageCode\" (nxtFormHandlerEmit)=\"nxtFormHandler($event)\">\n </app-browse>\n </div>\n </div>\n</app-modal>","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'getValue',\n standalone: true\n})\nexport class GetValuePipe implements PipeTransform {\n\n // SK10APR24 pipe to get the value from object by passing the key\n transform(arg:any, element: any, column: any): any {\n const initialEl = element; // SK21DEC23 fixed table search issue\n let flds = column?.split('.');\n for(let i=0; i<flds?.length; i++){\n let splitFlds = flds[i].split('[');\n // SK18JUN24 validating number and text fields\n if(splitFlds.length === 1){\n if (element != null && element != undefined) {\n if(typeof element[flds[i]] === \"number\"){\n element = element[flds[i]] || 0 as any;\n } else if(typeof element[flds[i]] === \"boolean\"){\n element = element[flds[i]]; // SK21AUG24 for boolean type\n } else {\n //SC25DEC2025 existing behavior\n let value = element[flds[i]] || '' as any;\n\n //SC25DEC2025 format date strings DD/MM/YYYYY\n if (typeof value === 'string' && this.looksLikeDate(value)) {\n value = this.formatShortDate(value);\n }\n element = value;\n }\n }\n } else {\n let index = Number(splitFlds[1].split(']')[0]);\n if(typeof element[flds[i]] === \"number\"){\n element = element[splitFlds[0]][index] || 0 as any;\n } else if(typeof element[flds[i]] === \"boolean\"){\n element = element[flds[i]]; // SK21AUG24 for boolean type\n } else {\n element = element[splitFlds[0]][index] || '' as any; //SK 20DEC23 To solve undefined error\n }\n }\n }\n if (element != null && element != undefined) {\n Object.assign(initialEl, { [column]: element }); // HA 11-DEC-23 Fixed Expression changed issue\n }\n if (element === null || element === undefined || element === '') {\n return '';\n }\n return element;\n }\n\n//SC26DEC2025 detects most readable date formats\nprivate looksLikeDate(value: string): boolean {\n value = value.trim().replace(',', '');\n return (\n /^[0-9]{1,2}\\s+[A-Za-z]+\\s+[0-9]{4}$/i.test(value) || \n /^[A-Za-z]+\\s+[0-9]{1,2}\\s+[0-9]{4}$/i.test(value) || \n /^[A-Za-z]+\\s+[0-9]{4}$/i.test(value) \n );\n}\n\nprivate formatShortDate(value: string): string {\n value = value.replace(',', '').replace(/\\s+/g, ' ').trim();\n\n const short = (m: string) =>\n m.substring(0, 3).toLowerCase().replace(/^./, c => c.toUpperCase());\n\n //SC26DEC2025 day first: dd/mm/yyyy\n let m = value.match(/^([0-9]{1,2})\\s+([A-Za-z]+)\\s+([0-9]{4})$/i);\n if (m) {\n const day = m[1].padStart(2, '0');\n const monthShort = short(m[2]);\n const year = m[3];\n return `${day} ${monthShort} ${year}`;\n }\n\n //SC26DEC2025 mm/dd/yyyy\n m = value.match(/^([A-Za-z]+)\\s+([0-9]{1,2})\\s+([0-9]{4})$/i);\n if (m) {\n const day = m[2].padStart(2, '0');\n const monthShort = short(m[1]);\n const year = m[3];\n return `${day} ${monthShort} ${year}`;\n }\n\n // SC26DEC2025 — mm/yy\n m = value.match(/^([A-Za-z]+)\\s+([0-9]{4})$/i);\n if (m) {\n const monthShort = short(m[1]);\n const year = m[2];\n return `${monthShort} ${year}`;\n }\n return value;\n}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'editColumnCheck',\n standalone: true\n})\nexport class EditColumnCheckPipe implements PipeTransform {\n\n // SK10APR24 condition to check the edit column\n transform(arg:any, element: any, editCol: any): any {\n var returnVal = \"\";\n if(editCol.length > 0){\n if(typeof editCol[0] === 'string'){\n if(editCol.includes(element)) returnVal = \"string\";\n } else if(typeof editCol[0] === 'object'){\n returnVal = (editCol.filter((col:any)=>col.name === element)).length > 0 ? \"object\" : \"\";\n }\n }\n return returnVal \n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'editColumnType',\n standalone: true\n})\nexport class EditColumnTypePipe implements PipeTransform {\n // SK10APR24 to check the type of edit column in table\n transform(arg:any, element: any, editCol: any): any {\n var returnVal :any ;\n returnVal = (editCol.filter((col:any)=>col.name === element));\n return returnVal[0].type; \n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'editColumnDropdown',\n standalone: true\n})\nexport class EditColumnDropdownPipe implements PipeTransform {\n\n // SK10APR24 to check the data type of table value is dropdown\n transform(arg:any, element: any, editCol: any): any {\n var returnVal :any ;\n returnVal = (editCol.filter((col:any)=>col.name === element));\n return returnVal[0].values;\n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'totalColumSum',\n standalone: true\n})\nexport class TotalColumSumPipe implements PipeTransform {\n // SK16JUL24 to sum the column data\n\n transform(arg:any, data: any, cumulativeDataColumns: any, column:string): any {\n if(cumulativeDataColumns.includes(column)){\n const value = cumulativeDataColumns.includes(column) ? data?.reduce((accum: number, curr: any ) => (Number(this.currencyToNumber(accum))) + (Number(this.currencyToNumber(curr[column])) || 0), 0) : null;\n // return Number((value || 0).toFixed(2)).toFixed(2) //SK19JUL24 decimal fix in column sum\n return this.currencyReturn(value, \"INR\");\n } else {\n return ''\n }\n \n\n \n }\n\n /** SK25JUL24 This function will convert a sting to number, for converting rupees to numbers */\n currencyToNumber(data:any){\n // const removeComma = data?.replace(/\\,/g, '') // to remove commas from the string\n // return Number(removeComma.substring(1));\n if(data && typeof data === 'string'){\n const removeComma = Number(data?.replace(/[^0-9.-]+/g,\"\"));\n return Number(removeComma);\n } else if(data && typeof data === 'number'){\n return Number(data);\n } {\n return 0\n }\n }\n\n currencyReturn(rupee: number, code:string){\n let formatter = new Intl.NumberFormat(navigator.language, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n });\n const amt = formatter.format(rupee);\n return `${amt}`;\n }\n\n}\n","import { Injectable, ChangeDetectorRef, EventEmitter } from '@angular/core';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\nimport { LangChangeEvent, TranslateService } from '@ngx-translate/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CustomPaginatorIntl extends MatPaginatorIntl {\n public labelChange: EventEmitter<void> = new EventEmitter<void>(); // Define the labelChange event\n\n constructor(private translate: TranslateService, private cdr: ChangeDetectorRef) {\n super();\n this.updateTranslations(); // Initialize translations\n\n // Subscribe to language changes\n this.translate.onLangChange.subscribe((event: LangChangeEvent) => {\n this.updateTranslations(); // Update translations\n this.labelChange.emit(); // Emit the label change event\n this.cdr.detectChanges(); // Trigger change detection\n });\n }\n\n private updateTranslations() {\n if(this.translate.instant('APP.ITEMS_PER_PAGE') === \"APP.ITEMS_PER_PAGE\"){\n this.itemsPerPageLabel = \"Item per page\";\n }else{\n this.itemsPerPageLabel = this.translate.instant('APP.ITEMS_PER_PAGE')\n }\n this.nextPageLabel = this.translate.instant('NEXT_PAGE');\n this.previousPageLabel = this.translate.instant('PREVIOUS_PAGE');\n this.firstPageLabel = this.translate.instant('FIRST_PAGE');\n this.lastPageLabel = this.translate.instant('LAST_PAGE');\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'customDate',\n standalone: true\n})\nexport class CustomDatePipe implements PipeTransform {\n\n transform(value: any, type: 'date' | 'datetime' | 'time' = 'date'): any {\n\n const date = new Date(value);\n\n if (isNaN(date.getTime())) {\n return value;\n }\n\n const day = String(date.getDate()).padStart(2, '0');\n const month = date.toLocaleString('en-US', { month: 'short' });\n const year = date.getFullYear();\n\n const time = date.toLocaleString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n\n if (type === 'date') {\n return `${day} ${month} ${year}`;\n }\n\n if (type === 'time') {\n return time;\n }\n\n if (type === 'datetime') {\n return `${day} ${month} ${year} ${time}`;\n }\n\n return value;\n }\n}","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'customTime',\n pure: false,\n standalone: true\n})\nexport class CustomTimePipe implements PipeTransform {\n\n transform(value: any, timeFormat: string = 'HH:mm'): any {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n const date = new Date(value);\n\n // Check if the input is a valid time\n if (isNaN(date.getTime())) {\n return value; // Return the original value if invalid\n }\n\n // Extract hours and minutes from the valid time\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n return `${hours}:${minutes}`; // Return the formatted time\n }\n}","// scroll.service.ts\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ScrollService {\n private scrollPositionSubject = new BehaviorSubject<number>(0);\n scrollPosition$ = this.scrollPositionSubject.asObservable();\n\n setScrollPosition(position: number): void {\n this.scrollPositionSubject.next(position);\n }\n}\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Component, OnInit, ViewChild, Input, Output, EventEmitter, ElementRef, HostListener, isDevMode, ViewChildren, QueryList, ChangeDetectorRef, SimpleChanges, ChangeDetectionStrategy, OnChanges } from '@angular/core';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSortModule, MatSort } from '@angular/material/sort';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { CommonModule } from '@angular/common';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { SearchFilterComponent } from '../search-filter/search-filter.component';\nimport { FusionButtonComponent } from '../fusion-button/fusion-button.component';\nimport { PopoverComponent } from '../popover/popover.component';\nimport { Constants } from \"../../models/Constants\";\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Subscription } from 'rxjs';\nimport { GlobalValuesService } from \"../../services/global-values.service\";\nimport { GetValuePipe } from \"../../pipes/get-value.pipe\";\nimport { EditColumnCheckPipe } from \"../../pipes/data-table/edit-column-check.pipe\";\nimport { EditColumnTypePipe } from \"../../pipes/data-table/edit-column-type.pipe\";\nimport { EditColumnDropdownPipe } from \"../../pipes/data-table/edit-column-dropdown.pipe\";\nimport { LangChangeEvent, TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { TotalColumSumPipe } from \"../../pipes/data-table/total-colum-sum.pipe\";\nimport { CommonScreenComponent } from '../side-screen/common-screen/common-screen.component';\nimport { MultiCheckboxComponent } from '../multi-checkbox/multi-checkbox.component';\nimport { MultipleFilterComponent } from '../multiple-filter/multiple-filter.component';\nimport { CustomTranslatePipe } from \"../../pipes/custom-translate.pipe\";\nimport { CustomPaginatorIntl } from \"../../shared/custom-paginator-intl\";\nimport { ApiService } from \"../../services/api.service\";\nimport { saveAs } from 'file-saver';\nimport { AlertService } from \"../../services/alert.service\";\nimport { ErrorHandlerService } from \"../../services/error-handler.service\";\nimport { FileUploadComponent } from '../file-upload/file-upload.component';\nimport { CustomDatePipe } from \"../../pipes/custom-date.pipe\";\nimport { CustomTimePipe } from \"../../pipes/custom-time.pipe\";\nimport { LoaderService } from \"../../services/loading.service\";\nimport { Overlay, OverlayModule, ScrollStrategy } from '@angular/cdk/overlay';\nimport { PaginationComponent } from '../pagination/pagination.component';\nimport { ScrollService } from \"../../services/scroll.service\";\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { DropDownComponent } from '../drop-down/drop-down.component';\n@Component({\n selector: 'app-data-table, app-data-table-two',\n templateUrl: './data-table.component.html',\n imports: [\n CommonModule,\n MatTableModule,\n MatPaginatorModule,\n MatSortModule,\n MatCheckboxModule,\n ReactiveFormsModule,\n FormsModule,\n SearchFilterComponent,\n FusionButtonComponent,\n PopoverComponent,\n MatTooltipModule,\n GetValuePipe,\n EditColumnCheckPipe,\n EditColumnTypePipe,\n EditColumnDropdownPipe,\n TranslateModule,\n TotalColumSumPipe,\n CommonScreenComponent,\n MultiCheckboxComponent,\n MultipleFilterComponent,\n CustomTranslatePipe,\n FileUploadComponent, //SKS25OCT24\n CustomDatePipe, //SKS21NOV24\n CustomTimePipe, //SKS21NOV24\n OverlayModule, //SKS24JAN25\n PaginationComponent, //SKS24JAN25\n DropDownComponent\n ],\n styleUrls: ['./data-table.component.css'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: MatPaginatorIntl, useClass: CustomPaginatorIntl }] // Provide the custom paginator\n})\n\nexport class DataTableComponent implements OnInit {\n @Input () data!: any[]; // get data that to be displayed in a array\n @Input () displayedColumns: Array<string> = []; // get columns values to display\n @Input () headerLabels!: string[]; // columns porper label that to be displayed in header\n @Input () translatePath!: any;\n // MY 22OCT26 Input getters and setters to ensure array properties are never null/undefined and prevent change-detection runtime errors\n private _hyperLinkColumns: Array<string> = [];\n @Input() set hyperLinkColumns(val: any) {\n this._hyperLinkColumns = Array.isArray(val) ? val : [];\n }\n get hyperLinkColumns(): Array<string> {\n return this._hyperLinkColumns;\n }\n @Input () withCheckBox: boolean = false; // get if with or without checkbox in table\n @Input () searchBar = false; // if it is true, the search bar will be displayed on table\n private _editColumn: Array<any> = [];\n @Input() set editColumn(val: any) {\n this._editColumn = Array.isArray(val) ? val : [];\n }\n get editColumn(): Array<any> {\n return this._editColumn;\n }\n @Input () notes: String = '';\n private _filterColumns: Array<any> = [];\n @Input() set filterColumns(val: any) {\n this._filterColumns = Array.isArray(val) ? val : [];\n }\n get filterColumns(): Array<any> {\n return this._filterColumns;\n }\n @Input () tableSaveButton = false; // save button for editing LOP in payroll table, SK13MAR24 changed name from 'saveLOP'\n // MR 09NOV26 Support polymorphic stickyColumn (boolean flag or array of column names)\n private _stickyColumn: boolean = false;\n\n @Input()\n set stickyColumn(val: boolean | Array<any>) {\n if (Array.isArray(val)) {\n this.stickyColumns = val;\n this._stickyColumn = val.length > 0;\n } else {\n this._stickyColumn = !!val;\n }\n }\n get stickyColumn(): boolean | Array<any> {\n return this.stickyColumns?.length > 0 ? this.stickyColumns : this._stickyColumn;\n }\n @Input () tableWidth = '100%'; // width of table can be adjusted from parent, by default it is 100%\n @Input () actionColumHeader = 'APP.ACTION'; // to change the header for action column\n @Input () multipleFilter : any;\n @Input () actionButton:boolean = false; //to show button colum as action\n @Input () fromWhere:string = ''; // to show the different action buttons based on the component like If I provide 'expense' will show te expense action button only\n @Input () receiptImg:boolean = false; // to implement receipt icon in approval-expense;\n @Input () titleOn= false; // to include titles for the table;\n @Input () title:any;// the title for the table;\n @Input () isButtons:any;// is button present in table;\n @Input () buttonArray:any;// buttons to be displayed;\n @Input () list:any;\n @Input () selectedData:any;\n @Input () isDatePicker:boolean = false;\n @Input () tableId:any;\n @Input () isEditRow = false;\n @Input () isDeleteRow = false;\n @Input () addInlineRecord = false; //SK23FEB24 \n @Input () inlineElement:any //SK23FEB24\n @Input () editIconTooltip : any //SK27FEB24\n @Input () viewIcon = false; //SK02APR24\n @Input () downloadIcon = false; //SK02APR24\n @Input () cumulativeDataColumns! : Array<any>; //SK16JUL24\n @Input () filterDataArray:any //MV24AUG24 Receives input data for Tab\n @Input () tableCallDetails:any;\n @Input () totalRecords!: number;\n @Input () filterScreenConfigs :any\n @Input () exportFieldsListConfigs : any;\n @Input () exportFilterListConfigs : any;\n @Input () moudleName : any; //SKS25OCT24 for table name\n @Input () pageSize: any = 10; //SK01NOV24\n @Input () pageIndex: any = 0 ; //SK01NOV24\n @Input () tableConfigurations: any; //SK06NOV24\n @Input () actionButtonCondition: any; //SKS16NOV24\n @Input () dateColumns: any; //SKS18NOV24\n @Input () timeColumns: any; //SKS18NOV24\n @Input () searchConfigs: any;\n @Input () sideScreenColumn: any;\n @Input () sendButton:any; //SKS23DEC24\n @Input () deactiveButton:any; //SKS25DEC24\n @Input () activeButton:any;//SKS25DEC24\n @Input () cloneButton:any;//SKS25DEC24\n @Input () objectColumns: any; //SKS7JAN25\n @Input() buttonLoadingSpinner:boolean = false; //SK04SEP25 delete button loader\n @Input() tableSaveLoadingSpinner:boolean = false; //SK29OCT25\n // MY 22OCT26 Input getter and setter for stickyColumns to prevent undefined access\n private _stickyColumns: Array<any> = [];\n @Input() set stickyColumns(val: any) {\n this._stickyColumns = Array.isArray(val) ? val : [];\n }\n get stickyColumns(): Array<any> {\n return this._stickyColumns;\n }\n @Input () searchTextValue : string = \"\" ; //SK29OCT25\n @Input () dropdownSelectedData : any;\n @Input () dropdownLists : any;\n @Input () dateDropdown : boolean = false;\n @Input() from: any;\n\n // MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\n @Input() isSandwichLeave: boolean = false;\n @Input() isCheckButton: boolean = false;\n @Input() monthArray: any;\n @Input() yearArray: any;\n @Input() year: any;\n @Input() month: any;\n @Input() button: any;\n @Input() exportDisable: boolean = true;\n @Input() defaultWorkingHours: number = -1;\n @Input() set saveLOP(val: boolean) {\n this.tableSaveButton = val;\n }\n get saveLOP(): boolean {\n return this.tableSaveButton;\n }\n @Input() isAttendanceTable: boolean = false;\n // MR 09NOV26 Allow external control of table loading state (e.g., AttendanceHrmComponent)\n @Input() isLoading: boolean = false;\n\n\n @Output() dateEmit = new EventEmitter<any>();\n @Output() selectedValues = new EventEmitter<any[]>(); // to pass the selected checkbox values\n @Output() tableRowClick = new EventEmitter<any>; // datas to be passed when table row is clicked\n @Output() rowClick = new EventEmitter<any>; // MR 09NOV26 alias for tableRowClick\n @Output() filteredArray = new EventEmitter<any>; // filtered data from heqder icon is sent in an array\n @Output() searchFilterData = new EventEmitter<any>; // search filter data from search bar is sent to its parent\n @Output() searchValueChange = new EventEmitter<any>; // MR 09NOV26 search filter value change\n @Output() onEditData = new EventEmitter<any>;\n @Output() onCloneData = new EventEmitter<any>; //SKS25DEC24\n @Output() onSendData = new EventEmitter<any>; //SKS25DEC24\n @Output() onActivateData = new EventEmitter<any>; //SKS25DEC24\n @Output() onDeactivateData = new EventEmitter<any>; //SKS25DEC24\n @Output() onToggleChange = new EventEmitter<any>;\n @Output() saveButtonData = new EventEmitter<any>;\n @Output() OnDeleteData = new EventEmitter<any>; // when delete button clicked pass the data\n @Output() onDownload = new EventEmitter<any>; // when download button is clicked to pass the data\n @Output() approveData = new EventEmitter<{empId:any,id:any, data:any}>; //emit when apporve the leave \n @Output() rejectData = new EventEmitter<{empId:any,id:any}>; // emit when reject the leave\n @Output() expenseAttachmentEmit = new EventEmitter<any>;\n @Output() commonButtonClickEmit = new EventEmitter<any>;\n @Output() hyperLinkColumnEmit = new EventEmitter<any>;\n @Output() viewIconEmit = new EventEmitter<any>;\n @Output() downloadIconEmit = new EventEmitter<any>;\n @Output() pageDetails = new EventEmitter<any>;\n @Output() importButton = new EventEmitter<any>;\n @Output() exportButton = new EventEmitter<any>;\n @Output() sideNavButtons = new EventEmitter<any>;\n @Output() exportReports = new EventEmitter<any>;\n @Output() multipleSelectFilterExport = new EventEmitter<any>;\n @Output() filterDateEmitEvt : EventEmitter<any> = new EventEmitter<any>();\n @Output() sideNavEmit =new EventEmitter<{data:any,col:any, config:any}>; //SKS9JAN25 rightnav column emit\n @Output() searchText =new EventEmitter<string>; //SK29OCT25\n @Output() dropdownDataEmit = new EventEmitter<any>;\n // MR 09NOV26 Attendance and toolbar event emitters\n @Output() checkClicked = new EventEmitter<any>();\n @Output() yearDataEmit = new EventEmitter<any>();\n @Output() selectedValueEmit = new EventEmitter<any>();\n @Output() monthDataEmit = new EventEmitter<any>();\n @Output() doubleClickEmit = new EventEmitter<any>();\n @Output() hyperLinkClickEmit = new EventEmitter<any>();\n @Output() tableParamsChange = new EventEmitter<any>();\n\n\n \n @ViewChild(\"paginator\") paginator!: MatPaginator; //get references to the MatPaginator and MatSort components\n @ViewChild(MatSort) sort!: MatSort;\n @ViewChild('editInput') editInput!: ElementRef\n @ViewChild('tablePaginator') tablePaginator! : ElementRef;\n @ViewChildren('editColElement', { read: ElementRef }) editColElement!: QueryList<any>;\n\n selection: any;\n stickyCondition!: number;\n searchFilter = false;\n filterArray: Array<any> = [];\n selectedFilter: any;\n filterCheckBox: any;\n selectedFilterColumn: any;\n selectedFilterKey: Array<any> = [];\n renderColumns: string = 'displayedColumns';\n isDevMode: boolean = false;\n itemsPerPage = Constants.PAGE_SIZE_OPTIONS;\n dataSource!: MatTableDataSource<any>; // Declare a MatTableDataSource property for the table data.\n tableServiceData!: Subscription; //SK23FEB24 to detech table data changes\n exportSidescreen:boolean = false;\n headerTranslateLabels: any;\n exportReportsData: any; //SKS25OCT24\n uploadModal: boolean = false\n templateDownlaod = Constants.DOWNLOAD_TEMPLATE;\n errorMessage = '';\n importButtonData : any\n @Input() exportButtonLoadingSpinner: boolean = false; // MY 15OCT26 export file button loader\n @Input () pageTotal:any = 100;\n totalCount!:number\n type:any;\n conditionDeleteButton:any; //SKS21NOV24\n conditionEditButton:any; //SKS23DEC24\n conditionSendButton:any; //SKS25DEC24\n conditionDeactivateButton:any; //SKS25DEC24\n conditionActivateButton:any; //SKS25DEC24\n conditionCloneButton:any; //SKS25DEC24\n searchBoxValue: any;\n infoData: any;\n infoSidescreen = false;\n prevSearch: any;\n // MR 09NOV26 Support internal service loader states alongside external isLoading boolean input\n loaderLoadingStates: Record<string, string[]> = {};\n get isTableLoading(): boolean {\n if (this.isLoading === true) {\n return true;\n }\n if (this.tableId && this.loaderLoadingStates?.[this.tableId]?.length > 0) {\n return true;\n }\n if (this.tableId && typeof this.isLoading === 'object' && (this.isLoading as any)?.[this.tableId]?.length > 0) {\n return true;\n }\n return false;\n }\n activeColumn: string | null = null; //SKS31JAN25 Track the active column\n private scrollSubscription!: Subscription; //SKS4FEB25 Scroll Service Subscription \n tablePageSubscription!: Subscription; //SK10OCT25\n isChecked: boolean = false;\n constructor(private scrollService: ScrollService, private overlay: Overlay ,private globalValues:GlobalValuesService, private apiService: ApiService, private alertService: AlertService, private errorHandler: ErrorHandlerService, private loaderService: LoaderService, public cdr: ChangeDetectorRef) { // MY 15OCT26 make cdr public for external change detection\n //SK10OCT25 page retain on data save\n this.tablePageSubscription = this.globalValues.tablPageParamsValue$.subscribe((data:any)=>{\n this.pageParams(data)\n })\n }\n\n // MY 15OCT26 trigger change detection on data-table and child components\n triggerChangeDetection() {\n this.cdr.markForCheck();\n this.cdr.detectChanges();\n }\n\n ngOnChanges(changes: SimpleChanges){\n // MY 22OCT26 Defensive array normalization to prevent template TypeError on undefined columns\n this.hyperLinkColumns = Array.isArray(this.hyperLinkColumns) ? this.hyperLinkColumns : [];\n this.stickyColumns = Array.isArray(this.stickyColumns) ? this.stickyColumns : [];\n this.editColumn = Array.isArray(this.editColumn) ? this.editColumn : [];\n this.filterColumns = Array.isArray(this.filterColumns) ? this.filterColumns : [];\n this.dateColumns = Array.isArray(this.dateColumns) ? this.dateColumns : [];\n this.timeColumns = Array.isArray(this.timeColumns) ? this.timeColumns : [];\n this.sideScreenColumn = Array.isArray(this.sideScreenColumn) ? this.sideScreenColumn : [];\n this.objectColumns = Array.isArray(this.objectColumns) ? this.objectColumns : [];\n\n // MR 09NOV26 Ensure OnPush change detection marks for check on isLoading updates\n if (changes['buttonLoadingSpinner'] || changes['tableSaveLoadingSpinner'] || changes['isLoading']) {\n this.cdr.markForCheck();\n }\n // MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui: Attendance & Month-Year sync\n if (changes['month']?.currentValue) {\n this.selectedMonth = this.getMonthNumber(changes['month']?.currentValue);\n }\n if (changes['year']?.currentValue) {\n this.selectedYear = Number(changes['year']?.currentValue) || this.selectedYear;\n }\n if (changes['headerLabels'] || changes['displayedColumns']) {\n this.updateDateLookups();\n }\n // SK01NOV24 pagination in table, getting pageSize and pageIndez form local storage\n this.dataSource = new MatTableDataSource(this.data);\n this.selection = new SelectionModel<any>(true, []);\n this.filterCheckBox = new SelectionModel<any>(true, []);\n if(!this.totalRecords && this.data){\n // SK10OCT25 page retain on save\n if(this.pageSize && this.pageIndex){\n const start = (Number(this.pageIndex) - 1) * Number(this.pageSize);\n const end = start + Number(this.pageSize);\n this.dataSource.data = this.data?.slice(start, end);\n } else {\n this.dataSource.data = this.data?.slice(0, 10);\n }\n \n }\n setTimeout(() => {\n this.dataSource.sort = this.sort;\n },100)\n // SK29OCT25 to retain search filter value on page navigate\n if(this.searchTextValue){\n this.searchBoxValue = this.searchTextValue;\n this.dataSource.data = this.data;\n this.dataSource.filter = this.searchTextValue.trim().toLowerCase();\n this.dataSource.data = this.dataSource.filteredData;\n this.totalCount = this.dataSource.filteredData.length;\n } else {\n this.totalCount = this.totalRecords || this.data?.length;\n }\n\n if (this.stickyColumn === true && this.displayedColumns) {\n this.stickyCondition = this.displayedColumns?.length;\n } else {\n this.stickyCondition = this.displayedColumns?.length + 1;\n }\n // SK13MAR24\n if(this.withCheckBox && this.actionButton){\n this.renderColumns = 'both';\n } else if(this.withCheckBox){\n this.renderColumns = 'select';\n } else if(this.actionButton){\n this.renderColumns = 'tableAction'; //SK19MAR25\n } \n if (this.searchConfigs?.searchFilterVal) {\n this.searchBoxValue = this.searchConfigs?.searchFilterVal; // Show value in the search box\n this.prevSearch = this.searchConfigs?.searchFilterVal;\n }\n // SKS21NOV24 Check and assign the delete button condition if it exists.\n this.conditionDeleteButton=undefined\n this.conditionEditButton=undefined\n this.conditionSendButton=undefined\n this.conditionActivateButton=undefined\n this.conditionDeactivateButton=undefined\n this.conditionCloneButton=undefined\n if(this.actionButtonCondition){\n this.actionButtonCondition.forEach((button: any)=>{\n if(button.actionButton === \"delete\"){\n this.conditionDeleteButton = button\n }\n if(button.actionButton === \"edit\"){ //SKS25DEC24 edit button config get\n this.conditionEditButton = button\n }\n if(button.actionButton === \"send\"){ //SKS25DEC24 send button config get\n this.conditionSendButton = button\n }\n if(button.actionButton === \"deactivate\"){ //SKS25DEC24 deactive button config get\n this.conditionDeactivateButton = button\n }\n if(button.actionButton === \"active\"){ //SKS25DEC24 active button config get\n this.conditionActivateButton = button\n }\n if(button.actionButton === \"clone\"){ //SKS25DEC24 clone button config get\n this.conditionCloneButton = button\n }\n })\n } \n\n // SK04SEP25 button loader check\n if(changes[\"buttonLoadingSpinner\"]){\n this.buttonLoadingSpinner = changes[\"buttonLoadingSpinner\"].currentValue\n }\n if(changes[\"deleteModal\"]){\n this.deleteModal = changes[\"deleteModal\"].currentValue\n }\n }\n\n ngOnInit(): void {\n // SKS4FEB25 if scroll event emit then searchFilter close\n this.scrollSubscription = this.scrollService.scrollPosition$.subscribe(position => {\n if(position > 0) {\n this.searchFilter = false\n }\n });\n // MSM28JAN25 MR 09NOV26 subscribe the loader value and update loaderLoadingStates\n this.loaderService.loading.subscribe((loadingStates) => {\n this.loaderLoadingStates = loadingStates;\n if (typeof this.isLoading === 'object') {\n this.isLoading = loadingStates as any;\n }\n this.cdr.markForCheck();\n });\n // this.isDevMode = isDevMode();\n // // The dataSource property is set to a new MatTableDataSource instance that contains table data\n // // Create a new selection model that allows multiple items to be selected\n this.dataSource = new MatTableDataSource(this.data);\n if(!this.totalRecords && this.data){\n // SK10OCT25\n if(this.pageSize && this.pageIndex){\n const start = (Number(this.pageIndex) - 1) * Number(this.pageSize);\n const end = start + Number(this.pageSize);\n this.dataSource.data = this.data?.slice(start, end);\n } else {\n this.dataSource.data = this.data?.slice(0, 10);\n }\n }\n this.selection = new SelectionModel<any>(true, []);\n this.filterCheckBox = new SelectionModel<any>(true, []);\n setTimeout(() => {\n this.dataSource.sort = this.sort;\n },0)\n\n // SK29OCT25 retain search filter value\n if(this.searchTextValue){\n this.searchBoxValue = this.searchTextValue;\n this.dataSource.data = this.data;\n this.dataSource.filter = this.searchTextValue.trim().toLowerCase();\n this.dataSource.data = this.dataSource.filteredData;\n this.totalCount = this.dataSource.filteredData.length;\n } else {\n this.totalCount = this.totalRecords || this.data?.length;\n }\n\n if (this.stickyColumn === true && this.displayedColumns) {\n this.stickyCondition = this.displayedColumns?.length;\n } else {\n this.stickyCondition = this.displayedColumns?.length + 1;\n }\n if(this.withCheckBox && this.actionButton){\n this.renderColumns = 'both';\n } else if(this.withCheckBox){\n this.renderColumns = 'select';\n } else if(this.actionButton){\n this.renderColumns = 'tableAction'; //SK19MAR25\n }\n }\n ngOnDestroy(): void {\n if (this.scrollSubscription) {\n this.scrollSubscription.unsubscribe();\n }\n }\n createScrollStrategy(): ScrollStrategy {\n return this.overlay.scrollStrategies.close();\n }\n // closing the filter component when the mouse is clicked outside table\n @HostListener('document:click', ['$event']) onDocumentClick(event: any) {\n this.searchFilter = false;\n event.stopPropagation(); // prevents any other default action\n }\n clearCheckBox(){\n this.selection.clear();\n }\n\n // filter data that to be displayed in header filter icon is passed in 'filterArray' array\n filter(datas: any) {\n this.filterArray = [];\n this.selectedFilter = datas;\n this.filterArray = this.multipleFilter[datas];\n this.searchFilter = !this.searchFilter;\n this.selectedFilterColumn = datas\n // MV24AUG24 Determines the data source and updates the active filter box with the corresponding filter data and selected box.\n this.globalValues.activeFilterBox({filterKeys:this.filterDataArray,activeBox:datas}) \n }\n // SK01NOV24 emitting pagr size and index to parent on paginating\n pageParams(event:any){\n if(!this.totalRecords && this.data){\n const start = (Number(event.pageIndex) - 1) * Number(event.pageSize);\n const end = start + Number(event.pageSize);\n this.dataSource.data = this.data?.slice(start, end);\n }\n localStorage.setItem(\"tablePageSize\",event.pageSize);\n localStorage.setItem(\"tablePageIndex\",event.pageIndex);\n this.pageSize = event.pageSize; //SK10OCT25\n this.pageIndex = event.pageIndex; //SK10OCT25\n const datum:any = {pageSize:event.pageSize, pageIndex:Number(event.pageIndex), tableDetails:this.tableCallDetails, length: event.length}\n this.pageDetails.emit(datum);\n }\n\n isFirstCell(column: string): boolean {\n return this.displayedColumns.indexOf(column) === 0;\n }\n \n\n // apply search bar filter using mat\n applyFilter(event: Event) {\n this.dataSource.data = this.data; //SK29OCT25\n const filterValue = (event.target as HTMLInputElement).value;\n this.dataSource.filter = filterValue.trim().toLowerCase();\n this.searchFilterData.emit(this.dataSource.filteredData);\n this.searchText.emit(filterValue); //SK29OCT25 emit filter values as text\n this.searchValueChange.emit(filterValue); // MR 09NOV26 emit searchValueChange\n this.totalCount = this.dataSource.filteredData.length;\n if (this.dataSource.paginator) {\n this.dataSource.paginator.firstPage();\n }\n this.cdr.markForCheck();\n }\n\n /** Whether the number of selected elements matches the total number of rows. */\n isAllSelected() {\n // check if all rows are selected\n const numSelected = this.selection.selected.length;\n const numRows = this.dataSource.data.length;\n return numSelected === numRows;\n }\n\n /** Selects all rows if they are not all selected; otherwise clear selection. */\n masterToggle() {\n // if there is a selection then clear that selection\n // emit the selected value only to parent\n if (this.isSomeSelected()) {\n // SK10APR24 to remove the editRow, if the checkbox is unchecked\n this.selection.selected.forEach((element:any) => {\n if(element?.editRow) element.editRow = false;\n });\n this.selection.clear();\n this.selectedValues.emit(this.selection.selected);\n } else {\n // If no items are selected, either select all items or clear the selection\n // emit the selected values to parent\n this.isAllSelected()\n ? this.selection.clear()\n : \n // this.selection.select(...this.data) //SK21FEB25 commented to select all data rows\n this.data.forEach(row => {\n if(this.fromWhere === 'paySlip'){\n if(row?.isPayProcessed === true){\n this.selection.select(row);\n } \n } else if (this.fromWhere === 'payrollTable'){\n if(row?.isPayProcessed === false){\n this.selection.select(row);\n } \n } else {\n this.selection.select(row);\n }\n \n });\n this.selectedValues.emit(this.selection.selected);\n }\n }\n \n\n\n // Checks whether any items are currently selected in the table.\n isSomeSelected() {\n return this.selection.selected.length > 0;\n }\n\n\n // emit the check box values, that selected separately\n // MY 05OCT26 Toggle selection, exit edit mode on deselect, and emit selected rows\n separateRowSelect(element: any, maybeElement?: any) {\n const target = maybeElement || element;\n if (!maybeElement) {\n this.selection.toggle(target);\n }\n if (!this.selection.isSelected(target) && target?.editRow) {\n target.editRow = false;\n }\n this.selectedValues.emit(this.selection.selected);\n }\n\n // data that to be passed, when table row is clicked\n tableClick(data: any) {\n this.tableRowClick.emit(data);\n this.rowClick.emit(data);\n }\n\n // the selected filter data in header is passed as aray with that column name as first array and checked data as second array\n filteredData(filterItems: any) {\n const st = this.selectedFilterColumn.toLocaleString(); \n const arr = [st, filterItems]\n this.filteredArray.emit(arr);\n }\n //to carryout delete functionality in child component;\n delete(data:any, index:any){\n // data.emitted = true;\n // SK27FEB24 added elements to emit ondeleting the record(made changes on wherever used)\n let orderData = this.dataSource._orderData(this.data);\n this.OnDeleteData.emit({data:data, index:index, allData:orderData, tableConfigs:(this.tableConfigurations || {})});\n }\n\n deleteData:any;\n deleteIndex!:number\n deleteOrderedData:any;\n @Input() deleteModal:boolean = false; //SK04SEP25 made as input\n // SK06NOV24 on delete click save the data in variables\n deleteRecord(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n this.deleteData = data;\n this.deleteIndex = index;\n this.deleteOrderedData = orderData;\n this.deleteModal = true;\n }\n\n // SK06NOV24 after clicking yes in delete alert modal, emit to parent\n deleteRecordData(){\n this.OnDeleteData.emit({data:this.deleteData, index:this.deleteIndex, allData:this.deleteOrderedData, tableConfigs:(this.tableConfigurations || {})});\n this.deleteModal = false;\n }\n // to emit data to document component on clicking download;\n downloadPdf(data:any){\n this.onDownload.emit(data);\n \n }\n\n\n //to save the edited data in table;\n saveButton(){\n // MY 05OCT26 Clear editRow on all rows when saving\n this.data.forEach((element: any) => {\n if (element?.editRow) element.editRow = false;\n });\n // SK10APR24 emitting all data with selected data\n this.saveButtonData.emit({selectedData:this.selection.selected, allData:this.data});\n }\n\n // pass the rejected reason\n onEdit(data:any, index:any, status?:string, fromWhere?: string){\n // MY 23OCT26 Do not allow editing approved expenses\n const rowStatus = status || data?.status;\n if (this.fromWhere === 'expense' && rowStatus && rowStatus.toLowerCase() === 'approved') {\n return;\n }\n // SK10APR24 for payroll condtions added on editng LOP, if payroll processed, checkbox will be disabled\n let orderData = this.dataSource._orderData(this.data);\n if (this.fromWhere === 'payrollTable'){\n if(data.payrollStatus === 'Run Payroll'){\n this.selection.select(data);\n if(typeof data === 'object') data.editRow = true;\n }\n } else {\n if(typeof data === 'object') data.editRow = true; // made editing row as true //SK06MAR24 solve undefined error on string\n this.selection.select(data);\n }\n this.onEditData.emit({data:data, index:index, allData:orderData, isEdited: true, selectedData:this.selection.selected, status: status}); //SK25AUG25 selected list sent on edit emit //SK20FEB26 status sent to child\n }\n onClone(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.cloneRow = true; // made cloneRow row as true //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onCloneData.emit({data:data, index:index, allData:orderData});\n }\n onSend(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.sendRow = true; // made sendRow row as true //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onSendData.emit({data:data, index:index, allData:orderData});\n }\n onActivate(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.isActive = true; // made isActive row as true //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onActivateData.emit({data:data, index:index, allData:orderData});\n }\n onDeactivate(data:any, index:any){\n let orderData = this.dataSource._orderData(this.data);\n if(typeof data === 'object') data.isActive = false; // made isActive row as false //SKS25DEC24 solve undefined error on string\n this.selection.select(data);\n this.onDeactivateData.emit({data:data, index:index, allData:orderData});\n }\n// on approve the leave \n onApprove(empId:string,id:string,data:string){\n this.approveData.emit({empId,id,data});\n\n }\n // on reject the leave\n onReject(empId:string,id:string){\n this.rejectData.emit({empId,id});\n }\n\n expenseAttachment(event:any,element:any){\n this.expenseAttachmentEmit.emit({event,element});\n }\n\n //SC20NOV2025 month picker emit \n dateFilter(event: any){\n this.dateEmit.emit(event);\n }\n\n dropdownEmitFunction(event: any){\n this.dropdownDataEmit.emit(event);\n }\n\n commonButtonClick(buttonClickData:any, button:any){\n // SK04FEB25 buttom emit code updated\n if(button.name === \"Import\" || buttonClickData.name === \"Import\" ){\n if(button.name === \"Import\" ){\n this.importButtonEmit(button)\n } else {\n this.importButtonEmit(buttonClickData)\n }\n } else if(button.name === \"Export\" || buttonClickData.name === \"Export\" ){\n if(this.from === 'expense' || this.from === 'ess'){\n this.exportButtonSideNav(button)\n } else if(button.name === \"Export\" ){\n this.exportButtonEmit(button)\n } else {\n this.exportButtonEmit(buttonClickData)\n }\n } else if(button.type === \"group\" || button.type === \"dropdown\") {\n this.commonButtonClickEmit.emit(buttonClickData);\n } else {\n this.commonButtonClickEmit.emit(button);\n }\n }\n\n onClickHyperlink(column:any, element:any, index:number, isHyperLink:any){ \n if(isHyperLink) this.hyperLinkColumnEmit.emit({column:column, element:element, index:index}); //SK13MAR24 hyperlinl columns only emitted\n }\n\n // SK19JAN24 to check whether the hyperlink action is present in that column\n checkHyperlinkCheck(col:any){\n return this.hyperLinkColumns?.includes(col) ? true: false; \n }\n\n fileNameArray(event:any){\n }\n\n //SK23FEB24 on add record in table, the 'inlineElement' values will be assigned to the table data \n addTableRecord(element:any){\n var obj:any = {};\n const keys = Object.keys(element[0]);\n keys.forEach((elementKey:any) => {\n obj[elementKey]='';\n });\n this.data.push(obj);\n const data:any = this.data;\n this.dataSource = new MatTableDataSource(data);\n this.selection = new SelectionModel<any>(true, []);\n this.filterCheckBox = new SelectionModel<any>(true, []);\n this.dataSource.sort = this.sort;\n // this.dataSource.paginator = this.paginator;\n\n if (this.stickyColumn === true && this.displayedColumns ) {\n this.stickyCondition = this.displayedColumns?.length;\n } else {\n this.stickyCondition = this.displayedColumns?.length + 1;\n }\n }\n\n // SK27FEB24 to edit the specifific element(alternate solution)\n doubleclickEdit(i:number, j:number, ele:any, col:any){\n const editColIndex = this.editColumn.findIndex((data:any)=>data === col);\n const ind = (this.data?.length * editColIndex) + j;\n if(!this.editColElement.toArray()[ind].nativeElement.classList.contains(\"input-box\")){\n this.editColElement.toArray()[ind].nativeElement.classList.toggle(\"input-box\");\n this.editColElement.toArray()[ind].nativeElement.readOnly = false;\n }\n }\n\n viewIconClick(element:any){\n this.viewIconEmit.emit({element:element});\n } \n\n downloadIconClick(element:any){\n this.downloadIconEmit.emit({element:element});\n }\n\n\n observableOf(arg0: null): any {\n throw new Error('Function not implemented.');\n }\n\n // SK03OCT24 table import button function\n importButtonEmit(event : any){\n this.uploadModal = true //SKS25OCT24 for popup upload card\n this.importButtonData = event;\n }\n\n // SK03OCT24 table export button function\n exportButtonEmit(event: any){\n this.exportButton.emit(event);\n this.exportReportsData =event\n this.exportSidescreen = true \n }\n\n // SK03OCT24 multipleCheckBox button emit function\n exportFieldsButtonEmit(event:any){\n this.sideNavButtons.emit(event)\n }\n\n // SK03OCT24 multipleFilter button emit function\n exportFilterButtonEmit(event:any){\n this.sideNavButtons.emit(event)\n }\n\n // SK03OCT24 side nav export button function\n exportButtonSideNav(button?:any){\n // MY 15OCT26 prevent export trigger while export is already in progress\n if (this.exportButtonLoadingSpinner) return;\n if(this.selectedValues){\n this.exportReports.emit(button)\n } else { // SKS17JUL26 alert message if no data selected for export\n this.alertService.messageOnPass('error', \"No data selected.\");\n }\n }\n\n // SK03OCT24 this function emit while selecting values in filter box\n selectedValuesEmit(event:any){\n this.multipleSelectFilterExport.emit(event)\n }\n\n // SK03OCT24 if date filter, emits the slected dates function\n filterDateEmit(event:any){\n this.filterDateEmitEvt.emit(event)\n }\n\n downloadTemplate(){\n this.apiService.getCSVTemplates(this.importButtonData.tableName).subscribe({\n next: (v: any) => {\n const file = new Blob([v], { type: 'text/csv' }); //SKS25OCT24 This matches the content type of the response\n saveAs(file, this.importButtonData.fileName+this.importButtonData.fileFormat); //SKS25OCT24 name should be dynamic\n this.saveSuccess(this.importButtonData.fileName +\" \"+ this.templateDownlaod, v.TRANS_KEY)\n },\n error: (e: HttpErrorResponse) => {\n this.errorHandler.handleError(e);\n }\n });\n }\n //SKS25OCT24 Alert Message functions\n saveSuccess(event:any, kay?:any){\n this.alertService.messageOnPass('success', event, kay);\n }\n //SKS25OCT24 Upload the excel to add data to Employee record\n async uploadRecordsFile(event: any){\n const fd = new FormData();\n const file = await this.globalValues.base64ToFile( event[0].doc, event[0].name, event[0].type);\n fd.append('create_file', file, file.name);\n this.uploadModal = false // MR 11JAN24 to close the pop-up after upload button click\n this.apiService.writeValue(this.importButtonData.apiCall,this.importButtonData.endPoint,fd).subscribe({\n next: (response:any) => { \n //SKS25OCT24 Convert base64 string to binary data\n const byteCharacters = atob(response.data); //SKS25OCT24 Decode base64\n const byteNumbers = new Uint8Array(byteCharacters.length);\n \n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const blob = new Blob([byteNumbers], { type: 'text/xlsx' }); //SKS25OCT24 Create a Blob\n \n //SKS25OCT24 Use FileSaver.js's saveAs to trigger the download\n this.alertService.messageOnFetch('successFetch',event.name, \"The report file has been downloaded successfully.\");\n saveAs(blob,this.importButtonData.fileName+ this.importButtonData.fileFormat);\n this.uploadModal = false\n },\n error: (e: HttpErrorResponse) => {\n this.errorHandler.handleError(e);\n }\n });\n }\n\n // MY 22OCT26 Safe condition checking with null-coalescing and array checks\n isConditionMet(element: any, conditions: any): boolean {\n const { andConditionList, orConditionList } = conditions || {};\n \n //SKS21NOV24 If andConditionList exists, check that all conditions are met\n const isAndConditionMet = andConditionList ? andConditionList.every((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond?.condition) ? cond.condition.includes(element?.[cond?.column]) : (cond?.condition === element?.[cond?.column])\n ) : true; //SKS21NOV24 If no andConditionList, consider it as always met\n \n //SKS21NOV24 If orConditionList exists, check if at least one condition is met\n const isOrConditionMet = orConditionList ? orConditionList.some((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond?.condition) ? cond.condition.includes(element?.[cond?.column]) : (cond?.condition === element?.[cond?.column])\n ) : true; //SKS21NOV24 If no orConditionList, consider it as always met\n \n //SKS21NOV24 Return true if the AND condition is met and the OR condition is met\n return isAndConditionMet && isOrConditionMet;\n } \n //SKS21NOV24 Check if the column is a date column\n isDateColumn(column: string): boolean {\n return this.dateColumns?.includes(column) ?? false;\n }\n\n //SKS21NOV24 Check if the column is a time column\n isTimeColumn(column: string): boolean {\n return this.timeColumns?.includes(column) ?? false;\n }\n onInfoClick(ele:any,col:any,index:any){ //SKS27NOV24 infoSidescreen emit\n this.infoData = ele\n this.infoSidescreen = true\n }\n onSearch(event:any){\n this.searchBoxValue = event; // SKS28NOV24 Update the displayed value in the search box\n if (this.searchConfigs) {\n this.searchFilterData.emit(event); \n }\n }\n emptySearch(event:any){ // SKS28NOV24 If the value in the search box is empty, call the onSearch function automatically\n if(!(event.target as HTMLInputElement).value.trim() && (this.prevSearch != (event.target as HTMLInputElement).value.trim())){\n this.onSearch((event.target as HTMLInputElement).value)\n }\n this.prevSearch =(event.target as HTMLInputElement).value.trim()\n this.searchText.emit((event.target as HTMLInputElement).value) //SK29OCT25\n }\n isObjectColumn(column: string): boolean {\n return this.objectColumns?.includes(column) ?? false;\n }\n onSideNavInfoClick(data:any,col:any,config:any){ //SKS7JAN25 infoSidescreen emit \n this.sideNavEmit.emit({data,col,config})\n }\n //SKS31JAN25 for active column select\n onColumnClick(column: string) {\n this.activeColumn = column;\n }\n\n // MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui: Attendance & Month-Year picker state & methods\n selectedMonth: number = 0;\n selectedYear: number = new Date().getFullYear();\n popupOpen: boolean = false;\n confirmModal: boolean = false;\n months: string[] = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n weekendColumnsSet: Set<string> = new Set();\n futureColumnsSet: Set<string> = new Set();\n todayColumn: string | null = null;\n leaveTypeSet: Set<string> = new Set(['casual leave', 'sick leave', 'earned leave', 'lop', 'loss of pay', 'maternity leave', 'paternity leave', 'compensatory off', 'comp off']);\n\n updateDateLookups(): void {\n this.weekendColumnsSet.clear();\n this.futureColumnsSet.clear();\n this.todayColumn = null;\n if (!this.headerLabels || !this.displayedColumns) return;\n\n const now = new Date();\n const todayZero = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const todayDate = now.getDate();\n const todayMonth = now.getMonth() + 1;\n const todayYear = now.getFullYear();\n\n for (let i = 0; i < this.displayedColumns.length; i++) {\n const col = this.displayedColumns[i];\n const header: any = this.headerLabels[i];\n if (header && header.year && header.month && header.date) {\n const d = new Date(header.year, header.month - 1, header.date);\n const dayOfWeek = d.getDay();\n if (dayOfWeek === 0 || dayOfWeek === 6) {\n this.weekendColumnsSet.add(col);\n }\n if (d.getTime() > todayZero) {\n this.futureColumnsSet.add(col);\n }\n if (header.date === todayDate && header.month === todayMonth && header.year === todayYear) {\n this.todayColumn = col;\n }\n }\n }\n }\n\n isWeekend(column: string): boolean {\n return this.weekendColumnsSet.has(column);\n }\n\n isToday(column: string): boolean {\n return this.todayColumn === column;\n }\n\n isFutureDate(column: string): boolean {\n return this.futureColumnsSet.has(column);\n }\n\n getInitials(name: string): string {\n if (!name || typeof name !== 'string') return '';\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].substring(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n isNearTarget(workingDays: any, totalDays: any): boolean {\n const w = Number(workingDays);\n const t = Number(totalDays);\n if (!t || t <= 0) return false;\n return (w / t) >= 0.8;\n }\n\n isLeaveType(status: any): boolean {\n if (!status || typeof status !== 'string') return false;\n const s = status.toLowerCase().trim();\n return s === 'absent' || this.leaveTypeSet.has(s);\n }\n\n prevMonth(): void {\n if (this.selectedMonth === 0) {\n this.selectedMonth = 11;\n this.selectedYear--;\n } else {\n this.selectedMonth--;\n }\n this.emitSelection();\n this.cdr.markForCheck();\n }\n\n nextMonth(): void {\n if (this.selectedMonth === 11) {\n this.selectedMonth = 0;\n this.selectedYear++;\n } else {\n this.selectedMonth++;\n }\n this.emitSelection();\n this.cdr.markForCheck();\n }\n\n togglePopup(): void {\n this.popupOpen = !this.popupOpen;\n this.cdr.markForCheck();\n }\n\n selectMonth(monthIndex: number): void {\n this.selectedMonth = monthIndex;\n this.emitSelection();\n this.togglePopup();\n }\n\n changeYear(step: number): void {\n this.selectedYear += step;\n this.emitSelection();\n this.cdr.markForCheck();\n }\n\n emitSelection(): void {\n const monthVal = this.monthArray ? this.monthArray[this.selectedMonth] : this.months[this.selectedMonth];\n this.monthDataEmit.emit(monthVal);\n this.yearDataEmit.emit(this.selectedYear);\n this.selectedValueEmit.emit({\n month: monthVal,\n year: this.selectedYear\n });\n }\n\n checkButtonClicked(): void {\n this.checkClicked.emit();\n }\n\n doubleClickFunction(element: any, data: any, presentData: any): void {\n if (element?.isSkeleton) return;\n this.doubleClickEmit.emit({ employeeDetail: element.employeeDetail, date: data, data: presentData });\n }\n\n getMonthNumber(month: any): number {\n if (typeof month === 'number') return month;\n if (!month) return 0;\n const mStr = String(month).toLowerCase().slice(0, 3);\n const mList = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\n const idx = mList.indexOf(mStr);\n return idx >= 0 ? idx : 0;\n }\n}\n","<div class=\"table-layout\" [id]=\"tableId\" style=\"padding-top: 1px;\">\n <div>\n <!-- SK30JAN25 title added -->\n <div class=\"d-flex justify-content-center table-title align-text-center\">\n {{title}}\n </div>\n \n <div class=\"flex justify-content-between\" style=\"padding-bottom: 5px;\">\n <div class=\"d-flex align-items-center\">\n <!-- MR 09NOV26 table-toolbar-left projection slot -->\n <ng-content select=\"[table-toolbar-left]\"></ng-content>\n\n <!-- MR 09NOV26 Month / Year Picker -->\n <div class=\"picker-container\" *ngIf=\"monthArray && monthArray.length > 0\">\n <i class=\"arrow-btn fusion-icon fusion-icon-size-lg fusion-icon-arrow-left-1 nav-icon\"\n (click)=\"prevMonth()\" style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n <span class=\"month-label\" (click)=\"togglePopup()\">\n {{ months[selectedMonth] }} {{ selectedYear }}\n </span>\n <i class=\"arrow-btn fusion-icon fusion-icon-size-lg fusion-icon-arrow-right-1 nav-icon\"\n (click)=\"nextMonth()\" style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n </div>\n <div class=\"popup\" *ngIf=\"popupOpen\">\n <div class=\"year-section\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-arrow-left-1 nav-icon\" (click)=\"changeYear(-1)\"\n style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n <span>{{ selectedYear }}</span>\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-arrow-right-1 nav-icon\" (click)=\"changeYear(1)\"\n style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n </div>\n\n <div class=\"month-grid\">\n <div class=\"month-item\" *ngFor=\"let m of (monthArray || months); let i = index\" [class.active]=\"i === selectedMonth\"\n (click)=\"selectMonth(i)\">\n {{ m | slice:0:3 }}\n </div>\n </div>\n </div>\n\n <div *ngIf=\"dateDropdown \">\n <app-drop-down class=\"field-input\" [lists]='dropdownLists' dropDownHeight=\"38px\" dropDownWidth=\"200px\"\n (dataEmit)=\"dropdownEmitFunction($event)\" [selectedData]=\"dropdownSelectedData\"></app-drop-down>\n </div>\n <!-- SC11NOV2025 if isDatePicker is true then show the date picker -->\n <div *ngIf=\"isDatePicker\">\n <app-drop-down [lists]='list' [selectedData]=\"selectedData\" dropDownHeight=\"42px\" dropFontWeight=\"500\"\n dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\" dropDownWidth=\"200px\"\n (dataEmit)=\"dateFilter($event)\"></app-drop-down>\n </div>\n </div>\n <!-- SKS24JAN25 show Nos in table -->\n <!-- <div style=\"display: flex; align-items: center;\">\n <p *ngIf=\"totalRecords || totalCount\" style=\"font-weight: var(--fw-500); margin-right: 5px; margin-bottom: 0px;\">{{'APP.NOS' | customTranslate : 'Nos'}} </p> <span style=\"color: var(--fc-primary-color, rgb(43, 87, 249));\">{{totalRecords || totalCount}}</span>\n </div> -->\n <!-- SKS24JAN25 search bar config and nonconfig -->\n <div style=\"margin-left:auto;\">\n <div class=\"flex\" style=\"align-items: center;\">\n <!-- MR 09NOV26 table-toolbar-right projection slot -->\n <ng-content select=\"[table-toolbar-right]\"></ng-content>\n\n <!-- MR 09NOV26 Sandwich leave check button -->\n <button *ngIf=\"isSandwichLeave && isCheckButton !== false\" class=\"btn btn-primary me-2\"\n (click)=\"confirmModal = true\">\n {{ 'APP_HRM_ATTENDANCE.CHECK' | customTranslate : 'Check' }}\n </button>\n\n <div class=\"search\">\n <div class=\"search-bar\">\n <img class=\"card-btn\" src=\"../assets/images/icons/general/Search.svg\">\n <input type=\"text\" placeholder=\"{{ 'APP.SEARCH' | customTranslate : 'Search' }}\" matInput\n (keyup)=\"searchConfigs ? emptySearch($event) : applyFilter($event)\"\n [value]=\" (searchConfigs || searchTextValue) ? searchBoxValue || '' : '' \" #input\n style=\"font-size: 13px !important;\">\n <img *ngIf=\"searchConfigs && searchBar\" (click)=\"onSearch(input.value)\"\n src=\"../assets/images/icons/general/configSearch.svg\" class=\"configSearch\">\n </div>\n </div>\n\n <!-- MR 09NOV26 Single toolbar button support from second-data-table -->\n <div class=\"flex\" *ngIf=\"button\">\n <app-fusion-button class=\"data-table-fsbtn ms-2 me-2\" (buttonClickEmit)=\"commonButtonClick($event, button)\"\n [buttonType]=\"button?.class || button?.buttonType\" [buttonValue]=\"button?.namePath || button?.labelPath || button?.name | customTranslate : button?.label || button?.name\"\n [buttonConfig]=\"button?.buttonConfig\" [type]=\"button?.type\" [fcBtnIconLeftSrc]=\"button?.btnIconLeftSrc || button?.fcBtnIconLeftSrc\"\n [isImageSvg]=\"button?.isImageSvg\">\n </app-fusion-button>\n </div>\n\n <!-- SKS24JAN25 single, group and dropdown dynamic buttons -->\n <div class=\"flex\" *ngIf=\"isButtons\" style=\"padding-left: 7px;\">\n <div class=\"flex\" *ngFor=\"let button of buttonArray\">\n <app-fusion-button class=\"data-table-fsbtn\" [buttonDisable]=\"button.buttonDisable\"\n [buttonLoadingSpinner]=\"buttonLoadingSpinner\" (buttonClickEmit)=\"commonButtonClick($event,button)\"\n [buttonType]=\"button.label === 'Export' ? 'grey-border rounded-3 bg-white text-dark' : button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\"\n [buttonConfig]=\"button.buttonConfig\" [type]=\"button.type\" class=\"ms-2 me-2\"\n [fcBtnIconLeftSrc]=\"button.label === 'Export' ? '../assets/images/icons/general/upload-icon.svg' : button.fcBtnIconLeftSrc\" [isImageSvg]=\"button.label === 'Export' ? true : button.isImageSvg\">\n <!--SKS25OCT24 If the value is 'Import' or 'Export', this button does not work-->\n </app-fusion-button>\n </div>\n </div>\n \n </div>\n\n <!-- SK23FEB24 for adding new record in table -->\n <div class=\"flex cursor-pointer\" *ngIf=\"addInlineRecord\" (click)=\"addTableRecord(inlineElement)\"\n [matTooltip]=\"'APP.ADD_NEW_RECORD' | customTranslate : 'Add New Record'\">\n <div class=\"ms-1 me-1\">\n <!-- MR 30OCT26 Refactor inline html template styling to theme tokens -->\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-add-square nav-icon\"\n style=\"color: var(--fb-text-primary, #0f172a) !important;\"></i>\n </div>\n </div>\n </div>\n </div>\n\n <!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui: Attendance Top Legend Bar -->\n <div class=\"d-flex justify-content-between align-items-center top-legend-bar\" *ngIf=\"isAttendanceTable || displayedColumns.includes('employeeDetail') || (monthArray && monthArray.length > 0)\">\n <div class=\"d-flex align-items-center gap-3 flex-wrap\">\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-present\">&#10003;</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.PREsENT' | customTranslate : 'Present' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-absent\">&#10005;</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.ABSENT' | customTranslate : 'Absent' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-half\">½</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.HALF_DAY' | customTranslate : 'Half day' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-holiday\">H</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.HOLIDAY' | customTranslate : 'Holiday' }}</span>\n </div>\n <div class=\"d-flex align-items-center gap-1\">\n <span class=\"attendance-chip attendance-weekoff\">-</span>\n <span class=\"legend-text\">{{ 'APP_HRM_ATTENDANCE_TABLE.WEEK_OFF' | customTranslate : 'Week Off' }}</span>\n </div>\n </div>\n <div class=\"table-subtitle\" *ngIf=\"titleOn && title\">\n {{ title | customTranslate : title }}\n </div>\n </div>\n\n <div class=\"table-margin\">\n <div class=\"table-container\" cdkScrollable> <!-- SKS3FEB25 The search filter closes when scrolling the table-->\n <!-- MSM28JAN25 MR 09NOV26 skeleton loader condition using isTableLoading --> \n <ng-container *ngIf=\"!isTableLoading; else loadingTemplate\">\n <table mat-table [dataSource]=\"dataSource || []\" [ngStyle]=\"{ width: tableWidth }\" matSort>\n <!-- Checkbox Columns -->\n <ng-container [sticky]=\"true\" class=\"checkboxCol\" *ngIf=\"withCheckBox\" matColumnDef=\"select\" sticky>\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column head-color\" style=\"border-left: 1px solid var(--fb-border-default, #e2e8f0);\">\n <input type=\"checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"masterToggle()\"\n [checked]=\"selection?.hasValue()\" [indeterminate]=\"selection?.hasValue() && !isAllSelected()\"\n class=\"custom-checkbox\" />\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"body-color\" >\n <!-- SK18OCT24 check payroll Inprogress/Completed from backend data -->\n <input type=\"checkbox\" class=\"custom-checkbox\"\n [title]=\"(fromWhere === 'payrollTable' || fromWhere === 'paySlip') ? (row?.payProcessComment || '') : ''\"\n (click)=\"$event.stopPropagation()\" (change)=\"separateRowSelect(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"(fromWhere === 'payrollTable' && row.isPayProcessed === true) || (fromWhere === 'paySlip' && row.isPayProcessed === false)\" />\n </td>\n <td mat-footer-cell *matFooterCellDef>\n {{ \"\" }}\n </td>\n </ng-container>\n\n <!-- data Columns -->\n <!-- set the matColumnDef attribute to the column name and use interpolation to dynamically generate the mat-header-cell and mat-cell elements based on the column name-->\n <ng-container *ngFor=\"let column of displayedColumns; let i=index\" [matColumnDef]=\"column\"\n [stickyEnd]=\"i === (stickyCondition - 1) ? true : false\" [sticky]=\"stickyColumns.includes(column)\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header\n style=\"border-right: 1px solid var(--fb-border-default, #e2e8f0);\" class=\"head-color ms-2 ps-2 pe-2\" \n [ngClass]=\"{'sticky-column': i === (stickyCondition - 1),'active-column': activeColumn === column,'first-header-border': i === 0}\"\n (click)=\"$event.stopPropagation(); onColumnClick(column)\">\n <span [class]=\"fromWhere === 'payrollTable' || fromWhere === 'paySlip' ? 'table-width' : '' \">{{\n (\n translatePath && translatePath[displayedColumns.indexOf(column)]\n ? translatePath[displayedColumns.indexOf(column)]\n : headerLabels[displayedColumns.indexOf(column)]\n )\n | customTranslate : headerLabels[displayedColumns.indexOf(column)]\n }}\n </span>\n <div (click)=\"$event.stopPropagation()\" class=\"position-relative\" cdk-overlay-origin\n #trigger=\"cdkOverlayOrigin\">\n <img class=\"ms-1\" *ngIf=\"filterColumns.includes(column)\" style=\"margin-bottom: 2px;\"\n (click)=\"filter(column)\" src=\"../assets/images/icons/general/filter-icon.svg\">\n </div>\n <ng-template cdk-connected-overlay [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"searchFilter === true && column === selectedFilter\"\n [cdkConnectedOverlayScrollStrategy]=\"createScrollStrategy()\"\n (overlayOutsideClick)=\"searchFilter = false\" (detach)=\"searchFilter = false\">\n <app-search-filter class=\"search-component position-absolute\"\n [class]=\"searchFilter === true && column === selectedFilter ? 'd-block' : 'd-none'\"\n [filterItems]=\"filterArray\" (emitValues)=\"filteredData($event)\" (click)=\"$event.stopPropagation()\">\n </app-search-filter>\n </ng-template>\n </th>\n <ng-container *ngIf=\"dataSource.data.length > 0\">\n <td mat-cell class=\"body-color ps-2 pe-2\" *matCellDef=\"let element; let j = index\"\n [class.active-column]=\"activeColumn === column\">\n <!-- SK29OCT25 employee detail column -->\n <div *ngIf=\"column === 'employeeDetail'\">\n <div class=\"d-flex flex-row\" style=\"left:0;\">\n <div *ngIf=\"element['employeeName'] || element['name']\"\n [class]=\"hyperLinkColumns.includes(column) ? 'hyper-link' : '' \"\n style=\"font-size: var(--fs-small);color: var(--fb-text-primary, #0f172a);font-weight: var(--fw-600);\">\n {{element[\"employeeName\"] || element[\"name\"] || ''}}</div>\n <div *ngIf=\"element['employeeId']\"\n style=\"font-size: 11px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-400);\" class=\"ms-1\">\n [{{element[\"employeeId\"] || ''}}]</div>\n </div>\n <div class=\"d-flex flex-row\" *ngIf=\"element['designation'] && element['designation'] !== ''\">\n <div style=\"font-size: 10px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-600);\">\n {{element[\"designation\"] || ''}}\n </div>\n <div *ngIf=\"element['designation'] && element['designation'] !== '' && element['location'] && element['location'] !== ''\"\n style=\"font-size: 10px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-600);\">,</div>\n <div *ngIf=\"element['location'] && element['location'] !== ''\" style=\"font-size: 10px;color: var(--fb-text-secondary, #64748b);font-weight: var(--fw-600);\">\n {{element[\"location\"] || ''}}\n </div>\n </div>\n </div>\n <div *ngIf=\"column !== 'combinedColumn' && column !== 'employeeDetail' && fromWhere !== 'leaveMaster' && (column !== 'active' && (fromWhere === 'hrmTaxComponent' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrm' || fromWhere === 'compensation'|| fromWhere === 'payrollTable'|| fromWhere === 'payrollCompare'|| fromWhere === 'paySlip' || fromWhere === 'approval' || fromWhere === 'leave' || fromWhere === 'expense' || fromWhere === 'expenseApproval' || fromWhere === 'leaveAllocation' ||fromWhere === 'parkingApp' ||(fromWhere === 'common' && column != 'signature')))\">\n <!-- SK10APR24 getting the table values using pipe instead of function to increase performance-->\n <div *ngIf=\" ('-' | editColumnCheck: column : editColumn) === ('') \">\n <span class=\"font-size-13 {{checkHyperlinkCheck(column) || fromWhere === 'hrm' || fromWhere === 'compensation' || fromWhere === 'parkingApp' ? ' hyper-link clickable ' : ''}} {{fromWhere === 'payrollTable' || fromWhere === 'paySlip' ? 'table-width' : '' }}\"\n *ngIf=\"hyperLinkColumns.includes(column) || isFirstCell(column)\"\n (click)=\"tableClick(element); onClickHyperlink(column,element, j, checkHyperlinkCheck(column))\">\n <!--SKS21NOV24 Use customDateTime Pipe for both Date and Time -->\n <ng-container *ngIf=\"isDateColumn(column)\">\n {{ element[column] | customDate }}\n </ng-container>\n\n <ng-container *ngIf=\"isTimeColumn(column)\">\n {{ element[column] | customTime }}\n </ng-container>\n\n <!--SKS21NOV24 For other columns, display raw value -->\n <ng-container *ngIf=\"!isDateColumn(column) && !isTimeColumn(column)\">\n {{ '-' | getValue: element : column }}\n </ng-container>\n <!--SKS27NOV24 Check if the current column is in buttonColumn array -->\n <ng-container *ngIf=\"sideScreenColumn?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onInfoClick(element, column, j)\">\n </ng-container>\n <!--SKS9JAN25 rightnav column -->\n <ng-container *ngIf=\"objectColumns?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onSideNavInfoClick(element, column, j)\">\n </ng-container>\n </span>\n <div *ngIf=\"!isFirstCell(column) && !editColumn.includes(column) && column != 'receipt'\"\n [class]=\"fromWhere === 'payrollTable' || fromWhere === 'paySlip' ? 'table-width' : '' \">\n <div *ngIf=\"!checkHyperlinkCheck(column)\" class=\"font-size-13\">\n <!--SKS21NOV24 Use customDateTime Pipe for both Date and Time -->\n <ng-container *ngIf=\"isDateColumn(column)\">\n {{ element[column] | customDate }}\n </ng-container>\n\n <ng-container *ngIf=\"isTimeColumn(column)\">\n {{ element[column] | customTime }}\n </ng-container>\n\n <!--SKS21NOV24 For other columns, display raw value -->\n <ng-container *ngIf=\"!isDateColumn(column) && !isTimeColumn(column)\">\n {{ '-' | getValue: element : column }}\n </ng-container>\n <!--SKS27NOV24 Check if the current column is in buttonColumn array -->\n <ng-container *ngIf=\"sideScreenColumn?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onInfoClick(element, column, j)\">\n </ng-container>\n <!--SKS9JAN25 rightnav column -->\n <ng-container *ngIf=\"objectColumns?.includes(column)\">\n <img class=\"ms-2\" src=\"../assets/images/icons/general/info.svg\"\n (click)=\"onSideNavInfoClick(element, column, j)\">\n </ng-container>\n </div>\n </div>\n </div>\n <!-- SK27FEB24 added input box for inline edit input-->\n <div *ngIf=\"editColumn.length > 0\">\n <div *ngIf=\" ('-' | editColumnCheck: column : editColumn) === ('string') \" class=\"on-edit d-flex\">\n <input #editColElement class=\"lop-input table-width\" [class]=\"element?.editRow ? 'input-box' : '' \"\n matInput [placeholder]=\"'APP.ENTER' | customTranslate : 'Enter'\" [value]=\"element[column]\"\n [(ngModel)]=\"element[column]\" [readOnly]=\"element?.editRow ? false : true\">\n </div>\n <!-- SK10APR24 In table, like text input, added drop down and time inputs as well -->\n <div *ngIf=\" ('-' | editColumnCheck: column : editColumn) === ('object') \" class=\"on-edit d-flex\">\n <input *ngIf=\" ('-' | editColumnType: column : editColumn) === ('text') \" #editColElement\n class=\"lop-input table-width\" [class]=\"element?.editRow ? 'input-box' : '' \" matInput\n [placeholder]=\"'APP.ENTER' | customTranslate : 'Enter'\" [value]=\"element[column]\"\n [(ngModel)]=\"element[column]\" [readOnly]=\"element?.editRow ? false : true\">\n <input *ngIf=\" ('-' | editColumnType: column : editColumn) === ('time') \" type=\"time\"\n class=\"lop-input table-width\" matInput [class]=\"element?.editRow ? 'input-box' : '' \"\n placeholder=\"HH:mm:ss\" [(ngModel)]=\"element[column]\"\n [disabled]=\"element?.editRow ? false : true\" />\n <div *ngIf=\" ('-' | editColumnType: column : editColumn) === ('dropdown') \">\n <select type=\"dropdown\" *ngIf=\"element?.editRow\" class=\"lop-input table-width\" matInput\n [class]=\"element?.editRow ? 'input-box' : '' \" [(ngModel)]=\"element[column]\">\n <option [disabled]=\"element?.editRow ? false : true\"\n *ngFor=\"let data of [] | editColumnDropdown: column : editColumn \"\n [value]=\"data.value || data.name\">{{data.name}}</option>\n </select>\n <input *ngIf=\"!element?.editRow\" #editColElement class=\"lop-input table-width\"\n [class]=\"element?.editRow ? 'input-box' : '' \" matInput\n [placeholder]=\"'APP.ENTER' | customTranslate : 'Enter'\" [value]=\"element[column]\"\n [(ngModel)]=\"element[column]\" [readOnly]=\"true\">\n </div>\n\n </div>\n </div>\n <app-popover\n *ngIf=\"column === 'receipt' && !editColumn.includes(column) && receiptImg == true && element[column] && element[column].length != 0\"\n [isBootstrap]=\"false\" [dynamicPopover]=\"'Popover string comes here'\">\n <div class=\"hover-base\">\n <img class=\"ms-1\" src=\"../../../assets/images/icons/general/file-attach.svg\">\n </div>\n <div class=\"hover-content\">\n <div class=\"expenseCon\">\n <div *ngFor=\"let data of element[column] || []\">\n <div class=\"cursor-pointer expense-file\" (click)=\"expenseAttachment(data,element)\">{{data?.name}}\n <!-- SK20FEB26 loader in expense list-->\n <svg *ngIf=\"data?.loader\"\n class=\"svg-spinner card-icon color\"\n width=\"22\" height=\"22\" viewBox=\"0 0 50 50\"\n style=\"cursor: wait;\">\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\n </svg>\n </div>\n </div>\n </div>\n </div>\n </app-popover>\n </div>\n <div *ngIf=\"fromWhere === 'leaveMaster' && column !== 'employeeDetail' \">\n <div [class]=\"(element[column]) === 'Week Off' ? 'weekoff-color' : '' \" class=\"font-size-13\">{{\n (column == 'default' || column == 'active' || column == 'paidLeave') ? '' : element[column] }}</div>\n <input *ngIf=\"(column === 'default' || column === 'active' || column === 'paidLeave')\"\n class=\"custom-checkbox\" [checked]=\"element[column] == true\" type=\"checkbox\" disabled>\n </div>\n <div *ngIf=\"fromWhere === 'payrollSettingComponent' && column === 'combinedColumn'\">\n <!-- for the Payroll Settings Component ( Side Screen Component )-->\n <!-- Since the last column is a combination of data and it is also conditional based on the paytype and calculation type we are using this div-->\n <!-- if Component type is Earnings and\n calculationType is 'flat' then output should be => \"'payType\": Flat, Amount of 'amount'\"\n calculationType is 'percentage' then output should be => \"'payType': 'amount' % of Basic \"\n calculationType is 'fixed' then output should be => \"'payType': 'calculationType'\" -->\n <!-- SK20JUN25 to display in table -->\n <ng-container *ngIf=\"\n element?.calculationType === 'flat' ||\n element?.calculationType === 'percentage' ||\n element?.calculationType === 'basicAndDA' ||\n element?.calculationType === 'fixed' ||\n element?.calculationType === 'ctc';\n else noCalculation\n \">\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'flat' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE_FLAT_AMOUNT'\n | customTranslate : 'Variable: Flat Amount: ' }}{{ (element['amount'] || 0)}}</span>\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'flat' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED_FLAT_AMOUNT'\n | customTranslate : 'Fixed: Flat Amount: ' }}{{ (element['amount'] || 0)}}</span>\n\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'percentage' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC' |\n customTranslate : '% of Basic'}}</span>\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'percentage' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }}{{ element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC' |\n customTranslate : '% of Basic'}}</span>\n\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'basicAndDA' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{ element['amount']}}{{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC_AND_DA' | customTranslate : '% of Basic and DA'}}</span>\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'basicAndDA' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }}{{ element['amount']}}{{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_BASIC_AND_DA' | customTranslate : '% of Basic and DA'}}</span>\n\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'fixed' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{ element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_GROSS'\n | customTranslate : '% of Gross'}}</span>\n <span class=\"spanFontSize\"\n *ngIf=\"element['calculationType'] == 'fixed' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }}{{ element['amount']}}{{ 'APP_HRM_PAYROLL_SETTINGS.PER_OF_GROSS' |\n customTranslate : '% of Gross'}}</span>\n\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'ctc' && !element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\"> {{'APP_HRM_PAYROLL_SETTINGS.FIXED' |\n customTranslate : 'Fixed: ' }} {{ element['amount'] }} {{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_FIXED_CTC' | customTranslate : '% of Fixed CTC'}}</span>\n <span class=\"spanFontSize\" *ngIf=\"element['calculationType'] == 'ctc' && element['isVariablePay']\"\n [class]=\"'calculationType-'+element['calculationType']\">{{'APP_HRM_PAYROLL_SETTINGS.VARIABLE' |\n customTranslate : 'Variable: ' }}{{ element['amount'] }}{{\n 'APP_HRM_PAYROLL_SETTINGS.PER_OF_VARIABLE_CTC' | customTranslate : '% of Variable CTC'}}</span>\n </ng-container>\n\n <ng-template #noCalculation>\n <span class=\"spanFontSize\">-</span>\n </ng-template>\n </div>\n <div *ngIf=\"fromWhere === 'payrollSettingComponent' && column === 'active'\">\n <div class=\"form-check form-switch\">\n <input class=\"custom-checkbox\" type=\"checkbox\" [checked]=\"(element != null && element['active'] === true) ? true : false\"\n (click)=\"element[column]=!element[column]; onToggleChange.emit(fromWhere === 'payrollSettingComponent' ? element : '')\">\n </div>\n </div>\n </td>\n </ng-container>\n <!-- SK16JUL24 to get the sum of column data -->\n <td class=\"ps-2 pe-2 \" mat-footer-cell *matFooterCellDef=\"let element; let j = index\">\n {{ '-' | totalColumSum: data : cumulativeDataColumns : column }}\n </td>\n </ng-container>\n <!-- action button Columns -->\n <!-- SK19MAR25 \"action\" key is changed to \"tableAction\" wherever used, since, it has duplicate error -->\n <ng-container [stickyEnd]=\"true\" *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n matColumnDef=\"tableAction\">\n <th mat-header-cell *matHeaderCellDef\n class=\"head-color action-size sticky-column actionCol text-center\" style=\"border-right: 1px solid var(--border-color, rgba(0, 0, 0, 0.12));\">{{ actionColumHeader |\n customTranslate : 'Action'}}</th>\n <td mat-cell *matCellDef=\"let element; let i=index\" class=\"body-color actionCol\">\n <!-- SKS25DEC24 clone button -->\n <div class=\"d-flex flex-row actionButton\"\n [style.justify-content]=\"conditionSendButton ? 'none' : 'center'\">\n <div *ngIf=\"(!conditionCloneButton) && cloneButton\" class=\"imgBtnDiv\">\n <img style=\"padding: 0px;\" (click)=\"onClone(element , i)\"\n src=\"../assets/images/icons/general/clone.svg\" class=\"imgBtn\" data-bs-toggle=\"modal\">\n </div>\n <div *ngIf=\"(conditionCloneButton) && isConditionMet(element, conditionCloneButton.conditions)\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 6px;\">\n <img style=\"padding: 0px;\" (click)=\"onClone(element , i)\"\n src=\"../assets/images/icons/general/clone.svg\" class=\"imgBtn\" data-bs-toggle=\"modal\">\n </div>\n <!-- SK20FEB26 Expense edit on Pending status -->\n <div *ngIf=\"element?.status === 'Rejected'|| fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isEditRow || (fromWhere == 'expense' && element?.status === 'Pending' )\">\n <app-fusion-button *ngIf=\"fromWhere == 'leave'\" [buttonType]=\"'text-only'\"\n [buttonValue]=\"'APP.COMMENTS' | customTranslate : 'comments' \"\n (buttonClickEmit)=\"onEdit(element?.rejectionReason, i, element?.status)\" data-bs-toggle=\"modal\"\n data-bs-target=\"#rejectInfoModal\">\n </app-fusion-button>\n <div class=\"imgBtnDiv\"\n *ngIf=\"((!conditionEditButton)&& ((fromWhere == 'expense' ) || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isEditRow)) || (conditionEditButton && isConditionMet(element, conditionEditButton.conditions))\">\n <!-- MY 23OCT26 Disable edit action when expense is already Approved -->\n <i *ngIf=\"(!conditionEditButton)&& ((fromWhere == 'expense' ) || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isEditRow)\"\n (click)=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? null : onEdit(fromWhere === 'payrollSettingComponent' || isEditRow ? element : element?._id, i, element?.status)\"\n [matTooltip]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? ('APP_EXPENSE.CANNOT_EDIT_APPROVED' | customTranslate : 'Approved expenses cannot be edited') : ('APP.EDIT' | customTranslate : 'Edit')\"\n [style.opacity]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? '0.35' : '1'\"\n [style.cursor]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? 'not-allowed' : 'pointer'\"\n class=\"fusion-icon nav-icon fusion-icon-edit_pencil\" style=\"margin: 0px !important; font-size: var(--fs-normal, 16px) !important; color: var(--fc-sub-lite, #787486);\">\n </i>\n <i *ngIf=\"conditionEditButton && isConditionMet(element, conditionEditButton.conditions)\"\n [matTooltip]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? ('APP_EXPENSE.CANNOT_EDIT_APPROVED' | customTranslate : 'Approved expenses cannot be edited') : ('APP.EDIT' | customTranslate : 'Edit')\"\n [style.opacity]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? '0.35' : '1'\"\n [style.cursor]=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? 'not-allowed' : 'pointer'\"\n (click)=\"(fromWhere === 'expense' && element?.status?.toLowerCase() === 'approved') ? null : onEdit(fromWhere === 'payrollSettingComponent' || isEditRow ? element : element?._id, i)\"\n class=\"fusion-icon nav-icon fusion-icon-edit_pencil\" style=\"margin: 0px !important; font-size: var(--fs-normal, 16px) !important; color: var(--fc-sub-lite, #787486);\">\n </i>\n </div>\n <!-- <img *ngIf=\"fromWhere == 'expense'\" (click)=\"delete(element?._id)\" src=\"../assets/images/icons/Vectordelete.svg\"> -->\n </div>\n <div *ngIf=\"element?.leaveStatus === 'New' || element?.status === 'New' || element?.status === 'Pending' || element?.leaveStatus === 'Pending' || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || fromWhere == 'expenseApproval' || isDeleteRow\">\n <app-fusion-button *ngIf=\"fromWhere == 'leave'\" [buttonType]=\"'text-only'\"\n [buttonValue]=\"'APP.CANCEL' | customTranslate : 'Cancel'\" (buttonClickEmit)=\"delete(element, i)\"\n data-bs-toggle=\"modal\" data-bs-target=\"#cancelLeave\"></app-fusion-button>\n <!-- SKS21NOV24 Conditional rendering of delete icon based on various conditions -->\n <!-- Show the delete icon if 'conditionDeleteButton' is false and 'fromWhere' matches specific components or 'isDeleteRow' is true -->\n <div class=\"imgBtnDiv\"\n *ngIf=\"((!conditionDeleteButton)&&(fromWhere == 'expense' || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isDeleteRow) )|| (conditionDeleteButton && isConditionMet(element, conditionDeleteButton.conditions))\">\n <img\n *ngIf=\"(!conditionDeleteButton)&&(fromWhere == 'expense' || fromWhere === 'leaveMaster' || fromWhere === 'payrollSettingComponent' || fromWhere === 'hrmTaxComponent' || isDeleteRow)\"\n class=\"imgBtn\" [matTooltip]=\"'APP.DELETE_RECORD' | customTranslate : 'Delete Record'\"\n (click)=\"deleteRecord(fromWhere === 'payrollSettingComponent' || isDeleteRow ? element : element?._id, i)\"\n src=\"../assets/images/icons/Vectordelete.svg\">\n <img *ngIf=\"conditionDeleteButton && isConditionMet(element, conditionDeleteButton.conditions)\"\n [matTooltip]=\"'APP.DELETE_RECORD' | customTranslate : 'Delete Record'\"\n (click)=\"deleteRecord(isDeleteRow ? element : element?._id, i)\" class=\"imgBtn\"\n src=\"../assets/images/icons/Vectordelete.svg\">\n </div>\n <div *ngIf=\"fromWhere == 'approval' || fromWhere == 'expenseApproval'\" class=\"flex imgBtnDiv\">\n <img\n *ngIf=\"(fromWhere === 'expenseApproval' && element?.status === 'Approved'&& element?.reImbursed !== 'Reimbursed') || fromWhere == 'approval'\"\n class=\"approval-image me-2\" style=\"padding: 0px; width: 24px !important;\"\n (click)=\"onApprove( element?.employeeId, element?._id, element?.reImbursed )\"\n src=\"../assets/images/icons/general/Approved.svg\">\n <img *ngIf=\"fromWhere !== 'expenseApproval'\" class=\"approval-image\"\n style=\"padding: 0px; width: 24px !important;\"\n (click)=\"onReject( element?.employeeId, element?._id )\"\n src=\"../assets/images/icons/general/Declined.svg\" class=\"\" data-bs-toggle=\"modal\"\n data-bs-target=\"#approvalReject\">\n </div>\n </div>\n <!-- SK02APR24 added preview and download icons -->\n <div *ngIf=\"viewIcon\" class=\"ms-2 imgBtnDiv\">\n <!-- <img [src]=\"('post.svg' | svgIcon:'#000000') | async\" class=\"card-icon color\" title=\"preview\" (click)=\"viewIconClick(element)\" style=\"cursor: pointer;\" /> -->\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-eye nav-icon\" matTooltip=\"Preview\"\n matTooltipPosition=\"above\" style=\"color: var(--fc-text-color-light) !important; cursor: pointer;\"\n (click)=\"viewIconClick(element)\"></i>\n\n </div>\n <div *ngIf=\"downloadIcon\" class=\"ms-2 imgBtnDiv\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-document-download card-icon color imgBtn\"\n matTooltip=\"Download\" matTooltipPosition=\"above\"\n style=\"cursor: pointer; color: var(--fc-text-color-light) !important;\"\n (click)=\"downloadIconClick(element)\">\n </i>\n </div>\n <!-- SKS25DEC24 send button -->\n <div *ngIf=\"(!conditionSendButton) && sendButton\" class=\"ms-2 imgBtnDiv\" style=\"margin-top: 6px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-send-2 card-icon color imgBtn\"\n style=\"cursor: pointer\" (click)=\"onSend(element, i)\"\n [matTooltip]=\"'APP.SEND' | customTranslate : 'Send'\"></i>\n </div>\n <div\n *ngIf=\"(conditionSendButton) && isConditionMet(element, conditionSendButton.conditions) && sendButton\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 6px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-send-2 card-icon color imgBtn\"\n style=\"cursor: pointer\" (click)=\"onSend(element, i)\"\n [matTooltip]=\"'APP.SEND' | customTranslate : 'Send'\"></i>\n </div>\n <!-- SKS25DEC24 active button -->\n <div *ngIf=\"(!conditionActivateButton) && activeButton\" class=\"ms-2 imgBtnDiv\"\n style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n <div\n *ngIf=\"(conditionActivateButton) && isConditionMet(element, conditionActivateButton.conditions) && activeButton\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n <!-- SKS25DEC24 deactive button -->\n <div *ngIf=\"(!conditionDeactivateButton) && deactiveButton\" class=\"ms-2 imgBtnDiv\"\n style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n <div\n *ngIf=\"(conditionDeactivateButton) && isConditionMet(element, conditionDeactivateButton.conditions) && deactiveButton\"\n class=\"ms-2 imgBtnDiv\" style=\"margin-top: 10px;\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-group nav-icon\" style=\"color: var(--comp-bg-color, #ffffff);\"></i>\n </div>\n </div>\n <div>\n\n <app-fusion-button *ngIf=\"fromWhere == 'document-icons'\" [buttonType]=\"'custom-btn'\"\n [fcBtnIconLeftSrc]=\"'../assets/images/icons/general/downloadfile.svg'\"\n (buttonClickEmit)=\"downloadPdf(element)\"></app-fusion-button>\n <app-fusion-button *ngIf=\"fromWhere == 'document-icons'\" [buttonType]=\"'custom-btn'\"\n [fcBtnIconLeftSrc]=\"'../assets/images/icons/general/pencil-icon.svg'\"\n (buttonClickEmit)=\"delete(element, i)\" data-bs-toggle=\"modal\"\n data-bs-target=\"#documentsInfoModal\"></app-fusion-button>\n <app-fusion-button *ngIf=\"fromWhere == 'document-icons'\" [buttonType]=\"'custom-btn'\"\n [fcBtnIconLeftSrc]=\"'../assets/images/icons/Vectordelete.svg'\"\n (buttonClickEmit)=\"delete(element, i)\" data-bs-toggle=\"modal\"\n data-bs-target=\"#deleteDocModal\"></app-fusion-button>\n </div>\n </td>\n <td mat-footer-cell *matFooterCellDef=\"let element; let i=index\">{{ \"\" }}\n </td>\n </ng-container>\n\n <!-- total Row -->\n <ng-container [sticky]=\"true\" matColumnDef=\"total\">\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column head-color\">\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"body-color\">\n </td>\n <!-- RS27AUG24 -->\n <!-- Used the translate pipe to successfully implement the translation -->\n <td mat-footer-cell *matFooterCellDef >{{'APP.TOTAL' | customTranslate : 'Total' }}\n </td>\n </ng-container>\n\n <!-- Render the columns -->\n <!-- SK16JUL24 adding the cumulative data row as footer -->\n <!-- <ng-container *ngIf=\"dataSource?.data?.length !== 0\"> -->\n <div [ngSwitch]=\"renderColumns\">\n <div *ngSwitchCase=\"'select'\">\n <tr mat-header-row *matHeaderRowDef=\"['select'].concat(displayedColumns) sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['select'].concat(displayedColumns);\"></tr>\n <!-- SK19JUL24 table total update -->\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? '' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns) : null \">\n </tr>\n </div>\n <div *ngSwitchCase=\"'tableAction'\">\n <tr mat-header-row\n *matHeaderRowDef=\" displayedColumns ? displayedColumns.concat(['tableAction']) : [] ;sticky: true\">\n </tr>\n <tr mat-row\n *matRowDef=\"let row; columns: displayedColumns ? displayedColumns.concat(['tableAction']) : []; \">\n </tr>\n <ng-container *ngIf=\"cumulativeDataColumns\">\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? '' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns).concat('tableAction') : null\">\n </tr>\n </ng-container>\n </div>\n <!-- 30JAN24 for both checkbox and action columns-->\n <div *ngSwitchCase=\"'both'\">\n <tr mat-header-row\n *matHeaderRowDef=\"['select'].concat(displayedColumns).concat('tableAction') sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['select'].concat(displayedColumns).concat('tableAction')\"\n (click)=\"tableClick(row)\"></tr>\n <ng-container *ngIf=\"cumulativeDataColumns\">\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? '' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns).concat('tableAction') : null\">\n </tr>\n </ng-container>\n </div>\n <div *ngSwitchDefault>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row;let i =index; columns: displayedColumns;\"></tr>\n <ng-container *ngIf=\"cumulativeDataColumns\">\n <tr\n [class]=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? 'd-block' : 'border border-white' \"\n mat-footer-row\n *matFooterRowDef=\"cumulativeDataColumns != undefined && cumulativeDataColumns.length !== 0 ? ['total'].concat(displayedColumns) : null\">\n </tr>\n </ng-container>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <tr class=\"mat-row \" *matNoDataRow> -->\n <!-- SK9JAN24 Removed attr.colspan since it throws undefined error -->\n <!-- <td class=\"mat-cell \">\n {{'APP.NO_RECORDS' | customTranslate : 'No records/data found.' }}\n </td>\n </tr> -->\n\n </table>\n <div class=\"no-data-cell text-center my-3 \" *ngIf=\"!dataSource || !dataSource.data || dataSource.data.length === 0\">\n {{ 'APP.NO_RECORDS' | customTranslate : 'No records/data found.' }}\n </div>\n </ng-container>\n <!-- MSM28JAN25 skeleton loader template -->\n <ng-template #loadingTemplate>\n <table>\n <tr style=\"height: 40px;\" *ngFor=\"let _ of [1, 2, 3, 4,5,6]\">\n <td colspan=\"3\" class=\"skeleton-card\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </td>\n </tr>\n </table>\n </ng-template>\n </div>\n <!-- SK23FEB24 table input save button changes -->\n <div class=\"d-flex justify-content-end\">\n <div class=\"flex mt-4 me-2 cursor-pointer\" *ngIf=\"addInlineRecord \" (click)=\"addTableRecord(inlineElement)\"\n [matTooltip]=\"'APP.ADD_NEW_RECORD' | customTranslate : 'Add New Record'\">\n <div class=\"ms-1 me-1\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-add-square nav-icon\"\n style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n </div>\n </div>\n <!-- SK27FEB24 removed button disable logic, SK13MAR24 added another condition for button showing-->\n <!-- SR06JAN2025 button disable logic for not select any employee-->\n <div class=\"d-flex justify-content-between align-items-end\">\n <div class=\"px-2\">\n {{notes}}</div>\n\n <app-fusion-button [buttonLoadingSpinner]=\"tableSaveLoadingSpinner\"\n *ngIf=\"editColumn.length > 0 || tableSaveButton\" buttonType=\"btn btn-primary mt-4 me-2\"\n [buttonDisable]=\"selection?.selected?.length === 0\" (buttonClickEmit)=\"saveButton()\"\n buttonValue=\"{{ 'APP.SAVE' | customTranslate : 'Save' }}\"></app-fusion-button>\n </div>\n </div>\n <!-- SKS24JAN25 custom paginator -->\n <app-pagination #paginator [pageSizeOptions]=\"itemsPerPage\" [collectionSize]=\"totalCount\" [pageSize]=\"pageSize\"\n [currentPage]=\"pageIndex\" [firstLastButtons]=\"true\" (event)=\"pageParams($event)\" >\n </app-pagination>\n </div>\n </div>\n</div>\n\n<!-- SK03OCT24 while clicking export button, side screen will be displayed, with fields selection and filter boxes -->\n<app-common-screen *ngIf=\"exportSidescreen\" headerTitle=\"{{'APP.EXPORT_DATA' | customTranslate : 'Export Data'}}\"\n (sideScreenEmittedEvent)=\"exportSidescreen = false\">\n <div class=\"side-main-content\">\n <!-- MY 15OCT26 export file button loader -->\n <div\n class=\"d-flex align-items-center flex-row p-3 justify-content-center cursor-pointer short-button-white-bg button-hov\"\n [class.disabled]=\"exportButtonLoadingSpinner\"\n (click)=\"!exportButtonLoadingSpinner ? exportButtonSideNav() : null\">\n <div *ngIf=\"exportButtonLoadingSpinner\" class=\"spinner-grow spinner-grow-sm me-2\" role=\"status\" aria-hidden=\"true\"></div>\n <i *ngIf=\"!exportButtonLoadingSpinner\" class=\"fusion-icon fusion-icon-size-lg fusion-icon-document-upload card-icon color me-1\"></i>\n <div>{{ exportButtonLoadingSpinner ? (('APP_SETTINGS_APPS.LOADING' | customTranslate : 'Loading') + '...') : ('APP.EXPORT_FILE' | customTranslate : 'Export File') }}</div>\n </div>\n <!-- SK03OCT24 displaying components from parent (multipleCheckBox/multipleFilter) -->\n <div *ngFor=\"let type of filterScreenConfigs\">\n <!-- MY 15OCT26 pass button loader state to multi-checkbox and multiple-filter -->\n <app-multi-checkbox *ngIf=\"type.type === 'multipleCheckBox' \" class=\"ms-2 me-2\"\n [label]=\"type?.labelPath || type?.label | customTranslate : type?.label\" [cardSize]=\"type?.cardSize\"\n [cardInlineSize]=\"type?.cardInlineSize\" [checkboxList]=\"type?.checkboxList\"\n [activeCheckboxList]=\"type?.activeCheckboxList\" [buttonList]=\"type?.buttons\"\n [displayValues]=\"type?.displayValues\" [componentData]=\"type\" [checkBoxStyles]=\"type?.checkBoxStyles\"\n [isButtonLoadingSpinner]=\"type?.isButtonLoadingSpinner || false\"\n (compDataEmit)=\"exportFieldsButtonEmit($event)\">\n </app-multi-checkbox>\n <app-multiple-filter *ngIf=\"type.type === 'multipleFilter' \" class=\"ms-2 me-2\"\n [isDateFilter]=\"type?.isDateFilter || false\"\n [label]=\"type?.labelPath || type?.label | customTranslate : type?.label\" [cardSize]=\"type?.cardSize\"\n [cardInlineSize]=\"type?.cardInlineSize\" [buttonList]=\"type?.buttons\" [displayValues]=\"type?.displayValues\"\n [componentData]=\"type\" [checkBoxStyles]=\"type?.checkBoxStyles\" [selectionData]=\"type?.selectionData\"\n [isButtonLoadingSpinner]=\"type?.isButtonLoadingSpinner || false\"\n (compDataEmit)=\"exportFilterButtonEmit($event)\" (selectedValuesEmit)=\"selectedValuesEmit($event)\"\n (filterDateEmit)=\"filterDateEmit($event)\">\n </app-multiple-filter>\n </div>\n </div>\n</app-common-screen>\n<!-- SKS15DEC25 bulk upload -->\n<app-file-upload [id]=\"'uploadEmployee'\" [headerName]=\"moudleName\" [showFileModal]=\"uploadModal\"\n (closeEmit)=\"uploadModal = false\"\n [bodyHeaderName]=\"('APP.STEPS_TO_UPLOAD' | customTranslate : 'Steps to upload')+moudleName\" [isTemplate]=true\n [templateContent]=\"('APP.DOWNLOAD_THE' | customTranslate : 'Download the')+ moudleName +('APP.TEMPLATE' | customTranslate : 'template')\"\n (templateDownload)=\"downloadTemplate()\"\n [bodyContent]=\"[(('APP.FILL_THE_APPROP' | customTranslate : 'Fill the appropriate')+moudleName+('APP.DETAILS_AND_UPLOAD_ITS_BELOW' | customTranslate : 'Details and upload it below'))]\"\n [fileRestrictions]=\"{\n allowedTypes: ['.csv', '.xlsx', '.xls'],\n maxFileSize: 10,\n maxFiles: 1\n }\" [uploadedFiles]=\"[]\" [saveButtonName]=\"'APP.UPLOAD' | customTranslate : 'Upload'\"\n (upload)=\"uploadRecordsFile($event)\">\n</app-file-upload>\n<!-- SK06NOV24 alert on deleting record -->\n<div *ngIf=\"deleteModal\" class=\"modal modal-backdrop show d-block\" id=\"deleteRecord\" tabindex=\"-1\"\n aria-labelledby=\"deleteRecordLabel\" [attr.aria-hidden]=\"!deleteModal\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title fs-5\" id=\"deleteRecordLabel\">{{'APP.DELETE_RECORD' | customTranslate : 'Delete Record'}}</b>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteModal = false\"></button>\n </div>\n <div class=\"modal-body\">\n {{'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC' | customTranslate : 'Are you sure want to delete the record'}} ?\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"!buttonLoadingSpinner ? deleteRecordData() : null\">\n <!-- SK04SEP25 button loader -->\n <span class=\"{{ buttonLoadingSpinner ? 'spinner-grow' : '' }} spinner-grow-sm\" role=\"buttonValue\"\n aria-hidden=\"true\"></span>\n <span>{{ buttonLoadingSpinner ? ('APP_SETTINGS_APPS.LOADING' | customTranslate : 'Loading') + '...' :\n ('APP.YES' | customTranslate : 'Yes') }}\n </span>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\" (click)=\"deleteModal = false\">{{'APP.NO'\n | customTranslate : 'No'}}</button>\n </div>\n </div>\n </div>\n</div>\n\n<app-common-screen *ngIf=\"infoSidescreen\" [headerTitle]=\"'APP.APPROVAL_DETAILS' | customTranslate : 'Approval Details'\"\n (sideScreenEmittedEvent)=\"infoSidescreen = false\">\n <div class=\"side-main-content container\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <!-- Approval Info -->\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.NAME' | customTranslate : 'Name'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.name || ''}}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span\n *ngIf=\"infoData.status === 'Approved' || infoData.status === 'Pending' || infoData.status === 'Rejected' \"\n class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.status === 'Approved', \n 'bg-warning': infoData.status === 'Pending',\n 'bg-danger': infoData.status === 'Rejected'}\">\n {{ infoData.status }}</span>\n <span\n *ngIf=\"infoData.status !== 'Approved' && infoData.status !== 'Pending' && infoData.status !== 'Rejected' \">{{\n infoData.status || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\">\n <!-- SK21DEC24 to add Approval status in side screen-->\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_STATUS' | customTranslate : 'Approval Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span\n *ngIf=\"infoData.leaveStatus === 'Approved' || infoData.leaveStatus === 'Pending' || infoData.leaveStatus === 'Rejected'\"\n class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': infoData.leaveStatus === 'Approved', \n 'bg-warning': infoData.leaveStatus === 'Pending',\n 'bg-danger': infoData.leaveStatus === 'Rejected'}\">\n {{ infoData.leaveStatus || '' }}</span>\n <span\n *ngIf=\"infoData.leaveStatus !== 'Approved' && infoData.leaveStatus !== 'Pending' && infoData.leaveStatus !== 'Rejected'\">{{\n infoData.leaveStatus || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.REASON' | customTranslate : 'Reason'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.reason || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.TYPE' | customTranslate : 'Type'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.type || ''}}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPLIED_ON' | customTranslate : 'Applied On'}}:</div>\n <div class=\"col-6 text-start\">{{ (infoData.appliedOn | date:'short') || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVED_COUNT' | customTranslate : 'Approved Count'}}:</div>\n <div class=\"col-6 text-start\">{{ infoData.approvedCount || '' }}</div>\n </div>\n </div>\n </div>\n <!-- Approval Managers -->\n <!-- SK03DEC24 show approval managers list only if applicable -->\n <h3 *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"text-center mb-3\">\n {{'APP.APPROVAL_MANAGERS' | customTranslate : 'Approval Managers'}}</h3>\n <ul *ngIf=\"infoData.approvalManagers != undefined && infoData.approvalManagers.length > 0\" class=\"list-group\">\n <li *ngFor=\"let manager of infoData.approvalManagers\" class=\"list-group-item\">\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_ID' | customTranslate : 'Employee ID'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.employeeId || ''}}</div>\n </div>\n <div class=\"row mb-3\">\n <!-- SK10DEC24 to show manager name -->\n <div class=\"col-6 text-start\">{{'APP.EMPLOYEE_NAME' | customTranslate : 'Employee Name'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.name || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.APPROVAL_ORDER' | customTranslate : 'Approval Order'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.approvalOrder || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.STATUS' | customTranslate : 'Status'}}:</div>\n <div class=\"col-6 text-start\">\n <span *ngIf=\"manager.status === 'Approved' || manager.status === 'Pending' || manager.status === 'Rejected'\"\n class=\"badge custom-badge\" [ngClass]=\"{\n 'bg-success': manager.status === 'Approved', \n 'bg-warning': manager.status === 'Pending',\n 'bg-danger': manager.status === 'Rejected'}\">\n {{ manager.status || '' }}\n </span>\n <span\n *ngIf=\"manager.status !== 'Approved' && manager.status !== 'Pending' && manager.status !== 'Rejected'\"> {{\n manager.status || '' }}</span>\n </div>\n </div>\n <div class=\"row mb-3\" *ngIf=\"manager.viewedOn\">\n <div class=\"col-6 text-start\">{{'APP.VIEWED_ON' | customTranslate : 'Viewed On'}}:</div>\n <div class=\"col-6 text-start\">{{ (manager.viewedOn | date:'short') || '' }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.IS_OPTIONAL' | customTranslate : 'Is Optional'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.isOptional ? \"Yes\" : \"No\" }}</div>\n </div>\n <div class=\"row mb-3\">\n <div class=\"col-6 text-start\">{{'APP.COMMENTS' | customTranslate : 'Comments'}}:</div>\n <div class=\"col-6 text-start\">{{ manager.rejectionReason || '' }}</div>\n </div>\n </li>\n </ul>\n </div>\n</app-common-screen>\n\n<!-- MR 09NOV26 Sandwich Leave Confirmation Modal -->\n<div *ngIf=\"confirmModal\" class=\"custom-modal-overlay\">\n <div class=\"custom-modal\">\n <div class=\"custom-modal-header\">\n <b>{{ 'APP_HRM_ATTENDANCE.CHECK_ATTENDANCE' | customTranslate : 'Check Attendance' }}</b>\n <button class=\"close-button\" (click)=\"confirmModal = false\">×</button>\n </div>\n <div class=\"custom-modal-body\">\n {{ 'APP_HRM_ATTENDANCE.CONFIRM_CHECK' | customTranslate : 'Are you sure you want to run attendance check?' }}\n </div>\n <div class=\"custom-modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"checkButtonClicked(); confirmModal = false\">{{ 'APP.YES' | customTranslate : 'Yes' }}</button>\n <button class=\"btn btn-secondary ms-2\" (click)=\"confirmModal = false\">{{ 'APP.NO' | customTranslate : 'No' }}</button>\n </div>\n </div>\n</div>","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnInit, Output, Renderer2, ViewChild } from '@angular/core';\nimport { ApiService } from '../../services/api.service';\nimport { CustomTranslatePipe } from '../../pipes/custom-translate.pipe';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Modal } from 'bootstrap';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { CustomDatePipe } from '../../pipes/custom-date.pipe';\nimport { LoaderService } from '../../services/loading.service';\n\n@Component({\n selector: 'fusion-card',\n standalone: true,\n imports: [CommonModule, CustomTranslatePipe, MatTooltipModule, CustomDatePipe],\n providers: [DatePipe],\n templateUrl: './fusion-card.component.html',\n styleUrl: './fusion-card.component.css'\n})\nexport class FusionCardComponent implements OnInit {\n // MR 28SEP26 Reactive setter & loader sync for cardData input lifecycle\n private _cardData: any[] = [];\n\n @Input()\n set cardData(data: any) {\n if (Array.isArray(data)) {\n this._cardData = data;\n this.calculateCardMarginTop();\n } else {\n this._cardData = [];\n }\n this.cdr.markForCheck();\n }\n get cardData(): any[] {\n return this._cardData;\n }\n\n @Input() from: any;\n @Input() comp: any = {};\n\n @Output() cardButtonEmit = new EventEmitter<any>();\n\n deleteModal = false; // SKS30MAY25 for confirmation popup\n deleteData: any; // SKS30MAY25 to get the delete row\n currentOpenIndex: number | null = null; // track the current open action dropdown icon index\n clickListener: any; // SKS30MAY25 action column dropdown button click listener\n modalDirect!: Modal; // SKS30MAY25 bootstrap modal\n safeSrc: SafeResourceUrl | null = null;\n isLoading: boolean[] = []; // SKS18NOV25 download loader\n isViewLoading: boolean[] = []; // SKS18NOV25 view/preview loader\n popupTitle: any;\n @ViewChild('file') file!: ElementRef<any>;\n isCardLoading: any;\n\n constructor(\n private sanitizer: DomSanitizer,\n private renderer: Renderer2,\n private apiService: ApiService,\n private datePipe: DatePipe,\n private loaderService: LoaderService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.loaderService.loading.subscribe((loadingStates) => {\n this.isCardLoading = loadingStates;\n this.cdr.markForCheck();\n });\n }\n\n // MR 28SEP26 Calculate card top margins safely for valid cardData arrays\n private calculateCardMarginTop(): void {\n let total = 0;\n for (const card of this._cardData) {\n const size = Number(card?.cardSize?.split('-')?.[2]);\n total += size;\n card.marginTop = total < 13 ? '0px' : '10px';\n }\n }\n\n // SKS15FEB25 on delete click save the data in variables\n deleteRecord(data: any) {\n this.deleteData = data;\n this.deleteModal = true;\n }\n\n // SKS15FEB25 after clicking yes in delete alert modal, emit to parent\n deleteRecordData() {\n this.cardButtonEmit.emit(this.deleteData);\n this.deleteModal = false;\n }\n\n actionButtonClicked(event: any, card: any) {\n if (event.type === 'delete') {\n this.deleteRecord({ event, card });\n } else {\n this.cardButtonEmit.emit({ event, card });\n }\n }\n\n // SKS15FEB25 Action button conditionally displayed function\n isConditionMet(element: any, conditions: any): boolean {\n if (conditions !== undefined) {\n const { andConditionList, orConditionList } = conditions;\n const isAndConditionMet = andConditionList ? andConditionList.every((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond.condition) ? cond.condition.includes(element[cond.column]) : cond.condition === element[cond.column]\n ) : true;\n const isOrConditionMet = orConditionList ? orConditionList.some((cond: { condition: string | any[]; column: string | number; }) =>\n Array.isArray(cond.condition) ? cond.condition.includes(element[cond.column]) : cond.condition === element[cond.column]\n ) : true;\n return isAndConditionMet && isOrConditionMet;\n } else {\n return true;\n }\n }\n\n // SKS15FEB25 action column dropdown buttons open / close\n toggleDropdown(index: number) {\n this.currentOpenIndex = this.currentOpenIndex === index ? null : index;\n this.addClickOutsideListener();\n }\n\n private addClickOutsideListener() {\n if (!this.clickListener) {\n this.clickListener = this.renderer.listen('document', 'click', (event: any) => {\n if (!event.target.closest('.dropdown')) {\n this.currentOpenIndex = null;\n this.removeClickListener();\n }\n });\n }\n }\n\n private removeClickListener() {\n if (this.clickListener) {\n this.clickListener();\n this.clickListener = null;\n }\n }\n\n onMouseEnter(event: MouseEvent, styleName: any, color: string): void {\n (event.target as HTMLElement).style[styleName] = styleName === 'border' ? `1px solid ${color}` : color;\n }\n\n onMouseLeave(event: MouseEvent, styleName: any, color: string): void {\n (event.target as HTMLElement).style[styleName] = styleName === 'border' ? `1px solid ${color}` : color;\n }\n\n fileClick(evt: any, index: number) {\n this.isViewLoading[index] = true;\n this.cdr.markForCheck();\n let event = evt?.file || evt;\n const fileId = evt?.id || evt?._id || evt?.fileID || evt?.fileId;\n\n if (fileId) {\n this.apiService.fetchData('/file?id=' + fileId).subscribe({\n next: (file: any) => {\n this.popupTitle = file.name || evt?.name || 'File Preview';\n const buffer = new Uint8Array(file.content.data);\n const blob = new Blob([buffer], { type: file?.type || evt?.fileType || 'application/pdf' });\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const fileOutput = e.target.result;\n this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(fileOutput);\n if (this.file?.nativeElement) {\n this.modalDirect = new Modal(this.file.nativeElement, { backdrop: 'static' });\n this.modalDirect.show();\n }\n this.stopViewLoader(index);\n this.cdr.markForCheck();\n };\n reader.readAsDataURL(blob);\n },\n error: () => this.stopViewLoader(index)\n });\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', event, true);\n request.responseType = 'blob';\n\n request.onload = () => {\n this.popupTitle = evt?.name || 'File Preview';\n const blob = request.response;\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const fileOutput = e.target.result;\n this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(fileOutput);\n if (this.file?.nativeElement) {\n this.modalDirect = new Modal(this.file.nativeElement, { backdrop: 'static' });\n this.modalDirect.show();\n }\n this.stopViewLoader(index);\n this.cdr.markForCheck();\n };\n reader.readAsDataURL(blob);\n };\n request.onerror = () => this.stopViewLoader(index);\n request.send();\n }\n }\n\n closeModal() {\n this.safeSrc = null;\n this.popupTitle = '';\n this.cdr.markForCheck();\n }\n\n private stopViewLoader(index: number) {\n setTimeout(() => {\n this.isViewLoading[index] = false;\n this.cdr.markForCheck();\n }, 300);\n }\n\n downloadFile(evt: any, index: number) {\n this.isLoading[index] = true;\n this.cdr.markForCheck();\n const fileId = evt?.id || evt?._id || evt?.fileID || evt?.fileId;\n\n if (fileId) {\n this.apiService.fetchData('/file?id=' + fileId).subscribe({\n next: (file: any) => {\n const buffer = new Uint8Array(file.content.data);\n const blob = new Blob([buffer], { type: file?.type || evt?.fileType });\n const url = window.URL.createObjectURL(blob);\n this.triggerDownload(url, evt.name || file.name);\n this.stopLoader(index);\n },\n error: () => this.stopLoader(index)\n });\n } else {\n const request = new XMLHttpRequest();\n request.open('GET', evt?.file || evt, true);\n request.responseType = 'blob';\n request.onload = () => {\n const url = window.URL.createObjectURL(request.response);\n this.triggerDownload(url, evt.name);\n this.stopLoader(index);\n };\n request.onerror = () => this.stopLoader(index);\n request.send();\n }\n }\n\n private triggerDownload(url: string, name: string) {\n const a = document.createElement('a');\n a.href = url;\n a.download = name || 'downloaded-file';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n\n private stopLoader(index: number) {\n setTimeout(() => {\n this.isLoading[index] = false;\n this.cdr.markForCheck();\n }, 400);\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<div *ngIf=\"!(isCardLoading?.[comp?._id]?.length > 0) && (!cardData || cardData.length === 0)\" class=\"no-records-container\">\n <div class=\"text-center p-4\">\n <div class=\"no-records-message\">\n <div class=\"mt-3 mb-2\">{{'APP.NO_RECORDS_AVAILABLE' | customTranslate : 'No Records Available'}}</div>\n </div>\n </div>\n</div>\n<div *ngIf=\"isCardLoading?.[comp?._id]?.length > 0; else viewCard\">\n <div class=\"card fc-card fc-card-light skeleton-card\" style=\"height: 200px; border: none;\">\n <div *ngFor=\"let n of [1, 2]\" class=\"flex\" style=\"padding: 25px 0px;\">\n <div *ngFor=\"let e of [1, 2]\" style=\"width: 50%; padding: 5px;\">\n <div class=\"\" style=\"height: 25px;\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\" style=\"width: 95%;\"></div>\n <div class=\"skeleton skeleton-text\" style=\"width: 65%;\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #viewCard>\n <div *ngIf=\"cardData && cardData.length > 0\" [class.col-md-12]=\"cardData.length > 0\" [class.dashboard-card-grid]=\"from === 'dashboard'\" style=\"height: 100%;\">\n <div class=\"row\" [ngClass]=\"{\n 'g-2': cardData.length > 1 && from !== 'dashboard',\n 'gutter-remove': from === 'dashboard'\n }\">\n <div *ngFor=\"let card of cardData; let i = index\" class=\"{{card.cardSize}} inside-card\" [ngClass]=\"{'no-padding-margin':from ==='dashboard' ? cardData.length === 1 : false, 'multy-card':from ==='dashboard' ? cardData.length > 1 : false}\" style=\"height: 100%;\" [ngStyle]=\"{'margin-top': card.marginTop}\">\n <div *ngIf=\"card?.config?.details\" style=\"height: 100%;\">\n <div class=\"width-100\" [ngClass]=\"{'static-width-for-card': from === 'dashboard' ? cardData.length != 1 : true}\" [style.border]=\"(from === 'dashboard' && cardData.length === 1 ) ? 'none' : ''\" style=\"height: 100%;\" [ngStyle]=\"from === 'dashboard' && cardData.length === 1 \n ? {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)'\n } \n : null\">\n <div *ngIf=\"card.isTitleHide ? card.isTitleHide === 'true' ? false : true : true\" class=\"header-section flex content-space-between\" style=\"align-items: center;\">\n <div class=\"section-title\">{{card.labelPath || card.label | customTranslate : card.label}}</div>\n <div class=\"actionButton\" style=\"display: flex; align-items: center;\">\n <div *ngFor=\"let button of card?.actionButton?.buttonArray; let i = index\">\n <div *ngIf=\"i < card?.actionButton?.size\"\n style=\"margin-left: 3px; margin-right: 3px;\">\n <div *ngIf=\"isConditionMet(card, button.conditions)\"\n [matTooltip]=\"button.tooltipPath || button.tooltip | customTranslate : button.tooltip\"\n (click)=\"actionButtonClicked(button,card)\"\n (mouseenter)=\"onMouseEnter($event,'border', button.hoverBorderColor)\"\n (mouseleave)=\"onMouseLeave($event,'border', button.borderColor)\"\n style=\"padding: 2px; border-radius: {{button.borderRadius}}px; border: 1px solid {{button.borderColor}};\">\n <div (mouseenter)=\"onMouseEnter($event,'backgroundColor', button.hoverBackgroundColor)\"\n (mouseleave)=\"onMouseLeave($event,'backgroundColor', button.backgroundColor)\"\n style=\"padding: {{button.padding}}px; border-radius: {{button.borderRadius}}px; background-color: {{button.backgroundColor}}; display: flex; gap: 2px; align-items: center;\">\n <img *ngIf=\"button.iconSrc && (button.iconSrc?.startsWith('data:') || button.iconSrc?.startsWith('http'))\"\n #imgElement\n [src]=\"button.iconSrc\"\n style=\"cursor: pointer;\"\n (mouseenter)=\"imgElement.src = button.hoverIconSrc || button.iconSrc\"\n (mouseleave)=\"imgElement.src = button.iconSrc\"/>\n <i *ngIf=\"!(button.iconSrc?.startsWith('data:') || button.iconSrc?.startsWith('http'))\"\n class=\"fusion-icon nav-icon\"\n [ngClass]=\"button.iconSrc\"\n style=\"margin: 0px !important; font-size: var(--fs-normal, 16px) !important; color: var(--fc-sub-lite, #787486);\">\n </i>\n <div *ngIf=\"button.isLabel\" style=\"color: {{button.labelColor}}; font-size: 12px;\"> {{button.label || button.tooltip | customTranslate : button.label || button.tooltip}}</div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"card?.actionButton?.buttonArray && card?.actionButton?.buttonArray?.length > 0 && card?.actionButton?.buttonArray?.slice(card?.actionButton?.size) && card?.actionButton?.buttonArray?.slice(card?.actionButton?.size).length > 0\"\n class=\"dropdown\">\n <div class=\"clickable-img\" (click)=\"toggleDropdown(i)\"\n style=\"margin-left: 3px; margin-right: 3px;\">\n <div style=\"background-color: var(--comp-bg-secondary, #f5f5f5); padding: 2px 2px; border-radius: var(--radius-small, 5px);\">\n <i class=\"fusion-icon fusion-icon-size-lg fusion-icon-arrow-square-down nav-icon\" style=\"background-color: var(--comp-bg-secondary, #f5f5f5); border-radius: var(--radius-small, 5px); border: 1px solid var(--border-color, #6c757d);\"></i>\n </div>\n </div>\n\n <div class=\"dropdown-menu\"\n [style.right]=\"(((card?.actionButton?.size ?? 0) - (card?.actionButton?.buttonArray?.size ?? 0) + ((card?.actionButton?.buttonArray?.slice(card?.actionButton?.size)?.length ?? 0) > 0 ? 1 : 0)) * 100) + '%'\"\n *ngIf=\"currentOpenIndex === i\">\n <div *ngFor=\"let btn of card?.actionButton?.buttonArray?.slice(card?.actionButton?.size)\">\n <button *ngIf=\"isConditionMet(card, btn.conditions)\" \n style=\"display: flex;\" type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [matTooltip]=\"btn.tooltipPath || btn.tooltip | customTranslate : btn.tooltip\" [disabled]=\"btn.buttonDisable\"\n (click)=\"actionButtonClicked(btn,card)\">\n <img *ngIf=\"btn.iconSrc\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 10px;\">\n {{btn.labelPath || btn.namePath || btn.name | customTranslate : btn.label || btn.name}}</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"body-section card-text\" style=\"height: 100%;\" [ngStyle]=\"{ padding: card?.config?.padding || null }\">\n <div class=\"flex w-100\" [ngClass]=\"{\n 'row': card?.config?.details?.length > 1,\n 'gutter-remove': from === 'dashboard' && card?.config?.details?.length > 1\n }\" style=\"height: 100%;\">\n <ng-container *ngFor=\"let detail of card?.config?.details\">\n <div *ngIf=\"!detail?.hideFromCard\" class=\"{{detail.size || card.cardInlineSize}} card-detail d-flex flex-column\" [ngClass]=\"detail.alignment\">\n <div *ngIf=\"detail.iconSrc && detail.iconPosition !== 'end'\" class=\"icon-container d-flex\">\n <div class=\"icon-wrapper\" [style.border]=\"'4px solid gray'\">\n <img [src]=\"detail.iconSrc\" alt=\"Icon\">\n </div>\n </div>\n\n <div *ngIf=\"!detail.isLabelHide && detail?.type !== 'image'\" class=\"label-head\" [ngClass]=\"detail.labelFont\">{{detail.labelPath || detail.label | customTranslate : detail.label}}</div>\n\n <div [ngClass]=\"detail?.type !== 'image' && detail?.type !== 'file' ? 'flex-column' : ''\" [class.detail-value-wrapper]=\"detail?.type !== 'image' && detail.truncate\">\n <div *ngIf=\"detail?.type !== 'date' && detail?.type !== 'time' && detail?.type !== 'datetime' && detail?.type !== 'label' && detail?.type !== 'image' && detail?.type !== 'file'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">\n {{\n (detail?.type === 'boolean' || (detail?.value === true || detail?.value === false))\n ? (detail?.value === true ? 'True' : 'False')\n : (detail?.value || detail.value === 0)\n ? detail.value\n : '-'\n }}\n </div>\n <div *ngIf=\"detail?.type === 'date'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">{{ (detail?.value | customDate) || '-' }}</div>\n <div *ngIf=\"detail?.type === 'datetime'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">{{ (detail?.value | customDate : 'datetime') || '-' }}</div>\n <div *ngIf=\"detail?.type === 'time'\" class=\"label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\">{{ (detail?.value | customDate : 'time') || '-' }}</div>\n <div *ngIf=\"detail?.type === 'link'\" class=\"ms-2\">\n <a *ngIf=\"detail?.redirectOnClick\"\n [href]=\"'//'+detail?.value\"\n [target]=\"detail?.openInNewTab ? '_blank' : '_self'\"\n class=\"form-label label-head\">\n <img [src]=\"detail?.srcImg\" />\n </a>\n </div>\n <div *ngIf=\"detail?.type === 'image'\">\n <img [style.height.%]=\"detail.imgHeight\" [src]=\"(detail?.value || detail?.defaultValue)\" style=\"width: 100%; max-height: 100%; object-fit: contain;\"/>\n </div>\n <div *ngIf=\"detail?.type === 'file'\">\n <div class=\"cursor-pointer label-sub\" [ngClass]=\"detail.valueFont\" [class.truncate]=\"detail.truncate\" (click)=\"fileClick(detail.value, i)\">{{detail?.isLabel ? detail.value.name : ''}}</div>\n <div class=\"flex\" *ngIf=\"detail?.value\">\n <img *ngIf=\"detail?.type === 'file' && !isLoading[i]\"\n src=\"../assets/images/icons/general/download-icon.svg\"\n class=\"card-icon color\"\n title=\"download\"\n (click)=\"downloadFile(detail.value, i)\"\n style=\"cursor: pointer; width:17px\">\n <svg *ngIf=\"detail?.type === 'file' && isLoading[i]\"\n class=\"svg-spinner card-icon color\"\n width=\"22\" height=\"22\" viewBox=\"0 0 50 50\"\n style=\"cursor: wait;\">\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\n </svg>\n <img *ngIf=\"detail?.isView && !isViewLoading[i]\"\n src=\"../assets/images/icons/general/preview.svg\"\n class=\"card-icon color\"\n title=\"preview\"\n (click)=\"fileClick(detail.value, i)\"\n style=\"cursor: pointer; width:20px\">\n <svg *ngIf=\"detail?.isView && isViewLoading[i]\"\n class=\"svg-spinner card-icon color\"\n width=\"22\" height=\"22\" viewBox=\"0 0 50 50\"\n style=\"cursor: wait;\">\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\n </svg>\n </div>\n </div>\n </div>\n <div *ngIf=\"detail.iconSrc && detail.iconPosition === 'end'\" class=\"icon-container d-flex\">\n <div class=\"icon-wrapper\" [style.border]=\"'4px solid gray'\">\n <img [src]=\"detail.iconSrc\" alt=\"Icon\">\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<div *ngIf=\"deleteModal\" class=\"custom-modal-overlay\">\n <div class=\"custom-modal\">\n <div class=\"custom-modal-header\">\n <b>{{ 'APP.DELETE_RECORD'| customTranslate : 'Delete Record'}}</b>\n <button class=\"close-button\" (click)=\"deleteModal = false\">×</button>\n </div>\n <div class=\"custom-modal-body\">\n {{ 'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC'| customTranslate : 'Are you sure you want to delete the record'}} ?\n </div>\n <div class=\"custom-modal-footer\">\n <button class=\"confirm-button\" (click)=\"deleteRecordData()\">{{ 'APP.YES'| customTranslate : 'Yes'}}</button>\n <button class=\"cancel-button\" (click)=\"deleteModal = false\">{{ 'APP.NO'| customTranslate : 'No'}}</button>\n </div>\n </div>\n</div>\n\n<div class=\"modal fade container-sm\" id=\"file\" aria-labelledby=\"file\" \naria-hidden=\"true\" #file>\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <div class=\"modal-title fs-5\" id=\"expenseReceiptModelLabel\">{{popupTitle}}</div>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" (click)=\"closeModal()\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <iframe class=\"receipt-view\" *ngIf=\"safeSrc\" [src]=\"safeSrc\" style=\"width: 100%; height: 500px; border: none;\"></iframe>\n </div>\n </div>\n </div>\n</div>\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { InjectionToken } from '@angular/core';\nimport { ToastGlobalConfig } from './toast.model';\n\nexport const TOAST_GLOBAL_CONFIG = new InjectionToken<ToastGlobalConfig>('TOAST_GLOBAL_CONFIG');\n\nexport function provideToastConfig(config: ToastGlobalConfig) {\n return [{ provide: TOAST_GLOBAL_CONFIG, useValue: config }];\n}\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Injectable, Inject, Optional } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ToastConfig, ToastGlobalConfig } from './toast.model';\nimport { TOAST_GLOBAL_CONFIG } from './toast.tokens';\n\nfunction generateToastId(): string {\n return Math.random().toString(36).slice(2, 9);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n private _toasts$ = new BehaviorSubject<ToastConfig[]>([]);\n readonly toasts$ = this._toasts$.asObservable();\n\n private global: ToastGlobalConfig = {};\n private removalTimers = new Map<string, any>();\n\n constructor(@Optional() @Inject(TOAST_GLOBAL_CONFIG) cfg?: ToastGlobalConfig) {\n this.global = cfg || {};\n }\n\n private get toasts(): ToastConfig[] {\n return this._toasts$.value;\n }\n\n private emit(toasts: ToastConfig[]): void {\n this._toasts$.next([...toasts]);\n }\n\n private scheduleRemoval(t: ToastConfig): void {\n if (!t.duration || t.duration <= 0) return;\n const handle = setTimeout(() => this.startLeavingAndRemove(t.id!), t.duration);\n this.removalTimers.set(t.id!, handle);\n }\n\n private clearRemovalTimer(id: string): void {\n const h = this.removalTimers.get(id);\n if (h) {\n clearTimeout(h);\n this.removalTimers.delete(id);\n }\n }\n\n show(cfg: ToastConfig): string {\n const toast: ToastConfig = {\n id: generateToastId(),\n type: 'info',\n duration: this.global.defaultDuration ?? 5000,\n ...cfg\n };\n\n const list = [toast, ...this.toasts];\n if (this.global.maxToasts && list.length > this.global.maxToasts) {\n list.splice(this.global.maxToasts);\n }\n\n this.emit(list);\n this.scheduleRemoval(toast);\n return toast.id!;\n }\n\n showSuccess(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'success', ...opts });\n }\n\n showError(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'error', ...opts });\n }\n\n showInfo(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'info', ...opts });\n }\n\n showWarning(message: string, title?: string, opts?: Partial<ToastConfig>): string {\n return this.show({ message, title, type: 'warning', ...opts });\n }\n\n startLeavingAndRemove(id: string): void {\n const list = this.toasts.map(t => (t.id === id ? { ...t, _leaving: true } : t));\n this.emit(list);\n setTimeout(() => this.remove(id), 220);\n this.clearRemovalTimer(id);\n }\n\n remove(id: string): void {\n this.clearRemovalTimer(id);\n this.emit(this.toasts.filter(t => t.id !== id));\n }\n\n clear(): void {\n this.removalTimers.forEach(h => clearTimeout(h));\n this.removalTimers.clear();\n this.emit([]);\n }\n\n pause(id: string): void {\n this.clearRemovalTimer(id);\n }\n\n resume(id: string, remaining?: number): void {\n const t = this.toasts.find(x => x.id === id);\n if (t) {\n const dur = remaining ?? t.duration ?? this.global.defaultDuration ?? 5000;\n this.scheduleRemoval({ ...t, duration: dur });\n }\n }\n}\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Component, OnInit, OnDestroy, Input, ElementRef, ChangeDetectorRef, ChangeDetectionStrategy, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { ToastConfig, ToastGlobalConfig } from './toast.model';\nimport { ToastService } from './toast.service';\nimport { TOAST_GLOBAL_CONFIG } from './toast.tokens';\n\n@Component({\n selector: 'app-toast, fusion-toast',\n templateUrl: './toast.component.html',\n styleUrls: ['./toast.component.css'],\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ToastComponent implements OnInit, OnDestroy {\n toasts: ToastConfig[] = [];\n private sub = new Subscription();\n\n @Input() position: ToastGlobalConfig['position'];\n @Input() enableAnimation?: boolean;\n @Input() pauseOnHover?: boolean;\n @Input() defaultDuration?: number = 5000;\n\n positionClass = 'top-right';\n\n constructor(\n private toastService: ToastService,\n private el: ElementRef,\n private cdr: ChangeDetectorRef,\n @Optional() @Inject(TOAST_GLOBAL_CONFIG) private globalCfg?: ToastGlobalConfig\n ) {}\n\n ngOnInit(): void {\n const merged: ToastGlobalConfig = {\n ...(this.globalCfg || {}),\n position: this.position ?? this.globalCfg?.position,\n enableAnimation: this.enableAnimation ?? this.globalCfg?.enableAnimation,\n pauseOnHover: this.pauseOnHover ?? this.globalCfg?.pauseOnHover,\n defaultDuration: this.defaultDuration ?? this.globalCfg?.defaultDuration\n };\n this.positionClass = merged.position ?? 'top-right';\n this.defaultDuration = merged.defaultDuration ?? 5000;\n\n this.sub.add(\n this.toastService.toasts$.subscribe((list) => {\n this.toasts = list;\n this.cdr.markForCheck();\n })\n );\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n }\n\n trackById(_: number, t: ToastConfig): string | undefined {\n return t.id;\n }\n\n dismiss(id?: string): void {\n if (id) {\n this.toastService.startLeavingAndRemove(id);\n }\n }\n\n onMouseEnter(t: ToastConfig, e: MouseEvent): void {\n if (this.pauseOnHover ?? this.globalCfg?.pauseOnHover) {\n const el = e.currentTarget as HTMLElement;\n el.style.setProperty('--toast-playstate', 'paused');\n this.toastService.pause(t.id!);\n }\n }\n\n onMouseLeave(t: ToastConfig, e: MouseEvent): void {\n if (this.pauseOnHover ?? this.globalCfg?.pauseOnHover) {\n const el = e.currentTarget as HTMLElement;\n el.style.setProperty('--toast-playstate', 'running');\n this.toastService.resume(t.id!, t.duration);\n }\n }\n\n progressState(): string {\n return 'var(--toast-playstate, running)';\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<div class=\"toast-container\" [class]=\"positionClass\">\n <div\n class=\"toast\"\n *ngFor=\"let t of toasts; trackBy: trackById\"\n [class.leaving]=\"t._leaving\"\n [attr.data-type]=\"t.type\"\n [style.background]=\"t.background || ''\"\n [style.color]=\"t.textColor || ''\"\n (mouseenter)=\"onMouseEnter(t, $event)\"\n (mouseleave)=\"onMouseLeave(t, $event)\"\n >\n <div style=\"display: flex; width: 100%; align-items: center;\">\n <div class=\"toast-left\">\n <i *ngIf=\"t.icon\" class=\"fusion-icon fusion-icon-size-lg {{t.icon}} nav-icon icon\" style=\"color: var(--fc-text-color-dark, #000000) !important;\"></i>\n <div class=\"icon default\" *ngIf=\"!t.icon\">\n @switch (t.type) {\n @case ('success') {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M9 16.2l-3.5-3.5L4 14l5 5 12-12-1.5-1.5z\"/>\n </svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm5 13.6L13.6 17 12 15.4 10.4 17 7 13.6 8.6 12 7 10.4 10.4 7 12 8.6 13.6 7 17 10.4 15.4 12 17 13.6z\"/>\n </svg>\n }\n @case ('warning') {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n }\n @default {\n <svg viewBox=\"0 0 24 24\" class=\"default-svg\">\n <path fill=\"currentColor\" d=\"M12 2v20M2 12h20\"/>\n </svg>\n }\n }\n </div>\n </div>\n\n <div class=\"toast-body\">\n <div class=\"title\" *ngIf=\"t.title\">{{ t.title }}</div>\n <div class=\"message\">{{ t.message }}</div>\n </div>\n\n <button class=\"close\" (click)=\"dismiss(t.id)\" aria-label=\"Close\">×</button>\n </div>\n\n <div class=\"progress\" *ngIf=\"t.duration && t.duration > 0\">\n <div class=\"bar\" [style.--toast-duration]=\"t.duration + 'ms'\" [style.animation-play-state]=\"progressState()\"></div>\n </div>\n </div>\n</div>\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n OnInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRippleModule } from '@angular/material/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'app-multi-select-dropdown, fusion-multi-select-dropdown',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatCheckboxModule,\n MatRippleModule,\n MatChipsModule,\n ],\n templateUrl: './multi-select-dropdown.component.html',\n styleUrls: ['./multi-select-dropdown.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MultiSelectDropdownComponent implements OnChanges, OnInit, OnDestroy {\n @Input() public label: string = 'Select';\n @Input() public list: any[] = [];\n @Input() public isAll: boolean = false;\n @Output() public shareCheckedList = new EventEmitter<string[]>();\n\n public control = new FormControl<any[]>([]);\n public filteredItemList: any[] = [];\n public selectedItemList: any[] = [];\n public value: string = '';\n\n private destroy$ = new Subject<void>();\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['list']) {\n this.filteredItemList = [...(this.list || [])];\n this.cdr.markForCheck();\n }\n }\n\n ngOnInit(): void {\n this.control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((selected) => {\n this.selectedItemList = selected || [];\n this.emitSelectedIds();\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n compareItems(o1: any, o2: any): boolean {\n return o1 && o2 ? o1._id === o2._id : o1 === o2;\n }\n\n toggleSelectAll(): void {\n if (this.isAllSelected()) {\n this.control.setValue([], { emitEvent: false });\n this.selectedItemList = [];\n } else {\n this.control.setValue([...this.filteredItemList], { emitEvent: false });\n this.selectedItemList = [...this.filteredItemList];\n }\n this.emitSelectedIds();\n this.cdr.markForCheck();\n }\n\n isAllSelected(): boolean {\n return (\n this.filteredItemList.length > 0 &&\n this.filteredItemList.every((item) =>\n this.control.value?.some((selected) => selected._id === item._id)\n )\n );\n }\n\n onFilterChange(event: string): void {\n const lower = event?.toLowerCase() || '';\n this.filteredItemList = (this.list || []).filter(\n (option) =>\n option?._id?.toString().toLowerCase().includes(lower) ||\n option?.label?.toLowerCase().includes(lower)\n );\n this.cdr.markForCheck();\n }\n\n clearFilter(): void {\n this.value = '';\n this.filteredItemList = [...(this.list || [])];\n this.cdr.markForCheck();\n }\n\n removeChip(item: any): void {\n const updated = this.control.value?.filter((i) => i._id !== item._id) || [];\n this.control.setValue(updated, { emitEvent: false });\n this.selectedItemList = updated;\n this.emitSelectedIds();\n this.cdr.markForCheck();\n }\n\n private emitSelectedIds(): void {\n const ids = this.selectedItemList.map((i) => i._id);\n this.shareCheckedList.emit(ids);\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<mat-form-field style=\"width: 100%;\">\n <mat-label>{{ label }}</mat-label>\n\n <div style=\"margin-bottom: 5px;\">\n @for (selectedItem of selectedItemList; track selectedItem) {\n <mat-chip style=\"margin: 5px;\" [removable]=\"true\" (removed)=\"removeChip(selectedItem)\">\n {{ selectedItem._id }} ({{ selectedItem.label }})\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n }\n </div>\n\n <mat-select [formControl]=\"control\" multiple [compareWith]=\"compareItems\">\n <mat-select-trigger></mat-select-trigger>\n\n <mat-form-field style=\"width: 100%;\" appearance=\"outline\">\n <mat-label>Search {{ label }}</mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"value\" (ngModelChange)=\"onFilterChange($event)\" />\n @if (value) {\n <button style=\"position: absolute; right: -10px; top: 5px;\" mat-icon-button aria-label=\"Clear\"\n (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n @if (filteredItemList.length > 0 && isAll) {\n <mat-checkbox color=\"primary\" style=\"user-select: none; width: 100%; cursor: pointer; padding: 5px;\" matRipple\n [checked]=\"isAllSelected()\" (click)=\"toggleSelectAll()\">\n <span [style.color]=\"isAllSelected() ? 'var(--fc-primary-color, #0070d2)' : 'inherit'\" style=\"font-size: var(--fs-normal, 16px);\">All</span>\n </mat-checkbox>\n }\n\n @for (item of filteredItemList; track item) {\n <mat-option [value]=\"item\">\n {{ item._id }} ({{ item.label }})\n </mat-option>\n }\n\n @if (filteredItemList.length == 0) {\n <div style=\"padding: 5px 10px;\">No results found!</div>\n }\n </mat-select>\n</mat-form-field>\n\n","// MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui\nimport { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { AlertService } from '../../services/alert.service';\n\nexport type AlertType = 'success' | 'failure' | 'error' | 'warning' | 'info';\n\n@Component({\n selector: 'fusion-alert, app-success-failure-message',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './alert.component.html',\n styleUrls: ['./alert.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AlertMessageComponent implements OnInit, OnDestroy {\n @Input() type: AlertType = 'info';\n @Input() message: string = '';\n @Input() dismissible: boolean = true;\n @Input() autoSubscribeAlertService: boolean = false;\n\n @Output() dismiss = new EventEmitter<void>();\n\n visible: boolean = true;\n private sub?: Subscription;\n\n constructor(\n private cdr: ChangeDetectorRef,\n @Optional() private alertService?: AlertService\n ) {}\n\n ngOnInit(): void {\n if (this.autoSubscribeAlertService && this.alertService) {\n this.sub = this.alertService.passAlertType$.subscribe((data: any) => {\n if (data) {\n this.type = (data.type === 'failure' || data.type === 'error') ? 'error' : (data.type || 'info');\n this.message = data.message || '';\n this.visible = true;\n this.cdr.markForCheck();\n }\n });\n }\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n onDismiss(): void {\n this.visible = false;\n this.dismiss.emit();\n this.cdr.markForCheck();\n }\n\n get normalizedType(): string {\n if (this.type === 'failure' || this.type === 'error') return 'failure';\n return this.type || 'info';\n }\n}\n\n","<!-- MR 09NOV26 Migration of Datatables and Tier 1 Primitives to fusion-ui -->\n<div *ngIf=\"visible && (message || true)\" class=\"alert alert-dismissible fade show form-submission-message\" [ngClass]=\"normalizedType\" role=\"alert\">\n <div class=\"info\">\n <div class=\"alert-icon\">\n <ng-content select=\"[alert-icon]\">\n @switch (normalizedType) {\n @case ('success') {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M9 16.2l-3.5-3.5L4 14l5 5 12-12-1.5-1.5z\"/>\n </svg>\n }\n @case ('failure') {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm5 13.6L13.6 17 12 15.4 10.4 17 7 13.6 8.6 12 7 10.4 10.4 7 12 8.6 13.6 7 17 10.4 15.4 12 17 13.6z\"/>\n </svg>\n }\n @case ('warning') {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/>\n </svg>\n }\n @default {\n <svg class=\"icon-svg\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12 2v20M2 12h20\"/>\n </svg>\n }\n }\n </ng-content>\n </div>\n\n <div class=\"alert-content\">\n <ng-content>{{ message }}</ng-content>\n </div>\n\n <button *ngIf=\"dismissible\" type=\"button\" class=\"close-btn\" (click)=\"onDismiss()\" aria-label=\"Close\">\n <svg viewBox=\"0 0 24 24\" class=\"cross-icon\">\n <path fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>\n </button>\n </div>\n</div>\n\n","/* MR 18OCT26 On-demand Amiri font loading for pdfMake to reduce initial bundle and TBT */\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PdfFontService {\n private fontLoadedPromise: Promise<void> | null = null;\n\n /**\n * Safely configures pdfMake fonts and vfs.\n * Max 2 fallbacks: 1. window.vfs if already loaded -> 2. Empty vfs map\n */\n configurePdfMake(pdfMakeInstance: any): void {\n if (!pdfMakeInstance) return;\n const win = typeof window !== 'undefined' ? (window as any) : {};\n pdfMakeInstance.vfs = win.vfs || {};\n pdfMakeInstance.fonts = {\n Amiri: {\n normal: 'Amiri-Regular.ttf',\n bold: 'Amiri-Regular.ttf',\n italics: 'Amiri-Regular.ttf',\n bolditalics: 'Amiri-Regular.ttf'\n }\n };\n }\n\n /**\n * Dynamically loads vfs-amiri.js when PDF export is needed.\n * Max 2 fallbacks:\n * Fallback 1: Dynamic script load of /assets/fonts/vfs-amiri.js\n * Fallback 2: Graceful degradation to default pdfMake fonts if script fails to load\n */\n async ensureAmiriFont(pdfMakeInstance?: any): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n const win = window as any;\n if (win.vfs && win.vfs['Amiri-Regular.ttf']) {\n if (pdfMakeInstance) {\n this.configurePdfMake(pdfMakeInstance);\n }\n return;\n }\n\n if (!this.fontLoadedPromise) {\n this.fontLoadedPromise = new Promise<void>((resolve) => {\n const existing = document.querySelector('script[src*=\"vfs-amiri.js\"]');\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => resolve(), { once: true });\n return;\n }\n\n const script = document.createElement('script');\n script.src = '/assets/fonts/vfs-amiri.js';\n script.async = true;\n script.onload = () => {\n resolve();\n };\n script.onerror = (err) => {\n console.warn('MR 18OCT26 Unable to load Amiri font dynamically, falling back to default pdfMake fonts', err);\n resolve();\n };\n document.head.appendChild(script);\n });\n }\n\n await this.fontLoadedPromise;\n if (pdfMakeInstance) {\n this.configurePdfMake(pdfMakeInstance);\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport * as numberToWords from 'number-to-words';\n\n@Pipe({\n name: 'amountToWords',\n standalone: true\n})\nexport class AmountToWordsPipe implements PipeTransform {\n \n /* This pipe is used to convert the amount to words. For that, we need to install the plugin 'num-to-words' */ \n // MY 05OCT26 Add 'and' between thousand and remaining amount or after hundreds\n transform(value: number): string {\n if (value === null || value === undefined || isNaN(value)) {\n return '';\n }\n let words = numberToWords.toWords(value);\n words = words.replace(/thousand,\\s+(?!.*hundred)/i, 'thousand and ');\n words = words.replace(/hundred\\s+(?!(?:and|thousand|million|billion)\\b)/i, 'hundred and ');\n words = words.replace(/thousand,\\s+/i, 'thousand ');\n return words;\n }\n\n}\n"],"mappings":"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AAA,M;E,mBACA,MAAA,M;E,iBACA,MAAA,M;E,cACA,MAAA,M;E,eACA,MAAA,M;E,YACA,MAAA,M;E,UACA,MAAA,M;E,cACA,MAAA,M;E,gBACA,MAAA,M;E,SACA,MAAA,M;E,iBACA,MAAA,M;E,iBACA,MAAA,M;E,YACA,MAAA,M;E,cACA,MAAA,M;E,gBACA,MAAA,M;E,oBACA,MAAA,M;E,kBACA,MAAA,M;E,oBACA,MAAA,M;E,aACA,MAAA,M;E,iBACA,MAAA,M;E,0BACA,MAAA,M;E,oBACA,MAAA,M;E,qBACA,MAAA,M;E,iBACA,MAAA,M;E,wBACA,MAAA,M;E,4BACA,MAAA,M;E,4BACA,MAAA,M;E,eACA,MAAA,M;E,aACA,MAAA,M;E,cACA,MAAA,M;E,wBACA,MAAA,M;E,0BACA,MAAA,M;E,gBACA,MAAA,M;E,gBACA,MAAA,M;E,kBACA,MAAA,M;E,qBACA,MAAA,M;E,eACA,MAAA,M;E,mBACA,MAAA,M;E,iBACA,MAAA,M;E,gBACA,MAAA,M;E,kBACA,MAAA,M;E,yBACA,MAAA,M;E,4BACA,MAAA,M;E,kBAGA,MAAA,M;E,oBAMA,MAAA,M;E,yBACA,MAAA,M;E,kBACA,MAAA,M;E,iBACA,MAAA,M;E,SACA,MAAA,M;E,oBAGA,MAAA,M;E,kBACA,MAAA,M;E,eACA,MAAA,M;E,cACA,MAAA,M;E,SACA,MAAA,M;E,UACA,MAAA,M;E,WACA,MAAA,M;E,kBACA,MAAA,M;E,wBACA,MAAA,M;E,YACA,MAAA,M;E,sBAMA,MAAA,M;E,cAEA,MAAA,M;E,aAGA,MAAA,O;E,mBACA,MAAA,O;E,kBACA,MAAA,O;E,aACA,MAAA,O;E,kBACA,MAAA,O;E,qBACA,MAAA,O;E,sBACA,MAAA,O;E,eACA,MAAA,O;E,gBACA,MAAA,O;E,eACA,MAAA,O;E,mBACA,MAAA,O;E,qBACA,MAAA,O;E,mBACA,MAAA,O;E,mBACA,MAAA,O;E,iBACA,MAAA,O;E,eACA,MAAA,O;E,gBACA,MAAA,O;E,eACA,MAAA,O;E,0BACA,MAAA,O;E,0BACA,MAAA,O;E,wBACA,MAAA,O;E,iBAC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"}