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