@posiwise/admin-module 0.0.255 → 0.0.257

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.
@@ -11,16 +11,18 @@ import { AdminDataService, AdminService, AppAdmin, DEFAULT_PAYOUT_PROVIDER, ONBO
11
11
  import { AppConfigService } from "@posiwise/app-config-service";
12
12
  import * as i4$3 from "@posiwise/app-loader";
13
13
  import { AppLoaderModule } from "@posiwise/app-loader";
14
- import * as i2$2 from "@posiwise/common-services";
14
+ import * as i2$1 from "@posiwise/common-services";
15
15
  import { FormHelperService, PermissionService, PrimeNgHelper, SubscriptionService, ValidationService } from "@posiwise/common-services";
16
+ import * as i9 from "@posiwise/core-guards";
17
+ import { PageAccessGuard, TrackDirtyFormDirective } from "@posiwise/core-guards";
16
18
  import { CoreTranslocoModule } from "@posiwise/core-transloco";
17
19
  import * as i8 from "@posiwise/directives";
18
20
  import { DirectivesModule } from "@posiwise/directives";
19
- import * as i9 from "@posiwise/pipes";
21
+ import * as i9$1 from "@posiwise/pipes";
20
22
  import { PipesModule } from "@posiwise/pipes";
21
23
  import * as i6$2 from "@posiwise/shared-components";
22
24
  import { CollapsibleSidebarTriggerDirective, SharedComponentsModule } from "@posiwise/shared-components";
23
- import * as i12 from "@posiwise/utils";
25
+ import * as i12$1 from "@posiwise/utils";
24
26
  import { CustomUploaderComponent, QuillHelper, ValidateForm, appendQueryParam, handleDateRangeSelection } from "@posiwise/utils";
25
27
  import * as i2 from "angular-plotly.js";
26
28
  import { PlotlyViaCDNModule } from "angular-plotly.js";
@@ -29,7 +31,7 @@ import { NgxDaterangepickerMd } from "ngx-daterangepicker-material";
29
31
  import * as i3$1 from "ngx-json-viewer";
30
32
  import { NgxJsonViewerModule } from "ngx-json-viewer";
31
33
  import { NgxPaginationModule } from "ngx-pagination";
32
- import * as i11 from "ngx-quill";
34
+ import * as i12 from "ngx-quill";
33
35
  import { QuillModule } from "ngx-quill";
34
36
  import * as i5 from "ngx-ui-switch";
35
37
  import { UiSwitchModule } from "ngx-ui-switch";
@@ -50,9 +52,9 @@ import * as i5$1 from "primeng/inputtext";
50
52
  import { InputTextModule } from "primeng/inputtext";
51
53
  import * as i4$2 from "primeng/multiselect";
52
54
  import { MultiSelectModule } from "primeng/multiselect";
53
- import * as i2$3 from "primeng/select";
55
+ import * as i2$2 from "primeng/select";
54
56
  import { SelectModule } from "primeng/select";
55
- import * as i2$4 from "primeng/table";
57
+ import * as i2$3 from "primeng/table";
56
58
  import { TableModule } from "primeng/table";
57
59
  import * as i3$3 from "primeng/tooltip";
58
60
  import { TooltipModule } from "primeng/tooltip";
@@ -61,13 +63,11 @@ import * as i3$2 from "@ng-bootstrap/ng-bootstrap";
61
63
  import { NgbActiveModal, NgbDatepickerModule, NgbModalModule, NgbNavModule, NgbTooltipModule } from "@ng-bootstrap/ng-bootstrap";
62
64
  import * as i7$2 from "@angular/router";
63
65
  import { RouterModule } from "@angular/router";
64
- import * as i2$1 from "@posiwise/core-guards";
65
- import { PageAccessGuard, unsavedChangesGuard } from "@posiwise/core-guards";
66
66
  import { AppBaseComponent } from "@posiwise/app-base-component";
67
67
  import * as i8$2 from "@jsverse/transloco";
68
68
  import { ADMIN_ROUTERS, PAGE_SIZE, PERMISSION_NAMES, SUBSCRIPTION_ANALYTICS_TYPES, TAG_ENTITY, TOKEN_HEADER_KEY } from "@posiwise/common-utilities";
69
69
  import { HelperService } from "@posiwise/helper-service";
70
- import * as i11$1 from "primeng/progressspinner";
70
+ import * as i11 from "primeng/progressspinner";
71
71
  import { __decorate } from "tslib";
72
72
  import * as i14 from "@angular/cdk/drag-drop";
73
73
  import { moveItemInArray } from "@angular/cdk/drag-drop";
@@ -195,7 +195,7 @@ var AmbassadorPayoutDetailsComponent = class AmbassadorPayoutDetailsComponent ex
195
195
  dependencies: [
196
196
  {
197
197
  kind: "component",
198
- type: i2$4.Table,
198
+ type: i2$3.Table,
199
199
  selector: "p-table",
200
200
  inputs: [
201
201
  "frozenColumns",
@@ -308,7 +308,7 @@ var AmbassadorPayoutDetailsComponent = class AmbassadorPayoutDetailsComponent ex
308
308
  },
309
309
  {
310
310
  kind: "directive",
311
- type: i2$4.ResizableColumn,
311
+ type: i2$3.ResizableColumn,
312
312
  selector: "[pResizableColumn]",
313
313
  inputs: ["pResizableColumnDisabled"]
314
314
  },
@@ -397,7 +397,7 @@ var AmbassadorPayoutDetailsComponent = class AmbassadorPayoutDetailsComponent ex
397
397
  },
398
398
  {
399
399
  kind: "pipe",
400
- type: i9.DateFormatPipe,
400
+ type: i9$1.DateFormatPipe,
401
401
  name: "dateFormat"
402
402
  }
403
403
  ]
@@ -570,7 +570,7 @@ var AmbassadorPayoutsListComponent = class AmbassadorPayoutsListComponent extend
570
570
  dependencies: [
571
571
  {
572
572
  kind: "component",
573
- type: i2$4.Table,
573
+ type: i2$3.Table,
574
574
  selector: "p-table",
575
575
  inputs: [
576
576
  "frozenColumns",
@@ -683,19 +683,19 @@ var AmbassadorPayoutsListComponent = class AmbassadorPayoutsListComponent extend
683
683
  },
684
684
  {
685
685
  kind: "directive",
686
- type: i2$4.SortableColumn,
686
+ type: i2$3.SortableColumn,
687
687
  selector: "[pSortableColumn]",
688
688
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
689
689
  },
690
690
  {
691
691
  kind: "directive",
692
- type: i2$4.ResizableColumn,
692
+ type: i2$3.ResizableColumn,
693
693
  selector: "[pResizableColumn]",
694
694
  inputs: ["pResizableColumnDisabled"]
695
695
  },
696
696
  {
697
697
  kind: "component",
698
- type: i2$4.SortIcon,
698
+ type: i2$3.SortIcon,
699
699
  selector: "p-sort-icon, p-sorticon",
700
700
  inputs: ["field"]
701
701
  },
@@ -947,7 +947,7 @@ var AmbassadorPayoutsListComponent = class AmbassadorPayoutsListComponent extend
947
947
  },
948
948
  {
949
949
  kind: "component",
950
- type: i11$1.ProgressSpinner,
950
+ type: i11.ProgressSpinner,
951
951
  selector: "p-progress-spinner, p-progressspinner",
952
952
  inputs: [
953
953
  "value",
@@ -1006,7 +1006,7 @@ var AmbassadorPayoutsListComponent = class AmbassadorPayoutsListComponent extend
1006
1006
  },
1007
1007
  {
1008
1008
  kind: "pipe",
1009
- type: i9.DateFormatPipe,
1009
+ type: i9$1.DateFormatPipe,
1010
1010
  name: "dateFormat"
1011
1011
  }
1012
1012
  ]
@@ -1117,6 +1117,7 @@ var GlobalConfigDetailsComponent = class GlobalConfigDetailsComponent extends Ap
1117
1117
  this.buttonBusy = true;
1118
1118
  const data = this.form.value;
1119
1119
  (this.id ? this.adminService.editGlobalConfig(this.id, data) : this.adminService.postGlobalConfig(data)).subscribe(() => {
1120
+ this.form.markAsPristine();
1120
1121
  this.toast.success(this.translation.translate("Admin.GlobalConfigMessage.UpdatedMessage"));
1121
1122
  this.back();
1122
1123
  this.cdr.markForCheck();
@@ -1164,7 +1165,7 @@ var GlobalConfigDetailsComponent = class GlobalConfigDetailsComponent extends Ap
1164
1165
  dependencies: [
1165
1166
  {
1166
1167
  kind: "component",
1167
- type: i2$3.Select,
1168
+ type: i2$2.Select,
1168
1169
  selector: "p-select",
1169
1170
  inputs: [
1170
1171
  "id",
@@ -1288,7 +1289,7 @@ var GlobalConfigDetailsComponent = class GlobalConfigDetailsComponent extends Ap
1288
1289
  },
1289
1290
  {
1290
1291
  kind: "component",
1291
- type: i11$1.ProgressSpinner,
1292
+ type: i11.ProgressSpinner,
1292
1293
  selector: "p-progress-spinner, p-progressspinner",
1293
1294
  inputs: [
1294
1295
  "value",
@@ -1354,6 +1355,11 @@ var GlobalConfigDetailsComponent = class GlobalConfigDetailsComponent extends Ap
1354
1355
  ],
1355
1356
  outputs: ["ngModelChange"]
1356
1357
  },
1358
+ {
1359
+ kind: "directive",
1360
+ type: i9.TrackDirtyFormDirective,
1361
+ selector: "[formGroup]:not([formGroupSkipDirty])"
1362
+ },
1357
1363
  {
1358
1364
  kind: "pipe",
1359
1365
  type: i8$2.TranslocoPipe,
@@ -1478,7 +1484,7 @@ var GlobalConfigListComponent = class GlobalConfigListComponent extends AppBaseC
1478
1484
  dependencies: [
1479
1485
  {
1480
1486
  kind: "component",
1481
- type: i2$4.Table,
1487
+ type: i2$3.Table,
1482
1488
  selector: "p-table",
1483
1489
  inputs: [
1484
1490
  "frozenColumns",
@@ -1591,19 +1597,19 @@ var GlobalConfigListComponent = class GlobalConfigListComponent extends AppBaseC
1591
1597
  },
1592
1598
  {
1593
1599
  kind: "directive",
1594
- type: i2$4.SortableColumn,
1600
+ type: i2$3.SortableColumn,
1595
1601
  selector: "[pSortableColumn]",
1596
1602
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
1597
1603
  },
1598
1604
  {
1599
1605
  kind: "directive",
1600
- type: i2$4.ResizableColumn,
1606
+ type: i2$3.ResizableColumn,
1601
1607
  selector: "[pResizableColumn]",
1602
1608
  inputs: ["pResizableColumnDisabled"]
1603
1609
  },
1604
1610
  {
1605
1611
  kind: "component",
1606
- type: i2$4.SortIcon,
1612
+ type: i2$3.SortIcon,
1607
1613
  selector: "p-sort-icon, p-sorticon",
1608
1614
  inputs: ["field"]
1609
1615
  },
@@ -1686,7 +1692,7 @@ var GlobalConfigListComponent = class GlobalConfigListComponent extends AppBaseC
1686
1692
  },
1687
1693
  {
1688
1694
  kind: "component",
1689
- type: i11$1.ProgressSpinner,
1695
+ type: i11.ProgressSpinner,
1690
1696
  selector: "p-progress-spinner, p-progressspinner",
1691
1697
  inputs: [
1692
1698
  "value",
@@ -1926,7 +1932,7 @@ var ContactUsListComponent = class ContactUsListComponent extends AppBaseCompone
1926
1932
  dependencies: [
1927
1933
  {
1928
1934
  kind: "component",
1929
- type: i2$4.Table,
1935
+ type: i2$3.Table,
1930
1936
  selector: "p-table",
1931
1937
  inputs: [
1932
1938
  "frozenColumns",
@@ -2039,19 +2045,19 @@ var ContactUsListComponent = class ContactUsListComponent extends AppBaseCompone
2039
2045
  },
2040
2046
  {
2041
2047
  kind: "directive",
2042
- type: i2$4.SortableColumn,
2048
+ type: i2$3.SortableColumn,
2043
2049
  selector: "[pSortableColumn]",
2044
2050
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
2045
2051
  },
2046
2052
  {
2047
2053
  kind: "directive",
2048
- type: i2$4.ResizableColumn,
2054
+ type: i2$3.ResizableColumn,
2049
2055
  selector: "[pResizableColumn]",
2050
2056
  inputs: ["pResizableColumnDisabled"]
2051
2057
  },
2052
2058
  {
2053
2059
  kind: "component",
2054
- type: i2$4.SortIcon,
2060
+ type: i2$3.SortIcon,
2055
2061
  selector: "p-sort-icon, p-sorticon",
2056
2062
  inputs: ["field"]
2057
2063
  },
@@ -2085,7 +2091,7 @@ var ContactUsListComponent = class ContactUsListComponent extends AppBaseCompone
2085
2091
  },
2086
2092
  {
2087
2093
  kind: "component",
2088
- type: i2$3.Select,
2094
+ type: i2$2.Select,
2089
2095
  selector: "p-select",
2090
2096
  inputs: [
2091
2097
  "id",
@@ -2204,7 +2210,7 @@ var ContactUsListComponent = class ContactUsListComponent extends AppBaseCompone
2204
2210
  },
2205
2211
  {
2206
2212
  kind: "component",
2207
- type: i11$1.ProgressSpinner,
2213
+ type: i11.ProgressSpinner,
2208
2214
  selector: "p-progress-spinner, p-progressspinner",
2209
2215
  inputs: [
2210
2216
  "value",
@@ -2239,12 +2245,12 @@ var ContactUsListComponent = class ContactUsListComponent extends AppBaseCompone
2239
2245
  },
2240
2246
  {
2241
2247
  kind: "pipe",
2242
- type: i9.DateFormatPipe,
2248
+ type: i9$1.DateFormatPipe,
2243
2249
  name: "dateFormat"
2244
2250
  },
2245
2251
  {
2246
2252
  kind: "pipe",
2247
- type: i9.TextTruncatePipe,
2253
+ type: i9$1.TextTruncatePipe,
2248
2254
  name: "textTruncate"
2249
2255
  }
2250
2256
  ]
@@ -2410,7 +2416,7 @@ var CredentialsComponent = class CredentialsComponent extends AppBaseComponent {
2410
2416
  dependencies: [
2411
2417
  {
2412
2418
  kind: "component",
2413
- type: i2$4.Table,
2419
+ type: i2$3.Table,
2414
2420
  selector: "p-table",
2415
2421
  inputs: [
2416
2422
  "frozenColumns",
@@ -2523,19 +2529,19 @@ var CredentialsComponent = class CredentialsComponent extends AppBaseComponent {
2523
2529
  },
2524
2530
  {
2525
2531
  kind: "directive",
2526
- type: i2$4.SortableColumn,
2532
+ type: i2$3.SortableColumn,
2527
2533
  selector: "[pSortableColumn]",
2528
2534
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
2529
2535
  },
2530
2536
  {
2531
2537
  kind: "directive",
2532
- type: i2$4.ResizableColumn,
2538
+ type: i2$3.ResizableColumn,
2533
2539
  selector: "[pResizableColumn]",
2534
2540
  inputs: ["pResizableColumnDisabled"]
2535
2541
  },
2536
2542
  {
2537
2543
  kind: "component",
2538
- type: i2$4.SortIcon,
2544
+ type: i2$3.SortIcon,
2539
2545
  selector: "p-sort-icon, p-sorticon",
2540
2546
  inputs: ["field"]
2541
2547
  },
@@ -2618,7 +2624,7 @@ var CredentialsComponent = class CredentialsComponent extends AppBaseComponent {
2618
2624
  },
2619
2625
  {
2620
2626
  kind: "component",
2621
- type: i11$1.ProgressSpinner,
2627
+ type: i11.ProgressSpinner,
2622
2628
  selector: "p-progress-spinner, p-progressspinner",
2623
2629
  inputs: [
2624
2630
  "value",
@@ -2739,6 +2745,7 @@ var CredentialsDetailsComponent = class CredentialsDetailsComponent extends AppB
2739
2745
  this.submitted = true;
2740
2746
  (this.id ? this.adminService.updateCredentials(this.id, this.form.value) : this.adminService.saveCredentials(this.form.value)).subscribe((response) => {
2741
2747
  this.form.patchValue(response);
2748
+ this.form.markAsPristine();
2742
2749
  this.toast.success(this.translation.translate("Credentials.UpdatedMessage"));
2743
2750
  this.back();
2744
2751
  this.cdr.markForCheck();
@@ -2832,7 +2839,7 @@ var CredentialsDetailsComponent = class CredentialsDetailsComponent extends AppB
2832
2839
  },
2833
2840
  {
2834
2841
  kind: "component",
2835
- type: i11$1.ProgressSpinner,
2842
+ type: i11.ProgressSpinner,
2836
2843
  selector: "p-progress-spinner, p-progressspinner",
2837
2844
  inputs: [
2838
2845
  "value",
@@ -2917,6 +2924,11 @@ var CredentialsDetailsComponent = class CredentialsDetailsComponent extends AppB
2917
2924
  ],
2918
2925
  outputs: ["ngModelChange"]
2919
2926
  },
2927
+ {
2928
+ kind: "directive",
2929
+ type: i9.TrackDirtyFormDirective,
2930
+ selector: "[formGroup]:not([formGroupSkipDirty])"
2931
+ },
2920
2932
  {
2921
2933
  kind: "pipe",
2922
2934
  type: i8$2.TranslocoPipe,
@@ -3130,7 +3142,7 @@ var SubscriptionCredentialsComponent = class SubscriptionCredentialsComponent ex
3130
3142
  dependencies: [
3131
3143
  {
3132
3144
  kind: "component",
3133
- type: i2$4.Table,
3145
+ type: i2$3.Table,
3134
3146
  selector: "p-table",
3135
3147
  inputs: [
3136
3148
  "frozenColumns",
@@ -3243,19 +3255,19 @@ var SubscriptionCredentialsComponent = class SubscriptionCredentialsComponent ex
3243
3255
  },
3244
3256
  {
3245
3257
  kind: "directive",
3246
- type: i2$4.SortableColumn,
3258
+ type: i2$3.SortableColumn,
3247
3259
  selector: "[pSortableColumn]",
3248
3260
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
3249
3261
  },
3250
3262
  {
3251
3263
  kind: "directive",
3252
- type: i2$4.ResizableColumn,
3264
+ type: i2$3.ResizableColumn,
3253
3265
  selector: "[pResizableColumn]",
3254
3266
  inputs: ["pResizableColumnDisabled"]
3255
3267
  },
3256
3268
  {
3257
3269
  kind: "component",
3258
- type: i2$4.SortIcon,
3270
+ type: i2$3.SortIcon,
3259
3271
  selector: "p-sort-icon, p-sorticon",
3260
3272
  inputs: ["field"]
3261
3273
  },
@@ -3289,7 +3301,7 @@ var SubscriptionCredentialsComponent = class SubscriptionCredentialsComponent ex
3289
3301
  },
3290
3302
  {
3291
3303
  kind: "component",
3292
- type: i2$3.Select,
3304
+ type: i2$2.Select,
3293
3305
  selector: "p-select",
3294
3306
  inputs: [
3295
3307
  "id",
@@ -3408,7 +3420,7 @@ var SubscriptionCredentialsComponent = class SubscriptionCredentialsComponent ex
3408
3420
  },
3409
3421
  {
3410
3422
  kind: "component",
3411
- type: i11$1.ProgressSpinner,
3423
+ type: i11.ProgressSpinner,
3412
3424
  selector: "p-progress-spinner, p-progressspinner",
3413
3425
  inputs: [
3414
3426
  "value",
@@ -3533,6 +3545,7 @@ var SubscriptionCredentialsDetailsComponent = class SubscriptionCredentialsDetai
3533
3545
  this.submitted = true;
3534
3546
  const data = this.form.value;
3535
3547
  (this.id ? this.adminService.editSubscriptionCredential(this.id, data) : this.adminService.postSubscriptionCredential(data)).subscribe(() => {
3548
+ this.form.markAsPristine();
3536
3549
  this.toast.success(this.translation.translate("Credentials.UpdatedMessage"));
3537
3550
  this.back();
3538
3551
  this.cdr.markForCheck();
@@ -3580,7 +3593,7 @@ var SubscriptionCredentialsDetailsComponent = class SubscriptionCredentialsDetai
3580
3593
  dependencies: [
3581
3594
  {
3582
3595
  kind: "component",
3583
- type: i2$3.Select,
3596
+ type: i2$2.Select,
3584
3597
  selector: "p-select",
3585
3598
  inputs: [
3586
3599
  "id",
@@ -3676,7 +3689,7 @@ var SubscriptionCredentialsDetailsComponent = class SubscriptionCredentialsDetai
3676
3689
  },
3677
3690
  {
3678
3691
  kind: "component",
3679
- type: i11$1.ProgressSpinner,
3692
+ type: i11.ProgressSpinner,
3680
3693
  selector: "p-progress-spinner, p-progressspinner",
3681
3694
  inputs: [
3682
3695
  "value",
@@ -3742,6 +3755,11 @@ var SubscriptionCredentialsDetailsComponent = class SubscriptionCredentialsDetai
3742
3755
  ],
3743
3756
  outputs: ["ngModelChange"]
3744
3757
  },
3758
+ {
3759
+ kind: "directive",
3760
+ type: i9.TrackDirtyFormDirective,
3761
+ selector: "[formGroup]:not([formGroupSkipDirty])"
3762
+ },
3745
3763
  {
3746
3764
  kind: "pipe",
3747
3765
  type: i8$2.TranslocoPipe,
@@ -4394,6 +4412,7 @@ var DomainConfigBuildComponent = class DomainConfigBuildComponent extends AppBas
4394
4412
  data["cs_cta_iframe"] = this.form.value?.cs_cta_iframe ?? "";
4395
4413
  data["trial_cta_iframe"] = this.form.value?.trial_cta_iframe ?? "";
4396
4414
  (this.id ? this.adminService.updateDomainConfig(this.id, data) : this.adminService.createDomainConfig(data)).subscribe({ next: () => {
4415
+ this.form.markAsPristine();
4397
4416
  this.toast.success(this.translation.translate("Admin.DomainConfig.UpdatedMessage"));
4398
4417
  this.cdr.markForCheck();
4399
4418
  } }).add(() => {
@@ -4411,7 +4430,7 @@ var DomainConfigBuildComponent = class DomainConfigBuildComponent extends AppBas
4411
4430
  deps: [
4412
4431
  { token: i0.Injector },
4413
4432
  { token: i1$1.AdminService },
4414
- { token: i2$2.ProductService },
4433
+ { token: i2$1.ProductService },
4415
4434
  { token: i3$2.NgbModal },
4416
4435
  { token: i0.ChangeDetectorRef },
4417
4436
  { token: i10.FormBuilder }
@@ -4584,7 +4603,7 @@ var DomainConfigBuildComponent = class DomainConfigBuildComponent extends AppBas
4584
4603
  },
4585
4604
  {
4586
4605
  kind: "component",
4587
- type: i2$3.Select,
4606
+ type: i2$2.Select,
4588
4607
  selector: "p-select",
4589
4608
  inputs: [
4590
4609
  "id",
@@ -4708,7 +4727,7 @@ var DomainConfigBuildComponent = class DomainConfigBuildComponent extends AppBas
4708
4727
  },
4709
4728
  {
4710
4729
  kind: "component",
4711
- type: i11$1.ProgressSpinner,
4730
+ type: i11.ProgressSpinner,
4712
4731
  selector: "p-progress-spinner, p-progressspinner",
4713
4732
  inputs: [
4714
4733
  "value",
@@ -4722,7 +4741,7 @@ var DomainConfigBuildComponent = class DomainConfigBuildComponent extends AppBas
4722
4741
  },
4723
4742
  {
4724
4743
  kind: "component",
4725
- type: i12.ProfileImageCropperComponent,
4744
+ type: i12$1.ProfileImageCropperComponent,
4726
4745
  selector: "pw-image-cropper",
4727
4746
  inputs: ["aspectRatio", "dynamicData"],
4728
4747
  outputs: [
@@ -4733,7 +4752,7 @@ var DomainConfigBuildComponent = class DomainConfigBuildComponent extends AppBas
4733
4752
  },
4734
4753
  {
4735
4754
  kind: "component",
4736
- type: i12.CustomUploaderComponent,
4755
+ type: i12$1.CustomUploaderComponent,
4737
4756
  selector: "pw-custom-uploader",
4738
4757
  inputs: [
4739
4758
  "controlName",
@@ -4874,6 +4893,11 @@ var DomainConfigBuildComponent = class DomainConfigBuildComponent extends AppBas
4874
4893
  selector: "[formArrayName]",
4875
4894
  inputs: ["formArrayName"]
4876
4895
  },
4896
+ {
4897
+ kind: "directive",
4898
+ type: i9.TrackDirtyFormDirective,
4899
+ selector: "[formGroup]:not([formGroupSkipDirty])"
4900
+ },
4877
4901
  {
4878
4902
  kind: "pipe",
4879
4903
  type: i8$2.TranslocoPipe,
@@ -4900,7 +4924,7 @@ i0.ɵɵngDeclareClassMetadata({
4900
4924
  ctorParameters: () => [
4901
4925
  { type: i0.Injector },
4902
4926
  { type: i1$1.AdminService },
4903
- { type: i2$2.ProductService },
4927
+ { type: i2$1.ProductService },
4904
4928
  { type: i3$2.NgbModal },
4905
4929
  { type: i0.ChangeDetectorRef },
4906
4930
  { type: i10.FormBuilder }
@@ -4988,6 +5012,7 @@ var DomainConfigCoreComponent = class DomainConfigCoreComponent extends AppBaseC
4988
5012
  };
4989
5013
  if (!this.id) data.master_subscription_id = this.appConfig?.master_subscription?.subscription_id;
4990
5014
  (this.id ? this.adminService.updateDomainConfig(this.id, data) : this.adminService.createDomainConfig(data)).subscribe({ next: (res) => {
5015
+ this.form.markAsPristine();
4991
5016
  this.toast.success(this.translation.translate("Admin.DomainConfig.UpdatedMessage"));
4992
5017
  this.router.navigate([`${this.routers.domainConfigDetails}${this.id ? this.id : res.id}`], { queryParams: {
4993
5018
  tabId: "Organization",
@@ -5027,7 +5052,7 @@ var DomainConfigCoreComponent = class DomainConfigCoreComponent extends AppBaseC
5027
5052
  dependencies: [
5028
5053
  {
5029
5054
  kind: "component",
5030
- type: i2$3.Select,
5055
+ type: i2$2.Select,
5031
5056
  selector: "p-select",
5032
5057
  inputs: [
5033
5058
  "id",
@@ -5123,7 +5148,7 @@ var DomainConfigCoreComponent = class DomainConfigCoreComponent extends AppBaseC
5123
5148
  },
5124
5149
  {
5125
5150
  kind: "component",
5126
- type: i11$1.ProgressSpinner,
5151
+ type: i11.ProgressSpinner,
5127
5152
  selector: "p-progress-spinner, p-progressspinner",
5128
5153
  inputs: [
5129
5154
  "value",
@@ -5189,6 +5214,11 @@ var DomainConfigCoreComponent = class DomainConfigCoreComponent extends AppBaseC
5189
5214
  ],
5190
5215
  outputs: ["ngModelChange"]
5191
5216
  },
5217
+ {
5218
+ kind: "directive",
5219
+ type: i9.TrackDirtyFormDirective,
5220
+ selector: "[formGroup]:not([formGroupSkipDirty])"
5221
+ },
5192
5222
  {
5193
5223
  kind: "pipe",
5194
5224
  type: i8$2.TranslocoPipe,
@@ -5260,6 +5290,7 @@ var BaseDomainConfigComponent = class BaseDomainConfigComponent extends AppBaseC
5260
5290
  subscription_id: this.subscriptionId
5261
5291
  };
5262
5292
  (this.id ? this.adminService.updateDomainConfig(this.id, data) : this.adminService.createDomainConfig(data)).subscribe({ next: (res) => {
5293
+ this.form.markAsPristine();
5263
5294
  this.toast.success(this.translation.translate("Admin.DomainConfig.UpdatedMessage"));
5264
5295
  this.router.navigate([`${this.routers.domainConfigDetails}${this.id ? this.id : res.id}`], { queryParams: {
5265
5296
  tabId: this.getTabId(),
@@ -5384,7 +5415,7 @@ var DomainConfigOrganizationComponent = class DomainConfigOrganizationComponent
5384
5415
  },
5385
5416
  {
5386
5417
  kind: "component",
5387
- type: i11$1.ProgressSpinner,
5418
+ type: i11.ProgressSpinner,
5388
5419
  selector: "p-progress-spinner, p-progressspinner",
5389
5420
  inputs: [
5390
5421
  "value",
@@ -5454,6 +5485,11 @@ var DomainConfigOrganizationComponent = class DomainConfigOrganizationComponent
5454
5485
  ],
5455
5486
  outputs: ["ngModelChange"]
5456
5487
  },
5488
+ {
5489
+ kind: "directive",
5490
+ type: i9.TrackDirtyFormDirective,
5491
+ selector: "[formGroup]:not([formGroupSkipDirty])"
5492
+ },
5457
5493
  {
5458
5494
  kind: "pipe",
5459
5495
  type: i8$2.TranslocoPipe,
@@ -5581,7 +5617,7 @@ var DomainConfigSecurityComponent = class DomainConfigSecurityComponent extends
5581
5617
  },
5582
5618
  {
5583
5619
  kind: "component",
5584
- type: i11$1.ProgressSpinner,
5620
+ type: i11.ProgressSpinner,
5585
5621
  selector: "p-progress-spinner, p-progressspinner",
5586
5622
  inputs: [
5587
5623
  "value",
@@ -5651,6 +5687,11 @@ var DomainConfigSecurityComponent = class DomainConfigSecurityComponent extends
5651
5687
  ],
5652
5688
  outputs: ["ngModelChange"]
5653
5689
  },
5690
+ {
5691
+ kind: "directive",
5692
+ type: i9.TrackDirtyFormDirective,
5693
+ selector: "[formGroup]:not([formGroupSkipDirty])"
5694
+ },
5654
5695
  {
5655
5696
  kind: "pipe",
5656
5697
  type: i8$2.TranslocoPipe,
@@ -5743,7 +5784,7 @@ var DomainConfigSocialComponent = class DomainConfigSocialComponent extends Base
5743
5784
  },
5744
5785
  {
5745
5786
  kind: "component",
5746
- type: i11$1.ProgressSpinner,
5787
+ type: i11.ProgressSpinner,
5747
5788
  selector: "p-progress-spinner, p-progressspinner",
5748
5789
  inputs: [
5749
5790
  "value",
@@ -5813,6 +5854,11 @@ var DomainConfigSocialComponent = class DomainConfigSocialComponent extends Base
5813
5854
  ],
5814
5855
  outputs: ["ngModelChange"]
5815
5856
  },
5857
+ {
5858
+ kind: "directive",
5859
+ type: i9.TrackDirtyFormDirective,
5860
+ selector: "[formGroup]:not([formGroupSkipDirty])"
5861
+ },
5816
5862
  {
5817
5863
  kind: "pipe",
5818
5864
  type: i8$2.TranslocoPipe,
@@ -5882,6 +5928,7 @@ var DomainConfigIntegrationsComponent = class DomainConfigIntegrationsComponent
5882
5928
  subscription_id: this.subscriptionId
5883
5929
  };
5884
5930
  (this.id ? this.adminService.updateDomainConfig(this.id, data) : this.adminService.createDomainConfig(data)).subscribe({ next: (res) => {
5931
+ this.form.markAsPristine();
5885
5932
  this.toast.success(this.translation.translate("Admin.DomainConfig.UpdatedMessage"));
5886
5933
  this.router.navigate([`${this.routers.domainConfigDetails}${this.id ? this.id : res.id}`], { queryParams: {
5887
5934
  tabId: "Login & SSO",
@@ -5947,7 +5994,7 @@ var DomainConfigIntegrationsComponent = class DomainConfigIntegrationsComponent
5947
5994
  },
5948
5995
  {
5949
5996
  kind: "component",
5950
- type: i11$1.ProgressSpinner,
5997
+ type: i11.ProgressSpinner,
5951
5998
  selector: "p-progress-spinner, p-progressspinner",
5952
5999
  inputs: [
5953
6000
  "value",
@@ -6017,6 +6064,11 @@ var DomainConfigIntegrationsComponent = class DomainConfigIntegrationsComponent
6017
6064
  ],
6018
6065
  outputs: ["ngModelChange"]
6019
6066
  },
6067
+ {
6068
+ kind: "directive",
6069
+ type: i9.TrackDirtyFormDirective,
6070
+ selector: "[formGroup]:not([formGroupSkipDirty])"
6071
+ },
6020
6072
  {
6021
6073
  kind: "pipe",
6022
6074
  type: i8$2.TranslocoPipe,
@@ -6236,6 +6288,7 @@ var DomainConfigInterfaceComponent = class DomainConfigInterfaceComponent extend
6236
6288
  };
6237
6289
  const filteredData = Object.fromEntries(Object.entries(data).filter(([_key, value]) => value !== null && value !== ""));
6238
6290
  (this.id ? this.adminService.updateDomainConfig(this.id, filteredData) : this.adminService.createDomainConfig(filteredData)).subscribe({ next: (res) => {
6291
+ this.form.markAsPristine();
6239
6292
  this.toast.success(this.translation.translate("Admin.DomainConfig.UpdatedMessage"));
6240
6293
  this.router.navigate([`${this.routers.domainConfigDetails}${this.id ? this.id : res.id}`], { queryParams: {
6241
6294
  tabId: "Public Pages",
@@ -6307,7 +6360,7 @@ var DomainConfigInterfaceComponent = class DomainConfigInterfaceComponent extend
6307
6360
  },
6308
6361
  {
6309
6362
  kind: "component",
6310
- type: i11$1.ProgressSpinner,
6363
+ type: i11.ProgressSpinner,
6311
6364
  selector: "p-progress-spinner, p-progressspinner",
6312
6365
  inputs: [
6313
6366
  "value",
@@ -6321,7 +6374,7 @@ var DomainConfigInterfaceComponent = class DomainConfigInterfaceComponent extend
6321
6374
  },
6322
6375
  {
6323
6376
  kind: "component",
6324
- type: i12.CustomUploaderComponent,
6377
+ type: i12$1.CustomUploaderComponent,
6325
6378
  selector: "pw-custom-uploader",
6326
6379
  inputs: [
6327
6380
  "controlName",
@@ -6389,6 +6442,11 @@ var DomainConfigInterfaceComponent = class DomainConfigInterfaceComponent extend
6389
6442
  ],
6390
6443
  outputs: ["ngModelChange"]
6391
6444
  },
6445
+ {
6446
+ kind: "directive",
6447
+ type: i9.TrackDirtyFormDirective,
6448
+ selector: "[formGroup]:not([formGroupSkipDirty])"
6449
+ },
6392
6450
  {
6393
6451
  kind: "pipe",
6394
6452
  type: i8$2.TranslocoPipe,
@@ -6820,7 +6878,7 @@ var DomainConfigListComponent = class DomainConfigListComponent extends AppBaseC
6820
6878
  dependencies: [
6821
6879
  {
6822
6880
  kind: "component",
6823
- type: i2$4.Table,
6881
+ type: i2$3.Table,
6824
6882
  selector: "p-table",
6825
6883
  inputs: [
6826
6884
  "frozenColumns",
@@ -6933,19 +6991,19 @@ var DomainConfigListComponent = class DomainConfigListComponent extends AppBaseC
6933
6991
  },
6934
6992
  {
6935
6993
  kind: "directive",
6936
- type: i2$4.SortableColumn,
6994
+ type: i2$3.SortableColumn,
6937
6995
  selector: "[pSortableColumn]",
6938
6996
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
6939
6997
  },
6940
6998
  {
6941
6999
  kind: "directive",
6942
- type: i2$4.ResizableColumn,
7000
+ type: i2$3.ResizableColumn,
6943
7001
  selector: "[pResizableColumn]",
6944
7002
  inputs: ["pResizableColumnDisabled"]
6945
7003
  },
6946
7004
  {
6947
7005
  kind: "component",
6948
- type: i2$4.SortIcon,
7006
+ type: i2$3.SortIcon,
6949
7007
  selector: "p-sort-icon, p-sorticon",
6950
7008
  inputs: ["field"]
6951
7009
  },
@@ -7028,7 +7086,7 @@ var DomainConfigListComponent = class DomainConfigListComponent extends AppBaseC
7028
7086
  },
7029
7087
  {
7030
7088
  kind: "component",
7031
- type: i11$1.ProgressSpinner,
7089
+ type: i11.ProgressSpinner,
7032
7090
  selector: "p-progress-spinner, p-progressspinner",
7033
7091
  inputs: [
7034
7092
  "value",
@@ -7253,6 +7311,7 @@ var AddEditFaqComponent = class AddEditFaqComponent extends AppBaseComponent {
7253
7311
  (this.isEdit ? this.adminService.putFaq({ ...payload }, this.subscriptionId) : this.adminService.postFaq(payload, this.subscriptionId)).subscribe(() => {
7254
7312
  const key = this.isEdit ? "Admin.Faq.UpdatedMessage" : "Admin.Faq.AddMessage";
7255
7313
  this.toast.success(this.translation.translate(key));
7314
+ this.form.markAsPristine();
7256
7315
  this.router.navigate([`${this.routers.faqConfig}`]);
7257
7316
  }).add(() => {
7258
7317
  this.buttonBusy = false;
@@ -7302,9 +7361,9 @@ var AddEditFaqComponent = class AddEditFaqComponent extends AppBaseComponent {
7302
7361
  ngImport: i0,
7303
7362
  type: AddEditFaqComponent,
7304
7363
  deps: [
7305
- { token: i2$2.CommonService },
7364
+ { token: i2$1.CommonService },
7306
7365
  { token: i1$1.AdminService },
7307
- { token: i2$2.ProductService },
7366
+ { token: i2$1.ProductService },
7308
7367
  { token: i0.Injector },
7309
7368
  { token: i0.ChangeDetectorRef }
7310
7369
  ],
@@ -7331,7 +7390,7 @@ var AddEditFaqComponent = class AddEditFaqComponent extends AppBaseComponent {
7331
7390
  dependencies: [
7332
7391
  {
7333
7392
  kind: "component",
7334
- type: i2$3.Select,
7393
+ type: i2$2.Select,
7335
7394
  selector: "p-select",
7336
7395
  inputs: [
7337
7396
  "id",
@@ -7551,7 +7610,7 @@ var AddEditFaqComponent = class AddEditFaqComponent extends AppBaseComponent {
7551
7610
  },
7552
7611
  {
7553
7612
  kind: "component",
7554
- type: i11$1.ProgressSpinner,
7613
+ type: i11.ProgressSpinner,
7555
7614
  selector: "p-progress-spinner, p-progressspinner",
7556
7615
  inputs: [
7557
7616
  "value",
@@ -7617,9 +7676,14 @@ var AddEditFaqComponent = class AddEditFaqComponent extends AppBaseComponent {
7617
7676
  ],
7618
7677
  outputs: ["ngModelChange"]
7619
7678
  },
7679
+ {
7680
+ kind: "directive",
7681
+ type: i9.TrackDirtyFormDirective,
7682
+ selector: "[formGroup]:not([formGroupSkipDirty])"
7683
+ },
7620
7684
  {
7621
7685
  kind: "component",
7622
- type: i11.QuillEditorComponent,
7686
+ type: i12.QuillEditorComponent,
7623
7687
  selector: "quill-editor"
7624
7688
  },
7625
7689
  {
@@ -7646,9 +7710,9 @@ i0.ɵɵngDeclareClassMetadata({
7646
7710
  }]
7647
7711
  }],
7648
7712
  ctorParameters: () => [
7649
- { type: i2$2.CommonService },
7713
+ { type: i2$1.CommonService },
7650
7714
  { type: i1$1.AdminService },
7651
- { type: i2$2.ProductService },
7715
+ { type: i2$1.ProductService },
7652
7716
  { type: i0.Injector },
7653
7717
  { type: i0.ChangeDetectorRef }
7654
7718
  ],
@@ -7881,9 +7945,9 @@ var FaqListComponent = class FaqListComponent extends AppBaseComponent {
7881
7945
  ngImport: i0,
7882
7946
  type: FaqListComponent,
7883
7947
  deps: [
7884
- { token: i2$2.CommonService },
7948
+ { token: i2$1.CommonService },
7885
7949
  { token: i1$1.AdminService },
7886
- { token: i2$2.ProductService },
7950
+ { token: i2$1.ProductService },
7887
7951
  { token: i0.Injector },
7888
7952
  { token: i0.ChangeDetectorRef },
7889
7953
  { token: i6$2.ConfirmDialogService }
@@ -7911,7 +7975,7 @@ var FaqListComponent = class FaqListComponent extends AppBaseComponent {
7911
7975
  dependencies: [
7912
7976
  {
7913
7977
  kind: "component",
7914
- type: i2$4.Table,
7978
+ type: i2$3.Table,
7915
7979
  selector: "p-table",
7916
7980
  inputs: [
7917
7981
  "frozenColumns",
@@ -8024,7 +8088,7 @@ var FaqListComponent = class FaqListComponent extends AppBaseComponent {
8024
8088
  },
8025
8089
  {
8026
8090
  kind: "directive",
8027
- type: i2$4.ResizableColumn,
8091
+ type: i2$3.ResizableColumn,
8028
8092
  selector: "[pResizableColumn]",
8029
8093
  inputs: ["pResizableColumnDisabled"]
8030
8094
  },
@@ -8192,7 +8256,7 @@ var FaqListComponent = class FaqListComponent extends AppBaseComponent {
8192
8256
  },
8193
8257
  {
8194
8258
  kind: "component",
8195
- type: i11$1.ProgressSpinner,
8259
+ type: i11.ProgressSpinner,
8196
8260
  selector: "p-progress-spinner, p-progressspinner",
8197
8261
  inputs: [
8198
8262
  "value",
@@ -8257,12 +8321,12 @@ var FaqListComponent = class FaqListComponent extends AppBaseComponent {
8257
8321
  },
8258
8322
  {
8259
8323
  kind: "pipe",
8260
- type: i9.RemoveHtmlPipe,
8324
+ type: i9$1.RemoveHtmlPipe,
8261
8325
  name: "removeHtml"
8262
8326
  },
8263
8327
  {
8264
8328
  kind: "pipe",
8265
- type: i9.TextTruncatePipe,
8329
+ type: i9$1.TextTruncatePipe,
8266
8330
  name: "textTruncate"
8267
8331
  }
8268
8332
  ]
@@ -8284,9 +8348,9 @@ i0.ɵɵngDeclareClassMetadata({
8284
8348
  }]
8285
8349
  }],
8286
8350
  ctorParameters: () => [
8287
- { type: i2$2.CommonService },
8351
+ { type: i2$1.CommonService },
8288
8352
  { type: i1$1.AdminService },
8289
- { type: i2$2.ProductService },
8353
+ { type: i2$1.ProductService },
8290
8354
  { type: i0.Injector },
8291
8355
  { type: i0.ChangeDetectorRef },
8292
8356
  { type: i6$2.ConfirmDialogService }
@@ -8349,22 +8413,19 @@ i0.ɵɵngDeclareClassMetadata({
8349
8413
  }]
8350
8414
  });
8351
8415
  var FeatureFlagDetailsComponent = class FeatureFlagDetailsComponent extends AppBaseComponent {
8352
- constructor(injector, adminService, unsavedChanges) {
8416
+ constructor(injector, adminService) {
8353
8417
  super(injector);
8354
8418
  this.adminService = adminService;
8355
- this.unsavedChanges = unsavedChanges;
8356
8419
  this.form = AppAdmin.getFeatureFlagForm();
8357
8420
  this.routers = ROUTERS;
8358
8421
  this.id = 0;
8359
8422
  this.isLoading = true;
8360
8423
  this.submitted = false;
8361
8424
  this.buttonBusy = false;
8362
- this.saved = false;
8363
8425
  this.flagTypeOptions = [];
8364
8426
  this.statusOptions = [];
8365
8427
  this.allUsers = [];
8366
8428
  this.filteredUsers = [];
8367
- this.unregisterUnsaved = null;
8368
8429
  }
8369
8430
  ngOnInit() {
8370
8431
  this.subscriptionId = PermissionService.selectedSubscription?.id;
@@ -8375,14 +8436,6 @@ var FeatureFlagDetailsComponent = class FeatureFlagDetailsComponent extends AppB
8375
8436
  if (this.id) this.getFeatureFlag();
8376
8437
  else this.isLoading = false;
8377
8438
  });
8378
- this.unregisterUnsaved = this.unsavedChanges.watch(() => this.hasUnsavedChanges());
8379
- }
8380
- ngOnDestroy() {
8381
- this.unregisterUnsaved?.();
8382
- super.ngOnDestroy();
8383
- }
8384
- hasUnsavedChanges() {
8385
- return this.form.dirty && !this.saved;
8386
8439
  }
8387
8440
  loadSupportedOptions() {
8388
8441
  this.adminService.getSupportedFeatureFlagOptions().subscribe((response) => {
@@ -8444,7 +8497,6 @@ var FeatureFlagDetailsComponent = class FeatureFlagDetailsComponent extends AppB
8444
8497
  next: () => {
8445
8498
  this.toast.success(this.id ? "Feature flag updated successfully." : "Feature flag created successfully.");
8446
8499
  this.form.markAsPristine();
8447
- this.saved = true;
8448
8500
  this.router.navigate([this.routers.featureFlagsConfig]);
8449
8501
  },
8450
8502
  complete: () => {
@@ -8461,11 +8513,7 @@ var FeatureFlagDetailsComponent = class FeatureFlagDetailsComponent extends AppB
8461
8513
  version: "22.2.0",
8462
8514
  ngImport: i0,
8463
8515
  type: FeatureFlagDetailsComponent,
8464
- deps: [
8465
- { token: i0.Injector },
8466
- { token: i1$1.AdminService },
8467
- { token: i2$1.UnsavedChangesService }
8468
- ],
8516
+ deps: [{ token: i0.Injector }, { token: i1$1.AdminService }],
8469
8517
  target: i0.ɵɵFactoryTarget.Component
8470
8518
  });
8471
8519
  }
@@ -8561,7 +8609,7 @@ var FeatureFlagDetailsComponent = class FeatureFlagDetailsComponent extends AppB
8561
8609
  },
8562
8610
  {
8563
8611
  kind: "component",
8564
- type: i2$3.Select,
8612
+ type: i2$2.Select,
8565
8613
  selector: "p-select",
8566
8614
  inputs: [
8567
8615
  "id",
@@ -8735,7 +8783,7 @@ var FeatureFlagDetailsComponent = class FeatureFlagDetailsComponent extends AppB
8735
8783
  },
8736
8784
  {
8737
8785
  kind: "component",
8738
- type: i11$1.ProgressSpinner,
8786
+ type: i11.ProgressSpinner,
8739
8787
  selector: "p-progress-spinner, p-progressspinner",
8740
8788
  inputs: [
8741
8789
  "value",
@@ -8814,6 +8862,11 @@ var FeatureFlagDetailsComponent = class FeatureFlagDetailsComponent extends AppB
8814
8862
  ],
8815
8863
  outputs: ["ngModelChange"]
8816
8864
  },
8865
+ {
8866
+ kind: "directive",
8867
+ type: i9.TrackDirtyFormDirective,
8868
+ selector: "[formGroup]:not([formGroupSkipDirty])"
8869
+ },
8817
8870
  {
8818
8871
  kind: "pipe",
8819
8872
  type: i8$2.TranslocoPipe,
@@ -8836,11 +8889,7 @@ i0.ɵɵngDeclareClassMetadata({
8836
8889
  template: "<div class=\"container-fluid pw-tab\">\n <div class=\"dashboard\">\n <div class=\"dashboard-body\">\n <div class=\"me-auto col-xs-6 mt-4\">\n <a routerLink=\"/admin/feature-flags/list\" class=\"previous\" aria-label=\"Back to feature flags list\">\n <i class=\"fa fa-arrow-alt-circle-left\" aria-hidden=\"true\"></i>\n </a>\n <h3 class=\"mt-3\">{{ id ? 'Edit' : 'Add New' }} Feature Flag</h3>\n </div>\n\n @if (isLoading) {\n <div class=\"w-100 text-center mt-3\">\n <p-progress-spinner strokeWidth=\"2\"></p-progress-spinner>\n </div>\n }\n\n <div class=\"p-2 mt-3\">\n @if (!isLoading) {\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\n <div class=\"row\">\n <pw-input-container class=\"col-lg-6\" label=\"Key\" name=\"key\" controlId=\"feature-flag-key\" errorMsg=\"Key is required\"\n [showTooltip]=\"true\" [tooltipText]=\"'FeatureFlag.Tooltip.Key' | transloco\">\n <input type=\"text\" id=\"feature-flag-key\" formControlName=\"key\" class=\"form-control\" [placeholder]=\"'FeatureFlag.Placeholder.Key' | transloco\" [ngClass]=\"{ 'is-invalid': submitted && f['key'].errors }\"\n aria-label=\"Key\" />\n </pw-input-container>\n\n <pw-input-container class=\"col-lg-6\" label=\"Name\" name=\"name\" controlId=\"feature-flag-name\" errorMsg=\"Name is required\"\n [showTooltip]=\"true\" [tooltipText]=\"'FeatureFlag.Tooltip.Name' | transloco\">\n <input type=\"text\" id=\"feature-flag-name\" formControlName=\"name\" class=\"form-control\" [placeholder]=\"'FeatureFlag.Placeholder.Name' | transloco\" [ngClass]=\"{ 'is-invalid': submitted && f['name'].errors }\"\n aria-label=\"Name\" />\n </pw-input-container>\n\n <pw-input-container class=\"col-lg-12\" label=\"Description\" name=\"description\" controlId=\"feature-flag-description\">\n <textarea id=\"feature-flag-description\" formControlName=\"description\" rows=\"4\" class=\"form-control\" [placeholder]=\"'FeatureFlag.Placeholder.Description' | transloco\"\n aria-label=\"Description\"></textarea>\n </pw-input-container>\n\n <pw-input-container class=\"col-lg-3\" label=\"Type\" name=\"flag_type\" controlId=\"feature-flag-type\" [useAriaLabelledbyOnly]=\"true\">\n <p-select [options]=\"flagTypeOptions\" [attr.aria-labelledby]=\"'feature-flag-type-label'\" formControlName=\"flag_type\" class=\"dropdown-bg-transparent\" [placeholder]=\"'FeatureFlag.Placeholder.Type' | transloco\"></p-select>\n </pw-input-container>\n\n <pw-input-container class=\"col-lg-3\" label=\"Status\" name=\"status\" controlId=\"feature-flag-status\" [useAriaLabelledbyOnly]=\"true\">\n <p-select [options]=\"statusOptions\" [attr.aria-labelledby]=\"'feature-flag-status-label'\" formControlName=\"status\" class=\"dropdown-bg-transparent\" [placeholder]=\"'FeatureFlag.Placeholder.Status' | transloco\"></p-select>\n </pw-input-container>\n\n <pw-input-container class=\"col-lg-3\" label=\"Owner\" name=\"owner\" controlId=\"feature-flag-owner\" [useAriaLabelledbyOnly]=\"true\">\n <p-auto-complete class=\"w-100\" appendTo=\"body\"\n [suggestions]=\"filteredUsers\"\n [attr.aria-labelledby]=\"'feature-flag-owner-label'\"\n formControlName=\"owner\"\n dataKey=\"id\"\n optionLabel=\"displayName\"\n [dropdown]=\"true\"\n (completeMethod)=\"searchOwners($event)\"\n [placeholder]=\"'FeatureFlag.Placeholder.Owner' | transloco\"\n [multiple]=\"false\"\n autocomplete=\"off\">\n <ng-template let-item #item>\n <span [title]=\"item.displayName\">{{ item.displayName }}</span>\n </ng-template>\n </p-auto-complete>\n </pw-input-container>\n\n <pw-input-container class=\"col-lg-3\" label=\"Expires At\" name=\"expires_at\" controlId=\"feature-flag-expires_at\" [useAriaLabelledbyOnly]=\"true\">\n <p-datepicker inputId=\"feature-flag-expires_at\" formControlName=\"expires_at\" [showIcon]=\"true\" [showTime]=\"true\" [appendTo]=\"'body'\" dateFormat=\"dd-M-yy\" [placeholder]=\"'FeatureFlag.Placeholder.ExpiresAt' | transloco\"></p-datepicker>\n </pw-input-container>\n </div>\n\n <div class=\"row\">\n <div class=\"col-12 mt-4\">\n <div class=\"mb-3 text-end\">\n <button type=\"button\" class=\"btn btn-outline-default me-2\" (click)=\"onCancel()\">{{ 'Button.Cancel' | transloco }}</button>\n <button class=\"btn btn-primary\" [buttonBusy]=\"buttonBusy\">{{ 'Button.Save' | transloco }}</button>\n </div>\n </div>\n </div>\n </form>\n }\n </div>\n </div>\n </div>\n</div>"
8837
8890
  }]
8838
8891
  }],
8839
- ctorParameters: () => [
8840
- { type: i0.Injector },
8841
- { type: i1$1.AdminService },
8842
- { type: i2$1.UnsavedChangesService }
8843
- ]
8892
+ ctorParameters: () => [{ type: i0.Injector }, { type: i1$1.AdminService }]
8844
8893
  });
8845
8894
  var FeatureFlagRulesComponent = class FeatureFlagRulesComponent extends AppBaseComponent {
8846
8895
  constructor(injector, adminService, cdr, confirmDialog) {
@@ -9004,7 +9053,7 @@ var FeatureFlagRulesComponent = class FeatureFlagRulesComponent extends AppBaseC
9004
9053
  dependencies: [
9005
9054
  {
9006
9055
  kind: "component",
9007
- type: i2$4.Table,
9056
+ type: i2$3.Table,
9008
9057
  selector: "p-table",
9009
9058
  inputs: [
9010
9059
  "frozenColumns",
@@ -9117,7 +9166,7 @@ var FeatureFlagRulesComponent = class FeatureFlagRulesComponent extends AppBaseC
9117
9166
  },
9118
9167
  {
9119
9168
  kind: "directive",
9120
- type: i2$4.ResizableColumn,
9169
+ type: i2$3.ResizableColumn,
9121
9170
  selector: "[pResizableColumn]",
9122
9171
  inputs: ["pResizableColumnDisabled"]
9123
9172
  },
@@ -9151,7 +9200,7 @@ var FeatureFlagRulesComponent = class FeatureFlagRulesComponent extends AppBaseC
9151
9200
  },
9152
9201
  {
9153
9202
  kind: "component",
9154
- type: i2$3.Select,
9203
+ type: i2$2.Select,
9155
9204
  selector: "p-select",
9156
9205
  inputs: [
9157
9206
  "id",
@@ -9292,7 +9341,7 @@ var FeatureFlagRulesComponent = class FeatureFlagRulesComponent extends AppBaseC
9292
9341
  },
9293
9342
  {
9294
9343
  kind: "component",
9295
- type: i11$1.ProgressSpinner,
9344
+ type: i11.ProgressSpinner,
9296
9345
  selector: "p-progress-spinner, p-progressspinner",
9297
9346
  inputs: [
9298
9347
  "value",
@@ -9381,6 +9430,11 @@ var FeatureFlagRulesComponent = class FeatureFlagRulesComponent extends AppBaseC
9381
9430
  ],
9382
9431
  outputs: ["ngModelChange"]
9383
9432
  },
9433
+ {
9434
+ kind: "directive",
9435
+ type: i9.TrackDirtyFormDirective,
9436
+ selector: "[formGroup]:not([formGroupSkipDirty])"
9437
+ },
9384
9438
  {
9385
9439
  kind: "pipe",
9386
9440
  type: i8$2.TranslocoPipe,
@@ -9516,7 +9570,7 @@ var FeatureFlagsListComponent = class FeatureFlagsListComponent extends AppBaseC
9516
9570
  dependencies: [
9517
9571
  {
9518
9572
  kind: "component",
9519
- type: i2$4.Table,
9573
+ type: i2$3.Table,
9520
9574
  selector: "p-table",
9521
9575
  inputs: [
9522
9576
  "frozenColumns",
@@ -9629,7 +9683,7 @@ var FeatureFlagsListComponent = class FeatureFlagsListComponent extends AppBaseC
9629
9683
  },
9630
9684
  {
9631
9685
  kind: "directive",
9632
- type: i2$4.ResizableColumn,
9686
+ type: i2$3.ResizableColumn,
9633
9687
  selector: "[pResizableColumn]",
9634
9688
  inputs: ["pResizableColumnDisabled"]
9635
9689
  },
@@ -9718,7 +9772,7 @@ var FeatureFlagsListComponent = class FeatureFlagsListComponent extends AppBaseC
9718
9772
  },
9719
9773
  {
9720
9774
  kind: "component",
9721
- type: i11$1.ProgressSpinner,
9775
+ type: i11.ProgressSpinner,
9722
9776
  selector: "p-progress-spinner, p-progressspinner",
9723
9777
  inputs: [
9724
9778
  "value",
@@ -9887,6 +9941,7 @@ var FeedbackQuestionsDetailsComponent = class FeedbackQuestionsDetailsComponent
9887
9941
  this.submitted = true;
9888
9942
  const data = { ...this.form.value };
9889
9943
  (this.id ? this.adminService.updateFeedbackQuestion(this.id, data) : this.adminService.createFeedbackQuestion(data)).subscribe({ next: () => {
9944
+ this.form.markAsPristine();
9890
9945
  this.toast.success(this.translation.translate("Admin.FeedbackQuestions.UpdatedMessage"));
9891
9946
  this.back();
9892
9947
  this.cdr.markForCheck();
@@ -9905,7 +9960,7 @@ var FeedbackQuestionsDetailsComponent = class FeedbackQuestionsDetailsComponent
9905
9960
  { token: i0.Injector },
9906
9961
  { token: i0.ChangeDetectorRef },
9907
9962
  { token: i1$1.AdminService },
9908
- { token: i2$2.ProductService }
9963
+ { token: i2$1.ProductService }
9909
9964
  ],
9910
9965
  target: i0.ɵɵFactoryTarget.Component
9911
9966
  });
@@ -9989,6 +10044,11 @@ var FeedbackQuestionsDetailsComponent = class FeedbackQuestionsDetailsComponent
9989
10044
  ],
9990
10045
  outputs: ["ngModelChange"]
9991
10046
  },
10047
+ {
10048
+ kind: "directive",
10049
+ type: i9.TrackDirtyFormDirective,
10050
+ selector: "[formGroup]:not([formGroupSkipDirty])"
10051
+ },
9992
10052
  {
9993
10053
  kind: "pipe",
9994
10054
  type: i8$2.TranslocoPipe,
@@ -10016,7 +10076,7 @@ i0.ɵɵngDeclareClassMetadata({
10016
10076
  { type: i0.Injector },
10017
10077
  { type: i0.ChangeDetectorRef },
10018
10078
  { type: i1$1.AdminService },
10019
- { type: i2$2.ProductService }
10079
+ { type: i2$1.ProductService }
10020
10080
  ],
10021
10081
  propDecorators: { onSave: [] }
10022
10082
  });
@@ -10097,7 +10157,7 @@ var FeedbackQuestionsListComponent = class FeedbackQuestionsListComponent extend
10097
10157
  deps: [
10098
10158
  { token: i0.Injector },
10099
10159
  { token: i1$1.AdminService },
10100
- { token: i2$2.ProductService },
10160
+ { token: i2$1.ProductService },
10101
10161
  { token: i0.ChangeDetectorRef },
10102
10162
  { token: i6$2.ConfirmDialogService }
10103
10163
  ],
@@ -10118,7 +10178,7 @@ var FeedbackQuestionsListComponent = class FeedbackQuestionsListComponent extend
10118
10178
  dependencies: [
10119
10179
  {
10120
10180
  kind: "component",
10121
- type: i2$4.Table,
10181
+ type: i2$3.Table,
10122
10182
  selector: "p-table",
10123
10183
  inputs: [
10124
10184
  "frozenColumns",
@@ -10231,19 +10291,19 @@ var FeedbackQuestionsListComponent = class FeedbackQuestionsListComponent extend
10231
10291
  },
10232
10292
  {
10233
10293
  kind: "directive",
10234
- type: i2$4.SortableColumn,
10294
+ type: i2$3.SortableColumn,
10235
10295
  selector: "[pSortableColumn]",
10236
10296
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
10237
10297
  },
10238
10298
  {
10239
10299
  kind: "directive",
10240
- type: i2$4.ResizableColumn,
10300
+ type: i2$3.ResizableColumn,
10241
10301
  selector: "[pResizableColumn]",
10242
10302
  inputs: ["pResizableColumnDisabled"]
10243
10303
  },
10244
10304
  {
10245
10305
  kind: "component",
10246
- type: i2$4.SortIcon,
10306
+ type: i2$3.SortIcon,
10247
10307
  selector: "p-sort-icon, p-sorticon",
10248
10308
  inputs: ["field"]
10249
10309
  },
@@ -10326,7 +10386,7 @@ var FeedbackQuestionsListComponent = class FeedbackQuestionsListComponent extend
10326
10386
  },
10327
10387
  {
10328
10388
  kind: "component",
10329
- type: i11$1.ProgressSpinner,
10389
+ type: i11.ProgressSpinner,
10330
10390
  selector: "p-progress-spinner, p-progressspinner",
10331
10391
  inputs: [
10332
10392
  "value",
@@ -10399,7 +10459,7 @@ i0.ɵɵngDeclareClassMetadata({
10399
10459
  ctorParameters: () => [
10400
10460
  { type: i0.Injector },
10401
10461
  { type: i1$1.AdminService },
10402
- { type: i2$2.ProductService },
10462
+ { type: i2$1.ProductService },
10403
10463
  { type: i0.ChangeDetectorRef },
10404
10464
  { type: i6$2.ConfirmDialogService }
10405
10465
  ]
@@ -10755,6 +10815,7 @@ var AddEditIncidentComponent = class AddEditIncidentComponent extends AppBaseCom
10755
10815
  subscription_id: this.subscriptionId
10756
10816
  };
10757
10817
  this.commonService.addIncident(data).subscribe(() => {
10818
+ this.form.markAsPristine();
10758
10819
  this.toast.success(this.translation.translate("Admin.Incident.AddMessage"));
10759
10820
  this.router.navigate([`${this.routers.incidentConfig}`]);
10760
10821
  this.cdr.markForCheck();
@@ -10774,6 +10835,7 @@ var AddEditIncidentComponent = class AddEditIncidentComponent extends AppBaseCom
10774
10835
  subscription_id: this.subscriptionId
10775
10836
  };
10776
10837
  this.commonService.editIncident(this.id, data).subscribe(() => {
10838
+ this.form.markAsPristine();
10777
10839
  this.toast.success(this.translation.translate("Admin.Incident.UpdateMessage"));
10778
10840
  this.router.navigate([`${this.routers.incidentConfig}`]);
10779
10841
  this.cdr.markForCheck();
@@ -10797,7 +10859,7 @@ var AddEditIncidentComponent = class AddEditIncidentComponent extends AppBaseCom
10797
10859
  deps: [
10798
10860
  { token: i0.Injector },
10799
10861
  { token: i0.ChangeDetectorRef },
10800
- { token: i2$2.CommonService }
10862
+ { token: i2$1.CommonService }
10801
10863
  ],
10802
10864
  target: i0.ɵɵFactoryTarget.Component
10803
10865
  });
@@ -10926,7 +10988,7 @@ var AddEditIncidentComponent = class AddEditIncidentComponent extends AppBaseCom
10926
10988
  },
10927
10989
  {
10928
10990
  kind: "component",
10929
- type: i11$1.ProgressSpinner,
10991
+ type: i11.ProgressSpinner,
10930
10992
  selector: "p-progress-spinner, p-progressspinner",
10931
10993
  inputs: [
10932
10994
  "value",
@@ -11005,9 +11067,14 @@ var AddEditIncidentComponent = class AddEditIncidentComponent extends AppBaseCom
11005
11067
  ],
11006
11068
  outputs: ["ngModelChange"]
11007
11069
  },
11070
+ {
11071
+ kind: "directive",
11072
+ type: i9.TrackDirtyFormDirective,
11073
+ selector: "[formGroup]:not([formGroupSkipDirty])"
11074
+ },
11008
11075
  {
11009
11076
  kind: "component",
11010
- type: i11.QuillEditorComponent,
11077
+ type: i12.QuillEditorComponent,
11011
11078
  selector: "quill-editor"
11012
11079
  },
11013
11080
  {
@@ -11036,7 +11103,7 @@ i0.ɵɵngDeclareClassMetadata({
11036
11103
  ctorParameters: () => [
11037
11104
  { type: i0.Injector },
11038
11105
  { type: i0.ChangeDetectorRef },
11039
- { type: i2$2.CommonService }
11106
+ { type: i2$1.CommonService }
11040
11107
  ],
11041
11108
  propDecorators: { editForm: [{
11042
11109
  type: ViewChild,
@@ -11126,7 +11193,7 @@ var IncidentListComponent = class IncidentListComponent extends AppBaseComponent
11126
11193
  type: IncidentListComponent,
11127
11194
  deps: [
11128
11195
  { token: i0.Injector },
11129
- { token: i2$2.CommonService },
11196
+ { token: i2$1.CommonService },
11130
11197
  { token: i0.ChangeDetectorRef },
11131
11198
  { token: i6$2.ConfirmDialogService }
11132
11199
  ],
@@ -11147,7 +11214,7 @@ var IncidentListComponent = class IncidentListComponent extends AppBaseComponent
11147
11214
  dependencies: [
11148
11215
  {
11149
11216
  kind: "component",
11150
- type: i2$4.Table,
11217
+ type: i2$3.Table,
11151
11218
  selector: "p-table",
11152
11219
  inputs: [
11153
11220
  "frozenColumns",
@@ -11260,19 +11327,19 @@ var IncidentListComponent = class IncidentListComponent extends AppBaseComponent
11260
11327
  },
11261
11328
  {
11262
11329
  kind: "directive",
11263
- type: i2$4.SortableColumn,
11330
+ type: i2$3.SortableColumn,
11264
11331
  selector: "[pSortableColumn]",
11265
11332
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
11266
11333
  },
11267
11334
  {
11268
11335
  kind: "directive",
11269
- type: i2$4.ResizableColumn,
11336
+ type: i2$3.ResizableColumn,
11270
11337
  selector: "[pResizableColumn]",
11271
11338
  inputs: ["pResizableColumnDisabled"]
11272
11339
  },
11273
11340
  {
11274
11341
  kind: "component",
11275
- type: i2$4.SortIcon,
11342
+ type: i2$3.SortIcon,
11276
11343
  selector: "p-sort-icon, p-sorticon",
11277
11344
  inputs: ["field"]
11278
11345
  },
@@ -11355,7 +11422,7 @@ var IncidentListComponent = class IncidentListComponent extends AppBaseComponent
11355
11422
  },
11356
11423
  {
11357
11424
  kind: "component",
11358
- type: i11$1.ProgressSpinner,
11425
+ type: i11.ProgressSpinner,
11359
11426
  selector: "p-progress-spinner, p-progressspinner",
11360
11427
  inputs: [
11361
11428
  "value",
@@ -11420,12 +11487,12 @@ var IncidentListComponent = class IncidentListComponent extends AppBaseComponent
11420
11487
  },
11421
11488
  {
11422
11489
  kind: "pipe",
11423
- type: i9.RemoveHtmlPipe,
11490
+ type: i9$1.RemoveHtmlPipe,
11424
11491
  name: "removeHtml"
11425
11492
  },
11426
11493
  {
11427
11494
  kind: "pipe",
11428
- type: i9.TextTruncatePipe,
11495
+ type: i9$1.TextTruncatePipe,
11429
11496
  name: "textTruncate"
11430
11497
  }
11431
11498
  ]
@@ -11448,7 +11515,7 @@ i0.ɵɵngDeclareClassMetadata({
11448
11515
  }],
11449
11516
  ctorParameters: () => [
11450
11517
  { type: i0.Injector },
11451
- { type: i2$2.CommonService },
11518
+ { type: i2$1.CommonService },
11452
11519
  { type: i0.ChangeDetectorRef },
11453
11520
  { type: i6$2.ConfirmDialogService }
11454
11521
  ]
@@ -11506,19 +11573,16 @@ i0.ɵɵngDeclareClassMetadata({
11506
11573
  }]
11507
11574
  });
11508
11575
  var LoginNotificationDetailsComponent = class LoginNotificationDetailsComponent extends AppBaseComponent {
11509
- constructor(injector, cdr, adminService, productService, unsavedChanges) {
11576
+ constructor(injector, cdr, adminService, productService) {
11510
11577
  super(injector);
11511
11578
  this.cdr = cdr;
11512
11579
  this.adminService = adminService;
11513
11580
  this.productService = productService;
11514
- this.unsavedChanges = unsavedChanges;
11515
11581
  this.submitted = false;
11516
11582
  this.buttonBusy = false;
11517
- this.saved = false;
11518
11583
  this.routers = ROUTERS;
11519
11584
  this.isLoading = true;
11520
11585
  this.featureKeys = [];
11521
- this.unregisterUnsaved = null;
11522
11586
  this.form = AppAdmin.loginNotificationForm();
11523
11587
  }
11524
11588
  ngOnInit() {
@@ -11531,14 +11595,6 @@ var LoginNotificationDetailsComponent = class LoginNotificationDetailsComponent
11531
11595
  else this.isLoading = false;
11532
11596
  this.cdr.markForCheck();
11533
11597
  });
11534
- this.unregisterUnsaved = this.unsavedChanges.watch(() => this.hasUnsavedChanges());
11535
- }
11536
- ngOnDestroy() {
11537
- this.unregisterUnsaved?.();
11538
- super.ngOnDestroy();
11539
- }
11540
- hasUnsavedChanges() {
11541
- return this.form.dirty && !this.saved;
11542
11598
  }
11543
11599
  get f() {
11544
11600
  return this.form.controls;
@@ -11580,7 +11636,6 @@ var LoginNotificationDetailsComponent = class LoginNotificationDetailsComponent
11580
11636
  (this.id ? this.adminService.updateLoginNotification(this.id, data) : this.adminService.createLoginNotification(data)).subscribe({ next: () => {
11581
11637
  this.toast.success(this.translation.translate("Admin.LoginNotification.UpdatedMessage"));
11582
11638
  this.form.markAsPristine();
11583
- this.saved = true;
11584
11639
  this.back();
11585
11640
  this.cdr.markForCheck();
11586
11641
  } }).add(() => {
@@ -11599,8 +11654,7 @@ var LoginNotificationDetailsComponent = class LoginNotificationDetailsComponent
11599
11654
  { token: i0.Injector },
11600
11655
  { token: i0.ChangeDetectorRef },
11601
11656
  { token: i1$1.AdminService },
11602
- { token: i2$2.ProductService },
11603
- { token: i2$1.UnsavedChangesService }
11657
+ { token: i2$1.ProductService }
11604
11658
  ],
11605
11659
  target: i0.ɵɵFactoryTarget.Component
11606
11660
  });
@@ -11619,7 +11673,7 @@ var LoginNotificationDetailsComponent = class LoginNotificationDetailsComponent
11619
11673
  dependencies: [
11620
11674
  {
11621
11675
  kind: "component",
11622
- type: i2$3.Select,
11676
+ type: i2$2.Select,
11623
11677
  selector: "p-select",
11624
11678
  inputs: [
11625
11679
  "id",
@@ -11906,7 +11960,7 @@ var LoginNotificationDetailsComponent = class LoginNotificationDetailsComponent
11906
11960
  },
11907
11961
  {
11908
11962
  kind: "component",
11909
- type: i11$1.ProgressSpinner,
11963
+ type: i11.ProgressSpinner,
11910
11964
  selector: "p-progress-spinner, p-progressspinner",
11911
11965
  inputs: [
11912
11966
  "value",
@@ -11985,6 +12039,11 @@ var LoginNotificationDetailsComponent = class LoginNotificationDetailsComponent
11985
12039
  ],
11986
12040
  outputs: ["ngModelChange"]
11987
12041
  },
12042
+ {
12043
+ kind: "directive",
12044
+ type: i9.TrackDirtyFormDirective,
12045
+ selector: "[formGroup]:not([formGroupSkipDirty])"
12046
+ },
11988
12047
  {
11989
12048
  kind: "pipe",
11990
12049
  type: i5$2.AsyncPipe,
@@ -12018,8 +12077,7 @@ i0.ɵɵngDeclareClassMetadata({
12018
12077
  { type: i0.Injector },
12019
12078
  { type: i0.ChangeDetectorRef },
12020
12079
  { type: i1$1.AdminService },
12021
- { type: i2$2.ProductService },
12022
- { type: i2$1.UnsavedChangesService }
12080
+ { type: i2$1.ProductService }
12023
12081
  ],
12024
12082
  propDecorators: { onSave: [] }
12025
12083
  });
@@ -12193,7 +12251,7 @@ var LoginNotificationsListComponent = class LoginNotificationsListComponent exte
12193
12251
  dependencies: [
12194
12252
  {
12195
12253
  kind: "component",
12196
- type: i2$4.Table,
12254
+ type: i2$3.Table,
12197
12255
  selector: "p-table",
12198
12256
  inputs: [
12199
12257
  "frozenColumns",
@@ -12306,19 +12364,19 @@ var LoginNotificationsListComponent = class LoginNotificationsListComponent exte
12306
12364
  },
12307
12365
  {
12308
12366
  kind: "directive",
12309
- type: i2$4.SortableColumn,
12367
+ type: i2$3.SortableColumn,
12310
12368
  selector: "[pSortableColumn]",
12311
12369
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
12312
12370
  },
12313
12371
  {
12314
12372
  kind: "directive",
12315
- type: i2$4.ResizableColumn,
12373
+ type: i2$3.ResizableColumn,
12316
12374
  selector: "[pResizableColumn]",
12317
12375
  inputs: ["pResizableColumnDisabled"]
12318
12376
  },
12319
12377
  {
12320
12378
  kind: "component",
12321
- type: i2$4.SortIcon,
12379
+ type: i2$3.SortIcon,
12322
12380
  selector: "p-sort-icon, p-sorticon",
12323
12381
  inputs: ["field"]
12324
12382
  },
@@ -12407,7 +12465,7 @@ var LoginNotificationsListComponent = class LoginNotificationsListComponent exte
12407
12465
  },
12408
12466
  {
12409
12467
  kind: "component",
12410
- type: i11$1.ProgressSpinner,
12468
+ type: i11.ProgressSpinner,
12411
12469
  selector: "p-progress-spinner, p-progressspinner",
12412
12470
  inputs: [
12413
12471
  "value",
@@ -12472,12 +12530,12 @@ var LoginNotificationsListComponent = class LoginNotificationsListComponent exte
12472
12530
  },
12473
12531
  {
12474
12532
  kind: "pipe",
12475
- type: i9.DateFormatPipe,
12533
+ type: i9$1.DateFormatPipe,
12476
12534
  name: "dateFormat"
12477
12535
  },
12478
12536
  {
12479
12537
  kind: "pipe",
12480
- type: i9.TextTruncatePipe,
12538
+ type: i9$1.TextTruncatePipe,
12481
12539
  name: "textTruncate"
12482
12540
  }
12483
12541
  ]
@@ -12571,6 +12629,7 @@ var MailerDetailsComponent = class MailerDetailsComponent extends AppBaseCompone
12571
12629
  subscription_id: this.subscriptionId
12572
12630
  };
12573
12631
  (this.id ? this.adminService.updateMailer(data, this.id) : this.adminService.addMailer(data)).subscribe({ next: (_) => {
12632
+ this.form.markAsPristine();
12574
12633
  this.id ? this.toast.success(this.translation.translate("Admin.Mailer.UpdatedMessage")) : this.toast.success(this.translation.translate("Admin.Mailer.AddedMessage"));
12575
12634
  this.back();
12576
12635
  this.cdr.markForCheck();
@@ -12610,7 +12669,7 @@ var MailerDetailsComponent = class MailerDetailsComponent extends AppBaseCompone
12610
12669
  dependencies: [
12611
12670
  {
12612
12671
  kind: "component",
12613
- type: i2$3.Select,
12672
+ type: i2$2.Select,
12614
12673
  selector: "p-select",
12615
12674
  inputs: [
12616
12675
  "id",
@@ -12706,7 +12765,7 @@ var MailerDetailsComponent = class MailerDetailsComponent extends AppBaseCompone
12706
12765
  },
12707
12766
  {
12708
12767
  kind: "component",
12709
- type: i11$1.ProgressSpinner,
12768
+ type: i11.ProgressSpinner,
12710
12769
  selector: "p-progress-spinner, p-progressspinner",
12711
12770
  inputs: [
12712
12771
  "value",
@@ -12785,9 +12844,14 @@ var MailerDetailsComponent = class MailerDetailsComponent extends AppBaseCompone
12785
12844
  ],
12786
12845
  outputs: ["ngModelChange"]
12787
12846
  },
12847
+ {
12848
+ kind: "directive",
12849
+ type: i9.TrackDirtyFormDirective,
12850
+ selector: "[formGroup]:not([formGroupSkipDirty])"
12851
+ },
12788
12852
  {
12789
12853
  kind: "component",
12790
- type: i11.QuillEditorComponent,
12854
+ type: i12.QuillEditorComponent,
12791
12855
  selector: "quill-editor"
12792
12856
  },
12793
12857
  {
@@ -12902,7 +12966,7 @@ var MailerListComponent = class MailerListComponent extends AppBaseComponent {
12902
12966
  type: MailerListComponent,
12903
12967
  deps: [
12904
12968
  { token: i1$1.AdminService },
12905
- { token: i2$2.AuthService },
12969
+ { token: i2$1.AuthService },
12906
12970
  { token: i0.Injector },
12907
12971
  { token: i0.ChangeDetectorRef },
12908
12972
  { token: i6$2.ConfirmDialogService }
@@ -12923,7 +12987,7 @@ var MailerListComponent = class MailerListComponent extends AppBaseComponent {
12923
12987
  dependencies: [
12924
12988
  {
12925
12989
  kind: "component",
12926
- type: i2$4.Table,
12990
+ type: i2$3.Table,
12927
12991
  selector: "p-table",
12928
12992
  inputs: [
12929
12993
  "frozenColumns",
@@ -13036,13 +13100,13 @@ var MailerListComponent = class MailerListComponent extends AppBaseComponent {
13036
13100
  },
13037
13101
  {
13038
13102
  kind: "directive",
13039
- type: i2$4.SortableColumn,
13103
+ type: i2$3.SortableColumn,
13040
13104
  selector: "[pSortableColumn]",
13041
13105
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
13042
13106
  },
13043
13107
  {
13044
13108
  kind: "directive",
13045
- type: i2$4.ResizableColumn,
13109
+ type: i2$3.ResizableColumn,
13046
13110
  selector: "[pResizableColumn]",
13047
13111
  inputs: ["pResizableColumnDisabled"]
13048
13112
  },
@@ -13125,7 +13189,7 @@ var MailerListComponent = class MailerListComponent extends AppBaseComponent {
13125
13189
  },
13126
13190
  {
13127
13191
  kind: "component",
13128
- type: i11$1.ProgressSpinner,
13192
+ type: i11.ProgressSpinner,
13129
13193
  selector: "p-progress-spinner, p-progressspinner",
13130
13194
  inputs: [
13131
13195
  "value",
@@ -13196,12 +13260,12 @@ var MailerListComponent = class MailerListComponent extends AppBaseComponent {
13196
13260
  },
13197
13261
  {
13198
13262
  kind: "pipe",
13199
- type: i9.RemoveHtmlPipe,
13263
+ type: i9$1.RemoveHtmlPipe,
13200
13264
  name: "removeHtml"
13201
13265
  },
13202
13266
  {
13203
13267
  kind: "pipe",
13204
- type: i9.TextTruncatePipe,
13268
+ type: i9$1.TextTruncatePipe,
13205
13269
  name: "textTruncate"
13206
13270
  }
13207
13271
  ]
@@ -13223,7 +13287,7 @@ i0.ɵɵngDeclareClassMetadata({
13223
13287
  }],
13224
13288
  ctorParameters: () => [
13225
13289
  { type: i1$1.AdminService },
13226
- { type: i2$2.AuthService },
13290
+ { type: i2$1.AuthService },
13227
13291
  { type: i0.Injector },
13228
13292
  { type: i0.ChangeDetectorRef },
13229
13293
  { type: i6$2.ConfirmDialogService }
@@ -13326,6 +13390,7 @@ var NewsletterDetailsComponent = class NewsletterDetailsComponent extends AppBas
13326
13390
  };
13327
13391
  (this.id ? this.adminService.updateNewsletter(data, this.id) : this.adminService.addNewsletter(data)).subscribe({ next: (response) => {
13328
13392
  this.form.patchValue(response);
13393
+ this.form.markAsPristine();
13329
13394
  this.toast.success(this.translation.translate("Admin.Newsletter.UpdatedMessage"));
13330
13395
  this.back();
13331
13396
  this.cdr.markForCheck();
@@ -13420,7 +13485,7 @@ var NewsletterDetailsComponent = class NewsletterDetailsComponent extends AppBas
13420
13485
  },
13421
13486
  {
13422
13487
  kind: "component",
13423
- type: i11$1.ProgressSpinner,
13488
+ type: i11.ProgressSpinner,
13424
13489
  selector: "p-progress-spinner, p-progressspinner",
13425
13490
  inputs: [
13426
13491
  "value",
@@ -13499,6 +13564,11 @@ var NewsletterDetailsComponent = class NewsletterDetailsComponent extends AppBas
13499
13564
  ],
13500
13565
  outputs: ["ngModelChange"]
13501
13566
  },
13567
+ {
13568
+ kind: "directive",
13569
+ type: i9.TrackDirtyFormDirective,
13570
+ selector: "[formGroup]:not([formGroupSkipDirty])"
13571
+ },
13502
13572
  {
13503
13573
  kind: "pipe",
13504
13574
  type: i8$2.TranslocoPipe,
@@ -13664,6 +13734,7 @@ var NewsletterItemDetailsComponent = class NewsletterItemDetailsComponent extend
13664
13734
  this.adminService.addNewsletterItem(data).subscribe((response) => {
13665
13735
  this.data = response;
13666
13736
  this.postTags();
13737
+ this.form.markAsPristine();
13667
13738
  this.toast.success(this.translation.translate("Admin.Newsletter.AddedMessage"));
13668
13739
  this.back();
13669
13740
  this.cdr.markForCheck();
@@ -13680,6 +13751,7 @@ var NewsletterItemDetailsComponent = class NewsletterItemDetailsComponent extend
13680
13751
  this.adminService.updateNewsletterItem(data, this.id).subscribe((response) => {
13681
13752
  this.data = response;
13682
13753
  this.postTags();
13754
+ this.form.markAsPristine();
13683
13755
  this.toast.success(this.translation.translate("Admin.Newsletter.UpdatedMessage"));
13684
13756
  this.back();
13685
13757
  this.cdr.markForCheck();
@@ -13746,9 +13818,9 @@ var NewsletterItemDetailsComponent = class NewsletterItemDetailsComponent extend
13746
13818
  type: NewsletterItemDetailsComponent,
13747
13819
  deps: [
13748
13820
  { token: i1$1.AdminService },
13749
- { token: i2$2.TagService },
13750
- { token: i2$2.ProductService },
13751
- { token: i2$2.AuthService },
13821
+ { token: i2$1.TagService },
13822
+ { token: i2$1.ProductService },
13823
+ { token: i2$1.AuthService },
13752
13824
  { token: i0.Injector },
13753
13825
  { token: i0.ChangeDetectorRef },
13754
13826
  { token: i3.DomSanitizer }
@@ -13854,7 +13926,7 @@ var NewsletterItemDetailsComponent = class NewsletterItemDetailsComponent extend
13854
13926
  },
13855
13927
  {
13856
13928
  kind: "component",
13857
- type: i2$3.Select,
13929
+ type: i2$2.Select,
13858
13930
  selector: "p-select",
13859
13931
  inputs: [
13860
13932
  "id",
@@ -14165,7 +14237,7 @@ var NewsletterItemDetailsComponent = class NewsletterItemDetailsComponent extend
14165
14237
  },
14166
14238
  {
14167
14239
  kind: "component",
14168
- type: i11$1.ProgressSpinner,
14240
+ type: i11.ProgressSpinner,
14169
14241
  selector: "p-progress-spinner, p-progressspinner",
14170
14242
  inputs: [
14171
14243
  "value",
@@ -14252,9 +14324,14 @@ var NewsletterItemDetailsComponent = class NewsletterItemDetailsComponent extend
14252
14324
  ],
14253
14325
  outputs: ["ngModelChange"]
14254
14326
  },
14327
+ {
14328
+ kind: "directive",
14329
+ type: i9.TrackDirtyFormDirective,
14330
+ selector: "[formGroup]:not([formGroupSkipDirty])"
14331
+ },
14255
14332
  {
14256
14333
  kind: "component",
14257
- type: i11.QuillEditorComponent,
14334
+ type: i12.QuillEditorComponent,
14258
14335
  selector: "quill-editor"
14259
14336
  },
14260
14337
  {
@@ -14282,9 +14359,9 @@ i0.ɵɵngDeclareClassMetadata({
14282
14359
  }],
14283
14360
  ctorParameters: () => [
14284
14361
  { type: i1$1.AdminService },
14285
- { type: i2$2.TagService },
14286
- { type: i2$2.ProductService },
14287
- { type: i2$2.AuthService },
14362
+ { type: i2$1.TagService },
14363
+ { type: i2$1.ProductService },
14364
+ { type: i2$1.AuthService },
14288
14365
  { type: i0.Injector },
14289
14366
  { type: i0.ChangeDetectorRef },
14290
14367
  { type: i3.DomSanitizer }
@@ -14369,7 +14446,7 @@ var NewsletterUsersListComponent = class NewsletterUsersListComponent extends Ap
14369
14446
  dependencies: [
14370
14447
  {
14371
14448
  kind: "component",
14372
- type: i2$4.Table,
14449
+ type: i2$3.Table,
14373
14450
  selector: "p-table",
14374
14451
  inputs: [
14375
14452
  "frozenColumns",
@@ -14482,19 +14559,19 @@ var NewsletterUsersListComponent = class NewsletterUsersListComponent extends Ap
14482
14559
  },
14483
14560
  {
14484
14561
  kind: "directive",
14485
- type: i2$4.SortableColumn,
14562
+ type: i2$3.SortableColumn,
14486
14563
  selector: "[pSortableColumn]",
14487
14564
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
14488
14565
  },
14489
14566
  {
14490
14567
  kind: "directive",
14491
- type: i2$4.ResizableColumn,
14568
+ type: i2$3.ResizableColumn,
14492
14569
  selector: "[pResizableColumn]",
14493
14570
  inputs: ["pResizableColumnDisabled"]
14494
14571
  },
14495
14572
  {
14496
14573
  kind: "component",
14497
- type: i2$4.SortIcon,
14574
+ type: i2$3.SortIcon,
14498
14575
  selector: "p-sort-icon, p-sorticon",
14499
14576
  inputs: ["field"]
14500
14577
  },
@@ -14549,7 +14626,7 @@ var NewsletterUsersListComponent = class NewsletterUsersListComponent extends Ap
14549
14626
  },
14550
14627
  {
14551
14628
  kind: "component",
14552
- type: i11$1.ProgressSpinner,
14629
+ type: i11.ProgressSpinner,
14553
14630
  selector: "p-progress-spinner, p-progressspinner",
14554
14631
  inputs: [
14555
14632
  "value",
@@ -14609,12 +14686,12 @@ var NewsletterUsersListComponent = class NewsletterUsersListComponent extends Ap
14609
14686
  },
14610
14687
  {
14611
14688
  kind: "pipe",
14612
- type: i9.DateFormatPipe,
14689
+ type: i9$1.DateFormatPipe,
14613
14690
  name: "dateFormat"
14614
14691
  },
14615
14692
  {
14616
14693
  kind: "pipe",
14617
- type: i9.IsOnlinePipe,
14694
+ type: i9$1.IsOnlinePipe,
14618
14695
  name: "isOnline"
14619
14696
  }
14620
14697
  ]
@@ -14769,7 +14846,7 @@ var NewsletterInsightComponent = class NewsletterInsightComponent extends AppBas
14769
14846
  },
14770
14847
  {
14771
14848
  kind: "component",
14772
- type: i11$1.ProgressSpinner,
14849
+ type: i11.ProgressSpinner,
14773
14850
  selector: "p-progress-spinner, p-progressspinner",
14774
14851
  inputs: [
14775
14852
  "value",
@@ -14945,7 +15022,7 @@ var NewslettersItemsComponent = class NewslettersItemsComponent extends AppBaseC
14945
15022
  type: NewslettersItemsComponent,
14946
15023
  deps: [
14947
15024
  { token: i1$1.AdminService },
14948
- { token: i2$2.AuthService },
15025
+ { token: i2$1.AuthService },
14949
15026
  { token: i0.Injector },
14950
15027
  { token: i0.ChangeDetectorRef },
14951
15028
  { token: i6$2.ConfirmDialogService }
@@ -14967,7 +15044,7 @@ var NewslettersItemsComponent = class NewslettersItemsComponent extends AppBaseC
14967
15044
  dependencies: [
14968
15045
  {
14969
15046
  kind: "component",
14970
- type: i2$4.Table,
15047
+ type: i2$3.Table,
14971
15048
  selector: "p-table",
14972
15049
  inputs: [
14973
15050
  "frozenColumns",
@@ -15080,19 +15157,19 @@ var NewslettersItemsComponent = class NewslettersItemsComponent extends AppBaseC
15080
15157
  },
15081
15158
  {
15082
15159
  kind: "directive",
15083
- type: i2$4.SortableColumn,
15160
+ type: i2$3.SortableColumn,
15084
15161
  selector: "[pSortableColumn]",
15085
15162
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
15086
15163
  },
15087
15164
  {
15088
15165
  kind: "directive",
15089
- type: i2$4.ResizableColumn,
15166
+ type: i2$3.ResizableColumn,
15090
15167
  selector: "[pResizableColumn]",
15091
15168
  inputs: ["pResizableColumnDisabled"]
15092
15169
  },
15093
15170
  {
15094
15171
  kind: "component",
15095
- type: i2$4.SortIcon,
15172
+ type: i2$3.SortIcon,
15096
15173
  selector: "p-sort-icon, p-sorticon",
15097
15174
  inputs: ["field"]
15098
15175
  },
@@ -15266,7 +15343,7 @@ var NewslettersItemsComponent = class NewslettersItemsComponent extends AppBaseC
15266
15343
  },
15267
15344
  {
15268
15345
  kind: "component",
15269
- type: i11$1.ProgressSpinner,
15346
+ type: i11.ProgressSpinner,
15270
15347
  selector: "p-progress-spinner, p-progressspinner",
15271
15348
  inputs: [
15272
15349
  "value",
@@ -15337,17 +15414,17 @@ var NewslettersItemsComponent = class NewslettersItemsComponent extends AppBaseC
15337
15414
  },
15338
15415
  {
15339
15416
  kind: "pipe",
15340
- type: i9.DateFormatPipe,
15417
+ type: i9$1.DateFormatPipe,
15341
15418
  name: "dateFormat"
15342
15419
  },
15343
15420
  {
15344
15421
  kind: "pipe",
15345
- type: i9.RemoveHtmlPipe,
15422
+ type: i9$1.RemoveHtmlPipe,
15346
15423
  name: "removeHtml"
15347
15424
  },
15348
15425
  {
15349
15426
  kind: "pipe",
15350
- type: i9.TextTruncatePipe,
15427
+ type: i9$1.TextTruncatePipe,
15351
15428
  name: "textTruncate"
15352
15429
  }
15353
15430
  ]
@@ -15370,7 +15447,7 @@ i0.ɵɵngDeclareClassMetadata({
15370
15447
  }],
15371
15448
  ctorParameters: () => [
15372
15449
  { type: i1$1.AdminService },
15373
- { type: i2$2.AuthService },
15450
+ { type: i2$1.AuthService },
15374
15451
  { type: i0.Injector },
15375
15452
  { type: i0.ChangeDetectorRef },
15376
15453
  { type: i6$2.ConfirmDialogService }
@@ -15449,7 +15526,7 @@ var NewsLetterItemViewComponent = class NewsLetterItemViewComponent extends AppB
15449
15526
  },
15450
15527
  {
15451
15528
  kind: "component",
15452
- type: i11$1.ProgressSpinner,
15529
+ type: i11.ProgressSpinner,
15453
15530
  selector: "p-progress-spinner, p-progressspinner",
15454
15531
  inputs: [
15455
15532
  "value",
@@ -15568,7 +15645,7 @@ var NewslettersListComponent = class NewslettersListComponent extends AppBaseCom
15568
15645
  type: NewslettersListComponent,
15569
15646
  deps: [
15570
15647
  { token: i1$1.AdminService },
15571
- { token: i2$2.AuthService },
15648
+ { token: i2$1.AuthService },
15572
15649
  { token: i0.Injector },
15573
15650
  { token: i0.ChangeDetectorRef },
15574
15651
  { token: i6$2.ConfirmDialogService }
@@ -15589,7 +15666,7 @@ var NewslettersListComponent = class NewslettersListComponent extends AppBaseCom
15589
15666
  dependencies: [
15590
15667
  {
15591
15668
  kind: "component",
15592
- type: i2$4.Table,
15669
+ type: i2$3.Table,
15593
15670
  selector: "p-table",
15594
15671
  inputs: [
15595
15672
  "frozenColumns",
@@ -15702,19 +15779,19 @@ var NewslettersListComponent = class NewslettersListComponent extends AppBaseCom
15702
15779
  },
15703
15780
  {
15704
15781
  kind: "directive",
15705
- type: i2$4.SortableColumn,
15782
+ type: i2$3.SortableColumn,
15706
15783
  selector: "[pSortableColumn]",
15707
15784
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
15708
15785
  },
15709
15786
  {
15710
15787
  kind: "directive",
15711
- type: i2$4.ResizableColumn,
15788
+ type: i2$3.ResizableColumn,
15712
15789
  selector: "[pResizableColumn]",
15713
15790
  inputs: ["pResizableColumnDisabled"]
15714
15791
  },
15715
15792
  {
15716
15793
  kind: "component",
15717
- type: i2$4.SortIcon,
15794
+ type: i2$3.SortIcon,
15718
15795
  selector: "p-sort-icon, p-sorticon",
15719
15796
  inputs: ["field"]
15720
15797
  },
@@ -15797,7 +15874,7 @@ var NewslettersListComponent = class NewslettersListComponent extends AppBaseCom
15797
15874
  },
15798
15875
  {
15799
15876
  kind: "component",
15800
- type: i11$1.ProgressSpinner,
15877
+ type: i11.ProgressSpinner,
15801
15878
  selector: "p-progress-spinner, p-progressspinner",
15802
15879
  inputs: [
15803
15880
  "value",
@@ -15879,7 +15956,7 @@ i0.ɵɵngDeclareClassMetadata({
15879
15956
  }],
15880
15957
  ctorParameters: () => [
15881
15958
  { type: i1$1.AdminService },
15882
- { type: i2$2.AuthService },
15959
+ { type: i2$1.AuthService },
15883
15960
  { type: i0.Injector },
15884
15961
  { type: i0.ChangeDetectorRef },
15885
15962
  { type: i6$2.ConfirmDialogService }
@@ -16022,7 +16099,7 @@ var OauthClientsComponent = class OauthClientsComponent extends AppBaseComponent
16022
16099
  dependencies: [
16023
16100
  {
16024
16101
  kind: "component",
16025
- type: i2$4.Table,
16102
+ type: i2$3.Table,
16026
16103
  selector: "p-table",
16027
16104
  inputs: [
16028
16105
  "frozenColumns",
@@ -16135,7 +16212,7 @@ var OauthClientsComponent = class OauthClientsComponent extends AppBaseComponent
16135
16212
  },
16136
16213
  {
16137
16214
  kind: "directive",
16138
- type: i2$4.ResizableColumn,
16215
+ type: i2$3.ResizableColumn,
16139
16216
  selector: "[pResizableColumn]",
16140
16217
  inputs: ["pResizableColumnDisabled"]
16141
16218
  },
@@ -16169,7 +16246,7 @@ var OauthClientsComponent = class OauthClientsComponent extends AppBaseComponent
16169
16246
  },
16170
16247
  {
16171
16248
  kind: "component",
16172
- type: i11$1.ProgressSpinner,
16249
+ type: i11.ProgressSpinner,
16173
16250
  selector: "p-progress-spinner, p-progressspinner",
16174
16251
  inputs: [
16175
16252
  "value",
@@ -16240,19 +16317,16 @@ i0.ɵɵngDeclareClassMetadata({
16240
16317
  ]
16241
16318
  });
16242
16319
  var OauthClientsDetailsComponent = class OauthClientsDetailsComponent extends AppBaseComponent {
16243
- constructor(fb, oauthClientService, injector, cdr, unsavedChanges) {
16320
+ constructor(fb, oauthClientService, injector, cdr) {
16244
16321
  super(injector);
16245
16322
  this.fb = fb;
16246
16323
  this.oauthClientService = oauthClientService;
16247
16324
  this.cdr = cdr;
16248
- this.unsavedChanges = unsavedChanges;
16249
16325
  this.submitting = false;
16250
- this.saved = false;
16251
16326
  this.editId = null;
16252
16327
  this.loading = false;
16253
16328
  this.createdClient = null;
16254
16329
  this.routers = ROUTERS;
16255
- this.unregisterUnsaved = null;
16256
16330
  this.form = this.fb.group({
16257
16331
  name: ["", Validators.required],
16258
16332
  redirect_uris: ["", Validators.required],
@@ -16266,14 +16340,6 @@ var OauthClientsDetailsComponent = class OauthClientsDetailsComponent extends Ap
16266
16340
  this.editId = Number(id);
16267
16341
  this.loadClient(this.editId);
16268
16342
  }
16269
- this.unregisterUnsaved = this.unsavedChanges.watch(() => this.hasUnsavedChanges());
16270
- }
16271
- ngOnDestroy() {
16272
- this.unregisterUnsaved?.();
16273
- super.ngOnDestroy();
16274
- }
16275
- hasUnsavedChanges() {
16276
- return this.form.dirty && !this.saved;
16277
16343
  }
16278
16344
  loadClient(id) {
16279
16345
  this.loading = true;
@@ -16338,7 +16404,6 @@ var OauthClientsDetailsComponent = class OauthClientsDetailsComponent extends Ap
16338
16404
  }
16339
16405
  markClean() {
16340
16406
  this.form.markAsPristine();
16341
- this.saved = true;
16342
16407
  }
16343
16408
  static {
16344
16409
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -16350,8 +16415,7 @@ var OauthClientsDetailsComponent = class OauthClientsDetailsComponent extends Ap
16350
16415
  { token: i10.FormBuilder },
16351
16416
  { token: i1$1.McpOauthClientService },
16352
16417
  { token: i0.Injector },
16353
- { token: i0.ChangeDetectorRef },
16354
- { token: i2$1.UnsavedChangesService }
16418
+ { token: i0.ChangeDetectorRef }
16355
16419
  ],
16356
16420
  target: i0.ɵɵFactoryTarget.Component
16357
16421
  });
@@ -16477,6 +16541,11 @@ var OauthClientsDetailsComponent = class OauthClientsDetailsComponent extends Ap
16477
16541
  ],
16478
16542
  outputs: ["ngModelChange"]
16479
16543
  },
16544
+ {
16545
+ kind: "directive",
16546
+ type: i9.TrackDirtyFormDirective,
16547
+ selector: "[formGroup]:not([formGroupSkipDirty])"
16548
+ },
16480
16549
  {
16481
16550
  kind: "pipe",
16482
16551
  type: i8$2.TranslocoPipe,
@@ -16503,8 +16572,7 @@ i0.ɵɵngDeclareClassMetadata({
16503
16572
  { type: i10.FormBuilder },
16504
16573
  { type: i1$1.McpOauthClientService },
16505
16574
  { type: i0.Injector },
16506
- { type: i0.ChangeDetectorRef },
16507
- { type: i2$1.UnsavedChangesService }
16575
+ { type: i0.ChangeDetectorRef }
16508
16576
  ]
16509
16577
  });
16510
16578
  var OauthClientsTabsComponent = class OauthClientsTabsComponent {
@@ -16712,7 +16780,7 @@ var PermissionsDetailsComponent = class PermissionsDetailsComponent extends AppB
16712
16780
  },
16713
16781
  {
16714
16782
  kind: "component",
16715
- type: i11$1.ProgressSpinner,
16783
+ type: i11.ProgressSpinner,
16716
16784
  selector: "p-progress-spinner, p-progressspinner",
16717
16785
  inputs: [
16718
16786
  "value",
@@ -16797,6 +16865,11 @@ var PermissionsDetailsComponent = class PermissionsDetailsComponent extends AppB
16797
16865
  ],
16798
16866
  outputs: ["ngModelChange"]
16799
16867
  },
16868
+ {
16869
+ kind: "directive",
16870
+ type: i9.TrackDirtyFormDirective,
16871
+ selector: "[formGroup]:not([formGroupSkipDirty])"
16872
+ },
16800
16873
  {
16801
16874
  kind: "pipe",
16802
16875
  type: i8$2.TranslocoPipe,
@@ -16925,7 +16998,7 @@ var PermissionsListComponent = class PermissionsListComponent extends AppBaseCom
16925
16998
  dependencies: [
16926
16999
  {
16927
17000
  kind: "component",
16928
- type: i2$4.Table,
17001
+ type: i2$3.Table,
16929
17002
  selector: "p-table",
16930
17003
  inputs: [
16931
17004
  "frozenColumns",
@@ -17038,19 +17111,19 @@ var PermissionsListComponent = class PermissionsListComponent extends AppBaseCom
17038
17111
  },
17039
17112
  {
17040
17113
  kind: "directive",
17041
- type: i2$4.SortableColumn,
17114
+ type: i2$3.SortableColumn,
17042
17115
  selector: "[pSortableColumn]",
17043
17116
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
17044
17117
  },
17045
17118
  {
17046
17119
  kind: "directive",
17047
- type: i2$4.ResizableColumn,
17120
+ type: i2$3.ResizableColumn,
17048
17121
  selector: "[pResizableColumn]",
17049
17122
  inputs: ["pResizableColumnDisabled"]
17050
17123
  },
17051
17124
  {
17052
17125
  kind: "component",
17053
- type: i2$4.SortIcon,
17126
+ type: i2$3.SortIcon,
17054
17127
  selector: "p-sort-icon, p-sorticon",
17055
17128
  inputs: ["field"]
17056
17129
  },
@@ -17133,7 +17206,7 @@ var PermissionsListComponent = class PermissionsListComponent extends AppBaseCom
17133
17206
  },
17134
17207
  {
17135
17208
  kind: "component",
17136
- type: i11$1.ProgressSpinner,
17209
+ type: i11.ProgressSpinner,
17137
17210
  selector: "p-progress-spinner, p-progressspinner",
17138
17211
  inputs: [
17139
17212
  "value",
@@ -17491,7 +17564,7 @@ var RoleDetailsComponent = class RoleDetailsComponent extends AppBaseComponent {
17491
17564
  },
17492
17565
  {
17493
17566
  kind: "component",
17494
- type: i11$1.ProgressSpinner,
17567
+ type: i11.ProgressSpinner,
17495
17568
  selector: "p-progress-spinner, p-progressspinner",
17496
17569
  inputs: [
17497
17570
  "value",
@@ -17563,6 +17636,11 @@ var RoleDetailsComponent = class RoleDetailsComponent extends AppBaseComponent {
17563
17636
  ],
17564
17637
  outputs: ["ngModelChange"]
17565
17638
  },
17639
+ {
17640
+ kind: "directive",
17641
+ type: i9.TrackDirtyFormDirective,
17642
+ selector: "[formGroup]:not([formGroupSkipDirty])"
17643
+ },
17566
17644
  {
17567
17645
  kind: "pipe",
17568
17646
  type: i8$2.TranslocoPipe,
@@ -17691,7 +17769,7 @@ var RolesListComponent = class RolesListComponent extends AppBaseComponent {
17691
17769
  dependencies: [
17692
17770
  {
17693
17771
  kind: "component",
17694
- type: i2$4.Table,
17772
+ type: i2$3.Table,
17695
17773
  selector: "p-table",
17696
17774
  inputs: [
17697
17775
  "frozenColumns",
@@ -17804,19 +17882,19 @@ var RolesListComponent = class RolesListComponent extends AppBaseComponent {
17804
17882
  },
17805
17883
  {
17806
17884
  kind: "directive",
17807
- type: i2$4.SortableColumn,
17885
+ type: i2$3.SortableColumn,
17808
17886
  selector: "[pSortableColumn]",
17809
17887
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
17810
17888
  },
17811
17889
  {
17812
17890
  kind: "directive",
17813
- type: i2$4.ResizableColumn,
17891
+ type: i2$3.ResizableColumn,
17814
17892
  selector: "[pResizableColumn]",
17815
17893
  inputs: ["pResizableColumnDisabled"]
17816
17894
  },
17817
17895
  {
17818
17896
  kind: "component",
17819
- type: i2$4.SortIcon,
17897
+ type: i2$3.SortIcon,
17820
17898
  selector: "p-sort-icon, p-sorticon",
17821
17899
  inputs: ["field"]
17822
17900
  },
@@ -17899,7 +17977,7 @@ var RolesListComponent = class RolesListComponent extends AppBaseComponent {
17899
17977
  },
17900
17978
  {
17901
17979
  kind: "component",
17902
- type: i11$1.ProgressSpinner,
17980
+ type: i11.ProgressSpinner,
17903
17981
  selector: "p-progress-spinner, p-progressspinner",
17904
17982
  inputs: [
17905
17983
  "value",
@@ -18073,7 +18151,7 @@ var OnboardingStepFormComponent = class OnboardingStepFormComponent {
18073
18151
  isStandalone: false,
18074
18152
  selector: "pw-onboarding-step-form",
18075
18153
  ngImport: i0,
18076
- template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18154
+ template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18077
18155
  styles: [":host form h3{display:block;border-top:1px solid #e2e5ea;margin-top:1.5rem;padding-top:1rem}:host form .modal-body>h3:first-child{border-top:0;margin-top:0;padding-top:0}.pw-onboarding-step-form__toggles{row-gap:10px}.pw-onboarding-step-form__toggles .info-circle{margin-right:20px}\n"],
18078
18156
  dependencies: [
18079
18157
  {
@@ -18106,7 +18184,7 @@ var OnboardingStepFormComponent = class OnboardingStepFormComponent {
18106
18184
  },
18107
18185
  {
18108
18186
  kind: "component",
18109
- type: i2$3.Select,
18187
+ type: i2$2.Select,
18110
18188
  selector: "p-select",
18111
18189
  inputs: [
18112
18190
  "id",
@@ -18361,6 +18439,11 @@ var OnboardingStepFormComponent = class OnboardingStepFormComponent {
18361
18439
  ],
18362
18440
  outputs: ["ngModelChange"]
18363
18441
  },
18442
+ {
18443
+ kind: "directive",
18444
+ type: i9.TrackDirtyFormDirective,
18445
+ selector: "[formGroup]:not([formGroupSkipDirty])"
18446
+ },
18364
18447
  {
18365
18448
  kind: "pipe",
18366
18449
  type: i8$2.TranslocoPipe,
@@ -18380,7 +18463,7 @@ i0.ɵɵngDeclareClassMetadata({
18380
18463
  args: [{
18381
18464
  selector: "pw-onboarding-step-form",
18382
18465
  standalone: false,
18383
- template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18466
+ template: "<div class=\"modal-header\">\n <h4 class=\"modal-title\" id=\"onboarding-step-form-title\">\n {{ (step ? 'Admin.Onboarding.Form.EditTitle' : 'Admin.Onboarding.Form.AddTitle') | transloco }}\n </h4>\n <button type=\"button\" class=\"btn-close float-end\" [attr.aria-label]=\"'Button.Cancel' | transloco\" (click)=\"modal.dismiss()\"></button>\n</div>\n\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\" aria-labelledby=\"onboarding-step-form-title\">\n <div class=\"modal-body\">\n <h3>{{ 'Admin.Onboarding.Form.Section.Step' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-8\" [label]=\"'Admin.Onboarding.Form.Title' | transloco\" name=\"title\"\n controlId=\"onboarding-step-title\" [required]=\"true\" errorMsg=\"Admin.Onboarding.Error.Title\">\n <input type=\"text\" id=\"onboarding-step-title\" class=\"form-control\" formControlName=\"title\" maxlength=\"120\"\n [ngClass]=\"{ 'is-invalid': submitted && form.controls.title.invalid }\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Title' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Title' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-4\" [label]=\"'Admin.Onboarding.Form.Kind' | transloco\" name=\"kind\"\n controlId=\"onboarding-step-kind\">\n <p-select inputId=\"onboarding-step-kind\" formControlName=\"kind\" [options]=\"kinds\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Kind' | transloco\">\n <ng-template #selectedItem let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n <ng-template #item let-kind>{{ 'Admin.Onboarding.Kind.' + kind | transloco }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12\" [label]=\"'Admin.Onboarding.Form.Description' | transloco\" name=\"description\"\n controlId=\"onboarding-step-description\">\n <textarea id=\"onboarding-step-description\" class=\"form-control\" rows=\"2\" maxlength=\"500\" formControlName=\"description\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Description' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Description' | transloco\"></textarea>\n </pw-input-container>\n </div>\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Completion' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Check' | transloco\" name=\"check_key\"\n controlId=\"onboarding-step-check\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Check' | transloco\">\n <p-select inputId=\"onboarding-step-check\" formControlName=\"check_key\" [options]=\"checkOptions\" optionValue=\"check_key\"\n appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Check' | transloco\">\n <ng-template #selectedItem let-check>{{ check?.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n <ng-template #item let-check>{{ check.title ?? ('Admin.Onboarding.Manual' | transloco) }}</ng-template>\n </p-select>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Plans' | transloco\" name=\"feature_keys\"\n controlId=\"onboarding-step-plans\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Plans' | transloco\">\n <p-multiselect inputId=\"onboarding-step-plans\" formControlName=\"feature_keys\" [options]=\"plans\" optionLabel=\"name\"\n optionValue=\"feature_key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.Plans' | transloco\">\n </p-multiselect>\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.DependsOn' | transloco\" name=\"depends_on\"\n controlId=\"onboarding-step-depends\">\n <p-multiselect inputId=\"onboarding-step-depends\" formControlName=\"depends_on\" [options]=\"otherSteps\" optionLabel=\"title\"\n optionValue=\"key\" display=\"chip\" appendTo=\"body\" [placeholder]=\"'Admin.Onboarding.Placeholder.DependsOn' | transloco\">\n </p-multiselect>\n </pw-input-container>\n </div>\n <div class=\"row pw-onboarding-step-form__toggles\">\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"activation\" id=\"onboarding-step-activation\"></ui-switch>\n <label for=\"onboarding-step-activation\" class=\"mb-0\">\n {{ 'Admin.Onboarding.Form.Activation' | transloco }}\n <span class=\"info-circle tooltip-wrap ms-1\" [pTooltip]=\"'Admin.Onboarding.Tooltip.Activation' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\"></span>\n </label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"admin_only\" id=\"onboarding-step-admin-only\"></ui-switch>\n <label for=\"onboarding-step-admin-only\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.AdminOnly' | transloco }}</label>\n </div>\n <div class=\"col-12 d-flex align-items-center gap-2\">\n <ui-switch size=\"small\" formControlName=\"enabled\" id=\"onboarding-step-enabled\"></ui-switch>\n <label for=\"onboarding-step-enabled\" class=\"mb-0\">{{ 'Admin.Onboarding.Form.Enabled' | transloco }}</label>\n </div>\n </div>\n @if (submitted && form.errors?.['systemNeedsCheck']) {\n <p class=\"text-danger mt-2 mb-0\" role=\"alert\">{{ 'Admin.Onboarding.Error.SystemNeedsCheck' | transloco }}</p>\n }\n\n <h3>{{ 'Admin.Onboarding.Form.Section.Where' | transloco }}</h3>\n <div class=\"row\">\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Route' | transloco\" name=\"route\"\n controlId=\"onboarding-step-route\" [showTooltip]=\"true\" [tooltipText]=\"'Admin.Onboarding.Tooltip.Route' | transloco\">\n <input type=\"text\" id=\"onboarding-step-route\" class=\"form-control\" formControlName=\"route\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Route' | transloco\"\n [attr.aria-label]=\"'Admin.Onboarding.Form.Route' | transloco\" />\n </pw-input-container>\n <pw-input-container class=\"col-12 col-md-6\" [label]=\"'Admin.Onboarding.Form.Faq' | transloco\" name=\"faq_slug\"\n controlId=\"onboarding-step-faq\">\n <p-select inputId=\"onboarding-step-faq\" formControlName=\"faq_slug\" [options]=\"faqs\" optionLabel=\"question\"\n optionValue=\"slug\" [filter]=\"true\" [showClear]=\"true\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Faq' | transloco\"></p-select>\n </pw-input-container>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-default\" (click)=\"modal.dismiss()\">{{ 'Button.Cancel' | transloco }}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{ 'Button.Save' | transloco }}</button>\n </div>\n</form>\n",
18384
18467
  styles: [":host form h3{display:block;border-top:1px solid #e2e5ea;margin-top:1.5rem;padding-top:1rem}:host form .modal-body>h3:first-child{border-top:0;margin-top:0;padding-top:0}.pw-onboarding-step-form__toggles{row-gap:10px}.pw-onboarding-step-form__toggles .info-circle{margin-right:20px}\n"]
18385
18468
  }]
18386
18469
  }]
@@ -18410,6 +18493,16 @@ function loadFaqs(commonService, subscriptionId) {
18410
18493
  };
18411
18494
  return commonService.getFaq(params).pipe(map((response) => response?.faqs ?? []), catchError(() => of([])));
18412
18495
  }
18496
+ function labelledFamilies(families, sources) {
18497
+ const labelOf = (key) => sources?.find((source) => source.permissionKey === key)?.label;
18498
+ return families.map((family) => ({
18499
+ ...family,
18500
+ label: labelOf(family.permission_key) ?? ""
18501
+ })).filter((family) => !!family.label);
18502
+ }
18503
+ function stepsIn(response) {
18504
+ return response?.onboarding_steps;
18505
+ }
18413
18506
  var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseComponent {
18414
18507
  constructor(injector, onboarding, commonService, confirmDialog, modal, cdr, sources) {
18415
18508
  super(injector);
@@ -18436,19 +18529,16 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18436
18529
  return PermissionService.selectedSubscription?.id;
18437
18530
  }
18438
18531
  ngOnInit() {
18439
- this.onboarding.getFamilies(this.subscriptionId).pipe(finalize(() => this.refresh())).subscribe({
18532
+ this.onboarding.getFamilies(this.subscriptionId).pipe(finalize(() => this.cdr.markForCheck())).subscribe({
18440
18533
  next: ({ families }) => {
18441
- this.families = families.map((family) => ({
18442
- ...family,
18443
- label: this.source(family.permission_key)?.label ?? ""
18444
- })).filter((family) => !!family.label);
18534
+ this.families = labelledFamilies(families, this.sources);
18445
18535
  this.selectFamily(this.families[0]?.permission_key ?? null);
18446
18536
  },
18447
18537
  error: () => this.loadFailed = true
18448
18538
  });
18449
18539
  }
18450
18540
  get plans() {
18451
- return this.families.find((family) => family.permission_key === this.permissionKey)?.plans ?? [];
18541
+ return this.families.find((item) => item.permission_key === this.permissionKey)?.plans ?? [];
18452
18542
  }
18453
18543
  get visibleSteps() {
18454
18544
  return stepsForPlan(this.steps, this.planFilter);
@@ -18466,7 +18556,7 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18466
18556
  steps: this.onboarding.getSteps(this.subscriptionId, permissionKey),
18467
18557
  catalogue: this.source(permissionKey).load(),
18468
18558
  faqs: loadFaqs(this.commonService, this.subscriptionId)
18469
- }).pipe(finalize(() => (this.loading = false, this.refresh()))).subscribe({
18559
+ }).pipe(finalize(() => this.settle("loading"))).subscribe({
18470
18560
  next: ({ steps, catalogue, faqs }) => {
18471
18561
  this.steps = steps.onboarding_steps;
18472
18562
  this.catalogue = catalogue;
@@ -18516,15 +18606,17 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18516
18606
  }
18517
18607
  run(request) {
18518
18608
  this.busy = true;
18519
- request.pipe(finalize(() => (this.busy = false, this.refresh()))).subscribe({ next: (response) => {
18520
- const steps = response?.onboarding_steps;
18521
- return steps ? this.steps = steps : this.selectFamily(this.permissionKey);
18522
- } });
18609
+ request.pipe(finalize(() => this.settle("busy"))).subscribe((response) => {
18610
+ const steps = stepsIn(response);
18611
+ if (steps) this.steps = steps;
18612
+ else this.selectFamily(this.permissionKey);
18613
+ });
18523
18614
  }
18524
18615
  source(permissionKey) {
18525
18616
  return (this.sources ?? []).find((source) => source.permissionKey === permissionKey);
18526
18617
  }
18527
- refresh() {
18618
+ settle(flag) {
18619
+ this[flag] = false;
18528
18620
  this.cdr.markForCheck();
18529
18621
  }
18530
18622
  static {
@@ -18536,7 +18628,7 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18536
18628
  deps: [
18537
18629
  { token: i0.Injector },
18538
18630
  { token: i1$1.OnboardingAdminService },
18539
- { token: i2$2.CommonService },
18631
+ { token: i2$1.CommonService },
18540
18632
  { token: i6$2.ConfirmDialogService },
18541
18633
  { token: i3$2.NgbModal },
18542
18634
  { token: i0.ChangeDetectorRef },
@@ -18557,12 +18649,12 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18557
18649
  selector: "pw-onboarding-steps",
18558
18650
  usesInheritance: true,
18559
18651
  ngImport: i0,
18560
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, -1)\" (keydown.enter)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, 1)\" (keydown.enter)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [pTooltip]=\"'Button.Edit' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"edit(step)\" (keydown.enter)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li [pTooltip]=\"'Button.Delete' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"remove(step)\" (keydown.enter)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18561
- styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}\n"],
18652
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n (click)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n (click)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Edit' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Edit' | transloco\" (click)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li>\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Delete' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Delete' | transloco\" (click)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18653
+ styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}.pw-onboarding-admin__action{padding:0;border:0;background:none;color:inherit;font-size:inherit;line-height:inherit}\n"],
18562
18654
  dependencies: [
18563
18655
  {
18564
18656
  kind: "component",
18565
- type: i2$4.Table,
18657
+ type: i2$3.Table,
18566
18658
  selector: "p-table",
18567
18659
  inputs: [
18568
18660
  "frozenColumns",
@@ -18703,7 +18795,7 @@ var OnboardingStepsComponent = class OnboardingStepsComponent extends AppBaseCom
18703
18795
  },
18704
18796
  {
18705
18797
  kind: "component",
18706
- type: i2$3.Select,
18798
+ type: i2$2.Select,
18707
18799
  selector: "p-select",
18708
18800
  inputs: [
18709
18801
  "id",
@@ -18891,14 +18983,14 @@ i0.ɵɵngDeclareClassMetadata({
18891
18983
  args: [{
18892
18984
  selector: "pw-onboarding-steps",
18893
18985
  standalone: false,
18894
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, -1)\" (keydown.enter)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\" (click)=\"move(index, 1)\" (keydown.enter)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </li>\n <li class=\"me-2\" [pTooltip]=\"'Button.Edit' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"edit(step)\" (keydown.enter)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li [pTooltip]=\"'Button.Delete' | transloco\" tooltipPosition=\"top\" appendTo=\"body\" tabindex=\"0\"\n (click)=\"remove(step)\" (keydown.enter)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18895
- styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}\n"]
18986
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline gap-2\">\n <h2 class=\"card-title p-0\">{{ 'Admin.Onboarding.Title' | transloco }}</h2>\n @if (!loading && !loadFailed && permissionKey && steps.length) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n }\n </div>\n</div>\n<p class=\"pw-onboarding-admin__intro\">{{ 'Admin.Onboarding.Intro' | transloco }}</p>\n\n<pw-loader [isVisible]=\"loading\"></pw-loader>\n\n@if (!loading) {\n @if (loadFailed) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.LoadFailed' | transloco\"></pw-no-data>\n } @else if (!families.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.NoFamilies' | transloco\"></pw-no-data>\n } @else {\n <div class=\"row pw-onboarding-admin__filters\">\n @if (families.length > 1) {\n <pw-input-container class=\"col-12 col-sm-6 col-lg-4\" [label]=\"'Admin.Onboarding.Family' | transloco\"\n controlId=\"onboarding-family\">\n <p-select inputId=\"onboarding-family\" [options]=\"families\" optionLabel=\"label\" optionValue=\"permission_key\"\n [ngModel]=\"permissionKey\" (ngModelChange)=\"selectFamily($event)\" appendTo=\"body\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Family' | transloco\"></p-select>\n </pw-input-container>\n }\n @if (steps.length) {\n <div class=\"col-12 col-sm-6 col-lg-4 align-self-end mb-3\">\n <p-select inputId=\"onboarding-plan-filter\" [options]=\"plans\" optionLabel=\"name\" optionValue=\"feature_key\"\n [(ngModel)]=\"planFilter\" [showClear]=\"true\" appendTo=\"body\"\n [ariaLabel]=\"'Admin.Onboarding.Filter.Product' | transloco\"\n [placeholder]=\"'Admin.Onboarding.Placeholder.Product' | transloco\"></p-select>\n </div>\n }\n </div>\n\n @if (!steps.length) {\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Onboarding.Empty.Message' | transloco\"\n [description]=\"'Admin.Onboarding.Empty.Description' | transloco\">\n <div #content class=\"d-flex flex-wrap justify-content-center gap-2\">\n @if (catalogue.recommended.length) {\n <button type=\"button\" class=\"btn btn-primary\" [buttonBusy]=\"busy\" (click)=\"install()\">\n {{ 'Admin.Onboarding.Button.Install' | transloco }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-primary\" [disabled]=\"busy\" (click)=\"edit(null)\">\n {{ 'Admin.Onboarding.Button.AddStep' | transloco }}\n </button>\n </div>\n </pw-no-data>\n } @else {\n <div class=\"primeng-datatable-container table-responsive mt-0 pw-onboarding-admin__table\">\n <p-table [value]=\"visibleSteps\" dataKey=\"id\">\n <ng-template #header>\n <tr>\n <th scope=\"col\" class=\"pw-onboarding-admin__order\">#</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Step' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Type' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.CompletedBy' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Plans' | transloco }}</th>\n <th scope=\"col\">{{ 'Admin.Onboarding.Column.Enabled' | transloco }}</th>\n <th scope=\"col\" class=\"actions-list-four\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-step let-index=\"rowIndex\">\n <tr [class.pw-onboarding-admin__off]=\"!step.enabled\">\n <td data-head=\"#\" class=\"pw-onboarding-admin__order\">{{ index + 1 }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Step' | transloco\">\n <span class=\"pw-onboarding-admin__title\">{{ step.title }}</span>\n @if (step.description) {\n <span class=\"pw-onboarding-admin__muted\">{{ step.description }}</span>\n }\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Type' | transloco\">\n <span class=\"badge\" [class.bg-cyan]=\"step.kind === 'required'\" [class.bg-blue-grey]=\"step.kind === 'optional'\"\n [class.bg-warning]=\"step.kind === 'system'\">{{ 'Admin.Onboarding.Kind.' + step.kind | transloco }}</span>\n </td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.CompletedBy' | transloco\">{{ completedBy(step) ?? ('Admin.Onboarding.Manual' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Plans' | transloco\">{{ planNames(step) ?? ('Admin.Onboarding.AllPlans' | transloco) }}</td>\n <td [attr.data-head]=\"'Admin.Onboarding.Column.Enabled' | transloco\">\n <ui-switch size=\"small\" [checked]=\"step.enabled\" [disabled]=\"busy\" (change)=\"toggle(step, $event)\"\n [attr.aria-label]=\"('Admin.Onboarding.Form.Enabled' | transloco) + ': ' + step.title\"></ui-switch>\n </td>\n <td [attr.data-head]=\"'Label.Actions' | transloco\">\n <ul class=\"list-unstyled list-inline list-action mb-0\">\n <li class=\"me-2\" [class.invisible]=\"index === 0\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveUp' | transloco\"\n (click)=\"move(index, -1)\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\" [class.invisible]=\"index === visibleSteps.length - 1\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Admin.Onboarding.Action.MoveDown' | transloco\"\n (click)=\"move(index, 1)\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li class=\"me-2\">\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Edit' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Edit' | transloco\" (click)=\"edit(step)\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n <li>\n <button type=\"button\" class=\"pw-onboarding-admin__action\" [pTooltip]=\"'Button.Delete' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\" [attr.aria-label]=\"'Button.Delete' | transloco\" (click)=\"remove(step)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </button>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <pw-records-summary [showing]=\"visibleSteps.length\" [total]=\"steps.length\" />\n </div>\n }\n }\n}\n",
18987
+ styles: [".pw-onboarding-admin__intro{max-width:720px;margin-bottom:16px}.pw-onboarding-admin__filters{margin-bottom:8px}.pw-onboarding-admin__order{width:40px;font-variant-numeric:tabular-nums}.pw-onboarding-admin__title,.pw-onboarding-admin__muted{display:block}.pw-onboarding-admin__muted{color:var(--text-muted, #6c757d)}.pw-onboarding-admin__off td:not(:last-child):not(:nth-last-child(2)){opacity:.55}.pw-onboarding-admin__table td{word-break:normal;overflow-wrap:break-word}.pw-onboarding-admin__action{padding:0;border:0;background:none;color:inherit;font-size:inherit;line-height:inherit}\n"]
18896
18988
  }]
18897
18989
  }],
18898
18990
  ctorParameters: () => [
18899
18991
  { type: i0.Injector },
18900
18992
  { type: i1$1.OnboardingAdminService },
18901
- { type: i2$2.CommonService },
18993
+ { type: i2$1.CommonService },
18902
18994
  { type: i6$2.ConfirmDialogService },
18903
18995
  { type: i3$2.NgbModal },
18904
18996
  { type: i0.ChangeDetectorRef },
@@ -18963,7 +19055,7 @@ var ProductBackupCardComponent = class ProductBackupCardComponent {
18963
19055
  dependencies: [
18964
19056
  {
18965
19057
  kind: "component",
18966
- type: i2$3.Select,
19058
+ type: i2$2.Select,
18967
19059
  selector: "p-select",
18968
19060
  inputs: [
18969
19061
  "id",
@@ -19117,6 +19209,11 @@ var ProductBackupCardComponent = class ProductBackupCardComponent {
19117
19209
  ],
19118
19210
  outputs: ["ngModelChange"]
19119
19211
  },
19212
+ {
19213
+ kind: "directive",
19214
+ type: i9.TrackDirtyFormDirective,
19215
+ selector: "[formGroup]:not([formGroupSkipDirty])"
19216
+ },
19120
19217
  {
19121
19218
  kind: "pipe",
19122
19219
  type: i8$2.TranslocoPipe,
@@ -19329,6 +19426,7 @@ var ProductDetailsComponent = class ProductDetailsComponent extends AppBaseCompo
19329
19426
  };
19330
19427
  this.adminService.saveProductRoles(this.subscriptionsRolesData).subscribe();
19331
19428
  }
19429
+ this.form.markAsPristine();
19332
19430
  this.back();
19333
19431
  }
19334
19432
  this.cdr.markForCheck();
@@ -19348,6 +19446,7 @@ var ProductDetailsComponent = class ProductDetailsComponent extends AppBaseCompo
19348
19446
  this.productService.updateProduct(data, this.id).subscribe((response) => {
19349
19447
  if (!response.error) {
19350
19448
  this.form.patchValue(response);
19449
+ this.form.markAsPristine();
19351
19450
  this.back();
19352
19451
  }
19353
19452
  this.cdr.markForCheck();
@@ -19472,7 +19571,7 @@ var ProductDetailsComponent = class ProductDetailsComponent extends AppBaseCompo
19472
19571
  deps: [
19473
19572
  { token: i0.Injector },
19474
19573
  { token: i0.ChangeDetectorRef },
19475
- { token: i2$2.ProductService },
19574
+ { token: i2$1.ProductService },
19476
19575
  { token: i3$2.NgbModal },
19477
19576
  { token: i1$1.AdminService }
19478
19577
  ],
@@ -19556,7 +19655,7 @@ var ProductDetailsComponent = class ProductDetailsComponent extends AppBaseCompo
19556
19655
  },
19557
19656
  {
19558
19657
  kind: "component",
19559
- type: i2$3.Select,
19658
+ type: i2$2.Select,
19560
19659
  selector: "p-select",
19561
19660
  inputs: [
19562
19661
  "id",
@@ -19795,7 +19894,7 @@ var ProductDetailsComponent = class ProductDetailsComponent extends AppBaseCompo
19795
19894
  },
19796
19895
  {
19797
19896
  kind: "component",
19798
- type: i11$1.ProgressSpinner,
19897
+ type: i11.ProgressSpinner,
19799
19898
  selector: "p-progress-spinner, p-progressspinner",
19800
19899
  inputs: [
19801
19900
  "value",
@@ -19809,7 +19908,7 @@ var ProductDetailsComponent = class ProductDetailsComponent extends AppBaseCompo
19809
19908
  },
19810
19909
  {
19811
19910
  kind: "component",
19812
- type: i12.ProfileImageCropperComponent,
19911
+ type: i12$1.ProfileImageCropperComponent,
19813
19912
  selector: "pw-image-cropper",
19814
19913
  inputs: ["aspectRatio", "dynamicData"],
19815
19914
  outputs: [
@@ -19882,9 +19981,14 @@ var ProductDetailsComponent = class ProductDetailsComponent extends AppBaseCompo
19882
19981
  ],
19883
19982
  outputs: ["ngModelChange"]
19884
19983
  },
19984
+ {
19985
+ kind: "directive",
19986
+ type: i9.TrackDirtyFormDirective,
19987
+ selector: "[formGroup]:not([formGroupSkipDirty])"
19988
+ },
19885
19989
  {
19886
19990
  kind: "component",
19887
- type: i11.QuillEditorComponent,
19991
+ type: i12.QuillEditorComponent,
19888
19992
  selector: "quill-editor"
19889
19993
  },
19890
19994
  {
@@ -19929,7 +20033,7 @@ i0.ɵɵngDeclareClassMetadata({
19929
20033
  ctorParameters: () => [
19930
20034
  { type: i0.Injector },
19931
20035
  { type: i0.ChangeDetectorRef },
19932
- { type: i2$2.ProductService },
20036
+ { type: i2$1.ProductService },
19933
20037
  { type: i3$2.NgbModal },
19934
20038
  { type: i1$1.AdminService }
19935
20039
  ],
@@ -19971,7 +20075,7 @@ var ProductInsightComponent = class ProductInsightComponent extends AppBaseCompo
19971
20075
  ngImport: i0,
19972
20076
  type: ProductInsightComponent,
19973
20077
  deps: [
19974
- { token: i2$2.ProductService },
20078
+ { token: i2$1.ProductService },
19975
20079
  { token: i0.Injector },
19976
20080
  { token: i0.ChangeDetectorRef }
19977
20081
  ],
@@ -20064,7 +20168,7 @@ var ProductInsightComponent = class ProductInsightComponent extends AppBaseCompo
20064
20168
  },
20065
20169
  {
20066
20170
  kind: "component",
20067
- type: i11$1.ProgressSpinner,
20171
+ type: i11.ProgressSpinner,
20068
20172
  selector: "p-progress-spinner, p-progressspinner",
20069
20173
  inputs: [
20070
20174
  "value",
@@ -20095,7 +20199,7 @@ i0.ɵɵngDeclareClassMetadata({
20095
20199
  }]
20096
20200
  }],
20097
20201
  ctorParameters: () => [
20098
- { type: i2$2.ProductService },
20202
+ { type: i2$1.ProductService },
20099
20203
  { type: i0.Injector },
20100
20204
  { type: i0.ChangeDetectorRef }
20101
20205
  ]
@@ -20214,8 +20318,8 @@ var ProductsListComponent = class ProductsListComponent extends AppBaseComponent
20214
20318
  ngImport: i0,
20215
20319
  type: ProductsListComponent,
20216
20320
  deps: [
20217
- { token: i2$2.ProductService },
20218
- { token: i2$2.AuthService },
20321
+ { token: i2$1.ProductService },
20322
+ { token: i2$1.AuthService },
20219
20323
  { token: i0.Injector },
20220
20324
  { token: i0.ChangeDetectorRef }
20221
20325
  ],
@@ -20242,7 +20346,7 @@ var ProductsListComponent = class ProductsListComponent extends AppBaseComponent
20242
20346
  dependencies: [
20243
20347
  {
20244
20348
  kind: "component",
20245
- type: i2$4.Table,
20349
+ type: i2$3.Table,
20246
20350
  selector: "p-table",
20247
20351
  inputs: [
20248
20352
  "frozenColumns",
@@ -20355,19 +20459,19 @@ var ProductsListComponent = class ProductsListComponent extends AppBaseComponent
20355
20459
  },
20356
20460
  {
20357
20461
  kind: "directive",
20358
- type: i2$4.SortableColumn,
20462
+ type: i2$3.SortableColumn,
20359
20463
  selector: "[pSortableColumn]",
20360
20464
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
20361
20465
  },
20362
20466
  {
20363
20467
  kind: "directive",
20364
- type: i2$4.ResizableColumn,
20468
+ type: i2$3.ResizableColumn,
20365
20469
  selector: "[pResizableColumn]",
20366
20470
  inputs: ["pResizableColumnDisabled"]
20367
20471
  },
20368
20472
  {
20369
20473
  kind: "component",
20370
- type: i2$4.SortIcon,
20474
+ type: i2$3.SortIcon,
20371
20475
  selector: "p-sort-icon, p-sorticon",
20372
20476
  inputs: ["field"]
20373
20477
  },
@@ -20542,7 +20646,7 @@ var ProductsListComponent = class ProductsListComponent extends AppBaseComponent
20542
20646
  },
20543
20647
  {
20544
20648
  kind: "component",
20545
- type: i11$1.ProgressSpinner,
20649
+ type: i11.ProgressSpinner,
20546
20650
  selector: "p-progress-spinner, p-progressspinner",
20547
20651
  inputs: [
20548
20652
  "value",
@@ -20630,8 +20734,8 @@ i0.ɵɵngDeclareClassMetadata({
20630
20734
  }]
20631
20735
  }],
20632
20736
  ctorParameters: () => [
20633
- { type: i2$2.ProductService },
20634
- { type: i2$2.AuthService },
20737
+ { type: i2$1.ProductService },
20738
+ { type: i2$1.AuthService },
20635
20739
  { type: i0.Injector },
20636
20740
  { type: i0.ChangeDetectorRef }
20637
20741
  ],
@@ -20754,7 +20858,7 @@ var UsersListForProductComponent = class UsersListForProductComponent extends Ap
20754
20858
  ngImport: i0,
20755
20859
  type: UsersListForProductComponent,
20756
20860
  deps: [
20757
- { token: i2$2.ProductService },
20861
+ { token: i2$1.ProductService },
20758
20862
  { token: i0.Injector },
20759
20863
  { token: i0.ChangeDetectorRef }
20760
20864
  ],
@@ -20774,7 +20878,7 @@ var UsersListForProductComponent = class UsersListForProductComponent extends Ap
20774
20878
  dependencies: [
20775
20879
  {
20776
20880
  kind: "component",
20777
- type: i2$4.Table,
20881
+ type: i2$3.Table,
20778
20882
  selector: "p-table",
20779
20883
  inputs: [
20780
20884
  "frozenColumns",
@@ -20887,19 +20991,19 @@ var UsersListForProductComponent = class UsersListForProductComponent extends Ap
20887
20991
  },
20888
20992
  {
20889
20993
  kind: "directive",
20890
- type: i2$4.SortableColumn,
20994
+ type: i2$3.SortableColumn,
20891
20995
  selector: "[pSortableColumn]",
20892
20996
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
20893
20997
  },
20894
20998
  {
20895
20999
  kind: "directive",
20896
- type: i2$4.ResizableColumn,
21000
+ type: i2$3.ResizableColumn,
20897
21001
  selector: "[pResizableColumn]",
20898
21002
  inputs: ["pResizableColumnDisabled"]
20899
21003
  },
20900
21004
  {
20901
21005
  kind: "component",
20902
- type: i2$4.SortIcon,
21006
+ type: i2$3.SortIcon,
20903
21007
  selector: "p-sort-icon, p-sorticon",
20904
21008
  inputs: ["field"]
20905
21009
  },
@@ -21034,12 +21138,12 @@ var UsersListForProductComponent = class UsersListForProductComponent extends Ap
21034
21138
  },
21035
21139
  {
21036
21140
  kind: "pipe",
21037
- type: i9.DateFormatPipe,
21141
+ type: i9$1.DateFormatPipe,
21038
21142
  name: "dateFormat"
21039
21143
  },
21040
21144
  {
21041
21145
  kind: "pipe",
21042
- type: i9.IsOnlinePipe,
21146
+ type: i9$1.IsOnlinePipe,
21043
21147
  name: "isOnline"
21044
21148
  }
21045
21149
  ]
@@ -21060,7 +21164,7 @@ i0.ɵɵngDeclareClassMetadata({
21060
21164
  }]
21061
21165
  }],
21062
21166
  ctorParameters: () => [
21063
- { type: i2$2.ProductService },
21167
+ { type: i2$1.ProductService },
21064
21168
  { type: i0.Injector },
21065
21169
  { type: i0.ChangeDetectorRef }
21066
21170
  ]
@@ -21110,7 +21214,7 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21110
21214
  }
21111
21215
  ngOnInit() {
21112
21216
  this.filterData = history.state;
21113
- this.isBlogAdmin = this.permissionService.evaluatePermissions(`${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}.Blog.Admin`);
21217
+ this.isBlogAdmin = this.permissionService.evaluatePermissions(PermissionService.productPermission("Blog", "Admin"));
21114
21218
  this.isSubscriptionSuperAdmin = this.permissionService.isUserSubscriptionSuperAdmin();
21115
21219
  if (!this.isSubscriptionSuperAdmin) this.form.get("author_id").disable();
21116
21220
  if (!this.isBlogAdmin) this.form.get("accepted_at").disable();
@@ -21213,6 +21317,7 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21213
21317
  if (!data.rectangular_picture) delete data.rectangular_picture;
21214
21318
  delete data.id;
21215
21319
  this.adminService.addPost(data).pipe(switchMap((response) => this.postTags(response.id))).subscribe(() => {
21320
+ this.form.markAsPristine();
21216
21321
  this.toast.success(this.translation.translate("Resource.AddedMessage"));
21217
21322
  this.back();
21218
21323
  this.cdr.markForCheck();
@@ -21262,6 +21367,7 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21262
21367
  }
21263
21368
  updatePost(data) {
21264
21369
  this.adminService.updatePost(data, this.id).pipe(switchMap(() => this.postTags(this.blog.id))).subscribe(() => {
21370
+ this.form.markAsPristine();
21265
21371
  this.toast.success(this.translation.translate("Resource.UpdatedMessage"));
21266
21372
  this.navigateToResourceList({ resetSearch: true });
21267
21373
  this.cdr.markForCheck();
@@ -21351,8 +21457,8 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21351
21457
  { token: i1$1.AdminService },
21352
21458
  { token: i0.Injector },
21353
21459
  { token: i0.ChangeDetectorRef },
21354
- { token: i2$2.TagService },
21355
- { token: i2$2.SubscriptionService }
21460
+ { token: i2$1.TagService },
21461
+ { token: i2$1.SubscriptionService }
21356
21462
  ],
21357
21463
  target: i0.ɵɵFactoryTarget.Component
21358
21464
  });
@@ -21450,7 +21556,7 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21450
21556
  },
21451
21557
  {
21452
21558
  kind: "component",
21453
- type: i2$3.Select,
21559
+ type: i2$2.Select,
21454
21560
  selector: "p-select",
21455
21561
  inputs: [
21456
21562
  "id",
@@ -21671,7 +21777,7 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21671
21777
  },
21672
21778
  {
21673
21779
  kind: "component",
21674
- type: i11$1.ProgressSpinner,
21780
+ type: i11.ProgressSpinner,
21675
21781
  selector: "p-progress-spinner, p-progressspinner",
21676
21782
  inputs: [
21677
21783
  "value",
@@ -21685,7 +21791,7 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21685
21791
  },
21686
21792
  {
21687
21793
  kind: "component",
21688
- type: i12.ProfileImageCropperComponent,
21794
+ type: i12$1.ProfileImageCropperComponent,
21689
21795
  selector: "pw-image-cropper",
21690
21796
  inputs: ["aspectRatio", "dynamicData"],
21691
21797
  outputs: [
@@ -21747,9 +21853,14 @@ var ResourceAdminDetailsComponent = class ResourceAdminDetailsComponent extends
21747
21853
  ],
21748
21854
  outputs: ["ngModelChange"]
21749
21855
  },
21856
+ {
21857
+ kind: "directive",
21858
+ type: i9.TrackDirtyFormDirective,
21859
+ selector: "[formGroup]:not([formGroupSkipDirty])"
21860
+ },
21750
21861
  {
21751
21862
  kind: "component",
21752
- type: i11.QuillEditorComponent,
21863
+ type: i12.QuillEditorComponent,
21753
21864
  selector: "quill-editor"
21754
21865
  },
21755
21866
  {
@@ -21783,8 +21894,8 @@ i0.ɵɵngDeclareClassMetadata({
21783
21894
  { type: i1$1.AdminService },
21784
21895
  { type: i0.Injector },
21785
21896
  { type: i0.ChangeDetectorRef },
21786
- { type: i2$2.TagService },
21787
- { type: i2$2.SubscriptionService }
21897
+ { type: i2$1.TagService },
21898
+ { type: i2$1.SubscriptionService }
21788
21899
  ],
21789
21900
  propDecorators: { onSave: [] }
21790
21901
  });
@@ -21849,6 +21960,12 @@ i0.ɵɵngDeclareClassMetadata({
21849
21960
  ctorParameters: () => [{ type: i0.Injector }]
21850
21961
  });
21851
21962
  var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseComponent {
21963
+ get blogPermission() {
21964
+ return PermissionService.productPermission("Blog");
21965
+ }
21966
+ get isBlogAdmin() {
21967
+ return PermissionService.productPermission("Blog", "Admin");
21968
+ }
21852
21969
  constructor(adminService, tagService, injector, cdr, confirmDialog) {
21853
21970
  super(injector);
21854
21971
  this.adminService = adminService;
@@ -21876,8 +21993,6 @@ var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseCompo
21876
21993
  this.searchTextItems = typeof state.searchTextItems === "string" ? state.searchTextItems : "";
21877
21994
  }
21878
21995
  this.getUserSubscriptionId().subscribe((_) => {
21879
- this.blogPermission = `${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}.Blog`;
21880
- this.isBlogAdmin = `${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}.Blog.Admin`;
21881
21996
  this.cdr.markForCheck();
21882
21997
  });
21883
21998
  this.getUserSubscription().subscribe((response) => {
@@ -21970,7 +22085,7 @@ var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseCompo
21970
22085
  type: ResourcesIndexComponent,
21971
22086
  deps: [
21972
22087
  { token: i1$1.AdminService },
21973
- { token: i2$2.TagService },
22088
+ { token: i2$1.TagService },
21974
22089
  { token: i0.Injector },
21975
22090
  { token: i0.ChangeDetectorRef },
21976
22091
  { token: i6$2.ConfirmDialogService }
@@ -21992,7 +22107,7 @@ var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseCompo
21992
22107
  dependencies: [
21993
22108
  {
21994
22109
  kind: "component",
21995
- type: i2$4.Table,
22110
+ type: i2$3.Table,
21996
22111
  selector: "p-table",
21997
22112
  inputs: [
21998
22113
  "frozenColumns",
@@ -22105,19 +22220,19 @@ var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseCompo
22105
22220
  },
22106
22221
  {
22107
22222
  kind: "directive",
22108
- type: i2$4.SortableColumn,
22223
+ type: i2$3.SortableColumn,
22109
22224
  selector: "[pSortableColumn]",
22110
22225
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
22111
22226
  },
22112
22227
  {
22113
22228
  kind: "directive",
22114
- type: i2$4.ResizableColumn,
22229
+ type: i2$3.ResizableColumn,
22115
22230
  selector: "[pResizableColumn]",
22116
22231
  inputs: ["pResizableColumnDisabled"]
22117
22232
  },
22118
22233
  {
22119
22234
  kind: "component",
22120
- type: i2$4.SortIcon,
22235
+ type: i2$3.SortIcon,
22121
22236
  selector: "p-sort-icon, p-sorticon",
22122
22237
  inputs: ["field"]
22123
22238
  },
@@ -22291,7 +22406,7 @@ var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseCompo
22291
22406
  },
22292
22407
  {
22293
22408
  kind: "component",
22294
- type: i11$1.ProgressSpinner,
22409
+ type: i11.ProgressSpinner,
22295
22410
  selector: "p-progress-spinner, p-progressspinner",
22296
22411
  inputs: [
22297
22412
  "value",
@@ -22367,12 +22482,12 @@ var ResourcesIndexComponent = class ResourcesIndexComponent extends AppBaseCompo
22367
22482
  },
22368
22483
  {
22369
22484
  kind: "pipe",
22370
- type: i9.DateFormatPipe,
22485
+ type: i9$1.DateFormatPipe,
22371
22486
  name: "dateFormat"
22372
22487
  },
22373
22488
  {
22374
22489
  kind: "pipe",
22375
- type: i9.IfNameNullShowEmailPipe,
22490
+ type: i9$1.IfNameNullShowEmailPipe,
22376
22491
  name: "ifNameNullShowEmail"
22377
22492
  }
22378
22493
  ]
@@ -22395,7 +22510,7 @@ i0.ɵɵngDeclareClassMetadata({
22395
22510
  }],
22396
22511
  ctorParameters: () => [
22397
22512
  { type: i1$1.AdminService },
22398
- { type: i2$2.TagService },
22513
+ { type: i2$1.TagService },
22399
22514
  { type: i0.Injector },
22400
22515
  { type: i0.ChangeDetectorRef },
22401
22516
  { type: i6$2.ConfirmDialogService }
@@ -22529,7 +22644,7 @@ var ResourcesInsightComponent = class ResourcesInsightComponent extends AppBaseC
22529
22644
  },
22530
22645
  {
22531
22646
  kind: "component",
22532
- type: i11$1.ProgressSpinner,
22647
+ type: i11.ProgressSpinner,
22533
22648
  selector: "p-progress-spinner, p-progressspinner",
22534
22649
  inputs: [
22535
22650
  "value",
@@ -22631,7 +22746,7 @@ var ResourcesListsInsightComponent = class ResourcesListsInsightComponent extend
22631
22746
  dependencies: [
22632
22747
  {
22633
22748
  kind: "component",
22634
- type: i2$4.Table,
22749
+ type: i2$3.Table,
22635
22750
  selector: "p-table",
22636
22751
  inputs: [
22637
22752
  "frozenColumns",
@@ -22744,7 +22859,7 @@ var ResourcesListsInsightComponent = class ResourcesListsInsightComponent extend
22744
22859
  },
22745
22860
  {
22746
22861
  kind: "directive",
22747
- type: i2$4.ResizableColumn,
22862
+ type: i2$3.ResizableColumn,
22748
22863
  selector: "[pResizableColumn]",
22749
22864
  inputs: ["pResizableColumnDisabled"]
22750
22865
  },
@@ -22799,7 +22914,7 @@ var ResourcesListsInsightComponent = class ResourcesListsInsightComponent extend
22799
22914
  },
22800
22915
  {
22801
22916
  kind: "component",
22802
- type: i11$1.ProgressSpinner,
22917
+ type: i11.ProgressSpinner,
22803
22918
  selector: "p-progress-spinner, p-progressspinner",
22804
22919
  inputs: [
22805
22920
  "value",
@@ -22963,6 +23078,7 @@ var AgentDetailsComponent = class AgentDetailsComponent extends AppBaseComponent
22963
23078
  ...Object.keys(details).length ? { payout_details: details } : {}
22964
23079
  };
22965
23080
  this.groupService.updateAgent(this.subscriptionId, this.agentId, data).subscribe(() => {
23081
+ this.form.markAsPristine();
22966
23082
  this.toast.success(this.translation.translate("User.Subscriptions.UpdatedMessage"));
22967
23083
  this.back();
22968
23084
  this.cdr.markForCheck();
@@ -23001,7 +23117,7 @@ var AgentDetailsComponent = class AgentDetailsComponent extends AppBaseComponent
23001
23117
  type: AgentDetailsComponent,
23002
23118
  deps: [
23003
23119
  { token: i1$1.AdminService },
23004
- { token: i2$2.GroupService },
23120
+ { token: i2$1.GroupService },
23005
23121
  { token: i3$2.NgbDatepickerConfig },
23006
23122
  { token: i0.Injector },
23007
23123
  { token: i0.ChangeDetectorRef }
@@ -23102,7 +23218,7 @@ var AgentDetailsComponent = class AgentDetailsComponent extends AppBaseComponent
23102
23218
  },
23103
23219
  {
23104
23220
  kind: "component",
23105
- type: i2$3.Select,
23221
+ type: i2$2.Select,
23106
23222
  selector: "p-select",
23107
23223
  inputs: [
23108
23224
  "id",
@@ -23226,7 +23342,7 @@ var AgentDetailsComponent = class AgentDetailsComponent extends AppBaseComponent
23226
23342
  },
23227
23343
  {
23228
23344
  kind: "component",
23229
- type: i11$1.ProgressSpinner,
23345
+ type: i11.ProgressSpinner,
23230
23346
  selector: "p-progress-spinner, p-progressspinner",
23231
23347
  inputs: [
23232
23348
  "value",
@@ -23322,6 +23438,11 @@ var AgentDetailsComponent = class AgentDetailsComponent extends AppBaseComponent
23322
23438
  ],
23323
23439
  outputs: ["ngModelChange"]
23324
23440
  },
23441
+ {
23442
+ kind: "directive",
23443
+ type: i9.TrackDirtyFormDirective,
23444
+ selector: "[formGroup]:not([formGroupSkipDirty])"
23445
+ },
23325
23446
  {
23326
23447
  kind: "directive",
23327
23448
  type: i3$2.NgbInputDatepicker,
@@ -23383,7 +23504,7 @@ i0.ɵɵngDeclareClassMetadata({
23383
23504
  }],
23384
23505
  ctorParameters: () => [
23385
23506
  { type: i1$1.AdminService },
23386
- { type: i2$2.GroupService },
23507
+ { type: i2$1.GroupService },
23387
23508
  { type: i3$2.NgbDatepickerConfig },
23388
23509
  { type: i0.Injector },
23389
23510
  { type: i0.ChangeDetectorRef }
@@ -23445,10 +23566,10 @@ var SubscriptionProductsComponent = class SubscriptionProductsComponent extends
23445
23566
  ngImport: i0,
23446
23567
  type: SubscriptionProductsComponent,
23447
23568
  deps: [
23448
- { token: i2$2.SubscriptionService },
23569
+ { token: i2$1.SubscriptionService },
23449
23570
  { token: i0.Injector },
23450
23571
  { token: i0.ChangeDetectorRef },
23451
- { token: i2$2.ProductService }
23572
+ { token: i2$1.ProductService }
23452
23573
  ],
23453
23574
  target: i0.ɵɵFactoryTarget.Component
23454
23575
  });
@@ -23466,7 +23587,7 @@ var SubscriptionProductsComponent = class SubscriptionProductsComponent extends
23466
23587
  dependencies: [
23467
23588
  {
23468
23589
  kind: "component",
23469
- type: i2$4.Table,
23590
+ type: i2$3.Table,
23470
23591
  selector: "p-table",
23471
23592
  inputs: [
23472
23593
  "frozenColumns",
@@ -23579,7 +23700,7 @@ var SubscriptionProductsComponent = class SubscriptionProductsComponent extends
23579
23700
  },
23580
23701
  {
23581
23702
  kind: "directive",
23582
- type: i2$4.ResizableColumn,
23703
+ type: i2$3.ResizableColumn,
23583
23704
  selector: "[pResizableColumn]",
23584
23705
  inputs: ["pResizableColumnDisabled"]
23585
23706
  },
@@ -23662,7 +23783,7 @@ var SubscriptionProductsComponent = class SubscriptionProductsComponent extends
23662
23783
  },
23663
23784
  {
23664
23785
  kind: "component",
23665
- type: i11$1.ProgressSpinner,
23786
+ type: i11.ProgressSpinner,
23666
23787
  selector: "p-progress-spinner, p-progressspinner",
23667
23788
  inputs: [
23668
23789
  "value",
@@ -23753,10 +23874,10 @@ i0.ɵɵngDeclareClassMetadata({
23753
23874
  }]
23754
23875
  }],
23755
23876
  ctorParameters: () => [
23756
- { type: i2$2.SubscriptionService },
23877
+ { type: i2$1.SubscriptionService },
23757
23878
  { type: i0.Injector },
23758
23879
  { type: i0.ChangeDetectorRef },
23759
- { type: i2$2.ProductService }
23880
+ { type: i2$1.ProductService }
23760
23881
  ]
23761
23882
  });
23762
23883
  var AddMembersComponent = class AddMembersComponent extends AppBaseComponent {
@@ -23872,6 +23993,7 @@ var AddMembersComponent = class AddMembersComponent extends AppBaseComponent {
23872
23993
  this.subscriptionService.addMembersToSubscription(this.id, data).subscribe((response) => {
23873
23994
  if (response?.status === StatusCodes.OK) {
23874
23995
  this.membersAdded.emit();
23996
+ this.form.markAsPristine();
23875
23997
  this.toast.success(response.message);
23876
23998
  this.form.setControl("emailsFormArray", this.formBuilder.array([this.createItem()]));
23877
23999
  } else this.toast.error(response.error.message);
@@ -23894,8 +24016,8 @@ var AddMembersComponent = class AddMembersComponent extends AppBaseComponent {
23894
24016
  { token: i0.Injector },
23895
24017
  { token: i0.ChangeDetectorRef },
23896
24018
  { token: i10.UntypedFormBuilder },
23897
- { token: i2$2.SubscriptionService },
23898
- { token: i2$2.AuthService },
24019
+ { token: i2$1.SubscriptionService },
24020
+ { token: i2$1.AuthService },
23899
24021
  { token: i6$2.ConfirmDialogService }
23900
24022
  ],
23901
24023
  target: i0.ɵɵFactoryTarget.Component
@@ -23984,6 +24106,11 @@ var AddMembersComponent = class AddMembersComponent extends AppBaseComponent {
23984
24106
  selector: "[formArrayName]",
23985
24107
  inputs: ["formArrayName"]
23986
24108
  },
24109
+ {
24110
+ kind: "directive",
24111
+ type: i9.TrackDirtyFormDirective,
24112
+ selector: "[formGroup]:not([formGroupSkipDirty])"
24113
+ },
23987
24114
  {
23988
24115
  kind: "pipe",
23989
24116
  type: i8$2.TranslocoPipe,
@@ -24011,8 +24138,8 @@ i0.ɵɵngDeclareClassMetadata({
24011
24138
  { type: i0.Injector },
24012
24139
  { type: i0.ChangeDetectorRef },
24013
24140
  { type: i10.UntypedFormBuilder },
24014
- { type: i2$2.SubscriptionService },
24015
- { type: i2$2.AuthService },
24141
+ { type: i2$1.SubscriptionService },
24142
+ { type: i2$1.AuthService },
24016
24143
  { type: i6$2.ConfirmDialogService }
24017
24144
  ],
24018
24145
  propDecorators: {
@@ -24198,13 +24325,13 @@ var SubscriptionUsersComponent = class SubscriptionUsersComponent extends AppBas
24198
24325
  ngImport: i0,
24199
24326
  type: SubscriptionUsersComponent,
24200
24327
  deps: [
24201
- { token: i2$2.SubscriptionService },
24328
+ { token: i2$1.SubscriptionService },
24202
24329
  { token: i0.Injector },
24203
24330
  { token: i0.ChangeDetectorRef },
24204
- { token: i2$2.AuthService },
24205
- { token: i2$2.WindowService },
24331
+ { token: i2$1.AuthService },
24332
+ { token: i2$1.WindowService },
24206
24333
  { token: i1$1.AdminService },
24207
- { token: i2$2.CustomToastService },
24334
+ { token: i2$1.CustomToastService },
24208
24335
  { token: i6$2.ConfirmDialogService }
24209
24336
  ],
24210
24337
  target: i0.ɵɵFactoryTarget.Component
@@ -24239,12 +24366,12 @@ var SubscriptionUsersComponent = class SubscriptionUsersComponent extends AppBas
24239
24366
  ],
24240
24367
  usesInheritance: true,
24241
24368
  ngImport: i0,
24242
- template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <li></li>\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n } @else {\n <li class=\"mx-3\"></li>\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24369
+ template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24243
24370
  styles: [".hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.info-icon{vertical-align:middle;margin-left:5px}.first-name{margin-right:5px}\n"],
24244
24371
  dependencies: [
24245
24372
  {
24246
24373
  kind: "component",
24247
- type: i2$4.Table,
24374
+ type: i2$3.Table,
24248
24375
  selector: "p-table",
24249
24376
  inputs: [
24250
24377
  "frozenColumns",
@@ -24357,19 +24484,19 @@ var SubscriptionUsersComponent = class SubscriptionUsersComponent extends AppBas
24357
24484
  },
24358
24485
  {
24359
24486
  kind: "directive",
24360
- type: i2$4.SortableColumn,
24487
+ type: i2$3.SortableColumn,
24361
24488
  selector: "[pSortableColumn]",
24362
24489
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
24363
24490
  },
24364
24491
  {
24365
24492
  kind: "directive",
24366
- type: i2$4.ResizableColumn,
24493
+ type: i2$3.ResizableColumn,
24367
24494
  selector: "[pResizableColumn]",
24368
24495
  inputs: ["pResizableColumnDisabled"]
24369
24496
  },
24370
24497
  {
24371
24498
  kind: "component",
24372
- type: i2$4.SortIcon,
24499
+ type: i2$3.SortIcon,
24373
24500
  selector: "p-sort-icon, p-sorticon",
24374
24501
  inputs: ["field"]
24375
24502
  },
@@ -24459,7 +24586,7 @@ var SubscriptionUsersComponent = class SubscriptionUsersComponent extends AppBas
24459
24586
  },
24460
24587
  {
24461
24588
  kind: "component",
24462
- type: i11$1.ProgressSpinner,
24589
+ type: i11.ProgressSpinner,
24463
24590
  selector: "p-progress-spinner, p-progressspinner",
24464
24591
  inputs: [
24465
24592
  "value",
@@ -24542,17 +24669,17 @@ var SubscriptionUsersComponent = class SubscriptionUsersComponent extends AppBas
24542
24669
  },
24543
24670
  {
24544
24671
  kind: "pipe",
24545
- type: i9.DateFormatPipe,
24672
+ type: i9$1.DateFormatPipe,
24546
24673
  name: "dateFormat"
24547
24674
  },
24548
24675
  {
24549
24676
  kind: "pipe",
24550
- type: i9.SinceAgoPipe,
24677
+ type: i9$1.SinceAgoPipe,
24551
24678
  name: "sinceAgo"
24552
24679
  },
24553
24680
  {
24554
24681
  kind: "pipe",
24555
- type: i9.IsOnlinePipe,
24682
+ type: i9$1.IsOnlinePipe,
24556
24683
  name: "isOnline"
24557
24684
  }
24558
24685
  ]
@@ -24569,18 +24696,18 @@ i0.ɵɵngDeclareClassMetadata({
24569
24696
  args: [{
24570
24697
  selector: "pw-subscription-users",
24571
24698
  standalone: false,
24572
- template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <li></li>\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n } @else {\n <li class=\"mx-3\"></li>\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24699
+ template: "<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner></p-progress-spinner>\n }\n</div>\n@if (!isAddEnabled && canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <div class=\"text-end mb-2\">\n <button class=\"btn btn-sm btn-outline-primary\" (click)=\"isAddEnabled = true\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add Members\n </button>\n </div>\n}\n@if (!isAddEnabled) {\n <section id=\"members\"\n >\n <div [class.hideTable]=\"totalUnfilteredCount === 0\"\n class=\"primeng-datatable-container actions-collapsed table-responsive mt-0\">\n <p-table #dt\n stateKey=\"pw-table.admin-subscription-users\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"subscriptionMembers\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n [customSort]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template #caption>\n <div class=\"text-end\">\n <label for=\"subscription-users-search\" class=\"visually-hidden\">Search subscription users</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input id=\"subscription-users-search\"\n name=\"subscription-users-search\"\n [(ngModel)]=\"searchText\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n type=\"text\"\n pInputText\n placeholder=\"Search subscription users...\"\n aria-label=\"Search subscription users...\" />\n </p-iconfield>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Subscriptions.NickName' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"has_password\">\n {{ 'Admin.Subscriptions.EmailConfirmed' | transloco }}\n <p-sort-icon field=\"has_password\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Subscriptions.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th scope=\"true\" class=\"actions-list-two\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"Id\">{{ user.id }}</td>\n <td data-head=\"First Name\">\n <span class=\"first-name\">{{ user.first_name }}</span>\n @if (subscriptionOwnerUserId === user.id) {\n <span *rbacAllow=\"'Pages.Alpha'\" class=\"badge bg-primary mx-1\"> Owner </span>\n }\n @if (subscriptionAdmins?.includes(user?.id)) {\n <span class=\"badge bg-success mx-1 admin-badge\"> Admin </span>\n }\n \n </td>\n <td data-head=\"Last Name\">\n {{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\"></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Nick Name\">\n <a [routerLink]=\"['/members', user.slug]\">{{ user.slug }}</a>\n </td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{ itemsArray: [true, false], item: user?.has_password }\"\n color=\"success-danger\"\n class=\"badge\">\n {{ user?.has_password ? 'Yes' : 'No' }}\n </span>\n @if (user?.blocked) {\n <span\n [pTooltip]=\"'This user has been blocked'\"\n class=\"ms-2\"\n tooltipPosition=\"top\"\n appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <span>\n &nbsp;({{ user.current_sign_in_at | sinceAgo }})\n </span>\n </span>\n } @else {\n <span>\n <span>\n {{ user.last_sign_in_at | dateFormat }}\n </span>\n @if (user.last_sign_in_at) {\n <span>\n &nbsp;({{ user.last_sign_in_at | sinceAgo }})\n </span>\n }\n </span>\n }\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onImpersonate(user)\" (keydown.enter)=\"onImpersonate(user)\" class=\"fas fa-people-arrows fa-lg\" aria-hidden=\"true\"></i>\n </li>\n @if (subscriptionOwnerUserId !== user.id) {\n <li *rbacAllow=\"'Pages.Alpha'\" pTooltip=\"Set this user as new owner\" tooltipPosition=\"top\" appendTo=\"body\" class=\"me-2 me-sm-3\">\n <i (click)=\"onChangeOwner(user)\" (keydown.enter)=\"onChangeOwner(user)\" class=\"fa fa-key warning fa-lg\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (user?.enable_two_factor_authenticator) {\n <li *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n pTooltip=\"Disable 2FA\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 success\">\n <i class=\"fa fa-lock\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isUserSubscriptionSuperAdmin) {\n <!-- Make Admin -->\n @if (!subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Make Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-user-crown fa-lg success\"\n (click)=\"makeAdmin(user, true)\"\n (keydown.enter)=\"makeAdmin(users, true)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n <!-- Remove Admin -->\n @if (subscriptionAdmins?.includes(user.id)) {\n <li pTooltip=\"Remove Admin\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3 mx-2\"\n >\n <i\n class=\"fa fa-ban warning fa-lg\"\n (keydown.enter)=\"makeAdmin(user, false)\"\n (click)=\"makeAdmin(user, false)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n }\n }\n @if (canShowSubscriptionActions) {\n <li\n [routerLink]=\"[routers.usersDetails + user.id]\"\n pTooltip=\"Edit\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n @if (canShowSubscriptionActions && isGranted('Pages.Admin.Users.Delete')) {\n <li\n pTooltip=\"Remove user from subscription\"\n tooltipPosition=\"top\"\n appendTo=\"body\"\n class=\"me-2 me-sm-3\">\n <i (click)=\"onDelete(user)\"\n (keydown.enter)=\"onDelete(user)\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"></i>\n </li>\n }\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalUnfilteredCount !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n @if (totalUnfilteredCount === 0 && isLoaded) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionUsersMessage' | transloco\">\n </pw-no-data>\n </div>\n }\n </section>\n}\n\n@if (isAddEnabled) {\n <section id=\"manage-members\"\n >\n <pw-add-members (membersAdded)=\"onMembersAdded()\"\n ></pw-add-members>\n </section>\n}\n\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for delete user -->\n\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
24573
24700
  styles: [".hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.info-icon{vertical-align:middle;margin-left:5px}.first-name{margin-right:5px}\n"]
24574
24701
  }]
24575
24702
  }],
24576
24703
  ctorParameters: () => [
24577
- { type: i2$2.SubscriptionService },
24704
+ { type: i2$1.SubscriptionService },
24578
24705
  { type: i0.Injector },
24579
24706
  { type: i0.ChangeDetectorRef },
24580
- { type: i2$2.AuthService },
24581
- { type: i2$2.WindowService },
24707
+ { type: i2$1.AuthService },
24708
+ { type: i2$1.WindowService },
24582
24709
  { type: i1$1.AdminService },
24583
- { type: i2$2.CustomToastService },
24710
+ { type: i2$1.CustomToastService },
24584
24711
  { type: i6$2.ConfirmDialogService }
24585
24712
  ],
24586
24713
  propDecorators: {
@@ -24750,7 +24877,7 @@ var SubscriptionAgentsListComponent = class SubscriptionAgentsListComponent exte
24750
24877
  dependencies: [
24751
24878
  {
24752
24879
  kind: "component",
24753
- type: i2$4.Table,
24880
+ type: i2$3.Table,
24754
24881
  selector: "p-table",
24755
24882
  inputs: [
24756
24883
  "frozenColumns",
@@ -24863,7 +24990,7 @@ var SubscriptionAgentsListComponent = class SubscriptionAgentsListComponent exte
24863
24990
  },
24864
24991
  {
24865
24992
  kind: "directive",
24866
- type: i2$4.ResizableColumn,
24993
+ type: i2$3.ResizableColumn,
24867
24994
  selector: "[pResizableColumn]",
24868
24995
  inputs: ["pResizableColumnDisabled"]
24869
24996
  },
@@ -24976,7 +25103,7 @@ var SubscriptionAgentsListComponent = class SubscriptionAgentsListComponent exte
24976
25103
  },
24977
25104
  {
24978
25105
  kind: "component",
24979
- type: i2$3.Select,
25106
+ type: i2$2.Select,
24980
25107
  selector: "p-select",
24981
25108
  inputs: [
24982
25109
  "id",
@@ -25110,7 +25237,7 @@ var SubscriptionAgentsListComponent = class SubscriptionAgentsListComponent exte
25110
25237
  },
25111
25238
  {
25112
25239
  kind: "component",
25113
- type: i11$1.ProgressSpinner,
25240
+ type: i11.ProgressSpinner,
25114
25241
  selector: "p-progress-spinner, p-progressspinner",
25115
25242
  inputs: [
25116
25243
  "value",
@@ -25216,6 +25343,11 @@ var SubscriptionAgentsListComponent = class SubscriptionAgentsListComponent exte
25216
25343
  ],
25217
25344
  outputs: ["ngModelChange"]
25218
25345
  },
25346
+ {
25347
+ kind: "directive",
25348
+ type: i9.TrackDirtyFormDirective,
25349
+ selector: "[formGroup]:not([formGroupSkipDirty])"
25350
+ },
25219
25351
  {
25220
25352
  kind: "directive",
25221
25353
  type: i3$2.NgbInputDatepicker,
@@ -25258,7 +25390,7 @@ var SubscriptionAgentsListComponent = class SubscriptionAgentsListComponent exte
25258
25390
  },
25259
25391
  {
25260
25392
  kind: "pipe",
25261
- type: i9.DateFormatPipe,
25393
+ type: i9$1.DateFormatPipe,
25262
25394
  name: "dateFormat"
25263
25395
  }
25264
25396
  ]
@@ -25397,7 +25529,7 @@ var SubscriptionInvoicesComponent = class SubscriptionInvoicesComponent extends
25397
25529
  dependencies: [
25398
25530
  {
25399
25531
  kind: "component",
25400
- type: i2$4.Table,
25532
+ type: i2$3.Table,
25401
25533
  selector: "p-table",
25402
25534
  inputs: [
25403
25535
  "frozenColumns",
@@ -25510,7 +25642,7 @@ var SubscriptionInvoicesComponent = class SubscriptionInvoicesComponent extends
25510
25642
  },
25511
25643
  {
25512
25644
  kind: "directive",
25513
- type: i2$4.ResizableColumn,
25645
+ type: i2$3.ResizableColumn,
25514
25646
  selector: "[pResizableColumn]",
25515
25647
  inputs: ["pResizableColumnDisabled"]
25516
25648
  },
@@ -25544,7 +25676,7 @@ var SubscriptionInvoicesComponent = class SubscriptionInvoicesComponent extends
25544
25676
  },
25545
25677
  {
25546
25678
  kind: "component",
25547
- type: i2$3.Select,
25679
+ type: i2$2.Select,
25548
25680
  selector: "p-select",
25549
25681
  inputs: [
25550
25682
  "id",
@@ -25693,7 +25825,7 @@ var SubscriptionInvoicesComponent = class SubscriptionInvoicesComponent extends
25693
25825
  },
25694
25826
  {
25695
25827
  kind: "pipe",
25696
- type: i9.DateFormatPipe,
25828
+ type: i9$1.DateFormatPipe,
25697
25829
  name: "dateFormat"
25698
25830
  }
25699
25831
  ]
@@ -25876,6 +26008,7 @@ var SubscriptionDetailsComponent = class SubscriptionDetailsComponent extends Ap
25876
26008
  company_url: formValue.company_url
25877
26009
  };
25878
26010
  this.subscriptionService.updateSubscription(this.id, data).subscribe(() => {
26011
+ this.form.markAsPristine();
25879
26012
  this.router.navigate(["/admin/subscriptions/list"]);
25880
26013
  this.toast.success(this.translation.translate("Admin.Subscriptions.UpdatedMessage"));
25881
26014
  this.getAgentsDetails(this.id);
@@ -25924,11 +26057,11 @@ var SubscriptionDetailsComponent = class SubscriptionDetailsComponent extends Ap
25924
26057
  ngImport: i0,
25925
26058
  type: SubscriptionDetailsComponent,
25926
26059
  deps: [
25927
- { token: i2$2.SubscriptionService },
26060
+ { token: i2$1.SubscriptionService },
25928
26061
  { token: i1$1.AdminService },
25929
26062
  { token: i5$2.DatePipe },
25930
- { token: i2$2.CommonService },
25931
- { token: i2$2.NgbDateCustomParserFormatter },
26063
+ { token: i2$1.CommonService },
26064
+ { token: i2$1.NgbDateCustomParserFormatter },
25932
26065
  { token: i0.Injector },
25933
26066
  { token: i0.ChangeDetectorRef }
25934
26067
  ],
@@ -25977,7 +26110,7 @@ var SubscriptionDetailsComponent = class SubscriptionDetailsComponent extends Ap
25977
26110
  },
25978
26111
  {
25979
26112
  kind: "component",
25980
- type: i2$3.Select,
26113
+ type: i2$2.Select,
25981
26114
  selector: "p-select",
25982
26115
  inputs: [
25983
26116
  "id",
@@ -26256,7 +26389,7 @@ var SubscriptionDetailsComponent = class SubscriptionDetailsComponent extends Ap
26256
26389
  },
26257
26390
  {
26258
26391
  kind: "component",
26259
- type: i11$1.ProgressSpinner,
26392
+ type: i11.ProgressSpinner,
26260
26393
  selector: "p-progress-spinner, p-progressspinner",
26261
26394
  inputs: [
26262
26395
  "value",
@@ -26341,6 +26474,11 @@ var SubscriptionDetailsComponent = class SubscriptionDetailsComponent extends Ap
26341
26474
  ],
26342
26475
  outputs: ["ngModelChange"]
26343
26476
  },
26477
+ {
26478
+ kind: "directive",
26479
+ type: i9.TrackDirtyFormDirective,
26480
+ selector: "[formGroup]:not([formGroupSkipDirty])"
26481
+ },
26344
26482
  {
26345
26483
  kind: "directive",
26346
26484
  type: i3$2.NgbInputDatepicker,
@@ -26425,11 +26563,11 @@ i0.ɵɵngDeclareClassMetadata({
26425
26563
  }]
26426
26564
  }],
26427
26565
  ctorParameters: () => [
26428
- { type: i2$2.SubscriptionService },
26566
+ { type: i2$1.SubscriptionService },
26429
26567
  { type: i1$1.AdminService },
26430
26568
  { type: i5$2.DatePipe },
26431
- { type: i2$2.CommonService },
26432
- { type: i2$2.NgbDateCustomParserFormatter },
26569
+ { type: i2$1.CommonService },
26570
+ { type: i2$1.NgbDateCustomParserFormatter },
26433
26571
  { type: i0.Injector },
26434
26572
  { type: i0.ChangeDetectorRef }
26435
26573
  ]
@@ -26555,6 +26693,7 @@ var SubscriptionProductDetailsComponent = class SubscriptionProductDetailsCompon
26555
26693
  if (this.form.value?.new_product_id) data["new_product_id"] = this.form.value?.new_product_id?.id ?? null;
26556
26694
  if (this.form.value.purchased_units) data["purchased_units"] = this.form.value.purchased_units;
26557
26695
  this.adminService.updateSubscriptionProduct(data).subscribe({ next: () => {
26696
+ this.form.markAsPristine();
26558
26697
  this.toast.success(this.translation.translate("Admin.Subscriptions.UpdatedMessage"));
26559
26698
  this.back();
26560
26699
  this.cdr.markForCheck();
@@ -26587,8 +26726,8 @@ var SubscriptionProductDetailsComponent = class SubscriptionProductDetailsCompon
26587
26726
  { token: i0.Injector },
26588
26727
  { token: i0.ChangeDetectorRef },
26589
26728
  { token: i1$1.AdminService },
26590
- { token: i2$2.ProductService },
26591
- { token: i2$2.NgbDateCustomParserFormatter },
26729
+ { token: i2$1.ProductService },
26730
+ { token: i2$1.NgbDateCustomParserFormatter },
26592
26731
  { token: i5$2.DatePipe }
26593
26732
  ],
26594
26733
  target: i0.ɵɵFactoryTarget.Component
@@ -26757,7 +26896,7 @@ var SubscriptionProductDetailsComponent = class SubscriptionProductDetailsCompon
26757
26896
  },
26758
26897
  {
26759
26898
  kind: "component",
26760
- type: i11$1.ProgressSpinner,
26899
+ type: i11.ProgressSpinner,
26761
26900
  selector: "p-progress-spinner, p-progressspinner",
26762
26901
  inputs: [
26763
26902
  "value",
@@ -26817,6 +26956,11 @@ var SubscriptionProductDetailsComponent = class SubscriptionProductDetailsCompon
26817
26956
  ],
26818
26957
  outputs: ["ngModelChange"]
26819
26958
  },
26959
+ {
26960
+ kind: "directive",
26961
+ type: i9.TrackDirtyFormDirective,
26962
+ selector: "[formGroup]:not([formGroupSkipDirty])"
26963
+ },
26820
26964
  {
26821
26965
  kind: "directive",
26822
26966
  type: i3$2.NgbInputDatepicker,
@@ -26879,8 +27023,8 @@ i0.ɵɵngDeclareClassMetadata({
26879
27023
  { type: i0.Injector },
26880
27024
  { type: i0.ChangeDetectorRef },
26881
27025
  { type: i1$1.AdminService },
26882
- { type: i2$2.ProductService },
26883
- { type: i2$2.NgbDateCustomParserFormatter },
27026
+ { type: i2$1.ProductService },
27027
+ { type: i2$1.NgbDateCustomParserFormatter },
26884
27028
  { type: i5$2.DatePipe }
26885
27029
  ],
26886
27030
  propDecorators: {
@@ -27020,7 +27164,7 @@ var InsightComponent = class InsightComponent extends AppBaseComponent {
27020
27164
  },
27021
27165
  {
27022
27166
  kind: "component",
27023
- type: i11$1.ProgressSpinner,
27167
+ type: i11.ProgressSpinner,
27024
27168
  selector: "p-progress-spinner, p-progressspinner",
27025
27169
  inputs: [
27026
27170
  "value",
@@ -27132,7 +27276,7 @@ var SubscriptionInsightNpsComponent = class SubscriptionInsightNpsComponent exte
27132
27276
  deps: [
27133
27277
  { token: i1$1.AdminService },
27134
27278
  { token: i0.Injector },
27135
- { token: i2$2.CommonService },
27279
+ { token: i2$1.CommonService },
27136
27280
  { token: i3$2.NgbModal },
27137
27281
  { token: i0.ChangeDetectorRef }
27138
27282
  ],
@@ -27159,7 +27303,7 @@ var SubscriptionInsightNpsComponent = class SubscriptionInsightNpsComponent exte
27159
27303
  dependencies: [
27160
27304
  {
27161
27305
  kind: "component",
27162
- type: i2$4.Table,
27306
+ type: i2$3.Table,
27163
27307
  selector: "p-table",
27164
27308
  inputs: [
27165
27309
  "frozenColumns",
@@ -27272,19 +27416,19 @@ var SubscriptionInsightNpsComponent = class SubscriptionInsightNpsComponent exte
27272
27416
  },
27273
27417
  {
27274
27418
  kind: "directive",
27275
- type: i2$4.SortableColumn,
27419
+ type: i2$3.SortableColumn,
27276
27420
  selector: "[pSortableColumn]",
27277
27421
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
27278
27422
  },
27279
27423
  {
27280
27424
  kind: "directive",
27281
- type: i2$4.ResizableColumn,
27425
+ type: i2$3.ResizableColumn,
27282
27426
  selector: "[pResizableColumn]",
27283
27427
  inputs: ["pResizableColumnDisabled"]
27284
27428
  },
27285
27429
  {
27286
27430
  kind: "component",
27287
- type: i2$4.SortIcon,
27431
+ type: i2$3.SortIcon,
27288
27432
  selector: "p-sort-icon, p-sorticon",
27289
27433
  inputs: ["field"]
27290
27434
  },
@@ -27396,7 +27540,7 @@ var SubscriptionInsightNpsComponent = class SubscriptionInsightNpsComponent exte
27396
27540
  },
27397
27541
  {
27398
27542
  kind: "component",
27399
- type: i11$1.ProgressSpinner,
27543
+ type: i11.ProgressSpinner,
27400
27544
  selector: "p-progress-spinner, p-progressspinner",
27401
27545
  inputs: [
27402
27546
  "value",
@@ -27451,7 +27595,7 @@ var SubscriptionInsightNpsComponent = class SubscriptionInsightNpsComponent exte
27451
27595
  },
27452
27596
  {
27453
27597
  kind: "pipe",
27454
- type: i9.DateFormatPipe,
27598
+ type: i9$1.DateFormatPipe,
27455
27599
  name: "dateFormat"
27456
27600
  }
27457
27601
  ]
@@ -27474,7 +27618,7 @@ i0.ɵɵngDeclareClassMetadata({
27474
27618
  ctorParameters: () => [
27475
27619
  { type: i1$1.AdminService },
27476
27620
  { type: i0.Injector },
27477
- { type: i2$2.CommonService },
27621
+ { type: i2$1.CommonService },
27478
27622
  { type: i3$2.NgbModal },
27479
27623
  { type: i0.ChangeDetectorRef }
27480
27624
  ],
@@ -27672,7 +27816,7 @@ var SubscriptionInsightAveragePriceComponent = class SubscriptionInsightAverageP
27672
27816
  },
27673
27817
  {
27674
27818
  kind: "component",
27675
- type: i11$1.ProgressSpinner,
27819
+ type: i11.ProgressSpinner,
27676
27820
  selector: "p-progress-spinner, p-progressspinner",
27677
27821
  inputs: [
27678
27822
  "value",
@@ -27821,7 +27965,7 @@ var SubscriptionInsightProcuctSessionComponent = class SubscriptionInsightProcuc
27821
27965
  },
27822
27966
  {
27823
27967
  kind: "component",
27824
- type: i11$1.ProgressSpinner,
27968
+ type: i11.ProgressSpinner,
27825
27969
  selector: "p-progress-spinner, p-progressspinner",
27826
27970
  inputs: [
27827
27971
  "value",
@@ -27970,7 +28114,7 @@ var SubscriptionInsightUserSessionComponent = class SubscriptionInsightUserSessi
27970
28114
  },
27971
28115
  {
27972
28116
  kind: "component",
27973
- type: i11$1.ProgressSpinner,
28117
+ type: i11.ProgressSpinner,
27974
28118
  selector: "p-progress-spinner, p-progressspinner",
27975
28119
  inputs: [
27976
28120
  "value",
@@ -28119,7 +28263,7 @@ var SubscriptionInsightAverageUserComponent = class SubscriptionInsightAverageUs
28119
28263
  },
28120
28264
  {
28121
28265
  kind: "component",
28122
- type: i11$1.ProgressSpinner,
28266
+ type: i11.ProgressSpinner,
28123
28267
  selector: "p-progress-spinner, p-progressspinner",
28124
28268
  inputs: [
28125
28269
  "value",
@@ -28282,7 +28426,7 @@ var SubscriptionInsightRevenueComponent = class SubscriptionInsightRevenueCompon
28282
28426
  },
28283
28427
  {
28284
28428
  kind: "component",
28285
- type: i11$1.ProgressSpinner,
28429
+ type: i11.ProgressSpinner,
28286
28430
  selector: "p-progress-spinner, p-progressspinner",
28287
28431
  inputs: [
28288
28432
  "value",
@@ -28445,7 +28589,7 @@ var SubscriptionInsightChurnComponent = class SubscriptionInsightChurnComponent
28445
28589
  },
28446
28590
  {
28447
28591
  kind: "component",
28448
- type: i11$1.ProgressSpinner,
28592
+ type: i11.ProgressSpinner,
28449
28593
  selector: "p-progress-spinner, p-progressspinner",
28450
28594
  inputs: [
28451
28595
  "value",
@@ -28812,9 +28956,9 @@ var InviteUsersComponent = class InviteUsersComponent extends AppBaseComponent {
28812
28956
  deps: [
28813
28957
  { token: i10.UntypedFormBuilder },
28814
28958
  { token: i1$1.AdminService },
28815
- { token: i2$2.ProductService },
28959
+ { token: i2$1.ProductService },
28816
28960
  { token: i0.Injector },
28817
- { token: i2$2.CommonService },
28961
+ { token: i2$1.CommonService },
28818
28962
  { token: i0.ChangeDetectorRef }
28819
28963
  ],
28820
28964
  target: i0.ɵɵFactoryTarget.Component
@@ -28919,7 +29063,7 @@ var InviteUsersComponent = class InviteUsersComponent extends AppBaseComponent {
28919
29063
  },
28920
29064
  {
28921
29065
  kind: "component",
28922
- type: i2$3.Select,
29066
+ type: i2$2.Select,
28923
29067
  selector: "p-select",
28924
29068
  inputs: [
28925
29069
  "id",
@@ -29078,6 +29222,11 @@ var InviteUsersComponent = class InviteUsersComponent extends AppBaseComponent {
29078
29222
  ],
29079
29223
  outputs: ["ngModelChange"]
29080
29224
  },
29225
+ {
29226
+ kind: "directive",
29227
+ type: i9.TrackDirtyFormDirective,
29228
+ selector: "[formGroup]:not([formGroupSkipDirty])"
29229
+ },
29081
29230
  {
29082
29231
  kind: "pipe",
29083
29232
  type: i5$2.AsyncPipe,
@@ -29109,9 +29258,9 @@ i0.ɵɵngDeclareClassMetadata({
29109
29258
  ctorParameters: () => [
29110
29259
  { type: i10.UntypedFormBuilder },
29111
29260
  { type: i1$1.AdminService },
29112
- { type: i2$2.ProductService },
29261
+ { type: i2$1.ProductService },
29113
29262
  { type: i0.Injector },
29114
- { type: i2$2.CommonService },
29263
+ { type: i2$1.CommonService },
29115
29264
  { type: i0.ChangeDetectorRef }
29116
29265
  ],
29117
29266
  propDecorators: { refProduct: [{
@@ -29406,12 +29555,12 @@ var SubscriptionsListComponent = class SubscriptionsListComponent extends AppBas
29406
29555
  ngImport: i0,
29407
29556
  type: SubscriptionsListComponent,
29408
29557
  deps: [
29409
- { token: i2$2.ProductService },
29558
+ { token: i2$1.ProductService },
29410
29559
  { token: i1$1.AdminService },
29411
29560
  { token: i10.UntypedFormBuilder },
29412
29561
  { token: i0.Injector },
29413
29562
  { token: i0.ChangeDetectorRef },
29414
- { token: i2$2.CommonService },
29563
+ { token: i2$1.CommonService },
29415
29564
  { token: i6$2.ConfirmDialogService }
29416
29565
  ],
29417
29566
  target: i0.ɵɵFactoryTarget.Component
@@ -29442,7 +29591,7 @@ var SubscriptionsListComponent = class SubscriptionsListComponent extends AppBas
29442
29591
  dependencies: [
29443
29592
  {
29444
29593
  kind: "component",
29445
- type: i2$4.Table,
29594
+ type: i2$3.Table,
29446
29595
  selector: "p-table",
29447
29596
  inputs: [
29448
29597
  "frozenColumns",
@@ -29555,19 +29704,19 @@ var SubscriptionsListComponent = class SubscriptionsListComponent extends AppBas
29555
29704
  },
29556
29705
  {
29557
29706
  kind: "directive",
29558
- type: i2$4.SortableColumn,
29707
+ type: i2$3.SortableColumn,
29559
29708
  selector: "[pSortableColumn]",
29560
29709
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
29561
29710
  },
29562
29711
  {
29563
29712
  kind: "directive",
29564
- type: i2$4.ResizableColumn,
29713
+ type: i2$3.ResizableColumn,
29565
29714
  selector: "[pResizableColumn]",
29566
29715
  inputs: ["pResizableColumnDisabled"]
29567
29716
  },
29568
29717
  {
29569
29718
  kind: "component",
29570
- type: i2$4.SortIcon,
29719
+ type: i2$3.SortIcon,
29571
29720
  selector: "p-sort-icon, p-sorticon",
29572
29721
  inputs: ["field"]
29573
29722
  },
@@ -29601,7 +29750,7 @@ var SubscriptionsListComponent = class SubscriptionsListComponent extends AppBas
29601
29750
  },
29602
29751
  {
29603
29752
  kind: "component",
29604
- type: i2$3.Select,
29753
+ type: i2$2.Select,
29605
29754
  selector: "p-select",
29606
29755
  inputs: [
29607
29756
  "id",
@@ -29818,7 +29967,7 @@ var SubscriptionsListComponent = class SubscriptionsListComponent extends AppBas
29818
29967
  },
29819
29968
  {
29820
29969
  kind: "component",
29821
- type: i11$1.ProgressSpinner,
29970
+ type: i11.ProgressSpinner,
29822
29971
  selector: "p-progress-spinner, p-progressspinner",
29823
29972
  inputs: [
29824
29973
  "value",
@@ -29899,17 +30048,17 @@ var SubscriptionsListComponent = class SubscriptionsListComponent extends AppBas
29899
30048
  },
29900
30049
  {
29901
30050
  kind: "pipe",
29902
- type: i9.DateFormatPipe,
30051
+ type: i9$1.DateFormatPipe,
29903
30052
  name: "dateFormat"
29904
30053
  },
29905
30054
  {
29906
30055
  kind: "pipe",
29907
- type: i9.SinceAgoPipe,
30056
+ type: i9$1.SinceAgoPipe,
29908
30057
  name: "sinceAgo"
29909
30058
  },
29910
30059
  {
29911
30060
  kind: "pipe",
29912
- type: i9.TextTruncatePipe,
30061
+ type: i9$1.TextTruncatePipe,
29913
30062
  name: "textTruncate"
29914
30063
  },
29915
30064
  {
@@ -29936,12 +30085,12 @@ i0.ɵɵngDeclareClassMetadata({
29936
30085
  }]
29937
30086
  }],
29938
30087
  ctorParameters: () => [
29939
- { type: i2$2.ProductService },
30088
+ { type: i2$1.ProductService },
29940
30089
  { type: i1$1.AdminService },
29941
30090
  { type: i10.UntypedFormBuilder },
29942
30091
  { type: i0.Injector },
29943
30092
  { type: i0.ChangeDetectorRef },
29944
- { type: i2$2.CommonService },
30093
+ { type: i2$1.CommonService },
29945
30094
  { type: i6$2.ConfirmDialogService }
29946
30095
  ],
29947
30096
  propDecorators: {
@@ -30139,8 +30288,8 @@ var TagsCategoryComponent = class TagsCategoryComponent extends AppBaseComponent
30139
30288
  type: TagsCategoryComponent,
30140
30289
  deps: [
30141
30290
  { token: i0.Injector },
30142
- { token: i2$2.TagService },
30143
- { token: i2$2.CustomToastService },
30291
+ { token: i2$1.TagService },
30292
+ { token: i2$1.CustomToastService },
30144
30293
  { token: i3$2.NgbModal },
30145
30294
  { token: i0.ChangeDetectorRef },
30146
30295
  { token: i6$2.ConfirmDialogService }
@@ -30162,7 +30311,7 @@ var TagsCategoryComponent = class TagsCategoryComponent extends AppBaseComponent
30162
30311
  dependencies: [
30163
30312
  {
30164
30313
  kind: "component",
30165
- type: i2$4.Table,
30314
+ type: i2$3.Table,
30166
30315
  selector: "p-table",
30167
30316
  inputs: [
30168
30317
  "frozenColumns",
@@ -30275,19 +30424,19 @@ var TagsCategoryComponent = class TagsCategoryComponent extends AppBaseComponent
30275
30424
  },
30276
30425
  {
30277
30426
  kind: "directive",
30278
- type: i2$4.SortableColumn,
30427
+ type: i2$3.SortableColumn,
30279
30428
  selector: "[pSortableColumn]",
30280
30429
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
30281
30430
  },
30282
30431
  {
30283
30432
  kind: "directive",
30284
- type: i2$4.ResizableColumn,
30433
+ type: i2$3.ResizableColumn,
30285
30434
  selector: "[pResizableColumn]",
30286
30435
  inputs: ["pResizableColumnDisabled"]
30287
30436
  },
30288
30437
  {
30289
30438
  kind: "component",
30290
- type: i2$4.SortIcon,
30439
+ type: i2$3.SortIcon,
30291
30440
  selector: "p-sort-icon, p-sorticon",
30292
30441
  inputs: ["field"]
30293
30442
  },
@@ -30394,7 +30543,7 @@ var TagsCategoryComponent = class TagsCategoryComponent extends AppBaseComponent
30394
30543
  },
30395
30544
  {
30396
30545
  kind: "component",
30397
- type: i11$1.ProgressSpinner,
30546
+ type: i11.ProgressSpinner,
30398
30547
  selector: "p-progress-spinner, p-progressspinner",
30399
30548
  inputs: [
30400
30549
  "value",
@@ -30459,8 +30608,8 @@ i0.ɵɵngDeclareClassMetadata({
30459
30608
  }],
30460
30609
  ctorParameters: () => [
30461
30610
  { type: i0.Injector },
30462
- { type: i2$2.TagService },
30463
- { type: i2$2.CustomToastService },
30611
+ { type: i2$1.TagService },
30612
+ { type: i2$1.CustomToastService },
30464
30613
  { type: i3$2.NgbModal },
30465
30614
  { type: i0.ChangeDetectorRef },
30466
30615
  { type: i6$2.ConfirmDialogService }
@@ -30585,7 +30734,7 @@ var TagDetailsComponent = class TagDetailsComponent extends AppBaseComponent {
30585
30734
  type: TagDetailsComponent,
30586
30735
  deps: [
30587
30736
  { token: i0.Injector },
30588
- { token: i2$2.TagService },
30737
+ { token: i2$1.TagService },
30589
30738
  { token: i0.ChangeDetectorRef },
30590
30739
  { token: i3$2.NgbModal }
30591
30740
  ],
@@ -30605,7 +30754,7 @@ var TagDetailsComponent = class TagDetailsComponent extends AppBaseComponent {
30605
30754
  dependencies: [
30606
30755
  {
30607
30756
  kind: "component",
30608
- type: i2$3.Select,
30757
+ type: i2$2.Select,
30609
30758
  selector: "p-select",
30610
30759
  inputs: [
30611
30760
  "id",
@@ -30729,7 +30878,7 @@ var TagDetailsComponent = class TagDetailsComponent extends AppBaseComponent {
30729
30878
  },
30730
30879
  {
30731
30880
  kind: "component",
30732
- type: i12.ProfileImageCropperComponent,
30881
+ type: i12$1.ProfileImageCropperComponent,
30733
30882
  selector: "pw-image-cropper",
30734
30883
  inputs: ["aspectRatio", "dynamicData"],
30735
30884
  outputs: [
@@ -30791,6 +30940,11 @@ var TagDetailsComponent = class TagDetailsComponent extends AppBaseComponent {
30791
30940
  ],
30792
30941
  outputs: ["ngModelChange"]
30793
30942
  },
30943
+ {
30944
+ kind: "directive",
30945
+ type: i9.TrackDirtyFormDirective,
30946
+ selector: "[formGroup]:not([formGroupSkipDirty])"
30947
+ },
30794
30948
  {
30795
30949
  kind: "pipe",
30796
30950
  type: i8$2.TranslocoPipe,
@@ -30817,7 +30971,7 @@ i0.ɵɵngDeclareClassMetadata({
30817
30971
  }],
30818
30972
  ctorParameters: () => [
30819
30973
  { type: i0.Injector },
30820
- { type: i2$2.TagService },
30974
+ { type: i2$1.TagService },
30821
30975
  { type: i0.ChangeDetectorRef },
30822
30976
  { type: i3$2.NgbModal }
30823
30977
  ]
@@ -30935,7 +31089,7 @@ var TagsListComponent = class TagsListComponent extends AppBaseComponent {
30935
31089
  deps: [
30936
31090
  { token: i0.Injector },
30937
31091
  { token: i3$2.NgbModal },
30938
- { token: i2$2.TagService },
31092
+ { token: i2$1.TagService },
30939
31093
  { token: i0.ChangeDetectorRef },
30940
31094
  { token: i6$2.ConfirmDialogService }
30941
31095
  ],
@@ -30956,7 +31110,7 @@ var TagsListComponent = class TagsListComponent extends AppBaseComponent {
30956
31110
  dependencies: [
30957
31111
  {
30958
31112
  kind: "component",
30959
- type: i2$4.Table,
31113
+ type: i2$3.Table,
30960
31114
  selector: "p-table",
30961
31115
  inputs: [
30962
31116
  "frozenColumns",
@@ -31069,19 +31223,19 @@ var TagsListComponent = class TagsListComponent extends AppBaseComponent {
31069
31223
  },
31070
31224
  {
31071
31225
  kind: "directive",
31072
- type: i2$4.SortableColumn,
31226
+ type: i2$3.SortableColumn,
31073
31227
  selector: "[pSortableColumn]",
31074
31228
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
31075
31229
  },
31076
31230
  {
31077
31231
  kind: "directive",
31078
- type: i2$4.ResizableColumn,
31232
+ type: i2$3.ResizableColumn,
31079
31233
  selector: "[pResizableColumn]",
31080
31234
  inputs: ["pResizableColumnDisabled"]
31081
31235
  },
31082
31236
  {
31083
31237
  kind: "component",
31084
- type: i2$4.SortIcon,
31238
+ type: i2$3.SortIcon,
31085
31239
  selector: "p-sort-icon, p-sorticon",
31086
31240
  inputs: ["field"]
31087
31241
  },
@@ -31164,7 +31318,7 @@ var TagsListComponent = class TagsListComponent extends AppBaseComponent {
31164
31318
  },
31165
31319
  {
31166
31320
  kind: "component",
31167
- type: i11$1.ProgressSpinner,
31321
+ type: i11.ProgressSpinner,
31168
31322
  selector: "p-progress-spinner, p-progressspinner",
31169
31323
  inputs: [
31170
31324
  "value",
@@ -31254,7 +31408,7 @@ i0.ɵɵngDeclareClassMetadata({
31254
31408
  ctorParameters: () => [
31255
31409
  { type: i0.Injector },
31256
31410
  { type: i3$2.NgbModal },
31257
- { type: i2$2.TagService },
31411
+ { type: i2$1.TagService },
31258
31412
  { type: i0.ChangeDetectorRef },
31259
31413
  { type: i6$2.ConfirmDialogService }
31260
31414
  ]
@@ -31364,6 +31518,7 @@ var TipComponent = class TipComponent extends AppBaseComponent {
31364
31518
  onSave() {
31365
31519
  this.buttonBusy = true;
31366
31520
  (this.id ? this.tipService.saveTips(this.id, this.form.value, this.subscriptionId) : this.tipService.addTips(this.form.value, this.subscriptionId)).subscribe(() => {
31521
+ this.form.markAsPristine();
31367
31522
  this.router.navigate(["../list"], { relativeTo: this.route });
31368
31523
  this.toast.success(this.translation.translate("Admin.Tips.UpdatedMessage"));
31369
31524
  this.cdr.markForCheck();
@@ -31382,7 +31537,7 @@ var TipComponent = class TipComponent extends AppBaseComponent {
31382
31537
  ngImport: i0,
31383
31538
  type: TipComponent,
31384
31539
  deps: [
31385
- { token: i2$2.TipsService },
31540
+ { token: i2$1.TipsService },
31386
31541
  { token: i0.Injector },
31387
31542
  { token: i0.ChangeDetectorRef }
31388
31543
  ],
@@ -31451,7 +31606,7 @@ var TipComponent = class TipComponent extends AppBaseComponent {
31451
31606
  },
31452
31607
  {
31453
31608
  kind: "component",
31454
- type: i11$1.ProgressSpinner,
31609
+ type: i11.ProgressSpinner,
31455
31610
  selector: "p-progress-spinner, p-progressspinner",
31456
31611
  inputs: [
31457
31612
  "value",
@@ -31517,6 +31672,11 @@ var TipComponent = class TipComponent extends AppBaseComponent {
31517
31672
  ],
31518
31673
  outputs: ["ngModelChange"]
31519
31674
  },
31675
+ {
31676
+ kind: "directive",
31677
+ type: i9.TrackDirtyFormDirective,
31678
+ selector: "[formGroup]:not([formGroupSkipDirty])"
31679
+ },
31520
31680
  {
31521
31681
  kind: "pipe",
31522
31682
  type: i8$2.TranslocoPipe,
@@ -31542,7 +31702,7 @@ i0.ɵɵngDeclareClassMetadata({
31542
31702
  }]
31543
31703
  }],
31544
31704
  ctorParameters: () => [
31545
- { type: i2$2.TipsService },
31705
+ { type: i2$1.TipsService },
31546
31706
  { type: i0.Injector },
31547
31707
  { type: i0.ChangeDetectorRef }
31548
31708
  ],
@@ -31583,7 +31743,7 @@ var TipsComponent = class TipsComponent extends AppBaseComponent {
31583
31743
  ngImport: i0,
31584
31744
  type: TipsComponent,
31585
31745
  deps: [
31586
- { token: i2$2.TipsService },
31746
+ { token: i2$1.TipsService },
31587
31747
  { token: i0.ChangeDetectorRef },
31588
31748
  { token: i0.Injector }
31589
31749
  ],
@@ -31603,7 +31763,7 @@ var TipsComponent = class TipsComponent extends AppBaseComponent {
31603
31763
  dependencies: [
31604
31764
  {
31605
31765
  kind: "component",
31606
- type: i2$4.Table,
31766
+ type: i2$3.Table,
31607
31767
  selector: "p-table",
31608
31768
  inputs: [
31609
31769
  "frozenColumns",
@@ -31716,7 +31876,7 @@ var TipsComponent = class TipsComponent extends AppBaseComponent {
31716
31876
  },
31717
31877
  {
31718
31878
  kind: "directive",
31719
- type: i2$4.ResizableColumn,
31879
+ type: i2$3.ResizableColumn,
31720
31880
  selector: "[pResizableColumn]",
31721
31881
  inputs: ["pResizableColumnDisabled"]
31722
31882
  },
@@ -31750,7 +31910,7 @@ var TipsComponent = class TipsComponent extends AppBaseComponent {
31750
31910
  },
31751
31911
  {
31752
31912
  kind: "component",
31753
- type: i11$1.ProgressSpinner,
31913
+ type: i11.ProgressSpinner,
31754
31914
  selector: "p-progress-spinner, p-progressspinner",
31755
31915
  inputs: [
31756
31916
  "value",
@@ -31815,7 +31975,7 @@ var TipsComponent = class TipsComponent extends AppBaseComponent {
31815
31975
  },
31816
31976
  {
31817
31977
  kind: "pipe",
31818
- type: i9.DateFormatPipe,
31978
+ type: i9$1.DateFormatPipe,
31819
31979
  name: "dateFormat"
31820
31980
  }
31821
31981
  ]
@@ -31836,7 +31996,7 @@ i0.ɵɵngDeclareClassMetadata({
31836
31996
  }]
31837
31997
  }],
31838
31998
  ctorParameters: () => [
31839
- { type: i2$2.TipsService },
31999
+ { type: i2$1.TipsService },
31840
32000
  { type: i0.ChangeDetectorRef },
31841
32001
  { type: i0.Injector }
31842
32002
  ]
@@ -31983,7 +32143,7 @@ var TermsOfServiceComponent = class TermsOfServiceComponent extends AppBaseCompo
31983
32143
  dependencies: [
31984
32144
  {
31985
32145
  kind: "component",
31986
- type: i2$4.Table,
32146
+ type: i2$3.Table,
31987
32147
  selector: "p-table",
31988
32148
  inputs: [
31989
32149
  "frozenColumns",
@@ -32096,19 +32256,19 @@ var TermsOfServiceComponent = class TermsOfServiceComponent extends AppBaseCompo
32096
32256
  },
32097
32257
  {
32098
32258
  kind: "directive",
32099
- type: i2$4.SortableColumn,
32259
+ type: i2$3.SortableColumn,
32100
32260
  selector: "[pSortableColumn]",
32101
32261
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
32102
32262
  },
32103
32263
  {
32104
32264
  kind: "directive",
32105
- type: i2$4.ResizableColumn,
32265
+ type: i2$3.ResizableColumn,
32106
32266
  selector: "[pResizableColumn]",
32107
32267
  inputs: ["pResizableColumnDisabled"]
32108
32268
  },
32109
32269
  {
32110
32270
  kind: "component",
32111
- type: i2$4.SortIcon,
32271
+ type: i2$3.SortIcon,
32112
32272
  selector: "p-sort-icon, p-sorticon",
32113
32273
  inputs: ["field"]
32114
32274
  },
@@ -32191,7 +32351,7 @@ var TermsOfServiceComponent = class TermsOfServiceComponent extends AppBaseCompo
32191
32351
  },
32192
32352
  {
32193
32353
  kind: "component",
32194
- type: i11$1.ProgressSpinner,
32354
+ type: i11.ProgressSpinner,
32195
32355
  selector: "p-progress-spinner, p-progressspinner",
32196
32356
  inputs: [
32197
32357
  "value",
@@ -32251,12 +32411,12 @@ var TermsOfServiceComponent = class TermsOfServiceComponent extends AppBaseCompo
32251
32411
  },
32252
32412
  {
32253
32413
  kind: "pipe",
32254
- type: i9.RemoveHtmlPipe,
32414
+ type: i9$1.RemoveHtmlPipe,
32255
32415
  name: "removeHtml"
32256
32416
  },
32257
32417
  {
32258
32418
  kind: "pipe",
32259
- type: i9.TextTruncatePipe,
32419
+ type: i9$1.TextTruncatePipe,
32260
32420
  name: "textTruncate"
32261
32421
  }
32262
32422
  ]
@@ -32285,15 +32445,12 @@ i0.ɵɵngDeclareClassMetadata({
32285
32445
  ]
32286
32446
  });
32287
32447
  var TermsOfServiceDetailsComponent = class TermsOfServiceDetailsComponent extends AppBaseComponent {
32288
- constructor(adminService, injector, cdr, unsavedChanges) {
32448
+ constructor(adminService, injector, cdr) {
32289
32449
  super(injector);
32290
32450
  this.adminService = adminService;
32291
32451
  this.cdr = cdr;
32292
- this.unsavedChanges = unsavedChanges;
32293
32452
  this.isLoading = true;
32294
32453
  this.submitted = false;
32295
- this.saved = false;
32296
- this.unregisterUnsaved = null;
32297
32454
  QuillHelper.init();
32298
32455
  this.editorConfig = QuillHelper.getEditorConfig();
32299
32456
  this.form = AppAdmin.getTosForm();
@@ -32305,10 +32462,6 @@ var TermsOfServiceDetailsComponent = class TermsOfServiceDetailsComponent extend
32305
32462
  else this.isLoading = false;
32306
32463
  this.cdr.markForCheck();
32307
32464
  });
32308
- this.unregisterUnsaved = this.unsavedChanges.watch(() => this.hasUnsavedChanges());
32309
- }
32310
- hasUnsavedChanges() {
32311
- return this.form.dirty && !this.saved;
32312
32465
  }
32313
32466
  ngAfterViewInit() {
32314
32467
  HelperService.subscribeToEditorChanges(this.form, "privacy");
@@ -32334,7 +32487,6 @@ var TermsOfServiceDetailsComponent = class TermsOfServiceDetailsComponent extend
32334
32487
  (this.id ? this.adminService.updateTos(this.id, data) : this.adminService.postTos(data)).subscribe((response) => {
32335
32488
  this.form.patchValue(response);
32336
32489
  this.form.markAsPristine();
32337
- this.saved = true;
32338
32490
  this.toast.success(this.translation.translate("Tos.UpdatedMessage"));
32339
32491
  this.back();
32340
32492
  this.cdr.markForCheck();
@@ -32357,10 +32509,6 @@ var TermsOfServiceDetailsComponent = class TermsOfServiceDetailsComponent extend
32357
32509
  this.cdr.markForCheck();
32358
32510
  });
32359
32511
  }
32360
- ngOnDestroy() {
32361
- this.unregisterUnsaved?.();
32362
- super.ngOnDestroy();
32363
- }
32364
32512
  static {
32365
32513
  this.ɵfac = i0.ɵɵngDeclareFactory({
32366
32514
  minVersion: "12.0.0",
@@ -32370,8 +32518,7 @@ var TermsOfServiceDetailsComponent = class TermsOfServiceDetailsComponent extend
32370
32518
  deps: [
32371
32519
  { token: i1$1.AdminService },
32372
32520
  { token: i0.Injector },
32373
- { token: i0.ChangeDetectorRef },
32374
- { token: i2$1.UnsavedChangesService }
32521
+ { token: i0.ChangeDetectorRef }
32375
32522
  ],
32376
32523
  target: i0.ɵɵFactoryTarget.Component
32377
32524
  });
@@ -32494,7 +32641,7 @@ var TermsOfServiceDetailsComponent = class TermsOfServiceDetailsComponent extend
32494
32641
  },
32495
32642
  {
32496
32643
  kind: "component",
32497
- type: i11$1.ProgressSpinner,
32644
+ type: i11.ProgressSpinner,
32498
32645
  selector: "p-progress-spinner, p-progressspinner",
32499
32646
  inputs: [
32500
32647
  "value",
@@ -32573,9 +32720,14 @@ var TermsOfServiceDetailsComponent = class TermsOfServiceDetailsComponent extend
32573
32720
  ],
32574
32721
  outputs: ["ngModelChange"]
32575
32722
  },
32723
+ {
32724
+ kind: "directive",
32725
+ type: i9.TrackDirtyFormDirective,
32726
+ selector: "[formGroup]:not([formGroupSkipDirty])"
32727
+ },
32576
32728
  {
32577
32729
  kind: "component",
32578
- type: i11.QuillEditorComponent,
32730
+ type: i12.QuillEditorComponent,
32579
32731
  selector: "quill-editor"
32580
32732
  },
32581
32733
  {
@@ -32605,8 +32757,7 @@ i0.ɵɵngDeclareClassMetadata({
32605
32757
  ctorParameters: () => [
32606
32758
  { type: i1$1.AdminService },
32607
32759
  { type: i0.Injector },
32608
- { type: i0.ChangeDetectorRef },
32609
- { type: i2$1.UnsavedChangesService }
32760
+ { type: i0.ChangeDetectorRef }
32610
32761
  ],
32611
32762
  propDecorators: { onSave: [] }
32612
32763
  });
@@ -32824,7 +32975,7 @@ var AhoyEventsComponent = class AhoyEventsComponent extends AppBaseComponent {
32824
32975
  deps: [
32825
32976
  { token: i0.Injector },
32826
32977
  { token: i3$2.NgbModal },
32827
- { token: i2$2.AhoyService },
32978
+ { token: i2$1.AhoyService },
32828
32979
  { token: i1$1.AdminDataService },
32829
32980
  { token: i0.ChangeDetectorRef }
32830
32981
  ],
@@ -32851,7 +33002,7 @@ var AhoyEventsComponent = class AhoyEventsComponent extends AppBaseComponent {
32851
33002
  dependencies: [
32852
33003
  {
32853
33004
  kind: "component",
32854
- type: i2$4.Table,
33005
+ type: i2$3.Table,
32855
33006
  selector: "p-table",
32856
33007
  inputs: [
32857
33008
  "frozenColumns",
@@ -32964,25 +33115,25 @@ var AhoyEventsComponent = class AhoyEventsComponent extends AppBaseComponent {
32964
33115
  },
32965
33116
  {
32966
33117
  kind: "directive",
32967
- type: i2$4.SortableColumn,
33118
+ type: i2$3.SortableColumn,
32968
33119
  selector: "[pSortableColumn]",
32969
33120
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
32970
33121
  },
32971
33122
  {
32972
33123
  kind: "directive",
32973
- type: i2$4.ResizableColumn,
33124
+ type: i2$3.ResizableColumn,
32974
33125
  selector: "[pResizableColumn]",
32975
33126
  inputs: ["pResizableColumnDisabled"]
32976
33127
  },
32977
33128
  {
32978
33129
  kind: "component",
32979
- type: i2$4.SortIcon,
33130
+ type: i2$3.SortIcon,
32980
33131
  selector: "p-sort-icon, p-sorticon",
32981
33132
  inputs: ["field"]
32982
33133
  },
32983
33134
  {
32984
33135
  kind: "component",
32985
- type: i2$3.Select,
33136
+ type: i2$2.Select,
32986
33137
  selector: "p-select",
32987
33138
  inputs: [
32988
33139
  "id",
@@ -33275,7 +33426,7 @@ var AhoyEventsComponent = class AhoyEventsComponent extends AppBaseComponent {
33275
33426
  },
33276
33427
  {
33277
33428
  kind: "component",
33278
- type: i11$1.ProgressSpinner,
33429
+ type: i11.ProgressSpinner,
33279
33430
  selector: "p-progress-spinner, p-progressspinner",
33280
33431
  inputs: [
33281
33432
  "value",
@@ -33340,7 +33491,7 @@ var AhoyEventsComponent = class AhoyEventsComponent extends AppBaseComponent {
33340
33491
  },
33341
33492
  {
33342
33493
  kind: "pipe",
33343
- type: i9.DateFormatPipe,
33494
+ type: i9$1.DateFormatPipe,
33344
33495
  name: "dateFormat"
33345
33496
  }
33346
33497
  ]
@@ -33364,7 +33515,7 @@ i0.ɵɵngDeclareClassMetadata({
33364
33515
  ctorParameters: () => [
33365
33516
  { type: i0.Injector },
33366
33517
  { type: i3$2.NgbModal },
33367
- { type: i2$2.AhoyService },
33518
+ { type: i2$1.AhoyService },
33368
33519
  { type: i1$1.AdminDataService },
33369
33520
  { type: i0.ChangeDetectorRef }
33370
33521
  ],
@@ -33520,7 +33671,7 @@ var AhoyMessagesComponent = class AhoyMessagesComponent extends AppBaseComponent
33520
33671
  type: AhoyMessagesComponent,
33521
33672
  deps: [
33522
33673
  { token: i0.Injector },
33523
- { token: i2$2.AhoyService },
33674
+ { token: i2$1.AhoyService },
33524
33675
  { token: i0.ChangeDetectorRef },
33525
33676
  { token: i1$1.AdminDataService }
33526
33677
  ],
@@ -33541,7 +33692,7 @@ var AhoyMessagesComponent = class AhoyMessagesComponent extends AppBaseComponent
33541
33692
  dependencies: [
33542
33693
  {
33543
33694
  kind: "component",
33544
- type: i2$4.Table,
33695
+ type: i2$3.Table,
33545
33696
  selector: "p-table",
33546
33697
  inputs: [
33547
33698
  "frozenColumns",
@@ -33654,25 +33805,25 @@ var AhoyMessagesComponent = class AhoyMessagesComponent extends AppBaseComponent
33654
33805
  },
33655
33806
  {
33656
33807
  kind: "directive",
33657
- type: i2$4.SortableColumn,
33808
+ type: i2$3.SortableColumn,
33658
33809
  selector: "[pSortableColumn]",
33659
33810
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
33660
33811
  },
33661
33812
  {
33662
33813
  kind: "directive",
33663
- type: i2$4.ResizableColumn,
33814
+ type: i2$3.ResizableColumn,
33664
33815
  selector: "[pResizableColumn]",
33665
33816
  inputs: ["pResizableColumnDisabled"]
33666
33817
  },
33667
33818
  {
33668
33819
  kind: "component",
33669
- type: i2$4.SortIcon,
33820
+ type: i2$3.SortIcon,
33670
33821
  selector: "p-sort-icon, p-sorticon",
33671
33822
  inputs: ["field"]
33672
33823
  },
33673
33824
  {
33674
33825
  kind: "component",
33675
- type: i2$3.Select,
33826
+ type: i2$2.Select,
33676
33827
  selector: "p-select",
33677
33828
  inputs: [
33678
33829
  "id",
@@ -33954,7 +34105,7 @@ var AhoyMessagesComponent = class AhoyMessagesComponent extends AppBaseComponent
33954
34105
  },
33955
34106
  {
33956
34107
  kind: "component",
33957
- type: i11$1.ProgressSpinner,
34108
+ type: i11.ProgressSpinner,
33958
34109
  selector: "p-progress-spinner, p-progressspinner",
33959
34110
  inputs: [
33960
34111
  "value",
@@ -34014,12 +34165,12 @@ var AhoyMessagesComponent = class AhoyMessagesComponent extends AppBaseComponent
34014
34165
  },
34015
34166
  {
34016
34167
  kind: "pipe",
34017
- type: i9.DateFormatPipe,
34168
+ type: i9$1.DateFormatPipe,
34018
34169
  name: "dateFormat"
34019
34170
  },
34020
34171
  {
34021
34172
  kind: "pipe",
34022
- type: i9.TextTruncatePipe,
34173
+ type: i9$1.TextTruncatePipe,
34023
34174
  name: "textTruncate"
34024
34175
  }
34025
34176
  ]
@@ -34042,7 +34193,7 @@ i0.ɵɵngDeclareClassMetadata({
34042
34193
  }],
34043
34194
  ctorParameters: () => [
34044
34195
  { type: i0.Injector },
34045
- { type: i2$2.AhoyService },
34196
+ { type: i2$1.AhoyService },
34046
34197
  { type: i0.ChangeDetectorRef },
34047
34198
  { type: i1$1.AdminDataService }
34048
34199
  ]
@@ -34194,7 +34345,7 @@ var AhoyVisitsComponent = class AhoyVisitsComponent extends AppBaseComponent {
34194
34345
  type: AhoyVisitsComponent,
34195
34346
  deps: [
34196
34347
  { token: i0.Injector },
34197
- { token: i2$2.AhoyService },
34348
+ { token: i2$1.AhoyService },
34198
34349
  { token: i1$1.AdminDataService },
34199
34350
  { token: i0.ChangeDetectorRef }
34200
34351
  ],
@@ -34215,7 +34366,7 @@ var AhoyVisitsComponent = class AhoyVisitsComponent extends AppBaseComponent {
34215
34366
  dependencies: [
34216
34367
  {
34217
34368
  kind: "component",
34218
- type: i2$4.Table,
34369
+ type: i2$3.Table,
34219
34370
  selector: "p-table",
34220
34371
  inputs: [
34221
34372
  "frozenColumns",
@@ -34328,19 +34479,19 @@ var AhoyVisitsComponent = class AhoyVisitsComponent extends AppBaseComponent {
34328
34479
  },
34329
34480
  {
34330
34481
  kind: "directive",
34331
- type: i2$4.SortableColumn,
34482
+ type: i2$3.SortableColumn,
34332
34483
  selector: "[pSortableColumn]",
34333
34484
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
34334
34485
  },
34335
34486
  {
34336
34487
  kind: "directive",
34337
- type: i2$4.ResizableColumn,
34488
+ type: i2$3.ResizableColumn,
34338
34489
  selector: "[pResizableColumn]",
34339
34490
  inputs: ["pResizableColumnDisabled"]
34340
34491
  },
34341
34492
  {
34342
34493
  kind: "component",
34343
- type: i2$4.SortIcon,
34494
+ type: i2$3.SortIcon,
34344
34495
  selector: "p-sort-icon, p-sorticon",
34345
34496
  inputs: ["field"]
34346
34497
  },
@@ -34374,7 +34525,7 @@ var AhoyVisitsComponent = class AhoyVisitsComponent extends AppBaseComponent {
34374
34525
  },
34375
34526
  {
34376
34527
  kind: "component",
34377
- type: i2$3.Select,
34528
+ type: i2$2.Select,
34378
34529
  selector: "p-select",
34379
34530
  inputs: [
34380
34531
  "id",
@@ -34656,7 +34807,7 @@ var AhoyVisitsComponent = class AhoyVisitsComponent extends AppBaseComponent {
34656
34807
  },
34657
34808
  {
34658
34809
  kind: "component",
34659
- type: i11$1.ProgressSpinner,
34810
+ type: i11.ProgressSpinner,
34660
34811
  selector: "p-progress-spinner, p-progressspinner",
34661
34812
  inputs: [
34662
34813
  "value",
@@ -34716,12 +34867,12 @@ var AhoyVisitsComponent = class AhoyVisitsComponent extends AppBaseComponent {
34716
34867
  },
34717
34868
  {
34718
34869
  kind: "pipe",
34719
- type: i9.DateFormatPipe,
34870
+ type: i9$1.DateFormatPipe,
34720
34871
  name: "dateFormat"
34721
34872
  },
34722
34873
  {
34723
34874
  kind: "pipe",
34724
- type: i9.TextTruncatePipe,
34875
+ type: i9$1.TextTruncatePipe,
34725
34876
  name: "textTruncate"
34726
34877
  }
34727
34878
  ]
@@ -34744,7 +34895,7 @@ i0.ɵɵngDeclareClassMetadata({
34744
34895
  }],
34745
34896
  ctorParameters: () => [
34746
34897
  { type: i0.Injector },
34747
- { type: i2$2.AhoyService },
34898
+ { type: i2$1.AhoyService },
34748
34899
  { type: i1$1.AdminDataService },
34749
34900
  { type: i0.ChangeDetectorRef }
34750
34901
  ]
@@ -34898,7 +35049,7 @@ var EventsComponent = class EventsComponent extends AppBaseComponent {
34898
35049
  deps: [
34899
35050
  { token: i0.Injector },
34900
35051
  { token: i0.ChangeDetectorRef },
34901
- { token: i2$2.AhoyService },
35052
+ { token: i2$1.AhoyService },
34902
35053
  { token: i1$1.AdminDataService }
34903
35054
  ],
34904
35055
  target: i0.ɵɵFactoryTarget.Component
@@ -34918,7 +35069,7 @@ var EventsComponent = class EventsComponent extends AppBaseComponent {
34918
35069
  dependencies: [
34919
35070
  {
34920
35071
  kind: "component",
34921
- type: i2$4.Table,
35072
+ type: i2$3.Table,
34922
35073
  selector: "p-table",
34923
35074
  inputs: [
34924
35075
  "frozenColumns",
@@ -35031,25 +35182,25 @@ var EventsComponent = class EventsComponent extends AppBaseComponent {
35031
35182
  },
35032
35183
  {
35033
35184
  kind: "directive",
35034
- type: i2$4.SortableColumn,
35185
+ type: i2$3.SortableColumn,
35035
35186
  selector: "[pSortableColumn]",
35036
35187
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
35037
35188
  },
35038
35189
  {
35039
35190
  kind: "directive",
35040
- type: i2$4.ResizableColumn,
35191
+ type: i2$3.ResizableColumn,
35041
35192
  selector: "[pResizableColumn]",
35042
35193
  inputs: ["pResizableColumnDisabled"]
35043
35194
  },
35044
35195
  {
35045
35196
  kind: "component",
35046
- type: i2$4.SortIcon,
35197
+ type: i2$3.SortIcon,
35047
35198
  selector: "p-sort-icon, p-sorticon",
35048
35199
  inputs: ["field"]
35049
35200
  },
35050
35201
  {
35051
35202
  kind: "component",
35052
- type: i2$3.Select,
35203
+ type: i2$2.Select,
35053
35204
  selector: "p-select",
35054
35205
  inputs: [
35055
35206
  "id",
@@ -35331,7 +35482,7 @@ var EventsComponent = class EventsComponent extends AppBaseComponent {
35331
35482
  },
35332
35483
  {
35333
35484
  kind: "component",
35334
- type: i11$1.ProgressSpinner,
35485
+ type: i11.ProgressSpinner,
35335
35486
  selector: "p-progress-spinner, p-progressspinner",
35336
35487
  inputs: [
35337
35488
  "value",
@@ -35391,7 +35542,7 @@ var EventsComponent = class EventsComponent extends AppBaseComponent {
35391
35542
  },
35392
35543
  {
35393
35544
  kind: "pipe",
35394
- type: i9.DateFormatPipe,
35545
+ type: i9$1.DateFormatPipe,
35395
35546
  name: "dateFormat"
35396
35547
  }
35397
35548
  ]
@@ -35415,7 +35566,7 @@ i0.ɵɵngDeclareClassMetadata({
35415
35566
  ctorParameters: () => [
35416
35567
  { type: i0.Injector },
35417
35568
  { type: i0.ChangeDetectorRef },
35418
- { type: i2$2.AhoyService },
35569
+ { type: i2$1.AhoyService },
35419
35570
  { type: i1$1.AdminDataService }
35420
35571
  ]
35421
35572
  });
@@ -35659,7 +35810,7 @@ var VersionsComponent = class VersionsComponent extends AppBaseComponent {
35659
35810
  type: VersionsComponent,
35660
35811
  deps: [
35661
35812
  { token: i0.Injector },
35662
- { token: i2$2.AhoyService },
35813
+ { token: i2$1.AhoyService },
35663
35814
  { token: i3$2.NgbModal },
35664
35815
  { token: i1$1.AdminDataService },
35665
35816
  { token: i0.ChangeDetectorRef }
@@ -35681,7 +35832,7 @@ var VersionsComponent = class VersionsComponent extends AppBaseComponent {
35681
35832
  dependencies: [
35682
35833
  {
35683
35834
  kind: "component",
35684
- type: i2$4.Table,
35835
+ type: i2$3.Table,
35685
35836
  selector: "p-table",
35686
35837
  inputs: [
35687
35838
  "frozenColumns",
@@ -35794,25 +35945,25 @@ var VersionsComponent = class VersionsComponent extends AppBaseComponent {
35794
35945
  },
35795
35946
  {
35796
35947
  kind: "directive",
35797
- type: i2$4.SortableColumn,
35948
+ type: i2$3.SortableColumn,
35798
35949
  selector: "[pSortableColumn]",
35799
35950
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
35800
35951
  },
35801
35952
  {
35802
35953
  kind: "directive",
35803
- type: i2$4.ResizableColumn,
35954
+ type: i2$3.ResizableColumn,
35804
35955
  selector: "[pResizableColumn]",
35805
35956
  inputs: ["pResizableColumnDisabled"]
35806
35957
  },
35807
35958
  {
35808
35959
  kind: "component",
35809
- type: i2$4.SortIcon,
35960
+ type: i2$3.SortIcon,
35810
35961
  selector: "p-sort-icon, p-sorticon",
35811
35962
  inputs: ["field"]
35812
35963
  },
35813
35964
  {
35814
35965
  kind: "component",
35815
- type: i2$3.Select,
35966
+ type: i2$2.Select,
35816
35967
  selector: "p-select",
35817
35968
  inputs: [
35818
35969
  "id",
@@ -36105,7 +36256,7 @@ var VersionsComponent = class VersionsComponent extends AppBaseComponent {
36105
36256
  },
36106
36257
  {
36107
36258
  kind: "component",
36108
- type: i11$1.ProgressSpinner,
36259
+ type: i11.ProgressSpinner,
36109
36260
  selector: "p-progress-spinner, p-progressspinner",
36110
36261
  inputs: [
36111
36262
  "value",
@@ -36176,7 +36327,7 @@ var VersionsComponent = class VersionsComponent extends AppBaseComponent {
36176
36327
  },
36177
36328
  {
36178
36329
  kind: "pipe",
36179
- type: i9.DateFormatPipe,
36330
+ type: i9$1.DateFormatPipe,
36180
36331
  name: "dateFormat"
36181
36332
  }
36182
36333
  ]
@@ -36199,7 +36350,7 @@ i0.ɵɵngDeclareClassMetadata({
36199
36350
  }],
36200
36351
  ctorParameters: () => [
36201
36352
  { type: i0.Injector },
36202
- { type: i2$2.AhoyService },
36353
+ { type: i2$1.AhoyService },
36203
36354
  { type: i3$2.NgbModal },
36204
36355
  { type: i1$1.AdminDataService },
36205
36356
  { type: i0.ChangeDetectorRef }
@@ -36373,7 +36524,7 @@ var UserDetailsComponent = class UserDetailsComponent extends AppBaseComponent {
36373
36524
  dependencies: [
36374
36525
  {
36375
36526
  kind: "component",
36376
- type: i2$4.Table,
36527
+ type: i2$3.Table,
36377
36528
  selector: "p-table",
36378
36529
  inputs: [
36379
36530
  "frozenColumns",
@@ -36486,7 +36637,7 @@ var UserDetailsComponent = class UserDetailsComponent extends AppBaseComponent {
36486
36637
  },
36487
36638
  {
36488
36639
  kind: "directive",
36489
- type: i2$4.ResizableColumn,
36640
+ type: i2$3.ResizableColumn,
36490
36641
  selector: "[pResizableColumn]",
36491
36642
  inputs: ["pResizableColumnDisabled"]
36492
36643
  },
@@ -36574,7 +36725,7 @@ var UserDetailsComponent = class UserDetailsComponent extends AppBaseComponent {
36574
36725
  },
36575
36726
  {
36576
36727
  kind: "component",
36577
- type: i11$1.ProgressSpinner,
36728
+ type: i11.ProgressSpinner,
36578
36729
  selector: "p-progress-spinner, p-progressspinner",
36579
36730
  inputs: [
36580
36731
  "value",
@@ -36670,6 +36821,11 @@ var UserDetailsComponent = class UserDetailsComponent extends AppBaseComponent {
36670
36821
  ],
36671
36822
  outputs: ["ngModelChange"]
36672
36823
  },
36824
+ {
36825
+ kind: "directive",
36826
+ type: i9.TrackDirtyFormDirective,
36827
+ selector: "[formGroup]:not([formGroupSkipDirty])"
36828
+ },
36673
36829
  {
36674
36830
  kind: "pipe",
36675
36831
  type: i5$2.CurrencyPipe,
@@ -36682,7 +36838,7 @@ var UserDetailsComponent = class UserDetailsComponent extends AppBaseComponent {
36682
36838
  },
36683
36839
  {
36684
36840
  kind: "pipe",
36685
- type: i9.DateFormatPipe,
36841
+ type: i9$1.DateFormatPipe,
36686
36842
  name: "dateFormat"
36687
36843
  }
36688
36844
  ]
@@ -36838,7 +36994,7 @@ var UserInsightComponent = class UserInsightComponent extends AppBaseComponent {
36838
36994
  },
36839
36995
  {
36840
36996
  kind: "component",
36841
- type: i11$1.ProgressSpinner,
36997
+ type: i11.ProgressSpinner,
36842
36998
  selector: "p-progress-spinner, p-progressspinner",
36843
36999
  inputs: [
36844
37000
  "value",
@@ -37037,7 +37193,7 @@ var UsersListBaseComponent = class extends AppBaseComponent {
37037
37193
  });
37038
37194
  }
37039
37195
  getUsers(paging) {
37040
- this.isLoaded = false;
37196
+ this.loading = true;
37041
37197
  const params = {
37042
37198
  product_ids: this.filterByProducts.join() || "",
37043
37199
  role_ids: this.filterByRoles.join() || "",
@@ -37047,18 +37203,22 @@ var UsersListBaseComponent = class extends AppBaseComponent {
37047
37203
  if (this.filterByAlphaBeta.includes("alpha")) params.alpha = true;
37048
37204
  if (this.filterByAlphaBeta.includes("beta")) params.beta = true;
37049
37205
  if (this.showAmbassadorsOnly) params.is_ambassador = true;
37050
- this.adminService.getUsers(paging, params).subscribe((response) => {
37206
+ this.adminService.getUsers(paging, params).pipe(finalize(() => {
37207
+ this.loading = false;
37208
+ this.isLoaded = true;
37209
+ this.cdr.markForCheck();
37210
+ })).subscribe((response) => {
37051
37211
  this.users = response.users;
37052
37212
  this.allUsers = [...this.users];
37053
37213
  this.totalRecords = response.object_count;
37054
37214
  this.totalRecordsUnFiltered = response?.unfiltered_count;
37055
- this.loading = false;
37056
- this.isLoaded = true;
37057
- this.cdr.markForCheck();
37058
37215
  });
37059
37216
  }
37060
37217
  };
37061
37218
  var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37219
+ get chatPermission() {
37220
+ return PermissionService.productPermission("Chat");
37221
+ }
37062
37222
  constructor(adminService, toaster, productService, injector, authService, cdr, windowService, sidebarService) {
37063
37223
  super(adminService, productService, injector, cdr, sidebarService);
37064
37224
  this.toaster = toaster;
@@ -37068,7 +37228,6 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37068
37228
  }
37069
37229
  ngOnInit() {
37070
37230
  this.subscriptionId = PermissionService.selectedSubscription?.id;
37071
- this.chatPermission = `${PermissionService.selectedProduct?.permission}.${PermissionService.selectedProduct?.feature_key}`;
37072
37231
  this.getRoles();
37073
37232
  this.getProducts();
37074
37233
  this.userStore().subscribe((response) => {
@@ -37183,12 +37342,12 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37183
37342
  type: UserListComponent,
37184
37343
  deps: [
37185
37344
  { token: i1$1.AdminService },
37186
- { token: i2$2.CustomToastService },
37187
- { token: i2$2.ProductService },
37345
+ { token: i2$1.CustomToastService },
37346
+ { token: i2$1.ProductService },
37188
37347
  { token: i0.Injector },
37189
- { token: i2$2.AuthService },
37348
+ { token: i2$1.AuthService },
37190
37349
  { token: i0.ChangeDetectorRef },
37191
- { token: i2$2.WindowService },
37350
+ { token: i2$1.WindowService },
37192
37351
  { token: i6$2.CollapsibleSidebarService }
37193
37352
  ],
37194
37353
  target: i0.ɵɵFactoryTarget.Component
@@ -37223,12 +37382,12 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37223
37382
  ],
37224
37383
  usesInheritance: true,
37225
37384
  ngImport: i0,
37226
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner> </p-progress-spinner>\n }\n</div>\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37385
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n@if (!isLoaded) {\n <div class=\"w-100 mt-0\">\n <pw-skeleton-table [rows]=\"8\" [columns]=\"10\" [showCaption]=\"true\"></pw-skeleton-table>\n </div>\n}\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.d-none]=\"!isLoaded\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37227
37386
  styles: ["@charset \"UTF-8\";:root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: color-mix(in srgb, var(--first, rgb(23 105 225)) 85%, #000000);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255);--dashboard_bg: rgb(255 255 255);--public-btn-radius: 24px}.search-input input{width:100%}.w-150{width:150px}.table-responsive td[data-head=id]{font-variant-numeric:tabular-nums;color:#7c8696}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.ambassadors-only-toggle{display:inline-flex;align-items:center}.ambassadors-only-toggle ::ng-deep .switch small{display:flex;align-items:center;justify-content:center}.ambassadors-only-toggle ::ng-deep .switch small:after{content:\"\\f2b5\";font-family:\"Font Awesome 6 Pro\",sans-serif;font-weight:900;font-size:12px;line-height:1;color:var(--first)}\n"],
37228
37387
  dependencies: [
37229
37388
  {
37230
37389
  kind: "component",
37231
- type: i2$4.Table,
37390
+ type: i2$3.Table,
37232
37391
  selector: "p-table",
37233
37392
  inputs: [
37234
37393
  "frozenColumns",
@@ -37341,19 +37500,19 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37341
37500
  },
37342
37501
  {
37343
37502
  kind: "directive",
37344
- type: i2$4.SortableColumn,
37503
+ type: i2$3.SortableColumn,
37345
37504
  selector: "[pSortableColumn]",
37346
37505
  inputs: ["pSortableColumn", "pSortableColumnDisabled"]
37347
37506
  },
37348
37507
  {
37349
37508
  kind: "directive",
37350
- type: i2$4.ResizableColumn,
37509
+ type: i2$3.ResizableColumn,
37351
37510
  selector: "[pResizableColumn]",
37352
37511
  inputs: ["pResizableColumnDisabled"]
37353
37512
  },
37354
37513
  {
37355
37514
  kind: "component",
37356
- type: i2$4.SortIcon,
37515
+ type: i2$3.SortIcon,
37357
37516
  selector: "p-sort-icon, p-sorticon",
37358
37517
  inputs: ["field"]
37359
37518
  },
@@ -37496,6 +37655,19 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37496
37655
  selector: "p-inputicon",
37497
37656
  inputs: ["hostName"]
37498
37657
  },
37658
+ {
37659
+ kind: "component",
37660
+ type: i4$3.SkeletonTableComponent,
37661
+ selector: "pw-skeleton-table",
37662
+ inputs: [
37663
+ "rows",
37664
+ "columns",
37665
+ "showHeader",
37666
+ "showCaption",
37667
+ "density",
37668
+ "delay"
37669
+ ]
37670
+ },
37499
37671
  {
37500
37672
  kind: "directive",
37501
37673
  type: i5$2.NgClass,
@@ -37560,20 +37732,6 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37560
37732
  inputs: ["confirmMessage", "destructive"],
37561
37733
  outputs: ["successEvent"]
37562
37734
  },
37563
- {
37564
- kind: "component",
37565
- type: i11$1.ProgressSpinner,
37566
- selector: "p-progress-spinner, p-progressspinner",
37567
- inputs: [
37568
- "value",
37569
- "strokeWidth",
37570
- "animationDuration",
37571
- "min",
37572
- "max",
37573
- "ariaLabel",
37574
- "fill"
37575
- ]
37576
- },
37577
37735
  {
37578
37736
  kind: "component",
37579
37737
  type: i6$2.OnlineIndicatorComponent,
@@ -37639,12 +37797,12 @@ var UserListComponent = class UserListComponent extends UsersListBaseComponent {
37639
37797
  },
37640
37798
  {
37641
37799
  kind: "pipe",
37642
- type: i9.DateFormatPipe,
37800
+ type: i9$1.DateFormatPipe,
37643
37801
  name: "dateFormat"
37644
37802
  },
37645
37803
  {
37646
37804
  kind: "pipe",
37647
- type: i9.IsOnlinePipe,
37805
+ type: i9$1.IsOnlinePipe,
37648
37806
  name: "isOnline"
37649
37807
  }
37650
37808
  ]
@@ -37661,18 +37819,18 @@ i0.ɵɵngDeclareClassMetadata({
37661
37819
  args: [{
37662
37820
  selector: "pw-admin-user-list",
37663
37821
  standalone: false,
37664
- template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n @if (!isLoaded) {\n <p-progress-spinner> </p-progress-spinner>\n }\n</div>\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37822
+ template: "<div class=\"row\">\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-baseline\">\n <h2 class=\"card-title p-0\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Add User\n </a>\n </div>\n</div>\n@if (!isLoaded) {\n <div class=\"w-100 mt-0\">\n <pw-skeleton-table [rows]=\"8\" [columns]=\"10\" [showCaption]=\"true\"></pw-skeleton-table>\n </div>\n}\n<div class=\"primeng-datatable-container actions-collapsed mt-0\" [class.d-none]=\"!isLoaded\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n stateKey=\"pw-table.admin-users-list\"\n stateStorage=\"session\"\n [resizableColumns]=\"true\"\n columnResizeMode=\"expand\"\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n (onStateRestore)=\"onTableStateRestore($event)\"\n [customSort]=\"true\">\n <ng-template #caption>\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-role-product\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event); dt.filter($event.value, 'filterSource', 'equals')\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n @if (selectedOption) {\n <div class=\"col-4\"\n >\n <p-multiselect class=\"pw-filter-select\" inputId=\"users-list-filter-criteria\"\n [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event); dt.filter($event.value, 'criteria', 'equals')\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Filter by {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiselect>\n </div>\n }\n <div class=\"col-auto d-flex align-items-center\">\n <span class=\"ambassadors-only-toggle\"\n [pTooltip]=\"'Admin.Users.AmbassadorsOnly' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <ui-switch\n [checked]=\"showAmbassadorsOnly\"\n (change)=\"showAmbassadorsOnly = $event; onAmbassadorsOnlyToggle(); dt.filter($event, 'ambassadors', 'equals')\"\n [attr.aria-label]=\"'Admin.Users.AmbassadorsOnly' | transloco\">\n </ui-switch>\n </span>\n </div>\n <div class=\"text-end\">\n <label for=\"users-list-search\" class=\"visually-hidden\">Search User</label>\n <p-iconfield iconPosition=\"left\">\n <p-inputicon><i class=\"fa fa-search\" aria-hidden=\"true\"></i></p-inputicon>\n <input type=\"text\"\n id=\"users-list-search\"\n name=\"users-list-search\"\n [(ngModel)]=\"searchText\"\n pInputText\n placeholder=\"Search users...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\"\n aria-label=\"Search users...\" />\n </p-iconfield>\n </div>\n </div>\n </ng-template>\n <ng-template #header>\n <tr>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sort-icon field=\"id\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sort-icon field=\"first_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sort-icon field=\"last_name\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sort-icon field=\"email\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sort-icon field=\"slug\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sort-icon field=\"encrypted_password\"></p-sort-icon>\n </th>\n\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sort-icon field=\"sessions_last_month\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sort-icon field=\"last_sign_in_at\"></p-sort-icon>\n </th>\n <th pResizableColumn scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sort-icon field=\"signed_up_at\"></p-sort-icon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n @if (user?.alpha) {\n <span\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n }\n @if (user?.beta) {\n <span class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n }\n @if (user?.cognito_sso_activated) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Cognito' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-cloud success\" ></i>\n </span>\n }\n @if (user?.ambassador_count > 0) {\n <span\n class=\"ms-2\"\n [pTooltip]=\"'Admin.Users.Tooltip.Ambassador' | transloco\"\n tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa fa-handshake alpha-beta text-primary\" aria-hidden=\"true\"></i>\n </span>\n }\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n @if (user?.blocked) {\n <span class=\"ms-2\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\" appendTo=\"body\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n }\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n @if (user?.current_sign_in_at | isOnline) {\n <pw-online-indicator [lastSeen]=\"user.current_sign_in_at\" />\n } @else if (user?.current_sign_in_at) {\n <span>\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n } @else {\n {{ user.last_sign_in_at | dateFormat }}\n }\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li pTooltip=\"Impersonate this user\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n @if (user?.enable_two_factor_authenticator) {\n <li pTooltip=\"Disable 2FA\" tooltipPosition=\"top\" appendTo=\"body\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n }\n @if (currentUser && user.id !== currentUser.id) {\n <li pTooltip=\"Message\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n }\n <li pTooltip=\"Edit\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li pTooltip=\"Delete\" tooltipPosition=\"top\" appendTo=\"body\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n @if (totalRecords === 0 && totalRecordsUnFiltered !== 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n }\n @if (totalRecords !== 0) {\n <pw-records-summary [showing]=\"dt?.value?.length ?? 0\" [total]=\"totalRecords\" />\n }\n </div>\n</div>\n@if (!loading && totalRecordsUnFiltered === 0) {\n <div>\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n </div>\n}\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n [destructive]=\"true\"\n (successEvent)=\"deleteUser($event)\">\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n",
37665
37823
  styles: ["@charset \"UTF-8\";:root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: color-mix(in srgb, var(--first, rgb(23 105 225)) 85%, #000000);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255);--dashboard_bg: rgb(255 255 255);--public-btn-radius: 24px}.search-input input{width:100%}.w-150{width:150px}.table-responsive td[data-head=id]{font-variant-numeric:tabular-nums;color:#7c8696}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}.ambassadors-only-toggle{display:inline-flex;align-items:center}.ambassadors-only-toggle ::ng-deep .switch small{display:flex;align-items:center;justify-content:center}.ambassadors-only-toggle ::ng-deep .switch small:after{content:\"\\f2b5\";font-family:\"Font Awesome 6 Pro\",sans-serif;font-weight:900;font-size:12px;line-height:1;color:var(--first)}\n"]
37666
37824
  }]
37667
37825
  }],
37668
37826
  ctorParameters: () => [
37669
37827
  { type: i1$1.AdminService },
37670
- { type: i2$2.CustomToastService },
37671
- { type: i2$2.ProductService },
37828
+ { type: i2$1.CustomToastService },
37829
+ { type: i2$1.ProductService },
37672
37830
  { type: i0.Injector },
37673
- { type: i2$2.AuthService },
37831
+ { type: i2$1.AuthService },
37674
37832
  { type: i0.ChangeDetectorRef },
37675
- { type: i2$2.WindowService },
37833
+ { type: i2$1.WindowService },
37676
37834
  { type: i6$2.CollapsibleSidebarService }
37677
37835
  ],
37678
37836
  propDecorators: {
@@ -37712,7 +37870,7 @@ var UserTabComponent = class UserTabComponent {
37712
37870
  version: "22.2.0",
37713
37871
  ngImport: i0,
37714
37872
  type: UserTabComponent,
37715
- deps: [{ token: i2$2.PermissionService }],
37873
+ deps: [{ token: i2$1.PermissionService }],
37716
37874
  target: i0.ɵɵFactoryTarget.Component
37717
37875
  });
37718
37876
  }
@@ -37750,7 +37908,7 @@ i0.ɵɵngDeclareClassMetadata({
37750
37908
  styles: [".search-input input{width:100%}\n"]
37751
37909
  }]
37752
37910
  }],
37753
- ctorParameters: () => [{ type: i2$2.PermissionService }]
37911
+ ctorParameters: () => [{ type: i2$1.PermissionService }]
37754
37912
  });
37755
37913
  const routes = [{
37756
37914
  path: "",
@@ -37842,7 +38000,6 @@ const routes = [{
37842
38000
  {
37843
38001
  path: "add",
37844
38002
  component: FeatureFlagDetailsComponent,
37845
- canDeactivate: [unsavedChangesGuard],
37846
38003
  data: {
37847
38004
  title: "Add Feature Flag",
37848
38005
  permission: "Pages.Admin"
@@ -37851,7 +38008,6 @@ const routes = [{
37851
38008
  {
37852
38009
  path: ":id",
37853
38010
  component: FeatureFlagDetailsComponent,
37854
- canDeactivate: [unsavedChangesGuard],
37855
38011
  data: {
37856
38012
  title: "Edit Feature Flag",
37857
38013
  permission: "Pages.Admin"
@@ -37993,7 +38149,6 @@ const routes = [{
37993
38149
  {
37994
38150
  path: "add",
37995
38151
  component: LoginNotificationDetailsComponent,
37996
- canDeactivate: [unsavedChangesGuard],
37997
38152
  data: {
37998
38153
  title: "Dashboard Notification Add",
37999
38154
  permission: "Pages.Admin.LoginNotification || Pages.Role.MarketingManager || Pages.Role.CustomerSuccessManager"
@@ -38002,7 +38157,6 @@ const routes = [{
38002
38157
  {
38003
38158
  path: ":id",
38004
38159
  component: LoginNotificationDetailsComponent,
38005
- canDeactivate: [unsavedChangesGuard],
38006
38160
  data: {
38007
38161
  title: "Dashboard Notification Edit",
38008
38162
  permission: "Pages.Admin.LoginNotification || Pages.Role.MarketingManager || Pages.Role.CustomerSuccessManager"
@@ -38472,7 +38626,6 @@ const routes = [{
38472
38626
  {
38473
38627
  path: "add",
38474
38628
  component: TermsOfServiceDetailsComponent,
38475
- canDeactivate: [unsavedChangesGuard],
38476
38629
  data: {
38477
38630
  title: "Tos",
38478
38631
  permission: "Pages.Admin.Tos"
@@ -38481,7 +38634,6 @@ const routes = [{
38481
38634
  {
38482
38635
  path: ":id",
38483
38636
  component: TermsOfServiceDetailsComponent,
38484
- canDeactivate: [unsavedChangesGuard],
38485
38637
  data: {
38486
38638
  title: "Tos",
38487
38639
  permission: "Pages.Admin.Tos"
@@ -38598,7 +38750,6 @@ const routes = [{
38598
38750
  {
38599
38751
  path: "add",
38600
38752
  component: OauthClientsDetailsComponent,
38601
- canDeactivate: [unsavedChangesGuard],
38602
38753
  data: {
38603
38754
  title: "Add MCP OAuth Client",
38604
38755
  permission: "Pages.Admin"
@@ -38607,7 +38758,6 @@ const routes = [{
38607
38758
  {
38608
38759
  path: "edit/:id",
38609
38760
  component: OauthClientsDetailsComponent,
38610
- canDeactivate: [unsavedChangesGuard],
38611
38761
  data: {
38612
38762
  title: "Edit MCP OAuth Client",
38613
38763
  permission: "Pages.Admin"
@@ -38909,10 +39059,11 @@ var AdminModule = class AdminModule {
38909
39059
  NgbModalModule,
38910
39060
  FormsModule,
38911
39061
  ReactiveFormsModule,
39062
+ TrackDirtyFormDirective,
38912
39063
  NgxPaginationModule,
38913
39064
  NgbNavModule,
38914
39065
  NgbDatepickerModule,
38915
- i11.QuillModule
39066
+ i12.QuillModule
38916
39067
  ]
38917
39068
  });
38918
39069
  }
@@ -39114,6 +39265,7 @@ i0.ɵɵngDeclareClassMetadata({
39114
39265
  NgbModalModule,
39115
39266
  FormsModule,
39116
39267
  ReactiveFormsModule,
39268
+ TrackDirtyFormDirective,
39117
39269
  NgxPaginationModule,
39118
39270
  NgbNavModule,
39119
39271
  NgbDatepickerModule,
@@ -39172,10 +39324,10 @@ var AdminGuardService = class AdminGuardService {
39172
39324
  ngImport: i0,
39173
39325
  type: AdminGuardService,
39174
39326
  deps: [
39175
- { token: i2$2.UserService },
39327
+ { token: i2$1.UserService },
39176
39328
  { token: i7$2.Router },
39177
- { token: i2$2.FeatureFlagService },
39178
- { token: i2$2.PermissionService }
39329
+ { token: i2$1.FeatureFlagService },
39330
+ { token: i2$1.PermissionService }
39179
39331
  ],
39180
39332
  target: i0.ɵɵFactoryTarget.Injectable
39181
39333
  });
@@ -39196,10 +39348,10 @@ i0.ɵɵngDeclareClassMetadata({
39196
39348
  type: AdminGuardService,
39197
39349
  decorators: [{ type: Injectable }],
39198
39350
  ctorParameters: () => [
39199
- { type: i2$2.UserService },
39351
+ { type: i2$1.UserService },
39200
39352
  { type: i7$2.Router },
39201
- { type: i2$2.FeatureFlagService },
39202
- { type: i2$2.PermissionService }
39353
+ { type: i2$1.FeatureFlagService },
39354
+ { type: i2$1.PermissionService }
39203
39355
  ]
39204
39356
  });
39205
39357
  export { AddEditFaqComponent, AdminGuardService, AdminModule, AdminRoutingModule, AgentDetailsComponent, AhoyEventsComponent, AhoyMessagesComponent, AhoyVisitsComponent, ContactUsListComponent, ContactUsTabsComponent, CredentialsComponent, CredentialsDetailsComponent, CredentialsTabComponent, DomainConfigBuildComponent, DomainConfigCoreComponent, DomainConfigDetailsComponent, DomainConfigIntegrationsComponent, DomainConfigInterfaceComponent, DomainConfigListComponent, DomainConfigOrganizationComponent, DomainConfigSecurityComponent, DomainConfigSocialComponent, DomainConfigTabsComponent, EventsComponent, FaqListComponent, FaqTabsComponent, FeedbackQuestionsDetailsComponent, FeedbackQuestionsListComponent, GeneralTabsComponent, GenericInsightComponent, GenericMiscComponent, GlobalConfigDetailsComponent, GlobalConfigListComponent, GlobalConfigTabsComponent, InsightComponent, LoginNotificationDetailsComponent, LoginNotificationTabsComponent, LoginNotificationsListComponent, NewsletterComponent, NewsletterDetailsComponent, NewsletterInsightComponent, NewsletterItemDetailsComponent, NewsletterUsersListComponent, NewslettersItemsComponent, NewslettersListComponent, PermissionsDetailsComponent, PermissionsListComponent, PermissionsTabsComponent, ProductDetailsComponent, ProductInsightComponent, ProductsListComponent, ProductsTabComponent, ROUTERS, RoleDetailsComponent, RolesListComponent, SubscriptionAgentsListComponent, SubscriptionComponent, SubscriptionCredentialsComponent, SubscriptionCredentialsDetailsComponent, SubscriptionDetailsComponent, SubscriptionInsightNpsComponent, SubscriptionInsightRevenueComponent, SubscriptionInsightTabsComponent, SubscriptionProductDetailsComponent, SubscriptionProductsComponent, SubscriptionUsersComponent, SubscriptionsListComponent, TagsCategoryComponent, TagsListComponent, TagsTabsComponent, TermsOfServiceComponent, TermsOfServiceDetailsComponent, TermsOfServiceTabsComponent, TipComponent, TipsComponent, TipsTabsComponent, TrackingComponent, UserDetailsComponent, UserInsightComponent, UserListComponent, UserTabComponent, UsersListForProductComponent, VersionsComponent };