ngx-techlify-core 18.57.1 → 18.58.1

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.
Files changed (107) hide show
  1. package/esm2022/lib/access-control-config/access-control-config.service.mjs +3 -3
  2. package/esm2022/lib/app-admin/admin-role/admin-role-list/admin-role-list.component.mjs +3 -3
  3. package/esm2022/lib/app-admin/admin-role/admin-role-permission-form/admin-role-permission-form.component.mjs +3 -3
  4. package/esm2022/lib/app-admin/admin-role/admin-role.service.mjs +3 -3
  5. package/esm2022/lib/app-admin/tenant/tenant-list-widget/tenant-list-widget.component.mjs +3 -3
  6. package/esm2022/lib/audit-log/audit-log-list/audit-log-list.component.mjs +35 -94
  7. package/esm2022/lib/audit-log/audit-log-list-filter/audit-log-list-filter.component.mjs +3 -12
  8. package/esm2022/lib/audit-log/audit-log.service.mjs +3 -3
  9. package/esm2022/lib/base-model/index.mjs +4 -4
  10. package/esm2022/lib/base-model/techlify-form-component.mjs +128 -0
  11. package/esm2022/lib/base-model/techlify-list-component.mjs +289 -0
  12. package/esm2022/lib/base-model/techlify-service.mjs +68 -0
  13. package/esm2022/lib/company-information/client.service.mjs +3 -3
  14. package/esm2022/lib/company-information/company-information/company-information.component.mjs +3 -3
  15. package/esm2022/lib/delete-button/techlify-delete-button.component.mjs +1 -1
  16. package/esm2022/lib/entity-files/entity-file.service.mjs +3 -3
  17. package/esm2022/lib/form-configuration/form-configuration-form-field.service.mjs +3 -3
  18. package/esm2022/lib/form-configuration/form-configuration-form.service.mjs +3 -3
  19. package/esm2022/lib/login/login-form-fields/login-form-fields.component.mjs +3 -3
  20. package/esm2022/lib/note/note-list/note-list.component.mjs +3 -3
  21. package/esm2022/lib/pdf-button/pdf-button.component.mjs +11 -7
  22. package/esm2022/lib/reset-password/reset-password.component.mjs +3 -3
  23. package/esm2022/lib/reset-password/reset-password.service.mjs +3 -3
  24. package/esm2022/lib/restrictors/restrictor-level-selector/restrictor-level.service.mjs +3 -3
  25. package/esm2022/lib/restrictors/restrictor-status-selector/restrictor-status.service.mjs +3 -3
  26. package/esm2022/lib/restrictors/restrictor-type-selector/restrictor-type.service.mjs +3 -3
  27. package/esm2022/lib/restrictors/restrictor.service.mjs +3 -3
  28. package/esm2022/lib/searchable-selector/searchable-selector.component.mjs +5 -5
  29. package/esm2022/lib/subscription/subscription-form/subscription-form.component.mjs +3 -3
  30. package/esm2022/lib/subscription/subscription-listing/subscription-listing.component.mjs +3 -3
  31. package/esm2022/lib/subscription/subscription-package-listing/subscription-package-listing.component.mjs +3 -3
  32. package/esm2022/lib/subscription/subscription-package.service.mjs +3 -3
  33. package/esm2022/lib/subscription/subscription.service.mjs +3 -3
  34. package/esm2022/lib/techlify-feature/techlify-feature.service.mjs +3 -3
  35. package/esm2022/lib/techlify-icon/techlify-icon.component.mjs +7 -2
  36. package/esm2022/lib/techlify-notifications/techlify-notification-for-user/techlify-notification-for-user.component.mjs +3 -3
  37. package/esm2022/lib/techlify-notifications/techlify-notification-for-user/techlify-notification-subscription.service.mjs +3 -3
  38. package/esm2022/lib/techlify-notifications/techlify-notification-for-user/techlify-notification-type.service.mjs +3 -3
  39. package/esm2022/lib/techlify-view/my-techlify-view-listing/my-techlify-view-listing.component.mjs +3 -3
  40. package/esm2022/lib/techlify-view/my-techlify-view-listing/my-techlify-view.service.mjs +3 -3
  41. package/esm2022/lib/techlify-view/techlify-view-form/techlify-view-form.component.mjs +3 -3
  42. package/esm2022/lib/techlify-view/techlify-view.service.mjs +3 -3
  43. package/esm2022/lib/timeline-activity/timeline-activity-list/timeline-activity-list.component.mjs +3 -3
  44. package/esm2022/lib/timeline-activity/timeline-activity.service.mjs +3 -3
  45. package/esm2022/lib/user/user-enable-button-component/user-enable-button.component.mjs +5 -5
  46. package/esm2022/lib/user/user-enable-button-component/user-enable-button.module.mjs +7 -3
  47. package/esm2022/lib/user/user-sessions/user-session.service.mjs +3 -3
  48. package/esm2022/lib/user/user-sessions/user-sessions/user-sessions.component.mjs +3 -3
  49. package/esm2022/lib/user/user.service.mjs +3 -3
  50. package/esm2022/lib/user/users-view-all.component.mjs +13 -11
  51. package/esm2022/lib/user-clients-list/user-client.service.mjs +3 -3
  52. package/esm2022/lib/user-clients-list/user-clients-list.component.mjs +3 -3
  53. package/fesm2022/ngx-techlify-core.mjs +207 -249
  54. package/fesm2022/ngx-techlify-core.mjs.map +1 -1
  55. package/lib/access-control-config/access-control-config.service.d.ts +2 -2
  56. package/lib/app-admin/admin-role/admin-role-list/admin-role-list.component.d.ts +2 -2
  57. package/lib/app-admin/admin-role/admin-role-permission-form/admin-role-permission-form.component.d.ts +2 -2
  58. package/lib/app-admin/admin-role/admin-role.service.d.ts +2 -2
  59. package/lib/app-admin/tenant/tenant-list-widget/tenant-list-widget.component.d.ts +2 -2
  60. package/lib/audit-log/audit-log-list/audit-log-list.component.d.ts +7 -11
  61. package/lib/audit-log/audit-log-list-filter/audit-log-list-filter.component.d.ts +0 -2
  62. package/lib/audit-log/audit-log.service.d.ts +2 -2
  63. package/lib/base-model/index.d.ts +3 -3
  64. package/lib/base-model/{techlify-form-component.class.d.ts → techlify-form-component.d.ts} +7 -6
  65. package/lib/base-model/{techlify-listing-component.class.d.ts → techlify-list-component.d.ts} +6 -6
  66. package/lib/base-model/{techlify-service.class.d.ts → techlify-service.d.ts} +1 -1
  67. package/lib/company-information/client.service.d.ts +2 -2
  68. package/lib/company-information/company-information/company-information.component.d.ts +2 -2
  69. package/lib/delete-button/techlify-delete-button.component.d.ts +2 -2
  70. package/lib/entity-files/entity-file.service.d.ts +2 -2
  71. package/lib/form-configuration/form-configuration-form-field.service.d.ts +2 -2
  72. package/lib/form-configuration/form-configuration-form.service.d.ts +2 -2
  73. package/lib/login/login-form-fields/login-form-fields.component.d.ts +2 -2
  74. package/lib/note/note-list/note-list.component.d.ts +2 -2
  75. package/lib/pdf-button/pdf-button.component.d.ts +2 -1
  76. package/lib/reset-password/reset-password.component.d.ts +2 -2
  77. package/lib/reset-password/reset-password.service.d.ts +2 -2
  78. package/lib/restrictors/restrictor-level-selector/restrictor-level.service.d.ts +2 -2
  79. package/lib/restrictors/restrictor-status-selector/restrictor-status.service.d.ts +2 -2
  80. package/lib/restrictors/restrictor-type-selector/restrictor-type.service.d.ts +2 -2
  81. package/lib/restrictors/restrictor.service.d.ts +2 -2
  82. package/lib/subscription/subscription-form/subscription-form.component.d.ts +2 -2
  83. package/lib/subscription/subscription-listing/subscription-listing.component.d.ts +2 -2
  84. package/lib/subscription/subscription-package-listing/subscription-package-listing.component.d.ts +2 -2
  85. package/lib/subscription/subscription-package.service.d.ts +2 -2
  86. package/lib/subscription/subscription.service.d.ts +2 -2
  87. package/lib/techlify-feature/techlify-feature.service.d.ts +2 -2
  88. package/lib/techlify-notifications/techlify-notification-for-user/techlify-notification-for-user.component.d.ts +2 -2
  89. package/lib/techlify-notifications/techlify-notification-for-user/techlify-notification-subscription.service.d.ts +2 -2
  90. package/lib/techlify-notifications/techlify-notification-for-user/techlify-notification-type.service.d.ts +2 -2
  91. package/lib/techlify-view/my-techlify-view-listing/my-techlify-view-listing.component.d.ts +2 -2
  92. package/lib/techlify-view/my-techlify-view-listing/my-techlify-view.service.d.ts +2 -2
  93. package/lib/techlify-view/techlify-view-form/techlify-view-form.component.d.ts +2 -2
  94. package/lib/techlify-view/techlify-view.service.d.ts +2 -2
  95. package/lib/timeline-activity/timeline-activity-list/timeline-activity-list.component.d.ts +2 -2
  96. package/lib/timeline-activity/timeline-activity.service.d.ts +2 -2
  97. package/lib/user/user-enable-button-component/user-enable-button.module.d.ts +2 -1
  98. package/lib/user/user-sessions/user-session.service.d.ts +2 -2
  99. package/lib/user/user-sessions/user-sessions/user-sessions.component.d.ts +2 -2
  100. package/lib/user/user.service.d.ts +2 -2
  101. package/lib/user/users-view-all.component.d.ts +2 -2
  102. package/lib/user-clients-list/user-client.service.d.ts +2 -2
  103. package/lib/user-clients-list/user-clients-list.component.d.ts +2 -2
  104. package/package.json +1 -1
  105. package/esm2022/lib/base-model/techlify-form-component.class.mjs +0 -119
  106. package/esm2022/lib/base-model/techlify-listing-component.class.mjs +0 -289
  107. package/esm2022/lib/base-model/techlify-service.class.mjs +0 -68
@@ -209,7 +209,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
209
209
  * - comments on more code
210
210
  * - save time, save energy
211
211
  */
212
- class TechlifyServiceBaseClass {
212
+ class TechlifyService {
213
213
  constructor(http, baseUrl) {
214
214
  this.http = http;
215
215
  this.baseUrl = 'you-forgot-to-set-a-base-url';
@@ -281,7 +281,7 @@ class TechlifyServiceBaseClass {
281
281
  * - comments on more code
282
282
  * - save time, save energy
283
283
  */
284
- class TechlifyFormComponentInterface {
284
+ class TechlifyFormComponent {
285
285
  constructor(formValidatorService, service) {
286
286
  this.formValidatorService = formValidatorService;
287
287
  this.service = service;
@@ -291,6 +291,8 @@ class TechlifyFormComponentInterface {
291
291
  this.createdEntries = [];
292
292
  //Boolean to denote if form is in update mode
293
293
  this.isUpdate = false;
294
+ //Boolean to denote if form has ability to create multiple entries
295
+ this.isAllowCreateAnother = true;
294
296
  //Emits an event once form submit is success
295
297
  this.success = new EventEmitter();
296
298
  //Injected alert service
@@ -323,7 +325,12 @@ class TechlifyFormComponentInterface {
323
325
  this.alertService.addAlert('Successfully Created', 'success');
324
326
  return;
325
327
  }
326
- this.success.emit(this.isUpdate ? res?.item : this.createdEntries);
328
+ if (this.isUpdate) {
329
+ this.success.emit(res?.item);
330
+ }
331
+ else {
332
+ this.success.emit((this.createdEntries.length == 1) ? this.createdEntries[0] : this.createdEntries);
333
+ }
327
334
  if (this.dialogRef) {
328
335
  this.dialogRef.close(res.item);
329
336
  }
@@ -368,15 +375,17 @@ class TechlifyFormComponentInterface {
368
375
  getErrorMessage(field) {
369
376
  return this.formValidatorService.getErrorMessage(field, this.form, this.errorMessages);
370
377
  }
371
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponentInterface, deps: [{ token: FormValidatorService }, { token: TechlifyServiceBaseClass, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
372
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TechlifyFormComponentInterface, inputs: { isUpdate: "isUpdate" }, outputs: { success: "success" }, ngImport: i0 }); }
378
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponent, deps: [{ token: FormValidatorService }, { token: TechlifyService, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
379
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TechlifyFormComponent, inputs: { isUpdate: "isUpdate", isAllowCreateAnother: "isAllowCreateAnother" }, outputs: { success: "success" }, ngImport: i0 }); }
373
380
  }
374
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponentInterface, decorators: [{
381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponent, decorators: [{
375
382
  type: Directive
376
- }], ctorParameters: () => [{ type: FormValidatorService }, { type: TechlifyServiceBaseClass, decorators: [{
383
+ }], ctorParameters: () => [{ type: FormValidatorService }, { type: TechlifyService, decorators: [{
377
384
  type: Optional
378
385
  }] }], propDecorators: { isUpdate: [{
379
386
  type: Input
387
+ }], isAllowCreateAnother: [{
388
+ type: Input
380
389
  }], success: [{
381
390
  type: Output
382
391
  }] } });
@@ -522,7 +531,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
522
531
  * - comments on more code
523
532
  * - save time, save energy
524
533
  */
525
- let TechlifyListingControllerInterface = class TechlifyListingControllerInterface {
534
+ let TechlifyListComponent = class TechlifyListComponent {
526
535
  get isFilterPatchFromRoute() {
527
536
  return this._isFilterPatchFromRoute;
528
537
  }
@@ -778,15 +787,15 @@ let TechlifyListingControllerInterface = class TechlifyListingControllerInterfac
778
787
  this.isViewLoaded = true;
779
788
  }, 500);
780
789
  }
781
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyListingControllerInterface, deps: [{ token: TechlifyServiceBaseClass, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
782
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TechlifyListingControllerInterface, ngImport: i0 }); }
790
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyListComponent, deps: [{ token: TechlifyService, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
791
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TechlifyListComponent, ngImport: i0 }); }
783
792
  };
784
- TechlifyListingControllerInterface = __decorate([
793
+ TechlifyListComponent = __decorate([
785
794
  UntilDestroy()
786
- ], TechlifyListingControllerInterface);
787
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyListingControllerInterface, decorators: [{
795
+ ], TechlifyListComponent);
796
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyListComponent, decorators: [{
788
797
  type: Directive
789
- }], ctorParameters: () => [{ type: TechlifyServiceBaseClass, decorators: [{
798
+ }], ctorParameters: () => [{ type: TechlifyService, decorators: [{
790
799
  type: Optional
791
800
  }] }] });
792
801
 
@@ -1704,7 +1713,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1704
1713
  args: [HTTP_DYNAMIC_INTERCEPTORS]
1705
1714
  }] }] });
1706
1715
 
1707
- class EntityFileService extends TechlifyServiceBaseClass {
1716
+ class EntityFileService extends TechlifyService {
1708
1717
  constructor(http) {
1709
1718
  super(http, 'entity-files');
1710
1719
  this.http = http;
@@ -2832,7 +2841,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2832
2841
  args: [MAT_DIALOG_DATA]
2833
2842
  }] }] });
2834
2843
 
2835
- class UserService extends TechlifyServiceBaseClass {
2844
+ class UserService extends TechlifyService {
2836
2845
  constructor(http) {
2837
2846
  super(http, 'users');
2838
2847
  }
@@ -3356,16 +3365,16 @@ class SearchableSelectorComponent {
3356
3365
  return ele;
3357
3366
  }
3358
3367
  _handleInput() {
3368
+ //Trigger on change only when initial event is false, to avoid double loading
3369
+ if (!this.isEmitInitialEvent) {
3370
+ this.onChange(this.value);
3371
+ }
3359
3372
  if (this.multiple)
3360
3373
  this.selectedValue = (this.value || []).map(x => this.dataItems.find(y => y[this.valueField] === x));
3361
3374
  else
3362
3375
  this.selectedValue = this.dataItems.find(x => x[this.valueField] === this.value);
3363
3376
  this.selectedValueChange.emit(this.selectedValue);
3364
3377
  this.selectionChange.emit(this.value);
3365
- //Trigger on change only when initial event is false, to avoid double loading
3366
- if (!this.isEmitInitialEvent) {
3367
- this.onChange(this.value);
3368
- }
3369
3378
  }
3370
3379
  get errorState() {
3371
3380
  return (this.ngControl && this.ngControl.invalid && (this.ngControl.touched || this.ngControl.dirty));
@@ -3531,85 +3540,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3531
3540
  type: Input
3532
3541
  }] } });
3533
3542
 
3534
- let UserEnableButtonComponent = class UserEnableButtonComponent {
3535
- constructor(service, alertService, currentUserService, dialog) {
3536
- this.service = service;
3537
- this.alertService = alertService;
3538
- this.currentUserService = currentUserService;
3539
- this.dialog = dialog;
3540
- this.isUseIcons = false;
3541
- this.onSave = new EventEmitter();
3542
- }
3543
- ngOnInit() {
3544
- this.currentUser = this.currentUserService.getUser();
3545
- }
3546
- enableUser() {
3547
- if (this.currentUser.id === this?.user?.id) {
3548
- this.alertService.addAlert('Current user cannot be changed', 'warn');
3549
- return;
3550
- }
3551
- const dialogRef = this.dialog.open(ActionPopupComponent, {
3552
- width: "400px",
3553
- data: {
3554
- title: 'Enable User',
3555
- message: 'This will re-enable the user’s account. Are you sure you want to continue?'
3556
- },
3557
- autoFocus: false
3558
- });
3559
- dialogRef.afterClosed().subscribe(async (result) => {
3560
- if (result) {
3561
- //Action confirmed
3562
- this.service.enable(this.user).then(res => {
3563
- this.onSave.emit(this.user);
3564
- });
3565
- }
3566
- });
3567
- }
3568
- disableUser() {
3569
- if (this.currentUser.id === this?.user?.id) {
3570
- this.alertService.addAlert('Current user cannot be changed', 'warn');
3571
- return;
3572
- }
3573
- const dialogRef = this.dialog.open(ActionPopupComponent, {
3574
- width: "400px",
3575
- data: {
3576
- title: 'Disable User',
3577
- message: 'Disabling this user’s account will restrict all of their their access to your company. Are you sure you want to continue?'
3578
- },
3579
- autoFocus: false
3580
- });
3581
- dialogRef.afterClosed().subscribe(async (result) => {
3582
- if (result) {
3583
- //Action confirmed
3584
- this.service.disable(this.user).then(res => {
3585
- this.onSave.emit(this.user);
3586
- });
3587
- }
3588
- });
3589
- }
3590
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonComponent, deps: [{ token: UserService }, { token: AlertService }, { token: CurrentUserService }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
3591
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: UserEnableButtonComponent, selector: "app-user-enable-button", inputs: { user: "user", isUseIcons: "isUseIcons" }, outputs: { onSave: "onSave" }, ngImport: i0, template: "<ng-container *ngIf=\"!isUseIcons\">\n <button mat-stroked-button color=\"warn\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\">\n Disable\n </button>\n <button mat-raised-button color=\"primary\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\">\n Enable\n </button>\n</ng-container>\n\n<ng-container *ngIf=\"isUseIcons\">\n <button mat-icon-button class=\"text-danger\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\" matTooltip=\"Disable User\">\n <mat-icon>person_off</mat-icon>\n </button>\n <button mat-icon-button class=\"text-success\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\" matTooltip=\"Enable User\">\n <mat-icon>task_alt</mat-icon>\n </button>\n</ng-container>", dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
3592
- };
3593
- UserEnableButtonComponent = __decorate([
3594
- UntilDestroy()
3595
- /**
3596
- * Component to view the set of users
3597
- *
3598
- * @author Joshua Kissoon
3599
- * @since 20170710
3600
- */
3601
- ], UserEnableButtonComponent);
3602
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonComponent, decorators: [{
3603
- type: Component,
3604
- args: [{ selector: 'app-user-enable-button', template: "<ng-container *ngIf=\"!isUseIcons\">\n <button mat-stroked-button color=\"warn\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\">\n Disable\n </button>\n <button mat-raised-button color=\"primary\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\">\n Enable\n </button>\n</ng-container>\n\n<ng-container *ngIf=\"isUseIcons\">\n <button mat-icon-button class=\"text-danger\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\" matTooltip=\"Disable User\">\n <mat-icon>person_off</mat-icon>\n </button>\n <button mat-icon-button class=\"text-success\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\" matTooltip=\"Enable User\">\n <mat-icon>task_alt</mat-icon>\n </button>\n</ng-container>" }]
3605
- }], ctorParameters: () => [{ type: UserService }, { type: AlertService }, { type: CurrentUserService }, { type: i1.MatDialog }], propDecorators: { user: [{
3606
- type: Input
3607
- }], isUseIcons: [{
3608
- type: Input
3609
- }], onSave: [{
3610
- type: Output
3611
- }] } });
3612
-
3613
3543
  /**
3614
3544
  * Registry file to maintain the custom icons SVGs
3615
3545
  */
@@ -3695,6 +3625,7 @@ class TechlifyIconComponent {
3695
3625
  delete: 'fas fa-trash',
3696
3626
  import: 'fas fa-file-import',
3697
3627
  export: 'fas fa-file-excel',
3628
+ print: 'fas fa-print',
3698
3629
  pdf: 'fas fa-file-pdf',
3699
3630
  history: 'fas fa-clock',
3700
3631
  copy: 'fas fa-copy',
@@ -3707,7 +3638,11 @@ class TechlifyIconComponent {
3707
3638
  table: 'fas fa-table',
3708
3639
  multi_calendar: 'fas fa-calendar-alt',
3709
3640
  link: 'fas fa-link',
3710
- reset: 'fa-solid fa-arrow-rotate-right'
3641
+ reset: 'fas fa-redo',
3642
+ phone: 'fas fa-phone',
3643
+ location: 'fas fa-map-marker-alt',
3644
+ unlink: 'fas fa-unlink',
3645
+ disable_user: 'fas fa-user-slash'
3711
3646
  };
3712
3647
  // Map size input to CSS classes
3713
3648
  this.sizeMap = {
@@ -3739,6 +3674,85 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3739
3674
  type: Input
3740
3675
  }] } });
3741
3676
 
3677
+ let UserEnableButtonComponent = class UserEnableButtonComponent {
3678
+ constructor(service, alertService, currentUserService, dialog) {
3679
+ this.service = service;
3680
+ this.alertService = alertService;
3681
+ this.currentUserService = currentUserService;
3682
+ this.dialog = dialog;
3683
+ this.isUseIcons = false;
3684
+ this.onSave = new EventEmitter();
3685
+ }
3686
+ ngOnInit() {
3687
+ this.currentUser = this.currentUserService.getUser();
3688
+ }
3689
+ enableUser() {
3690
+ if (this.currentUser.id === this?.user?.id) {
3691
+ this.alertService.addAlert('Current user cannot be changed', 'warn');
3692
+ return;
3693
+ }
3694
+ const dialogRef = this.dialog.open(ActionPopupComponent, {
3695
+ width: "400px",
3696
+ data: {
3697
+ title: 'Enable User',
3698
+ message: 'This will re-enable the user’s account. Are you sure you want to continue?'
3699
+ },
3700
+ autoFocus: false
3701
+ });
3702
+ dialogRef.afterClosed().subscribe(async (result) => {
3703
+ if (result) {
3704
+ //Action confirmed
3705
+ this.service.enable(this.user).then(res => {
3706
+ this.onSave.emit(this.user);
3707
+ });
3708
+ }
3709
+ });
3710
+ }
3711
+ disableUser() {
3712
+ if (this.currentUser.id === this?.user?.id) {
3713
+ this.alertService.addAlert('Current user cannot be changed', 'warn');
3714
+ return;
3715
+ }
3716
+ const dialogRef = this.dialog.open(ActionPopupComponent, {
3717
+ width: "400px",
3718
+ data: {
3719
+ title: 'Disable User',
3720
+ message: 'Disabling this user’s account will restrict all of their their access to your company. Are you sure you want to continue?'
3721
+ },
3722
+ autoFocus: false
3723
+ });
3724
+ dialogRef.afterClosed().subscribe(async (result) => {
3725
+ if (result) {
3726
+ //Action confirmed
3727
+ this.service.disable(this.user).then(res => {
3728
+ this.onSave.emit(this.user);
3729
+ });
3730
+ }
3731
+ });
3732
+ }
3733
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonComponent, deps: [{ token: UserService }, { token: AlertService }, { token: CurrentUserService }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
3734
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: UserEnableButtonComponent, selector: "app-user-enable-button", inputs: { user: "user", isUseIcons: "isUseIcons" }, outputs: { onSave: "onSave" }, ngImport: i0, template: "<ng-container *ngIf=\"!isUseIcons\">\n <button mat-stroked-button color=\"warn\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\">\n Disable\n </button>\n <button mat-raised-button color=\"primary\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\">\n Enable\n </button>\n</ng-container>\n\n<ng-container *ngIf=\"isUseIcons\">\n <app-techlify-icon name=\"disable_user\" class=\"text-danger clickable\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\"\n matTooltip=\"Disable User\"></app-techlify-icon>\n <app-techlify-icon name=\"activate\" class=\"text-success clickable\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\"\n matTooltip=\"Enable User\"></app-techlify-icon>\n</ng-container>", dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }] }); }
3735
+ };
3736
+ UserEnableButtonComponent = __decorate([
3737
+ UntilDestroy()
3738
+ /**
3739
+ * Component to view the set of users
3740
+ *
3741
+ * @author Joshua Kissoon
3742
+ * @since 20170710
3743
+ */
3744
+ ], UserEnableButtonComponent);
3745
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonComponent, decorators: [{
3746
+ type: Component,
3747
+ args: [{ selector: 'app-user-enable-button', template: "<ng-container *ngIf=\"!isUseIcons\">\n <button mat-stroked-button color=\"warn\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\">\n Disable\n </button>\n <button mat-raised-button color=\"primary\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\">\n Enable\n </button>\n</ng-container>\n\n<ng-container *ngIf=\"isUseIcons\">\n <app-techlify-icon name=\"disable_user\" class=\"text-danger clickable\" *ngIf=\"user?.user_client?.is_enabled\n && user?.id !== currentUser?.id\n && currentUserService.hasPermission('user_disable')\" (click)=\"disableUser()\"\n matTooltip=\"Disable User\"></app-techlify-icon>\n <app-techlify-icon name=\"activate\" class=\"text-success clickable\" *ngIf=\"!user?.user_client?.is_enabled\n&& user?.id !== currentUser?.id\n&& currentUserService.hasPermission('user_enable')\" (click)=\"enableUser()\"\n matTooltip=\"Enable User\"></app-techlify-icon>\n</ng-container>" }]
3748
+ }], ctorParameters: () => [{ type: UserService }, { type: AlertService }, { type: CurrentUserService }, { type: i1.MatDialog }], propDecorators: { user: [{
3749
+ type: Input
3750
+ }], isUseIcons: [{
3751
+ type: Input
3752
+ }], onSave: [{
3753
+ type: Output
3754
+ }] } });
3755
+
3742
3756
  class MaterialModule {
3743
3757
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MaterialModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3744
3758
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: MaterialModule, exports: [MatButtonModule,
@@ -3928,7 +3942,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3928
3942
  ], template: "<app-techlify-icon role='button' name='delete' (click)=\"open()\"></app-techlify-icon>" }]
3929
3943
  }], ctorParameters: () => [{ type: i1.MatDialog }, { type: AlertService }, { type: ErrorHandlerService }] });
3930
3944
 
3931
- let UsersViewAllComponent = class UsersViewAllComponent extends TechlifyListingControllerInterface {
3945
+ let UsersViewAllComponent = class UsersViewAllComponent extends TechlifyListComponent {
3932
3946
  constructor(alertService, currentUserService, userConfigService, dialog, service, fb) {
3933
3947
  super();
3934
3948
  this.alertService = alertService;
@@ -3958,6 +3972,14 @@ let UsersViewAllComponent = class UsersViewAllComponent extends TechlifyListingC
3958
3972
  status: { multiple: true },
3959
3973
  user_type_ids: { multiple: true }
3960
3974
  };
3975
+ if (this.config?.scrollContainer) {
3976
+ // Set to null if scroll has to be done from root
3977
+ this.scrollContainer = this.config?.scrollContainer === 'root' ? null : this.config?.scrollContainer;
3978
+ }
3979
+ }
3980
+ ngOnInit() {
3981
+ //Initialize form in OnInit.
3982
+ //On constructor Input() variables will be null, that will introduce a issue for admin view
3961
3983
  this.filterForm = this.fb.group({
3962
3984
  search: [''],
3963
3985
  role_ids: [''],
@@ -3968,12 +3990,6 @@ let UsersViewAllComponent = class UsersViewAllComponent extends TechlifyListingC
3968
3990
  client_id: [this.clientId],
3969
3991
  user_type_ids: this.userTypeIds.toString()
3970
3992
  });
3971
- if (this.config?.scrollContainer) {
3972
- // Set to null if scroll has to be done from root
3973
- this.scrollContainer = this.config?.scrollContainer === 'root' ? null : this.config?.scrollContainer;
3974
- }
3975
- }
3976
- ngOnInit() {
3977
3993
  this.currentUser = this.currentUserService.getUser();
3978
3994
  this.patchFiltersFromRoute();
3979
3995
  this.listenFilterChanges();
@@ -4045,14 +4061,14 @@ let UsersViewAllComponent = class UsersViewAllComponent extends TechlifyListingC
4045
4061
  .subscribe(_ => this.alertService.addAlert('Password reset email sent', 'success'));
4046
4062
  }
4047
4063
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UsersViewAllComponent, deps: [{ token: AlertService }, { token: CurrentUserService }, { token: UserConfigService }, { token: i1.MatDialog }, { token: UserService }, { token: i1$5.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
4048
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: UsersViewAllComponent, selector: "app-users-view-all", inputs: { clientId: "clientId", userTypeIds: "userTypeIds", title: "title", isAppAdminUser: "isAppAdminUser" }, usesInheritance: true, ngImport: i0, template: "<div [ngClass]=\"{'m-4':config?.userConfig?.showDefaultMargin}\">\n <mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <section class=\"d-flex justify-content-start align-items-center gap-2\">\n <h5 class=\"mb-0\"> {{ title }} </h5>\n <mat-icon class=\"cursor-pointer\" matTooltip=\"New User\"\n *ngIf=\"config?.userConfig?.showAddUser && currentUserService?.hasPermission('user_create')\"\n (click)=\"createOrEditUser()\">add</mat-icon>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../import']\"\n *ngIf=\"config?.userConfig?.showImportButton && currentUserService?.hasPermission('user_create')\">\n Import User\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../roles']\" *ngIf=\"config?.userConfig?.showRoles\">\n <mat-icon>people</mat-icon>\n Roles\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../role-permissions']\"\n *ngIf=\"config?.userConfig?.showPermissions\">\n <mat-icon>lock</mat-icon>\n Role Permissions\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../configurations']\"\n *ngIf=\"config?.userConfig?.showConfigurations && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n toggle_on\n </span>\n </mat-icon>\n Configurations\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../restrictors']\"\n *ngIf=\"config?.userConfig?.showRestrictors && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n vpn_lock\n </span>\n </mat-icon>\n Restrictors\n </button>\n </section>\n <form [formGroup]=\"filterForm\" class=\"d-flex flex-row justify-content-center align-items-center gap-2\">\n <mat-form-field appearance=\"outline\" class='fl-md'>\n <mat-label>Search</mat-label>\n <input autocomplete=\"off\" matInput type=\"text\" name=\"search\" placeholder=\"Search by name, email\"\n formControlName=\"search\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class='fl-sm'>\n <mat-label>Role</mat-label>\n <app-searchable-selector apiUrl=\"api/roles\" [multiple]=\"true\" formControlName=\"role_ids\"\n titleField=\"label\"></app-searchable-selector>\n </mat-form-field>\n <mat-button-toggle-group class='mb-3' [hideSingleSelectionIndicator]=\"true\" [hideMultipleSelectionIndicator]=\"true\"\n formControlName=\"status\" multiple>\n <mat-button-toggle value=\"enabled\">Enabled</mat-button-toggle>\n <mat-button-toggle value=\"disabled\">Disabled</mat-button-toggle>\n </mat-button-toggle-group>\n </form>\n </mat-card-content>\n </mat-card>\n <mat-card class=\"mt-2 p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Users\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\"\n [fromRoot]=\"true\" (scrolled)=\"onScroll()\" matSort (matSortChange)=\"sortColumn($event)\">\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header=\"name\" *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"[element?.id]\" class=\"text-decoration-none\">\n {{ element.name }}\n </a>\n <p class=\"mb-0 text-secondary\">\n <!-- !element?.user_client condition added to check if user has user_client record -->\n {{ !element?.user_client ? '' : element?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </p>\n </td>\n </ng-container>\n\n <!-- Email Column -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell mat-sort-header=\"email\" *matHeaderCellDef> Email </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.email}} </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header=\"user_type_id\" *matHeaderCellDef> User Type </th>\n <td mat-cell *matCellDef=\"let element\"> {{ getUserType(element) }} </td>\n </ng-container>\n\n <!-- Roles Column -->\n <ng-container matColumnDef=\"roles\">\n <th mat-header-cell *matHeaderCellDef> Role </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap text-light\">\n <span *ngFor=\"let role of element?.roles\" class=\"badge bg-secondary\">\n {{ role?.label }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Last Login Column -->\n <ng-container matColumnDef=\"last_login\">\n <th mat-header-cell *matHeaderCellDef> Last Login </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.last_login | date:'medium' }}</td>\n </ng-container>\n\n <!-- Added By Column -->\n <ng-container matColumnDef=\"added_by\">\n <th mat-header-cell *matHeaderCellDef> Added By </th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <p class=\"text-secondary\">{{ element?.created_at | date }}</p>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-row justify-content-start align-items-center gap-2 text-secondary\">\n <app-techlify-icon role='button' name=\"view\" class=\"clickable\" [routerLink]=\"[getUserViewRoute(element)]\"\n matTooltip=\"View\"></app-techlify-icon>\n\n <app-techlify-icon role='button' *ngIf=\"currentUserService.hasPermission('user_update')\" name=\"edit\"\n class=\"clickable\" (click)=\"createOrEditUser(element)\" matTooltip=\"Edit\"></app-techlify-icon>\n\n <app-techlify-delete-button\n *ngIf=\"currentUserService.hasPermission('user_delete') && element?.id !== currentUser?.id\"\n [model]=\"element\" [service]=\"service\" [data]=\"{title: element?.name, type: 'user'}\"\n (deleted)=\"reload()\"></app-techlify-delete-button>\n\n <app-techlify-icon role='button'\n *ngIf=\"currentUserService.hasPermission('techlify_rbac.user.reset_password')\" name=\"reset\"\n class=\"clickable\" (click)=\"resetPassword(element)\" matTooltip=\"Reset User Password\"></app-techlify-icon>\n\n <app-user-enable-button [user]=\"element\" (onSave)=\"reload()\"></app-user-enable-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>", dependencies: [{ kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7$2.MatLabel, selector: "mat-label" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i11.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i11.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i3$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i3$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i11$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i1$5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i6$1.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "isEmitInitialEvent", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: UserEnableButtonComponent, selector: "app-user-enable-button", inputs: ["user", "isUseIcons"], outputs: ["onSave"] }, { kind: "component", type: TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "component", type: TechlifyDeleteButtonComponent, selector: "app-techlify-delete-button", inputs: ["data", "model", "message", "service"], outputs: ["deleted"] }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }] }); }
4064
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: UsersViewAllComponent, selector: "app-users-view-all", inputs: { clientId: "clientId", userTypeIds: "userTypeIds", title: "title", isAppAdminUser: "isAppAdminUser" }, usesInheritance: true, ngImport: i0, template: "<div [ngClass]=\"{'m-4':config?.userConfig?.showDefaultMargin}\">\n <mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <section class=\"d-flex justify-content-start align-items-center gap-2\">\n <h5 class=\"mb-0\"> {{ title }} </h5>\n <mat-icon class=\"cursor-pointer\" matTooltip=\"New User\"\n *ngIf=\"config?.userConfig?.showAddUser && currentUserService?.hasPermission('user_create')\"\n (click)=\"createOrEditUser()\">add</mat-icon>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../import']\"\n *ngIf=\"config?.userConfig?.showImportButton && currentUserService?.hasPermission('user_create')\">\n Import User\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../roles']\" *ngIf=\"config?.userConfig?.showRoles\">\n <mat-icon>people</mat-icon>\n Roles\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../role-permissions']\"\n *ngIf=\"config?.userConfig?.showPermissions\">\n <mat-icon>lock</mat-icon>\n Role Permissions\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../configurations']\"\n *ngIf=\"config?.userConfig?.showConfigurations && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n toggle_on\n </span>\n </mat-icon>\n Configurations\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../restrictors']\"\n *ngIf=\"config?.userConfig?.showRestrictors && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n vpn_lock\n </span>\n </mat-icon>\n Restrictors\n </button>\n </section>\n <form [formGroup]=\"filterForm\" class=\"d-flex flex-row justify-content-center align-items-center gap-2\">\n <mat-form-field appearance=\"outline\" class='fl-md'>\n <mat-label>Search</mat-label>\n <input autocomplete=\"off\" matInput type=\"text\" name=\"search\" placeholder=\"Search by name, email\"\n formControlName=\"search\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class='fl-sm'>\n <mat-label>Role</mat-label>\n <app-searchable-selector apiUrl=\"api/roles\" [multiple]=\"true\" formControlName=\"role_ids\"\n titleField=\"label\"></app-searchable-selector>\n </mat-form-field>\n <mat-button-toggle-group class='mb-4' [hideSingleSelectionIndicator]=\"true\"\n [hideMultipleSelectionIndicator]=\"true\" formControlName=\"status\" multiple>\n <mat-button-toggle value=\"enabled\">Enabled</mat-button-toggle>\n <mat-button-toggle value=\"disabled\">Disabled</mat-button-toggle>\n </mat-button-toggle-group>\n </form>\n </mat-card-content>\n </mat-card>\n <mat-card class=\"mt-2 p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Users\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\"\n [fromRoot]=\"true\" (scrolled)=\"onScroll()\" matSort (matSortChange)=\"sortColumn($event)\">\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header=\"name\" *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"[element?.id]\" class=\"text-decoration-none\">\n {{ element.name }}\n </a>\n <p class=\"mb-0 text-secondary\">\n <!-- !element?.user_client condition added to check if user has user_client record -->\n {{ !element?.user_client ? '' : element?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </p>\n </td>\n </ng-container>\n\n <!-- Email Column -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell mat-sort-header=\"email\" *matHeaderCellDef> Email </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.email}} </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header=\"user_type_id\" *matHeaderCellDef> User Type </th>\n <td mat-cell *matCellDef=\"let element\"> {{ getUserType(element) }} </td>\n </ng-container>\n\n <!-- Roles Column -->\n <ng-container matColumnDef=\"roles\">\n <th mat-header-cell *matHeaderCellDef> Role </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap text-light\">\n <span *ngFor=\"let role of element?.roles\" class=\"badge bg-secondary\">\n {{ role?.label }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Last Login Column -->\n <ng-container matColumnDef=\"last_login\">\n <th mat-header-cell *matHeaderCellDef> Last Login </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.last_login | date:'medium' }}</td>\n </ng-container>\n\n <!-- Added By Column -->\n <ng-container matColumnDef=\"added_by\">\n <th mat-header-cell *matHeaderCellDef> Added By </th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <p class=\"text-secondary\">{{ element?.created_at | date }}</p>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-row justify-content-start align-items-center gap-2 text-secondary\">\n <app-techlify-icon role='button' name=\"view\" class=\"clickable\" [routerLink]=\"[getUserViewRoute(element)]\"\n matTooltip=\"View\"></app-techlify-icon>\n\n <app-techlify-icon role='button' *ngIf=\"currentUserService.hasPermission('user_update')\" name=\"edit\"\n class=\"clickable\" (click)=\"createOrEditUser(element)\" matTooltip=\"Edit\"></app-techlify-icon>\n\n <app-techlify-delete-button\n *ngIf=\"currentUserService.hasPermission('user_delete') && element?.id !== currentUser?.id\"\n [model]=\"element\" [service]=\"service\" [data]=\"{title: element?.name, type: 'user'}\"\n (deleted)=\"reload()\"></app-techlify-delete-button>\n\n <app-techlify-icon role='button'\n *ngIf=\"currentUserService.hasPermission('techlify_rbac.user.reset_password')\" name=\"reset\"\n class=\"clickable\" (click)=\"resetPassword(element)\" matTooltip=\"Reset User Password\"></app-techlify-icon>\n\n <app-user-enable-button [user]=\"element\" (onSave)=\"reload()\"></app-user-enable-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>", dependencies: [{ kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7$2.MatLabel, selector: "mat-label" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i11.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i11.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i3$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i3$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i11$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i1$5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i6$1.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "isEmitInitialEvent", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: UserEnableButtonComponent, selector: "app-user-enable-button", inputs: ["user", "isUseIcons"], outputs: ["onSave"] }, { kind: "component", type: TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "component", type: TechlifyDeleteButtonComponent, selector: "app-techlify-delete-button", inputs: ["data", "model", "message", "service"], outputs: ["deleted"] }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }] }); }
4049
4065
  };
4050
4066
  UsersViewAllComponent = __decorate([
4051
4067
  UntilDestroy()
4052
4068
  ], UsersViewAllComponent);
4053
4069
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UsersViewAllComponent, decorators: [{
4054
4070
  type: Component,
4055
- args: [{ selector: 'app-users-view-all', template: "<div [ngClass]=\"{'m-4':config?.userConfig?.showDefaultMargin}\">\n <mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <section class=\"d-flex justify-content-start align-items-center gap-2\">\n <h5 class=\"mb-0\"> {{ title }} </h5>\n <mat-icon class=\"cursor-pointer\" matTooltip=\"New User\"\n *ngIf=\"config?.userConfig?.showAddUser && currentUserService?.hasPermission('user_create')\"\n (click)=\"createOrEditUser()\">add</mat-icon>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../import']\"\n *ngIf=\"config?.userConfig?.showImportButton && currentUserService?.hasPermission('user_create')\">\n Import User\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../roles']\" *ngIf=\"config?.userConfig?.showRoles\">\n <mat-icon>people</mat-icon>\n Roles\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../role-permissions']\"\n *ngIf=\"config?.userConfig?.showPermissions\">\n <mat-icon>lock</mat-icon>\n Role Permissions\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../configurations']\"\n *ngIf=\"config?.userConfig?.showConfigurations && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n toggle_on\n </span>\n </mat-icon>\n Configurations\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../restrictors']\"\n *ngIf=\"config?.userConfig?.showRestrictors && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n vpn_lock\n </span>\n </mat-icon>\n Restrictors\n </button>\n </section>\n <form [formGroup]=\"filterForm\" class=\"d-flex flex-row justify-content-center align-items-center gap-2\">\n <mat-form-field appearance=\"outline\" class='fl-md'>\n <mat-label>Search</mat-label>\n <input autocomplete=\"off\" matInput type=\"text\" name=\"search\" placeholder=\"Search by name, email\"\n formControlName=\"search\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class='fl-sm'>\n <mat-label>Role</mat-label>\n <app-searchable-selector apiUrl=\"api/roles\" [multiple]=\"true\" formControlName=\"role_ids\"\n titleField=\"label\"></app-searchable-selector>\n </mat-form-field>\n <mat-button-toggle-group class='mb-3' [hideSingleSelectionIndicator]=\"true\" [hideMultipleSelectionIndicator]=\"true\"\n formControlName=\"status\" multiple>\n <mat-button-toggle value=\"enabled\">Enabled</mat-button-toggle>\n <mat-button-toggle value=\"disabled\">Disabled</mat-button-toggle>\n </mat-button-toggle-group>\n </form>\n </mat-card-content>\n </mat-card>\n <mat-card class=\"mt-2 p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Users\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\"\n [fromRoot]=\"true\" (scrolled)=\"onScroll()\" matSort (matSortChange)=\"sortColumn($event)\">\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header=\"name\" *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"[element?.id]\" class=\"text-decoration-none\">\n {{ element.name }}\n </a>\n <p class=\"mb-0 text-secondary\">\n <!-- !element?.user_client condition added to check if user has user_client record -->\n {{ !element?.user_client ? '' : element?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </p>\n </td>\n </ng-container>\n\n <!-- Email Column -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell mat-sort-header=\"email\" *matHeaderCellDef> Email </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.email}} </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header=\"user_type_id\" *matHeaderCellDef> User Type </th>\n <td mat-cell *matCellDef=\"let element\"> {{ getUserType(element) }} </td>\n </ng-container>\n\n <!-- Roles Column -->\n <ng-container matColumnDef=\"roles\">\n <th mat-header-cell *matHeaderCellDef> Role </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap text-light\">\n <span *ngFor=\"let role of element?.roles\" class=\"badge bg-secondary\">\n {{ role?.label }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Last Login Column -->\n <ng-container matColumnDef=\"last_login\">\n <th mat-header-cell *matHeaderCellDef> Last Login </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.last_login | date:'medium' }}</td>\n </ng-container>\n\n <!-- Added By Column -->\n <ng-container matColumnDef=\"added_by\">\n <th mat-header-cell *matHeaderCellDef> Added By </th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <p class=\"text-secondary\">{{ element?.created_at | date }}</p>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-row justify-content-start align-items-center gap-2 text-secondary\">\n <app-techlify-icon role='button' name=\"view\" class=\"clickable\" [routerLink]=\"[getUserViewRoute(element)]\"\n matTooltip=\"View\"></app-techlify-icon>\n\n <app-techlify-icon role='button' *ngIf=\"currentUserService.hasPermission('user_update')\" name=\"edit\"\n class=\"clickable\" (click)=\"createOrEditUser(element)\" matTooltip=\"Edit\"></app-techlify-icon>\n\n <app-techlify-delete-button\n *ngIf=\"currentUserService.hasPermission('user_delete') && element?.id !== currentUser?.id\"\n [model]=\"element\" [service]=\"service\" [data]=\"{title: element?.name, type: 'user'}\"\n (deleted)=\"reload()\"></app-techlify-delete-button>\n\n <app-techlify-icon role='button'\n *ngIf=\"currentUserService.hasPermission('techlify_rbac.user.reset_password')\" name=\"reset\"\n class=\"clickable\" (click)=\"resetPassword(element)\" matTooltip=\"Reset User Password\"></app-techlify-icon>\n\n <app-user-enable-button [user]=\"element\" (onSave)=\"reload()\"></app-user-enable-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>" }]
4071
+ args: [{ selector: 'app-users-view-all', template: "<div [ngClass]=\"{'m-4':config?.userConfig?.showDefaultMargin}\">\n <mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-2\">\n <section class=\"d-flex justify-content-start align-items-center gap-2\">\n <h5 class=\"mb-0\"> {{ title }} </h5>\n <mat-icon class=\"cursor-pointer\" matTooltip=\"New User\"\n *ngIf=\"config?.userConfig?.showAddUser && currentUserService?.hasPermission('user_create')\"\n (click)=\"createOrEditUser()\">add</mat-icon>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../import']\"\n *ngIf=\"config?.userConfig?.showImportButton && currentUserService?.hasPermission('user_create')\">\n Import User\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../roles']\" *ngIf=\"config?.userConfig?.showRoles\">\n <mat-icon>people</mat-icon>\n Roles\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../role-permissions']\"\n *ngIf=\"config?.userConfig?.showPermissions\">\n <mat-icon>lock</mat-icon>\n Role Permissions\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../configurations']\"\n *ngIf=\"config?.userConfig?.showConfigurations && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n toggle_on\n </span>\n </mat-icon>\n Configurations\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../restrictors']\"\n *ngIf=\"config?.userConfig?.showRestrictors && currentUser?.user_type_id === 2\">\n <mat-icon>\n <span class=\"material-icons-outlined\">\n vpn_lock\n </span>\n </mat-icon>\n Restrictors\n </button>\n </section>\n <form [formGroup]=\"filterForm\" class=\"d-flex flex-row justify-content-center align-items-center gap-2\">\n <mat-form-field appearance=\"outline\" class='fl-md'>\n <mat-label>Search</mat-label>\n <input autocomplete=\"off\" matInput type=\"text\" name=\"search\" placeholder=\"Search by name, email\"\n formControlName=\"search\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class='fl-sm'>\n <mat-label>Role</mat-label>\n <app-searchable-selector apiUrl=\"api/roles\" [multiple]=\"true\" formControlName=\"role_ids\"\n titleField=\"label\"></app-searchable-selector>\n </mat-form-field>\n <mat-button-toggle-group class='mb-4' [hideSingleSelectionIndicator]=\"true\"\n [hideMultipleSelectionIndicator]=\"true\" formControlName=\"status\" multiple>\n <mat-button-toggle value=\"enabled\">Enabled</mat-button-toggle>\n <mat-button-toggle value=\"disabled\">Disabled</mat-button-toggle>\n </mat-button-toggle-group>\n </form>\n </mat-card-content>\n </mat-card>\n <mat-card class=\"mt-2 p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Users\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\"\n [fromRoot]=\"true\" (scrolled)=\"onScroll()\" matSort (matSortChange)=\"sortColumn($event)\">\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header=\"name\" *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\">\n <a [routerLink]=\"[element?.id]\" class=\"text-decoration-none\">\n {{ element.name }}\n </a>\n <p class=\"mb-0 text-secondary\">\n <!-- !element?.user_client condition added to check if user has user_client record -->\n {{ !element?.user_client ? '' : element?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </p>\n </td>\n </ng-container>\n\n <!-- Email Column -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell mat-sort-header=\"email\" *matHeaderCellDef> Email </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.email}} </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header=\"user_type_id\" *matHeaderCellDef> User Type </th>\n <td mat-cell *matCellDef=\"let element\"> {{ getUserType(element) }} </td>\n </ng-container>\n\n <!-- Roles Column -->\n <ng-container matColumnDef=\"roles\">\n <th mat-header-cell *matHeaderCellDef> Role </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap text-light\">\n <span *ngFor=\"let role of element?.roles\" class=\"badge bg-secondary\">\n {{ role?.label }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- Last Login Column -->\n <ng-container matColumnDef=\"last_login\">\n <th mat-header-cell *matHeaderCellDef> Last Login </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.last_login | date:'medium' }}</td>\n </ng-container>\n\n <!-- Added By Column -->\n <ng-container matColumnDef=\"added_by\">\n <th mat-header-cell *matHeaderCellDef> Added By </th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <p class=\"text-secondary\">{{ element?.created_at | date }}</p>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-row justify-content-start align-items-center gap-2 text-secondary\">\n <app-techlify-icon role='button' name=\"view\" class=\"clickable\" [routerLink]=\"[getUserViewRoute(element)]\"\n matTooltip=\"View\"></app-techlify-icon>\n\n <app-techlify-icon role='button' *ngIf=\"currentUserService.hasPermission('user_update')\" name=\"edit\"\n class=\"clickable\" (click)=\"createOrEditUser(element)\" matTooltip=\"Edit\"></app-techlify-icon>\n\n <app-techlify-delete-button\n *ngIf=\"currentUserService.hasPermission('user_delete') && element?.id !== currentUser?.id\"\n [model]=\"element\" [service]=\"service\" [data]=\"{title: element?.name, type: 'user'}\"\n (deleted)=\"reload()\"></app-techlify-delete-button>\n\n <app-techlify-icon role='button'\n *ngIf=\"currentUserService.hasPermission('techlify_rbac.user.reset_password')\" name=\"reset\"\n class=\"clickable\" (click)=\"resetPassword(element)\" matTooltip=\"Reset User Password\"></app-techlify-icon>\n\n <app-user-enable-button [user]=\"element\" (onSave)=\"reload()\"></app-user-enable-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n</div>" }]
4056
4072
  }], ctorParameters: () => [{ type: AlertService }, { type: CurrentUserService }, { type: UserConfigService }, { type: i1.MatDialog }, { type: UserService }, { type: i1$5.UntypedFormBuilder }], propDecorators: { clientId: [{
4057
4073
  type: Input
4058
4074
  }], userTypeIds: [{
@@ -4496,7 +4512,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4496
4512
  type: Input
4497
4513
  }] } });
4498
4514
 
4499
- class AuditLogService extends TechlifyServiceBaseClass {
4515
+ class AuditLogService extends TechlifyService {
4500
4516
  constructor(httpService) {
4501
4517
  super(httpService, 'audit-logs');
4502
4518
  }
@@ -4590,13 +4606,6 @@ let AuditLogListFilterComponent = class AuditLogListFilterComponent {
4590
4606
  }
4591
4607
  ngOnInit() {
4592
4608
  }
4593
- onDurationChange(timelineValue) {
4594
- const { date_to, date_from } = timelineValue;
4595
- this.filterForm.patchValue({
4596
- date_from: date_from ? moment(date_from).format('YYYY-MM-DD') : '',
4597
- date_to: date_to ? moment(date_to).format('YYYY-MM-DD') : ''
4598
- });
4599
- }
4600
4609
  resetFieldValue(field) {
4601
4610
  this.filterForm.get(field).setValue('');
4602
4611
  }
@@ -4609,14 +4618,14 @@ let AuditLogListFilterComponent = class AuditLogListFilterComponent {
4609
4618
  ngOnDestroy() {
4610
4619
  }
4611
4620
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuditLogListFilterComponent, deps: [{ token: FormValidatorService }], target: i0.ɵɵFactoryTarget.Component }); }
4612
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AuditLogListFilterComponent, selector: "app-audit-log-list-filter", inputs: { filterForm: "filterForm", objectId: "objectId", objectType: "objectType" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2 w-100\">\n <mat-form-field class='fl-md'>\n <mat-label>Search Changes</mat-label>\n <input type=\"text\" matInput formControlName=\"change_search\" />\n <button *ngIf=\"getFieldValue('change_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('change_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter class='fl-sm' labelText=\"Activity Date\" formControlName=\"duration\" [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\" (selectionChange)=\"onDurationChange($event)\" [showClearButton]=\"true\"\n appearance=\"outline\"></app-timeline-filter>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Action</mat-label>\n <mat-select formControlName=\"action\" [multiple]=\"true\">\n <mat-option value=\"created\">Created</mat-option>\n <mat-option value=\"updated\">Updated</mat-option>\n <mat-option value=\"deleted\">Deleted</mat-option>\n </mat-select>\n <button *ngIf=\"getFieldValue('action')\" matSuffix mat-icon-button (click)=\"resetFieldValue('action')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm' *ngIf=\"showObjectFilter\">\n <mat-label>Model Type</mat-label>\n <app-searchable-selector formControlName=\"object_type\" apiUrl=\"api/audit-log-types\" titleField=\"object_type\"\n valueField=\"object_type\" [sort]=\"false\" [multiple]=\"true\">\n </app-searchable-selector>\n <button *ngIf=\"getFieldValue('object_type')\" matSuffix mat-icon-button (click)=\"resetFieldValue('object_type')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Model #</mat-label>\n <input type=\"text\" matInput formControlName=\"model_search\" />\n <button *ngIf=\"getFieldValue('model_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('model_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Creator</mat-label>\n <app-searchable-selector formControlName=\"creator_ids\" [multiple]=\"true\" apiUrl=\"api/users\"\n titleField=\"name\"></app-searchable-selector>\n <button *ngIf=\"getFieldValue('creator_ids')\" matSuffix mat-icon-button (click)=\"resetFieldValue('creator_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i9$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "isEmitInitialEvent", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }] }); }
4621
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AuditLogListFilterComponent, selector: "app-audit-log-list-filter", inputs: { filterForm: "filterForm", objectId: "objectId", objectType: "objectType" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2 w-100\">\n <mat-form-field class='fl-md'>\n <mat-label>Search Changes</mat-label>\n <input type=\"text\" matInput formControlName=\"change_search\" />\n <button *ngIf=\"getFieldValue('change_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('change_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter class='fl-sm' labelText=\"Activity Date\" formControlName=\"duration\"\n [form]=\"filterForm\" [showClearButton]=\"true\" appearance=\"outline\"></app-timeline-filter>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Action</mat-label>\n <mat-select formControlName=\"action\" [multiple]=\"true\">\n <mat-option value=\"created\">Created</mat-option>\n <mat-option value=\"updated\">Updated</mat-option>\n <mat-option value=\"deleted\">Deleted</mat-option>\n </mat-select>\n <button *ngIf=\"getFieldValue('action')\" matSuffix mat-icon-button (click)=\"resetFieldValue('action')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm' *ngIf=\"showObjectFilter\">\n <mat-label>Model Type</mat-label>\n <app-searchable-selector formControlName=\"object_type\" apiUrl=\"api/audit-log-types\" titleField=\"object_type\"\n valueField=\"object_type\" [sort]=\"false\" [multiple]=\"true\">\n </app-searchable-selector>\n <button *ngIf=\"getFieldValue('object_type')\" matSuffix mat-icon-button (click)=\"resetFieldValue('object_type')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Model #</mat-label>\n <input type=\"text\" matInput formControlName=\"model_search\" />\n <button *ngIf=\"getFieldValue('model_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('model_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Creator</mat-label>\n <app-searchable-selector formControlName=\"creator_ids\" [multiple]=\"true\" apiUrl=\"api/users\"\n titleField=\"name\"></app-searchable-selector>\n <button *ngIf=\"getFieldValue('creator_ids')\" matSuffix mat-icon-button (click)=\"resetFieldValue('creator_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i9$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "isEmitInitialEvent", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }] }); }
4613
4622
  };
4614
4623
  AuditLogListFilterComponent = __decorate([
4615
4624
  UntilDestroy()
4616
4625
  ], AuditLogListFilterComponent);
4617
4626
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuditLogListFilterComponent, decorators: [{
4618
4627
  type: Component,
4619
- args: [{ selector: 'app-audit-log-list-filter', template: "<form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2 w-100\">\n <mat-form-field class='fl-md'>\n <mat-label>Search Changes</mat-label>\n <input type=\"text\" matInput formControlName=\"change_search\" />\n <button *ngIf=\"getFieldValue('change_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('change_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter class='fl-sm' labelText=\"Activity Date\" formControlName=\"duration\" [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\" (selectionChange)=\"onDurationChange($event)\" [showClearButton]=\"true\"\n appearance=\"outline\"></app-timeline-filter>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Action</mat-label>\n <mat-select formControlName=\"action\" [multiple]=\"true\">\n <mat-option value=\"created\">Created</mat-option>\n <mat-option value=\"updated\">Updated</mat-option>\n <mat-option value=\"deleted\">Deleted</mat-option>\n </mat-select>\n <button *ngIf=\"getFieldValue('action')\" matSuffix mat-icon-button (click)=\"resetFieldValue('action')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm' *ngIf=\"showObjectFilter\">\n <mat-label>Model Type</mat-label>\n <app-searchable-selector formControlName=\"object_type\" apiUrl=\"api/audit-log-types\" titleField=\"object_type\"\n valueField=\"object_type\" [sort]=\"false\" [multiple]=\"true\">\n </app-searchable-selector>\n <button *ngIf=\"getFieldValue('object_type')\" matSuffix mat-icon-button (click)=\"resetFieldValue('object_type')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Model #</mat-label>\n <input type=\"text\" matInput formControlName=\"model_search\" />\n <button *ngIf=\"getFieldValue('model_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('model_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Creator</mat-label>\n <app-searchable-selector formControlName=\"creator_ids\" [multiple]=\"true\" apiUrl=\"api/users\"\n titleField=\"name\"></app-searchable-selector>\n <button *ngIf=\"getFieldValue('creator_ids')\" matSuffix mat-icon-button (click)=\"resetFieldValue('creator_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n</form>" }]
4628
+ args: [{ selector: 'app-audit-log-list-filter', template: "<form [formGroup]=\"filterForm\" class=\"d-flex justify-content-end align-items-center gap-2 w-100\">\n <mat-form-field class='fl-md'>\n <mat-label>Search Changes</mat-label>\n <input type=\"text\" matInput formControlName=\"change_search\" />\n <button *ngIf=\"getFieldValue('change_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('change_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter class='fl-sm' labelText=\"Activity Date\" formControlName=\"duration\"\n [form]=\"filterForm\" [showClearButton]=\"true\" appearance=\"outline\"></app-timeline-filter>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Action</mat-label>\n <mat-select formControlName=\"action\" [multiple]=\"true\">\n <mat-option value=\"created\">Created</mat-option>\n <mat-option value=\"updated\">Updated</mat-option>\n <mat-option value=\"deleted\">Deleted</mat-option>\n </mat-select>\n <button *ngIf=\"getFieldValue('action')\" matSuffix mat-icon-button (click)=\"resetFieldValue('action')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm' *ngIf=\"showObjectFilter\">\n <mat-label>Model Type</mat-label>\n <app-searchable-selector formControlName=\"object_type\" apiUrl=\"api/audit-log-types\" titleField=\"object_type\"\n valueField=\"object_type\" [sort]=\"false\" [multiple]=\"true\">\n </app-searchable-selector>\n <button *ngIf=\"getFieldValue('object_type')\" matSuffix mat-icon-button (click)=\"resetFieldValue('object_type')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Model #</mat-label>\n <input type=\"text\" matInput formControlName=\"model_search\" />\n <button *ngIf=\"getFieldValue('model_search')\" matSuffix mat-icon-button (click)=\"resetFieldValue('model_search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Creator</mat-label>\n <app-searchable-selector formControlName=\"creator_ids\" [multiple]=\"true\" apiUrl=\"api/users\"\n titleField=\"name\"></app-searchable-selector>\n <button *ngIf=\"getFieldValue('creator_ids')\" matSuffix mat-icon-button (click)=\"resetFieldValue('creator_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n</form>" }]
4620
4629
  }], ctorParameters: () => [{ type: FormValidatorService }], propDecorators: { filterForm: [{
4621
4630
  type: Input
4622
4631
  }], objectId: [{
@@ -4627,19 +4636,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4627
4636
  type: Output
4628
4637
  }] } });
4629
4638
 
4630
- let AuditLogListComponent = class AuditLogListComponent extends TechlifyListingControllerInterface {
4631
- constructor(router, sanitizer, formBuilder, auditLogService, activatedRoute) {
4639
+ let AuditLogListComponent = class AuditLogListComponent extends TechlifyListComponent {
4640
+ constructor(router, sanitizer, formBuilder, service, datePipe) {
4632
4641
  super();
4633
4642
  this.router = router;
4634
4643
  this.sanitizer = sanitizer;
4635
4644
  this.formBuilder = formBuilder;
4636
- this.auditLogService = auditLogService;
4637
- this.activatedRoute = activatedRoute;
4645
+ this.service = service;
4646
+ this.datePipe = datePipe;
4638
4647
  this.showFilter = true;
4639
4648
  this.showExportButtons = true;
4640
4649
  this.disableFilterPatchingFromUrl = false;
4641
4650
  this.scrollContainer = '.mat-sidenav-content';
4642
- this.filters = { sort_by: 'created_at|desc' };
4643
4651
  this.displayedColumns = [
4644
4652
  'index',
4645
4653
  'id',
@@ -4651,6 +4659,12 @@ let AuditLogListComponent = class AuditLogListComponent extends TechlifyListingC
4651
4659
  'user.email',
4652
4660
  'actions',
4653
4661
  ];
4662
+ this.filterFormConfiguration = {
4663
+ duration: { number: true },
4664
+ object_type: { multiple: true },
4665
+ action: { multiple: true },
4666
+ creator_ids: { multiple: true },
4667
+ };
4654
4668
  this.filterForm = this.formBuilder.group({
4655
4669
  action: [''],
4656
4670
  change_search: [''],
@@ -4667,42 +4681,10 @@ let AuditLogListComponent = class AuditLogListComponent extends TechlifyListingC
4667
4681
  }
4668
4682
  ngOnInit() {
4669
4683
  this.initializeData();
4670
- /**
4671
- * Disable filter patching from URL so that when this component
4672
- * is used in a dialog, it doesn't interact with the URL
4673
- */
4674
4684
  if (!this.disableFilterPatchingFromUrl) {
4675
- this.filterForm.valueChanges.subscribe({
4676
- next: (value) => {
4677
- const params = this.requestHelperService.convertToFormData(value);
4678
- this.requestHelperService.updateQueryParams(params);
4679
- }
4680
- });
4681
- // update form with query params
4682
- this.requestHelperService.updateFormWithQueryParams(this.filterForm, {
4683
- duration: { number: true },
4684
- object_type: { multiple: true },
4685
- action: { multiple: true },
4686
- creator_ids: { multiple: true },
4687
- });
4688
- }
4689
- else {
4690
- this.filterForm.valueChanges.pipe(debounceTime(800)).subscribe(() => {
4691
- this.reload();
4692
- });
4693
- }
4694
- // listen for route change
4695
- this.activatedRoute.queryParams
4696
- .pipe(debounceTime(800), distinctUntilChanged())
4697
- .subscribe((val) => {
4698
- this.reload();
4699
- });
4700
- if (this.sort) {
4701
- this.sort.sortChange.pipe(untilDestroyed(this))
4702
- .subscribe((value) => {
4703
- this.changeSort(value);
4704
- });
4685
+ this.patchFiltersFromRoute();
4705
4686
  }
4687
+ this.listenFilterChanges();
4706
4688
  }
4707
4689
  get excelData() {
4708
4690
  if (this.models.length > 0) {
@@ -4720,38 +4702,16 @@ let AuditLogListComponent = class AuditLogListComponent extends TechlifyListingC
4720
4702
  }
4721
4703
  return [];
4722
4704
  }
4723
- changeSort(event) {
4724
- if (event.direction) {
4725
- this.filters.sort_by = `${event.active}|${event.direction}`;
4726
- this.reload();
4727
- }
4728
- }
4729
4705
  logClicked(log) {
4730
4706
  this.router.navigate(['/system/audit-logs/log-view', log.id]);
4731
4707
  }
4732
4708
  initializeData() {
4733
- const filters = { ...this.filters };
4734
- if (this.objectType) {
4735
- filters.object_type = this.objectType;
4736
- }
4737
- if (this.objectId) {
4738
- filters.object_id = this.objectId;
4739
- }
4740
- if (this.userId) {
4741
- filters.user_id = this.userId;
4742
- }
4743
- this.filterForm.patchValue(filters);
4744
- }
4745
- filterChange(event) {
4746
- if (this.showFilter) {
4747
- this.filters = {
4748
- ...this.filters,
4749
- ...event,
4750
- object_type: this.objectType || event?.object_type || '',
4751
- object_id: this.objectId || '',
4752
- };
4753
- this.reload();
4754
- }
4709
+ if (this.objectType)
4710
+ this.filterForm.patchValue({ object_type: this.objectType });
4711
+ if (this.objectId)
4712
+ this.filterForm.patchValue({ object_id: this.objectId });
4713
+ if (this.userId)
4714
+ this.filterForm.patchValue({ user_id: this.userId });
4755
4715
  }
4756
4716
  getTransformedChanges(log) {
4757
4717
  if (log?.data?.changes) {
@@ -4770,31 +4730,26 @@ let AuditLogListComponent = class AuditLogListComponent extends TechlifyListingC
4770
4730
  // Needed for automatic unsubscribe with untilDestroyed
4771
4731
  }
4772
4732
  loadData() {
4773
- const params = {
4774
- ...this.requestHelperService.convertToFormData(this.filterForm.value),
4775
- page: this.page,
4776
- perPage: this.perPage,
4777
- };
4778
- this.isWorking = true;
4779
- this.auditLogService.index(params).subscribe({
4780
- next: (response) => {
4781
- this.isWorking = false;
4782
- this.models = this.models?.concat(response?.data);
4783
- this.lastPage = response?.last_page;
4784
- },
4785
- error: () => (this.isWorking = false)
4786
- });
4733
+ let filters = this.filterForm.value;
4734
+ filters.page = this.page;
4735
+ filters.per_page = this.perPage;
4736
+ filters.object_id = this.objectId ?? '';
4737
+ filters.object_type = this.objectType ?? '';
4738
+ filters.user_id = this.userId ?? '';
4739
+ filters.date_from = this.datePipe.transform(filters.date_from, 'yyyy-MM-dd') ?? '';
4740
+ filters.date_to = this.datePipe.transform(filters.date_to, 'yyyy-MM-dd') ?? '';
4741
+ super.loadData(filters);
4787
4742
  }
4788
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuditLogListComponent, deps: [{ token: i1$2.Router }, { token: i1$6.DomSanitizer }, { token: i1$5.FormBuilder }, { token: AuditLogService }, { token: i1$2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
4789
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AuditLogListComponent, selector: "app-audit-log-list", inputs: { objectId: "objectId", objectType: "objectType", showFilter: "showFilter", showExportButtons: "showExportButtons", userId: "userId", disableFilterPatchingFromUrl: "disableFilterPatchingFromUrl", scrollContainer: "scrollContainer" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-card class=\"m-2\">\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\" style=\"min-width: 200px\">\n <h5 class=\"mb-0\"> Audit Logs </h5>\n <app-export-excel-button *ngIf=\"showExportButtons\" matTooltip=\"Export\" elementId=\"audit-logs-table\" class=\"mt-1\"\n name=\"AuditLogs\" [data]=\"excelData\">\n </app-export-excel-button>\n </div>\n\n <app-audit-log-list-filter class=\"w-100\" *ngIf=\"showFilter\" [filterForm]=\"filterForm\"\n (valueChange)=\"filterChange($event)\" [objectType]=\"objectType\"\n [objectId]=\"objectId\"></app-audit-log-list-filter>\n </div>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"mt-2\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" matSort class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\" (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let i = index\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> Log # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_type\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Model Type </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog.object_type }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_id\">\n <th mat-header-cell *matHeaderCellDef> Model # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.object_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Action </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog?.action }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"created_at\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created At </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.created_at | date:'medium'}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"user.email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created By </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <p class=\"mb-0\">{{auditLog?.user?.name}}</p>\n <small class=\"text-secondary\">{{ auditLog?.user?.email }}</small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"changes\">\n <th mat-header-cell *matHeaderCellDef> Changes</th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"px-3\" [innerHtml]=\"sanitizer.bypassSecurityTrustHtml(getTransformedChanges(auditLog))\">\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"text-secondary\">\n <app-techlify-icon role=\"button\" name=\"view\" class=\"clickable\"\n (click)=\"logClicked(auditLog);$event.stopPropagation();\" matTooltip=\"View\"></app-techlify-icon>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky:true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["tr.row-hover:hover{background-color:#dcdcdc}.scroll-container{height:800px;overflow-y:auto}:host ::ng-deep #old-value{margin-right:5px;background-color:#f08080}:host ::ng-deep #new-value{background-color:#98fb98}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ExportExcelButtonComponent, selector: "app-export-excel-button", inputs: ["isCSV", "fileName", "data", "tableId"], outputs: ["isExportingToExcel"] }, { kind: "directive", type: i11.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i11.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i11$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i6$1.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: AuditLogListFilterComponent, selector: "app-audit-log-list-filter", inputs: ["filterForm", "objectId", "objectType"], outputs: ["valueChange"] }, { kind: "component", type: TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }] }); }
4743
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuditLogListComponent, deps: [{ token: i1$2.Router }, { token: i1$6.DomSanitizer }, { token: i1$5.FormBuilder }, { token: AuditLogService }, { token: i2$1.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
4744
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AuditLogListComponent, selector: "app-audit-log-list", inputs: { objectId: "objectId", objectType: "objectType", showFilter: "showFilter", showExportButtons: "showExportButtons", userId: "userId", disableFilterPatchingFromUrl: "disableFilterPatchingFromUrl", scrollContainer: "scrollContainer" }, usesInheritance: true, ngImport: i0, template: "<mat-card class=\"m-2\">\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\" style=\"min-width: 200px\">\n <h5 class=\"mb-0\"> Audit Logs </h5>\n <app-export-excel-button *ngIf=\"showExportButtons\" matTooltip=\"Export\" elementId=\"audit-logs-table\" class=\"mt-1\"\n name=\"AuditLogs\" [data]=\"excelData\">\n </app-export-excel-button>\n </div>\n\n <app-audit-log-list-filter class=\"w-100\" *ngIf=\"showFilter\" [filterForm]=\"filterForm\"\n [objectType]=\"objectType\" [objectId]=\"objectId\"></app-audit-log-list-filter>\n </div>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"mt-2\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" matSort class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\" (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\" (matSortChange)=\"sortColumn($event)\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let i = index\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> Log # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_type\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Model Type </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog.object_type }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_id\">\n <th mat-header-cell *matHeaderCellDef> Model # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.object_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Action </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog?.action }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"created_at\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created At </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.created_at | date:'medium'}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"user.email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created By </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <p class=\"mb-0\">{{auditLog?.user?.name}}</p>\n <small class=\"text-secondary\">{{ auditLog?.user?.email }}</small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"changes\">\n <th mat-header-cell *matHeaderCellDef> Changes</th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"px-3\" [innerHtml]=\"sanitizer.bypassSecurityTrustHtml(getTransformedChanges(auditLog))\">\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"text-secondary\">\n <app-techlify-icon role=\"button\" name=\"view\" class=\"clickable\"\n (click)=\"logClicked(auditLog);$event.stopPropagation();\" matTooltip=\"View\"></app-techlify-icon>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky:true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["tr.row-hover:hover{background-color:#dcdcdc}.scroll-container{height:800px;overflow-y:auto}:host ::ng-deep #old-value{margin-right:5px;background-color:#f08080}:host ::ng-deep #new-value{background-color:#98fb98}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ExportExcelButtonComponent, selector: "app-export-excel-button", inputs: ["isCSV", "fileName", "data", "tableId"], outputs: ["isExportingToExcel"] }, { kind: "directive", type: i11.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i11.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i11$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i6$1.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: AuditLogListFilterComponent, selector: "app-audit-log-list-filter", inputs: ["filterForm", "objectId", "objectType"], outputs: ["valueChange"] }, { kind: "component", type: TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }] }); }
4790
4745
  };
4791
4746
  AuditLogListComponent = __decorate([
4792
4747
  UntilDestroy()
4793
4748
  ], AuditLogListComponent);
4794
4749
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuditLogListComponent, decorators: [{
4795
4750
  type: Component,
4796
- args: [{ selector: 'app-audit-log-list', template: "<mat-card class=\"m-2\">\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\" style=\"min-width: 200px\">\n <h5 class=\"mb-0\"> Audit Logs </h5>\n <app-export-excel-button *ngIf=\"showExportButtons\" matTooltip=\"Export\" elementId=\"audit-logs-table\" class=\"mt-1\"\n name=\"AuditLogs\" [data]=\"excelData\">\n </app-export-excel-button>\n </div>\n\n <app-audit-log-list-filter class=\"w-100\" *ngIf=\"showFilter\" [filterForm]=\"filterForm\"\n (valueChange)=\"filterChange($event)\" [objectType]=\"objectType\"\n [objectId]=\"objectId\"></app-audit-log-list-filter>\n </div>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"mt-2\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" matSort class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\" (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let i = index\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> Log # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_type\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Model Type </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog.object_type }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_id\">\n <th mat-header-cell *matHeaderCellDef> Model # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.object_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Action </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog?.action }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"created_at\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created At </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.created_at | date:'medium'}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"user.email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created By </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <p class=\"mb-0\">{{auditLog?.user?.name}}</p>\n <small class=\"text-secondary\">{{ auditLog?.user?.email }}</small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"changes\">\n <th mat-header-cell *matHeaderCellDef> Changes</th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"px-3\" [innerHtml]=\"sanitizer.bypassSecurityTrustHtml(getTransformedChanges(auditLog))\">\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"text-secondary\">\n <app-techlify-icon role=\"button\" name=\"view\" class=\"clickable\"\n (click)=\"logClicked(auditLog);$event.stopPropagation();\" matTooltip=\"View\"></app-techlify-icon>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky:true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["tr.row-hover:hover{background-color:#dcdcdc}.scroll-container{height:800px;overflow-y:auto}:host ::ng-deep #old-value{margin-right:5px;background-color:#f08080}:host ::ng-deep #new-value{background-color:#98fb98}\n"] }]
4797
- }], ctorParameters: () => [{ type: i1$2.Router }, { type: i1$6.DomSanitizer }, { type: i1$5.FormBuilder }, { type: AuditLogService }, { type: i1$2.ActivatedRoute }], propDecorators: { objectId: [{
4751
+ args: [{ selector: 'app-audit-log-list', template: "<mat-card class=\"m-2\">\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\" style=\"min-width: 200px\">\n <h5 class=\"mb-0\"> Audit Logs </h5>\n <app-export-excel-button *ngIf=\"showExportButtons\" matTooltip=\"Export\" elementId=\"audit-logs-table\" class=\"mt-1\"\n name=\"AuditLogs\" [data]=\"excelData\">\n </app-export-excel-button>\n </div>\n\n <app-audit-log-list-filter class=\"w-100\" *ngIf=\"showFilter\" [filterForm]=\"filterForm\"\n [objectType]=\"objectType\" [objectId]=\"objectId\"></app-audit-log-list-filter>\n </div>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"mt-2\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" matSort class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" [infiniteScrollContainer]=\"scrollContainer\" (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\" (matSortChange)=\"sortColumn($event)\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let i = index\"> {{ i+1 }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> Log # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_type\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Model Type </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog.object_type }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"object_id\">\n <th mat-header-cell *matHeaderCellDef> Model # </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.object_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Action </th>\n <td mat-cell *matCellDef=\"let auditLog;\"> {{ auditLog?.action }} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"created_at\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created At </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n {{auditLog?.created_at | date:'medium'}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"user.email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header> Created By </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <p class=\"mb-0\">{{auditLog?.user?.name}}</p>\n <small class=\"text-secondary\">{{ auditLog?.user?.email }}</small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"changes\">\n <th mat-header-cell *matHeaderCellDef> Changes</th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"px-3\" [innerHtml]=\"sanitizer.bypassSecurityTrustHtml(getTransformedChanges(auditLog))\">\n </div>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let auditLog\">\n <div class=\"text-secondary\">\n <app-techlify-icon role=\"button\" name=\"view\" class=\"clickable\"\n (click)=\"logClicked(auditLog);$event.stopPropagation();\" matTooltip=\"View\"></app-techlify-icon>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky:true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: ["tr.row-hover:hover{background-color:#dcdcdc}.scroll-container{height:800px;overflow-y:auto}:host ::ng-deep #old-value{margin-right:5px;background-color:#f08080}:host ::ng-deep #new-value{background-color:#98fb98}\n"] }]
4752
+ }], ctorParameters: () => [{ type: i1$2.Router }, { type: i1$6.DomSanitizer }, { type: i1$5.FormBuilder }, { type: AuditLogService }, { type: i2$1.DatePipe }], propDecorators: { objectId: [{
4798
4753
  type: Input
4799
4754
  }], objectType: [{
4800
4755
  type: Input
@@ -4808,12 +4763,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4808
4763
  type: Input
4809
4764
  }], scrollContainer: [{
4810
4765
  type: Input
4811
- }], sort: [{
4812
- type: ViewChild,
4813
- args: [MatSort, { static: true }]
4814
4766
  }] } });
4815
4767
 
4816
- class UserClientService extends TechlifyServiceBaseClass {
4768
+ class UserClientService extends TechlifyService {
4817
4769
  constructor(httpService) {
4818
4770
  super(httpService, 'user-clients');
4819
4771
  }
@@ -4879,7 +4831,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4879
4831
  type: Output
4880
4832
  }] } });
4881
4833
 
4882
- class UserClientsListComponent extends TechlifyListingControllerInterface {
4834
+ class UserClientsListComponent extends TechlifyListComponent {
4883
4835
  constructor(service) {
4884
4836
  super();
4885
4837
  this.service = service;
@@ -4920,7 +4872,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4920
4872
  type: Input
4921
4873
  }] } });
4922
4874
 
4923
- class UserSessionService extends TechlifyServiceBaseClass {
4875
+ class UserSessionService extends TechlifyService {
4924
4876
  constructor(httpService) {
4925
4877
  super(httpService, 'user-sessions');
4926
4878
  }
@@ -4934,7 +4886,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4934
4886
  }]
4935
4887
  }], ctorParameters: () => [{ type: HttpService }] });
4936
4888
 
4937
- class UserSessionsComponent extends TechlifyListingControllerInterface {
4889
+ class UserSessionsComponent extends TechlifyListComponent {
4938
4890
  constructor(service) {
4939
4891
  super();
4940
4892
  this.service = service;
@@ -5653,7 +5605,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
5653
5605
  type: Output
5654
5606
  }] } });
5655
5607
 
5656
- class NoteListComponent extends TechlifyListingControllerInterface {
5608
+ class NoteListComponent extends TechlifyListComponent {
5657
5609
  constructor(noteService, dialog, alertService) {
5658
5610
  super();
5659
5611
  this.noteService = noteService;
@@ -6445,7 +6397,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6445
6397
  }]
6446
6398
  }] });
6447
6399
 
6448
- class TechlifyNotificationTypeService extends TechlifyServiceBaseClass {
6400
+ class TechlifyNotificationTypeService extends TechlifyService {
6449
6401
  constructor(http) {
6450
6402
  super(http, 'tn-notification-types');
6451
6403
  }
@@ -6459,7 +6411,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6459
6411
  }]
6460
6412
  }], ctorParameters: () => [{ type: HttpService }] });
6461
6413
 
6462
- class TechlifyNotificationSubscriptionService extends TechlifyServiceBaseClass {
6414
+ class TechlifyNotificationSubscriptionService extends TechlifyService {
6463
6415
  constructor(http) {
6464
6416
  super(http, 'tn-notification-subscriptions');
6465
6417
  }
@@ -6473,7 +6425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6473
6425
  }]
6474
6426
  }], ctorParameters: () => [{ type: HttpService }] });
6475
6427
 
6476
- class TechlifyNotificationForUserComponent extends TechlifyListingControllerInterface {
6428
+ class TechlifyNotificationForUserComponent extends TechlifyListComponent {
6477
6429
  constructor(techlifyNotificationTypeService, techlifyNotificationSubscriptionService) {
6478
6430
  super();
6479
6431
  this.techlifyNotificationTypeService = techlifyNotificationTypeService;
@@ -9613,7 +9565,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9613
9565
  }]
9614
9566
  }] });
9615
9567
 
9616
- class TechlifyFeatureService extends TechlifyServiceBaseClass {
9568
+ class TechlifyFeatureService extends TechlifyService {
9617
9569
  constructor(http) {
9618
9570
  super(http, 'features');
9619
9571
  this.features = [];
@@ -9949,7 +9901,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9949
9901
  }]
9950
9902
  }], ctorParameters: () => [] });
9951
9903
 
9952
- class AccessControlConfigService extends TechlifyServiceBaseClass {
9904
+ class AccessControlConfigService extends TechlifyService {
9953
9905
  constructor(http) {
9954
9906
  super(http, 'access-control-configs');
9955
9907
  this.http = http;
@@ -10253,7 +10205,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10253
10205
  }]
10254
10206
  }] });
10255
10207
 
10256
- let LoginFormFieldsComponent = class LoginFormFieldsComponent extends TechlifyFormComponentInterface {
10208
+ let LoginFormFieldsComponent = class LoginFormFieldsComponent extends TechlifyFormComponent {
10257
10209
  constructor(fb, formValidatorService, config, credentialService, currentUserService, authService, router, route, userConfigService, errorHandler, ngxPermissionsService) {
10258
10210
  super(formValidatorService);
10259
10211
  this.fb = fb;
@@ -11450,7 +11402,7 @@ var roleView_module = /*#__PURE__*/Object.freeze({
11450
11402
  RoleViewModule: RoleViewModule
11451
11403
  });
11452
11404
 
11453
- class AdminRoleService extends TechlifyServiceBaseClass {
11405
+ class AdminRoleService extends TechlifyService {
11454
11406
  constructor(httpService) {
11455
11407
  super(httpService, 'roles');
11456
11408
  }
@@ -11470,7 +11422,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11470
11422
  }]
11471
11423
  }], ctorParameters: () => [{ type: HttpService }] });
11472
11424
 
11473
- class AdminRolePermissionFormComponent extends TechlifyFormComponentInterface {
11425
+ class AdminRolePermissionFormComponent extends TechlifyFormComponent {
11474
11426
  get roleInfo() {
11475
11427
  return this._roleInfo;
11476
11428
  }
@@ -11541,7 +11493,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11541
11493
  type: Input
11542
11494
  }] } });
11543
11495
 
11544
- let AdminRoleListComponent = class AdminRoleListComponent extends TechlifyListingControllerInterface {
11496
+ let AdminRoleListComponent = class AdminRoleListComponent extends TechlifyListComponent {
11545
11497
  constructor(roleService, filterService, activatedRoute, fb, dialog, spinnerService) {
11546
11498
  super();
11547
11499
  this.roleService = roleService;
@@ -11860,10 +11812,12 @@ class UserEnableButtonModule {
11860
11812
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
11861
11813
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonModule, declarations: [UserEnableButtonComponent], imports: [CommonModule,
11862
11814
  MaterialModule,
11863
- FlexLayoutModule], exports: [UserEnableButtonComponent] }); }
11815
+ FlexLayoutModule,
11816
+ TechlifyIconModule], exports: [UserEnableButtonComponent] }); }
11864
11817
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonModule, imports: [CommonModule,
11865
11818
  MaterialModule,
11866
- FlexLayoutModule] }); }
11819
+ FlexLayoutModule,
11820
+ TechlifyIconModule] }); }
11867
11821
  }
11868
11822
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEnableButtonModule, decorators: [{
11869
11823
  type: NgModule,
@@ -11873,6 +11827,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11873
11827
  CommonModule,
11874
11828
  MaterialModule,
11875
11829
  FlexLayoutModule,
11830
+ TechlifyIconModule
11876
11831
  ],
11877
11832
  exports: [UserEnableButtonComponent]
11878
11833
  }]
@@ -12339,7 +12294,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
12339
12294
  }]
12340
12295
  }] });
12341
12296
 
12342
- class RestrictorService extends TechlifyServiceBaseClass {
12297
+ class RestrictorService extends TechlifyService {
12343
12298
  constructor(httpService) {
12344
12299
  super(httpService, 'restrictors');
12345
12300
  this.httpService = httpService;
@@ -12354,7 +12309,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
12354
12309
  }]
12355
12310
  }], ctorParameters: () => [{ type: HttpService }] });
12356
12311
 
12357
- class RestrictorTypeService extends TechlifyServiceBaseClass {
12312
+ class RestrictorTypeService extends TechlifyService {
12358
12313
  constructor(httpService) {
12359
12314
  super(httpService, 'restrictor-types');
12360
12315
  this.httpService = httpService;
@@ -12453,7 +12408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
12453
12408
  type: Input
12454
12409
  }] } });
12455
12410
 
12456
- class RestrictorLevelService extends TechlifyServiceBaseClass {
12411
+ class RestrictorLevelService extends TechlifyService {
12457
12412
  constructor(httpService) {
12458
12413
  super(httpService, 'restrictor-levels');
12459
12414
  this.httpService = httpService;
@@ -12552,7 +12507,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
12552
12507
  type: Input
12553
12508
  }] } });
12554
12509
 
12555
- class RestrictorStatusService extends TechlifyServiceBaseClass {
12510
+ class RestrictorStatusService extends TechlifyService {
12556
12511
  constructor(httpService) {
12557
12512
  super(httpService, 'restrictor-statuses');
12558
12513
  this.httpService = httpService;
@@ -13707,7 +13662,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13707
13662
  }]
13708
13663
  }] });
13709
13664
 
13710
- class ResetPasswordService extends TechlifyServiceBaseClass {
13665
+ class ResetPasswordService extends TechlifyService {
13711
13666
  constructor(http) {
13712
13667
  super(http, 'my-user/reset-password');
13713
13668
  this.http = http;
@@ -13728,7 +13683,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13728
13683
  }]
13729
13684
  }], ctorParameters: () => [{ type: HttpService }] });
13730
13685
 
13731
- class ResetPasswordComponent extends TechlifyFormComponentInterface {
13686
+ class ResetPasswordComponent extends TechlifyFormComponent {
13732
13687
  constructor(resetPasswordService, router, currentUserService, fb, formValidatorService, userConfigService, activatedRoute) {
13733
13688
  super(formValidatorService);
13734
13689
  this.resetPasswordService = resetPasswordService;
@@ -13917,7 +13872,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13917
13872
  type: Output
13918
13873
  }] } });
13919
13874
 
13920
- class ClientService extends TechlifyServiceBaseClass {
13875
+ class ClientService extends TechlifyService {
13921
13876
  constructor(httpService) {
13922
13877
  super(httpService, 'clients');
13923
13878
  this.httpService = httpService;
@@ -13932,7 +13887,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13932
13887
  }]
13933
13888
  }], ctorParameters: () => [{ type: HttpService }] });
13934
13889
 
13935
- class CompanyInformationComponent extends TechlifyFormComponentInterface {
13890
+ class CompanyInformationComponent extends TechlifyFormComponent {
13936
13891
  constructor(formValidatorService, formBuilder, currentUserService, clientService, location) {
13937
13892
  super(formValidatorService);
13938
13893
  this.formBuilder = formBuilder;
@@ -14105,7 +14060,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
14105
14060
  type: Input
14106
14061
  }] } });
14107
14062
 
14108
- class TenantListWidgetComponent extends TechlifyListingControllerInterface {
14063
+ class TenantListWidgetComponent extends TechlifyListComponent {
14109
14064
  constructor(service) {
14110
14065
  super();
14111
14066
  this.service = service;
@@ -14374,6 +14329,7 @@ var appAdminUserView_module = /*#__PURE__*/Object.freeze({
14374
14329
 
14375
14330
  class PdfButtonComponent {
14376
14331
  constructor() {
14332
+ this.isUsePrintIcon = false;
14377
14333
  this.isLoading = new EventEmitter();
14378
14334
  }
14379
14335
  ngOnInit() { }
@@ -14390,12 +14346,14 @@ class PdfButtonComponent {
14390
14346
  };
14391
14347
  }
14392
14348
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14393
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: PdfButtonComponent, selector: "pdf-button", outputs: { isLoading: "isLoading" }, ngImport: i0, template: "<app-techlify-icon name=\"pdf\" class=\"clickable d-print-none\" (click)=\"print()\" matTooltip=\"PDF Export\">\n</app-techlify-icon>", styles: [":host{display:flex;align-content:center}\n"], dependencies: [{ kind: "component", type: TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
14349
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: PdfButtonComponent, selector: "pdf-button", inputs: { isUsePrintIcon: "isUsePrintIcon" }, outputs: { isLoading: "isLoading" }, ngImport: i0, template: "<app-techlify-icon *ngIf=\"!isUsePrintIcon\" name=\"pdf\" class=\"clickable d-print-none\" (click)=\"print()\"\n matTooltip=\"PDF Export\">\n</app-techlify-icon>\n\n<app-techlify-icon *ngIf=\"isUsePrintIcon\" name=\"print\" class=\"clickable d-print-none\" (click)=\"print()\"\n matTooltip=\"Print\">\n</app-techlify-icon>", styles: [":host{display:flex;align-content:center}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "directive", type: i11$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
14394
14350
  }
14395
14351
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfButtonComponent, decorators: [{
14396
14352
  type: Component,
14397
- args: [{ selector: 'pdf-button', template: "<app-techlify-icon name=\"pdf\" class=\"clickable d-print-none\" (click)=\"print()\" matTooltip=\"PDF Export\">\n</app-techlify-icon>", styles: [":host{display:flex;align-content:center}\n"] }]
14398
- }], ctorParameters: () => [], propDecorators: { isLoading: [{
14353
+ args: [{ selector: 'pdf-button', template: "<app-techlify-icon *ngIf=\"!isUsePrintIcon\" name=\"pdf\" class=\"clickable d-print-none\" (click)=\"print()\"\n matTooltip=\"PDF Export\">\n</app-techlify-icon>\n\n<app-techlify-icon *ngIf=\"isUsePrintIcon\" name=\"print\" class=\"clickable d-print-none\" (click)=\"print()\"\n matTooltip=\"Print\">\n</app-techlify-icon>", styles: [":host{display:flex;align-content:center}\n"] }]
14354
+ }], ctorParameters: () => [], propDecorators: { isUsePrintIcon: [{
14355
+ type: Input
14356
+ }], isLoading: [{
14399
14357
  type: Output
14400
14358
  }] } });
14401
14359
 
@@ -14515,7 +14473,7 @@ var SubscriptionStatus;
14515
14473
  SubscriptionStatus[SubscriptionStatus["INACTIVE"] = 2] = "INACTIVE";
14516
14474
  })(SubscriptionStatus || (SubscriptionStatus = {}));
14517
14475
 
14518
- class SubscriptionService extends TechlifyServiceBaseClass {
14476
+ class SubscriptionService extends TechlifyService {
14519
14477
  constructor(http) {
14520
14478
  super(http, 'tenant-subscriptions');
14521
14479
  this.subscriptions = [];
@@ -14550,7 +14508,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
14550
14508
  }]
14551
14509
  }], ctorParameters: () => [{ type: HttpService }] });
14552
14510
 
14553
- class SubscriptionFormComponent extends TechlifyFormComponentInterface {
14511
+ class SubscriptionFormComponent extends TechlifyFormComponent {
14554
14512
  get tenantSubscriptionInfo() {
14555
14513
  return this._tenantSubscriptionInfo;
14556
14514
  }
@@ -14710,7 +14668,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
14710
14668
  }]
14711
14669
  }] });
14712
14670
 
14713
- let SubscriptionListingComponent = class SubscriptionListingComponent extends TechlifyListingControllerInterface {
14671
+ let SubscriptionListingComponent = class SubscriptionListingComponent extends TechlifyListComponent {
14714
14672
  get isFilterPatchFromRoute() {
14715
14673
  return !this.subscriptionPackage?.id;
14716
14674
  }
@@ -14876,7 +14834,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
14876
14834
  }]
14877
14835
  }] });
14878
14836
 
14879
- class SubscriptionPackageService extends TechlifyServiceBaseClass {
14837
+ class SubscriptionPackageService extends TechlifyService {
14880
14838
  constructor(http) {
14881
14839
  super(http, 'subscription-packages');
14882
14840
  }
@@ -14893,7 +14851,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
14893
14851
  }]
14894
14852
  }], ctorParameters: () => [{ type: HttpService }] });
14895
14853
 
14896
- let SubscriptionPackageListingComponent = class SubscriptionPackageListingComponent extends TechlifyListingControllerInterface {
14854
+ let SubscriptionPackageListingComponent = class SubscriptionPackageListingComponent extends TechlifyListComponent {
14897
14855
  constructor(subscriptionPackageService, activatedRoute, filterService, router, dialog, fb) {
14898
14856
  super();
14899
14857
  this.subscriptionPackageService = subscriptionPackageService;
@@ -15182,7 +15140,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15182
15140
  }]
15183
15141
  }] });
15184
15142
 
15185
- class TimelineActivityService extends TechlifyServiceBaseClass {
15143
+ class TimelineActivityService extends TechlifyService {
15186
15144
  constructor(httpService) {
15187
15145
  super(httpService, 'techlify-timeline-activities');
15188
15146
  }
@@ -15196,7 +15154,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15196
15154
  }]
15197
15155
  }], ctorParameters: () => [{ type: HttpService }] });
15198
15156
 
15199
- class TimelineActivityListComponent extends TechlifyListingControllerInterface {
15157
+ class TimelineActivityListComponent extends TechlifyListComponent {
15200
15158
  constructor(timelineActivityService, datePipe) {
15201
15159
  super();
15202
15160
  this.timelineActivityService = timelineActivityService;
@@ -15423,7 +15381,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15423
15381
  ], template: "<app-techlify-icon role=\"button\" [name]=\"model() ? 'edit' : 'add'\" (click)=\"open()\"></app-techlify-icon>\r\n" }]
15424
15382
  }], ctorParameters: () => [{ type: i1.MatDialog }] });
15425
15383
 
15426
- class FormConfigurationFormService extends TechlifyServiceBaseClass {
15384
+ class FormConfigurationFormService extends TechlifyService {
15427
15385
  constructor(http) {
15428
15386
  super(http, 'form-configuration-forms');
15429
15387
  }
@@ -15437,7 +15395,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15437
15395
  }]
15438
15396
  }], ctorParameters: () => [{ type: HttpService }] });
15439
15397
 
15440
- class FormConfigurationFormFieldService extends TechlifyServiceBaseClass {
15398
+ class FormConfigurationFormFieldService extends TechlifyService {
15441
15399
  constructor(http) {
15442
15400
  super(http, 'form-configuration-form-fields');
15443
15401
  }
@@ -15610,7 +15568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15610
15568
  }]
15611
15569
  }] });
15612
15570
 
15613
- class MyTechlifyViewService extends TechlifyServiceBaseClass {
15571
+ class MyTechlifyViewService extends TechlifyService {
15614
15572
  constructor(http) {
15615
15573
  super(http, 'my-techlify-views');
15616
15574
  }
@@ -15624,7 +15582,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15624
15582
  }]
15625
15583
  }], ctorParameters: () => [{ type: HttpService }] });
15626
15584
 
15627
- class TechlifyViewService extends TechlifyServiceBaseClass {
15585
+ class TechlifyViewService extends TechlifyService {
15628
15586
  constructor(http) {
15629
15587
  super(http, 'techlify-views');
15630
15588
  }
@@ -15638,7 +15596,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15638
15596
  }]
15639
15597
  }], ctorParameters: () => [{ type: HttpService }] });
15640
15598
 
15641
- class TechlifyViewFormComponent extends TechlifyFormComponentInterface {
15599
+ class TechlifyViewFormComponent extends TechlifyFormComponent {
15642
15600
  get viewInfo() {
15643
15601
  return this._viewInfo;
15644
15602
  }
@@ -15717,7 +15675,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15717
15675
  type: Input
15718
15676
  }] } });
15719
15677
 
15720
- class MyTechlifyViewListingComponent extends TechlifyListingControllerInterface {
15678
+ class MyTechlifyViewListingComponent extends TechlifyListComponent {
15721
15679
  //Used to expose public observable API in case of custom event implementation
15722
15680
  get viewChangedObservable() {
15723
15681
  return this.viewChanged;
@@ -15859,5 +15817,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15859
15817
  * Generated bundle index. Do not edit.
15860
15818
  */
15861
15819
 
15862
- export { AccessControlConfigModule, ActionPopup, ActionPopupComponent, ActionPopupModule, AdminRoleListComponent, AdminRoleListModule, AdminRolePermissionFormComponent, AdminRolePermissionFormModule, AdminRoleService, AlertService, ApiPrefixInterceptor, AppAdminHomeComponent, AppAdminModule, AppAdminUserViewComponent, AppAdminUserViewModule, AuditLogForModelComponent, AuditLogForModelModule, AuditLogForModelRoutingModule, AuditLogListComponent, AuditLogListFilterComponent, AuditLogListFilterModule, AuditLogListFilterRoutingModule, AuditLogListModule, AuditLogListRoutingModule, AuditLogModule, AuditLogRoutingModule, AuditLogViewComponent, AuditLogViewModelComponent, AuditLogViewModelModule, AuditLogViewModelRoutingModule, AuditLogViewModule, AuditLogViewRoutingModule, AuditLogsViewModelComponent, AuditLogsViewModelModule, AuditLogsViewModelRoutingModule, AuthenticationGuard, AuthenticationService, CacheInterceptor, ChangePasswordModule, ClientService, ColumnConfig, ColumnSelectorComponent, ColumnSelectorModule, CommentFormComponent, CompanyInfoDisplayComponent, CompanyInformationComponent, ConfigService, CoreModule, CredentialsService, CurrentUserService, CustomIconComponent, CustomIconModule, DEFAULT_SELECTED_VALUE, DataManager, DataTable, DataTableComponent, DataTableModule, DateUtils, DateValidator, DocumentViewerComponent, DocumentViewerModule, EmailSubscriptionForUserComponent, EmailSubscriptionForUserModule, EmailSubscriptionForUserRoutingModule, EmailSubscriptionModule, EmailSubscriptionRoutingModule, EmailSubscriptionTypeFormComponent, EmailSubscriptionTypeFormModule, EmailSubscriptionTypeFormRoutingModule, EmailSubscriptionTypeListComponent, EmailSubscriptionTypeListModule, EmailSubscriptionTypeListRoutingModule, EmailSubscriptionTypeModule, EmailSubscriptionTypeRoutingModule, EmailSubscriptionUserFormComponent, EmailSubscriptionUserFormModule, EmailSubscriptionUserFormRoutingModule, EmailSubscriptionUserListComponent, EmailSubscriptionUserListFilterComponent, EmailSubscriptionUserListFilterModule, EmailSubscriptionUserListFilterRoutingModule, EmailSubscriptionUserListModule, EmailSubscriptionUserListRoutingModule, EmailSubscriptionUserModule, EmailSubscriptionUserRoutingModule, EntityFileFormComponent, EntityFileService, EntityFilesViewAllComponent, EntityFilesViewAllModule, EnvironmentService, ErrorHandlerInterceptor, ErrorHandlerService, ErrorSnackComponent, ExportExcelButtonComponent, ExportExcelModule, FileDragdropUploaderComponent, FileDragdropUploaderModule, FileDropperComponent, FileDropperConfig, FileDropperModule, FilterService, ForgotPasswordComponent, ForgotPasswordModule, ForgotPasswordRoutingModule, FormConfigurationFieldFormComponent, FormConfigurationFieldFormModule, FormConfigurationFieldFormRoutingModule, FormConfigurationForFormComponent, FormConfigurationForFormModule, FormConfigurationFormFieldService, FormConfigurationFormService, FormConfigurationUtilityService, FormValidatorService, HTTP_DYNAMIC_INTERCEPTORS, HttpCacheService, HttpService, ImportCsvComponent, ImportCsvModule, LoaderComponent, LoaderModule, LogLevel, Logger, LoginComponent, LoginFormFieldsComponent, LoginHistoryForUserComponent, LoginHistoryForUserModule, LoginHistoryForUserRoutingModule, LoginModule, LoginRoutingModule, MaterialModule, MultiUserConfig, MyTechlifyViewListingComponent, MyTechlifyViewListingModule, MyTechlifyViewService, NgxTechlifyUsersModule, NoteFormComponent, NoteListComponent, NoteModule, NumItemsSelector, NumberInputButtonComponent, NumberInputButtonModule, NumberSelector, PageEvent, PdfButtonComponent, PdfButtonModule, Permission, PermissionModule, PermissionRoutingProvider, PermissionsManagementComponent, ProfileEditComponent, ProfileModule, ProfileRoutingModule, ReadMoreComponent, ReadMoreModule, RequestHelperService, ResetPasswordComponent, ResetPasswordModule, ResetPasswordRoutingModule, ResetPasswordService, RestrictorTypeSelectorComponent, RestrictorTypeSelectorModule, RestrictorsModule, Role, RoleFormButtonComponent, RoleFormComponent, RoleModule, RoleRoutingProvider, RoleService, RoleViewComponent, RoleViewModule, RolesViewAllComponent, RouteReusableStrategy, SearchableSelectorComponent, SearchableSelectorModule, SignUpComponent, SignupModule, SignupRoutingModule, SnackModule, StorageService, SubscriptionFormComponent, SubscriptionFormModule, SubscriptionListingComponent, SubscriptionListingModule, SubscriptionPackageListingComponent, SubscriptionPackageListingModule, SubscriptionPackageViewComponent, SubscriptionPackageViewModule, SubscriptionService, SuccessSnackComponent, TechlifyAppSelectorComponent, TechlifyAppSelectorModule, TechlifyCompanySwitcherComponent, TechlifyCompanySwitcherModule, TechlifyConfig, TechlifyDeleteButtonComponent, TechlifyFeatureDirectiveModule, TechlifyFeatureEnabledDirective, TechlifyFeatureListingComponent, TechlifyFeatureModule, TechlifyFeatureRoutes, TechlifyFeatureService, TechlifyFormButtonComponent, TechlifyFormComponentInterface, TechlifyIconComponent, TechlifyIconModule, TechlifyListingControllerInterface, TechlifyNotificationForUserComponent, TechlifyNotificationForUserModule, TechlifyNotificationForUserRoutingModule, TechlifyNotificationModule, TechlifyNotificationRoutingModule, TechlifyServiceBaseClass, TechlifySubscriptionDirective, TechlifySubscriptionDirectiveModule, TechlifyTaggerTagFormConfigModel, TechlifyTaggerTagFormFieldComponent, TechlifyTaggerTagFormFieldModule, TechlifyTaggerTagSelectorComponent, TechlifyTaggerTagSelectorModule, TechlifyUpdateHistoryModule, TechlifyUpdateModule, TechlifyUpdateService, TechlifyUpdatesTeaserComponent, TechlifyUpdatesTeaserModule, TechlifyViewFormComponent, TechlifyViewFormModule, TechlifyViewService, TenantFormButtonComponent, TenantListWidgetComponent, Timeline, TimelineActivityButtonComponent, TimelineActivityButtonModule, TimelineActivityListComponent, TimelineActivityListModule, TimelineFilterComponent, TimelineFilterModule, TokenInterceptor, UpdateNotifierComponent, UpdateNotifierModule, User, UserClientEnableDisableButtonComponent, UserClientEnableDisableButtonModule, UserClientsListComponent, UserClientsListModule, UserConfig, UserConfigService, UserDataService, UserEnableButtonComponent, UserEnableButtonModule, UserExploreComponent, UserFormComponent, UserListPageConfig, UserMenuComponent, UserMenuModule, UserModule, UserRoutingProvider, UserSelectorComponent, UserSelectorModule, UserService, UserSessionsComponent, UserSessionsModule, UserViewComponent, UsersViewAllComponent, UtilityModule, ViewerConfig, WrapPipe, calculateTimeline, esfur, estlr, esulr, parseLocalDate };
15820
+ export { AccessControlConfigModule, ActionPopup, ActionPopupComponent, ActionPopupModule, AdminRoleListComponent, AdminRoleListModule, AdminRolePermissionFormComponent, AdminRolePermissionFormModule, AdminRoleService, AlertService, ApiPrefixInterceptor, AppAdminHomeComponent, AppAdminModule, AppAdminUserViewComponent, AppAdminUserViewModule, AuditLogForModelComponent, AuditLogForModelModule, AuditLogForModelRoutingModule, AuditLogListComponent, AuditLogListFilterComponent, AuditLogListFilterModule, AuditLogListFilterRoutingModule, AuditLogListModule, AuditLogListRoutingModule, AuditLogModule, AuditLogRoutingModule, AuditLogViewComponent, AuditLogViewModelComponent, AuditLogViewModelModule, AuditLogViewModelRoutingModule, AuditLogViewModule, AuditLogViewRoutingModule, AuditLogsViewModelComponent, AuditLogsViewModelModule, AuditLogsViewModelRoutingModule, AuthenticationGuard, AuthenticationService, CacheInterceptor, ChangePasswordModule, ClientService, ColumnConfig, ColumnSelectorComponent, ColumnSelectorModule, CommentFormComponent, CompanyInfoDisplayComponent, CompanyInformationComponent, ConfigService, CoreModule, CredentialsService, CurrentUserService, CustomIconComponent, CustomIconModule, DEFAULT_SELECTED_VALUE, DataManager, DataTable, DataTableComponent, DataTableModule, DateUtils, DateValidator, DocumentViewerComponent, DocumentViewerModule, EmailSubscriptionForUserComponent, EmailSubscriptionForUserModule, EmailSubscriptionForUserRoutingModule, EmailSubscriptionModule, EmailSubscriptionRoutingModule, EmailSubscriptionTypeFormComponent, EmailSubscriptionTypeFormModule, EmailSubscriptionTypeFormRoutingModule, EmailSubscriptionTypeListComponent, EmailSubscriptionTypeListModule, EmailSubscriptionTypeListRoutingModule, EmailSubscriptionTypeModule, EmailSubscriptionTypeRoutingModule, EmailSubscriptionUserFormComponent, EmailSubscriptionUserFormModule, EmailSubscriptionUserFormRoutingModule, EmailSubscriptionUserListComponent, EmailSubscriptionUserListFilterComponent, EmailSubscriptionUserListFilterModule, EmailSubscriptionUserListFilterRoutingModule, EmailSubscriptionUserListModule, EmailSubscriptionUserListRoutingModule, EmailSubscriptionUserModule, EmailSubscriptionUserRoutingModule, EntityFileFormComponent, EntityFileService, EntityFilesViewAllComponent, EntityFilesViewAllModule, EnvironmentService, ErrorHandlerInterceptor, ErrorHandlerService, ErrorSnackComponent, ExportExcelButtonComponent, ExportExcelModule, FileDragdropUploaderComponent, FileDragdropUploaderModule, FileDropperComponent, FileDropperConfig, FileDropperModule, FilterService, ForgotPasswordComponent, ForgotPasswordModule, ForgotPasswordRoutingModule, FormConfigurationFieldFormComponent, FormConfigurationFieldFormModule, FormConfigurationFieldFormRoutingModule, FormConfigurationForFormComponent, FormConfigurationForFormModule, FormConfigurationFormFieldService, FormConfigurationFormService, FormConfigurationUtilityService, FormValidatorService, HTTP_DYNAMIC_INTERCEPTORS, HttpCacheService, HttpService, ImportCsvComponent, ImportCsvModule, LoaderComponent, LoaderModule, LogLevel, Logger, LoginComponent, LoginFormFieldsComponent, LoginHistoryForUserComponent, LoginHistoryForUserModule, LoginHistoryForUserRoutingModule, LoginModule, LoginRoutingModule, MaterialModule, MultiUserConfig, MyTechlifyViewListingComponent, MyTechlifyViewListingModule, MyTechlifyViewService, NgxTechlifyUsersModule, NoteFormComponent, NoteListComponent, NoteModule, NumItemsSelector, NumberInputButtonComponent, NumberInputButtonModule, NumberSelector, PageEvent, PdfButtonComponent, PdfButtonModule, Permission, PermissionModule, PermissionRoutingProvider, PermissionsManagementComponent, ProfileEditComponent, ProfileModule, ProfileRoutingModule, ReadMoreComponent, ReadMoreModule, RequestHelperService, ResetPasswordComponent, ResetPasswordModule, ResetPasswordRoutingModule, ResetPasswordService, RestrictorTypeSelectorComponent, RestrictorTypeSelectorModule, RestrictorsModule, Role, RoleFormButtonComponent, RoleFormComponent, RoleModule, RoleRoutingProvider, RoleService, RoleViewComponent, RoleViewModule, RolesViewAllComponent, RouteReusableStrategy, SearchableSelectorComponent, SearchableSelectorModule, SignUpComponent, SignupModule, SignupRoutingModule, SnackModule, StorageService, SubscriptionFormComponent, SubscriptionFormModule, SubscriptionListingComponent, SubscriptionListingModule, SubscriptionPackageListingComponent, SubscriptionPackageListingModule, SubscriptionPackageViewComponent, SubscriptionPackageViewModule, SubscriptionService, SuccessSnackComponent, TechlifyAppSelectorComponent, TechlifyAppSelectorModule, TechlifyCompanySwitcherComponent, TechlifyCompanySwitcherModule, TechlifyConfig, TechlifyDeleteButtonComponent, TechlifyFeatureDirectiveModule, TechlifyFeatureEnabledDirective, TechlifyFeatureListingComponent, TechlifyFeatureModule, TechlifyFeatureRoutes, TechlifyFeatureService, TechlifyFormButtonComponent, TechlifyFormComponent, TechlifyIconComponent, TechlifyIconModule, TechlifyListComponent, TechlifyNotificationForUserComponent, TechlifyNotificationForUserModule, TechlifyNotificationForUserRoutingModule, TechlifyNotificationModule, TechlifyNotificationRoutingModule, TechlifyService, TechlifySubscriptionDirective, TechlifySubscriptionDirectiveModule, TechlifyTaggerTagFormConfigModel, TechlifyTaggerTagFormFieldComponent, TechlifyTaggerTagFormFieldModule, TechlifyTaggerTagSelectorComponent, TechlifyTaggerTagSelectorModule, TechlifyUpdateHistoryModule, TechlifyUpdateModule, TechlifyUpdateService, TechlifyUpdatesTeaserComponent, TechlifyUpdatesTeaserModule, TechlifyViewFormComponent, TechlifyViewFormModule, TechlifyViewService, TenantFormButtonComponent, TenantListWidgetComponent, Timeline, TimelineActivityButtonComponent, TimelineActivityButtonModule, TimelineActivityListComponent, TimelineActivityListModule, TimelineFilterComponent, TimelineFilterModule, TokenInterceptor, UpdateNotifierComponent, UpdateNotifierModule, User, UserClientEnableDisableButtonComponent, UserClientEnableDisableButtonModule, UserClientsListComponent, UserClientsListModule, UserConfig, UserConfigService, UserDataService, UserEnableButtonComponent, UserEnableButtonModule, UserExploreComponent, UserFormComponent, UserListPageConfig, UserMenuComponent, UserMenuModule, UserModule, UserRoutingProvider, UserSelectorComponent, UserSelectorModule, UserService, UserSessionsComponent, UserSessionsModule, UserViewComponent, UsersViewAllComponent, UtilityModule, ViewerConfig, WrapPipe, calculateTimeline, esfur, estlr, esulr, parseLocalDate };
15863
15821
  //# sourceMappingURL=ngx-techlify-core.mjs.map