@rangertechnologies/fusion-ui 0.1.5 → 0.1.7

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
  },
@@ -396,7 +412,7 @@ var ConfigService = class ConfigService {
396
412
  version: "22.2.4",
397
413
  ngImport: i0,
398
414
  type: ConfigService,
399
- deps: [{ token: i1$2.HttpClient }],
415
+ deps: [{ token: i1$3.HttpClient }],
400
416
  target: i0.ɵɵFactoryTarget.Injectable
401
417
  });
402
418
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -416,7 +432,7 @@ i0.ɵɵngDeclareClassMetadata({
416
432
  type: Injectable,
417
433
  args: [{ providedIn: "root" }]
418
434
  }],
419
- ctorParameters: () => [{ type: i1$2.HttpClient }]
435
+ ctorParameters: () => [{ type: i1$3.HttpClient }]
420
436
  });
421
437
  var ApiService = class ApiService {
422
438
  http;
@@ -505,7 +521,7 @@ var ApiService = class ApiService {
505
521
  version: "22.2.4",
506
522
  ngImport: i0,
507
523
  type: ApiService,
508
- deps: [{ token: i1$2.HttpClient }, { token: ConfigService }],
524
+ deps: [{ token: i1$3.HttpClient }, { token: ConfigService }],
509
525
  target: i0.ɵɵFactoryTarget.Injectable
510
526
  });
511
527
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -525,7 +541,7 @@ i0.ɵɵngDeclareClassMetadata({
525
541
  type: Injectable,
526
542
  args: [{ providedIn: "root" }]
527
543
  }],
528
- ctorParameters: () => [{ type: i1$2.HttpClient }, { type: ConfigService }]
544
+ ctorParameters: () => [{ type: i1$3.HttpClient }, { type: ConfigService }]
529
545
  });
530
546
  var GlobalValuesService = class GlobalValuesService {
531
547
  apiService;
@@ -834,7 +850,7 @@ var SearchFilterComponent = class SearchFilterComponent {
834
850
  },
835
851
  {
836
852
  kind: "directive",
837
- type: i1$3.NgForOf,
853
+ type: i1$4.NgForOf,
838
854
  selector: "[ngFor][ngForOf]",
839
855
  inputs: [
840
856
  "ngForOf",
@@ -844,7 +860,7 @@ var SearchFilterComponent = class SearchFilterComponent {
844
860
  },
845
861
  {
846
862
  kind: "directive",
847
- type: i1$3.NgIf,
863
+ type: i1$4.NgIf,
848
864
  selector: "[ngIf]",
849
865
  inputs: [
850
866
  "ngIf",
@@ -858,12 +874,12 @@ var SearchFilterComponent = class SearchFilterComponent {
858
874
  },
859
875
  {
860
876
  kind: "directive",
861
- type: i3$1.DefaultValueAccessor,
877
+ type: i3$2.DefaultValueAccessor,
862
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]"
863
879
  },
864
880
  {
865
881
  kind: "directive",
866
- type: i3$1.NgControlStatus,
882
+ type: i3$2.NgControlStatus,
867
883
  selector: "[formControlName],[ngModel],[formControl]"
868
884
  },
869
885
  {
@@ -872,7 +888,7 @@ var SearchFilterComponent = class SearchFilterComponent {
872
888
  },
873
889
  {
874
890
  kind: "directive",
875
- type: i3$1.NgModel,
891
+ type: i3$2.NgModel,
876
892
  selector: "[ngModel]:not([formControlName]):not([formControl])",
877
893
  inputs: [
878
894
  "name",
@@ -1068,7 +1084,7 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1068
1084
  },
1069
1085
  {
1070
1086
  kind: "directive",
1071
- type: i1$3.NgForOf,
1087
+ type: i1$4.NgForOf,
1072
1088
  selector: "[ngFor][ngForOf]",
1073
1089
  inputs: [
1074
1090
  "ngForOf",
@@ -1078,7 +1094,7 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1078
1094
  },
1079
1095
  {
1080
1096
  kind: "directive",
1081
- type: i1$3.NgIf,
1097
+ type: i1$4.NgIf,
1082
1098
  selector: "[ngIf]",
1083
1099
  inputs: [
1084
1100
  "ngIf",
@@ -1092,7 +1108,7 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1092
1108
  },
1093
1109
  {
1094
1110
  kind: "component",
1095
- type: i3.MatCheckbox,
1111
+ type: i3$1.MatCheckbox,
1096
1112
  selector: "mat-checkbox",
1097
1113
  inputs: [
1098
1114
  "aria-label",
@@ -1153,17 +1169,17 @@ var MultiCheckboxComponent = class MultiCheckboxComponent {
1153
1169
  },
1154
1170
  {
1155
1171
  kind: "directive",
1156
- type: i3$1.DefaultValueAccessor,
1172
+ type: i3$2.DefaultValueAccessor,
1157
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]"
1158
1174
  },
1159
1175
  {
1160
1176
  kind: "directive",
1161
- type: i3$1.NgControlStatus,
1177
+ type: i3$2.NgControlStatus,
1162
1178
  selector: "[formControlName],[ngModel],[formControl]"
1163
1179
  },
1164
1180
  {
1165
1181
  kind: "directive",
1166
- type: i3$1.NgModel,
1182
+ type: i3$2.NgModel,
1167
1183
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1168
1184
  inputs: [
1169
1185
  "name",
@@ -1407,7 +1423,7 @@ var DropDownComponent = class DropDownComponent {
1407
1423
  },
1408
1424
  {
1409
1425
  kind: "directive",
1410
- type: i1$3.NgForOf,
1426
+ type: i1$4.NgForOf,
1411
1427
  selector: "[ngFor][ngForOf]",
1412
1428
  inputs: [
1413
1429
  "ngForOf",
@@ -1417,7 +1433,7 @@ var DropDownComponent = class DropDownComponent {
1417
1433
  },
1418
1434
  {
1419
1435
  kind: "directive",
1420
- type: i1$3.NgIf,
1436
+ type: i1$4.NgIf,
1421
1437
  selector: "[ngIf]",
1422
1438
  inputs: [
1423
1439
  "ngIf",
@@ -1435,17 +1451,17 @@ var DropDownComponent = class DropDownComponent {
1435
1451
  },
1436
1452
  {
1437
1453
  kind: "directive",
1438
- type: i3$1.DefaultValueAccessor,
1454
+ type: i3$2.DefaultValueAccessor,
1439
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]"
1440
1456
  },
1441
1457
  {
1442
1458
  kind: "directive",
1443
- type: i3$1.NgControlStatus,
1459
+ type: i3$2.NgControlStatus,
1444
1460
  selector: "[formControlName],[ngModel],[formControl]"
1445
1461
  },
1446
1462
  {
1447
1463
  kind: "directive",
1448
- type: i3$1.NgModel,
1464
+ type: i3$2.NgModel,
1449
1465
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1450
1466
  inputs: [
1451
1467
  "name",
@@ -1628,7 +1644,7 @@ var MultipleFilterComponent = class MultipleFilterComponent {
1628
1644
  },
1629
1645
  {
1630
1646
  kind: "directive",
1631
- type: i1$3.NgForOf,
1647
+ type: i1$4.NgForOf,
1632
1648
  selector: "[ngFor][ngForOf]",
1633
1649
  inputs: [
1634
1650
  "ngForOf",
@@ -1638,7 +1654,7 @@ var MultipleFilterComponent = class MultipleFilterComponent {
1638
1654
  },
1639
1655
  {
1640
1656
  kind: "directive",
1641
- type: i1$3.NgIf,
1657
+ type: i1$4.NgIf,
1642
1658
  selector: "[ngIf]",
1643
1659
  inputs: [
1644
1660
  "ngIf",
@@ -1686,17 +1702,17 @@ var MultipleFilterComponent = class MultipleFilterComponent {
1686
1702
  },
1687
1703
  {
1688
1704
  kind: "directive",
1689
- type: i3$1.DefaultValueAccessor,
1705
+ type: i3$2.DefaultValueAccessor,
1690
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]"
1691
1707
  },
1692
1708
  {
1693
1709
  kind: "directive",
1694
- type: i3$1.NgControlStatus,
1710
+ type: i3$2.NgControlStatus,
1695
1711
  selector: "[formControlName],[ngModel],[formControl]"
1696
1712
  },
1697
1713
  {
1698
1714
  kind: "directive",
1699
- type: i3$1.NgModel,
1715
+ type: i3$2.NgModel,
1700
1716
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1701
1717
  inputs: [
1702
1718
  "name",
@@ -1893,7 +1909,7 @@ var PaginationComponent = class PaginationComponent {
1893
1909
  },
1894
1910
  {
1895
1911
  kind: "directive",
1896
- type: i1$3.NgForOf,
1912
+ type: i1$4.NgForOf,
1897
1913
  selector: "[ngFor][ngForOf]",
1898
1914
  inputs: [
1899
1915
  "ngForOf",
@@ -1903,7 +1919,7 @@ var PaginationComponent = class PaginationComponent {
1903
1919
  },
1904
1920
  {
1905
1921
  kind: "directive",
1906
- type: i1$3.NgIf,
1922
+ type: i1$4.NgIf,
1907
1923
  selector: "[ngIf]",
1908
1924
  inputs: [
1909
1925
  "ngIf",
@@ -1917,30 +1933,30 @@ var PaginationComponent = class PaginationComponent {
1917
1933
  },
1918
1934
  {
1919
1935
  kind: "directive",
1920
- type: i3$1.NgSelectOption,
1936
+ type: i3$2.NgSelectOption,
1921
1937
  selector: "option",
1922
1938
  inputs: ["ngValue", "value"]
1923
1939
  },
1924
1940
  {
1925
1941
  kind: "directive",
1926
- type: i3$1.ɵNgSelectMultipleOption,
1942
+ type: i3$2.ɵNgSelectMultipleOption,
1927
1943
  selector: "option",
1928
1944
  inputs: ["ngValue", "value"]
1929
1945
  },
1930
1946
  {
1931
1947
  kind: "directive",
1932
- type: i3$1.SelectControlValueAccessor,
1948
+ type: i3$2.SelectControlValueAccessor,
1933
1949
  selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]",
1934
1950
  inputs: ["compareWith"]
1935
1951
  },
1936
1952
  {
1937
1953
  kind: "directive",
1938
- type: i3$1.NgControlStatus,
1954
+ type: i3$2.NgControlStatus,
1939
1955
  selector: "[formControlName],[ngModel],[formControl]"
1940
1956
  },
1941
1957
  {
1942
1958
  kind: "directive",
1943
- type: i3$1.NgModel,
1959
+ type: i3$2.NgModel,
1944
1960
  selector: "[ngModel]:not([formControlName]):not([formControl])",
1945
1961
  inputs: [
1946
1962
  "name",
@@ -2049,7 +2065,7 @@ var PopoverComponent = class PopoverComponent {
2049
2065
  version: "22.2.4",
2050
2066
  ngImport: i0,
2051
2067
  type: PopoverComponent,
2052
- deps: [{ token: i1$1.Overlay }, { token: i0.ChangeDetectorRef }],
2068
+ deps: [{ token: i1$2.Overlay }, { token: i0.ChangeDetectorRef }],
2053
2069
  target: i0.ɵɵFactoryTarget.Component
2054
2070
  });
2055
2071
  static ɵcmp = i0.ɵɵngDeclareComponent({
@@ -2073,7 +2089,7 @@ var PopoverComponent = class PopoverComponent {
2073
2089
  },
2074
2090
  {
2075
2091
  kind: "directive",
2076
- type: i1$3.NgIf,
2092
+ type: i1$4.NgIf,
2077
2093
  selector: "[ngIf]",
2078
2094
  inputs: [
2079
2095
  "ngIf",
@@ -2083,7 +2099,7 @@ var PopoverComponent = class PopoverComponent {
2083
2099
  },
2084
2100
  {
2085
2101
  kind: "directive",
2086
- type: i1$3.NgTemplateOutlet,
2102
+ type: i1$4.NgTemplateOutlet,
2087
2103
  selector: "[ngTemplateOutlet]",
2088
2104
  inputs: [
2089
2105
  "ngTemplateOutletContext",
@@ -2101,7 +2117,7 @@ var PopoverComponent = class PopoverComponent {
2101
2117
  },
2102
2118
  {
2103
2119
  kind: "directive",
2104
- type: i1$1.CdkConnectedOverlay,
2120
+ type: i1$2.CdkConnectedOverlay,
2105
2121
  selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]",
2106
2122
  inputs: [
2107
2123
  "cdkConnectedOverlayOrigin",
@@ -2142,7 +2158,7 @@ var PopoverComponent = class PopoverComponent {
2142
2158
  },
2143
2159
  {
2144
2160
  kind: "directive",
2145
- type: i1$1.CdkOverlayOrigin,
2161
+ type: i1$2.CdkOverlayOrigin,
2146
2162
  selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]",
2147
2163
  exportAs: ["cdkOverlayOrigin"]
2148
2164
  }
@@ -2170,7 +2186,7 @@ i0.ɵɵngDeclareClassMetadata({
2170
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"]
2171
2187
  }]
2172
2188
  }],
2173
- ctorParameters: () => [{ type: i1$1.Overlay }, { type: i0.ChangeDetectorRef }],
2189
+ ctorParameters: () => [{ type: i1$2.Overlay }, { type: i0.ChangeDetectorRef }],
2174
2190
  propDecorators: {
2175
2191
  isBootstrap: [{ type: Input }],
2176
2192
  dynamicPopover: [{ type: Input }],
@@ -2257,13 +2273,13 @@ var ModalComponent = class ModalComponent {
2257
2273
  },
2258
2274
  {
2259
2275
  kind: "directive",
2260
- type: i1$3.NgClass,
2276
+ type: i1$4.NgClass,
2261
2277
  selector: "[ngClass]",
2262
2278
  inputs: ["class", "ngClass"]
2263
2279
  },
2264
2280
  {
2265
2281
  kind: "directive",
2266
- type: i1$3.NgIf,
2282
+ type: i1$4.NgIf,
2267
2283
  selector: "[ngIf]",
2268
2284
  inputs: [
2269
2285
  "ngIf",
@@ -2442,7 +2458,7 @@ var FileUploadComponent = class FileUploadComponent {
2442
2458
  },
2443
2459
  {
2444
2460
  kind: "directive",
2445
- type: i1$3.NgForOf,
2461
+ type: i1$4.NgForOf,
2446
2462
  selector: "[ngFor][ngForOf]",
2447
2463
  inputs: [
2448
2464
  "ngForOf",
@@ -2452,7 +2468,7 @@ var FileUploadComponent = class FileUploadComponent {
2452
2468
  },
2453
2469
  {
2454
2470
  kind: "directive",
2455
- type: i1$3.NgIf,
2471
+ type: i1$4.NgIf,
2456
2472
  selector: "[ngIf]",
2457
2473
  inputs: [
2458
2474
  "ngIf",
@@ -3268,7 +3284,7 @@ var SideScreenComponent = class SideScreenComponent {
3268
3284
  version: "22.2.4",
3269
3285
  ngImport: i0,
3270
3286
  type: SideScreenComponent,
3271
- deps: [{ token: i3$1.FormBuilder }],
3287
+ deps: [{ token: i3$2.FormBuilder }],
3272
3288
  target: i0.ɵɵFactoryTarget.Component
3273
3289
  });
3274
3290
  static ɵcmp = i0.ɵɵngDeclareComponent({
@@ -3332,13 +3348,13 @@ var SideScreenComponent = class SideScreenComponent {
3332
3348
  },
3333
3349
  {
3334
3350
  kind: "directive",
3335
- type: i1$3.NgClass,
3351
+ type: i1$4.NgClass,
3336
3352
  selector: "[ngClass]",
3337
3353
  inputs: ["class", "ngClass"]
3338
3354
  },
3339
3355
  {
3340
3356
  kind: "directive",
3341
- type: i1$3.NgIf,
3357
+ type: i1$4.NgIf,
3342
3358
  selector: "[ngIf]",
3343
3359
  inputs: [
3344
3360
  "ngIf",
@@ -3352,22 +3368,22 @@ var SideScreenComponent = class SideScreenComponent {
3352
3368
  },
3353
3369
  {
3354
3370
  kind: "directive",
3355
- type: i3$1.ɵNgNoValidate,
3371
+ type: i3$2.ɵNgNoValidate,
3356
3372
  selector: "form:not([ngNoForm]):not([ngNativeValidate])"
3357
3373
  },
3358
3374
  {
3359
3375
  kind: "directive",
3360
- type: i3$1.DefaultValueAccessor,
3376
+ type: i3$2.DefaultValueAccessor,
3361
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]"
3362
3378
  },
3363
3379
  {
3364
3380
  kind: "directive",
3365
- type: i3$1.NumberValueAccessor,
3381
+ type: i3$2.NumberValueAccessor,
3366
3382
  selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]"
3367
3383
  },
3368
3384
  {
3369
3385
  kind: "directive",
3370
- type: i3$1.RadioControlValueAccessor,
3386
+ type: i3$2.RadioControlValueAccessor,
3371
3387
  selector: "input[type=radio]:not([ngNoCva])[formControlName],input[type=radio]:not([ngNoCva])[formControl],input[type=radio]:not([ngNoCva])[ngModel]",
3372
3388
  inputs: [
3373
3389
  "name",
@@ -3377,17 +3393,17 @@ var SideScreenComponent = class SideScreenComponent {
3377
3393
  },
3378
3394
  {
3379
3395
  kind: "directive",
3380
- type: i3$1.NgControlStatus,
3396
+ type: i3$2.NgControlStatus,
3381
3397
  selector: "[formControlName],[ngModel],[formControl]"
3382
3398
  },
3383
3399
  {
3384
3400
  kind: "directive",
3385
- type: i3$1.NgControlStatusGroup,
3401
+ type: i3$2.NgControlStatusGroup,
3386
3402
  selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"
3387
3403
  },
3388
3404
  {
3389
3405
  kind: "directive",
3390
- type: i3$1.FormGroupDirective,
3406
+ type: i3$2.FormGroupDirective,
3391
3407
  selector: "[formGroup]",
3392
3408
  inputs: ["formGroup"],
3393
3409
  outputs: ["ngSubmit"],
@@ -3395,7 +3411,7 @@ var SideScreenComponent = class SideScreenComponent {
3395
3411
  },
3396
3412
  {
3397
3413
  kind: "directive",
3398
- type: i3$1.FormControlName,
3414
+ type: i3$2.FormControlName,
3399
3415
  selector: "[formControlName]",
3400
3416
  inputs: [
3401
3417
  "formControlName",
@@ -3410,7 +3426,7 @@ var SideScreenComponent = class SideScreenComponent {
3410
3426
  },
3411
3427
  {
3412
3428
  kind: "component",
3413
- type: i3.MatCheckbox,
3429
+ type: i3$1.MatCheckbox,
3414
3430
  selector: "mat-checkbox",
3415
3431
  inputs: [
3416
3432
  "aria-label",
@@ -3475,7 +3491,7 @@ var SideScreenComponent = class SideScreenComponent {
3475
3491
  },
3476
3492
  {
3477
3493
  kind: "directive",
3478
- type: i4.MatTooltip,
3494
+ type: i4$1.MatTooltip,
3479
3495
  selector: "[matTooltip]",
3480
3496
  inputs: [
3481
3497
  "matTooltipPosition",
@@ -3522,7 +3538,7 @@ i0.ɵɵngDeclareClassMetadata({
3522
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"]
3523
3539
  }]
3524
3540
  }],
3525
- ctorParameters: () => [{ type: i3$1.FormBuilder }],
3541
+ ctorParameters: () => [{ type: i3$2.FormBuilder }],
3526
3542
  propDecorators: {
3527
3543
  headerTitle: [{ type: Input }],
3528
3544
  onLoadData: [{ type: Input }],
@@ -3606,7 +3622,7 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3606
3622
  ngImport: i0,
3607
3623
  type: ApprovalScreenComponent,
3608
3624
  deps: [{
3609
- token: i1$3.DatePipe,
3625
+ token: i1$4.DatePipe,
3610
3626
  optional: true
3611
3627
  }],
3612
3628
  target: i0.ɵɵFactoryTarget.Component
@@ -3640,13 +3656,13 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3640
3656
  },
3641
3657
  {
3642
3658
  kind: "directive",
3643
- type: i1$3.NgClass,
3659
+ type: i1$4.NgClass,
3644
3660
  selector: "[ngClass]",
3645
3661
  inputs: ["class", "ngClass"]
3646
3662
  },
3647
3663
  {
3648
3664
  kind: "directive",
3649
- type: i1$3.NgForOf,
3665
+ type: i1$4.NgForOf,
3650
3666
  selector: "[ngFor][ngForOf]",
3651
3667
  inputs: [
3652
3668
  "ngForOf",
@@ -3656,7 +3672,7 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3656
3672
  },
3657
3673
  {
3658
3674
  kind: "directive",
3659
- type: i1$3.NgIf,
3675
+ type: i1$4.NgIf,
3660
3676
  selector: "[ngIf]",
3661
3677
  inputs: [
3662
3678
  "ngIf",
@@ -3666,7 +3682,7 @@ var ApprovalScreenComponent = class ApprovalScreenComponent {
3666
3682
  },
3667
3683
  {
3668
3684
  kind: "pipe",
3669
- type: i1$3.DatePipe,
3685
+ type: i1$4.DatePipe,
3670
3686
  name: "date"
3671
3687
  },
3672
3688
  {
@@ -3697,7 +3713,7 @@ i0.ɵɵngDeclareClassMetadata({
3697
3713
  }]
3698
3714
  }],
3699
3715
  ctorParameters: () => [{
3700
- type: i1$3.DatePipe,
3716
+ type: i1$4.DatePipe,
3701
3717
  decorators: [{ type: Optional }]
3702
3718
  }],
3703
3719
  propDecorators: {
@@ -3786,7 +3802,7 @@ var BrowseComponent = class BrowseComponent {
3786
3802
  type: CommonModule
3787
3803
  }, {
3788
3804
  kind: "directive",
3789
- type: i1$3.NgIf,
3805
+ type: i1$4.NgIf,
3790
3806
  selector: "[ngIf]",
3791
3807
  inputs: [
3792
3808
  "ngIf",
@@ -3970,7 +3986,7 @@ var AlertService = class AlertService {
3970
3986
  version: "22.2.4",
3971
3987
  ngImport: i0,
3972
3988
  type: AlertService,
3973
- deps: [{ token: i1$4.TranslateService }],
3989
+ deps: [{ token: i1$5.TranslateService }],
3974
3990
  target: i0.ɵɵFactoryTarget.Injectable
3975
3991
  });
3976
3992
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -3990,7 +4006,7 @@ i0.ɵɵngDeclareClassMetadata({
3990
4006
  type: Injectable,
3991
4007
  args: [{ providedIn: "root" }]
3992
4008
  }],
3993
- ctorParameters: () => [{ type: i1$4.TranslateService }]
4009
+ ctorParameters: () => [{ type: i1$5.TranslateService }]
3994
4010
  });
3995
4011
  var ErrorHandlerService = class ErrorHandlerService {
3996
4012
  router;
@@ -4107,7 +4123,7 @@ var ErrorHandlerService = class ErrorHandlerService {
4107
4123
  version: "22.2.4",
4108
4124
  ngImport: i0,
4109
4125
  type: ErrorHandlerService,
4110
- deps: [{ token: i1.Router }, { token: AlertService }],
4126
+ deps: [{ token: i1$1.Router }, { token: AlertService }],
4111
4127
  target: i0.ɵɵFactoryTarget.Injectable
4112
4128
  });
4113
4129
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -4127,7 +4143,7 @@ i0.ɵɵngDeclareClassMetadata({
4127
4143
  type: Injectable,
4128
4144
  args: [{ providedIn: "root" }]
4129
4145
  }],
4130
- ctorParameters: () => [{ type: i1.Router }, { type: AlertService }]
4146
+ ctorParameters: () => [{ type: i1$1.Router }, { type: AlertService }]
4131
4147
  });
4132
4148
  var TabDataService = class TabDataService {
4133
4149
  cache = /* @__PURE__ */ new Map();
@@ -5126,10 +5142,10 @@ var FormsComponent = class FormsComponent {
5126
5142
  type: FormsComponent,
5127
5143
  deps: [
5128
5144
  { token: LoaderService },
5129
- { token: i1$4.TranslateService },
5145
+ { token: i1$5.TranslateService },
5130
5146
  { token: GlobalValuesService },
5131
5147
  { token: ApiService },
5132
- { token: i1$3.DatePipe },
5148
+ { token: i1$4.DatePipe },
5133
5149
  { token: AlertService },
5134
5150
  { token: ErrorHandlerService },
5135
5151
  { token: GlobalValuesService },
@@ -5147,8 +5163,8 @@ var FormsComponent = class FormsComponent {
5147
5163
  selector: "app-forms",
5148
5164
  inputs: { tab: "tab" },
5149
5165
  ngImport: i0,
5150
- template: "<div class=\"flex justify-content-between\">\n <div>\n <!-- SK05DEC25 sub tabs list -->\n <div class=\"tab-box flex flex-direction-row tab-view-buttons w-100\">\n <div *ngFor=\"let tab of tabs; let i=index \">\n <div class=\"tabCls d-flex p-2 cursor-pointer\"\n [class]=\"eachTypeOfTab === tab.name ? 'tab-active-color' : 'tab-color'\"\n [class.active]=\"eachTypeOfTab === tab.name\" (click)=\"currentTabNav(tab)\">\n <span class=\"sub-tab-text fs-6\">\n {{tab.labelPath || tab.label | customTranslate : tab.label }}\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex ms-2\">\n <!-- SK05DEC25 FY dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"fyList\" [selectedData]=\"selectedFYData\" dropDownHeight=\"32px\"\n dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\"\n dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'fyYear')\">\n </app-drop-down>\n <!-- SK05DEC25 Quarter Dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"['Q1', 'Q2', 'Q3', 'Q4']\" [selectedData]=\"selectedQuarterData\"\n dropDownHeight=\"32px\" dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\"\n dropBorderRadius=\"5px\" dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'quarter')\">\n </app-drop-down>\n <!-- SK05DEC25 Submit Form24Q button -->\n <div class=\"align-self-center me-3\">\n <app-fusion-button [buttonValue]=\" 'APP_HRM_PAYROLL_FORM24Q.SUBMIT_24Q' | customTranslate : 'Submit 24Q' \"\n (buttonClickEmit)=\"submitClick('submit24Q')\" [buttonLoadingSpinner]=\"submitButtonLoader\">\n </app-fusion-button>\n </div>\n </div>\n</div>\n\n\n<div class=\"row\">\n <ng-container *ngFor=\"let comp of components; let j=index\">\n <!-- {{comp._id}} -->\n <div class=\"{{comp.size}}\">\n <!-- SK05DEC25 button component -->\n <div *ngIf=\"comp.type === 'buttons'\" class=\"mb-1\" style=\"display: flex; justify-content: end;\">\n <app-fusion-button *ngFor=\"let button of comp?.config?.buttons\"\n (buttonClickEmit)=\"commonButtonClickEmit(button)\" [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\">\n </app-fusion-button>\n </div>\n <!-- SK05DEC25 table for challans -->\n <div *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'challans' \" class=\"comp-wrap mt-2\">\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\" [data]=tableData.challans\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 table for deductees and fetched deductees -->\n <div class=\"mb-3 comp-wrap mt-2\" *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'deductees' \" >\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0 || isLoading['syncDeductees']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\"\n [data]=\"comp.name === 'deducteeTable' ? tableData.deductees : tableData.fetchedDeductees \"\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 nxtpage for details/batchheader/fileheader -->\n <div *ngIf=\"comp.type === 'nxtPage'\">\n <lib-booklet *ngIf=\"!isLoading[comp._id] && !isLoading['getFormData']\" [bookletJSON]=\"comp.config.nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet>\n <div *ngIf=\"isLoading[comp._id]?.length > 0 || isLoading['getFormData']?.length > 0 || (modalProperties ? isLoading[modalProperties?._id]?.length > 0 : false)\" class=\"row my-1\">\n <div class=\"col-md-12\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- SK05DEC25 if condition to open modal -->\n<app-modal \n [modalTitle]=\"modalProperties?.modalTitlePath || modalProperties?.modalTitle || isLoading['deducteeSubmit']?.length > 0 || isLoading['challanSubmit']?.length > 0 || isLoading['detailSubmit']?.length > 0 || 'NXT BOOK' | customTranslate : modalProperties?.modalTitle\"\n [modalFooter]=\"modalProperties?.isModalFooter\" [saveButtonValue]=\"modalProperties?.modalSaveButtonValue\"\n [isModalOpen]=\"openModal\" (cancelButtonEmit)=\"modalClose($event)\" [modalSize]=\"modalProperties?.modalSize\">\n <div class=\"modal-body\">\n <div>\n <!-- <lib-booklet [bookletJSON]=\"nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet> -->\n <!-- SK24JUN24 language code update to nxt -->\n <app-browse [nxtJSON]=\"nxtJSON\" [modalProperties]=\"modalProperties\" [nxtEdit]=\"true\" [bookValue]=\"bookValue\"\n [languageCode]=\"languageCode\" (nxtFormHandlerEmit)=\"nxtFormHandler($event)\">\n </app-browse>\n </div>\n </div>\n</app-modal>",
5151
- styles: [".tab-box{border:1px solid var(--border-color)!important;border-radius:6px;width:fit-content}.tab-box>div:not(:last-child) .tabCls{border-right:1px solid var(--border-color)!important}.tab-text{font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%;text-align:center}.tab-active-color{font-weight:500;background:var(--fc-primary-color);color:var(--fc-text-color, #FFFFFF)}::ng-deep .upload-preview-wrapper{height:0}\n"],
5166
+ template: "<div class=\"flex justify-content-between\">\n <div>\n <!-- SK05DEC25 MR 09NOV26 Standardize sub-nav tabs with modern underline indicator -->\n <ul class=\"nav sub-nav-head tab-view-buttons w-100\" role=\"tablist\">\n <li class=\"nav-item\" role=\"presentation\" *ngFor=\"let tab of tabs; let i = index\">\n <button type=\"button\"\n class=\"nav-link sub-nav\"\n [class.active]=\"eachTypeOfTab === tab.name\"\n role=\"tab\"\n [attr.aria-selected]=\"eachTypeOfTab === tab.name\"\n (click)=\"currentTabNav(tab)\">\n <span class=\"sub-tab-text\">\n {{tab.labelPath || tab.label | customTranslate : tab.label }}\n </span>\n </button>\n </li>\n </ul>\n </div>\n <div class=\"flex ms-2\">\n <!-- SK05DEC25 FY dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"fyList\" [selectedData]=\"selectedFYData\" dropDownHeight=\"32px\"\n dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\"\n dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'fyYear')\">\n </app-drop-down>\n <!-- SK05DEC25 Quarter Dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"['Q1', 'Q2', 'Q3', 'Q4']\" [selectedData]=\"selectedQuarterData\"\n dropDownHeight=\"32px\" dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\"\n dropBorderRadius=\"5px\" dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'quarter')\">\n </app-drop-down>\n <!-- SK05DEC25 Submit Form24Q button -->\n <div class=\"align-self-center me-3\">\n <app-fusion-button [buttonValue]=\" 'APP_HRM_PAYROLL_FORM24Q.SUBMIT_24Q' | customTranslate : 'Submit 24Q' \"\n (buttonClickEmit)=\"submitClick('submit24Q')\" [buttonLoadingSpinner]=\"submitButtonLoader\">\n </app-fusion-button>\n </div>\n </div>\n</div>\n\n\n<div class=\"row\">\n <ng-container *ngFor=\"let comp of components; let j=index\">\n <!-- {{comp._id}} -->\n <div class=\"{{comp.size}}\">\n <!-- SK05DEC25 button component -->\n <div *ngIf=\"comp.type === 'buttons'\" class=\"mb-1\" style=\"display: flex; justify-content: end;\">\n <app-fusion-button *ngFor=\"let button of comp?.config?.buttons\"\n (buttonClickEmit)=\"commonButtonClickEmit(button)\" [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\">\n </app-fusion-button>\n </div>\n <!-- SK05DEC25 table for challans -->\n <div *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'challans' \" class=\"comp-wrap mt-2\">\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\" [data]=tableData.challans\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 table for deductees and fetched deductees -->\n <div class=\"mb-3 comp-wrap mt-2\" *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'deductees' \" >\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0 || isLoading['syncDeductees']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\"\n [data]=\"comp.name === 'deducteeTable' ? tableData.deductees : tableData.fetchedDeductees \"\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 nxtpage for details/batchheader/fileheader -->\n <div *ngIf=\"comp.type === 'nxtPage'\">\n <lib-booklet *ngIf=\"!isLoading[comp._id] && !isLoading['getFormData']\" [bookletJSON]=\"comp.config.nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet>\n <div *ngIf=\"isLoading[comp._id]?.length > 0 || isLoading['getFormData']?.length > 0 || (modalProperties ? isLoading[modalProperties?._id]?.length > 0 : false)\" class=\"row my-1\">\n <div class=\"col-md-12\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- SK05DEC25 if condition to open modal -->\n<app-modal \n [modalTitle]=\"modalProperties?.modalTitlePath || modalProperties?.modalTitle || isLoading['deducteeSubmit']?.length > 0 || isLoading['challanSubmit']?.length > 0 || isLoading['detailSubmit']?.length > 0 || 'NXT BOOK' | customTranslate : modalProperties?.modalTitle\"\n [modalFooter]=\"modalProperties?.isModalFooter\" [saveButtonValue]=\"modalProperties?.modalSaveButtonValue\"\n [isModalOpen]=\"openModal\" (cancelButtonEmit)=\"modalClose($event)\" [modalSize]=\"modalProperties?.modalSize\">\n <div class=\"modal-body\">\n <div>\n <!-- <lib-booklet [bookletJSON]=\"nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet> -->\n <!-- SK24JUN24 language code update to nxt -->\n <app-browse [nxtJSON]=\"nxtJSON\" [modalProperties]=\"modalProperties\" [nxtEdit]=\"true\" [bookValue]=\"bookValue\"\n [languageCode]=\"languageCode\" (nxtFormHandlerEmit)=\"nxtFormHandler($event)\">\n </app-browse>\n </div>\n </div>\n</app-modal>",
5167
+ styles: [".sub-nav-head{display:flex;flex-wrap:nowrap;overflow-x:auto;border-bottom:1px solid var(--border-color, #E2E8F0);gap:4px;list-style:none;padding:0;margin:0}.sub-nav{background:transparent;border:none;border-bottom:3.5px solid transparent;margin-bottom:-1px;padding:8px 16px;font-size:var(--fs-normal, 14px);font-weight:var(--fw-500, 500);color:var(--label-text-color, #475569);cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:color .15s ease-in-out,border-color .15s ease-in-out}.sub-nav:hover{color:var(--fc-text-color-dark, #0F172A)}.sub-nav.active{color:var(--fc-primary-color, #0140C1);font-weight:var(--fw-600, 600);border-bottom:3.5px solid var(--fc-primary-color, #0140C1)}.tab-box{display:flex;flex-wrap:nowrap;border-bottom:1px solid var(--border-color, #E2E8F0)}.tabCls{cursor:pointer}.tab-text,.sub-tab-text{line-height:100%}.tab-active-color{color:var(--fc-primary-color, #0140C1);font-weight:var(--fw-600, 600)}::ng-deep .upload-preview-wrapper{height:0}\n"],
5152
5168
  dependencies: [
5153
5169
  {
5154
5170
  kind: "ngmodule",
@@ -5156,7 +5172,7 @@ var FormsComponent = class FormsComponent {
5156
5172
  },
5157
5173
  {
5158
5174
  kind: "directive",
5159
- type: i1$3.NgForOf,
5175
+ type: i1$4.NgForOf,
5160
5176
  selector: "[ngFor][ngForOf]",
5161
5177
  inputs: [
5162
5178
  "ngForOf",
@@ -5166,7 +5182,7 @@ var FormsComponent = class FormsComponent {
5166
5182
  },
5167
5183
  {
5168
5184
  kind: "directive",
5169
- type: i1$3.NgIf,
5185
+ type: i1$4.NgIf,
5170
5186
  selector: "[ngIf]",
5171
5187
  inputs: [
5172
5188
  "ngIf",
@@ -5437,16 +5453,16 @@ i0.ɵɵngDeclareClassMetadata({
5437
5453
  AngularSvgIconModule,
5438
5454
  FusionButtonComponent
5439
5455
  ],
5440
- template: "<div class=\"flex justify-content-between\">\n <div>\n <!-- SK05DEC25 sub tabs list -->\n <div class=\"tab-box flex flex-direction-row tab-view-buttons w-100\">\n <div *ngFor=\"let tab of tabs; let i=index \">\n <div class=\"tabCls d-flex p-2 cursor-pointer\"\n [class]=\"eachTypeOfTab === tab.name ? 'tab-active-color' : 'tab-color'\"\n [class.active]=\"eachTypeOfTab === tab.name\" (click)=\"currentTabNav(tab)\">\n <span class=\"sub-tab-text fs-6\">\n {{tab.labelPath || tab.label | customTranslate : tab.label }}\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex ms-2\">\n <!-- SK05DEC25 FY dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"fyList\" [selectedData]=\"selectedFYData\" dropDownHeight=\"32px\"\n dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\"\n dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'fyYear')\">\n </app-drop-down>\n <!-- SK05DEC25 Quarter Dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"['Q1', 'Q2', 'Q3', 'Q4']\" [selectedData]=\"selectedQuarterData\"\n dropDownHeight=\"32px\" dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\"\n dropBorderRadius=\"5px\" dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'quarter')\">\n </app-drop-down>\n <!-- SK05DEC25 Submit Form24Q button -->\n <div class=\"align-self-center me-3\">\n <app-fusion-button [buttonValue]=\" 'APP_HRM_PAYROLL_FORM24Q.SUBMIT_24Q' | customTranslate : 'Submit 24Q' \"\n (buttonClickEmit)=\"submitClick('submit24Q')\" [buttonLoadingSpinner]=\"submitButtonLoader\">\n </app-fusion-button>\n </div>\n </div>\n</div>\n\n\n<div class=\"row\">\n <ng-container *ngFor=\"let comp of components; let j=index\">\n <!-- {{comp._id}} -->\n <div class=\"{{comp.size}}\">\n <!-- SK05DEC25 button component -->\n <div *ngIf=\"comp.type === 'buttons'\" class=\"mb-1\" style=\"display: flex; justify-content: end;\">\n <app-fusion-button *ngFor=\"let button of comp?.config?.buttons\"\n (buttonClickEmit)=\"commonButtonClickEmit(button)\" [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\">\n </app-fusion-button>\n </div>\n <!-- SK05DEC25 table for challans -->\n <div *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'challans' \" class=\"comp-wrap mt-2\">\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\" [data]=tableData.challans\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 table for deductees and fetched deductees -->\n <div class=\"mb-3 comp-wrap mt-2\" *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'deductees' \" >\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0 || isLoading['syncDeductees']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\"\n [data]=\"comp.name === 'deducteeTable' ? tableData.deductees : tableData.fetchedDeductees \"\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 nxtpage for details/batchheader/fileheader -->\n <div *ngIf=\"comp.type === 'nxtPage'\">\n <lib-booklet *ngIf=\"!isLoading[comp._id] && !isLoading['getFormData']\" [bookletJSON]=\"comp.config.nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet>\n <div *ngIf=\"isLoading[comp._id]?.length > 0 || isLoading['getFormData']?.length > 0 || (modalProperties ? isLoading[modalProperties?._id]?.length > 0 : false)\" class=\"row my-1\">\n <div class=\"col-md-12\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- SK05DEC25 if condition to open modal -->\n<app-modal \n [modalTitle]=\"modalProperties?.modalTitlePath || modalProperties?.modalTitle || isLoading['deducteeSubmit']?.length > 0 || isLoading['challanSubmit']?.length > 0 || isLoading['detailSubmit']?.length > 0 || 'NXT BOOK' | customTranslate : modalProperties?.modalTitle\"\n [modalFooter]=\"modalProperties?.isModalFooter\" [saveButtonValue]=\"modalProperties?.modalSaveButtonValue\"\n [isModalOpen]=\"openModal\" (cancelButtonEmit)=\"modalClose($event)\" [modalSize]=\"modalProperties?.modalSize\">\n <div class=\"modal-body\">\n <div>\n <!-- <lib-booklet [bookletJSON]=\"nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet> -->\n <!-- SK24JUN24 language code update to nxt -->\n <app-browse [nxtJSON]=\"nxtJSON\" [modalProperties]=\"modalProperties\" [nxtEdit]=\"true\" [bookValue]=\"bookValue\"\n [languageCode]=\"languageCode\" (nxtFormHandlerEmit)=\"nxtFormHandler($event)\">\n </app-browse>\n </div>\n </div>\n</app-modal>",
5441
- styles: [".tab-box{border:1px solid var(--border-color)!important;border-radius:6px;width:fit-content}.tab-box>div:not(:last-child) .tabCls{border-right:1px solid var(--border-color)!important}.tab-text{font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%;text-align:center}.tab-active-color{font-weight:500;background:var(--fc-primary-color);color:var(--fc-text-color, #FFFFFF)}::ng-deep .upload-preview-wrapper{height:0}\n"]
5456
+ template: "<div class=\"flex justify-content-between\">\n <div>\n <!-- SK05DEC25 MR 09NOV26 Standardize sub-nav tabs with modern underline indicator -->\n <ul class=\"nav sub-nav-head tab-view-buttons w-100\" role=\"tablist\">\n <li class=\"nav-item\" role=\"presentation\" *ngFor=\"let tab of tabs; let i = index\">\n <button type=\"button\"\n class=\"nav-link sub-nav\"\n [class.active]=\"eachTypeOfTab === tab.name\"\n role=\"tab\"\n [attr.aria-selected]=\"eachTypeOfTab === tab.name\"\n (click)=\"currentTabNav(tab)\">\n <span class=\"sub-tab-text\">\n {{tab.labelPath || tab.label | customTranslate : tab.label }}\n </span>\n </button>\n </li>\n </ul>\n </div>\n <div class=\"flex ms-2\">\n <!-- SK05DEC25 FY dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"fyList\" [selectedData]=\"selectedFYData\" dropDownHeight=\"32px\"\n dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\" dropBorderRadius=\"5px\"\n dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'fyYear')\">\n </app-drop-down>\n <!-- SK05DEC25 Quarter Dropdown -->\n <app-drop-down class=\"me-2\" [lists]=\"['Q1', 'Q2', 'Q3', 'Q4']\" [selectedData]=\"selectedQuarterData\"\n dropDownHeight=\"32px\" dropFontWeight=\"500\" dropFontSize=\"12px\" dropFontColor=\"#434555\"\n dropBorderRadius=\"5px\" dropDownWidth=\"150px\" (dataEmit)=\"selectedDropdownValue($event, 'quarter')\">\n </app-drop-down>\n <!-- SK05DEC25 Submit Form24Q button -->\n <div class=\"align-self-center me-3\">\n <app-fusion-button [buttonValue]=\" 'APP_HRM_PAYROLL_FORM24Q.SUBMIT_24Q' | customTranslate : 'Submit 24Q' \"\n (buttonClickEmit)=\"submitClick('submit24Q')\" [buttonLoadingSpinner]=\"submitButtonLoader\">\n </app-fusion-button>\n </div>\n </div>\n</div>\n\n\n<div class=\"row\">\n <ng-container *ngFor=\"let comp of components; let j=index\">\n <!-- {{comp._id}} -->\n <div class=\"{{comp.size}}\">\n <!-- SK05DEC25 button component -->\n <div *ngIf=\"comp.type === 'buttons'\" class=\"mb-1\" style=\"display: flex; justify-content: end;\">\n <app-fusion-button *ngFor=\"let button of comp?.config?.buttons\"\n (buttonClickEmit)=\"commonButtonClickEmit(button)\" [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.namePath || button.name | customTranslate : button.label || button.name\">\n </app-fusion-button>\n </div>\n <!-- SK05DEC25 table for challans -->\n <div *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'challans' \" class=\"comp-wrap mt-2\">\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\" [data]=tableData.challans\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 table for deductees and fetched deductees -->\n <div class=\"mb-3 comp-wrap mt-2\" *ngIf=\"comp.type === 'table' && eachTypeOfTab === 'deductees' \" >\n <nxt-datatable [direction]=\"direction\" [languageCode]=\"languageCode\"\n [isLoading]=\"isLoading['getFormData']?.length > 0 || isLoading['syncDeductees']?.length > 0\" [searchBar]=\"comp?.config?.searchBar\"\n [withCheckBox]=\"comp?.config?.withCheckBox\" [isEditRow]=\"comp?.config?.isEditRow\"\n [isDeleteRow]=\"comp?.config?.isDeleteRow\"\n [isButtonLoading]=\"isLoading['onDeleteRecord']?.length > 0\"\n [actionButton]=\"comp?.config?.actionButton?.buttonArray?.length > 0 ? comp?.config?.actionButton : false\"\n [isButtons]=\"comp?.config?.isButtons\" [addInlineRecord]=\"comp?.config?.addInlineRecord\"\n [tableId]=\"comp?.config?.tableId\" direction=\"ltr\"\n [data]=\"comp.name === 'deducteeTable' ? tableData.deductees : tableData.fetchedDeductees \"\n [tableWidth]=\"comp?.config?.tableWidth\" [columns]=comp?.config?.columns\n [buttonArray]=comp?.config?.buttons [pagination]=\"comp?.config?.pagination\"\n (selectedValues)=\"tableCheckedDataa($event)\" (buttonEmit)=\"commonButtonClickEmit($event)\"\n (hyperLinkEmit)=\"hyperLinkColumnEmit(comp,$event)\" (onDeleteData)=\"onDeleteRecord($event,comp)\"\n (saveButtonData)=\"saveButtonData($event)\"\n (actionButtonEmit)=\"actionButtonEmit($event, comp._id)\" [multipleFilter]=multipleFilter\n [searchConfigs]=\"comp?.config?.searchConfigs\" [actionButtonArray]=comp?.config?.actionButton\n (NxtTableParamsEmit)=\"comp?.config?.pagination ? tablePageDetails(comp,$event) : tableParamsEmit(tab,$event,comp)\"\n [tableParams]=\"comp?.config?.tableParams\" [listViews]=\"listViews\"\n [tableFilterData]=\"tableFilterData\" [id]=\"comp?._id\"\n (NxtTableFilterEmit)=\"nxtTableFilterEmit($event, comp)\"\n [summaryRows]=\"comp?.config?.summaryRows\" (sideNavEmit)=\"onSideNav($event)\"\n (fileEmit)=\"emitAttachmentClick($event)\">\n </nxt-datatable>\n </div>\n <!-- SK05DEC25 nxtpage for details/batchheader/fileheader -->\n <div *ngIf=\"comp.type === 'nxtPage'\">\n <lib-booklet *ngIf=\"!isLoading[comp._id] && !isLoading['getFormData']\" [bookletJSON]=\"comp.config.nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet>\n <div *ngIf=\"isLoading[comp._id]?.length > 0 || isLoading['getFormData']?.length > 0 || (modalProperties ? isLoading[modalProperties?._id]?.length > 0 : false)\" class=\"row my-1\">\n <div class=\"col-md-12\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n <div class=\"col-md-12 mt-3\">\n <div class=\"title\" data-title>\n <div class=\"skeleton skeleton-text\"></div>\n <div class=\"skeleton skeleton-text\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- SK05DEC25 if condition to open modal -->\n<app-modal \n [modalTitle]=\"modalProperties?.modalTitlePath || modalProperties?.modalTitle || isLoading['deducteeSubmit']?.length > 0 || isLoading['challanSubmit']?.length > 0 || isLoading['detailSubmit']?.length > 0 || 'NXT BOOK' | customTranslate : modalProperties?.modalTitle\"\n [modalFooter]=\"modalProperties?.isModalFooter\" [saveButtonValue]=\"modalProperties?.modalSaveButtonValue\"\n [isModalOpen]=\"openModal\" (cancelButtonEmit)=\"modalClose($event)\" [modalSize]=\"modalProperties?.modalSize\">\n <div class=\"modal-body\">\n <div>\n <!-- <lib-booklet [bookletJSON]=\"nxtJSON\" [isEdit]=\"true\" [dataBind]=\"bookValue\"\n [languageCode]=\"languageCode\" [apiUrl]=\"apiUrl\" [direction]=\"direction\" [isLoading]=\"nxtLoader\"\n (handleBookletActionEvent)=\"nxtFormHandler($event)\">\n </lib-booklet> -->\n <!-- SK24JUN24 language code update to nxt -->\n <app-browse [nxtJSON]=\"nxtJSON\" [modalProperties]=\"modalProperties\" [nxtEdit]=\"true\" [bookValue]=\"bookValue\"\n [languageCode]=\"languageCode\" (nxtFormHandlerEmit)=\"nxtFormHandler($event)\">\n </app-browse>\n </div>\n </div>\n</app-modal>",
5457
+ styles: [".sub-nav-head{display:flex;flex-wrap:nowrap;overflow-x:auto;border-bottom:1px solid var(--border-color, #E2E8F0);gap:4px;list-style:none;padding:0;margin:0}.sub-nav{background:transparent;border:none;border-bottom:3.5px solid transparent;margin-bottom:-1px;padding:8px 16px;font-size:var(--fs-normal, 14px);font-weight:var(--fw-500, 500);color:var(--label-text-color, #475569);cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:color .15s ease-in-out,border-color .15s ease-in-out}.sub-nav:hover{color:var(--fc-text-color-dark, #0F172A)}.sub-nav.active{color:var(--fc-primary-color, #0140C1);font-weight:var(--fw-600, 600);border-bottom:3.5px solid var(--fc-primary-color, #0140C1)}.tab-box{display:flex;flex-wrap:nowrap;border-bottom:1px solid var(--border-color, #E2E8F0)}.tabCls{cursor:pointer}.tab-text,.sub-tab-text{line-height:100%}.tab-active-color{color:var(--fc-primary-color, #0140C1);font-weight:var(--fw-600, 600)}::ng-deep .upload-preview-wrapper{height:0}\n"]
5442
5458
  }]
5443
5459
  }],
5444
5460
  ctorParameters: () => [
5445
5461
  { type: LoaderService },
5446
- { type: i1$4.TranslateService },
5462
+ { type: i1$5.TranslateService },
5447
5463
  { type: GlobalValuesService },
5448
5464
  { type: ApiService },
5449
- { type: i1$3.DatePipe },
5465
+ { type: i1$4.DatePipe },
5450
5466
  { type: AlertService },
5451
5467
  { type: ErrorHandlerService },
5452
5468
  { type: GlobalValuesService },
@@ -5714,7 +5730,7 @@ var CustomPaginatorIntl = class CustomPaginatorIntl extends MatPaginatorIntl {
5714
5730
  version: "22.2.4",
5715
5731
  ngImport: i0,
5716
5732
  type: CustomPaginatorIntl,
5717
- deps: [{ token: i1$4.TranslateService }, { token: i0.ChangeDetectorRef }],
5733
+ deps: [{ token: i1$5.TranslateService }, { token: i0.ChangeDetectorRef }],
5718
5734
  target: i0.ɵɵFactoryTarget.Injectable
5719
5735
  });
5720
5736
  static ɵprov = i0.ɵɵngDeclareInjectable({
@@ -5734,7 +5750,7 @@ i0.ɵɵngDeclareClassMetadata({
5734
5750
  type: Injectable,
5735
5751
  args: [{ providedIn: "root" }]
5736
5752
  }],
5737
- ctorParameters: () => [{ type: i1$4.TranslateService }, { type: i0.ChangeDetectorRef }]
5753
+ ctorParameters: () => [{ type: i1$5.TranslateService }, { type: i0.ChangeDetectorRef }]
5738
5754
  });
5739
5755
  var CustomDatePipe = class CustomDatePipe {
5740
5756
  transform(value, type = "date") {
@@ -5949,11 +5965,29 @@ var DataTableComponent = class DataTableComponent {
5949
5965
  dropdownLists;
5950
5966
  dateDropdown = false;
5951
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;
5952
5984
  dateEmit = new EventEmitter();
5953
5985
  selectedValues = new EventEmitter();
5954
5986
  tableRowClick = new EventEmitter();
5987
+ rowClick = new EventEmitter();
5955
5988
  filteredArray = new EventEmitter();
5956
5989
  searchFilterData = new EventEmitter();
5990
+ searchValueChange = new EventEmitter();
5957
5991
  onEditData = new EventEmitter();
5958
5992
  onCloneData = new EventEmitter();
5959
5993
  onSendData = new EventEmitter();
@@ -5980,6 +6014,13 @@ var DataTableComponent = class DataTableComponent {
5980
6014
  sideNavEmit = new EventEmitter();
5981
6015
  searchText = new EventEmitter();
5982
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();
5983
6024
  paginator;
5984
6025
  sort;
5985
6026
  editInput;
@@ -6051,6 +6092,9 @@ var DataTableComponent = class DataTableComponent {
6051
6092
  this.sideScreenColumn = Array.isArray(this.sideScreenColumn) ? this.sideScreenColumn : [];
6052
6093
  this.objectColumns = Array.isArray(this.objectColumns) ? this.objectColumns : [];
6053
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();
6054
6098
  this.dataSource = new MatTableDataSource(this.data);
6055
6099
  this.selection = new SelectionModel(true, []);
6056
6100
  this.filterCheckBox = new SelectionModel(true, []);
@@ -6182,8 +6226,10 @@ var DataTableComponent = class DataTableComponent {
6182
6226
  this.dataSource.filter = filterValue.trim().toLowerCase();
6183
6227
  this.searchFilterData.emit(this.dataSource.filteredData);
6184
6228
  this.searchText.emit(filterValue);
6229
+ this.searchValueChange.emit(filterValue);
6185
6230
  this.totalCount = this.dataSource.filteredData.length;
6186
6231
  if (this.dataSource.paginator) this.dataSource.paginator.firstPage();
6232
+ this.cdr.markForCheck();
6187
6233
  }
6188
6234
  isAllSelected() {
6189
6235
  return this.selection.selected.length === this.dataSource.data.length;
@@ -6217,6 +6263,7 @@ var DataTableComponent = class DataTableComponent {
6217
6263
  }
6218
6264
  tableClick(data) {
6219
6265
  this.tableRowClick.emit(data);
6266
+ this.rowClick.emit(data);
6220
6267
  }
6221
6268
  filteredData(filterItems) {
6222
6269
  const arr = [this.selectedFilterColumn.toLocaleString(), filterItems];
@@ -6502,6 +6549,156 @@ var DataTableComponent = class DataTableComponent {
6502
6549
  onColumnClick(column) {
6503
6550
  this.activeColumn = column;
6504
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
+ }
6505
6702
  static ɵfac = i0.ɵɵngDeclareFactory({
6506
6703
  minVersion: "12.0.0",
6507
6704
  version: "22.2.4",
@@ -6509,7 +6706,7 @@ var DataTableComponent = class DataTableComponent {
6509
6706
  type: DataTableComponent,
6510
6707
  deps: [
6511
6708
  { token: ScrollService },
6512
- { token: i1$1.Overlay },
6709
+ { token: i1$2.Overlay },
6513
6710
  { token: GlobalValuesService },
6514
6711
  { token: ApiService },
6515
6712
  { token: AlertService },
@@ -6524,7 +6721,7 @@ var DataTableComponent = class DataTableComponent {
6524
6721
  version: "22.2.4",
6525
6722
  type: DataTableComponent,
6526
6723
  isStandalone: true,
6527
- selector: "app-data-table",
6724
+ selector: "app-data-table, app-data-table-two",
6528
6725
  inputs: {
6529
6726
  data: "data",
6530
6727
  displayedColumns: "displayedColumns",
@@ -6588,6 +6785,17 @@ var DataTableComponent = class DataTableComponent {
6588
6785
  dropdownLists: "dropdownLists",
6589
6786
  dateDropdown: "dateDropdown",
6590
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",
6591
6799
  exportButtonLoadingSpinner: "exportButtonLoadingSpinner",
6592
6800
  pageTotal: "pageTotal",
6593
6801
  deleteModal: "deleteModal"
@@ -6596,8 +6804,10 @@ var DataTableComponent = class DataTableComponent {
6596
6804
  dateEmit: "dateEmit",
6597
6805
  selectedValues: "selectedValues",
6598
6806
  tableRowClick: "tableRowClick",
6807
+ rowClick: "rowClick",
6599
6808
  filteredArray: "filteredArray",
6600
6809
  searchFilterData: "searchFilterData",
6810
+ searchValueChange: "searchValueChange",
6601
6811
  onEditData: "onEditData",
6602
6812
  onCloneData: "onCloneData",
6603
6813
  onSendData: "onSendData",
@@ -6623,7 +6833,14 @@ var DataTableComponent = class DataTableComponent {
6623
6833
  filterDateEmitEvt: "filterDateEmitEvt",
6624
6834
  sideNavEmit: "sideNavEmit",
6625
6835
  searchText: "searchText",
6626
- 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"
6627
6844
  },
6628
6845
  host: { listeners: { "document:click": "onDocumentClick($event)" } },
6629
6846
  providers: [{
@@ -6664,8 +6881,8 @@ var DataTableComponent = class DataTableComponent {
6664
6881
  ],
6665
6882
  usesOnChanges: true,
6666
6883
  ngImport: i0,
6667
- 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>",
6668
- 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"],
6669
6886
  dependencies: [
6670
6887
  {
6671
6888
  kind: "ngmodule",
@@ -6673,13 +6890,13 @@ var DataTableComponent = class DataTableComponent {
6673
6890
  },
6674
6891
  {
6675
6892
  kind: "directive",
6676
- type: i1$3.NgClass,
6893
+ type: i1$4.NgClass,
6677
6894
  selector: "[ngClass]",
6678
6895
  inputs: ["class", "ngClass"]
6679
6896
  },
6680
6897
  {
6681
6898
  kind: "directive",
6682
- type: i1$3.NgForOf,
6899
+ type: i1$4.NgForOf,
6683
6900
  selector: "[ngFor][ngForOf]",
6684
6901
  inputs: [
6685
6902
  "ngForOf",
@@ -6689,7 +6906,7 @@ var DataTableComponent = class DataTableComponent {
6689
6906
  },
6690
6907
  {
6691
6908
  kind: "directive",
6692
- type: i1$3.NgIf,
6909
+ type: i1$4.NgIf,
6693
6910
  selector: "[ngIf]",
6694
6911
  inputs: [
6695
6912
  "ngIf",
@@ -6699,25 +6916,25 @@ var DataTableComponent = class DataTableComponent {
6699
6916
  },
6700
6917
  {
6701
6918
  kind: "directive",
6702
- type: i1$3.NgStyle,
6919
+ type: i1$4.NgStyle,
6703
6920
  selector: "[ngStyle]",
6704
6921
  inputs: ["ngStyle"]
6705
6922
  },
6706
6923
  {
6707
6924
  kind: "directive",
6708
- type: i1$3.NgSwitch,
6925
+ type: i1$4.NgSwitch,
6709
6926
  selector: "[ngSwitch]",
6710
6927
  inputs: ["ngSwitch"]
6711
6928
  },
6712
6929
  {
6713
6930
  kind: "directive",
6714
- type: i1$3.NgSwitchCase,
6931
+ type: i1$4.NgSwitchCase,
6715
6932
  selector: "[ngSwitchCase]",
6716
6933
  inputs: ["ngSwitchCase"]
6717
6934
  },
6718
6935
  {
6719
6936
  kind: "directive",
6720
- type: i1$3.NgSwitchDefault,
6937
+ type: i1$4.NgSwitchDefault,
6721
6938
  selector: "[ngSwitchDefault]"
6722
6939
  },
6723
6940
  {
@@ -6726,79 +6943,79 @@ var DataTableComponent = class DataTableComponent {
6726
6943
  },
6727
6944
  {
6728
6945
  kind: "component",
6729
- type: i9.MatTable,
6946
+ type: i9$1.MatTable,
6730
6947
  selector: "mat-table, table[mat-table]",
6731
6948
  exportAs: ["matTable"]
6732
6949
  },
6733
6950
  {
6734
6951
  kind: "directive",
6735
- type: i9.MatHeaderCellDef,
6952
+ type: i9$1.MatHeaderCellDef,
6736
6953
  selector: "[matHeaderCellDef]"
6737
6954
  },
6738
6955
  {
6739
6956
  kind: "directive",
6740
- type: i9.MatHeaderRowDef,
6957
+ type: i9$1.MatHeaderRowDef,
6741
6958
  selector: "[matHeaderRowDef]",
6742
6959
  inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"]
6743
6960
  },
6744
6961
  {
6745
6962
  kind: "directive",
6746
- type: i9.MatColumnDef,
6963
+ type: i9$1.MatColumnDef,
6747
6964
  selector: "[matColumnDef]",
6748
6965
  inputs: ["matColumnDef"]
6749
6966
  },
6750
6967
  {
6751
6968
  kind: "directive",
6752
- type: i9.MatCellDef,
6969
+ type: i9$1.MatCellDef,
6753
6970
  selector: "[matCellDef]"
6754
6971
  },
6755
6972
  {
6756
6973
  kind: "directive",
6757
- type: i9.MatRowDef,
6974
+ type: i9$1.MatRowDef,
6758
6975
  selector: "[matRowDef]",
6759
6976
  inputs: ["matRowDefColumns", "matRowDefWhen"]
6760
6977
  },
6761
6978
  {
6762
6979
  kind: "directive",
6763
- type: i9.MatFooterCellDef,
6980
+ type: i9$1.MatFooterCellDef,
6764
6981
  selector: "[matFooterCellDef]"
6765
6982
  },
6766
6983
  {
6767
6984
  kind: "directive",
6768
- type: i9.MatFooterRowDef,
6985
+ type: i9$1.MatFooterRowDef,
6769
6986
  selector: "[matFooterRowDef]",
6770
6987
  inputs: ["matFooterRowDef", "matFooterRowDefSticky"]
6771
6988
  },
6772
6989
  {
6773
6990
  kind: "directive",
6774
- type: i9.MatHeaderCell,
6991
+ type: i9$1.MatHeaderCell,
6775
6992
  selector: "mat-header-cell, th[mat-header-cell]"
6776
6993
  },
6777
6994
  {
6778
6995
  kind: "directive",
6779
- type: i9.MatCell,
6996
+ type: i9$1.MatCell,
6780
6997
  selector: "mat-cell, td[mat-cell]"
6781
6998
  },
6782
6999
  {
6783
7000
  kind: "directive",
6784
- type: i9.MatFooterCell,
7001
+ type: i9$1.MatFooterCell,
6785
7002
  selector: "mat-footer-cell, td[mat-footer-cell]"
6786
7003
  },
6787
7004
  {
6788
7005
  kind: "component",
6789
- type: i9.MatHeaderRow,
7006
+ type: i9$1.MatHeaderRow,
6790
7007
  selector: "mat-header-row, tr[mat-header-row]",
6791
7008
  exportAs: ["matHeaderRow"]
6792
7009
  },
6793
7010
  {
6794
7011
  kind: "component",
6795
- type: i9.MatRow,
7012
+ type: i9$1.MatRow,
6796
7013
  selector: "mat-row, tr[mat-row]",
6797
7014
  exportAs: ["matRow"]
6798
7015
  },
6799
7016
  {
6800
7017
  kind: "component",
6801
- type: i9.MatFooterRow,
7018
+ type: i9$1.MatFooterRow,
6802
7019
  selector: "mat-footer-row, tr[mat-footer-row]",
6803
7020
  exportAs: ["matFooterRow"]
6804
7021
  },
@@ -6838,36 +7055,40 @@ var DataTableComponent = class DataTableComponent {
6838
7055
  ],
6839
7056
  exportAs: ["matSortHeader"]
6840
7057
  },
7058
+ {
7059
+ kind: "ngmodule",
7060
+ type: MatCheckboxModule
7061
+ },
6841
7062
  {
6842
7063
  kind: "ngmodule",
6843
7064
  type: ReactiveFormsModule
6844
7065
  },
6845
7066
  {
6846
7067
  kind: "directive",
6847
- type: i3$1.NgSelectOption,
7068
+ type: i3$2.NgSelectOption,
6848
7069
  selector: "option",
6849
7070
  inputs: ["ngValue", "value"]
6850
7071
  },
6851
7072
  {
6852
7073
  kind: "directive",
6853
- type: i3$1.ɵNgSelectMultipleOption,
7074
+ type: i3$2.ɵNgSelectMultipleOption,
6854
7075
  selector: "option",
6855
7076
  inputs: ["ngValue", "value"]
6856
7077
  },
6857
7078
  {
6858
7079
  kind: "directive",
6859
- type: i3$1.DefaultValueAccessor,
7080
+ type: i3$2.DefaultValueAccessor,
6860
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]"
6861
7082
  },
6862
7083
  {
6863
7084
  kind: "directive",
6864
- type: i3$1.SelectControlValueAccessor,
7085
+ type: i3$2.SelectControlValueAccessor,
6865
7086
  selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]",
6866
7087
  inputs: ["compareWith"]
6867
7088
  },
6868
7089
  {
6869
7090
  kind: "directive",
6870
- type: i3$1.NgControlStatus,
7091
+ type: i3$2.NgControlStatus,
6871
7092
  selector: "[formControlName],[ngModel],[formControl]"
6872
7093
  },
6873
7094
  {
@@ -6876,7 +7097,7 @@ var DataTableComponent = class DataTableComponent {
6876
7097
  },
6877
7098
  {
6878
7099
  kind: "directive",
6879
- type: i3$1.NgModel,
7100
+ type: i3$2.NgModel,
6880
7101
  selector: "[ngModel]:not([formControlName]):not([formControl])",
6881
7102
  inputs: [
6882
7103
  "name",
@@ -6940,7 +7161,7 @@ var DataTableComponent = class DataTableComponent {
6940
7161
  },
6941
7162
  {
6942
7163
  kind: "directive",
6943
- type: i4.MatTooltip,
7164
+ type: i4$1.MatTooltip,
6944
7165
  selector: "[matTooltip]",
6945
7166
  inputs: [
6946
7167
  "matTooltipPosition",
@@ -6956,7 +7177,7 @@ var DataTableComponent = class DataTableComponent {
6956
7177
  },
6957
7178
  {
6958
7179
  kind: "directive",
6959
- type: i1$1.CdkScrollable,
7180
+ type: i1$2.CdkScrollable,
6960
7181
  selector: "[cdk-scrollable], [cdkScrollable]"
6961
7182
  },
6962
7183
  {
@@ -7054,7 +7275,7 @@ var DataTableComponent = class DataTableComponent {
7054
7275
  },
7055
7276
  {
7056
7277
  kind: "directive",
7057
- type: i1$1.CdkConnectedOverlay,
7278
+ type: i1$2.CdkConnectedOverlay,
7058
7279
  selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]",
7059
7280
  inputs: [
7060
7281
  "cdkConnectedOverlayOrigin",
@@ -7095,7 +7316,7 @@ var DataTableComponent = class DataTableComponent {
7095
7316
  },
7096
7317
  {
7097
7318
  kind: "directive",
7098
- type: i1$1.CdkOverlayOrigin,
7319
+ type: i1$2.CdkOverlayOrigin,
7099
7320
  selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]",
7100
7321
  exportAs: ["cdkOverlayOrigin"]
7101
7322
  },
@@ -7152,7 +7373,12 @@ var DataTableComponent = class DataTableComponent {
7152
7373
  },
7153
7374
  {
7154
7375
  kind: "pipe",
7155
- type: i1$3.DatePipe,
7376
+ type: i1$4.SlicePipe,
7377
+ name: "slice"
7378
+ },
7379
+ {
7380
+ kind: "pipe",
7381
+ type: i1$4.DatePipe,
7156
7382
  name: "date"
7157
7383
  },
7158
7384
  {
@@ -7195,7 +7421,8 @@ var DataTableComponent = class DataTableComponent {
7195
7421
  type: CustomTimePipe,
7196
7422
  name: "customTime"
7197
7423
  }
7198
- ]
7424
+ ],
7425
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
7199
7426
  });
7200
7427
  };
7201
7428
  i0.ɵɵngDeclareClassMetadata({
@@ -7206,12 +7433,13 @@ i0.ɵɵngDeclareClassMetadata({
7206
7433
  decorators: [{
7207
7434
  type: Component,
7208
7435
  args: [{
7209
- selector: "app-data-table",
7436
+ selector: "app-data-table, app-data-table-two",
7210
7437
  imports: [
7211
7438
  CommonModule,
7212
7439
  MatTableModule,
7213
7440
  MatPaginatorModule,
7214
7441
  MatSortModule,
7442
+ MatCheckboxModule,
7215
7443
  ReactiveFormsModule,
7216
7444
  FormsModule,
7217
7445
  SearchFilterComponent,
@@ -7236,17 +7464,18 @@ i0.ɵɵngDeclareClassMetadata({
7236
7464
  DropDownComponent
7237
7465
  ],
7238
7466
  standalone: true,
7467
+ changeDetection: ChangeDetectionStrategy.OnPush,
7239
7468
  providers: [{
7240
7469
  provide: MatPaginatorIntl,
7241
7470
  useClass: CustomPaginatorIntl
7242
7471
  }],
7243
- 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>",
7244
- 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"]
7245
7474
  }]
7246
7475
  }],
7247
7476
  ctorParameters: () => [
7248
7477
  { type: ScrollService },
7249
- { type: i1$1.Overlay },
7478
+ { type: i1$2.Overlay },
7250
7479
  { type: GlobalValuesService },
7251
7480
  { type: ApiService },
7252
7481
  { type: AlertService },
@@ -7317,11 +7546,24 @@ i0.ɵɵngDeclareClassMetadata({
7317
7546
  dropdownLists: [{ type: Input }],
7318
7547
  dateDropdown: [{ type: Input }],
7319
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 }],
7320
7560
  dateEmit: [{ type: Output }],
7321
7561
  selectedValues: [{ type: Output }],
7322
7562
  tableRowClick: [{ type: Output }],
7563
+ rowClick: [{ type: Output }],
7323
7564
  filteredArray: [{ type: Output }],
7324
7565
  searchFilterData: [{ type: Output }],
7566
+ searchValueChange: [{ type: Output }],
7325
7567
  onEditData: [{ type: Output }],
7326
7568
  onCloneData: [{ type: Output }],
7327
7569
  onSendData: [{ type: Output }],
@@ -7348,6 +7590,13 @@ i0.ɵɵngDeclareClassMetadata({
7348
7590
  sideNavEmit: [{ type: Output }],
7349
7591
  searchText: [{ type: Output }],
7350
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 }],
7351
7600
  paginator: [{
7352
7601
  type: ViewChild,
7353
7602
  args: ["paginator"]
@@ -7377,6 +7626,1163 @@ i0.ɵɵngDeclareClassMetadata({
7377
7626
  deleteModal: [{ type: Input }]
7378
7627
  }
7379
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
+ });
7380
8786
  var PdfFontService = class PdfFontService {
7381
8787
  fontLoadedPromise = null;
7382
8788
  configurePdfMake(pdfMakeInstance) {
@@ -7483,6 +8889,6 @@ i0.ɵɵngDeclareClassMetadata({
7483
8889
  }]
7484
8890
  }]
7485
8891
  });
7486
- 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 };
7487
8893
 
7488
8894
  //# sourceMappingURL=rangertechnologies-fusion-ui.mjs.map