verben-authentication-ui 1.1.0 → 1.1.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 (159) hide show
  1. package/README.md +23 -1
  2. package/esm2022/src/lib/base/core/base-data-page.facade.mjs +215 -0
  3. package/esm2022/src/lib/base/core/base-data-page.service.mjs +103 -0
  4. package/esm2022/src/lib/base/core/base-data-page.state.mjs +203 -0
  5. package/esm2022/src/lib/base/handlers/filter-handler.service.mjs +53 -0
  6. package/esm2022/src/lib/base/handlers/search-handler.service.mjs +31 -0
  7. package/esm2022/src/lib/base/handlers/sort-handler.service.mjs +49 -0
  8. package/esm2022/src/lib/base/models/api-payload.mjs +4 -0
  9. package/esm2022/src/lib/base/models/page-config.interface.mjs +2 -0
  10. package/esm2022/src/lib/base/public-api.mjs +14 -6
  11. package/esm2022/src/lib/base/utils/column-helpers.mjs +45 -0
  12. package/esm2022/src/lib/components/button/button.component.mjs +3 -3
  13. package/esm2022/src/lib/components/forgot-password/forgot-password.component.mjs +2 -2
  14. package/esm2022/src/lib/components/mail/mail.component.mjs +3 -3
  15. package/esm2022/src/lib/components/mail-validation/mail-validation.component.mjs +5 -5
  16. package/esm2022/src/lib/components/o-auth/o-auth.component.mjs +3 -3
  17. package/esm2022/src/lib/components/otp-input/otp-input.component.mjs +2 -2
  18. package/esm2022/src/lib/components/reset-password/reset-password.component.mjs +2 -2
  19. package/esm2022/src/lib/components/role-control/base-table-style.mjs +6 -6
  20. package/esm2022/src/lib/components/role-control/role-control.component.mjs +3 -3
  21. package/esm2022/src/lib/components/sign-in/sign-in.component.mjs +4 -4
  22. package/esm2022/src/lib/components/sign-up/sign-up.component.mjs +6 -6
  23. package/esm2022/src/lib/components/sso/base-table-style.mjs +6 -6
  24. package/esm2022/src/lib/components/sso/sso-form/sso-form.component.mjs +3 -3
  25. package/esm2022/src/lib/components/sso/sso.component.mjs +3 -3
  26. package/esm2022/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.mjs +4 -4
  27. package/esm2022/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.mjs +5 -5
  28. package/esm2022/src/lib/components/user-management/public-api.mjs +2 -1
  29. package/esm2022/src/lib/components/user-management/user-management-card/user-management-card.component.mjs +23 -0
  30. package/esm2022/src/lib/components/user-management/user-management-form/user-management-form.component.mjs +53 -91
  31. package/esm2022/src/lib/components/user-management/user-management-table/user-management-table.component.mjs +68 -0
  32. package/esm2022/src/lib/components/user-management/user-management.component.mjs +98 -509
  33. package/esm2022/src/lib/components/user-management/user-management.module.mjs +11 -80
  34. package/esm2022/src/lib/components/user-management/user-status-badge/user-status-badge.component.mjs +8 -6
  35. package/esm2022/src/lib/components/user-management/user.config.mjs +94 -0
  36. package/esm2022/src/lib/components/user-management/user.facade.mjs +118 -0
  37. package/esm2022/src/lib/components/user-management/user.service.mjs +60 -0
  38. package/esm2022/src/lib/components/user-management/user.state.mjs +33 -0
  39. package/esm2022/src/lib/components/user-request/user-request.component.mjs +8 -8
  40. package/esm2022/src/lib/components/user-request-approval/public-api.mjs +2 -2
  41. package/esm2022/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.mjs +8 -6
  42. package/esm2022/src/lib/components/user-request-approval/user-access-request.config.mjs +79 -0
  43. package/esm2022/src/lib/components/user-request-approval/user-access-request.facade.mjs +123 -0
  44. package/esm2022/src/lib/components/user-request-approval/user-access-request.service.mjs +74 -0
  45. package/esm2022/src/lib/components/user-request-approval/user-access-request.state.mjs +26 -0
  46. package/esm2022/src/lib/components/user-request-approval/user-request-approval-card/user-request-approval-card.component.mjs +23 -0
  47. package/esm2022/src/lib/components/user-request-approval/user-request-approval-form/user-request-approval-form.component.mjs +124 -0
  48. package/esm2022/src/lib/components/user-request-approval/user-request-approval-table/user-request-approval-table.component.mjs +44 -0
  49. package/esm2022/src/lib/components/user-request-approval/user-request-approval.component.mjs +101 -273
  50. package/esm2022/src/lib/components/user-request-approval/user-request-approval.module.mjs +10 -74
  51. package/fesm2022/verben-authentication-ui-src-lib-base.mjs +596 -214
  52. package/fesm2022/verben-authentication-ui-src-lib-base.mjs.map +1 -1
  53. package/fesm2022/verben-authentication-ui-src-lib-components-button.mjs +2 -2
  54. package/fesm2022/verben-authentication-ui-src-lib-components-button.mjs.map +1 -1
  55. package/fesm2022/verben-authentication-ui-src-lib-components-forgot-password.mjs +2 -2
  56. package/fesm2022/verben-authentication-ui-src-lib-components-forgot-password.mjs.map +1 -1
  57. package/fesm2022/verben-authentication-ui-src-lib-components-mail-validation.mjs +4 -4
  58. package/fesm2022/verben-authentication-ui-src-lib-components-mail-validation.mjs.map +1 -1
  59. package/fesm2022/verben-authentication-ui-src-lib-components-mail.mjs +2 -2
  60. package/fesm2022/verben-authentication-ui-src-lib-components-mail.mjs.map +1 -1
  61. package/fesm2022/verben-authentication-ui-src-lib-components-o-auth.mjs +2 -2
  62. package/fesm2022/verben-authentication-ui-src-lib-components-o-auth.mjs.map +1 -1
  63. package/fesm2022/verben-authentication-ui-src-lib-components-otp-input.mjs +2 -2
  64. package/fesm2022/verben-authentication-ui-src-lib-components-otp-input.mjs.map +1 -1
  65. package/fesm2022/verben-authentication-ui-src-lib-components-reset-password.mjs +2 -2
  66. package/fesm2022/verben-authentication-ui-src-lib-components-reset-password.mjs.map +1 -1
  67. package/fesm2022/verben-authentication-ui-src-lib-components-role-control.mjs +7 -7
  68. package/fesm2022/verben-authentication-ui-src-lib-components-role-control.mjs.map +1 -1
  69. package/fesm2022/verben-authentication-ui-src-lib-components-sign-in.mjs +3 -3
  70. package/fesm2022/verben-authentication-ui-src-lib-components-sign-in.mjs.map +1 -1
  71. package/fesm2022/verben-authentication-ui-src-lib-components-sign-up.mjs +5 -5
  72. package/fesm2022/verben-authentication-ui-src-lib-components-sign-up.mjs.map +1 -1
  73. package/fesm2022/verben-authentication-ui-src-lib-components-sso.mjs +9 -9
  74. package/fesm2022/verben-authentication-ui-src-lib-components-sso.mjs.map +1 -1
  75. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-otp.mjs +3 -3
  76. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-otp.mjs.map +1 -1
  77. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-setup.mjs +4 -4
  78. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-setup.mjs.map +1 -1
  79. package/fesm2022/verben-authentication-ui-src-lib-components-user-management.mjs +468 -831
  80. package/fesm2022/verben-authentication-ui-src-lib-components-user-management.mjs.map +1 -1
  81. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-approval.mjs +509 -952
  82. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-approval.mjs.map +1 -1
  83. package/fesm2022/verben-authentication-ui-src-lib-components-user-request.mjs +7 -7
  84. package/fesm2022/verben-authentication-ui-src-lib-components-user-request.mjs.map +1 -1
  85. package/package.json +42 -48
  86. package/src/lib/base/README.md +99 -0
  87. package/src/lib/base/core/base-data-page.facade.d.ts +65 -0
  88. package/src/lib/base/core/base-data-page.service.d.ts +43 -0
  89. package/src/lib/base/core/base-data-page.state.d.ts +68 -0
  90. package/src/lib/base/handlers/filter-handler.service.d.ts +13 -0
  91. package/src/lib/base/handlers/search-handler.service.d.ts +20 -0
  92. package/src/lib/base/handlers/sort-handler.service.d.ts +13 -0
  93. package/src/lib/base/models/api-payload.d.ts +2 -0
  94. package/src/lib/base/models/page-config.interface.d.ts +21 -0
  95. package/src/lib/base/public-api.d.ts +9 -5
  96. package/src/lib/base/utils/column-helpers.d.ts +16 -0
  97. package/src/lib/components/user-management/public-api.d.ts +1 -0
  98. package/src/lib/components/user-management/user-management-card/user-management-card.component.d.ts +11 -0
  99. package/src/lib/components/user-management/user-management-form/user-management-form.component.d.ts +12 -14
  100. package/src/lib/components/user-management/user-management-table/user-management-table.component.d.ts +30 -0
  101. package/src/lib/components/user-management/user-management.component.d.ts +28 -124
  102. package/src/lib/components/user-management/user-management.module.d.ts +8 -8
  103. package/src/lib/components/user-management/user-status-badge/user-status-badge.component.d.ts +1 -1
  104. package/src/lib/components/user-management/user.config.d.ts +13 -0
  105. package/src/lib/components/user-management/user.facade.d.ts +42 -0
  106. package/src/lib/components/user-management/user.service.d.ts +26 -0
  107. package/src/lib/components/user-management/user.state.d.ts +19 -0
  108. package/src/lib/components/user-request-approval/public-api.d.ts +1 -1
  109. package/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.d.ts +1 -1
  110. package/src/lib/components/user-request-approval/user-access-request.config.d.ts +13 -0
  111. package/src/lib/components/user-request-approval/user-access-request.facade.d.ts +36 -0
  112. package/src/lib/components/user-request-approval/user-access-request.service.d.ts +30 -0
  113. package/src/lib/components/user-request-approval/user-access-request.state.d.ts +16 -0
  114. package/src/lib/components/user-request-approval/user-request-approval-card/user-request-approval-card.component.d.ts +11 -0
  115. package/src/lib/components/user-request-approval/user-request-approval-form/user-request-approval-form.component.d.ts +47 -0
  116. package/src/lib/components/user-request-approval/user-request-approval-table/user-request-approval-table.component.d.ts +20 -0
  117. package/src/lib/components/user-request-approval/user-request-approval.component.d.ts +29 -68
  118. package/src/lib/components/user-request-approval/user-request-approval.module.d.ts +7 -6
  119. package/esm2022/src/lib/base/base-data.component.mjs +0 -80
  120. package/esm2022/src/lib/base/base-data.facade.mjs +0 -130
  121. package/esm2022/src/lib/base/base-data.service.mjs +0 -21
  122. package/esm2022/src/lib/base/base-data.state.mjs +0 -74
  123. package/esm2022/src/lib/base/models.mjs +0 -2
  124. package/esm2022/src/lib/components/user-management/base-table-style.mjs +0 -53
  125. package/esm2022/src/lib/components/user-management/services/user-management.service.mjs +0 -110
  126. package/esm2022/src/lib/components/user-management/user-management.columns.mjs +0 -53
  127. package/esm2022/src/lib/components/user-request-approval/access-request.columns.mjs +0 -29
  128. package/esm2022/src/lib/components/user-request-approval/base-table-style.mjs +0 -53
  129. package/esm2022/src/lib/components/user-request-approval/facades/user-access-request.facade.mjs +0 -260
  130. package/esm2022/src/lib/components/user-request-approval/helper.mjs +0 -56
  131. package/esm2022/src/lib/components/user-request-approval/services/user-access-request.service.mjs +0 -92
  132. package/esm2022/src/lib/components/user-request-approval/states/user-access-request.state.mjs +0 -92
  133. package/esm2022/src/lib/components/user-request-approval/user-request-form/user-request-form.component.mjs +0 -105
  134. package/esm2022/src/lib/components/user-request-process/index.mjs +0 -2
  135. package/esm2022/src/lib/components/user-request-process/public-api.mjs +0 -3
  136. package/esm2022/src/lib/components/user-request-process/user-request-process.component.mjs +0 -11
  137. package/esm2022/src/lib/components/user-request-process/user-request-process.module.mjs +0 -18
  138. package/esm2022/src/lib/components/user-request-process/verben-authentication-ui-src-lib-components-user-request-process.mjs +0 -5
  139. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-process.mjs +0 -34
  140. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-process.mjs.map +0 -1
  141. package/src/lib/base/base-data.component.d.ts +0 -32
  142. package/src/lib/base/base-data.facade.d.ts +0 -27
  143. package/src/lib/base/base-data.service.d.ts +0 -14
  144. package/src/lib/base/base-data.state.d.ts +0 -28
  145. package/src/lib/base/models.d.ts +0 -11
  146. package/src/lib/components/user-management/base-table-style.d.ts +0 -1
  147. package/src/lib/components/user-management/services/user-management.service.d.ts +0 -44
  148. package/src/lib/components/user-management/user-management.columns.d.ts +0 -3
  149. package/src/lib/components/user-request-approval/access-request.columns.d.ts +0 -3
  150. package/src/lib/components/user-request-approval/base-table-style.d.ts +0 -1
  151. package/src/lib/components/user-request-approval/facades/user-access-request.facade.d.ts +0 -39
  152. package/src/lib/components/user-request-approval/helper.d.ts +0 -7
  153. package/src/lib/components/user-request-approval/services/user-access-request.service.d.ts +0 -64
  154. package/src/lib/components/user-request-approval/states/user-access-request.state.d.ts +0 -35
  155. package/src/lib/components/user-request-approval/user-request-form/user-request-form.component.d.ts +0 -34
  156. package/src/lib/components/user-request-process/index.d.ts +0 -1
  157. package/src/lib/components/user-request-process/public-api.d.ts +0 -2
  158. package/src/lib/components/user-request-process/user-request-process.component.d.ts +0 -5
  159. package/src/lib/components/user-request-process/user-request-process.module.d.ts +0 -7
@@ -1,111 +1,73 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { Status } from 'verben-authentication-ui/src/lib/models';
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, effect, input, Output } from '@angular/core';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { ObjectState, Status } from 'verben-authentication-ui/src/lib/models';
5
+ import { DropDownModule, VerbenaButtonModule, VerbenaInputModule } from 'verben-ng-ui';
6
+ import { USER_CONFIG } from '../user.config';
3
7
  import * as i0 from "@angular/core";
4
8
  import * as i1 from "@angular/forms";
5
- import * as i2 from "../services/user-management.service";
6
- import * as i3 from "verben-authentication-ui/src/lib/services";
7
- import * as i4 from "verben-ng-ui";
9
+ import * as i2 from "verben-ng-ui";
10
+ /**
11
+ * Form for editing a user's role, tags, and status.
12
+ * Identity fields are read-only.
13
+ */
8
14
  export class UserManagementFormComponent {
9
15
  fb;
10
- userManagementService;
11
- envService;
12
- // @Input() roles: Role[] = [];
13
- // @Input() status: Status[] = [];
14
- set currentData(value) {
15
- if (value?.data) {
16
- // Convert comma-separated warehouse codes back to array for dropdown
17
- // const warehouseCodes = value.data.Warehouses
18
- // ? value.data.Warehouses.split(',').filter((code: string) => code.trim())
19
- // : [];
20
- this.form.patchValue({
21
- MailAddress: value.data.MailAddress || '',
22
- FirstName: value.data.FirstName || '',
23
- LastName: value.data.LastName || '',
24
- PhoneNumber: value.data.PhoneNumber || '',
25
- // Address: value.data.Address || '',
26
- RoleID: value.data.RoleID || '',
27
- Tags: value.data.Tags || [],
28
- Status: value.data.Status || Status.Active,
29
- // Warehouses: warehouseCodes,
30
- });
31
- }
32
- else {
33
- this.form.reset();
34
- }
35
- }
36
- roles = [];
37
- tags = [];
38
- switchView = new EventEmitter();
39
- onFormSave = new EventEmitter();
16
+ user = input();
17
+ roles = input([]);
18
+ tags = input([]);
19
+ save = new EventEmitter();
20
+ switchToTable = new EventEmitter();
40
21
  form;
41
22
  statusOptions = Object.values(Status);
42
- // warehouses: Warehouse[] = [];
43
- constructor(fb, userManagementService, envService) {
23
+ constructor(fb) {
44
24
  this.fb = fb;
45
- this.userManagementService = userManagementService;
46
- this.envService = envService;
47
- this.form = this.fb.group({
48
- MailAddress: ['', { readonly: true }],
49
- FirstName: ['', { readonly: true }],
50
- LastName: ['', { readonly: true }],
51
- PhoneNumber: ['', { readonly: true }],
52
- // Address: ['', { readonly: true }],
53
- Status: ['', { readonly: true }],
54
- RoleID: [''],
55
- Tags: [[]],
56
- // Warehouses: [[]],
25
+ this.form = this.fb.group(USER_CONFIG.formGroupConfig.controls);
26
+ effect(() => {
27
+ const user = this.user();
28
+ if (user && this.form) {
29
+ this.form.patchValue({
30
+ MailAddress: user.MailAddress || '',
31
+ FirstName: user.FirstName || '',
32
+ LastName: user.LastName || '',
33
+ PhoneNumber: user.PhoneNumber || '',
34
+ RoleID: user.RoleID || '',
35
+ Tags: user.Tags || [],
36
+ Status: user.Status || Status.Active,
37
+ });
38
+ }
57
39
  });
58
40
  }
59
- ngOnInit() {
60
- // this.loadWarehouses();
61
- }
62
- // async loadWarehouses(): Promise<void> {
63
- // try {
64
- // this.warehouses = await this.userManagementService.loadEntities<Warehouse>(
65
- // 'Warehouse',
66
- // ['Name', 'Code'],
67
- // this.envService.environment.RevenueAPI
68
- // );
69
- // } catch (error) {
70
- // console.error('Error loading warehouses:', error);
71
- // this.warehouses = [];
72
- // }
73
- // }
74
- // onWarehouseChange(event: DropdownChangeEvent): void {
75
- // // Convert array of warehouse codes to comma-separated string
76
- // const selectedCodes = event.value as string[];
77
- // const commaSeparated = selectedCodes ? selectedCodes.join(',') : '';
78
- // // Update the form with the comma-separated value for saving
79
- // this.form.patchValue({
80
- // Warehouses: commaSeparated
81
- // }, { emitEvent: false });
82
- // }
83
41
  onSave() {
84
42
  if (this.form.valid) {
85
- // Emit save event with form value
86
- console.log('Form saved:', this.form.value);
87
- this.onFormSave.emit(this.form.value);
43
+ const merged = {
44
+ ...this.user(),
45
+ ...this.form.getRawValue(),
46
+ DataState: this.user()?.DataState === ObjectState.New
47
+ ? ObjectState.New
48
+ : ObjectState.Changed,
49
+ };
50
+ this.save.emit(merged);
88
51
  }
89
52
  }
90
- onDelete() {
91
- // Emit delete event
92
- console.log('Delete requested');
53
+ onSwitchToTable() {
54
+ this.switchToTable.emit();
93
55
  }
94
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserManagementFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UserManagementService }, { token: i3.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
95
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserManagementFormComponent, selector: "lib-user-request-form", inputs: { currentData: "currentData", roles: "roles", tags: "tags" }, outputs: { switchView: "switchView", onFormSave: "onFormSave" }, ngImport: i0, template: "<form [formGroup]=\"form\" class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\">\n <verbena-input label=\"First Name:\" name=\"FirstName\" type=\"text\" formControlName=\"FirstName\" />\n <verbena-input label=\"Last Name:\" name=\"LastName\" type=\"text\" formControlName=\"LastName\" />\n <verbena-input label=\"Phone Number:\" name=\"PhoneNumber\" type=\"tel\" formControlName=\"PhoneNumber\" />\n <verbena-input name=\"MailAddress\" label=\"E-Mail Address:\" [type]=\"'email'\" formControlName=\"MailAddress\" />\n <!-- <verbena-input\n label=\"Address\"\n name=\"Address\"\n type=\"text\"\n formControlName=\"Address\"\n /> -->\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n\n <verben-drop-down label=\"Role\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"true\"\n [showClear]=\"true\" placeholder=\"\" [(options)]=\"roles\" id=\"role\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"RoleID\" class=\"form-control\">\n </verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"tags\">Tags</label>\n\n <verben-drop-down label=\"Tags\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"true\" [filter]=\"true\"\n [showClear]=\"true\" placeholder=\"\" [(options)]=\"tags\" id=\"tags\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"Tags\" class=\"form-control\">\n </verben-drop-down>\n </div>\n\n <!-- <div class=\"space-y-1\">\n <label for=\"warehouses\">Warehouses</label>\n\n <verben-drop-down label=\"Warehouses\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"true\" [filter]=\"true\"\n [showClear]=\"true\" placeholder=\"\" [(options)]=\"warehouses\" id=\"warehouses\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"Warehouses\" (onChange)=\"onWarehouseChange($event)\" class=\"form-control\">\n </verben-drop-down>\n </div> -->\n\n <div class=\"space-y-1\">\n <label for=\"status\">Status</label>\n\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"false\" [showClear]=\"false\"\n placeholder=\"\" [(options)]=\"statusOptions\" id=\"status\" formControlName=\"Status\" class=\"form-control\">\n </verben-drop-down>\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }] });
56
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserManagementFormComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
57
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: UserManagementFormComponent, isStandalone: true, selector: "lib-user-management-form", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, roles: { classPropertyName: "roles", publicName: "roles", isSignal: true, isRequired: false, transformFunction: null }, tags: { classPropertyName: "tags", publicName: "tags", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { save: "save", switchToTable: "switchToTable" }, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSave()\"\n class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\">\n <verbena-input label=\"First Name:\" name=\"FirstName\" type=\"text\" formControlName=\"FirstName\" [readOnly]=\"true\" />\n <verbena-input label=\"Last Name:\" name=\"LastName\" type=\"text\" formControlName=\"LastName\" [readOnly]=\"true\" />\n <verbena-input label=\"Phone Number:\" name=\"PhoneNumber\" type=\"tel\" formControlName=\"PhoneNumber\" [readOnly]=\"true\" />\n <verbena-input name=\"MailAddress\" label=\"E-Mail Address:\" [type]=\"'email'\" formControlName=\"MailAddress\"\n [readOnly]=\"true\" />\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"true\" [showClear]=\"true\"\n placeholder=\"\" [options]=\"roles()\" id=\"role\" optionLabel=\"Name\" optionValue=\"Code\" formControlName=\"RoleID\"\n class=\"form-control\"></verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"tags\">Tags</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"true\" [filter]=\"true\" [showClear]=\"true\"\n placeholder=\"\" [options]=\"tags()\" id=\"tags\" optionLabel=\"Name\" optionValue=\"Code\" formControlName=\"Tags\"\n class=\"form-control\"></verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"status\">Status</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"false\" [showClear]=\"false\"\n placeholder=\"\" [options]=\"statusOptions\" id=\"status\" formControlName=\"Status\"\n class=\"form-control\"></verben-drop-down>\n </div>\n\n <!-- Form Actions -->\n <div class=\"flex justify-end gap-4 my-2 items-center\">\n <verbena-button styleType=\"ylw-outline\" text=\"Switch To Table\" (click)=\"onSwitchToTable()\" type=\"button\">\n </verbena-button>\n <verbena-button text=\"Save\" type=\"submit\" bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\"\n pd=\"10px 20px\" width=\"114px\" height=\"39px\"></verbena-button>\n </div>\n</form>\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: VerbenaInputModule }, { kind: "component", type: i2.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "ngmodule", type: VerbenaButtonModule }, { kind: "component", type: i2.VerbenaButtonComponent, selector: "verbena-button", inputs: ["type", "text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "ngmodule", type: DropDownModule }, { kind: "component", type: i2.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }] });
96
58
  }
97
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserManagementFormComponent, decorators: [{
98
60
  type: Component,
99
- args: [{ selector: 'lib-user-request-form', template: "<form [formGroup]=\"form\" class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\">\n <verbena-input label=\"First Name:\" name=\"FirstName\" type=\"text\" formControlName=\"FirstName\" />\n <verbena-input label=\"Last Name:\" name=\"LastName\" type=\"text\" formControlName=\"LastName\" />\n <verbena-input label=\"Phone Number:\" name=\"PhoneNumber\" type=\"tel\" formControlName=\"PhoneNumber\" />\n <verbena-input name=\"MailAddress\" label=\"E-Mail Address:\" [type]=\"'email'\" formControlName=\"MailAddress\" />\n <!-- <verbena-input\n label=\"Address\"\n name=\"Address\"\n type=\"text\"\n formControlName=\"Address\"\n /> -->\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n\n <verben-drop-down label=\"Role\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"true\"\n [showClear]=\"true\" placeholder=\"\" [(options)]=\"roles\" id=\"role\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"RoleID\" class=\"form-control\">\n </verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"tags\">Tags</label>\n\n <verben-drop-down label=\"Tags\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"true\" [filter]=\"true\"\n [showClear]=\"true\" placeholder=\"\" [(options)]=\"tags\" id=\"tags\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"Tags\" class=\"form-control\">\n </verben-drop-down>\n </div>\n\n <!-- <div class=\"space-y-1\">\n <label for=\"warehouses\">Warehouses</label>\n\n <verben-drop-down label=\"Warehouses\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"true\" [filter]=\"true\"\n [showClear]=\"true\" placeholder=\"\" [(options)]=\"warehouses\" id=\"warehouses\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"Warehouses\" (onChange)=\"onWarehouseChange($event)\" class=\"form-control\">\n </verben-drop-down>\n </div> -->\n\n <div class=\"space-y-1\">\n <label for=\"status\">Status</label>\n\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"false\" [showClear]=\"false\"\n placeholder=\"\" [(options)]=\"statusOptions\" id=\"status\" formControlName=\"Status\" class=\"form-control\">\n </verben-drop-down>\n </div>\n</form>\n" }]
100
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.UserManagementService }, { type: i3.EnvironmentService }], propDecorators: { currentData: [{
101
- type: Input
102
- }], roles: [{
103
- type: Input
104
- }], tags: [{
105
- type: Input
106
- }], switchView: [{
61
+ args: [{ selector: 'lib-user-management-form', standalone: true, imports: [
62
+ CommonModule,
63
+ ReactiveFormsModule,
64
+ VerbenaInputModule,
65
+ VerbenaButtonModule,
66
+ DropDownModule,
67
+ ], template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSave()\"\n class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\">\n <verbena-input label=\"First Name:\" name=\"FirstName\" type=\"text\" formControlName=\"FirstName\" [readOnly]=\"true\" />\n <verbena-input label=\"Last Name:\" name=\"LastName\" type=\"text\" formControlName=\"LastName\" [readOnly]=\"true\" />\n <verbena-input label=\"Phone Number:\" name=\"PhoneNumber\" type=\"tel\" formControlName=\"PhoneNumber\" [readOnly]=\"true\" />\n <verbena-input name=\"MailAddress\" label=\"E-Mail Address:\" [type]=\"'email'\" formControlName=\"MailAddress\"\n [readOnly]=\"true\" />\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"true\" [showClear]=\"true\"\n placeholder=\"\" [options]=\"roles()\" id=\"role\" optionLabel=\"Name\" optionValue=\"Code\" formControlName=\"RoleID\"\n class=\"form-control\"></verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"tags\">Tags</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"true\" [filter]=\"true\" [showClear]=\"true\"\n placeholder=\"\" [options]=\"tags()\" id=\"tags\" optionLabel=\"Name\" optionValue=\"Code\" formControlName=\"Tags\"\n class=\"form-control\"></verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"status\">Status</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"false\" [showClear]=\"false\"\n placeholder=\"\" [options]=\"statusOptions\" id=\"status\" formControlName=\"Status\"\n class=\"form-control\"></verben-drop-down>\n </div>\n\n <!-- Form Actions -->\n <div class=\"flex justify-end gap-4 my-2 items-center\">\n <verbena-button styleType=\"ylw-outline\" text=\"Switch To Table\" (click)=\"onSwitchToTable()\" type=\"button\">\n </verbena-button>\n <verbena-button text=\"Save\" type=\"submit\" bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\"\n pd=\"10px 20px\" width=\"114px\" height=\"39px\"></verbena-button>\n </div>\n</form>\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
68
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { save: [{
107
69
  type: Output
108
- }], onFormSave: [{
70
+ }], switchToTable: [{
109
71
  type: Output
110
72
  }] } });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LWZvcm0vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LWZvcm0vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBQVEsTUFBTSxFQUFhLE1BQU0seUNBQXlDLENBQUM7Ozs7OztBQXNCbEYsTUFBTSxPQUFPLDJCQUEyQjtJQXFDNUI7SUFDQTtJQUNBO0lBdENWLCtCQUErQjtJQUMvQixrQ0FBa0M7SUFFbEMsSUFBYSxXQUFXLENBQUMsS0FBc0I7UUFDN0MsSUFBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDaEIscUVBQXFFO1lBQ3JFLCtDQUErQztZQUMvQyw2RUFBNkU7WUFDN0UsVUFBVTtZQUVWLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNuQixXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtnQkFDekMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUU7Z0JBQ3JDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFO2dCQUNuQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtnQkFDekMscUNBQXFDO2dCQUNyQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDL0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTTtnQkFDMUMsOEJBQThCO2FBQy9CLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUNRLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsSUFBSSxHQUFVLEVBQUUsQ0FBQztJQUVoQixVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUMzQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFFekQsSUFBSSxDQUFZO0lBQ2hCLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLGdDQUFnQztJQUVoQyxZQUNVLEVBQWUsRUFDZixxQkFBNEMsRUFDNUMsVUFBOEI7UUFGOUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFFdEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN4QixXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDckMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ25DLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDckMscUNBQXFDO1lBQ3JDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDVixvQkFBb0I7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTix5QkFBeUI7SUFDM0IsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxVQUFVO0lBQ1Ysa0ZBQWtGO0lBQ2xGLHFCQUFxQjtJQUNyQiwwQkFBMEI7SUFDMUIsK0NBQStDO0lBQy9DLFNBQVM7SUFDVCxzQkFBc0I7SUFDdEIseURBQXlEO0lBQ3pELDRCQUE0QjtJQUM1QixNQUFNO0lBQ04sSUFBSTtJQUVKLHdEQUF3RDtJQUN4RCxrRUFBa0U7SUFDbEUsbURBQW1EO0lBQ25ELHlFQUF5RTtJQUV6RSxpRUFBaUU7SUFDakUsMkJBQTJCO0lBQzNCLGlDQUFpQztJQUNqQyw4QkFBOEI7SUFDOUIsSUFBSTtJQUVKLE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsa0NBQWtDO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixvQkFBb0I7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7d0dBN0ZVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLG9NQ3hCeEMscXhFQStDQTs7NEZEdkJhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSx1QkFBdUI7cUpBUXBCLFdBQVc7c0JBQXZCLEtBQUs7Z0JBc0JHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSb2xlLCBTdGF0dXMsIFRhZywgVXNlciB9IGZyb20gJ3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBDYXJkRGF0YSwgRHJvcGRvd25DaGFuZ2VFdmVudCB9IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBVc2VyTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91c2VyLW1hbmFnZW1lbnQuc2VydmljZSc7XG5cbmludGVyZmFjZSBVc2VyRm9ybURhdGEge1xuICBNYWlsQWRkcmVzczogc3RyaW5nO1xuICBGaXJzdE5hbWU6IHN0cmluZztcbiAgTGFzdE5hbWU6IHN0cmluZztcbiAgUGhvbmVOdW1iZXI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFdhcmVob3VzZSB7XG4gIE5hbWU6IHN0cmluZztcbiAgQ29kZTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdXNlci1yZXF1ZXN0LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VtZW50Rm9ybUNvbXBvbmVudCB7XG4gIC8vIEBJbnB1dCgpIHJvbGVzOiBSb2xlW10gPSBbXTtcbiAgLy8gQElucHV0KCkgc3RhdHVzOiBTdGF0dXNbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIHNldCBjdXJyZW50RGF0YSh2YWx1ZTogQ2FyZERhdGEgfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlPy5kYXRhKSB7XG4gICAgICAvLyBDb252ZXJ0IGNvbW1hLXNlcGFyYXRlZCB3YXJlaG91c2UgY29kZXMgYmFjayB0byBhcnJheSBmb3IgZHJvcGRvd25cbiAgICAgIC8vIGNvbnN0IHdhcmVob3VzZUNvZGVzID0gdmFsdWUuZGF0YS5XYXJlaG91c2VzXG4gICAgICAvLyAgID8gdmFsdWUuZGF0YS5XYXJlaG91c2VzLnNwbGl0KCcsJykuZmlsdGVyKChjb2RlOiBzdHJpbmcpID0+IGNvZGUudHJpbSgpKVxuICAgICAgLy8gICA6IFtdO1xuXG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIE1haWxBZGRyZXNzOiB2YWx1ZS5kYXRhLk1haWxBZGRyZXNzIHx8ICcnLFxuICAgICAgICBGaXJzdE5hbWU6IHZhbHVlLmRhdGEuRmlyc3ROYW1lIHx8ICcnLFxuICAgICAgICBMYXN0TmFtZTogdmFsdWUuZGF0YS5MYXN0TmFtZSB8fCAnJyxcbiAgICAgICAgUGhvbmVOdW1iZXI6IHZhbHVlLmRhdGEuUGhvbmVOdW1iZXIgfHwgJycsXG4gICAgICAgIC8vIEFkZHJlc3M6IHZhbHVlLmRhdGEuQWRkcmVzcyB8fCAnJyxcbiAgICAgICAgUm9sZUlEOiB2YWx1ZS5kYXRhLlJvbGVJRCB8fCAnJyxcbiAgICAgICAgVGFnczogdmFsdWUuZGF0YS5UYWdzIHx8IFtdLFxuICAgICAgICBTdGF0dXM6IHZhbHVlLmRhdGEuU3RhdHVzIHx8IFN0YXR1cy5BY3RpdmUsXG4gICAgICAgIC8vIFdhcmVob3VzZXM6IHdhcmVob3VzZUNvZGVzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSByb2xlczogUm9sZVtdID0gW107XG4gIEBJbnB1dCgpIHRhZ3M6IFRhZ1tdID0gW107XG5cbiAgQE91dHB1dCgpIHN3aXRjaFZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4oKTtcbiAgQE91dHB1dCgpIG9uRm9ybVNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFBhcnRpYWw8VXNlcj4+KCk7XG5cbiAgZm9ybTogRm9ybUdyb3VwO1xuICBzdGF0dXNPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdGF0dXMpO1xuICAvLyB3YXJlaG91c2VzOiBXYXJlaG91c2VbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgdXNlck1hbmFnZW1lbnRTZXJ2aWNlOiBVc2VyTWFuYWdlbWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbnZTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBNYWlsQWRkcmVzczogWycnLCB7IHJlYWRvbmx5OiB0cnVlIH1dLFxuICAgICAgRmlyc3ROYW1lOiBbJycsIHsgcmVhZG9ubHk6IHRydWUgfV0sXG4gICAgICBMYXN0TmFtZTogWycnLCB7IHJlYWRvbmx5OiB0cnVlIH1dLFxuICAgICAgUGhvbmVOdW1iZXI6IFsnJywgeyByZWFkb25seTogdHJ1ZSB9XSxcbiAgICAgIC8vIEFkZHJlc3M6IFsnJywgeyByZWFkb25seTogdHJ1ZSB9XSxcbiAgICAgIFN0YXR1czogWycnLCB7IHJlYWRvbmx5OiB0cnVlIH1dLFxuICAgICAgUm9sZUlEOiBbJyddLFxuICAgICAgVGFnczogW1tdXSxcbiAgICAgIC8vIFdhcmVob3VzZXM6IFtbXV0sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0aGlzLmxvYWRXYXJlaG91c2VzKCk7XG4gIH1cblxuICAvLyBhc3luYyBsb2FkV2FyZWhvdXNlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gICB0cnkge1xuICAvLyAgICAgdGhpcy53YXJlaG91c2VzID0gYXdhaXQgdGhpcy51c2VyTWFuYWdlbWVudFNlcnZpY2UubG9hZEVudGl0aWVzPFdhcmVob3VzZT4oXG4gIC8vICAgICAgICdXYXJlaG91c2UnLFxuICAvLyAgICAgICBbJ05hbWUnLCAnQ29kZSddLFxuICAvLyAgICAgICB0aGlzLmVudlNlcnZpY2UuZW52aXJvbm1lbnQuUmV2ZW51ZUFQSVxuICAvLyAgICAgKTtcbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB3YXJlaG91c2VzOicsIGVycm9yKTtcbiAgLy8gICAgIHRoaXMud2FyZWhvdXNlcyA9IFtdO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIG9uV2FyZWhvdXNlQ2hhbmdlKGV2ZW50OiBEcm9wZG93bkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gIC8vICAgLy8gQ29udmVydCBhcnJheSBvZiB3YXJlaG91c2UgY29kZXMgdG8gY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICAvLyAgIGNvbnN0IHNlbGVjdGVkQ29kZXMgPSBldmVudC52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgLy8gICBjb25zdCBjb21tYVNlcGFyYXRlZCA9IHNlbGVjdGVkQ29kZXMgPyBzZWxlY3RlZENvZGVzLmpvaW4oJywnKSA6ICcnO1xuXG4gIC8vICAgLy8gVXBkYXRlIHRoZSBmb3JtIHdpdGggdGhlIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZSBmb3Igc2F2aW5nXG4gIC8vICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAvLyAgICAgV2FyZWhvdXNlczogY29tbWFTZXBhcmF0ZWRcbiAgLy8gICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIC8vIH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgLy8gRW1pdCBzYXZlIGV2ZW50IHdpdGggZm9ybSB2YWx1ZVxuICAgICAgY29uc29sZS5sb2coJ0Zvcm0gc2F2ZWQ6JywgdGhpcy5mb3JtLnZhbHVlKTtcbiAgICAgIHRoaXMub25Gb3JtU2F2ZS5lbWl0KHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgLy8gRW1pdCBkZWxldGUgZXZlbnRcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlIHJlcXVlc3RlZCcpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImZsZXggZmxleC1jb2wgcHgtMyBwYi0zIHJvdW5kZWQteGwgaC1mdWxsIHctZnVsbCByZWxhdGl2ZSBzcGFjZS15LTRcIj5cbiAgPHZlcmJlbmEtaW5wdXQgbGFiZWw9XCJGaXJzdCBOYW1lOlwiIG5hbWU9XCJGaXJzdE5hbWVcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIkZpcnN0TmFtZVwiIC8+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiTGFzdCBOYW1lOlwiIG5hbWU9XCJMYXN0TmFtZVwiIHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiTGFzdE5hbWVcIiAvPlxuICA8dmVyYmVuYS1pbnB1dCBsYWJlbD1cIlBob25lIE51bWJlcjpcIiBuYW1lPVwiUGhvbmVOdW1iZXJcIiB0eXBlPVwidGVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiUGhvbmVOdW1iZXJcIiAvPlxuICA8dmVyYmVuYS1pbnB1dCBuYW1lPVwiTWFpbEFkZHJlc3NcIiBsYWJlbD1cIkUtTWFpbCBBZGRyZXNzOlwiIFt0eXBlXT1cIidlbWFpbCdcIiBmb3JtQ29udHJvbE5hbWU9XCJNYWlsQWRkcmVzc1wiIC8+XG4gIDwhLS0gPHZlcmJlbmEtaW5wdXRcbiAgICBsYWJlbD1cIkFkZHJlc3NcIlxuICAgIG5hbWU9XCJBZGRyZXNzXCJcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgZm9ybUNvbnRyb2xOYW1lPVwiQWRkcmVzc1wiXG4gIC8+IC0tPlxuXG4gIDxkaXYgY2xhc3M9XCJzcGFjZS15LTFcIj5cbiAgICA8bGFiZWwgZm9yPVwicm9sZVwiPlJvbGU8L2xhYmVsPlxuXG4gICAgPHZlcmJlbi1kcm9wLWRvd24gbGFiZWw9XCJSb2xlXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIHdpZHRoPVwiMTAwJVwiIFttdWx0aXNlbGVjdF09XCJmYWxzZVwiIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICBbc2hvd0NsZWFyXT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIlwiIFsob3B0aW9ucyldPVwicm9sZXNcIiBpZD1cInJvbGVcIiBvcHRpb25MYWJlbD1cIk5hbWVcIiBvcHRpb25WYWx1ZT1cIkNvZGVcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiUm9sZUlEXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzcGFjZS15LTFcIj5cbiAgICA8bGFiZWwgZm9yPVwidGFnc1wiPlRhZ3M8L2xhYmVsPlxuXG4gICAgPHZlcmJlbi1kcm9wLWRvd24gbGFiZWw9XCJUYWdzXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIHdpZHRoPVwiMTAwJVwiIFttdWx0aXNlbGVjdF09XCJ0cnVlXCIgW2ZpbHRlcl09XCJ0cnVlXCJcbiAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiXCIgWyhvcHRpb25zKV09XCJ0YWdzXCIgaWQ9XCJ0YWdzXCIgb3B0aW9uTGFiZWw9XCJOYW1lXCIgb3B0aW9uVmFsdWU9XCJDb2RlXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cIlRhZ3NcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgPC9kaXY+XG5cbiAgPCEtLSA8ZGl2IGNsYXNzPVwic3BhY2UteS0xXCI+XG4gICAgPGxhYmVsIGZvcj1cIndhcmVob3VzZXNcIj5XYXJlaG91c2VzPC9sYWJlbD5cblxuICAgIDx2ZXJiZW4tZHJvcC1kb3duIGxhYmVsPVwiV2FyZWhvdXNlc1wiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiB3aWR0aD1cIjEwMCVcIiBbbXVsdGlzZWxlY3RdPVwidHJ1ZVwiIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICBbc2hvd0NsZWFyXT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIlwiIFsob3B0aW9ucyldPVwid2FyZWhvdXNlc1wiIGlkPVwid2FyZWhvdXNlc1wiIG9wdGlvbkxhYmVsPVwiTmFtZVwiIG9wdGlvblZhbHVlPVwiQ29kZVwiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJXYXJlaG91c2VzXCIgKG9uQ2hhbmdlKT1cIm9uV2FyZWhvdXNlQ2hhbmdlKCRldmVudClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgPC9kaXY+IC0tPlxuXG4gIDxkaXYgY2xhc3M9XCJzcGFjZS15LTFcIj5cbiAgICA8bGFiZWwgZm9yPVwic3RhdHVzXCI+U3RhdHVzPC9sYWJlbD5cblxuICAgIDx2ZXJiZW4tZHJvcC1kb3duIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiB3aWR0aD1cIjEwMCVcIiBbbXVsdGlzZWxlY3RdPVwiZmFsc2VcIiBbZmlsdGVyXT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJmYWxzZVwiXG4gICAgICBwbGFjZWhvbGRlcj1cIlwiIFsob3B0aW9ucyldPVwic3RhdHVzT3B0aW9uc1wiIGlkPVwic3RhdHVzXCIgZm9ybUNvbnRyb2xOYW1lPVwiU3RhdHVzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LWZvcm0vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LWZvcm0vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBMEIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsV0FBVyxFQUFRLE1BQU0sRUFBYSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRTdDOzs7R0FHRztBQWNILE1BQU0sT0FBTywyQkFBMkI7SUFXbEI7SUFWcEIsSUFBSSxHQUFHLEtBQUssRUFBUSxDQUFDO0lBQ3JCLEtBQUssR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUIsSUFBSSxHQUFHLEtBQUssQ0FBUSxFQUFFLENBQUMsQ0FBQztJQUVkLElBQUksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ2hDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRW5ELElBQUksQ0FBWTtJQUNoQixhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV0QyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxlQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtvQkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRTtvQkFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRTtvQkFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtvQkFDbkMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRTtvQkFDekIsSUFBSSxFQUFHLElBQXVDLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBQ3pELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNO2lCQUNyQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixNQUFNLE1BQU0sR0FBUztnQkFDbkIsR0FBSSxJQUFJLENBQUMsSUFBSSxFQUFXO2dCQUN4QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUMxQixTQUFTLEVBQ1AsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsS0FBSyxXQUFXLENBQUMsR0FBRztvQkFDeEMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHO29CQUNqQixDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU87YUFDMUIsQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0E5Q1UsMkJBQTJCOzRGQUEzQiwyQkFBMkIsNmZDeEJ4QywwcEVBcUNBLHNHRHRCSSxZQUFZLDhCQUNaLG1CQUFtQiw0ckJBQ25CLGtCQUFrQixvcUJBQ2xCLG1CQUFtQixrZUFDbkIsY0FBYzs7NEZBS0wsMkJBQTJCO2tCQWJ2QyxTQUFTOytCQUNFLDBCQUEwQixjQUN4QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixjQUFjO3FCQUNmO2dGQVNTLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBlZmZlY3QsIGlucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYmplY3RTdGF0ZSwgUm9sZSwgU3RhdHVzLCBUYWcsIFVzZXIgfSBmcm9tICd2ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgRHJvcERvd25Nb2R1bGUsIFZlcmJlbmFCdXR0b25Nb2R1bGUsIFZlcmJlbmFJbnB1dE1vZHVsZSB9IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBVU0VSX0NPTkZJRyB9IGZyb20gJy4uL3VzZXIuY29uZmlnJztcblxuLyoqXG4gKiBGb3JtIGZvciBlZGl0aW5nIGEgdXNlcidzIHJvbGUsIHRhZ3MsIGFuZCBzdGF0dXMuXG4gKiBJZGVudGl0eSBmaWVsZHMgYXJlIHJlYWQtb25seS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXVzZXItbWFuYWdlbWVudC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZlcmJlbmFJbnB1dE1vZHVsZSxcbiAgICBWZXJiZW5hQnV0dG9uTW9kdWxlLFxuICAgIERyb3BEb3duTW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLW1hbmFnZW1lbnQtZm9ybS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VtZW50Rm9ybUNvbXBvbmVudCB7XG4gIHVzZXIgPSBpbnB1dDxVc2VyPigpO1xuICByb2xlcyA9IGlucHV0PFJvbGVbXT4oW10pO1xuICB0YWdzID0gaW5wdXQ8VGFnW10+KFtdKTtcblxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlcj4oKTtcbiAgQE91dHB1dCgpIHN3aXRjaFRvVGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZm9ybTogRm9ybUdyb3VwO1xuICBzdGF0dXNPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdGF0dXMpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChVU0VSX0NPTkZJRy5mb3JtR3JvdXBDb25maWchLmNvbnRyb2xzKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKCk7XG4gICAgICBpZiAodXNlciAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIE1haWxBZGRyZXNzOiB1c2VyLk1haWxBZGRyZXNzIHx8ICcnLFxuICAgICAgICAgIEZpcnN0TmFtZTogdXNlci5GaXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgTGFzdE5hbWU6IHVzZXIuTGFzdE5hbWUgfHwgJycsXG4gICAgICAgICAgUGhvbmVOdW1iZXI6IHVzZXIuUGhvbmVOdW1iZXIgfHwgJycsXG4gICAgICAgICAgUm9sZUlEOiB1c2VyLlJvbGVJRCB8fCAnJyxcbiAgICAgICAgICBUYWdzOiAodXNlciBhcyB1bmtub3duIGFzIHsgVGFncz86IHN0cmluZ1tdIH0pLlRhZ3MgfHwgW10sXG4gICAgICAgICAgU3RhdHVzOiB1c2VyLlN0YXR1cyB8fCBTdGF0dXMuQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCBtZXJnZWQ6IFVzZXIgPSB7XG4gICAgICAgIC4uLih0aGlzLnVzZXIoKSBhcyBVc2VyKSxcbiAgICAgICAgLi4udGhpcy5mb3JtLmdldFJhd1ZhbHVlKCksXG4gICAgICAgIERhdGFTdGF0ZTpcbiAgICAgICAgICB0aGlzLnVzZXIoKT8uRGF0YVN0YXRlID09PSBPYmplY3RTdGF0ZS5OZXdcbiAgICAgICAgICAgID8gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgICAgICA6IE9iamVjdFN0YXRlLkNoYW5nZWQsXG4gICAgICB9O1xuICAgICAgdGhpcy5zYXZlLmVtaXQobWVyZ2VkKTtcbiAgICB9XG4gIH1cblxuICBvblN3aXRjaFRvVGFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5zd2l0Y2hUb1RhYmxlLmVtaXQoKTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cIm9uU2F2ZSgpXCJcbiAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHB4LTMgcGItMyByb3VuZGVkLXhsIGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmUgc3BhY2UteS00XCI+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiRmlyc3QgTmFtZTpcIiBuYW1lPVwiRmlyc3ROYW1lXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJGaXJzdE5hbWVcIiBbcmVhZE9ubHldPVwidHJ1ZVwiIC8+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiTGFzdCBOYW1lOlwiIG5hbWU9XCJMYXN0TmFtZVwiIHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiTGFzdE5hbWVcIiBbcmVhZE9ubHldPVwidHJ1ZVwiIC8+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiUGhvbmUgTnVtYmVyOlwiIG5hbWU9XCJQaG9uZU51bWJlclwiIHR5cGU9XCJ0ZWxcIiBmb3JtQ29udHJvbE5hbWU9XCJQaG9uZU51bWJlclwiIFtyZWFkT25seV09XCJ0cnVlXCIgLz5cbiAgPHZlcmJlbmEtaW5wdXQgbmFtZT1cIk1haWxBZGRyZXNzXCIgbGFiZWw9XCJFLU1haWwgQWRkcmVzczpcIiBbdHlwZV09XCInZW1haWwnXCIgZm9ybUNvbnRyb2xOYW1lPVwiTWFpbEFkZHJlc3NcIlxuICAgIFtyZWFkT25seV09XCJ0cnVlXCIgLz5cblxuICA8ZGl2IGNsYXNzPVwic3BhY2UteS0xXCI+XG4gICAgPGxhYmVsIGZvcj1cInJvbGVcIj5Sb2xlPC9sYWJlbD5cbiAgICA8dmVyYmVuLWRyb3AtZG93biBzdHlsZUNsYXNzPVwidy1mdWxsXCIgd2lkdGg9XCIxMDAlXCIgW211bHRpc2VsZWN0XT1cImZhbHNlXCIgW2ZpbHRlcl09XCJ0cnVlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiXCIgW29wdGlvbnNdPVwicm9sZXMoKVwiIGlkPVwicm9sZVwiIG9wdGlvbkxhYmVsPVwiTmFtZVwiIG9wdGlvblZhbHVlPVwiQ29kZVwiIGZvcm1Db250cm9sTmFtZT1cIlJvbGVJRFwiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdmVyYmVuLWRyb3AtZG93bj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNwYWNlLXktMVwiPlxuICAgIDxsYWJlbCBmb3I9XCJ0YWdzXCI+VGFnczwvbGFiZWw+XG4gICAgPHZlcmJlbi1kcm9wLWRvd24gc3R5bGVDbGFzcz1cInctZnVsbFwiIHdpZHRoPVwiMTAwJVwiIFttdWx0aXNlbGVjdF09XCJ0cnVlXCIgW2ZpbHRlcl09XCJ0cnVlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiXCIgW29wdGlvbnNdPVwidGFncygpXCIgaWQ9XCJ0YWdzXCIgb3B0aW9uTGFiZWw9XCJOYW1lXCIgb3B0aW9uVmFsdWU9XCJDb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwiVGFnc1wiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdmVyYmVuLWRyb3AtZG93bj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNwYWNlLXktMVwiPlxuICAgIDxsYWJlbCBmb3I9XCJzdGF0dXNcIj5TdGF0dXM8L2xhYmVsPlxuICAgIDx2ZXJiZW4tZHJvcC1kb3duIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiB3aWR0aD1cIjEwMCVcIiBbbXVsdGlzZWxlY3RdPVwiZmFsc2VcIiBbZmlsdGVyXT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJmYWxzZVwiXG4gICAgICBwbGFjZWhvbGRlcj1cIlwiIFtvcHRpb25zXT1cInN0YXR1c09wdGlvbnNcIiBpZD1cInN0YXR1c1wiIGZvcm1Db250cm9sTmFtZT1cIlN0YXR1c1wiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdmVyYmVuLWRyb3AtZG93bj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBGb3JtIEFjdGlvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC00IG15LTIgaXRlbXMtY2VudGVyXCI+XG4gICAgPHZlcmJlbmEtYnV0dG9uIHN0eWxlVHlwZT1cInlsdy1vdXRsaW5lXCIgdGV4dD1cIlN3aXRjaCBUbyBUYWJsZVwiIChjbGljayk9XCJvblN3aXRjaFRvVGFibGUoKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgIDx2ZXJiZW5hLWJ1dHRvbiB0ZXh0PVwiU2F2ZVwiIHR5cGU9XCJzdWJtaXRcIiBiZ0NvbG9yPVwiI0ZGRTY4MVwiIHRleHRDb2xvcj1cIiM0MDQwNDBcIiBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgIHBkPVwiMTBweCAyMHB4XCIgd2lkdGg9XCIxMTRweFwiIGhlaWdodD1cIjM5cHhcIj48L3ZlcmJlbmEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
@@ -0,0 +1,68 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output, viewChild } from '@angular/core';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { Status } from 'verben-authentication-ui/src/lib/models';
5
+ import { DataTableComponent, DataTableModule, DropDownModule, SvgModule, VerbenaInputModule, } from 'verben-ng-ui';
6
+ import { UserStatusBadgeComponent } from '../user-status-badge/user-status-badge.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../user.facade";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "@angular/forms";
11
+ import * as i4 from "verben-ng-ui";
12
+ /**
13
+ * Table view for users with inline row editing.
14
+ */
15
+ export class UserManagementTableComponent {
16
+ facade;
17
+ tableView = viewChild(DataTableComponent);
18
+ users = [];
19
+ columns = [];
20
+ isLoading = false;
21
+ formGroupConfig;
22
+ view = new EventEmitter();
23
+ delete = new EventEmitter();
24
+ saveRow = new EventEmitter();
25
+ statuses = Object.values(Status);
26
+ constructor(facade) {
27
+ this.facade = facade;
28
+ }
29
+ onView(user) {
30
+ this.view.emit(user);
31
+ }
32
+ onDelete(user) {
33
+ this.delete.emit(user);
34
+ }
35
+ onRowSaved(event) {
36
+ const original = this.users[event.index] ?? {};
37
+ this.saveRow.emit({ ...original, ...event.data });
38
+ }
39
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserManagementTableComponent, deps: [{ token: i1.UserFacade }], target: i0.ɵɵFactoryTarget.Component });
40
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: UserManagementTableComponent, isStandalone: true, selector: "lib-user-management-table", inputs: { users: "users", columns: "columns", isLoading: "isLoading", formGroupConfig: "formGroupConfig" }, outputs: { view: "view", delete: "delete", saveRow: "saveRow" }, viewQueries: [{ propertyName: "tableView", first: true, predicate: DataTableComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"table-container\" [class.loading]=\"isLoading\">\n <lib-data-table [data]=\"users\" [columns]=\"columns\" [formGroupConfig]=\"formGroupConfig\" dataKey=\"Code\"\n (rowSave)=\"onRowSaved($event)\">\n <!-- Select -->\n <ng-container libColumn=\"select\">\n <ng-template #cell let-isSelected=\"isSelected\" let-toggleRowSelection=\"toggleRowSelection\">\n <input type=\"checkbox\" [checked]=\"isSelected\" (change)=\"toggleRowSelection()\" />\n </ng-template>\n </ng-container>\n\n <!-- Created -->\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>{{ value | date }}</ng-template>\n </ng-container>\n\n <!-- Mail -->\n <ng-container libColumn=\"mail\">\n <ng-template #cell let-value>{{ value }}</ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verbena-input name=\"MailAddress\" [formControl]=\"control\" placeHolder=\"Enter E-Mail\" />\n </ng-template>\n </ng-container>\n\n <!-- Phone -->\n <ng-container libColumn=\"phone\">\n <ng-template #cell let-value>{{ value }}</ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verbena-input name=\"PhoneNumber\" [formControl]=\"control\" placeHolder=\"Enter Phone Number\" />\n </ng-template>\n </ng-container>\n\n <!-- Role -->\n <ng-container libColumn=\"role\">\n <ng-template #cell let-value>{{ facade.getRoleName(value) || 'N/A' }}</ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verben-drop-down [width]=\"'100%'\" [formControl]=\"control\" placeHolder=\"Select Role\"\n [options]=\"(facade.roles$ | async) ?? []\" optionLabel=\"Name\" optionValue=\"Code\" [filter]=\"true\"\n [showClear]=\"true\"></verben-drop-down>\n </ng-template>\n </ng-container>\n\n <!-- Status -->\n <ng-container libColumn=\"status\">\n <ng-template #cell let-value>\n <lib-user-status-badge [status]=\"value\"></lib-user-status-badge>\n </ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verben-drop-down [width]=\"'100%'\" [formControl]=\"control\" placeHolder=\"Select Status\" [options]=\"statuses\"\n [filter]=\"false\" [showClear]=\"false\"></verben-drop-down>\n </ng-template>\n </ng-container>\n\n <!-- Actions -->\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\" let-toggleRowEdit=\"toggleRowEdit\">\n <div class=\"flex gap-6\">\n <verben-svg (click)=\"toggleRowEdit()\" icon=\"edit\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n <verben-svg (click)=\"onView(row)\" icon=\"eye\" [width]=\"15\" [height]=\"15\" class=\"cursor-pointer\"></verben-svg>\n <verben-svg (click)=\"onDelete(row)\" icon=\"delete\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n </div>\n </ng-template>\n <ng-template #cellEdit let-toggleRowEdit=\"toggleRowEdit\">\n <div class=\"flex gap-6\">\n <verben-svg (click)=\"toggleRowEdit()\" icon=\"tick\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n\n <div *ngIf=\"users.length === 0 && !isLoading\" class=\"empty-state\">\n <p>No users found</p>\n </div>\n</div>\n", styles: [".table-container{width:100%}.table-container.loading{opacity:.6;pointer-events:none}.empty-state{padding:2rem;text-align:center;color:var(--vbn-color-text-muted)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: DataTableModule }, { kind: "component", type: i4.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i4.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "ngmodule", type: SvgModule }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "ngmodule", type: DropDownModule }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "ngmodule", type: VerbenaInputModule }, { kind: "component", type: i4.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: UserStatusBadgeComponent, selector: "lib-user-status-badge", inputs: ["status"] }] });
41
+ }
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserManagementTableComponent, decorators: [{
43
+ type: Component,
44
+ args: [{ selector: 'lib-user-management-table', standalone: true, imports: [
45
+ CommonModule,
46
+ ReactiveFormsModule,
47
+ DataTableModule,
48
+ SvgModule,
49
+ DropDownModule,
50
+ VerbenaInputModule,
51
+ UserStatusBadgeComponent,
52
+ ], template: "<div class=\"table-container\" [class.loading]=\"isLoading\">\n <lib-data-table [data]=\"users\" [columns]=\"columns\" [formGroupConfig]=\"formGroupConfig\" dataKey=\"Code\"\n (rowSave)=\"onRowSaved($event)\">\n <!-- Select -->\n <ng-container libColumn=\"select\">\n <ng-template #cell let-isSelected=\"isSelected\" let-toggleRowSelection=\"toggleRowSelection\">\n <input type=\"checkbox\" [checked]=\"isSelected\" (change)=\"toggleRowSelection()\" />\n </ng-template>\n </ng-container>\n\n <!-- Created -->\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>{{ value | date }}</ng-template>\n </ng-container>\n\n <!-- Mail -->\n <ng-container libColumn=\"mail\">\n <ng-template #cell let-value>{{ value }}</ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verbena-input name=\"MailAddress\" [formControl]=\"control\" placeHolder=\"Enter E-Mail\" />\n </ng-template>\n </ng-container>\n\n <!-- Phone -->\n <ng-container libColumn=\"phone\">\n <ng-template #cell let-value>{{ value }}</ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verbena-input name=\"PhoneNumber\" [formControl]=\"control\" placeHolder=\"Enter Phone Number\" />\n </ng-template>\n </ng-container>\n\n <!-- Role -->\n <ng-container libColumn=\"role\">\n <ng-template #cell let-value>{{ facade.getRoleName(value) || 'N/A' }}</ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verben-drop-down [width]=\"'100%'\" [formControl]=\"control\" placeHolder=\"Select Role\"\n [options]=\"(facade.roles$ | async) ?? []\" optionLabel=\"Name\" optionValue=\"Code\" [filter]=\"true\"\n [showClear]=\"true\"></verben-drop-down>\n </ng-template>\n </ng-container>\n\n <!-- Status -->\n <ng-container libColumn=\"status\">\n <ng-template #cell let-value>\n <lib-user-status-badge [status]=\"value\"></lib-user-status-badge>\n </ng-template>\n <ng-template #cellEdit let-control=\"control\">\n <verben-drop-down [width]=\"'100%'\" [formControl]=\"control\" placeHolder=\"Select Status\" [options]=\"statuses\"\n [filter]=\"false\" [showClear]=\"false\"></verben-drop-down>\n </ng-template>\n </ng-container>\n\n <!-- Actions -->\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\" let-toggleRowEdit=\"toggleRowEdit\">\n <div class=\"flex gap-6\">\n <verben-svg (click)=\"toggleRowEdit()\" icon=\"edit\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n <verben-svg (click)=\"onView(row)\" icon=\"eye\" [width]=\"15\" [height]=\"15\" class=\"cursor-pointer\"></verben-svg>\n <verben-svg (click)=\"onDelete(row)\" icon=\"delete\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n </div>\n </ng-template>\n <ng-template #cellEdit let-toggleRowEdit=\"toggleRowEdit\">\n <div class=\"flex gap-6\">\n <verben-svg (click)=\"toggleRowEdit()\" icon=\"tick\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n <verben-svg (click)=\"toggleRowEdit()\" icon=\"delete\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n\n <div *ngIf=\"users.length === 0 && !isLoading\" class=\"empty-state\">\n <p>No users found</p>\n </div>\n</div>\n", styles: [".table-container{width:100%}.table-container.loading{opacity:.6;pointer-events:none}.empty-state{padding:2rem;text-align:center;color:var(--vbn-color-text-muted)}\n"] }]
53
+ }], ctorParameters: () => [{ type: i1.UserFacade }], propDecorators: { users: [{
54
+ type: Input
55
+ }], columns: [{
56
+ type: Input
57
+ }], isLoading: [{
58
+ type: Input
59
+ }], formGroupConfig: [{
60
+ type: Input
61
+ }], view: [{
62
+ type: Output
63
+ }], delete: [{
64
+ type: Output
65
+ }], saveRow: [{
66
+ type: Output
67
+ }] } });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1tYW5hZ2VtZW50LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvdXNlci1tYW5hZ2VtZW50L3VzZXItbWFuYWdlbWVudC10YWJsZS91c2VyLW1hbmFnZW1lbnQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LXRhYmxlL3VzZXItbWFuYWdlbWVudC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZFLE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGNBQWMsRUFFZCxTQUFTLEVBQ1Qsa0JBQWtCLEdBQ25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7QUFFNUY7O0dBRUc7QUFnQkgsTUFBTSxPQUFPLDRCQUE0QjtJQWNwQjtJQWJuQixTQUFTLEdBQUcsU0FBUyxDQUEyQixrQkFBa0IsQ0FBQyxDQUFDO0lBRTNELEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsT0FBTyxHQUE2QixFQUFFLENBQUM7SUFDdkMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixlQUFlLENBQXdCO0lBRXRDLElBQUksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ2hDLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ2xDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRTdDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpDLFlBQW1CLE1BQWtCO1FBQWxCLFdBQU0sR0FBTixNQUFNLENBQVk7SUFBRyxDQUFDO0lBRXpDLE1BQU0sQ0FBQyxJQUFVO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFVO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBbUU7UUFDNUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUssRUFBVyxDQUFDO1FBQ3pELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO3dHQTNCVSw0QkFBNEI7NEZBQTVCLDRCQUE0Qiw2U0FDUyxrQkFBa0IsZ0VDbkNwRSxzZ0hBOEVBLDZORHZESSxZQUFZLDBPQUNaLG1CQUFtQix5VEFDbkIsZUFBZSwrWkFDZixTQUFTLDJLQUNULGNBQWMsZ21CQUNkLGtCQUFrQixxcUJBQ2xCLHdCQUF3Qjs7NEZBS2YsNEJBQTRCO2tCQWZ4QyxTQUFTOytCQUNFLDJCQUEyQixjQUN6QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsU0FBUzt3QkFDVCxjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIsd0JBQXdCO3FCQUN6QjsrRUFPUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFSSxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN0YXR1cywgVXNlciB9IGZyb20gJ3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQge1xuICBDb2x1bW5EZWZpbml0aW9uLFxuICBEYXRhVGFibGVDb21wb25lbnQsXG4gIERhdGFUYWJsZU1vZHVsZSxcbiAgRHJvcERvd25Nb2R1bGUsXG4gIEZvcm1Hcm91cENvbmZpZyxcbiAgU3ZnTW9kdWxlLFxuICBWZXJiZW5hSW5wdXRNb2R1bGUsXG59IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBVc2VyRmFjYWRlIH0gZnJvbSAnLi4vdXNlci5mYWNhZGUnO1xuaW1wb3J0IHsgVXNlclN0YXR1c0JhZGdlQ29tcG9uZW50IH0gZnJvbSAnLi4vdXNlci1zdGF0dXMtYmFkZ2UvdXNlci1zdGF0dXMtYmFkZ2UuY29tcG9uZW50JztcblxuLyoqXG4gKiBUYWJsZSB2aWV3IGZvciB1c2VycyB3aXRoIGlubGluZSByb3cgZWRpdGluZy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXVzZXItbWFuYWdlbWVudC10YWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBEYXRhVGFibGVNb2R1bGUsXG4gICAgU3ZnTW9kdWxlLFxuICAgIERyb3BEb3duTW9kdWxlLFxuICAgIFZlcmJlbmFJbnB1dE1vZHVsZSxcbiAgICBVc2VyU3RhdHVzQmFkZ2VDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLW1hbmFnZW1lbnQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLW1hbmFnZW1lbnQtdGFibGUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyTWFuYWdlbWVudFRhYmxlQ29tcG9uZW50IHtcbiAgdGFibGVWaWV3ID0gdmlld0NoaWxkPERhdGFUYWJsZUNvbXBvbmVudDxVc2VyPj4oRGF0YVRhYmxlQ29tcG9uZW50KTtcblxuICBASW5wdXQoKSB1c2VyczogVXNlcltdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IENvbHVtbkRlZmluaXRpb248VXNlcj5bXSA9IFtdO1xuICBASW5wdXQoKSBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgZm9ybUdyb3VwQ29uZmlnPzogRm9ybUdyb3VwQ29uZmlnPGFueT47XG5cbiAgQE91dHB1dCgpIHZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXI+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXI+KCk7XG4gIEBPdXRwdXQoKSBzYXZlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxVc2VyPigpO1xuXG4gIHN0YXR1c2VzID0gT2JqZWN0LnZhbHVlcyhTdGF0dXMpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBmYWNhZGU6IFVzZXJGYWNhZGUpIHt9XG5cbiAgb25WaWV3KHVzZXI6IFVzZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXcuZW1pdCh1c2VyKTtcbiAgfVxuXG4gIG9uRGVsZXRlKHVzZXI6IFVzZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZS5lbWl0KHVzZXIpO1xuICB9XG5cbiAgb25Sb3dTYXZlZChldmVudDogeyBpbmRleDogbnVtYmVyOyBrZXk6IG51bWJlciB8IHN0cmluZzsgZGF0YTogUGFydGlhbDxVc2VyPiB9KTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLnVzZXJzW2V2ZW50LmluZGV4XSA/PyAoe30gYXMgVXNlcik7XG4gICAgdGhpcy5zYXZlUm93LmVtaXQoeyAuLi5vcmlnaW5hbCwgLi4uZXZlbnQuZGF0YSB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiIFtjbGFzcy5sb2FkaW5nXT1cImlzTG9hZGluZ1wiPlxuICA8bGliLWRhdGEtdGFibGUgW2RhdGFdPVwidXNlcnNcIiBbY29sdW1uc109XCJjb2x1bW5zXCIgW2Zvcm1Hcm91cENvbmZpZ109XCJmb3JtR3JvdXBDb25maWdcIiBkYXRhS2V5PVwiQ29kZVwiXG4gICAgKHJvd1NhdmUpPVwib25Sb3dTYXZlZCgkZXZlbnQpXCI+XG4gICAgPCEtLSBTZWxlY3QgLS0+XG4gICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzZWxlY3RcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIiBsZXQtdG9nZ2xlUm93U2VsZWN0aW9uPVwidG9nZ2xlUm93U2VsZWN0aW9uXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkXCIgKGNoYW5nZSk9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oKVwiIC8+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBDcmVhdGVkIC0tPlxuICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiY3JlYXRlZEF0XCI+XG4gICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPnt7IHZhbHVlIHwgZGF0ZSB9fTwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE1haWwgLS0+XG4gICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJtYWlsXCI+XG4gICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPnt7IHZhbHVlIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbEVkaXQgbGV0LWNvbnRyb2w9XCJjb250cm9sXCI+XG4gICAgICAgIDx2ZXJiZW5hLWlucHV0IG5hbWU9XCJNYWlsQWRkcmVzc1wiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgcGxhY2VIb2xkZXI9XCJFbnRlciBFLU1haWxcIiAvPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gUGhvbmUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJwaG9uZVwiPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT57eyB2YWx1ZSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgI2NlbGxFZGl0IGxldC1jb250cm9sPVwiY29udHJvbFwiPlxuICAgICAgICA8dmVyYmVuYS1pbnB1dCBuYW1lPVwiUGhvbmVOdW1iZXJcIiBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIHBsYWNlSG9sZGVyPVwiRW50ZXIgUGhvbmUgTnVtYmVyXCIgLz5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFJvbGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJyb2xlXCI+XG4gICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPnt7IGZhY2FkZS5nZXRSb2xlTmFtZSh2YWx1ZSkgfHwgJ04vQScgfX08L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsRWRpdCBsZXQtY29udHJvbD1cImNvbnRyb2xcIj5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd24gW3dpZHRoXT1cIicxMDAlJ1wiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgcGxhY2VIb2xkZXI9XCJTZWxlY3QgUm9sZVwiXG4gICAgICAgICAgW29wdGlvbnNdPVwiKGZhY2FkZS5yb2xlcyQgfCBhc3luYykgPz8gW11cIiBvcHRpb25MYWJlbD1cIk5hbWVcIiBvcHRpb25WYWx1ZT1cIkNvZGVcIiBbZmlsdGVyXT1cInRydWVcIlxuICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiPjwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFN0YXR1cyAtLT5cbiAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInN0YXR1c1wiPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgPGxpYi11c2VyLXN0YXR1cy1iYWRnZSBbc3RhdHVzXT1cInZhbHVlXCI+PC9saWItdXNlci1zdGF0dXMtYmFkZ2U+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsRWRpdCBsZXQtY29udHJvbD1cImNvbnRyb2xcIj5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd24gW3dpZHRoXT1cIicxMDAlJ1wiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCIgcGxhY2VIb2xkZXI9XCJTZWxlY3QgU3RhdHVzXCIgW29wdGlvbnNdPVwic3RhdHVzZXNcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cImZhbHNlXCI+PC92ZXJiZW4tZHJvcC1kb3duPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gQWN0aW9ucyAtLT5cbiAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImFjdGlvbnNcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtcm93PVwicm93XCIgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC02XCI+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgKGNsaWNrKT1cInRvZ2dsZVJvd0VkaXQoKVwiIGljb249XCJlZGl0XCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDx2ZXJiZW4tc3ZnIChjbGljayk9XCJvblZpZXcocm93KVwiIGljb249XCJleWVcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyAoY2xpY2spPVwib25EZWxldGUocm93KVwiIGljb249XCJkZWxldGVcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbEVkaXQgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC02XCI+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgKGNsaWNrKT1cInRvZ2dsZVJvd0VkaXQoKVwiIGljb249XCJ0aWNrXCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDx2ZXJiZW4tc3ZnIChjbGljayk9XCJ0b2dnbGVSb3dFZGl0KClcIiBpY29uPVwiZGVsZXRlXCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbGliLWRhdGEtdGFibGU+XG5cbiAgPGRpdiAqbmdJZj1cInVzZXJzLmxlbmd0aCA9PT0gMCAmJiAhaXNMb2FkaW5nXCIgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPlxuICAgIDxwPk5vIHVzZXJzIGZvdW5kPC9wPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19