@rangertechnologies/fusion-ui 0.1.4 → 0.1.6

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,31 +1,47 @@
1
- import * as i1$3 from "@angular/common";
1
+ import * as i1$4 from "@angular/common";
2
2
  import { CommonModule, DatePipe } from "@angular/common";
3
3
  import * as i0 from "@angular/core";
4
- import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, Injectable, Input, Optional, Output, Pipe, ViewChild, ViewChildren } from "@angular/core";
4
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, Inject, Injectable, InjectionToken, Input, Optional, Output, Pipe, ViewChild, ViewChildren } from "@angular/core";
5
5
  import { AngularSvgIconModule } from "angular-svg-icon";
6
- import * as i1$4 from "@ngx-translate/core";
6
+ import * as i1$5 from "@ngx-translate/core";
7
7
  import { TranslateModule } from "@ngx-translate/core";
8
- import * as i3$1 from "@angular/forms";
9
- import { FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
10
- import { BehaviorSubject, Subject, catchError, firstValueFrom, shareReplay, throwError } from "rxjs";
11
- import * as i1$2 from "@angular/common/http";
12
- import * as i3 from "@angular/material/checkbox";
8
+ import * as i3$2 from "@angular/forms";
9
+ import { FormControl, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
10
+ import { BehaviorSubject, Subject, Subscription, catchError, firstValueFrom, shareReplay, throwError } from "rxjs";
11
+ import * as i1$3 from "@angular/common/http";
12
+ import * as i3$1 from "@angular/material/checkbox";
13
13
  import { MatCheckboxModule } from "@angular/material/checkbox";
14
14
  import { SelectionModel } from "@angular/cdk/collections";
15
15
  import { Modal, Popover } from "bootstrap";
16
- import * as i1$1 from "@angular/cdk/overlay";
16
+ import * as i1$2 from "@angular/cdk/overlay";
17
17
  import { OverlayModule } from "@angular/cdk/overlay";
18
18
  import * as i10$1 from "@rangertechnologies/ngnxt";
19
19
  import { NxtAppModule, NxtButtonComponent, NxtFileUpload } from "@rangertechnologies/ngnxt";
20
- import * as i4 from "@angular/material/tooltip";
20
+ import * as i4$1 from "@angular/material/tooltip";
21
21
  import { MatTooltipModule } from "@angular/material/tooltip";
22
22
  import { saveAs } from "file-saver";
23
- import * as i1 from "@angular/router";
24
- import * as i9 from "@angular/material/table";
23
+ import * as i1$1 from "@angular/router";
24
+ import * as i9$1 from "@angular/material/table";
25
25
  import { MatTableDataSource, MatTableModule } from "@angular/material/table";
26
26
  import { MatPaginatorIntl, MatPaginatorModule } from "@angular/material/paginator";
27
27
  import * as i10 from "@angular/material/sort";
28
28
  import { MatSort, MatSortModule } from "@angular/material/sort";
29
+ import * as i1 from "@angular/platform-browser";
30
+ import * as i2 from "@angular/material/form-field";
31
+ import { MatFormFieldModule } from "@angular/material/form-field";
32
+ import * as i3 from "@angular/material/select";
33
+ import { MatSelectModule } from "@angular/material/select";
34
+ import * as i9 from "@angular/material/chips";
35
+ import { MatChipsModule } from "@angular/material/chips";
36
+ import * as i6 from "@angular/material/icon";
37
+ import { MatIconModule } from "@angular/material/icon";
38
+ import * as i4 from "@angular/material/input";
39
+ import { MatInputModule } from "@angular/material/input";
40
+ import * as i5 from "@angular/material/button";
41
+ import { MatButtonModule } from "@angular/material/button";
42
+ import * as i8 from "@angular/material/core";
43
+ import { MatRippleModule } from "@angular/material/core";
44
+ import { takeUntil } from "rxjs/operators";
29
45
  import * as numberToWords from "number-to-words";
30
46
  var CustomTranslatePipe = class CustomTranslatePipe {
31
47
  translate;
@@ -42,7 +58,7 @@ var CustomTranslatePipe = class CustomTranslatePipe {
42
58
  version: "22.2.4",
43
59
  ngImport: i0,
44
60
  type: CustomTranslatePipe,
45
- deps: [{ token: i1$4.TranslateService }],
61
+ deps: [{ token: i1$5.TranslateService }],
46
62
  target: i0.ɵɵFactoryTarget.Pipe
47
63
  });
48
64
  static ɵpipe = i0.ɵɵngDeclarePipe({
@@ -66,7 +82,7 @@ i0.ɵɵngDeclareClassMetadata({
66
82
  standalone: true
67
83
  }]
68
84
  }],
69
- ctorParameters: () => [{ type: i1$4.TranslateService }]
85
+ ctorParameters: () => [{ type: i1$5.TranslateService }]
70
86
  });
71
87
  var FusionButtonComponent = class FusionButtonComponent {
72
88
  elementRef;
@@ -179,7 +195,7 @@ var FusionButtonComponent = class FusionButtonComponent {
179
195
  },
180
196
  {
181
197
  kind: "directive",
182
- type: i1$3.NgForOf,
198
+ type: i1$4.NgForOf,
183
199
  selector: "[ngFor][ngForOf]",
184
200
  inputs: [
185
201
  "ngForOf",
@@ -189,7 +205,7 @@ var FusionButtonComponent = class FusionButtonComponent {
189
205
  },
190
206
  {
191
207
  kind: "directive",
192
- type: i1$3.NgIf,
208
+ type: i1$4.NgIf,
193
209
  selector: "[ngIf]",
194
210
  inputs: [
195
211
  "ngIf",
@@ -199,7 +215,7 @@ var FusionButtonComponent = class FusionButtonComponent {
199
215
  },
200
216
  {
201
217
  kind: "directive",
202
- type: i1$3.NgStyle,
218
+ type: i1$4.NgStyle,
203
219
  selector: "[ngStyle]",
204
220
  inputs: ["ngStyle"]
205
221
  },
@@ -314,8 +330,8 @@ var ConfigService = class ConfigService {
314
330
  http;
315
331
  config;
316
332
  static runtimeConfig;
317
- defaultApiUrl = "http://localhost:3000";
318
- hostContractGlobal = "__FUSION_HOST_RUNTIME_CONTRACT__";
333
+ defaultApiUrl = "https://dev-api.rangerfusion.com";
334
+ static hostContractGlobal = "__FUSION_HOST_RUNTIME_CONTRACT__";
319
335
  constructor(http) {
320
336
  this.http = http;
321
337
  }
@@ -359,30 +375,44 @@ var ConfigService = class ConfigService {
359
375
  return ConfigService.runtimeConfig?.serviceConfig?.[key];
360
376
  }
361
377
  getApiUrl() {
378
+ const hostContract = this.getHostContract();
379
+ if (hostContract?.apiUrl) return hostContract.apiUrl;
362
380
  return this.config?.serviceConfig?.apiUrl || this.config?.serviceConfig?.API_URL || this.defaultApiUrl;
363
381
  }
364
382
  static getApiUrl() {
383
+ const hostContract = ConfigService.getHostContract();
384
+ if (hostContract?.apiUrl) return hostContract.apiUrl;
365
385
  const serviceConfig = ConfigService.runtimeConfig?.serviceConfig;
366
386
  return serviceConfig?.API_URL || serviceConfig?.apiUrl;
367
387
  }
388
+ getAppUrl() {
389
+ const hostContract = this.getHostContract();
390
+ if (hostContract?.appUrl) return hostContract.appUrl;
391
+ return this.config?.serviceConfig?.appUrl || this.config?.serviceConfig?.APP_URL;
392
+ }
368
393
  static getAppUrl() {
394
+ const hostContract = ConfigService.getHostContract();
395
+ if (hostContract?.appUrl) return hostContract.appUrl;
369
396
  const serviceConfig = ConfigService.runtimeConfig?.serviceConfig;
370
397
  return serviceConfig?.APP_URL || serviceConfig?.appUrl;
371
398
  }
372
399
  isSplitUserBootstrap() {
373
400
  return Boolean(this.getServiceConfig("splitUserBootstrap"));
374
401
  }
375
- getHostContract() {
402
+ static getHostContract() {
376
403
  if (typeof window === "undefined") return null;
377
- const contract = window[this.hostContractGlobal];
404
+ const contract = window[ConfigService.hostContractGlobal];
378
405
  return contract?.apiUrl ? contract : null;
379
406
  }
407
+ getHostContract() {
408
+ return ConfigService.getHostContract();
409
+ }
380
410
  static ɵfac = i0.ɵɵngDeclareFactory({
381
411
  minVersion: "12.0.0",
382
412
  version: "22.2.4",
383
413
  ngImport: i0,
384
414
  type: ConfigService,
385
- deps: [{ token: i1$2.HttpClient }],
415
+ deps: [{ token: i1$3.HttpClient }],
386
416
  target: i0.ɵɵFactoryTarget.Injectable
387
417
  });
388
418
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -402,7 +432,7 @@ i0.ɵɵngDeclareClassMetadata({
402
432
  type: Injectable,
403
433
  args: [{ providedIn: "root" }]
404
434
  }],
405
- ctorParameters: () => [{ type: i1$2.HttpClient }]
435
+ ctorParameters: () => [{ type: i1$3.HttpClient }]
406
436
  });
407
437
  var ApiService = class ApiService {
408
438
  http;
@@ -491,7 +521,7 @@ var ApiService = class ApiService {
491
521
  version: "22.2.4",
492
522
  ngImport: i0,
493
523
  type: ApiService,
494
- deps: [{ token: i1$2.HttpClient }, { token: ConfigService }],
524
+ deps: [{ token: i1$3.HttpClient }, { token: ConfigService }],
495
525
  target: i0.ɵɵFactoryTarget.Injectable
496
526
  });
497
527
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -511,7 +541,7 @@ i0.ɵɵngDeclareClassMetadata({
511
541
  type: Injectable,
512
542
  args: [{ providedIn: "root" }]
513
543
  }],
514
- ctorParameters: () => [{ type: i1$2.HttpClient }, { type: ConfigService }]
544
+ ctorParameters: () => [{ type: i1$3.HttpClient }, { type: ConfigService }]
515
545
  });
516
546
  var GlobalValuesService = class GlobalValuesService {
517
547
  apiService;
@@ -820,7 +850,7 @@ var SearchFilterComponent = class SearchFilterComponent {
820
850
  },
821
851
  {
822
852
  kind: "directive",
823
- type: i1$3.NgForOf,
853
+ type: i1$4.NgForOf,
824
854
  selector: "[ngFor][ngForOf]",
825
855
  inputs: [
826
856
  "ngForOf",
@@ -830,7 +860,7 @@ var SearchFilterComponent = class SearchFilterComponent {
830
860
  },
831
861
  {
832
862
  kind: "directive",
833
- type: i1$3.NgIf,
863
+ type: i1$4.NgIf,
834
864
  selector: "[ngIf]",
835
865
  inputs: [
836
866
  "ngIf",
@@ -844,12 +874,12 @@ var SearchFilterComponent = class SearchFilterComponent {
844
874
  },
845
875
  {
846
876
  kind: "directive",
847
- type: i3$1.DefaultValueAccessor,
877
+ type: i3$2.DefaultValueAccessor,
848
878
  selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
849
879
  },
850
880
  {
851
881
  kind: "directive",
852
- type: i3$1.NgControlStatus,
882
+ type: i3$2.NgControlStatus,
853
883
  selector: "[formControlName],[ngModel],[formControl]"
854
884
  },
855
885
  {
@@ -858,7 +888,7 @@ var SearchFilterComponent = class SearchFilterComponent {
858
888
  },
859
889
  {
860
890
  kind: "directive",
861
- type: i3$1.NgModel,
891
+ type: i3$2.NgModel,
862
892
  selector: "[ngModel]:not([formControlName]):not([formControl])",
863
893
  inputs: [
864
894
  "name",
@@ -1054,7 +1084,7 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1054
1084
  },
1055
1085
  {
1056
1086
  kind: "directive",
1057
- type: i1$3.NgForOf,
1087
+ type: i1$4.NgForOf,
1058
1088
  selector: "[ngFor][ngForOf]",
1059
1089
  inputs: [
1060
1090
  "ngForOf",
@@ -1064,7 +1094,7 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1064
1094
  },
1065
1095
  {
1066
1096
  kind: "directive",
1067
- type: i1$3.NgIf,
1097
+ type: i1$4.NgIf,
1068
1098
  selector: "[ngIf]",
1069
1099
  inputs: [
1070
1100
  "ngIf",
@@ -1078,7 +1108,7 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1078
1108
  },
1079
1109
  {
1080
1110
  kind: "component",
1081
- type: i3.MatCheckbox,
1111
+ type: i3$1.MatCheckbox,
1082
1112
  selector: "mat-checkbox",
1083
1113
  inputs: [
1084
1114
  "aria-label",
@@ -1139,17 +1169,17 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1139
1169
  },
1140
1170
  {
1141
1171
  kind: "directive",
1142
- type: i3$1.DefaultValueAccessor,
1172
+ type: i3$2.DefaultValueAccessor,
1143
1173
  selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
1144
1174
  },
1145
1175
  {
1146
1176
  kind: "directive",
1147
- type: i3$1.NgControlStatus,
1177
+ type: i3$2.NgControlStatus,
1148
1178
  selector: "[formControlName],[ngModel],[formControl]"
1149
1179
  },
1150
1180
  {
1151
1181
  kind: "directive",
1152
- type: i3$1.NgModel,
1182
+ type: i3$2.NgModel,
1153
1183
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1154
1184
  inputs: [
1155
1185
  "name",
@@ -1393,7 +1423,7 @@ var DropDownComponent = class DropDownComponent {
1393
1423
  },
1394
1424
  {
1395
1425
  kind: "directive",
1396
- type: i1$3.NgForOf,
1426
+ type: i1$4.NgForOf,
1397
1427
  selector: "[ngFor][ngForOf]",
1398
1428
  inputs: [
1399
1429
  "ngForOf",
@@ -1403,7 +1433,7 @@ var DropDownComponent = class DropDownComponent {
1403
1433
  },
1404
1434
  {
1405
1435
  kind: "directive",
1406
- type: i1$3.NgIf,
1436
+ type: i1$4.NgIf,
1407
1437
  selector: "[ngIf]",
1408
1438
  inputs: [
1409
1439
  "ngIf",
@@ -1421,17 +1451,17 @@ var DropDownComponent = class DropDownComponent {
1421
1451
  },
1422
1452
  {
1423
1453
  kind: "directive",
1424
- type: i3$1.DefaultValueAccessor,
1454
+ type: i3$2.DefaultValueAccessor,
1425
1455
  selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
1426
1456
  },
1427
1457
  {
1428
1458
  kind: "directive",
1429
- type: i3$1.NgControlStatus,
1459
+ type: i3$2.NgControlStatus,
1430
1460
  selector: "[formControlName],[ngModel],[formControl]"
1431
1461
  },
1432
1462
  {
1433
1463
  kind: "directive",
1434
- type: i3$1.NgModel,
1464
+ type: i3$2.NgModel,
1435
1465
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1436
1466
  inputs: [
1437
1467
  "name",
@@ -1614,7 +1644,7 @@ var MultipleFilterComponent = class MultipleFilterComponent {
1614
1644
  },
1615
1645
  {
1616
1646
  kind: "directive",
1617
- type: i1$3.NgForOf,
1647
+ type: i1$4.NgForOf,
1618
1648
  selector: "[ngFor][ngForOf]",
1619
1649
  inputs: [
1620
1650
  "ngForOf",
@@ -1624,7 +1654,7 @@ var MultipleFilterComponent = class MultipleFilterComponent {
1624
1654
  },
1625
1655
  {
1626
1656
  kind: "directive",
1627
- type: i1$3.NgIf,
1657
+ type: i1$4.NgIf,
1628
1658
  selector: "[ngIf]",
1629
1659
  inputs: [
1630
1660
  "ngIf",
@@ -1672,17 +1702,17 @@ var MultipleFilterComponent = class MultipleFilterComponent {
1672
1702
  },
1673
1703
  {
1674
1704
  kind: "directive",
1675
- type: i3$1.DefaultValueAccessor,
1705
+ type: i3$2.DefaultValueAccessor,
1676
1706
  selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
1677
1707
  },
1678
1708
  {
1679
1709
  kind: "directive",
1680
- type: i3$1.NgControlStatus,
1710
+ type: i3$2.NgControlStatus,
1681
1711
  selector: "[formControlName],[ngModel],[formControl]"
1682
1712
  },
1683
1713
  {
1684
1714
  kind: "directive",
1685
- type: i3$1.NgModel,
1715
+ type: i3$2.NgModel,
1686
1716
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1687
1717
  inputs: [
1688
1718
  "name",
@@ -1879,7 +1909,7 @@ var PaginationComponent = class PaginationComponent {
1879
1909
  },
1880
1910
  {
1881
1911
  kind: "directive",
1882
- type: i1$3.NgForOf,
1912
+ type: i1$4.NgForOf,
1883
1913
  selector: "[ngFor][ngForOf]",
1884
1914
  inputs: [
1885
1915
  "ngForOf",
@@ -1889,7 +1919,7 @@ var PaginationComponent = class PaginationComponent {
1889
1919
  },
1890
1920
  {
1891
1921
  kind: "directive",
1892
- type: i1$3.NgIf,
1922
+ type: i1$4.NgIf,
1893
1923
  selector: "[ngIf]",
1894
1924
  inputs: [
1895
1925
  "ngIf",
@@ -1903,30 +1933,30 @@ var PaginationComponent = class PaginationComponent {
1903
1933
  },
1904
1934
  {
1905
1935
  kind: "directive",
1906
- type: i3$1.NgSelectOption,
1936
+ type: i3$2.NgSelectOption,
1907
1937
  selector: "option",
1908
1938
  inputs: ["ngValue", "value"]
1909
1939
  },
1910
1940
  {
1911
1941
  kind: "directive",
1912
- type: i3$1.ɵNgSelectMultipleOption,
1942
+ type: i3$2.ɵNgSelectMultipleOption,
1913
1943
  selector: "option",
1914
1944
  inputs: ["ngValue", "value"]
1915
1945
  },
1916
1946
  {
1917
1947
  kind: "directive",
1918
- type: i3$1.SelectControlValueAccessor,
1948
+ type: i3$2.SelectControlValueAccessor,
1919
1949
  selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]",
1920
1950
  inputs: ["compareWith"]
1921
1951
  },
1922
1952
  {
1923
1953
  kind: "directive",
1924
- type: i3$1.NgControlStatus,
1954
+ type: i3$2.NgControlStatus,
1925
1955
  selector: "[formControlName],[ngModel],[formControl]"
1926
1956
  },
1927
1957
  {
1928
1958
  kind: "directive",
1929
- type: i3$1.NgModel,
1959
+ type: i3$2.NgModel,
1930
1960
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1931
1961
  inputs: [
1932
1962
  "name",
@@ -2035,7 +2065,7 @@ var PopoverComponent = class PopoverComponent {
2035
2065
  version: "22.2.4",
2036
2066
  ngImport: i0,
2037
2067
  type: PopoverComponent,
2038
- deps: [{ token: i1$1.Overlay }, { token: i0.ChangeDetectorRef }],
2068
+ deps: [{ token: i1$2.Overlay }, { token: i0.ChangeDetectorRef }],
2039
2069
  target: i0.ɵɵFactoryTarget.Component
2040
2070
  });
2041
2071
  static ɵcmp = i0.ɵɵngDeclareComponent({
@@ -2059,7 +2089,7 @@ var PopoverComponent = class PopoverComponent {
2059
2089
  },
2060
2090
  {
2061
2091
  kind: "directive",
2062
- type: i1$3.NgIf,
2092
+ type: i1$4.NgIf,
2063
2093
  selector: "[ngIf]",
2064
2094
  inputs: [
2065
2095
  "ngIf",
@@ -2069,7 +2099,7 @@ var PopoverComponent = class PopoverComponent {
2069
2099
  },
2070
2100
  {
2071
2101
  kind: "directive",
2072
- type: i1$3.NgTemplateOutlet,
2102
+ type: i1$4.NgTemplateOutlet,
2073
2103
  selector: "[ngTemplateOutlet]",
2074
2104
  inputs: [
2075
2105
  "ngTemplateOutletContext",
@@ -2087,7 +2117,7 @@ var PopoverComponent = class PopoverComponent {
2087
2117
  },
2088
2118
  {
2089
2119
  kind: "directive",
2090
- type: i1$1.CdkConnectedOverlay,
2120
+ type: i1$2.CdkConnectedOverlay,
2091
2121
  selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]",
2092
2122
  inputs: [
2093
2123
  "cdkConnectedOverlayOrigin",
@@ -2128,7 +2158,7 @@ var PopoverComponent = class PopoverComponent {
2128
2158
  },
2129
2159
  {
2130
2160
  kind: "directive",
2131
- type: i1$1.CdkOverlayOrigin,
2161
+ type: i1$2.CdkOverlayOrigin,
2132
2162
  selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]",
2133
2163
  exportAs: ["cdkOverlayOrigin"]
2134
2164
  }
@@ -2156,7 +2186,7 @@ i0.ɵɵngDeclareClassMetadata({
2156
2186
  styles: [".fusion-popover{position:relative}.popover-content{display:none;position:fixed;z-index:1000;right:0;border:1px solid var(--border-color);background-color:var(--comp-bg-color);border-radius:4px}.popover-base{padding-left:10px}.popover-base:hover>.popover-content{display:block}.popover-content:has(.white-parent){border-radius:8px;background:var(--comp-bg-color);box-shadow:0 0 16px var(--box-shadow-color)}\n"]
2157
2187
  }]
2158
2188
  }],
2159
- ctorParameters: () => [{ type: i1$1.Overlay }, { type: i0.ChangeDetectorRef }],
2189
+ ctorParameters: () => [{ type: i1$2.Overlay }, { type: i0.ChangeDetectorRef }],
2160
2190
  propDecorators: {
2161
2191
  isBootstrap: [{ type: Input }],
2162
2192
  dynamicPopover: [{ type: Input }],
@@ -2243,13 +2273,13 @@ var ModalComponent = class ModalComponent {
2243
2273
  },
2244
2274
  {
2245
2275
  kind: "directive",
2246
- type: i1$3.NgClass,
2276
+ type: i1$4.NgClass,
2247
2277
  selector: "[ngClass]",
2248
2278
  inputs: ["class", "ngClass"]
2249
2279
  },
2250
2280
  {
2251
2281
  kind: "directive",
2252
- type: i1$3.NgIf,
2282
+ type: i1$4.NgIf,
2253
2283
  selector: "[ngIf]",
2254
2284
  inputs: [
2255
2285
  "ngIf",
@@ -2428,7 +2458,7 @@ var FileUploadComponent = class FileUploadComponent {
2428
2458
  },
2429
2459
  {
2430
2460
  kind: "directive",
2431
- type: i1$3.NgForOf,
2461
+ type: i1$4.NgForOf,
2432
2462
  selector: "[ngFor][ngForOf]",
2433
2463
  inputs: [
2434
2464
  "ngForOf",
@@ -2438,7 +2468,7 @@ var FileUploadComponent = class FileUploadComponent {
2438
2468
  },
2439
2469
  {
2440
2470
  kind: "directive",
2441
- type: i1$3.NgIf,
2471
+ type: i1$4.NgIf,
2442
2472
  selector: "[ngIf]",
2443
2473
  inputs: [
2444
2474
  "ngIf",
@@ -3254,7 +3284,7 @@ var SideScreenComponent = class SideScreenComponent {
3254
3284
  version: "22.2.4",
3255
3285
  ngImport: i0,
3256
3286
  type: SideScreenComponent,
3257
- deps: [{ token: i3$1.FormBuilder }],
3287
+ deps: [{ token: i3$2.FormBuilder }],
3258
3288
  target: i0.ɵɵFactoryTarget.Component
3259
3289
  });
3260
3290
  static ɵcmp = i0.ɵɵngDeclareComponent({
@@ -3318,13 +3348,13 @@ var SideScreenComponent = class SideScreenComponent {
3318
3348
  },
3319
3349
  {
3320
3350
  kind: "directive",
3321
- type: i1$3.NgClass,
3351
+ type: i1$4.NgClass,
3322
3352
  selector: "[ngClass]",
3323
3353
  inputs: ["class", "ngClass"]
3324
3354
  },
3325
3355
  {
3326
3356
  kind: "directive",
3327
- type: i1$3.NgIf,
3357
+ type: i1$4.NgIf,
3328
3358
  selector: "[ngIf]",
3329
3359
  inputs: [
3330
3360
  "ngIf",
@@ -3338,22 +3368,22 @@ var SideScreenComponent = class SideScreenComponent {
3338
3368
  },
3339
3369
  {
3340
3370
  kind: "directive",
3341
- type: i3$1.ɵNgNoValidate,
3371
+ type: i3$2.ɵNgNoValidate,
3342
3372
  selector: "form:not([ngNoForm]):not([ngNativeValidate])"
3343
3373
  },
3344
3374
  {
3345
3375
  kind: "directive",
3346
- type: i3$1.DefaultValueAccessor,
3376
+ type: i3$2.DefaultValueAccessor,
3347
3377
  selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
3348
3378
  },
3349
3379
  {
3350
3380
  kind: "directive",
3351
- type: i3$1.NumberValueAccessor,
3381
+ type: i3$2.NumberValueAccessor,
3352
3382
  selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]"
3353
3383
  },
3354
3384
  {
3355
3385
  kind: "directive",
3356
- type: i3$1.RadioControlValueAccessor,
3386
+ type: i3$2.RadioControlValueAccessor,
3357
3387
  selector: "input[type=radio]:not([ngNoCva])[formControlName],input[type=radio]:not([ngNoCva])[formControl],input[type=radio]:not([ngNoCva])[ngModel]",
3358
3388
  inputs: [
3359
3389
  "name",
@@ -3363,17 +3393,17 @@ var SideScreenComponent = class SideScreenComponent {
3363
3393
  },
3364
3394
  {
3365
3395
  kind: "directive",
3366
- type: i3$1.NgControlStatus,
3396
+ type: i3$2.NgControlStatus,
3367
3397
  selector: "[formControlName],[ngModel],[formControl]"
3368
3398
  },
3369
3399
  {
3370
3400
  kind: "directive",
3371
- type: i3$1.NgControlStatusGroup,
3401
+ type: i3$2.NgControlStatusGroup,
3372
3402
  selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"
3373
3403
  },
3374
3404
  {
3375
3405
  kind: "directive",
3376
- type: i3$1.FormGroupDirective,
3406
+ type: i3$2.FormGroupDirective,
3377
3407
  selector: "[formGroup]",
3378
3408
  inputs: ["formGroup"],
3379
3409
  outputs: ["ngSubmit"],
@@ -3381,7 +3411,7 @@ var SideScreenComponent = class SideScreenComponent {
3381
3411
  },
3382
3412
  {
3383
3413
  kind: "directive",
3384
- type: i3$1.FormControlName,
3414
+ type: i3$2.FormControlName,
3385
3415
  selector: "[formControlName]",
3386
3416
  inputs: [
3387
3417
  "formControlName",
@@ -3396,7 +3426,7 @@ var SideScreenComponent = class SideScreenComponent {
3396
3426
  },
3397
3427
  {
3398
3428
  kind: "component",
3399
- type: i3.MatCheckbox,
3429
+ type: i3$1.MatCheckbox,
3400
3430
  selector: "mat-checkbox",
3401
3431
  inputs: [
3402
3432
  "aria-label",
@@ -3461,7 +3491,7 @@ var SideScreenComponent = class SideScreenComponent {
3461
3491
  },
3462
3492
  {
3463
3493
  kind: "directive",
3464
- type: i4.MatTooltip,
3494
+ type: i4$1.MatTooltip,
3465
3495
  selector: "[matTooltip]",
3466
3496
  inputs: [
3467
3497
  "matTooltipPosition",
@@ -3508,7 +3538,7 @@ i0.ɵɵngDeclareClassMetadata({
3508
3538
  styles: [".side-screen{background:var(--comp-bg-color);max-width:415px;width:100%;position:absolute;right:0;top:0;height:100%;z-index:105;max-height:100vh;overflow:hidden;box-shadow:-1px 0 3px 1px var(--box-shadow-color)}.side-header{padding:12px 20px;border-bottom:1px solid var(--border-color)}.side-header .close-icon svg{transform:scale(1.5)}.side-content{padding-top:10px}.scrollable-content{max-height:calc(100vh - 190px);overflow:hidden;overflow-y:auto}.tiny-info-text{font-size:var(--fs-small);color:color-mix(in srgb,var(--fc-text-color-dark),rgb(0,0,0) 80%);font-weight:var(--fw-600)}.label-txt.increase-text,.side-content .form-control,.radio-text{font-size:var(--fs-small)}.error-fields{font-size:10px;color:red;padding:0;margin:0}.radio-text{margin-inline:5px;cursor:pointer}.addPayRollComponent .button-wrapper{margin-top:50px}\n"]
3509
3539
  }]
3510
3540
  }],
3511
- ctorParameters: () => [{ type: i3$1.FormBuilder }],
3541
+ ctorParameters: () => [{ type: i3$2.FormBuilder }],
3512
3542
  propDecorators: {
3513
3543
  headerTitle: [{ type: Input }],
3514
3544
  onLoadData: [{ type: Input }],
@@ -3592,7 +3622,7 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3592
3622
  ngImport: i0,
3593
3623
  type: ApprovalScreenComponent,
3594
3624
  deps: [{
3595
- token: i1$3.DatePipe,
3625
+ token: i1$4.DatePipe,
3596
3626
  optional: true
3597
3627
  }],
3598
3628
  target: i0.ɵɵFactoryTarget.Component
@@ -3626,13 +3656,13 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3626
3656
  },
3627
3657
  {
3628
3658
  kind: "directive",
3629
- type: i1$3.NgClass,
3659
+ type: i1$4.NgClass,
3630
3660
  selector: "[ngClass]",
3631
3661
  inputs: ["class", "ngClass"]
3632
3662
  },
3633
3663
  {
3634
3664
  kind: "directive",
3635
- type: i1$3.NgForOf,
3665
+ type: i1$4.NgForOf,
3636
3666
  selector: "[ngFor][ngForOf]",
3637
3667
  inputs: [
3638
3668
  "ngForOf",
@@ -3642,7 +3672,7 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3642
3672
  },
3643
3673
  {
3644
3674
  kind: "directive",
3645
- type: i1$3.NgIf,
3675
+ type: i1$4.NgIf,
3646
3676
  selector: "[ngIf]",
3647
3677
  inputs: [
3648
3678
  "ngIf",
@@ -3652,7 +3682,7 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3652
3682
  },
3653
3683
  {
3654
3684
  kind: "pipe",
3655
- type: i1$3.DatePipe,
3685
+ type: i1$4.DatePipe,
3656
3686
  name: "date"
3657
3687
  },
3658
3688
  {
@@ -3683,7 +3713,7 @@ i0.ɵɵngDeclareClassMetadata({
3683
3713
  }]
3684
3714
  }],
3685
3715
  ctorParameters: () => [{
3686
- type: i1$3.DatePipe,
3716
+ type: i1$4.DatePipe,
3687
3717
  decorators: [{ type: Optional }]
3688
3718
  }],
3689
3719
  propDecorators: {
@@ -3772,7 +3802,7 @@ var BrowseComponent = class BrowseComponent {
3772
3802
  type: CommonModule
3773
3803
  }, {
3774
3804
  kind: "directive",
3775
- type: i1$3.NgIf,
3805
+ type: i1$4.NgIf,
3776
3806
  selector: "[ngIf]",
3777
3807
  inputs: [
3778
3808
  "ngIf",
@@ -3956,7 +3986,7 @@ var AlertService = class AlertService {
3956
3986
  version: "22.2.4",
3957
3987
  ngImport: i0,
3958
3988
  type: AlertService,
3959
- deps: [{ token: i1$4.TranslateService }],
3989
+ deps: [{ token: i1$5.TranslateService }],
3960
3990
  target: i0.ɵɵFactoryTarget.Injectable
3961
3991
  });
3962
3992
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -3976,7 +4006,7 @@ i0.ɵɵngDeclareClassMetadata({
3976
4006
  type: Injectable,
3977
4007
  args: [{ providedIn: "root" }]
3978
4008
  }],
3979
- ctorParameters: () => [{ type: i1$4.TranslateService }]
4009
+ ctorParameters: () => [{ type: i1$5.TranslateService }]
3980
4010
  });
3981
4011
  var ErrorHandlerService = class ErrorHandlerService {
3982
4012
  router;
@@ -4093,7 +4123,7 @@ var ErrorHandlerService = class ErrorHandlerService {
4093
4123
  version: "22.2.4",
4094
4124
  ngImport: i0,
4095
4125
  type: ErrorHandlerService,
4096
- deps: [{ token: i1.Router }, { token: AlertService }],
4126
+ deps: [{ token: i1$1.Router }, { token: AlertService }],
4097
4127
  target: i0.ɵɵFactoryTarget.Injectable
4098
4128
  });
4099
4129
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -4113,7 +4143,7 @@ i0.ɵɵngDeclareClassMetadata({
4113
4143
  type: Injectable,
4114
4144
  args: [{ providedIn: "root" }]
4115
4145
  }],
4116
- ctorParameters: () => [{ type: i1.Router }, { type: AlertService }]
4146
+ ctorParameters: () => [{ type: i1$1.Router }, { type: AlertService }]
4117
4147
  });
4118
4148
  var TabDataService = class TabDataService {
4119
4149
  cache = /* @__PURE__ */ new Map();
@@ -5112,10 +5142,10 @@ var FormsComponent = class FormsComponent {
5112
5142
  type: FormsComponent,
5113
5143
  deps: [
5114
5144
  { token: LoaderService },
5115
- { token: i1$4.TranslateService },
5145
+ { token: i1$5.TranslateService },
5116
5146
  { token: GlobalValuesService },
5117
5147
  { token: ApiService },
5118
- { token: i1$3.DatePipe },
5148
+ { token: i1$4.DatePipe },
5119
5149
  { token: AlertService },
5120
5150
  { token: ErrorHandlerService },
5121
5151
  { token: GlobalValuesService },
@@ -5142,7 +5172,7 @@ var FormsComponent = class FormsComponent {
5142
5172
  },
5143
5173
  {
5144
5174
  kind: "directive",
5145
- type: i1$3.NgForOf,
5175
+ type: i1$4.NgForOf,
5146
5176
  selector: "[ngFor][ngForOf]",
5147
5177
  inputs: [
5148
5178
  "ngForOf",
@@ -5152,7 +5182,7 @@ var FormsComponent = class FormsComponent {
5152
5182
  },
5153
5183
  {
5154
5184
  kind: "directive",
5155
- type: i1$3.NgIf,
5185
+ type: i1$4.NgIf,
5156
5186
  selector: "[ngIf]",
5157
5187
  inputs: [
5158
5188
  "ngIf",
@@ -5429,10 +5459,10 @@ i0.ɵɵngDeclareClassMetadata({
5429
5459
  }],
5430
5460
  ctorParameters: () => [
5431
5461
  { type: LoaderService },
5432
- { type: i1$4.TranslateService },
5462
+ { type: i1$5.TranslateService },
5433
5463
  { type: GlobalValuesService },
5434
5464
  { type: ApiService },
5435
- { type: i1$3.DatePipe },
5465
+ { type: i1$4.DatePipe },
5436
5466
  { type: AlertService },
5437
5467
  { type: ErrorHandlerService },
5438
5468
  { type: GlobalValuesService },
@@ -5700,7 +5730,7 @@ var CustomPaginatorIntl = class CustomPaginatorIntl extends MatPaginatorIntl {
5700
5730
  version: "22.2.4",
5701
5731
  ngImport: i0,
5702
5732
  type: CustomPaginatorIntl,
5703
- deps: [{ token: i1$4.TranslateService }, { token: i0.ChangeDetectorRef }],
5733
+ deps: [{ token: i1$5.TranslateService }, { token: i0.ChangeDetectorRef }],
5704
5734
  target: i0.ɵɵFactoryTarget.Injectable
5705
5735
  });
5706
5736
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -5720,7 +5750,7 @@ i0.ɵɵngDeclareClassMetadata({
5720
5750
  type: Injectable,
5721
5751
  args: [{ providedIn: "root" }]
5722
5752
  }],
5723
- ctorParameters: () => [{ type: i1$4.TranslateService }, { type: i0.ChangeDetectorRef }]
5753
+ ctorParameters: () => [{ type: i1$5.TranslateService }, { type: i0.ChangeDetectorRef }]
5724
5754
  });
5725
5755
  var CustomDatePipe = class CustomDatePipe {
5726
5756
  transform(value, type = "date") {
@@ -5935,11 +5965,29 @@ var DataTableComponent = class DataTableComponent {
5935
5965
  dropdownLists;
5936
5966
  dateDropdown = false;
5937
5967
  from;
5968
+ isSandwichLeave = false;
5969
+ isCheckButton = false;
5970
+ monthArray;
5971
+ yearArray;
5972
+ year;
5973
+ month;
5974
+ button;
5975
+ exportDisable = true;
5976
+ defaultWorkingHours = -1;
5977
+ set saveLOP(val) {
5978
+ this.tableSaveButton = val;
5979
+ }
5980
+ get saveLOP() {
5981
+ return this.tableSaveButton;
5982
+ }
5983
+ isAttendanceTable = false;
5938
5984
  dateEmit = new EventEmitter();
5939
5985
  selectedValues = new EventEmitter();
5940
5986
  tableRowClick = new EventEmitter();
5987
+ rowClick = new EventEmitter();
5941
5988
  filteredArray = new EventEmitter();
5942
5989
  searchFilterData = new EventEmitter();
5990
+ searchValueChange = new EventEmitter();
5943
5991
  onEditData = new EventEmitter();
5944
5992
  onCloneData = new EventEmitter();
5945
5993
  onSendData = new EventEmitter();
@@ -5966,6 +6014,13 @@ var DataTableComponent = class DataTableComponent {
5966
6014
  sideNavEmit = new EventEmitter();
5967
6015
  searchText = new EventEmitter();
5968
6016
  dropdownDataEmit = new EventEmitter();
6017
+ checkClicked = new EventEmitter();
6018
+ yearDataEmit = new EventEmitter();
6019
+ selectedValueEmit = new EventEmitter();
6020
+ monthDataEmit = new EventEmitter();
6021
+ doubleClickEmit = new EventEmitter();
6022
+ hyperLinkClickEmit = new EventEmitter();
6023
+ tableParamsChange = new EventEmitter();
5969
6024
  paginator;
5970
6025
  sort;
5971
6026
  editInput;
@@ -6037,6 +6092,9 @@ var DataTableComponent = class DataTableComponent {
6037
6092
  this.sideScreenColumn = Array.isArray(this.sideScreenColumn) ? this.sideScreenColumn : [];
6038
6093
  this.objectColumns = Array.isArray(this.objectColumns) ? this.objectColumns : [];
6039
6094
  if (changes["buttonLoadingSpinner"] || changes["tableSaveLoadingSpinner"]) this.cdr.markForCheck();
6095
+ if (changes["month"]?.currentValue) this.selectedMonth = this.getMonthNumber(changes["month"]?.currentValue);
6096
+ if (changes["year"]?.currentValue) this.selectedYear = Number(changes["year"]?.currentValue) || this.selectedYear;
6097
+ if (changes["headerLabels"] || changes["displayedColumns"]) this.updateDateLookups();
6040
6098
  this.dataSource = new MatTableDataSource(this.data);
6041
6099
  this.selection = new SelectionModel(true, []);
6042
6100
  this.filterCheckBox = new SelectionModel(true, []);
@@ -6168,8 +6226,10 @@ var DataTableComponent = class DataTableComponent {
6168
6226
  this.dataSource.filter = filterValue.trim().toLowerCase();
6169
6227
  this.searchFilterData.emit(this.dataSource.filteredData);
6170
6228
  this.searchText.emit(filterValue);
6229
+ this.searchValueChange.emit(filterValue);
6171
6230
  this.totalCount = this.dataSource.filteredData.length;
6172
6231
  if (this.dataSource.paginator) this.dataSource.paginator.firstPage();
6232
+ this.cdr.markForCheck();
6173
6233
  }
6174
6234
  isAllSelected() {
6175
6235
  return this.selection.selected.length === this.dataSource.data.length;
@@ -6203,6 +6263,7 @@ var DataTableComponent = class DataTableComponent {
6203
6263
  }
6204
6264
  tableClick(data) {
6205
6265
  this.tableRowClick.emit(data);
6266
+ this.rowClick.emit(data);
6206
6267
  }
6207
6268
  filteredData(filterItems) {
6208
6269
  const arr = [this.selectedFilterColumn.toLocaleString(), filterItems];
@@ -6488,6 +6549,156 @@ var DataTableComponent = class DataTableComponent {
6488
6549
  onColumnClick(column) {
6489
6550
  this.activeColumn = column;
6490
6551
  }
6552
+ selectedMonth = 0;
6553
+ selectedYear = (/* @__PURE__ */ new Date()).getFullYear();
6554
+ popupOpen = false;
6555
+ confirmModal = false;
6556
+ months = [
6557
+ "January",
6558
+ "February",
6559
+ "March",
6560
+ "April",
6561
+ "May",
6562
+ "June",
6563
+ "July",
6564
+ "August",
6565
+ "September",
6566
+ "October",
6567
+ "November",
6568
+ "December"
6569
+ ];
6570
+ weekendColumnsSet = /* @__PURE__ */ new Set();
6571
+ futureColumnsSet = /* @__PURE__ */ new Set();
6572
+ todayColumn = null;
6573
+ leaveTypeSet = /* @__PURE__ */ new Set([
6574
+ "casual leave",
6575
+ "sick leave",
6576
+ "earned leave",
6577
+ "lop",
6578
+ "loss of pay",
6579
+ "maternity leave",
6580
+ "paternity leave",
6581
+ "compensatory off",
6582
+ "comp off"
6583
+ ]);
6584
+ updateDateLookups() {
6585
+ this.weekendColumnsSet.clear();
6586
+ this.futureColumnsSet.clear();
6587
+ this.todayColumn = null;
6588
+ if (!this.headerLabels || !this.displayedColumns) return;
6589
+ const now = /* @__PURE__ */ new Date();
6590
+ const todayZero = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
6591
+ const todayDate = now.getDate();
6592
+ const todayMonth = now.getMonth() + 1;
6593
+ const todayYear = now.getFullYear();
6594
+ for (let i = 0; i < this.displayedColumns.length; i++) {
6595
+ const col = this.displayedColumns[i];
6596
+ const header = this.headerLabels[i];
6597
+ if (header && header.year && header.month && header.date) {
6598
+ const d = new Date(header.year, header.month - 1, header.date);
6599
+ const dayOfWeek = d.getDay();
6600
+ if (dayOfWeek === 0 || dayOfWeek === 6) this.weekendColumnsSet.add(col);
6601
+ if (d.getTime() > todayZero) this.futureColumnsSet.add(col);
6602
+ if (header.date === todayDate && header.month === todayMonth && header.year === todayYear) this.todayColumn = col;
6603
+ }
6604
+ }
6605
+ }
6606
+ isWeekend(column) {
6607
+ return this.weekendColumnsSet.has(column);
6608
+ }
6609
+ isToday(column) {
6610
+ return this.todayColumn === column;
6611
+ }
6612
+ isFutureDate(column) {
6613
+ return this.futureColumnsSet.has(column);
6614
+ }
6615
+ getInitials(name) {
6616
+ if (!name || typeof name !== "string") return "";
6617
+ const parts = name.trim().split(/\s+/);
6618
+ if (parts.length === 1) return parts[0].substring(0, 2).toUpperCase();
6619
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
6620
+ }
6621
+ isNearTarget(workingDays, totalDays) {
6622
+ const w = Number(workingDays);
6623
+ const t = Number(totalDays);
6624
+ if (!t || t <= 0) return false;
6625
+ return w / t >= .8;
6626
+ }
6627
+ isLeaveType(status) {
6628
+ if (!status || typeof status !== "string") return false;
6629
+ const s = status.toLowerCase().trim();
6630
+ return s === "absent" || this.leaveTypeSet.has(s);
6631
+ }
6632
+ prevMonth() {
6633
+ if (this.selectedMonth === 0) {
6634
+ this.selectedMonth = 11;
6635
+ this.selectedYear--;
6636
+ } else this.selectedMonth--;
6637
+ this.emitSelection();
6638
+ this.cdr.markForCheck();
6639
+ }
6640
+ nextMonth() {
6641
+ if (this.selectedMonth === 11) {
6642
+ this.selectedMonth = 0;
6643
+ this.selectedYear++;
6644
+ } else this.selectedMonth++;
6645
+ this.emitSelection();
6646
+ this.cdr.markForCheck();
6647
+ }
6648
+ togglePopup() {
6649
+ this.popupOpen = !this.popupOpen;
6650
+ this.cdr.markForCheck();
6651
+ }
6652
+ selectMonth(monthIndex) {
6653
+ this.selectedMonth = monthIndex;
6654
+ this.emitSelection();
6655
+ this.togglePopup();
6656
+ }
6657
+ changeYear(step) {
6658
+ this.selectedYear += step;
6659
+ this.emitSelection();
6660
+ this.cdr.markForCheck();
6661
+ }
6662
+ emitSelection() {
6663
+ const monthVal = this.monthArray ? this.monthArray[this.selectedMonth] : this.months[this.selectedMonth];
6664
+ this.monthDataEmit.emit(monthVal);
6665
+ this.yearDataEmit.emit(this.selectedYear);
6666
+ this.selectedValueEmit.emit({
6667
+ month: monthVal,
6668
+ year: this.selectedYear
6669
+ });
6670
+ }
6671
+ checkButtonClicked() {
6672
+ this.checkClicked.emit();
6673
+ }
6674
+ doubleClickFunction(element, data, presentData) {
6675
+ if (element?.isSkeleton) return;
6676
+ this.doubleClickEmit.emit({
6677
+ employeeDetail: element.employeeDetail,
6678
+ date: data,
6679
+ data: presentData
6680
+ });
6681
+ }
6682
+ getMonthNumber(month) {
6683
+ if (typeof month === "number") return month;
6684
+ if (!month) return 0;
6685
+ const mStr = String(month).toLowerCase().slice(0, 3);
6686
+ const idx = [
6687
+ "jan",
6688
+ "feb",
6689
+ "mar",
6690
+ "apr",
6691
+ "may",
6692
+ "jun",
6693
+ "jul",
6694
+ "aug",
6695
+ "sep",
6696
+ "oct",
6697
+ "nov",
6698
+ "dec"
6699
+ ].indexOf(mStr);
6700
+ return idx >= 0 ? idx : 0;
6701
+ }
6491
6702
  static ɵfac = i0.ɵɵngDeclareFactory({
6492
6703
  minVersion: "12.0.0",
6493
6704
  version: "22.2.4",
@@ -6495,7 +6706,7 @@ var DataTableComponent = class DataTableComponent {
6495
6706
  type: DataTableComponent,
6496
6707
  deps: [
6497
6708
  { token: ScrollService },
6498
- { token: i1$1.Overlay },
6709
+ { token: i1$2.Overlay },
6499
6710
  { token: GlobalValuesService },
6500
6711
  { token: ApiService },
6501
6712
  { token: AlertService },
@@ -6510,7 +6721,7 @@ var DataTableComponent = class DataTableComponent {
6510
6721
  version: "22.2.4",
6511
6722
  type: DataTableComponent,
6512
6723
  isStandalone: true,
6513
- selector: "app-data-table",
6724
+ selector: "app-data-table, app-data-table-two",
6514
6725
  inputs: {
6515
6726
  data: "data",
6516
6727
  displayedColumns: "displayedColumns",
@@ -6574,6 +6785,17 @@ var DataTableComponent = class DataTableComponent {
6574
6785
  dropdownLists: "dropdownLists",
6575
6786
  dateDropdown: "dateDropdown",
6576
6787
  from: "from",
6788
+ isSandwichLeave: "isSandwichLeave",
6789
+ isCheckButton: "isCheckButton",
6790
+ monthArray: "monthArray",
6791
+ yearArray: "yearArray",
6792
+ year: "year",
6793
+ month: "month",
6794
+ button: "button",
6795
+ exportDisable: "exportDisable",
6796
+ defaultWorkingHours: "defaultWorkingHours",
6797
+ saveLOP: "saveLOP",
6798
+ isAttendanceTable: "isAttendanceTable",
6577
6799
  exportButtonLoadingSpinner: "exportButtonLoadingSpinner",
6578
6800
  pageTotal: "pageTotal",
6579
6801
  deleteModal: "deleteModal"
@@ -6582,8 +6804,10 @@ var DataTableComponent = class DataTableComponent {
6582
6804
  dateEmit: "dateEmit",
6583
6805
  selectedValues: "selectedValues",
6584
6806
  tableRowClick: "tableRowClick",
6807
+ rowClick: "rowClick",
6585
6808
  filteredArray: "filteredArray",
6586
6809
  searchFilterData: "searchFilterData",
6810
+ searchValueChange: "searchValueChange",
6587
6811
  onEditData: "onEditData",
6588
6812
  onCloneData: "onCloneData",
6589
6813
  onSendData: "onSendData",
@@ -6609,7 +6833,14 @@ var DataTableComponent = class DataTableComponent {
6609
6833
  filterDateEmitEvt: "filterDateEmitEvt",
6610
6834
  sideNavEmit: "sideNavEmit",
6611
6835
  searchText: "searchText",
6612
- dropdownDataEmit: "dropdownDataEmit"
6836
+ dropdownDataEmit: "dropdownDataEmit",
6837
+ checkClicked: "checkClicked",
6838
+ yearDataEmit: "yearDataEmit",
6839
+ selectedValueEmit: "selectedValueEmit",
6840
+ monthDataEmit: "monthDataEmit",
6841
+ doubleClickEmit: "doubleClickEmit",
6842
+ hyperLinkClickEmit: "hyperLinkClickEmit",
6843
+ tableParamsChange: "tableParamsChange"
6613
6844
  },
6614
6845
  host: { listeners: { "document:click": "onDocumentClick($event)" } },
6615
6846
  providers: [{
@@ -6650,8 +6881,8 @@ var DataTableComponent = class DataTableComponent {
6650
6881
  ],
6651
6882
  usesOnChanges: true,
6652
6883
  ngImport: i0,
6653
- template: "<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>\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 <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 <!-- 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 <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>",
6654
- styles: [".table-wrapper{overflow-x:auto;max-width:100%}.table-container{border-top:1px solid var(--fb-border-default, #e2e8f0);min-height:100px;overflow:auto;width:100%;max-height:62vh}.table-layout{background:var(--fb-surface, #ffffff);border-radius:8px}.th{border-bottom:1px solid var(--fb-border-default, #e2e8f0);font-weight:var(--fw-600);font-size:var(--fs-medium);line-height:21px;color:var(--fb-text-primary, #0f172a)}.head-color{background-color:var(--fb-action-surface, #e0f2fe)!important;color:var(--fb-text-primary, #0f172a)!important}.body-color{color:var(--fb-text-primary, #0f172a);cursor:default}.search{display:flex;justify-content:space-between;border:1px solid var(--fb-border-default, #e2e8f0);background:var(--fb-surface, #ffffff);border-radius:7px;align-self:center;padding:0}.search-bar{width:100%;margin:4px}th.mat-header-cell:last-of-type{padding:0;font-weight:var(--fw-600);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}td.mat-cell:last-of-type{padding:8px;font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.table-title{font-weight:var(--fw-600);color:var(--fb-text-primary, #0f172a)}.sticky-column{background:var(--fb-surface, #ffffff)}.mat-sort-header-container{margin-left:5px}.body-color img{cursor:pointer}.head-color.action-size{color:var(--fb-text-primary, #0f172a);font-size:var(--fs-primary);font-weight:var(--fw-600)}.lop-input{border-radius:5px;color:var(--fb-text-primary, #0f172a);background-color:var(--fb-surface, #ffffff);font-weight:var(--fw-400);font-size:var(--fs-medium);transition:all .2s}::ng-deep [dir=rtl] .body-color img{margin-left:4px!important}@media screen and (min-width:600px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}}@media screen and (max-width:882px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.mat-cell{padding:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-header-cell{padding:0}}th.mat-header-cell:first-of-type,td.mat-cell:first-of-type,td.mat-footer-cell:first-of-type{padding-right:24px}::ng-deep [dir=rtl] th.mat-header-cell:last-of-type:not(:only-of-type){padding-right:10px!important;padding-left:unset!important}.mat-sort-header-container.mat-focus-indicator.ng-tns-c139-34{margin-left:5px}.expense-file{font-size:var(--fs-small)}.expense-file:hover{font-style:italic;text-decoration:underline;color:var(--fb-action-hover, #00284d)}.expenseCon{background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);padding:5px;border-radius:3px}.hyper-link{text-decoration:none}.hyper-link:hover{color:var(--fb-action, #003566);text-decoration:underline}.clickable{cursor:pointer}.font-size-13{font-size:var(--fs-normal)}.weekoff-color{color:var(--fb-error, #ef4444)}.table-width{width:max-content}.on-edit:hover .edit-icon{visibility:visible}.edit-icon{visibility:hidden}.input-box{border:solid}.button-hov:hover{background:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff)}.delete-icon{justify-content:center}.side-main-content{border-radius:10px}h2{font-size:28px}.list-group-item{margin-bottom:10px;padding:15px}.list-group-item p{margin-bottom:5px}.custom-badge{display:inline-block;width:50%;text-align:center;padding:.3em 0;margin-top:0!important}.bg-success{--bs-bg-opacity: 1;background-color:var(--fb-success-surface, #e6f4ea)!important;color:var(--fb-success-text, #137333)!important}.custom-search-button{background-color:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff);border-radius:5px;font-size:var(--fs-normal);border:none}.custom-search-button:hover{background-color:var(--fb-action-hover, #00284d)}.custom-search-button:active{transform:translateY(0)}.table{border-top:1px solid var(--fb-border-default, #e2e8f0)}th,td{vertical-align:middle}.configSearch{height:22px;padding:3px;margin:10p;background-color:var(--fb-action, #003566);border-radius:4px}::ng-deep .table>:not(caption)>*>*{background-color:none!important;--bs-table-bg: var(--fb-surface, #ffffff) !important}.imgBtn{background-color:var(--fb-surface-secondary, #f8fafc);border-radius:var(--radius-small, 6px)}.imgBtnDiv{line-height:0px;padding:4px;border-radius:5px;border:1px solid var(--fb-border-default, #e2e8f0)}input::placeholder{font-size:var(--fs-small);font-weight:var(--fw-400);color:var(--fb-placeholder-text, #94a3b8)}::ng-deep .modal-backdrop{background-color:var(--fb-backdrop, #00000073)!important}::ng-deep .modal-backdrop.show{background-color:var(--fb-backdrop, #00000073)!important;opacity:1!important}::ng-deep .mat-sort-header-container .mat-sort-header-content span{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}::ng-deep .mat-mdc-cell{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-400)!important;font-size:var(--fs-primary)!important;min-width:20px!important}.active-column{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}.hover-content{background:var(--fb-surface-elevated, #ffffff)}.position-relative{position:relative;display:inline-block}.filter-popup{position:absolute;top:100%;left:0;z-index:9998;background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);box-shadow:0 4px 12px var(--fb-backdrop, rgba(0, 0, 0, .08));padding:10px;min-width:200px}.spanFontSize{font-size:var(--fs-normal)}.mat-column-employees{width:200px;min-width:200px;padding-left:8px;height:57px;left:0!important}.text-start{font-size:var(--fs-normal)}.first-header-border{border-left:1px solid var(--fb-border-default, #e2e8f0)}tr{height:45px!important;text-wrap:nowrap!important}.field-input{width:min(220px,98%);min-height:50px}.svg-spinner{animation:rotate 1s linear infinite}.svg-spinner .path{stroke:var(--fb-action, #003566);stroke-linecap:round;stroke-dasharray:80 150;stroke-width:4}@keyframes rotate{to{transform:rotate(360deg)}}img{max-width:none!important;vertical-align:middle}::ng-deep .mat-mdc-row:hover{background-color:var(--fb-row-hover, #f8fafc)!important}::ng-deep .mat-mdc-row:nth-child(2n){background-color:var(--fb-row-alternate, #fcfdfe)}\n"],
6884
+ template: "<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>",
6885
+ styles: [".table-wrapper{overflow-x:auto;max-width:100%}.table-container{border-top:1px solid var(--fb-border-default, #e2e8f0);min-height:100px;overflow:auto;width:100%;max-height:62vh}.table-layout{background:var(--fb-surface, #ffffff);border-radius:8px}.th{border-bottom:1px solid var(--fb-border-default, #e2e8f0);font-weight:var(--fw-600);font-size:var(--fs-medium);line-height:21px;color:var(--fb-text-primary, #0f172a)}.head-color{background-color:var(--fb-action-surface, #e0f2fe)!important;color:var(--fb-text-primary, #0f172a)!important}.body-color{color:var(--fb-text-primary, #0f172a);cursor:default}.search{display:flex;align-items:center;border:1px solid var(--border-color, #b1b1b1);background:var(--comp-bg-color, #ffffff);border-radius:var(--radius-medium, 7px);padding:4px 8px}.search-bar{display:flex;align-items:center;width:100%;gap:6px;margin:0}.search-bar input{background:transparent!important;border:none!important;outline:none!important;box-shadow:none!important;width:100%;font-size:13px;color:var(--fc-text-color, #1e293b);padding:2px 4px}th.mat-header-cell:last-of-type{padding:0;font-weight:var(--fw-600);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}td.mat-cell:last-of-type{padding:8px;font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.table-title{font-weight:var(--fw-600);color:var(--fb-text-primary, #0f172a)}.sticky-column{background:var(--fb-surface, #ffffff)}.mat-sort-header-container{margin-left:5px}.body-color img{cursor:pointer}.head-color.action-size{color:var(--fb-text-primary, #0f172a);font-size:var(--fs-primary);font-weight:var(--fw-600)}.lop-input{border-radius:5px;color:var(--fb-text-primary, #0f172a);background-color:var(--fb-surface, #ffffff);font-weight:var(--fw-400);font-size:var(--fs-medium);transition:all .2s}::ng-deep [dir=rtl] .body-color img{margin-left:4px!important}@media screen and (min-width:600px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}}@media screen and (max-width:882px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.mat-cell{padding:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-header-cell{padding:0}}th.mat-header-cell:first-of-type,td.mat-cell:first-of-type,td.mat-footer-cell:first-of-type{padding-right:24px}::ng-deep [dir=rtl] th.mat-header-cell:last-of-type:not(:only-of-type){padding-right:10px!important;padding-left:unset!important}.mat-sort-header-container.mat-focus-indicator.ng-tns-c139-34{margin-left:5px}.expense-file{font-size:var(--fs-small)}.expense-file:hover{font-style:italic;text-decoration:underline;color:var(--fb-action-hover, #00284d)}.expenseCon{background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);padding:5px;border-radius:3px}.hyper-link{text-decoration:none}.hyper-link:hover{color:var(--fb-action, #003566);text-decoration:underline}.clickable{cursor:pointer}.font-size-13{font-size:var(--fs-normal)}.weekoff-color{color:var(--fb-error, #ef4444)}.table-width{width:max-content}.on-edit:hover .edit-icon{visibility:visible}.edit-icon{visibility:hidden}.input-box{border:solid}.button-hov:hover{background:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff)}.delete-icon{justify-content:center}.side-main-content{border-radius:10px}h2{font-size:28px}.list-group-item{margin-bottom:10px;padding:15px}.list-group-item p{margin-bottom:5px}.custom-badge{display:inline-block;width:50%;text-align:center;padding:.3em 0;margin-top:0!important}.bg-success{--bs-bg-opacity: 1;background-color:var(--fb-success-surface, #e6f4ea)!important;color:var(--fb-success-text, #137333)!important}.custom-search-button{background-color:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff);border-radius:5px;font-size:var(--fs-normal);border:none}.custom-search-button:hover{background-color:var(--fb-action-hover, #00284d)}.custom-search-button:active{transform:translateY(0)}.table{border-top:1px solid var(--fb-border-default, #e2e8f0)}th,td{vertical-align:middle}.configSearch{height:22px;padding:3px;margin:10p;background-color:var(--fb-action, #003566);border-radius:4px}::ng-deep .table>:not(caption)>*>*{background-color:none!important;--bs-table-bg: var(--fb-surface, #ffffff) !important}.imgBtn{background-color:var(--fb-surface-secondary, #f8fafc);border-radius:var(--radius-small, 6px)}.imgBtnDiv{line-height:0px;padding:4px;border-radius:5px;border:1px solid var(--fb-border-default, #e2e8f0)}input::placeholder{font-size:var(--fs-small);font-weight:var(--fw-400);color:var(--fb-placeholder-text, #94a3b8)}::ng-deep .modal-backdrop{background-color:var(--fb-backdrop, #00000073)!important}::ng-deep .modal-backdrop.show{background-color:var(--fb-backdrop, #00000073)!important;opacity:1!important}::ng-deep .mat-sort-header-container .mat-sort-header-content span{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}::ng-deep .mat-mdc-cell{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-400)!important;font-size:var(--fs-primary)!important;min-width:20px!important}.active-column{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}.hover-content{background:var(--fb-surface-elevated, #ffffff)}.position-relative{position:relative;display:inline-block}.filter-popup{position:absolute;top:100%;left:0;z-index:9998;background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);box-shadow:0 4px 12px var(--fb-backdrop, rgba(0, 0, 0, .08));padding:10px;min-width:200px}.spanFontSize{font-size:var(--fs-normal)}.mat-column-employees{width:200px;min-width:200px;padding-left:8px;height:57px;left:0!important}.text-start{font-size:var(--fs-normal)}.first-header-border{border-left:1px solid var(--fb-border-default, #e2e8f0)}tr{height:45px!important;text-wrap:nowrap!important}.field-input{width:min(220px,98%);min-height:50px}.svg-spinner{animation:rotate 1s linear infinite}.svg-spinner .path{stroke:var(--fb-action, #003566);stroke-linecap:round;stroke-dasharray:80 150;stroke-width:4}@keyframes rotate{to{transform:rotate(360deg)}}img{max-width:none!important;vertical-align:middle}::ng-deep .mat-mdc-row:hover{background-color:var(--fb-row-hover, #f8fafc)!important}::ng-deep .mat-mdc-row:nth-child(2n){background-color:var(--fb-row-alternate, #fcfdfe)}.top-legend-bar{border-top:1px solid var(--fb-border-default, #e2e8f0);padding:8px 12px;font-size:var(--fs-small, 12px);background:var(--fb-surface, #ffffff)}.legend-text{font-size:var(--fs-small, 12px);color:var(--fc-text-color-dark, #0f172a);font-weight:var(--fw-500, 500)}.attendance-chip{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:4px;font-size:11px;font-weight:600}.attendance-present{background:#dcfce7;color:#15803d}.attendance-absent{background:#fee2e2;color:#b91c1c}.attendance-half{background:#fef3c7;color:#b45309}.attendance-holiday{background:#e0e7ff;color:#4338ca}.attendance-weekoff{background:#f1f5f9;color:#64748b}.picker-container{display:flex;align-items:center;gap:8px;padding:4px 8px;border:1px solid var(--fb-border-default, #e2e8f0);border-radius:6px;background:var(--fb-surface, #ffffff);margin-right:8px}.picker-container .arrow-btn{cursor:pointer;font-size:14px}.picker-container .month-label{cursor:pointer;font-weight:var(--fw-600, 600);font-size:13px;min-width:100px;text-align:center}.popup{position:absolute;z-index:1000;background:var(--comp-bg-color, #ffffff);border:1px solid var(--border-color, #e2e8f0);border-radius:8px;box-shadow:0 4px 12px #0000001a;padding:12px;width:220px}.year-section{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;font-weight:600}.year-section i{cursor:pointer}.month-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.month-item{padding:6px;text-align:center;cursor:pointer;border-radius:4px;font-size:12px}.month-item:hover,.month-item.active{background:var(--fb-action, #003566);color:#fff}.custom-modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#0006;display:flex;align-items:center;justify-content:center;z-index:1050}.custom-modal{background:var(--comp-bg-color, #ffffff);border-radius:8px;width:450px;max-width:90%;box-shadow:0 5px 15px #0003;overflow:hidden}.custom-modal-header{padding:12px 16px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-color, #e2e8f0)}.custom-modal-body{padding:16px;font-size:14px}.custom-modal-footer{padding:12px 16px;display:flex;justify-content:flex-end;border-top:1px solid var(--border-color, #e2e8f0)}.close-button{background:none;border:none;font-size:1.25rem;cursor:pointer}\n"],
6655
6886
  dependencies: [
6656
6887
  {
6657
6888
  kind: "ngmodule",
@@ -6659,13 +6890,13 @@ var DataTableComponent = class DataTableComponent {
6659
6890
  },
6660
6891
  {
6661
6892
  kind: "directive",
6662
- type: i1$3.NgClass,
6893
+ type: i1$4.NgClass,
6663
6894
  selector: "[ngClass]",
6664
6895
  inputs: ["class", "ngClass"]
6665
6896
  },
6666
6897
  {
6667
6898
  kind: "directive",
6668
- type: i1$3.NgForOf,
6899
+ type: i1$4.NgForOf,
6669
6900
  selector: "[ngFor][ngForOf]",
6670
6901
  inputs: [
6671
6902
  "ngForOf",
@@ -6675,7 +6906,7 @@ var DataTableComponent = class DataTableComponent {
6675
6906
  },
6676
6907
  {
6677
6908
  kind: "directive",
6678
- type: i1$3.NgIf,
6909
+ type: i1$4.NgIf,
6679
6910
  selector: "[ngIf]",
6680
6911
  inputs: [
6681
6912
  "ngIf",
@@ -6685,25 +6916,25 @@ var DataTableComponent = class DataTableComponent {
6685
6916
  },
6686
6917
  {
6687
6918
  kind: "directive",
6688
- type: i1$3.NgStyle,
6919
+ type: i1$4.NgStyle,
6689
6920
  selector: "[ngStyle]",
6690
6921
  inputs: ["ngStyle"]
6691
6922
  },
6692
6923
  {
6693
6924
  kind: "directive",
6694
- type: i1$3.NgSwitch,
6925
+ type: i1$4.NgSwitch,
6695
6926
  selector: "[ngSwitch]",
6696
6927
  inputs: ["ngSwitch"]
6697
6928
  },
6698
6929
  {
6699
6930
  kind: "directive",
6700
- type: i1$3.NgSwitchCase,
6931
+ type: i1$4.NgSwitchCase,
6701
6932
  selector: "[ngSwitchCase]",
6702
6933
  inputs: ["ngSwitchCase"]
6703
6934
  },
6704
6935
  {
6705
6936
  kind: "directive",
6706
- type: i1$3.NgSwitchDefault,
6937
+ type: i1$4.NgSwitchDefault,
6707
6938
  selector: "[ngSwitchDefault]"
6708
6939
  },
6709
6940
  {
@@ -6712,79 +6943,79 @@ var DataTableComponent = class DataTableComponent {
6712
6943
  },
6713
6944
  {
6714
6945
  kind: "component",
6715
- type: i9.MatTable,
6946
+ type: i9$1.MatTable,
6716
6947
  selector: "mat-table, table[mat-table]",
6717
6948
  exportAs: ["matTable"]
6718
6949
  },
6719
6950
  {
6720
6951
  kind: "directive",
6721
- type: i9.MatHeaderCellDef,
6952
+ type: i9$1.MatHeaderCellDef,
6722
6953
  selector: "[matHeaderCellDef]"
6723
6954
  },
6724
6955
  {
6725
6956
  kind: "directive",
6726
- type: i9.MatHeaderRowDef,
6957
+ type: i9$1.MatHeaderRowDef,
6727
6958
  selector: "[matHeaderRowDef]",
6728
6959
  inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"]
6729
6960
  },
6730
6961
  {
6731
6962
  kind: "directive",
6732
- type: i9.MatColumnDef,
6963
+ type: i9$1.MatColumnDef,
6733
6964
  selector: "[matColumnDef]",
6734
6965
  inputs: ["matColumnDef"]
6735
6966
  },
6736
6967
  {
6737
6968
  kind: "directive",
6738
- type: i9.MatCellDef,
6969
+ type: i9$1.MatCellDef,
6739
6970
  selector: "[matCellDef]"
6740
6971
  },
6741
6972
  {
6742
6973
  kind: "directive",
6743
- type: i9.MatRowDef,
6974
+ type: i9$1.MatRowDef,
6744
6975
  selector: "[matRowDef]",
6745
6976
  inputs: ["matRowDefColumns", "matRowDefWhen"]
6746
6977
  },
6747
6978
  {
6748
6979
  kind: "directive",
6749
- type: i9.MatFooterCellDef,
6980
+ type: i9$1.MatFooterCellDef,
6750
6981
  selector: "[matFooterCellDef]"
6751
6982
  },
6752
6983
  {
6753
6984
  kind: "directive",
6754
- type: i9.MatFooterRowDef,
6985
+ type: i9$1.MatFooterRowDef,
6755
6986
  selector: "[matFooterRowDef]",
6756
6987
  inputs: ["matFooterRowDef", "matFooterRowDefSticky"]
6757
6988
  },
6758
6989
  {
6759
6990
  kind: "directive",
6760
- type: i9.MatHeaderCell,
6991
+ type: i9$1.MatHeaderCell,
6761
6992
  selector: "mat-header-cell, th[mat-header-cell]"
6762
6993
  },
6763
6994
  {
6764
6995
  kind: "directive",
6765
- type: i9.MatCell,
6996
+ type: i9$1.MatCell,
6766
6997
  selector: "mat-cell, td[mat-cell]"
6767
6998
  },
6768
6999
  {
6769
7000
  kind: "directive",
6770
- type: i9.MatFooterCell,
7001
+ type: i9$1.MatFooterCell,
6771
7002
  selector: "mat-footer-cell, td[mat-footer-cell]"
6772
7003
  },
6773
7004
  {
6774
7005
  kind: "component",
6775
- type: i9.MatHeaderRow,
7006
+ type: i9$1.MatHeaderRow,
6776
7007
  selector: "mat-header-row, tr[mat-header-row]",
6777
7008
  exportAs: ["matHeaderRow"]
6778
7009
  },
6779
7010
  {
6780
7011
  kind: "component",
6781
- type: i9.MatRow,
7012
+ type: i9$1.MatRow,
6782
7013
  selector: "mat-row, tr[mat-row]",
6783
7014
  exportAs: ["matRow"]
6784
7015
  },
6785
7016
  {
6786
7017
  kind: "component",
6787
- type: i9.MatFooterRow,
7018
+ type: i9$1.MatFooterRow,
6788
7019
  selector: "mat-footer-row, tr[mat-footer-row]",
6789
7020
  exportAs: ["matFooterRow"]
6790
7021
  },
@@ -6824,36 +7055,40 @@ var DataTableComponent = class DataTableComponent {
6824
7055
  ],
6825
7056
  exportAs: ["matSortHeader"]
6826
7057
  },
7058
+ {
7059
+ kind: "ngmodule",
7060
+ type: MatCheckboxModule
7061
+ },
6827
7062
  {
6828
7063
  kind: "ngmodule",
6829
7064
  type: ReactiveFormsModule
6830
7065
  },
6831
7066
  {
6832
7067
  kind: "directive",
6833
- type: i3$1.NgSelectOption,
7068
+ type: i3$2.NgSelectOption,
6834
7069
  selector: "option",
6835
7070
  inputs: ["ngValue", "value"]
6836
7071
  },
6837
7072
  {
6838
7073
  kind: "directive",
6839
- type: i3$1.ɵNgSelectMultipleOption,
7074
+ type: i3$2.ɵNgSelectMultipleOption,
6840
7075
  selector: "option",
6841
7076
  inputs: ["ngValue", "value"]
6842
7077
  },
6843
7078
  {
6844
7079
  kind: "directive",
6845
- type: i3$1.DefaultValueAccessor,
7080
+ type: i3$2.DefaultValueAccessor,
6846
7081
  selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
6847
7082
  },
6848
7083
  {
6849
7084
  kind: "directive",
6850
- type: i3$1.SelectControlValueAccessor,
7085
+ type: i3$2.SelectControlValueAccessor,
6851
7086
  selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]",
6852
7087
  inputs: ["compareWith"]
6853
7088
  },
6854
7089
  {
6855
7090
  kind: "directive",
6856
- type: i3$1.NgControlStatus,
7091
+ type: i3$2.NgControlStatus,
6857
7092
  selector: "[formControlName],[ngModel],[formControl]"
6858
7093
  },
6859
7094
  {
@@ -6862,7 +7097,7 @@ var DataTableComponent = class DataTableComponent {
6862
7097
  },
6863
7098
  {
6864
7099
  kind: "directive",
6865
- type: i3$1.NgModel,
7100
+ type: i3$2.NgModel,
6866
7101
  selector: "[ngModel]:not([formControlName]):not([formControl])",
6867
7102
  inputs: [
6868
7103
  "name",
@@ -6926,7 +7161,7 @@ var DataTableComponent = class DataTableComponent {
6926
7161
  },
6927
7162
  {
6928
7163
  kind: "directive",
6929
- type: i4.MatTooltip,
7164
+ type: i4$1.MatTooltip,
6930
7165
  selector: "[matTooltip]",
6931
7166
  inputs: [
6932
7167
  "matTooltipPosition",
@@ -6942,7 +7177,7 @@ var DataTableComponent = class DataTableComponent {
6942
7177
  },
6943
7178
  {
6944
7179
  kind: "directive",
6945
- type: i1$1.CdkScrollable,
7180
+ type: i1$2.CdkScrollable,
6946
7181
  selector: "[cdk-scrollable], [cdkScrollable]"
6947
7182
  },
6948
7183
  {
@@ -7040,7 +7275,7 @@ var DataTableComponent = class DataTableComponent {
7040
7275
  },
7041
7276
  {
7042
7277
  kind: "directive",
7043
- type: i1$1.CdkConnectedOverlay,
7278
+ type: i1$2.CdkConnectedOverlay,
7044
7279
  selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]",
7045
7280
  inputs: [
7046
7281
  "cdkConnectedOverlayOrigin",
@@ -7081,7 +7316,7 @@ var DataTableComponent = class DataTableComponent {
7081
7316
  },
7082
7317
  {
7083
7318
  kind: "directive",
7084
- type: i1$1.CdkOverlayOrigin,
7319
+ type: i1$2.CdkOverlayOrigin,
7085
7320
  selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]",
7086
7321
  exportAs: ["cdkOverlayOrigin"]
7087
7322
  },
@@ -7138,7 +7373,12 @@ var DataTableComponent = class DataTableComponent {
7138
7373
  },
7139
7374
  {
7140
7375
  kind: "pipe",
7141
- type: i1$3.DatePipe,
7376
+ type: i1$4.SlicePipe,
7377
+ name: "slice"
7378
+ },
7379
+ {
7380
+ kind: "pipe",
7381
+ type: i1$4.DatePipe,
7142
7382
  name: "date"
7143
7383
  },
7144
7384
  {
@@ -7181,7 +7421,8 @@ var DataTableComponent = class DataTableComponent {
7181
7421
  type: CustomTimePipe,
7182
7422
  name: "customTime"
7183
7423
  }
7184
- ]
7424
+ ],
7425
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
7185
7426
  });
7186
7427
  };
7187
7428
  i0.ɵɵngDeclareClassMetadata({
@@ -7192,12 +7433,13 @@ i0.ɵɵngDeclareClassMetadata({
7192
7433
  decorators: [{
7193
7434
  type: Component,
7194
7435
  args: [{
7195
- selector: "app-data-table",
7436
+ selector: "app-data-table, app-data-table-two",
7196
7437
  imports: [
7197
7438
  CommonModule,
7198
7439
  MatTableModule,
7199
7440
  MatPaginatorModule,
7200
7441
  MatSortModule,
7442
+ MatCheckboxModule,
7201
7443
  ReactiveFormsModule,
7202
7444
  FormsModule,
7203
7445
  SearchFilterComponent,
@@ -7222,17 +7464,18 @@ i0.ɵɵngDeclareClassMetadata({
7222
7464
  DropDownComponent
7223
7465
  ],
7224
7466
  standalone: true,
7467
+ changeDetection: ChangeDetectionStrategy.OnPush,
7225
7468
  providers: [{
7226
7469
  provide: MatPaginatorIntl,
7227
7470
  useClass: CustomPaginatorIntl
7228
7471
  }],
7229
- template: "<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>\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 <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 <!-- 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 <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>",
7230
- styles: [".table-wrapper{overflow-x:auto;max-width:100%}.table-container{border-top:1px solid var(--fb-border-default, #e2e8f0);min-height:100px;overflow:auto;width:100%;max-height:62vh}.table-layout{background:var(--fb-surface, #ffffff);border-radius:8px}.th{border-bottom:1px solid var(--fb-border-default, #e2e8f0);font-weight:var(--fw-600);font-size:var(--fs-medium);line-height:21px;color:var(--fb-text-primary, #0f172a)}.head-color{background-color:var(--fb-action-surface, #e0f2fe)!important;color:var(--fb-text-primary, #0f172a)!important}.body-color{color:var(--fb-text-primary, #0f172a);cursor:default}.search{display:flex;justify-content:space-between;border:1px solid var(--fb-border-default, #e2e8f0);background:var(--fb-surface, #ffffff);border-radius:7px;align-self:center;padding:0}.search-bar{width:100%;margin:4px}th.mat-header-cell:last-of-type{padding:0;font-weight:var(--fw-600);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}td.mat-cell:last-of-type{padding:8px;font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.table-title{font-weight:var(--fw-600);color:var(--fb-text-primary, #0f172a)}.sticky-column{background:var(--fb-surface, #ffffff)}.mat-sort-header-container{margin-left:5px}.body-color img{cursor:pointer}.head-color.action-size{color:var(--fb-text-primary, #0f172a);font-size:var(--fs-primary);font-weight:var(--fw-600)}.lop-input{border-radius:5px;color:var(--fb-text-primary, #0f172a);background-color:var(--fb-surface, #ffffff);font-weight:var(--fw-400);font-size:var(--fs-medium);transition:all .2s}::ng-deep [dir=rtl] .body-color img{margin-left:4px!important}@media screen and (min-width:600px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}}@media screen and (max-width:882px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.mat-cell{padding:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-header-cell{padding:0}}th.mat-header-cell:first-of-type,td.mat-cell:first-of-type,td.mat-footer-cell:first-of-type{padding-right:24px}::ng-deep [dir=rtl] th.mat-header-cell:last-of-type:not(:only-of-type){padding-right:10px!important;padding-left:unset!important}.mat-sort-header-container.mat-focus-indicator.ng-tns-c139-34{margin-left:5px}.expense-file{font-size:var(--fs-small)}.expense-file:hover{font-style:italic;text-decoration:underline;color:var(--fb-action-hover, #00284d)}.expenseCon{background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);padding:5px;border-radius:3px}.hyper-link{text-decoration:none}.hyper-link:hover{color:var(--fb-action, #003566);text-decoration:underline}.clickable{cursor:pointer}.font-size-13{font-size:var(--fs-normal)}.weekoff-color{color:var(--fb-error, #ef4444)}.table-width{width:max-content}.on-edit:hover .edit-icon{visibility:visible}.edit-icon{visibility:hidden}.input-box{border:solid}.button-hov:hover{background:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff)}.delete-icon{justify-content:center}.side-main-content{border-radius:10px}h2{font-size:28px}.list-group-item{margin-bottom:10px;padding:15px}.list-group-item p{margin-bottom:5px}.custom-badge{display:inline-block;width:50%;text-align:center;padding:.3em 0;margin-top:0!important}.bg-success{--bs-bg-opacity: 1;background-color:var(--fb-success-surface, #e6f4ea)!important;color:var(--fb-success-text, #137333)!important}.custom-search-button{background-color:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff);border-radius:5px;font-size:var(--fs-normal);border:none}.custom-search-button:hover{background-color:var(--fb-action-hover, #00284d)}.custom-search-button:active{transform:translateY(0)}.table{border-top:1px solid var(--fb-border-default, #e2e8f0)}th,td{vertical-align:middle}.configSearch{height:22px;padding:3px;margin:10p;background-color:var(--fb-action, #003566);border-radius:4px}::ng-deep .table>:not(caption)>*>*{background-color:none!important;--bs-table-bg: var(--fb-surface, #ffffff) !important}.imgBtn{background-color:var(--fb-surface-secondary, #f8fafc);border-radius:var(--radius-small, 6px)}.imgBtnDiv{line-height:0px;padding:4px;border-radius:5px;border:1px solid var(--fb-border-default, #e2e8f0)}input::placeholder{font-size:var(--fs-small);font-weight:var(--fw-400);color:var(--fb-placeholder-text, #94a3b8)}::ng-deep .modal-backdrop{background-color:var(--fb-backdrop, #00000073)!important}::ng-deep .modal-backdrop.show{background-color:var(--fb-backdrop, #00000073)!important;opacity:1!important}::ng-deep .mat-sort-header-container .mat-sort-header-content span{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}::ng-deep .mat-mdc-cell{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-400)!important;font-size:var(--fs-primary)!important;min-width:20px!important}.active-column{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}.hover-content{background:var(--fb-surface-elevated, #ffffff)}.position-relative{position:relative;display:inline-block}.filter-popup{position:absolute;top:100%;left:0;z-index:9998;background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);box-shadow:0 4px 12px var(--fb-backdrop, rgba(0, 0, 0, .08));padding:10px;min-width:200px}.spanFontSize{font-size:var(--fs-normal)}.mat-column-employees{width:200px;min-width:200px;padding-left:8px;height:57px;left:0!important}.text-start{font-size:var(--fs-normal)}.first-header-border{border-left:1px solid var(--fb-border-default, #e2e8f0)}tr{height:45px!important;text-wrap:nowrap!important}.field-input{width:min(220px,98%);min-height:50px}.svg-spinner{animation:rotate 1s linear infinite}.svg-spinner .path{stroke:var(--fb-action, #003566);stroke-linecap:round;stroke-dasharray:80 150;stroke-width:4}@keyframes rotate{to{transform:rotate(360deg)}}img{max-width:none!important;vertical-align:middle}::ng-deep .mat-mdc-row:hover{background-color:var(--fb-row-hover, #f8fafc)!important}::ng-deep .mat-mdc-row:nth-child(2n){background-color:var(--fb-row-alternate, #fcfdfe)}\n"]
7472
+ template: "<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>",
7473
+ styles: [".table-wrapper{overflow-x:auto;max-width:100%}.table-container{border-top:1px solid var(--fb-border-default, #e2e8f0);min-height:100px;overflow:auto;width:100%;max-height:62vh}.table-layout{background:var(--fb-surface, #ffffff);border-radius:8px}.th{border-bottom:1px solid var(--fb-border-default, #e2e8f0);font-weight:var(--fw-600);font-size:var(--fs-medium);line-height:21px;color:var(--fb-text-primary, #0f172a)}.head-color{background-color:var(--fb-action-surface, #e0f2fe)!important;color:var(--fb-text-primary, #0f172a)!important}.body-color{color:var(--fb-text-primary, #0f172a);cursor:default}.search{display:flex;align-items:center;border:1px solid var(--border-color, #b1b1b1);background:var(--comp-bg-color, #ffffff);border-radius:var(--radius-medium, 7px);padding:4px 8px}.search-bar{display:flex;align-items:center;width:100%;gap:6px;margin:0}.search-bar input{background:transparent!important;border:none!important;outline:none!important;box-shadow:none!important;width:100%;font-size:13px;color:var(--fc-text-color, #1e293b);padding:2px 4px}th.mat-header-cell:last-of-type{padding:0;font-weight:var(--fw-600);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}td.mat-cell:last-of-type{padding:8px;font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.table-title{font-weight:var(--fw-600);color:var(--fb-text-primary, #0f172a)}.sticky-column{background:var(--fb-surface, #ffffff)}.mat-sort-header-container{margin-left:5px}.body-color img{cursor:pointer}.head-color.action-size{color:var(--fb-text-primary, #0f172a);font-size:var(--fs-primary);font-weight:var(--fw-600)}.lop-input{border-radius:5px;color:var(--fb-text-primary, #0f172a);background-color:var(--fb-surface, #ffffff);font-weight:var(--fw-400);font-size:var(--fs-medium);transition:all .2s}::ng-deep [dir=rtl] .body-color img{margin-left:4px!important}@media screen and (min-width:600px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}}@media screen and (max-width:882px){mat-table{font-weight:var(--fw-400);font-size:var(--fs-medium);color:var(--fb-text-primary, #0f172a)}.mat-cell{padding:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-header-cell{padding:0}}th.mat-header-cell:first-of-type,td.mat-cell:first-of-type,td.mat-footer-cell:first-of-type{padding-right:24px}::ng-deep [dir=rtl] th.mat-header-cell:last-of-type:not(:only-of-type){padding-right:10px!important;padding-left:unset!important}.mat-sort-header-container.mat-focus-indicator.ng-tns-c139-34{margin-left:5px}.expense-file{font-size:var(--fs-small)}.expense-file:hover{font-style:italic;text-decoration:underline;color:var(--fb-action-hover, #00284d)}.expenseCon{background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);padding:5px;border-radius:3px}.hyper-link{text-decoration:none}.hyper-link:hover{color:var(--fb-action, #003566);text-decoration:underline}.clickable{cursor:pointer}.font-size-13{font-size:var(--fs-normal)}.weekoff-color{color:var(--fb-error, #ef4444)}.table-width{width:max-content}.on-edit:hover .edit-icon{visibility:visible}.edit-icon{visibility:hidden}.input-box{border:solid}.button-hov:hover{background:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff)}.delete-icon{justify-content:center}.side-main-content{border-radius:10px}h2{font-size:28px}.list-group-item{margin-bottom:10px;padding:15px}.list-group-item p{margin-bottom:5px}.custom-badge{display:inline-block;width:50%;text-align:center;padding:.3em 0;margin-top:0!important}.bg-success{--bs-bg-opacity: 1;background-color:var(--fb-success-surface, #e6f4ea)!important;color:var(--fb-success-text, #137333)!important}.custom-search-button{background-color:var(--fb-action, #003566);color:var(--fb-text-on-action, #ffffff);border-radius:5px;font-size:var(--fs-normal);border:none}.custom-search-button:hover{background-color:var(--fb-action-hover, #00284d)}.custom-search-button:active{transform:translateY(0)}.table{border-top:1px solid var(--fb-border-default, #e2e8f0)}th,td{vertical-align:middle}.configSearch{height:22px;padding:3px;margin:10p;background-color:var(--fb-action, #003566);border-radius:4px}::ng-deep .table>:not(caption)>*>*{background-color:none!important;--bs-table-bg: var(--fb-surface, #ffffff) !important}.imgBtn{background-color:var(--fb-surface-secondary, #f8fafc);border-radius:var(--radius-small, 6px)}.imgBtnDiv{line-height:0px;padding:4px;border-radius:5px;border:1px solid var(--fb-border-default, #e2e8f0)}input::placeholder{font-size:var(--fs-small);font-weight:var(--fw-400);color:var(--fb-placeholder-text, #94a3b8)}::ng-deep .modal-backdrop{background-color:var(--fb-backdrop, #00000073)!important}::ng-deep .modal-backdrop.show{background-color:var(--fb-backdrop, #00000073)!important;opacity:1!important}::ng-deep .mat-sort-header-container .mat-sort-header-content span{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}::ng-deep .mat-mdc-cell{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-400)!important;font-size:var(--fs-primary)!important;min-width:20px!important}.active-column{color:var(--fb-text-primary, #0f172a)!important;font-weight:var(--fw-600)!important;font-size:var(--fs-primary)!important}.hover-content{background:var(--fb-surface-elevated, #ffffff)}.position-relative{position:relative;display:inline-block}.filter-popup{position:absolute;top:100%;left:0;z-index:9998;background-color:var(--fb-surface-elevated, #ffffff);border:1px solid var(--fb-border-default, #e2e8f0);box-shadow:0 4px 12px var(--fb-backdrop, rgba(0, 0, 0, .08));padding:10px;min-width:200px}.spanFontSize{font-size:var(--fs-normal)}.mat-column-employees{width:200px;min-width:200px;padding-left:8px;height:57px;left:0!important}.text-start{font-size:var(--fs-normal)}.first-header-border{border-left:1px solid var(--fb-border-default, #e2e8f0)}tr{height:45px!important;text-wrap:nowrap!important}.field-input{width:min(220px,98%);min-height:50px}.svg-spinner{animation:rotate 1s linear infinite}.svg-spinner .path{stroke:var(--fb-action, #003566);stroke-linecap:round;stroke-dasharray:80 150;stroke-width:4}@keyframes rotate{to{transform:rotate(360deg)}}img{max-width:none!important;vertical-align:middle}::ng-deep .mat-mdc-row:hover{background-color:var(--fb-row-hover, #f8fafc)!important}::ng-deep .mat-mdc-row:nth-child(2n){background-color:var(--fb-row-alternate, #fcfdfe)}.top-legend-bar{border-top:1px solid var(--fb-border-default, #e2e8f0);padding:8px 12px;font-size:var(--fs-small, 12px);background:var(--fb-surface, #ffffff)}.legend-text{font-size:var(--fs-small, 12px);color:var(--fc-text-color-dark, #0f172a);font-weight:var(--fw-500, 500)}.attendance-chip{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:4px;font-size:11px;font-weight:600}.attendance-present{background:#dcfce7;color:#15803d}.attendance-absent{background:#fee2e2;color:#b91c1c}.attendance-half{background:#fef3c7;color:#b45309}.attendance-holiday{background:#e0e7ff;color:#4338ca}.attendance-weekoff{background:#f1f5f9;color:#64748b}.picker-container{display:flex;align-items:center;gap:8px;padding:4px 8px;border:1px solid var(--fb-border-default, #e2e8f0);border-radius:6px;background:var(--fb-surface, #ffffff);margin-right:8px}.picker-container .arrow-btn{cursor:pointer;font-size:14px}.picker-container .month-label{cursor:pointer;font-weight:var(--fw-600, 600);font-size:13px;min-width:100px;text-align:center}.popup{position:absolute;z-index:1000;background:var(--comp-bg-color, #ffffff);border:1px solid var(--border-color, #e2e8f0);border-radius:8px;box-shadow:0 4px 12px #0000001a;padding:12px;width:220px}.year-section{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;font-weight:600}.year-section i{cursor:pointer}.month-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.month-item{padding:6px;text-align:center;cursor:pointer;border-radius:4px;font-size:12px}.month-item:hover,.month-item.active{background:var(--fb-action, #003566);color:#fff}.custom-modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#0006;display:flex;align-items:center;justify-content:center;z-index:1050}.custom-modal{background:var(--comp-bg-color, #ffffff);border-radius:8px;width:450px;max-width:90%;box-shadow:0 5px 15px #0003;overflow:hidden}.custom-modal-header{padding:12px 16px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-color, #e2e8f0)}.custom-modal-body{padding:16px;font-size:14px}.custom-modal-footer{padding:12px 16px;display:flex;justify-content:flex-end;border-top:1px solid var(--border-color, #e2e8f0)}.close-button{background:none;border:none;font-size:1.25rem;cursor:pointer}\n"]
7231
7474
  }]
7232
7475
  }],
7233
7476
  ctorParameters: () => [
7234
7477
  { type: ScrollService },
7235
- { type: i1$1.Overlay },
7478
+ { type: i1$2.Overlay },
7236
7479
  { type: GlobalValuesService },
7237
7480
  { type: ApiService },
7238
7481
  { type: AlertService },
@@ -7303,11 +7546,24 @@ i0.ɵɵngDeclareClassMetadata({
7303
7546
  dropdownLists: [{ type: Input }],
7304
7547
  dateDropdown: [{ type: Input }],
7305
7548
  from: [{ type: Input }],
7549
+ isSandwichLeave: [{ type: Input }],
7550
+ isCheckButton: [{ type: Input }],
7551
+ monthArray: [{ type: Input }],
7552
+ yearArray: [{ type: Input }],
7553
+ year: [{ type: Input }],
7554
+ month: [{ type: Input }],
7555
+ button: [{ type: Input }],
7556
+ exportDisable: [{ type: Input }],
7557
+ defaultWorkingHours: [{ type: Input }],
7558
+ saveLOP: [{ type: Input }],
7559
+ isAttendanceTable: [{ type: Input }],
7306
7560
  dateEmit: [{ type: Output }],
7307
7561
  selectedValues: [{ type: Output }],
7308
7562
  tableRowClick: [{ type: Output }],
7563
+ rowClick: [{ type: Output }],
7309
7564
  filteredArray: [{ type: Output }],
7310
7565
  searchFilterData: [{ type: Output }],
7566
+ searchValueChange: [{ type: Output }],
7311
7567
  onEditData: [{ type: Output }],
7312
7568
  onCloneData: [{ type: Output }],
7313
7569
  onSendData: [{ type: Output }],
@@ -7334,6 +7590,13 @@ i0.ɵɵngDeclareClassMetadata({
7334
7590
  sideNavEmit: [{ type: Output }],
7335
7591
  searchText: [{ type: Output }],
7336
7592
  dropdownDataEmit: [{ type: Output }],
7593
+ checkClicked: [{ type: Output }],
7594
+ yearDataEmit: [{ type: Output }],
7595
+ selectedValueEmit: [{ type: Output }],
7596
+ monthDataEmit: [{ type: Output }],
7597
+ doubleClickEmit: [{ type: Output }],
7598
+ hyperLinkClickEmit: [{ type: Output }],
7599
+ tableParamsChange: [{ type: Output }],
7337
7600
  paginator: [{
7338
7601
  type: ViewChild,
7339
7602
  args: ["paginator"]
@@ -7363,6 +7626,1163 @@ i0.ɵɵngDeclareClassMetadata({
7363
7626
  deleteModal: [{ type: Input }]
7364
7627
  }
7365
7628
  });
7629
+ var FusionCardComponent = class FusionCardComponent {
7630
+ sanitizer;
7631
+ renderer;
7632
+ apiService;
7633
+ datePipe;
7634
+ loaderService;
7635
+ cdr;
7636
+ _cardData = [];
7637
+ set cardData(data) {
7638
+ if (Array.isArray(data)) {
7639
+ this._cardData = data;
7640
+ this.calculateCardMarginTop();
7641
+ } else this._cardData = [];
7642
+ this.cdr.markForCheck();
7643
+ }
7644
+ get cardData() {
7645
+ return this._cardData;
7646
+ }
7647
+ from;
7648
+ comp = {};
7649
+ cardButtonEmit = new EventEmitter();
7650
+ deleteModal = false;
7651
+ deleteData;
7652
+ currentOpenIndex = null;
7653
+ clickListener;
7654
+ modalDirect;
7655
+ safeSrc = null;
7656
+ isLoading = [];
7657
+ isViewLoading = [];
7658
+ popupTitle;
7659
+ file;
7660
+ isCardLoading;
7661
+ constructor(sanitizer, renderer, apiService, datePipe, loaderService, cdr) {
7662
+ this.sanitizer = sanitizer;
7663
+ this.renderer = renderer;
7664
+ this.apiService = apiService;
7665
+ this.datePipe = datePipe;
7666
+ this.loaderService = loaderService;
7667
+ this.cdr = cdr;
7668
+ }
7669
+ ngOnInit() {
7670
+ this.loaderService.loading.subscribe((loadingStates) => {
7671
+ this.isCardLoading = loadingStates;
7672
+ this.cdr.markForCheck();
7673
+ });
7674
+ }
7675
+ calculateCardMarginTop() {
7676
+ let total = 0;
7677
+ for (const card of this._cardData) {
7678
+ const size = Number(card?.cardSize?.split("-")?.[2]);
7679
+ total += size;
7680
+ card.marginTop = total < 13 ? "0px" : "10px";
7681
+ }
7682
+ }
7683
+ deleteRecord(data) {
7684
+ this.deleteData = data;
7685
+ this.deleteModal = true;
7686
+ }
7687
+ deleteRecordData() {
7688
+ this.cardButtonEmit.emit(this.deleteData);
7689
+ this.deleteModal = false;
7690
+ }
7691
+ actionButtonClicked(event, card) {
7692
+ if (event.type === "delete") this.deleteRecord({
7693
+ event,
7694
+ card
7695
+ });
7696
+ else this.cardButtonEmit.emit({
7697
+ event,
7698
+ card
7699
+ });
7700
+ }
7701
+ isConditionMet(element, conditions) {
7702
+ if (conditions !== void 0) {
7703
+ const { andConditionList, orConditionList } = conditions;
7704
+ const isAndConditionMet = andConditionList ? andConditionList.every((cond) => Array.isArray(cond.condition) ? cond.condition.includes(element[cond.column]) : cond.condition === element[cond.column]) : true;
7705
+ const isOrConditionMet = orConditionList ? orConditionList.some((cond) => Array.isArray(cond.condition) ? cond.condition.includes(element[cond.column]) : cond.condition === element[cond.column]) : true;
7706
+ return isAndConditionMet && isOrConditionMet;
7707
+ } else return true;
7708
+ }
7709
+ toggleDropdown(index) {
7710
+ this.currentOpenIndex = this.currentOpenIndex === index ? null : index;
7711
+ this.addClickOutsideListener();
7712
+ }
7713
+ addClickOutsideListener() {
7714
+ if (!this.clickListener) this.clickListener = this.renderer.listen("document", "click", (event) => {
7715
+ if (!event.target.closest(".dropdown")) {
7716
+ this.currentOpenIndex = null;
7717
+ this.removeClickListener();
7718
+ }
7719
+ });
7720
+ }
7721
+ removeClickListener() {
7722
+ if (this.clickListener) {
7723
+ this.clickListener();
7724
+ this.clickListener = null;
7725
+ }
7726
+ }
7727
+ onMouseEnter(event, styleName, color) {
7728
+ event.target.style[styleName] = styleName === "border" ? `1px solid ${color}` : color;
7729
+ }
7730
+ onMouseLeave(event, styleName, color) {
7731
+ event.target.style[styleName] = styleName === "border" ? `1px solid ${color}` : color;
7732
+ }
7733
+ fileClick(evt, index) {
7734
+ this.isViewLoading[index] = true;
7735
+ this.cdr.markForCheck();
7736
+ let event = evt?.file || evt;
7737
+ const fileId = evt?.id || evt?._id || evt?.fileID || evt?.fileId;
7738
+ if (fileId) this.apiService.fetchData("/file?id=" + fileId).subscribe({
7739
+ next: (file) => {
7740
+ this.popupTitle = file.name || evt?.name || "File Preview";
7741
+ const buffer = new Uint8Array(file.content.data);
7742
+ const blob = new Blob([buffer], { type: file?.type || evt?.fileType || "application/pdf" });
7743
+ const reader = new FileReader();
7744
+ reader.onload = (e) => {
7745
+ const fileOutput = e.target.result;
7746
+ this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(fileOutput);
7747
+ if (this.file?.nativeElement) {
7748
+ this.modalDirect = new Modal(this.file.nativeElement, { backdrop: "static" });
7749
+ this.modalDirect.show();
7750
+ }
7751
+ this.stopViewLoader(index);
7752
+ this.cdr.markForCheck();
7753
+ };
7754
+ reader.readAsDataURL(blob);
7755
+ },
7756
+ error: () => this.stopViewLoader(index)
7757
+ });
7758
+ else {
7759
+ const request = new XMLHttpRequest();
7760
+ request.open("GET", event, true);
7761
+ request.responseType = "blob";
7762
+ request.onload = () => {
7763
+ this.popupTitle = evt?.name || "File Preview";
7764
+ const blob = request.response;
7765
+ const reader = new FileReader();
7766
+ reader.onload = (e) => {
7767
+ const fileOutput = e.target.result;
7768
+ this.safeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(fileOutput);
7769
+ if (this.file?.nativeElement) {
7770
+ this.modalDirect = new Modal(this.file.nativeElement, { backdrop: "static" });
7771
+ this.modalDirect.show();
7772
+ }
7773
+ this.stopViewLoader(index);
7774
+ this.cdr.markForCheck();
7775
+ };
7776
+ reader.readAsDataURL(blob);
7777
+ };
7778
+ request.onerror = () => this.stopViewLoader(index);
7779
+ request.send();
7780
+ }
7781
+ }
7782
+ closeModal() {
7783
+ this.safeSrc = null;
7784
+ this.popupTitle = "";
7785
+ this.cdr.markForCheck();
7786
+ }
7787
+ stopViewLoader(index) {
7788
+ setTimeout(() => {
7789
+ this.isViewLoading[index] = false;
7790
+ this.cdr.markForCheck();
7791
+ }, 300);
7792
+ }
7793
+ downloadFile(evt, index) {
7794
+ this.isLoading[index] = true;
7795
+ this.cdr.markForCheck();
7796
+ const fileId = evt?.id || evt?._id || evt?.fileID || evt?.fileId;
7797
+ if (fileId) this.apiService.fetchData("/file?id=" + fileId).subscribe({
7798
+ next: (file) => {
7799
+ const buffer = new Uint8Array(file.content.data);
7800
+ const blob = new Blob([buffer], { type: file?.type || evt?.fileType });
7801
+ const url = window.URL.createObjectURL(blob);
7802
+ this.triggerDownload(url, evt.name || file.name);
7803
+ this.stopLoader(index);
7804
+ },
7805
+ error: () => this.stopLoader(index)
7806
+ });
7807
+ else {
7808
+ const request = new XMLHttpRequest();
7809
+ request.open("GET", evt?.file || evt, true);
7810
+ request.responseType = "blob";
7811
+ request.onload = () => {
7812
+ const url = window.URL.createObjectURL(request.response);
7813
+ this.triggerDownload(url, evt.name);
7814
+ this.stopLoader(index);
7815
+ };
7816
+ request.onerror = () => this.stopLoader(index);
7817
+ request.send();
7818
+ }
7819
+ }
7820
+ triggerDownload(url, name) {
7821
+ const a = document.createElement("a");
7822
+ a.href = url;
7823
+ a.download = name || "downloaded-file";
7824
+ document.body.appendChild(a);
7825
+ a.click();
7826
+ document.body.removeChild(a);
7827
+ URL.revokeObjectURL(url);
7828
+ }
7829
+ stopLoader(index) {
7830
+ setTimeout(() => {
7831
+ this.isLoading[index] = false;
7832
+ this.cdr.markForCheck();
7833
+ }, 400);
7834
+ }
7835
+ static ɵfac = i0.ɵɵngDeclareFactory({
7836
+ minVersion: "12.0.0",
7837
+ version: "22.2.4",
7838
+ ngImport: i0,
7839
+ type: FusionCardComponent,
7840
+ deps: [
7841
+ { token: i1.DomSanitizer },
7842
+ { token: i0.Renderer2 },
7843
+ { token: ApiService },
7844
+ { token: i1$4.DatePipe },
7845
+ { token: LoaderService },
7846
+ { token: i0.ChangeDetectorRef }
7847
+ ],
7848
+ target: i0.ɵɵFactoryTarget.Component
7849
+ });
7850
+ static ɵcmp = i0.ɵɵngDeclareComponent({
7851
+ minVersion: "14.0.0",
7852
+ version: "22.2.4",
7853
+ type: FusionCardComponent,
7854
+ isStandalone: true,
7855
+ selector: "fusion-card",
7856
+ inputs: {
7857
+ cardData: "cardData",
7858
+ from: "from",
7859
+ comp: "comp"
7860
+ },
7861
+ outputs: { cardButtonEmit: "cardButtonEmit" },
7862
+ providers: [DatePipe],
7863
+ viewQueries: [{
7864
+ propertyName: "file",
7865
+ first: true,
7866
+ predicate: ["file"],
7867
+ descendants: true
7868
+ }],
7869
+ ngImport: i0,
7870
+ template: "<!-- 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",
7871
+ styles: [".dropdown-menu{left:unset!important;right:300%;top:12.5px;background-color:var(--comp-bg-color, #ffffff);border:1px solid var(--border-color, #e2e8f0);border-radius:var(--radius-small, 4px);box-shadow:0 4px 8px var(--box-shadow-color, rgba(0, 0, 0, .1))}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}.clickable-img{position:relative;cursor:pointer;padding:2px;border:1px solid var(--border-color, #e2e8f0);border-radius:5px}.clickable-img:hover{border:1px solid var(--fc-primary-color, rgb(31, 105, 255));border-radius:var(--radius-small, 5px)}.card-icon.color path{fill:var(--fc-primary-color, #2563eb)}.card-icon.color{margin-left:15px}.custom-modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:var(--box-shadow-color, rgba(0, 0, 0, .4));display:flex;align-items:start;justify-content:center;z-index:1050}.custom-modal{background:var(--comp-bg-color, #ffffff);border-radius:8px;width:550px;max-width:90%;margin-top:30px;box-shadow:0 5px 15px var(--box-shadow-color, rgba(0, 0, 0, .2));overflow:hidden}.custom-modal-header{border-bottom:solid .5px var(--border-color, #e2e8f0)}.custom-modal-footer{border-top:solid .5px var(--border-color, #e2e8f0)}.custom-modal-header,.custom-modal-footer{padding:.7rem;display:flex;justify-content:space-between;align-items:center}.custom-modal-body{padding:1rem;font-size:1rem}.close-button{background:none;border:none;font-size:1.25rem;cursor:pointer}.cancel-button,.confirm-button{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer}.cancel-button{background:var(--comp-bg-color, #ffffff);color:var(--fc-text-color-dark, #000000)}.confirm-button{background:var(--clr-error, #d9534f);color:var(--comp-bg-color, #ffffff)}.text-center{text-align:center!important;border:solid .5px var(--border-color, #94a3b8);border-radius:var(--radius-medium, 10px);margin:10px 0;color:var(--fc-text-color-light, #94a3b8)}.receipt-view{width:100%;height:600px}.icon-container{position:relative;margin-top:100px;z-index:1}.card-detail{margin-top:5px;margin-bottom:5px;min-width:0;overflow:hidden}.svg-spinner{animation:rotate 1s linear infinite}.svg-spinner .path{stroke:var(--fc-primary-color, #2563eb);stroke-linecap:round;stroke-dasharray:80 150;stroke-width:4}@keyframes rotate{to{transform:rotate(360deg)}}.no-padding-margin{margin:0!important;padding:0!important}.static-width-for-card{border:1px solid var(--border-color, #e2e8f0);border-radius:8px}.header-section{padding:8px 8px 0}.section-title{font-size:var(--fs-primary, 14px);font-weight:500}.body-section{padding:8px}.label-sub{white-space:normal;overflow-wrap:anywhere}.row.gutter-remove{--bs-gutter-x: 0rem !important;margin-top:0!important}.row{--bs-gutter-y: 0 !important}.inside-card.multy-card{margin-top:5px!important}.detail-value-wrapper{min-width:0;overflow:hidden;width:100%}.row>[class*=col]{min-width:0}.label-sub.truncate{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;overflow-wrap:unset!important;display:block;max-width:100%}\n"],
7872
+ dependencies: [
7873
+ {
7874
+ kind: "ngmodule",
7875
+ type: CommonModule
7876
+ },
7877
+ {
7878
+ kind: "directive",
7879
+ type: i1$4.NgClass,
7880
+ selector: "[ngClass]",
7881
+ inputs: ["class", "ngClass"]
7882
+ },
7883
+ {
7884
+ kind: "directive",
7885
+ type: i1$4.NgForOf,
7886
+ selector: "[ngFor][ngForOf]",
7887
+ inputs: [
7888
+ "ngForOf",
7889
+ "ngForTrackBy",
7890
+ "ngForTemplate"
7891
+ ]
7892
+ },
7893
+ {
7894
+ kind: "directive",
7895
+ type: i1$4.NgIf,
7896
+ selector: "[ngIf]",
7897
+ inputs: [
7898
+ "ngIf",
7899
+ "ngIfThen",
7900
+ "ngIfElse"
7901
+ ]
7902
+ },
7903
+ {
7904
+ kind: "directive",
7905
+ type: i1$4.NgStyle,
7906
+ selector: "[ngStyle]",
7907
+ inputs: ["ngStyle"]
7908
+ },
7909
+ {
7910
+ kind: "ngmodule",
7911
+ type: MatTooltipModule
7912
+ },
7913
+ {
7914
+ kind: "directive",
7915
+ type: i4$1.MatTooltip,
7916
+ selector: "[matTooltip]",
7917
+ inputs: [
7918
+ "matTooltipPosition",
7919
+ "matTooltipPositionAtOrigin",
7920
+ "matTooltipDisabled",
7921
+ "matTooltipShowDelay",
7922
+ "matTooltipHideDelay",
7923
+ "matTooltipTouchGestures",
7924
+ "matTooltip",
7925
+ "matTooltipClass"
7926
+ ],
7927
+ exportAs: ["matTooltip"]
7928
+ },
7929
+ {
7930
+ kind: "pipe",
7931
+ type: CustomTranslatePipe,
7932
+ name: "customTranslate"
7933
+ },
7934
+ {
7935
+ kind: "pipe",
7936
+ type: CustomDatePipe,
7937
+ name: "customDate"
7938
+ }
7939
+ ]
7940
+ });
7941
+ };
7942
+ i0.ɵɵngDeclareClassMetadata({
7943
+ minVersion: "12.0.0",
7944
+ version: "22.2.4",
7945
+ ngImport: i0,
7946
+ type: FusionCardComponent,
7947
+ decorators: [{
7948
+ type: Component,
7949
+ args: [{
7950
+ selector: "fusion-card",
7951
+ standalone: true,
7952
+ imports: [
7953
+ CommonModule,
7954
+ CustomTranslatePipe,
7955
+ MatTooltipModule,
7956
+ CustomDatePipe
7957
+ ],
7958
+ providers: [DatePipe],
7959
+ template: "<!-- 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",
7960
+ styles: [".dropdown-menu{left:unset!important;right:300%;top:12.5px;background-color:var(--comp-bg-color, #ffffff);border:1px solid var(--border-color, #e2e8f0);border-radius:var(--radius-small, 4px);box-shadow:0 4px 8px var(--box-shadow-color, rgba(0, 0, 0, .1))}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}.clickable-img{position:relative;cursor:pointer;padding:2px;border:1px solid var(--border-color, #e2e8f0);border-radius:5px}.clickable-img:hover{border:1px solid var(--fc-primary-color, rgb(31, 105, 255));border-radius:var(--radius-small, 5px)}.card-icon.color path{fill:var(--fc-primary-color, #2563eb)}.card-icon.color{margin-left:15px}.custom-modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:var(--box-shadow-color, rgba(0, 0, 0, .4));display:flex;align-items:start;justify-content:center;z-index:1050}.custom-modal{background:var(--comp-bg-color, #ffffff);border-radius:8px;width:550px;max-width:90%;margin-top:30px;box-shadow:0 5px 15px var(--box-shadow-color, rgba(0, 0, 0, .2));overflow:hidden}.custom-modal-header{border-bottom:solid .5px var(--border-color, #e2e8f0)}.custom-modal-footer{border-top:solid .5px var(--border-color, #e2e8f0)}.custom-modal-header,.custom-modal-footer{padding:.7rem;display:flex;justify-content:space-between;align-items:center}.custom-modal-body{padding:1rem;font-size:1rem}.close-button{background:none;border:none;font-size:1.25rem;cursor:pointer}.cancel-button,.confirm-button{padding:.5rem 1rem;border:none;border-radius:4px;cursor:pointer}.cancel-button{background:var(--comp-bg-color, #ffffff);color:var(--fc-text-color-dark, #000000)}.confirm-button{background:var(--clr-error, #d9534f);color:var(--comp-bg-color, #ffffff)}.text-center{text-align:center!important;border:solid .5px var(--border-color, #94a3b8);border-radius:var(--radius-medium, 10px);margin:10px 0;color:var(--fc-text-color-light, #94a3b8)}.receipt-view{width:100%;height:600px}.icon-container{position:relative;margin-top:100px;z-index:1}.card-detail{margin-top:5px;margin-bottom:5px;min-width:0;overflow:hidden}.svg-spinner{animation:rotate 1s linear infinite}.svg-spinner .path{stroke:var(--fc-primary-color, #2563eb);stroke-linecap:round;stroke-dasharray:80 150;stroke-width:4}@keyframes rotate{to{transform:rotate(360deg)}}.no-padding-margin{margin:0!important;padding:0!important}.static-width-for-card{border:1px solid var(--border-color, #e2e8f0);border-radius:8px}.header-section{padding:8px 8px 0}.section-title{font-size:var(--fs-primary, 14px);font-weight:500}.body-section{padding:8px}.label-sub{white-space:normal;overflow-wrap:anywhere}.row.gutter-remove{--bs-gutter-x: 0rem !important;margin-top:0!important}.row{--bs-gutter-y: 0 !important}.inside-card.multy-card{margin-top:5px!important}.detail-value-wrapper{min-width:0;overflow:hidden;width:100%}.row>[class*=col]{min-width:0}.label-sub.truncate{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;overflow-wrap:unset!important;display:block;max-width:100%}\n"]
7961
+ }]
7962
+ }],
7963
+ ctorParameters: () => [
7964
+ { type: i1.DomSanitizer },
7965
+ { type: i0.Renderer2 },
7966
+ { type: ApiService },
7967
+ { type: i1$4.DatePipe },
7968
+ { type: LoaderService },
7969
+ { type: i0.ChangeDetectorRef }
7970
+ ],
7971
+ propDecorators: {
7972
+ cardData: [{ type: Input }],
7973
+ from: [{ type: Input }],
7974
+ comp: [{ type: Input }],
7975
+ cardButtonEmit: [{ type: Output }],
7976
+ file: [{
7977
+ type: ViewChild,
7978
+ args: ["file"]
7979
+ }]
7980
+ }
7981
+ });
7982
+ const TOAST_GLOBAL_CONFIG = new InjectionToken("TOAST_GLOBAL_CONFIG");
7983
+ function provideToastConfig(config) {
7984
+ return [{
7985
+ provide: TOAST_GLOBAL_CONFIG,
7986
+ useValue: config
7987
+ }];
7988
+ }
7989
+ function generateToastId() {
7990
+ return Math.random().toString(36).slice(2, 9);
7991
+ }
7992
+ var ToastService = class ToastService {
7993
+ _toasts$ = new BehaviorSubject([]);
7994
+ toasts$ = this._toasts$.asObservable();
7995
+ global = {};
7996
+ removalTimers = /* @__PURE__ */ new Map();
7997
+ constructor(cfg) {
7998
+ this.global = cfg || {};
7999
+ }
8000
+ get toasts() {
8001
+ return this._toasts$.value;
8002
+ }
8003
+ emit(toasts) {
8004
+ this._toasts$.next([...toasts]);
8005
+ }
8006
+ scheduleRemoval(t) {
8007
+ if (!t.duration || t.duration <= 0) return;
8008
+ const handle = setTimeout(() => this.startLeavingAndRemove(t.id), t.duration);
8009
+ this.removalTimers.set(t.id, handle);
8010
+ }
8011
+ clearRemovalTimer(id) {
8012
+ const h = this.removalTimers.get(id);
8013
+ if (h) {
8014
+ clearTimeout(h);
8015
+ this.removalTimers.delete(id);
8016
+ }
8017
+ }
8018
+ show(cfg) {
8019
+ const toast = {
8020
+ id: generateToastId(),
8021
+ type: "info",
8022
+ duration: this.global.defaultDuration ?? 5e3,
8023
+ ...cfg
8024
+ };
8025
+ const list = [toast, ...this.toasts];
8026
+ if (this.global.maxToasts && list.length > this.global.maxToasts) list.splice(this.global.maxToasts);
8027
+ this.emit(list);
8028
+ this.scheduleRemoval(toast);
8029
+ return toast.id;
8030
+ }
8031
+ showSuccess(message, title, opts) {
8032
+ return this.show({
8033
+ message,
8034
+ title,
8035
+ type: "success",
8036
+ ...opts
8037
+ });
8038
+ }
8039
+ showError(message, title, opts) {
8040
+ return this.show({
8041
+ message,
8042
+ title,
8043
+ type: "error",
8044
+ ...opts
8045
+ });
8046
+ }
8047
+ showInfo(message, title, opts) {
8048
+ return this.show({
8049
+ message,
8050
+ title,
8051
+ type: "info",
8052
+ ...opts
8053
+ });
8054
+ }
8055
+ showWarning(message, title, opts) {
8056
+ return this.show({
8057
+ message,
8058
+ title,
8059
+ type: "warning",
8060
+ ...opts
8061
+ });
8062
+ }
8063
+ startLeavingAndRemove(id) {
8064
+ const list = this.toasts.map((t) => t.id === id ? {
8065
+ ...t,
8066
+ _leaving: true
8067
+ } : t);
8068
+ this.emit(list);
8069
+ setTimeout(() => this.remove(id), 220);
8070
+ this.clearRemovalTimer(id);
8071
+ }
8072
+ remove(id) {
8073
+ this.clearRemovalTimer(id);
8074
+ this.emit(this.toasts.filter((t) => t.id !== id));
8075
+ }
8076
+ clear() {
8077
+ this.removalTimers.forEach((h) => clearTimeout(h));
8078
+ this.removalTimers.clear();
8079
+ this.emit([]);
8080
+ }
8081
+ pause(id) {
8082
+ this.clearRemovalTimer(id);
8083
+ }
8084
+ resume(id, remaining) {
8085
+ const t = this.toasts.find((x) => x.id === id);
8086
+ if (t) {
8087
+ const dur = remaining ?? t.duration ?? this.global.defaultDuration ?? 5e3;
8088
+ this.scheduleRemoval({
8089
+ ...t,
8090
+ duration: dur
8091
+ });
8092
+ }
8093
+ }
8094
+ static ɵfac = i0.ɵɵngDeclareFactory({
8095
+ minVersion: "12.0.0",
8096
+ version: "22.2.4",
8097
+ ngImport: i0,
8098
+ type: ToastService,
8099
+ deps: [{
8100
+ token: TOAST_GLOBAL_CONFIG,
8101
+ optional: true
8102
+ }],
8103
+ target: i0.ɵɵFactoryTarget.Injectable
8104
+ });
8105
+ static ɵprov = i0.ɵɵngDeclareInjectable({
8106
+ minVersion: "12.0.0",
8107
+ version: "22.2.4",
8108
+ ngImport: i0,
8109
+ type: ToastService,
8110
+ providedIn: "root"
8111
+ });
8112
+ };
8113
+ i0.ɵɵngDeclareClassMetadata({
8114
+ minVersion: "12.0.0",
8115
+ version: "22.2.4",
8116
+ ngImport: i0,
8117
+ type: ToastService,
8118
+ decorators: [{
8119
+ type: Injectable,
8120
+ args: [{ providedIn: "root" }]
8121
+ }],
8122
+ ctorParameters: () => [{
8123
+ type: void 0,
8124
+ decorators: [{ type: Optional }, {
8125
+ type: Inject,
8126
+ args: [TOAST_GLOBAL_CONFIG]
8127
+ }]
8128
+ }]
8129
+ });
8130
+ var ToastComponent = class ToastComponent {
8131
+ toastService;
8132
+ el;
8133
+ cdr;
8134
+ globalCfg;
8135
+ toasts = [];
8136
+ sub = new Subscription();
8137
+ position;
8138
+ enableAnimation;
8139
+ pauseOnHover;
8140
+ defaultDuration = 5e3;
8141
+ positionClass = "top-right";
8142
+ constructor(toastService, el, cdr, globalCfg) {
8143
+ this.toastService = toastService;
8144
+ this.el = el;
8145
+ this.cdr = cdr;
8146
+ this.globalCfg = globalCfg;
8147
+ }
8148
+ ngOnInit() {
8149
+ const merged = {
8150
+ ...this.globalCfg || {},
8151
+ position: this.position ?? this.globalCfg?.position,
8152
+ enableAnimation: this.enableAnimation ?? this.globalCfg?.enableAnimation,
8153
+ pauseOnHover: this.pauseOnHover ?? this.globalCfg?.pauseOnHover,
8154
+ defaultDuration: this.defaultDuration ?? this.globalCfg?.defaultDuration
8155
+ };
8156
+ this.positionClass = merged.position ?? "top-right";
8157
+ this.defaultDuration = merged.defaultDuration ?? 5e3;
8158
+ this.sub.add(this.toastService.toasts$.subscribe((list) => {
8159
+ this.toasts = list;
8160
+ this.cdr.markForCheck();
8161
+ }));
8162
+ }
8163
+ ngOnDestroy() {
8164
+ this.sub.unsubscribe();
8165
+ }
8166
+ trackById(_, t) {
8167
+ return t.id;
8168
+ }
8169
+ dismiss(id) {
8170
+ if (id) this.toastService.startLeavingAndRemove(id);
8171
+ }
8172
+ onMouseEnter(t, e) {
8173
+ if (this.pauseOnHover ?? this.globalCfg?.pauseOnHover) {
8174
+ e.currentTarget.style.setProperty("--toast-playstate", "paused");
8175
+ this.toastService.pause(t.id);
8176
+ }
8177
+ }
8178
+ onMouseLeave(t, e) {
8179
+ if (this.pauseOnHover ?? this.globalCfg?.pauseOnHover) {
8180
+ e.currentTarget.style.setProperty("--toast-playstate", "running");
8181
+ this.toastService.resume(t.id, t.duration);
8182
+ }
8183
+ }
8184
+ progressState() {
8185
+ return "var(--toast-playstate, running)";
8186
+ }
8187
+ static ɵfac = i0.ɵɵngDeclareFactory({
8188
+ minVersion: "12.0.0",
8189
+ version: "22.2.4",
8190
+ ngImport: i0,
8191
+ type: ToastComponent,
8192
+ deps: [
8193
+ { token: ToastService },
8194
+ { token: i0.ElementRef },
8195
+ { token: i0.ChangeDetectorRef },
8196
+ {
8197
+ token: TOAST_GLOBAL_CONFIG,
8198
+ optional: true
8199
+ }
8200
+ ],
8201
+ target: i0.ɵɵFactoryTarget.Component
8202
+ });
8203
+ static ɵcmp = i0.ɵɵngDeclareComponent({
8204
+ minVersion: "17.0.0",
8205
+ version: "22.2.4",
8206
+ type: ToastComponent,
8207
+ isStandalone: true,
8208
+ selector: "app-toast, fusion-toast",
8209
+ inputs: {
8210
+ position: "position",
8211
+ enableAnimation: "enableAnimation",
8212
+ pauseOnHover: "pauseOnHover",
8213
+ defaultDuration: "defaultDuration"
8214
+ },
8215
+ ngImport: i0,
8216
+ template: "<!-- 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",
8217
+ styles: [":host{display:block}.toast-container{position:fixed;width:360px;display:flex;flex-direction:column;gap:12px;z-index:1100;pointer-events:none}.toast-container.top-right{inset:65px 16px auto auto}.toast-container.top-left{inset:16px auto auto 16px}.toast-container.bottom-right{inset:auto 16px 16px auto}.toast-container.bottom-left{inset:auto auto 16px 16px}.toast{pointer-events:auto;display:flex;flex-direction:column;gap:12px;padding:12px;border-radius:var(--radius-large, 12px);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;background:var(--comp-bg-color, #ffffff);color:var(--fc-text-color-dark, #0f172a);overflow:hidden;border:1px solid var(--border-color, #e2e8f0);position:relative;transform:translate(8px);opacity:0;animation:toast-in .22s cubic-bezier(.2,.9,.2,1) forwards}.toast.leaving{animation:toast-out .18s ease-in forwards}@keyframes toast-in{0%{opacity:0;transform:translateY(-8px) translate(8px)}to{opacity:1;transform:translateY(0) translate(0)}}@keyframes toast-out{0%{opacity:1;transform:translateY(0) translate(0)}to{opacity:0;transform:translateY(-6px) translate(6px)}}.toast[data-type=success]{border-left:6px solid var(--clr-success, #22c55e)}.toast[data-type=error]{border-left:6px solid var(--clr-error, #ef4444)}.toast[data-type=warning]{border-left:6px solid var(--clr-warning, #f59e0b)}.toast[data-type=info]{border-left:6px solid var(--clr-info, #3b82f6)}.toast-left{display:flex;align-items:center}.icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center}.icon svg{width:22px;height:22px}.default-svg{opacity:.95}.toast-body{flex:1;min-width:0;padding:0 8px}.title{font-weight:700;font-size:14px;margin-bottom:4px}.message{font-size:13px;color:inherit;opacity:.88;word-break:break-word}.close{background:none;border:0;font-size:18px;line-height:1;padding:4px 6px;cursor:pointer;color:inherit}.progress{position:absolute;left:0;right:0;bottom:0;height:4px;background:#0000000d}.progress .bar{height:100%;width:100%;background:var(--fc-primary-color, #3b82f6);transform-origin:left;animation-name:progress-shrink;animation-timing-function:linear;animation-duration:var(--toast-duration, 5s);animation-play-state:var(--toast-playstate, running)}@keyframes progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}@media(max-width:420px){.toast-container{width:calc(100% - 32px);left:16px;right:16px}}\n"],
8218
+ dependencies: [
8219
+ {
8220
+ kind: "ngmodule",
8221
+ type: CommonModule
8222
+ },
8223
+ {
8224
+ kind: "directive",
8225
+ type: i1$4.NgForOf,
8226
+ selector: "[ngFor][ngForOf]",
8227
+ inputs: [
8228
+ "ngForOf",
8229
+ "ngForTrackBy",
8230
+ "ngForTemplate"
8231
+ ]
8232
+ },
8233
+ {
8234
+ kind: "directive",
8235
+ type: i1$4.NgIf,
8236
+ selector: "[ngIf]",
8237
+ inputs: [
8238
+ "ngIf",
8239
+ "ngIfThen",
8240
+ "ngIfElse"
8241
+ ]
8242
+ }
8243
+ ],
8244
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
8245
+ });
8246
+ };
8247
+ i0.ɵɵngDeclareClassMetadata({
8248
+ minVersion: "12.0.0",
8249
+ version: "22.2.4",
8250
+ ngImport: i0,
8251
+ type: ToastComponent,
8252
+ decorators: [{
8253
+ type: Component,
8254
+ args: [{
8255
+ selector: "app-toast, fusion-toast",
8256
+ standalone: true,
8257
+ imports: [CommonModule],
8258
+ changeDetection: ChangeDetectionStrategy.OnPush,
8259
+ template: "<!-- 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",
8260
+ styles: [":host{display:block}.toast-container{position:fixed;width:360px;display:flex;flex-direction:column;gap:12px;z-index:1100;pointer-events:none}.toast-container.top-right{inset:65px 16px auto auto}.toast-container.top-left{inset:16px auto auto 16px}.toast-container.bottom-right{inset:auto 16px 16px auto}.toast-container.bottom-left{inset:auto auto 16px 16px}.toast{pointer-events:auto;display:flex;flex-direction:column;gap:12px;padding:12px;border-radius:var(--radius-large, 12px);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;background:var(--comp-bg-color, #ffffff);color:var(--fc-text-color-dark, #0f172a);overflow:hidden;border:1px solid var(--border-color, #e2e8f0);position:relative;transform:translate(8px);opacity:0;animation:toast-in .22s cubic-bezier(.2,.9,.2,1) forwards}.toast.leaving{animation:toast-out .18s ease-in forwards}@keyframes toast-in{0%{opacity:0;transform:translateY(-8px) translate(8px)}to{opacity:1;transform:translateY(0) translate(0)}}@keyframes toast-out{0%{opacity:1;transform:translateY(0) translate(0)}to{opacity:0;transform:translateY(-6px) translate(6px)}}.toast[data-type=success]{border-left:6px solid var(--clr-success, #22c55e)}.toast[data-type=error]{border-left:6px solid var(--clr-error, #ef4444)}.toast[data-type=warning]{border-left:6px solid var(--clr-warning, #f59e0b)}.toast[data-type=info]{border-left:6px solid var(--clr-info, #3b82f6)}.toast-left{display:flex;align-items:center}.icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center}.icon svg{width:22px;height:22px}.default-svg{opacity:.95}.toast-body{flex:1;min-width:0;padding:0 8px}.title{font-weight:700;font-size:14px;margin-bottom:4px}.message{font-size:13px;color:inherit;opacity:.88;word-break:break-word}.close{background:none;border:0;font-size:18px;line-height:1;padding:4px 6px;cursor:pointer;color:inherit}.progress{position:absolute;left:0;right:0;bottom:0;height:4px;background:#0000000d}.progress .bar{height:100%;width:100%;background:var(--fc-primary-color, #3b82f6);transform-origin:left;animation-name:progress-shrink;animation-timing-function:linear;animation-duration:var(--toast-duration, 5s);animation-play-state:var(--toast-playstate, running)}@keyframes progress-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}@media(max-width:420px){.toast-container{width:calc(100% - 32px);left:16px;right:16px}}\n"]
8261
+ }]
8262
+ }],
8263
+ ctorParameters: () => [
8264
+ { type: ToastService },
8265
+ { type: i0.ElementRef },
8266
+ { type: i0.ChangeDetectorRef },
8267
+ {
8268
+ type: void 0,
8269
+ decorators: [{ type: Optional }, {
8270
+ type: Inject,
8271
+ args: [TOAST_GLOBAL_CONFIG]
8272
+ }]
8273
+ }
8274
+ ],
8275
+ propDecorators: {
8276
+ position: [{ type: Input }],
8277
+ enableAnimation: [{ type: Input }],
8278
+ pauseOnHover: [{ type: Input }],
8279
+ defaultDuration: [{ type: Input }]
8280
+ }
8281
+ });
8282
+ var MultiSelectDropdownComponent = class MultiSelectDropdownComponent {
8283
+ cdr;
8284
+ label = "Select";
8285
+ list = [];
8286
+ isAll = false;
8287
+ shareCheckedList = new EventEmitter();
8288
+ control = new FormControl([]);
8289
+ filteredItemList = [];
8290
+ selectedItemList = [];
8291
+ value = "";
8292
+ destroy$ = new Subject();
8293
+ constructor(cdr) {
8294
+ this.cdr = cdr;
8295
+ }
8296
+ ngOnChanges(changes) {
8297
+ if (changes["list"]) {
8298
+ this.filteredItemList = [...this.list || []];
8299
+ this.cdr.markForCheck();
8300
+ }
8301
+ }
8302
+ ngOnInit() {
8303
+ this.control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((selected) => {
8304
+ this.selectedItemList = selected || [];
8305
+ this.emitSelectedIds();
8306
+ this.cdr.markForCheck();
8307
+ });
8308
+ }
8309
+ ngOnDestroy() {
8310
+ this.destroy$.next();
8311
+ this.destroy$.complete();
8312
+ }
8313
+ compareItems(o1, o2) {
8314
+ return o1 && o2 ? o1._id === o2._id : o1 === o2;
8315
+ }
8316
+ toggleSelectAll() {
8317
+ if (this.isAllSelected()) {
8318
+ this.control.setValue([], { emitEvent: false });
8319
+ this.selectedItemList = [];
8320
+ } else {
8321
+ this.control.setValue([...this.filteredItemList], { emitEvent: false });
8322
+ this.selectedItemList = [...this.filteredItemList];
8323
+ }
8324
+ this.emitSelectedIds();
8325
+ this.cdr.markForCheck();
8326
+ }
8327
+ isAllSelected() {
8328
+ return this.filteredItemList.length > 0 && this.filteredItemList.every((item) => this.control.value?.some((selected) => selected._id === item._id));
8329
+ }
8330
+ onFilterChange(event) {
8331
+ const lower = event?.toLowerCase() || "";
8332
+ this.filteredItemList = (this.list || []).filter((option) => option?._id?.toString().toLowerCase().includes(lower) || option?.label?.toLowerCase().includes(lower));
8333
+ this.cdr.markForCheck();
8334
+ }
8335
+ clearFilter() {
8336
+ this.value = "";
8337
+ this.filteredItemList = [...this.list || []];
8338
+ this.cdr.markForCheck();
8339
+ }
8340
+ removeChip(item) {
8341
+ const updated = this.control.value?.filter((i) => i._id !== item._id) || [];
8342
+ this.control.setValue(updated, { emitEvent: false });
8343
+ this.selectedItemList = updated;
8344
+ this.emitSelectedIds();
8345
+ this.cdr.markForCheck();
8346
+ }
8347
+ emitSelectedIds() {
8348
+ const ids = this.selectedItemList.map((i) => i._id);
8349
+ this.shareCheckedList.emit(ids);
8350
+ }
8351
+ static ɵfac = i0.ɵɵngDeclareFactory({
8352
+ minVersion: "12.0.0",
8353
+ version: "22.2.4",
8354
+ ngImport: i0,
8355
+ type: MultiSelectDropdownComponent,
8356
+ deps: [{ token: i0.ChangeDetectorRef }],
8357
+ target: i0.ɵɵFactoryTarget.Component
8358
+ });
8359
+ static ɵcmp = i0.ɵɵngDeclareComponent({
8360
+ minVersion: "17.0.0",
8361
+ version: "22.2.4",
8362
+ type: MultiSelectDropdownComponent,
8363
+ isStandalone: true,
8364
+ selector: "app-multi-select-dropdown, fusion-multi-select-dropdown",
8365
+ inputs: {
8366
+ label: "label",
8367
+ list: "list",
8368
+ isAll: "isAll"
8369
+ },
8370
+ outputs: { shareCheckedList: "shareCheckedList" },
8371
+ usesOnChanges: true,
8372
+ ngImport: i0,
8373
+ template: "<!-- 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",
8374
+ styles: ["::ng-deep mat-checkbox:hover{background-color:var(--mat-option-focus-state-layer-color, rgba(0, 0, 0, .04))}::ng-deep mat-option span{white-space:nowrap;text-overflow:ellipsis;max-width:100%;overflow:hidden}.selected-option{background-color:#0070d21f!important;color:var(--fc-primary-color, #0070d2)!important}\n"],
8375
+ dependencies: [
8376
+ {
8377
+ kind: "ngmodule",
8378
+ type: CommonModule
8379
+ },
8380
+ {
8381
+ kind: "ngmodule",
8382
+ type: FormsModule
8383
+ },
8384
+ {
8385
+ kind: "directive",
8386
+ type: i3$2.DefaultValueAccessor,
8387
+ selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
8388
+ },
8389
+ {
8390
+ kind: "directive",
8391
+ type: i3$2.NgControlStatus,
8392
+ selector: "[formControlName],[ngModel],[formControl]"
8393
+ },
8394
+ {
8395
+ kind: "directive",
8396
+ type: i3$2.NgModel,
8397
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
8398
+ inputs: [
8399
+ "name",
8400
+ "disabled",
8401
+ "ngModel",
8402
+ "ngModelOptions"
8403
+ ],
8404
+ outputs: ["ngModelChange"],
8405
+ exportAs: ["ngModel"]
8406
+ },
8407
+ {
8408
+ kind: "ngmodule",
8409
+ type: ReactiveFormsModule
8410
+ },
8411
+ {
8412
+ kind: "directive",
8413
+ type: i3$2.FormControlDirective,
8414
+ selector: "[formControl]",
8415
+ inputs: [
8416
+ "formControl",
8417
+ "disabled",
8418
+ "ngModel"
8419
+ ],
8420
+ outputs: ["ngModelChange"],
8421
+ exportAs: ["ngForm"]
8422
+ },
8423
+ {
8424
+ kind: "ngmodule",
8425
+ type: MatFormFieldModule
8426
+ },
8427
+ {
8428
+ kind: "component",
8429
+ type: i2.MatFormField,
8430
+ selector: "mat-form-field",
8431
+ inputs: [
8432
+ "hideRequiredMarker",
8433
+ "color",
8434
+ "floatLabel",
8435
+ "appearance",
8436
+ "subscriptSizing",
8437
+ "hintLabel"
8438
+ ],
8439
+ exportAs: ["matFormField"]
8440
+ },
8441
+ {
8442
+ kind: "directive",
8443
+ type: i2.MatLabel,
8444
+ selector: "mat-label"
8445
+ },
8446
+ {
8447
+ kind: "ngmodule",
8448
+ type: MatSelectModule
8449
+ },
8450
+ {
8451
+ kind: "component",
8452
+ type: i3.MatSelect,
8453
+ selector: "mat-select",
8454
+ inputs: [
8455
+ "aria-describedby",
8456
+ "panelClass",
8457
+ "disabled",
8458
+ "disableRipple",
8459
+ "tabIndex",
8460
+ "hideSingleSelectionIndicator",
8461
+ "placeholder",
8462
+ "required",
8463
+ "multiple",
8464
+ "disableOptionCentering",
8465
+ "compareWith",
8466
+ "value",
8467
+ "aria-label",
8468
+ "aria-labelledby",
8469
+ "errorStateMatcher",
8470
+ "typeaheadDebounceInterval",
8471
+ "sortComparator",
8472
+ "id",
8473
+ "panelWidth",
8474
+ "canSelectNullableOptions"
8475
+ ],
8476
+ outputs: [
8477
+ "openedChange",
8478
+ "opened",
8479
+ "closed",
8480
+ "selectionChange",
8481
+ "valueChange"
8482
+ ],
8483
+ exportAs: ["matSelect"]
8484
+ },
8485
+ {
8486
+ kind: "directive",
8487
+ type: i3.MatSelectTrigger,
8488
+ selector: "mat-select-trigger"
8489
+ },
8490
+ {
8491
+ kind: "component",
8492
+ type: i3.MatOption,
8493
+ selector: "mat-option",
8494
+ inputs: [
8495
+ "value",
8496
+ "id",
8497
+ "disabled"
8498
+ ],
8499
+ outputs: ["onSelectionChange"],
8500
+ exportAs: ["matOption"]
8501
+ },
8502
+ {
8503
+ kind: "ngmodule",
8504
+ type: MatInputModule
8505
+ },
8506
+ {
8507
+ kind: "directive",
8508
+ type: i4.MatInput,
8509
+ selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",
8510
+ inputs: [
8511
+ "disabled",
8512
+ "id",
8513
+ "placeholder",
8514
+ "name",
8515
+ "required",
8516
+ "type",
8517
+ "errorStateMatcher",
8518
+ "aria-describedby",
8519
+ "value",
8520
+ "readonly",
8521
+ "disabledInteractive"
8522
+ ],
8523
+ exportAs: ["matInput"]
8524
+ },
8525
+ {
8526
+ kind: "ngmodule",
8527
+ type: MatButtonModule
8528
+ },
8529
+ {
8530
+ kind: "component",
8531
+ type: i5.MatIconButton,
8532
+ selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]",
8533
+ exportAs: ["matButton", "matAnchor"]
8534
+ },
8535
+ {
8536
+ kind: "ngmodule",
8537
+ type: MatIconModule
8538
+ },
8539
+ {
8540
+ kind: "component",
8541
+ type: i6.MatIcon,
8542
+ selector: "mat-icon",
8543
+ inputs: [
8544
+ "color",
8545
+ "inline",
8546
+ "svgIcon",
8547
+ "fontSet",
8548
+ "fontIcon"
8549
+ ],
8550
+ exportAs: ["matIcon"]
8551
+ },
8552
+ {
8553
+ kind: "ngmodule",
8554
+ type: MatCheckboxModule
8555
+ },
8556
+ {
8557
+ kind: "component",
8558
+ type: i3$1.MatCheckbox,
8559
+ selector: "mat-checkbox",
8560
+ inputs: [
8561
+ "aria-label",
8562
+ "aria-labelledby",
8563
+ "aria-describedby",
8564
+ "aria-expanded",
8565
+ "aria-controls",
8566
+ "aria-owns",
8567
+ "id",
8568
+ "required",
8569
+ "labelPosition",
8570
+ "name",
8571
+ "value",
8572
+ "disableRipple",
8573
+ "tabIndex",
8574
+ "color",
8575
+ "disabledInteractive",
8576
+ "checked",
8577
+ "disabled",
8578
+ "indeterminate"
8579
+ ],
8580
+ outputs: ["change", "indeterminateChange"],
8581
+ exportAs: ["matCheckbox"]
8582
+ },
8583
+ {
8584
+ kind: "ngmodule",
8585
+ type: MatRippleModule
8586
+ },
8587
+ {
8588
+ kind: "directive",
8589
+ type: i8.MatRipple,
8590
+ selector: "[mat-ripple], [matRipple]",
8591
+ inputs: [
8592
+ "matRippleColor",
8593
+ "matRippleUnbounded",
8594
+ "matRippleCentered",
8595
+ "matRippleRadius",
8596
+ "matRippleAnimation",
8597
+ "matRippleDisabled",
8598
+ "matRippleTrigger"
8599
+ ],
8600
+ exportAs: ["matRipple"]
8601
+ },
8602
+ {
8603
+ kind: "ngmodule",
8604
+ type: MatChipsModule
8605
+ },
8606
+ {
8607
+ kind: "component",
8608
+ type: i9.MatChip,
8609
+ selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]",
8610
+ inputs: [
8611
+ "role",
8612
+ "id",
8613
+ "aria-label",
8614
+ "aria-description",
8615
+ "value",
8616
+ "color",
8617
+ "removable",
8618
+ "highlighted",
8619
+ "disableRipple",
8620
+ "disabled"
8621
+ ],
8622
+ outputs: ["removed", "destroyed"],
8623
+ exportAs: ["matChip"]
8624
+ },
8625
+ {
8626
+ kind: "directive",
8627
+ type: i9.MatChipRemove,
8628
+ selector: "[matChipRemove]"
8629
+ }
8630
+ ],
8631
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
8632
+ });
8633
+ };
8634
+ i0.ɵɵngDeclareClassMetadata({
8635
+ minVersion: "12.0.0",
8636
+ version: "22.2.4",
8637
+ ngImport: i0,
8638
+ type: MultiSelectDropdownComponent,
8639
+ decorators: [{
8640
+ type: Component,
8641
+ args: [{
8642
+ selector: "app-multi-select-dropdown, fusion-multi-select-dropdown",
8643
+ standalone: true,
8644
+ imports: [
8645
+ CommonModule,
8646
+ FormsModule,
8647
+ ReactiveFormsModule,
8648
+ MatFormFieldModule,
8649
+ MatSelectModule,
8650
+ MatInputModule,
8651
+ MatButtonModule,
8652
+ MatIconModule,
8653
+ MatCheckboxModule,
8654
+ MatRippleModule,
8655
+ MatChipsModule
8656
+ ],
8657
+ changeDetection: ChangeDetectionStrategy.OnPush,
8658
+ template: "<!-- 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",
8659
+ styles: ["::ng-deep mat-checkbox:hover{background-color:var(--mat-option-focus-state-layer-color, rgba(0, 0, 0, .04))}::ng-deep mat-option span{white-space:nowrap;text-overflow:ellipsis;max-width:100%;overflow:hidden}.selected-option{background-color:#0070d21f!important;color:var(--fc-primary-color, #0070d2)!important}\n"]
8660
+ }]
8661
+ }],
8662
+ ctorParameters: () => [{ type: i0.ChangeDetectorRef }],
8663
+ propDecorators: {
8664
+ label: [{ type: Input }],
8665
+ list: [{ type: Input }],
8666
+ isAll: [{ type: Input }],
8667
+ shareCheckedList: [{ type: Output }]
8668
+ }
8669
+ });
8670
+ var AlertMessageComponent = class AlertMessageComponent {
8671
+ cdr;
8672
+ alertService;
8673
+ type = "info";
8674
+ message = "";
8675
+ dismissible = true;
8676
+ autoSubscribeAlertService = false;
8677
+ dismiss = new EventEmitter();
8678
+ visible = true;
8679
+ sub;
8680
+ constructor(cdr, alertService) {
8681
+ this.cdr = cdr;
8682
+ this.alertService = alertService;
8683
+ }
8684
+ ngOnInit() {
8685
+ if (this.autoSubscribeAlertService && this.alertService) this.sub = this.alertService.passAlertType$.subscribe((data) => {
8686
+ if (data) {
8687
+ this.type = data.type === "failure" || data.type === "error" ? "error" : data.type || "info";
8688
+ this.message = data.message || "";
8689
+ this.visible = true;
8690
+ this.cdr.markForCheck();
8691
+ }
8692
+ });
8693
+ }
8694
+ ngOnDestroy() {
8695
+ this.sub?.unsubscribe();
8696
+ }
8697
+ onDismiss() {
8698
+ this.visible = false;
8699
+ this.dismiss.emit();
8700
+ this.cdr.markForCheck();
8701
+ }
8702
+ get normalizedType() {
8703
+ if (this.type === "failure" || this.type === "error") return "failure";
8704
+ return this.type || "info";
8705
+ }
8706
+ static ɵfac = i0.ɵɵngDeclareFactory({
8707
+ minVersion: "12.0.0",
8708
+ version: "22.2.4",
8709
+ ngImport: i0,
8710
+ type: AlertMessageComponent,
8711
+ deps: [{ token: i0.ChangeDetectorRef }, {
8712
+ token: AlertService,
8713
+ optional: true
8714
+ }],
8715
+ target: i0.ɵɵFactoryTarget.Component
8716
+ });
8717
+ static ɵcmp = i0.ɵɵngDeclareComponent({
8718
+ minVersion: "17.0.0",
8719
+ version: "22.2.4",
8720
+ type: AlertMessageComponent,
8721
+ isStandalone: true,
8722
+ selector: "fusion-alert, app-success-failure-message",
8723
+ inputs: {
8724
+ type: "type",
8725
+ message: "message",
8726
+ dismissible: "dismissible",
8727
+ autoSubscribeAlertService: "autoSubscribeAlertService"
8728
+ },
8729
+ outputs: { dismiss: "dismiss" },
8730
+ ngImport: i0,
8731
+ template: "<!-- 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",
8732
+ styles: [":host{display:block}.form-submission-message{margin:8px 0;padding:10px 14px;border-radius:var(--radius-medium, 8px);position:relative;border:1px solid transparent}.form-submission-message.success{background-color:var(--fb-action-surface, #e0f2fe);color:var(--fb-action, #003566);border-color:#bae6fd}.form-submission-message.failure{background-color:#fee2e2;color:#991b1b;border-color:#fecaca}.form-submission-message.warning{background-color:#fef3c7;color:#92400e;border-color:#fde68a}.form-submission-message.info{background-color:#f1f5f9;color:#1e293b;border-color:#e2e8f0}.info{display:flex;align-items:center;gap:10px;width:100%}.alert-icon{display:flex;align-items:center;flex-shrink:0}.icon-svg{width:20px;height:20px}.alert-content{flex:1;font-size:13px;font-weight:500;line-height:1.4}.close-btn{background:transparent;border:none;cursor:pointer;padding:4px;display:flex;align-items:center;color:inherit;opacity:.7}.close-btn:hover{opacity:1}.cross-icon{width:16px;height:16px}\n"],
8733
+ dependencies: [
8734
+ {
8735
+ kind: "ngmodule",
8736
+ type: CommonModule
8737
+ },
8738
+ {
8739
+ kind: "directive",
8740
+ type: i1$4.NgClass,
8741
+ selector: "[ngClass]",
8742
+ inputs: ["class", "ngClass"]
8743
+ },
8744
+ {
8745
+ kind: "directive",
8746
+ type: i1$4.NgIf,
8747
+ selector: "[ngIf]",
8748
+ inputs: [
8749
+ "ngIf",
8750
+ "ngIfThen",
8751
+ "ngIfElse"
8752
+ ]
8753
+ }
8754
+ ],
8755
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
8756
+ });
8757
+ };
8758
+ i0.ɵɵngDeclareClassMetadata({
8759
+ minVersion: "12.0.0",
8760
+ version: "22.2.4",
8761
+ ngImport: i0,
8762
+ type: AlertMessageComponent,
8763
+ decorators: [{
8764
+ type: Component,
8765
+ args: [{
8766
+ selector: "fusion-alert, app-success-failure-message",
8767
+ standalone: true,
8768
+ imports: [CommonModule],
8769
+ changeDetection: ChangeDetectionStrategy.OnPush,
8770
+ template: "<!-- 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",
8771
+ styles: [":host{display:block}.form-submission-message{margin:8px 0;padding:10px 14px;border-radius:var(--radius-medium, 8px);position:relative;border:1px solid transparent}.form-submission-message.success{background-color:var(--fb-action-surface, #e0f2fe);color:var(--fb-action, #003566);border-color:#bae6fd}.form-submission-message.failure{background-color:#fee2e2;color:#991b1b;border-color:#fecaca}.form-submission-message.warning{background-color:#fef3c7;color:#92400e;border-color:#fde68a}.form-submission-message.info{background-color:#f1f5f9;color:#1e293b;border-color:#e2e8f0}.info{display:flex;align-items:center;gap:10px;width:100%}.alert-icon{display:flex;align-items:center;flex-shrink:0}.icon-svg{width:20px;height:20px}.alert-content{flex:1;font-size:13px;font-weight:500;line-height:1.4}.close-btn{background:transparent;border:none;cursor:pointer;padding:4px;display:flex;align-items:center;color:inherit;opacity:.7}.close-btn:hover{opacity:1}.cross-icon{width:16px;height:16px}\n"]
8772
+ }]
8773
+ }],
8774
+ ctorParameters: () => [{ type: i0.ChangeDetectorRef }, {
8775
+ type: AlertService,
8776
+ decorators: [{ type: Optional }]
8777
+ }],
8778
+ propDecorators: {
8779
+ type: [{ type: Input }],
8780
+ message: [{ type: Input }],
8781
+ dismissible: [{ type: Input }],
8782
+ autoSubscribeAlertService: [{ type: Input }],
8783
+ dismiss: [{ type: Output }]
8784
+ }
8785
+ });
7366
8786
  var PdfFontService = class PdfFontService {
7367
8787
  fontLoadedPromise = null;
7368
8788
  configurePdfMake(pdfMakeInstance) {
@@ -7469,6 +8889,6 @@ i0.ɵɵngDeclareClassMetadata({
7469
8889
  }]
7470
8890
  }]
7471
8891
  });
7472
- export { AlertService, AmountToWordsPipe, ApiService, ApprovalScreenComponent, CommonScreenComponent, ConfigService, Constants, CustomDatePipe, CustomPaginatorIntl, CustomTimePipe, CustomTranslatePipe, DataTableComponent, DropDownComponent, EditColumnCheckPipe, EditColumnDropdownPipe, EditColumnTypePipe, ErrorHandlerService, FileUploadComponent, FormsComponent, FusionButtonComponent, GetValuePipe, GlobalValuesService, LoaderService, ModalComponent, MultiCheckboxComponent, MultipleFilterComponent, PaginationComponent, PdfFontService, PopoverComponent, ScrollService, SearchFilterComponent, SearchFilterPipe, SideScreenComponent, TabDataService, TotalColumSumPipe };
8892
+ export { AlertMessageComponent, AlertService, AmountToWordsPipe, ApiService, ApprovalScreenComponent, CommonScreenComponent, ConfigService, Constants, CustomDatePipe, CustomPaginatorIntl, CustomTimePipe, CustomTranslatePipe, DataTableComponent, DropDownComponent, EditColumnCheckPipe, EditColumnDropdownPipe, EditColumnTypePipe, ErrorHandlerService, FileUploadComponent, FormsComponent, FusionButtonComponent, FusionCardComponent, GetValuePipe, GlobalValuesService, LoaderService, ModalComponent, MultiCheckboxComponent, MultiSelectDropdownComponent, MultipleFilterComponent, PaginationComponent, PdfFontService, PopoverComponent, ScrollService, SearchFilterComponent, SearchFilterPipe, SideScreenComponent, TOAST_GLOBAL_CONFIG, TabDataService, ToastComponent, ToastService, TotalColumSumPipe, provideToastConfig };
7473
8893
 
7474
8894
  //# sourceMappingURL=rangertechnologies-fusion-ui.mjs.map