@rangertechnologies/fusion-ui 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,31 +1,47 @@
|
|
|
1
|
-
import * as i1$
|
|
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$
|
|
6
|
+
import * as i1$5 from "@ngx-translate/core";
|
|
7
7
|
import { TranslateModule } from "@ngx-translate/core";
|
|
8
|
-
import * as i3$
|
|
9
|
-
import { FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
|
|
10
|
-
import { BehaviorSubject, Subject, catchError, firstValueFrom, shareReplay, throwError } from "rxjs";
|
|
11
|
-
import * as i1$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
1177
|
+
type: i3$2.NgControlStatus,
|
|
1162
1178
|
selector: "[formControlName],[ngModel],[formControl]"
|
|
1163
1179
|
},
|
|
1164
1180
|
{
|
|
1165
1181
|
kind: "directive",
|
|
1166
|
-
type: i3$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
1459
|
+
type: i3$2.NgControlStatus,
|
|
1444
1460
|
selector: "[formControlName],[ngModel],[formControl]"
|
|
1445
1461
|
},
|
|
1446
1462
|
{
|
|
1447
1463
|
kind: "directive",
|
|
1448
|
-
type: i3$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
1710
|
+
type: i3$2.NgControlStatus,
|
|
1695
1711
|
selector: "[formControlName],[ngModel],[formControl]"
|
|
1696
1712
|
},
|
|
1697
1713
|
{
|
|
1698
1714
|
kind: "directive",
|
|
1699
|
-
type: i3$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
1954
|
+
type: i3$2.NgControlStatus,
|
|
1939
1955
|
selector: "[formControlName],[ngModel],[formControl]"
|
|
1940
1956
|
},
|
|
1941
1957
|
{
|
|
1942
1958
|
kind: "directive",
|
|
1943
|
-
type: i3$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
3371
|
+
type: i3$2.ɵNgNoValidate,
|
|
3356
3372
|
selector: "form:not([ngNoForm]):not([ngNativeValidate])"
|
|
3357
3373
|
},
|
|
3358
3374
|
{
|
|
3359
3375
|
kind: "directive",
|
|
3360
|
-
type: i3$
|
|
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$
|
|
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$
|
|
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$
|
|
3396
|
+
type: i3$2.NgControlStatus,
|
|
3381
3397
|
selector: "[formControlName],[ngModel],[formControl]"
|
|
3382
3398
|
},
|
|
3383
3399
|
{
|
|
3384
3400
|
kind: "directive",
|
|
3385
|
-
type: i3$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
5145
|
+
{ token: i1$5.TranslateService },
|
|
5130
5146
|
{ token: GlobalValuesService },
|
|
5131
5147
|
{ token: ApiService },
|
|
5132
|
-
{ token: i1$
|
|
5148
|
+
{ token: i1$4.DatePipe },
|
|
5133
5149
|
{ token: AlertService },
|
|
5134
5150
|
{ token: ErrorHandlerService },
|
|
5135
5151
|
{ token: GlobalValuesService },
|
|
@@ -5156,7 +5172,7 @@ var FormsComponent = class FormsComponent {
|
|
|
5156
5172
|
},
|
|
5157
5173
|
{
|
|
5158
5174
|
kind: "directive",
|
|
5159
|
-
type: i1$
|
|
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$
|
|
5185
|
+
type: i1$4.NgIf,
|
|
5170
5186
|
selector: "[ngIf]",
|
|
5171
5187
|
inputs: [
|
|
5172
5188
|
"ngIf",
|
|
@@ -5443,10 +5459,10 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
5443
5459
|
}],
|
|
5444
5460
|
ctorParameters: () => [
|
|
5445
5461
|
{ type: LoaderService },
|
|
5446
|
-
{ type: i1$
|
|
5462
|
+
{ type: i1$5.TranslateService },
|
|
5447
5463
|
{ type: GlobalValuesService },
|
|
5448
5464
|
{ type: ApiService },
|
|
5449
|
-
{ type: i1$
|
|
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$
|
|
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$
|
|
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$
|
|
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;
|
|
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\">✓</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\">✕</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$
|
|
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$
|
|
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$
|
|
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$
|
|
6919
|
+
type: i1$4.NgStyle,
|
|
6703
6920
|
selector: "[ngStyle]",
|
|
6704
6921
|
inputs: ["ngStyle"]
|
|
6705
6922
|
},
|
|
6706
6923
|
{
|
|
6707
6924
|
kind: "directive",
|
|
6708
|
-
type: i1$
|
|
6925
|
+
type: i1$4.NgSwitch,
|
|
6709
6926
|
selector: "[ngSwitch]",
|
|
6710
6927
|
inputs: ["ngSwitch"]
|
|
6711
6928
|
},
|
|
6712
6929
|
{
|
|
6713
6930
|
kind: "directive",
|
|
6714
|
-
type: i1$
|
|
6931
|
+
type: i1$4.NgSwitchCase,
|
|
6715
6932
|
selector: "[ngSwitchCase]",
|
|
6716
6933
|
inputs: ["ngSwitchCase"]
|
|
6717
6934
|
},
|
|
6718
6935
|
{
|
|
6719
6936
|
kind: "directive",
|
|
6720
|
-
type: i1$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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;
|
|
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\">✓</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\">✕</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$
|
|
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
|