@memberjunction/ng-explorer-settings 2.70.0 → 2.72.0

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 (38) hide show
  1. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts +60 -0
  2. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -0
  3. package/dist/lib/application-management/application-dialog/application-dialog.component.js +584 -0
  4. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -0
  5. package/dist/lib/application-management/application-management.component.d.ts +4 -2
  6. package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
  7. package/dist/lib/application-management/application-management.component.js +79 -35
  8. package/dist/lib/application-management/application-management.component.js.map +1 -1
  9. package/dist/lib/entity-permissions/entity-permissions.component.d.ts +3 -1
  10. package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
  11. package/dist/lib/entity-permissions/entity-permissions.component.js +43 -66
  12. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  13. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts +50 -0
  14. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -0
  15. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +464 -0
  16. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -0
  17. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts +38 -0
  18. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -0
  19. package/dist/lib/role-management/role-dialog/role-dialog.component.js +329 -0
  20. package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -0
  21. package/dist/lib/role-management/role-management.component.d.ts +4 -0
  22. package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
  23. package/dist/lib/role-management/role-management.component.js +114 -72
  24. package/dist/lib/role-management/role-management.component.js.map +1 -1
  25. package/dist/lib/settings/settings.component.js +8 -8
  26. package/dist/lib/settings/settings.component.js.map +1 -1
  27. package/dist/lib/shared/components/settings-card/settings-card.component.d.ts.map +1 -1
  28. package/dist/lib/shared/components/settings-card/settings-card.component.js +11 -8
  29. package/dist/lib/shared/components/settings-card/settings-card.component.js.map +1 -1
  30. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts +44 -0
  31. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -0
  32. package/dist/lib/user-management/user-dialog/user-dialog.component.js +470 -0
  33. package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -0
  34. package/dist/lib/user-management/user-management.component.d.ts +9 -0
  35. package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
  36. package/dist/lib/user-management/user-management.component.js +213 -98
  37. package/dist/lib/user-management/user-management.component.js.map +1 -1
  38. package/package.json +13 -13
@@ -0,0 +1,470 @@
1
+ import { Component, Input, Output, EventEmitter, inject, HostListener, ViewEncapsulation } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule, ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';
4
+ import { Metadata, RunView } from '@memberjunction/core';
5
+ import { WindowModule } from '@progress/kendo-angular-dialog';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "@progress/kendo-angular-dialog";
10
+ const _forTrack0 = ($index, $item) => $item.ID;
11
+ function UserDialogComponent_kendo_window_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
12
+ i0.ɵɵelementStart(0, "div", 8)(1, "div", 45);
13
+ i0.ɵɵelement(2, "i", 46);
14
+ i0.ɵɵelementStart(3, "div");
15
+ i0.ɵɵtext(4);
16
+ i0.ɵɵelementEnd()()();
17
+ } if (rf & 2) {
18
+ const ctx_r1 = i0.ɵɵnextContext(2);
19
+ i0.ɵɵadvance(4);
20
+ i0.ɵɵtextInterpolate(ctx_r1.error);
21
+ } }
22
+ function UserDialogComponent_kendo_window_0_Conditional_24_Conditional_2_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵtext(0, " Username/Email is required ");
24
+ } }
25
+ function UserDialogComponent_kendo_window_0_Conditional_24_Conditional_3_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵtext(0, " Please enter a valid email address ");
27
+ } }
28
+ function UserDialogComponent_kendo_window_0_Conditional_24_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelementStart(0, "div", 18);
30
+ i0.ɵɵelement(1, "i", 47);
31
+ i0.ɵɵtemplate(2, UserDialogComponent_kendo_window_0_Conditional_24_Conditional_2_Template, 1, 0)(3, UserDialogComponent_kendo_window_0_Conditional_24_Conditional_3_Template, 1, 0);
32
+ i0.ɵɵelementEnd();
33
+ } if (rf & 2) {
34
+ let tmp_2_0;
35
+ let tmp_3_0;
36
+ const ctx_r1 = i0.ɵɵnextContext(2);
37
+ i0.ɵɵadvance(2);
38
+ i0.ɵɵconditional(((tmp_2_0 = ctx_r1.userForm.get("name")) == null ? null : tmp_2_0.errors == null ? null : tmp_2_0.errors["required"]) ? 2 : -1);
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵconditional(((tmp_3_0 = ctx_r1.userForm.get("name")) == null ? null : tmp_3_0.errors == null ? null : tmp_3_0.errors["email"]) ? 3 : -1);
41
+ } }
42
+ function UserDialogComponent_kendo_window_0_Conditional_38_Conditional_2_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵtext(0, " Email address is required ");
44
+ } }
45
+ function UserDialogComponent_kendo_window_0_Conditional_38_Conditional_3_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵtext(0, " Please enter a valid email address ");
47
+ } }
48
+ function UserDialogComponent_kendo_window_0_Conditional_38_Template(rf, ctx) { if (rf & 1) {
49
+ i0.ɵɵelementStart(0, "div", 18);
50
+ i0.ɵɵelement(1, "i", 47);
51
+ i0.ɵɵtemplate(2, UserDialogComponent_kendo_window_0_Conditional_38_Conditional_2_Template, 1, 0)(3, UserDialogComponent_kendo_window_0_Conditional_38_Conditional_3_Template, 1, 0);
52
+ i0.ɵɵelementEnd();
53
+ } if (rf & 2) {
54
+ let tmp_2_0;
55
+ let tmp_3_0;
56
+ const ctx_r1 = i0.ɵɵnextContext(2);
57
+ i0.ɵɵadvance(2);
58
+ i0.ɵɵconditional(((tmp_2_0 = ctx_r1.userForm.get("email")) == null ? null : tmp_2_0.errors == null ? null : tmp_2_0.errors["required"]) ? 2 : -1);
59
+ i0.ɵɵadvance();
60
+ i0.ɵɵconditional(((tmp_3_0 = ctx_r1.userForm.get("email")) == null ? null : tmp_3_0.errors == null ? null : tmp_3_0.errors["email"]) ? 3 : -1);
61
+ } }
62
+ function UserDialogComponent_kendo_window_0_For_81_Conditional_9_Template(rf, ctx) { if (rf & 1) {
63
+ i0.ɵɵelementStart(0, "p", 54);
64
+ i0.ɵɵtext(1);
65
+ i0.ɵɵelementEnd();
66
+ } if (rf & 2) {
67
+ const role_r4 = i0.ɵɵnextContext().$implicit;
68
+ i0.ɵɵadvance();
69
+ i0.ɵɵtextInterpolate(role_r4.Description);
70
+ } }
71
+ function UserDialogComponent_kendo_window_0_For_81_Template(rf, ctx) { if (rf & 1) {
72
+ const _r3 = i0.ɵɵgetCurrentView();
73
+ i0.ɵɵelementStart(0, "div", 48);
74
+ i0.ɵɵlistener("click", function UserDialogComponent_kendo_window_0_For_81_Template_div_click_0_listener() { const role_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleRole(role_r4.ID)); });
75
+ i0.ɵɵelementStart(1, "div", 49)(2, "div", 33)(3, "input", 50);
76
+ i0.ɵɵlistener("change", function UserDialogComponent_kendo_window_0_For_81_Template_input_change_3_listener($event) { const role_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onRoleToggle(role_r4.ID, $event)); });
77
+ i0.ɵɵelementEnd();
78
+ i0.ɵɵelementStart(4, "label", 51);
79
+ i0.ɵɵelement(5, "div", 36);
80
+ i0.ɵɵelementEnd()();
81
+ i0.ɵɵelementStart(6, "div", 52)(7, "h4", 53);
82
+ i0.ɵɵtext(8);
83
+ i0.ɵɵelementEnd();
84
+ i0.ɵɵtemplate(9, UserDialogComponent_kendo_window_0_For_81_Conditional_9_Template, 2, 1, "p", 54);
85
+ i0.ɵɵelementEnd()()();
86
+ } if (rf & 2) {
87
+ const role_r4 = ctx.$implicit;
88
+ const ctx_r1 = i0.ɵɵnextContext(2);
89
+ i0.ɵɵclassProp("selected", ctx_r1.selectedRoleIds.has(role_r4.ID));
90
+ i0.ɵɵadvance(3);
91
+ i0.ɵɵproperty("id", "role-" + role_r4.ID)("checked", ctx_r1.selectedRoleIds.has(role_r4.ID));
92
+ i0.ɵɵadvance();
93
+ i0.ɵɵproperty("for", "role-" + role_r4.ID);
94
+ i0.ɵɵadvance(4);
95
+ i0.ɵɵtextInterpolate(role_r4.Name);
96
+ i0.ɵɵadvance();
97
+ i0.ɵɵconditional(role_r4.Description ? 9 : -1);
98
+ } }
99
+ function UserDialogComponent_kendo_window_0_Conditional_87_Template(rf, ctx) { if (rf & 1) {
100
+ i0.ɵɵelement(0, "i", 55);
101
+ i0.ɵɵtext(1, " Saving... ");
102
+ } }
103
+ function UserDialogComponent_kendo_window_0_Conditional_88_Template(rf, ctx) { if (rf & 1) {
104
+ i0.ɵɵelement(0, "i", 56);
105
+ i0.ɵɵtext(1);
106
+ } if (rf & 2) {
107
+ const ctx_r1 = i0.ɵɵnextContext(2);
108
+ i0.ɵɵadvance();
109
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.isEditMode ? "Update User" : "Create User", " ");
110
+ } }
111
+ function UserDialogComponent_kendo_window_0_Template(rf, ctx) { if (rf & 1) {
112
+ const _r1 = i0.ɵɵgetCurrentView();
113
+ i0.ɵɵelementStart(0, "kendo-window", 1);
114
+ i0.ɵɵlistener("close", function UserDialogComponent_kendo_window_0_Template_kendo_window_close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
115
+ i0.ɵɵelementStart(1, "kendo-window-titlebar")(2, "div", 2)(3, "h2", 3);
116
+ i0.ɵɵelement(4, "i", 4);
117
+ i0.ɵɵtext(5);
118
+ i0.ɵɵelementEnd();
119
+ i0.ɵɵelementStart(6, "p", 5);
120
+ i0.ɵɵtext(7);
121
+ i0.ɵɵelementEnd()()();
122
+ i0.ɵɵelementStart(8, "div", 6)(9, "form", 7);
123
+ i0.ɵɵlistener("ngSubmit", function UserDialogComponent_kendo_window_0_Template_form_ngSubmit_9_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSubmit()); });
124
+ i0.ɵɵtemplate(10, UserDialogComponent_kendo_window_0_Conditional_10_Template, 5, 1, "div", 8);
125
+ i0.ɵɵelementStart(11, "div", 8)(12, "div", 9)(13, "div", 10)(14, "h3", 11);
126
+ i0.ɵɵelement(15, "i", 12);
127
+ i0.ɵɵtext(16, " Basic Information ");
128
+ i0.ɵɵelementEnd();
129
+ i0.ɵɵelementStart(17, "p", 13);
130
+ i0.ɵɵtext(18, "Enter the user's personal and contact details");
131
+ i0.ɵɵelementEnd()();
132
+ i0.ɵɵelementStart(19, "div", 14)(20, "div", 15)(21, "label", 16);
133
+ i0.ɵɵtext(22, "Username/Email");
134
+ i0.ɵɵelementEnd();
135
+ i0.ɵɵelement(23, "input", 17);
136
+ i0.ɵɵtemplate(24, UserDialogComponent_kendo_window_0_Conditional_24_Template, 4, 2, "div", 18);
137
+ i0.ɵɵelementEnd();
138
+ i0.ɵɵelementStart(25, "div", 19)(26, "div", 15)(27, "label", 20);
139
+ i0.ɵɵtext(28, "First Name");
140
+ i0.ɵɵelementEnd();
141
+ i0.ɵɵelement(29, "input", 21);
142
+ i0.ɵɵelementEnd();
143
+ i0.ɵɵelementStart(30, "div", 15)(31, "label", 22);
144
+ i0.ɵɵtext(32, "Last Name");
145
+ i0.ɵɵelementEnd();
146
+ i0.ɵɵelement(33, "input", 23);
147
+ i0.ɵɵelementEnd()();
148
+ i0.ɵɵelementStart(34, "div", 15)(35, "label", 24);
149
+ i0.ɵɵtext(36, "Email Address");
150
+ i0.ɵɵelementEnd();
151
+ i0.ɵɵelement(37, "input", 25);
152
+ i0.ɵɵtemplate(38, UserDialogComponent_kendo_window_0_Conditional_38_Template, 4, 2, "div", 18);
153
+ i0.ɵɵelementEnd();
154
+ i0.ɵɵelementStart(39, "div", 15)(40, "label", 26);
155
+ i0.ɵɵtext(41, "Job Title");
156
+ i0.ɵɵelementEnd();
157
+ i0.ɵɵelement(42, "input", 27);
158
+ i0.ɵɵelementEnd()()()();
159
+ i0.ɵɵelementStart(43, "div", 8)(44, "div", 9)(45, "div", 10)(46, "h3", 11);
160
+ i0.ɵɵelement(47, "i", 28);
161
+ i0.ɵɵtext(48, " User Settings ");
162
+ i0.ɵɵelementEnd();
163
+ i0.ɵɵelementStart(49, "p", 13);
164
+ i0.ɵɵtext(50, "Configure user type and account status");
165
+ i0.ɵɵelementEnd()();
166
+ i0.ɵɵelementStart(51, "div", 14)(52, "div", 19)(53, "div", 15)(54, "label", 29);
167
+ i0.ɵɵtext(55, "User Type");
168
+ i0.ɵɵelementEnd();
169
+ i0.ɵɵelementStart(56, "select", 30)(57, "option", 31);
170
+ i0.ɵɵtext(58, "Standard User");
171
+ i0.ɵɵelementEnd();
172
+ i0.ɵɵelementStart(59, "option", 32);
173
+ i0.ɵɵtext(60, "System Owner");
174
+ i0.ɵɵelementEnd()()();
175
+ i0.ɵɵelementStart(61, "div", 15)(62, "div", 33);
176
+ i0.ɵɵelement(63, "input", 34);
177
+ i0.ɵɵelementStart(64, "label", 35);
178
+ i0.ɵɵelement(65, "div", 36);
179
+ i0.ɵɵelementStart(66, "div")(67, "strong");
180
+ i0.ɵɵtext(68, "Active Account");
181
+ i0.ɵɵelementEnd();
182
+ i0.ɵɵelementStart(69, "div", 37);
183
+ i0.ɵɵtext(70, " User can log in and access the system ");
184
+ i0.ɵɵelementEnd()()()()()()()()();
185
+ i0.ɵɵelementStart(71, "div", 8)(72, "div", 9)(73, "div", 10)(74, "h3", 11);
186
+ i0.ɵɵelement(75, "i", 38);
187
+ i0.ɵɵtext(76, " Role Assignment ");
188
+ i0.ɵɵelementEnd();
189
+ i0.ɵɵelementStart(77, "p", 13);
190
+ i0.ɵɵtext(78, "Select the roles to assign to this user");
191
+ i0.ɵɵelementEnd()();
192
+ i0.ɵɵelementStart(79, "div", 39);
193
+ i0.ɵɵrepeaterCreate(80, UserDialogComponent_kendo_window_0_For_81_Template, 10, 7, "div", 40, _forTrack0);
194
+ i0.ɵɵelementEnd()()();
195
+ i0.ɵɵelementStart(82, "div", 41)(83, "button", 42);
196
+ i0.ɵɵlistener("click", function UserDialogComponent_kendo_window_0_Template_button_click_83_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
197
+ i0.ɵɵelement(84, "i", 43);
198
+ i0.ɵɵtext(85, " Cancel ");
199
+ i0.ɵɵelementEnd();
200
+ i0.ɵɵelementStart(86, "button", 44);
201
+ i0.ɵɵtemplate(87, UserDialogComponent_kendo_window_0_Conditional_87_Template, 2, 0)(88, UserDialogComponent_kendo_window_0_Conditional_88_Template, 2, 1);
202
+ i0.ɵɵelementEnd()()()()();
203
+ } if (rf & 2) {
204
+ let tmp_10_0;
205
+ let tmp_11_0;
206
+ let tmp_12_0;
207
+ let tmp_13_0;
208
+ const ctx_r1 = i0.ɵɵnextContext();
209
+ i0.ɵɵproperty("width", 850)("height", 700)("resizable", false)("draggable", true)("keepContent", true);
210
+ i0.ɵɵadvance(5);
211
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.isEditMode ? "Edit User" : "Create New User", " ");
212
+ i0.ɵɵadvance(2);
213
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.isEditMode ? "Update user information and role assignments" : "Add a new user to the system", " ");
214
+ i0.ɵɵadvance(2);
215
+ i0.ɵɵproperty("formGroup", ctx_r1.userForm);
216
+ i0.ɵɵadvance();
217
+ i0.ɵɵconditional(ctx_r1.error ? 10 : -1);
218
+ i0.ɵɵadvance(13);
219
+ i0.ɵɵclassProp("error", ((tmp_10_0 = ctx_r1.userForm.get("name")) == null ? null : tmp_10_0.invalid) && ((tmp_10_0 = ctx_r1.userForm.get("name")) == null ? null : tmp_10_0.touched));
220
+ i0.ɵɵadvance();
221
+ i0.ɵɵconditional(((tmp_11_0 = ctx_r1.userForm.get("name")) == null ? null : tmp_11_0.invalid) && ((tmp_11_0 = ctx_r1.userForm.get("name")) == null ? null : tmp_11_0.touched) ? 24 : -1);
222
+ i0.ɵɵadvance(13);
223
+ i0.ɵɵclassProp("error", ((tmp_12_0 = ctx_r1.userForm.get("email")) == null ? null : tmp_12_0.invalid) && ((tmp_12_0 = ctx_r1.userForm.get("email")) == null ? null : tmp_12_0.touched));
224
+ i0.ɵɵadvance();
225
+ i0.ɵɵconditional(((tmp_13_0 = ctx_r1.userForm.get("email")) == null ? null : tmp_13_0.invalid) && ((tmp_13_0 = ctx_r1.userForm.get("email")) == null ? null : tmp_13_0.touched) ? 38 : -1);
226
+ i0.ɵɵadvance(42);
227
+ i0.ɵɵrepeater(ctx_r1.data == null ? null : ctx_r1.data.availableRoles);
228
+ i0.ɵɵadvance(6);
229
+ i0.ɵɵproperty("disabled", ctx_r1.userForm.invalid || ctx_r1.isLoading);
230
+ i0.ɵɵadvance();
231
+ i0.ɵɵconditional(ctx_r1.isLoading ? 87 : 88);
232
+ } }
233
+ export class UserDialogComponent {
234
+ data = null;
235
+ visible = false;
236
+ result = new EventEmitter();
237
+ fb = inject(FormBuilder);
238
+ metadata = new Metadata();
239
+ userForm;
240
+ isLoading = false;
241
+ error = null;
242
+ selectedRoleIds = new Set();
243
+ existingUserRoles = [];
244
+ constructor() {
245
+ this.userForm = this.fb.group({
246
+ name: ['', [Validators.required, Validators.email]],
247
+ firstName: [''],
248
+ lastName: [''],
249
+ email: ['', [Validators.required, Validators.email]],
250
+ title: [''],
251
+ type: ['User', Validators.required],
252
+ isActive: [true]
253
+ });
254
+ }
255
+ ngOnInit() {
256
+ // Initial setup
257
+ }
258
+ ngOnChanges(changes) {
259
+ // Always clear state when data changes to prevent persistence bugs
260
+ if (changes['data']) {
261
+ this.selectedRoleIds.clear();
262
+ this.existingUserRoles = [];
263
+ if (this.data?.user && this.isEditMode) {
264
+ this.loadUserData();
265
+ }
266
+ else {
267
+ this.resetForm();
268
+ }
269
+ }
270
+ // Reset form when dialog becomes visible and not in edit mode
271
+ if (changes['visible'] && this.visible && !this.isEditMode) {
272
+ this.resetForm();
273
+ }
274
+ }
275
+ ngOnDestroy() {
276
+ // Cleanup if needed
277
+ }
278
+ resetForm() {
279
+ this.userForm.reset({
280
+ name: '',
281
+ firstName: '',
282
+ lastName: '',
283
+ email: '',
284
+ title: '',
285
+ type: 'User',
286
+ isActive: true
287
+ });
288
+ this.selectedRoleIds.clear();
289
+ this.error = null;
290
+ }
291
+ onEscapeKey(event) {
292
+ if (this.visible) {
293
+ this.onCancel();
294
+ }
295
+ }
296
+ get windowTitle() {
297
+ return this.isEditMode ? 'Edit User' : 'Create New User';
298
+ }
299
+ get isEditMode() {
300
+ return this.data?.mode === 'edit';
301
+ }
302
+ async loadUserData() {
303
+ if (!this.data?.user)
304
+ return;
305
+ const user = this.data.user;
306
+ this.userForm.patchValue({
307
+ name: user.Name,
308
+ firstName: user.FirstName,
309
+ lastName: user.LastName,
310
+ email: user.Email,
311
+ title: user.Title,
312
+ type: user.Type,
313
+ isActive: user.IsActive
314
+ });
315
+ // Load existing user roles
316
+ await this.loadExistingUserRoles(user.ID);
317
+ }
318
+ async loadExistingUserRoles(userId) {
319
+ try {
320
+ const rv = new RunView();
321
+ const result = await rv.RunView({
322
+ EntityName: 'User Roles',
323
+ ExtraFilter: `UserID='${userId}'`,
324
+ ResultType: 'entity_object'
325
+ });
326
+ if (result.Success && result.Results) {
327
+ this.existingUserRoles = result.Results;
328
+ // Pre-select existing roles
329
+ for (const userRole of this.existingUserRoles) {
330
+ this.selectedRoleIds.add(userRole.RoleID);
331
+ }
332
+ }
333
+ }
334
+ catch (error) {
335
+ console.warn('Failed to load existing user roles:', error);
336
+ }
337
+ }
338
+ onRoleToggle(roleId, event) {
339
+ event.stopPropagation();
340
+ const checkbox = event.target;
341
+ if (checkbox.checked) {
342
+ this.selectedRoleIds.add(roleId);
343
+ }
344
+ else {
345
+ this.selectedRoleIds.delete(roleId);
346
+ }
347
+ }
348
+ toggleRole(roleId) {
349
+ if (this.selectedRoleIds.has(roleId)) {
350
+ this.selectedRoleIds.delete(roleId);
351
+ }
352
+ else {
353
+ this.selectedRoleIds.add(roleId);
354
+ }
355
+ }
356
+ async onSubmit() {
357
+ if (this.userForm.invalid) {
358
+ this.markFormGroupTouched(this.userForm);
359
+ return;
360
+ }
361
+ this.isLoading = true;
362
+ this.error = null;
363
+ try {
364
+ let user;
365
+ if (this.isEditMode && this.data?.user) {
366
+ // Edit existing user
367
+ user = this.data.user;
368
+ }
369
+ else {
370
+ // Create new user
371
+ user = await this.metadata.GetEntityObject('Users');
372
+ user.NewRecord();
373
+ }
374
+ // Update user properties
375
+ const formValue = this.userForm.value;
376
+ user.Name = formValue.name;
377
+ user.FirstName = formValue.firstName;
378
+ user.LastName = formValue.lastName;
379
+ user.Email = formValue.email;
380
+ user.Title = formValue.title;
381
+ user.Type = formValue.type;
382
+ user.IsActive = formValue.isActive;
383
+ // Save user
384
+ const saveResult = await user.Save();
385
+ if (!saveResult) {
386
+ throw new Error(user.LatestResult?.Message || 'Failed to save user');
387
+ }
388
+ // Handle role assignments
389
+ await this.updateUserRoles(user.ID);
390
+ this.result.emit({ action: 'save', user });
391
+ }
392
+ catch (error) {
393
+ console.error('Error saving user:', error);
394
+ this.error = error.message || 'An unexpected error occurred';
395
+ }
396
+ finally {
397
+ this.isLoading = false;
398
+ }
399
+ }
400
+ async updateUserRoles(userId) {
401
+ try {
402
+ // Get current role IDs from existing UserRole entities
403
+ const existingRoleIds = new Set(this.existingUserRoles.map(ur => ur.RoleID));
404
+ // Determine roles to add and remove
405
+ const rolesToAdd = Array.from(this.selectedRoleIds).filter(roleId => !existingRoleIds.has(roleId));
406
+ const rolesToRemove = this.existingUserRoles.filter(userRole => !this.selectedRoleIds.has(userRole.RoleID));
407
+ // Remove unselected roles
408
+ for (const userRole of rolesToRemove) {
409
+ try {
410
+ await userRole.Delete();
411
+ }
412
+ catch (error) {
413
+ console.warn('Failed to remove role:', userRole.RoleID, error);
414
+ }
415
+ }
416
+ // Add new selected roles
417
+ for (const roleId of rolesToAdd) {
418
+ try {
419
+ const userRole = await this.metadata.GetEntityObject('User Roles');
420
+ userRole.NewRecord();
421
+ userRole.UserID = userId;
422
+ userRole.RoleID = roleId;
423
+ const saveResult = await userRole.Save();
424
+ if (!saveResult) {
425
+ console.warn('Failed to assign role:', roleId, userRole.LatestResult?.Message);
426
+ }
427
+ }
428
+ catch (error) {
429
+ console.warn('Failed to assign role:', roleId, error);
430
+ }
431
+ }
432
+ }
433
+ catch (error) {
434
+ console.error('Error updating user roles:', error);
435
+ throw error;
436
+ }
437
+ }
438
+ onCancel() {
439
+ this.result.emit({ action: 'cancel' });
440
+ }
441
+ markFormGroupTouched(formGroup) {
442
+ Object.keys(formGroup.controls).forEach(key => {
443
+ const control = formGroup.get(key);
444
+ control?.markAsTouched();
445
+ });
446
+ }
447
+ static ɵfac = function UserDialogComponent_Factory(t) { return new (t || UserDialogComponent)(); };
448
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserDialogComponent, selectors: [["mj-user-dialog"]], hostBindings: function UserDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
449
+ i0.ɵɵlistener("keydown.escape", function UserDialogComponent_keydown_escape_HostBindingHandler($event) { return ctx.onEscapeKey($event); }, false, i0.ɵɵresolveDocument);
450
+ } }, inputs: { data: "data", visible: "visible" }, outputs: { result: "result" }, standalone: true, features: [i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature], decls: 1, vars: 1, consts: [["kendoWindowContainer", "", 3, "width", "height", "resizable", "draggable", "keepContent", "close", 4, "ngIf"], ["kendoWindowContainer", "", 3, "close", "width", "height", "resizable", "draggable", "keepContent"], [1, "dialog-header"], [1, "dialog-title"], [1, "fa-solid", "fa-user"], [1, "dialog-subtitle"], [1, "dialog-content"], [3, "ngSubmit", "formGroup"], [1, "content-section"], [1, "form-section"], [1, "section-header"], [1, "section-title"], [1, "fa-solid", "fa-id-card"], [1, "section-description"], [1, "form-grid"], [1, "form-field"], ["for", "name", 1, "field-label", "required"], ["id", "name", "type", "email", "formControlName", "name", "placeholder", "john@company.com", 1, "field-input"], [1, "field-error"], [1, "form-row"], ["for", "firstName", 1, "field-label"], ["id", "firstName", "type", "text", "formControlName", "firstName", "placeholder", "John", 1, "field-input"], ["for", "lastName", 1, "field-label"], ["id", "lastName", "type", "text", "formControlName", "lastName", "placeholder", "Doe", 1, "field-input"], ["for", "email", 1, "field-label", "required"], ["id", "email", "type", "email", "formControlName", "email", "placeholder", "john@company.com", 1, "field-input"], ["for", "title", 1, "field-label"], ["id", "title", "type", "text", "formControlName", "title", "placeholder", "Software Engineer", 1, "field-input"], [1, "fa-solid", "fa-cog"], ["for", "type", 1, "field-label"], ["id", "type", "formControlName", "type", 1, "field-select"], ["value", "User"], ["value", "Owner"], [1, "checkbox-field"], ["id", "isActive", "type", "checkbox", "formControlName", "isActive", 1, "checkbox-input"], ["for", "isActive", 1, "checkbox-label"], [1, "checkbox-indicator"], [2, "font-size", "12px", "color", "#666", "margin-top", "2px"], [1, "fa-solid", "fa-user-tag"], [1, "roles-grid"], [1, "role-card", 3, "selected"], [1, "dialog-footer"], ["type", "button", 1, "btn", "btn-secondary", 3, "click"], [1, "fa-solid", "fa-times"], ["type", "submit", 1, "btn", "btn-primary", 3, "disabled"], [1, "alert", "alert-error"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "fa-solid", "fa-exclamation-circle"], [1, "role-card", 3, "click"], [1, "role-content"], ["type", "checkbox", 1, "checkbox-input", 3, "change", "id", "checked"], [1, "checkbox-label", 3, "for"], [1, "role-info"], [1, "role-name"], [1, "role-description"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-save"]], template: function UserDialogComponent_Template(rf, ctx) { if (rf & 1) {
451
+ i0.ɵɵtemplate(0, UserDialogComponent_kendo_window_0_Template, 89, 17, "kendo-window", 0);
452
+ } if (rf & 2) {
453
+ i0.ɵɵproperty("ngIf", ctx.visible);
454
+ } }, dependencies: [CommonModule, i1.NgIf, FormsModule, i2.ɵNgNoValidate, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgControlStatusGroup, ReactiveFormsModule, i2.FormGroupDirective, i2.FormControlName, WindowModule, i3.WindowComponent, i3.WindowTitleBarComponent, i3.WindowContainerDirective], styles: ["/* Modern Dialog Styling - Matching Dashboard Design */\n:host ::ng-deep .k-window {\n border: none;\n border-radius: 12px;\n box-shadow: 0 19px 38px rgba(0, 0, 0, 0.30), 0 15px 12px rgba(0, 0, 0, 0.22);\n background: #ffffff;\n overflow: hidden;\n}\n\n:host ::ng-deep .k-window-titlebar {\n background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%);\n border: none;\n padding: 24px 32px;\n min-height: 70px;\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-title {\n display: none; /* Hide default title */\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-actions {\n position: absolute;\n top: 24px;\n right: 24px;\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-actions .k-button {\n background: rgba(255, 255, 255, 0.1);\n border: 1px solid rgba(255, 255, 255, 0.2);\n color: #ffffff;\n border-radius: 6px;\n width: 32px;\n height: 32px;\n min-width: auto;\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-actions .k-button:hover {\n background: rgba(255, 255, 255, 0.2);\n border-color: rgba(255, 255, 255, 0.3);\n}\n\n:host ::ng-deep .k-window-content {\n padding: 0;\n background: #ffffff;\n}\n\n/* Custom Title Bar */\n.dialog-header {\n position: relative;\n color: #ffffff;\n}\n\n.dialog-header .dialog-title {\n font-size: 18px;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 16px;\n margin: 0;\n}\n\n.dialog-header .dialog-title i {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 6px;\n font-size: 14px;\n}\n\n.dialog-header .dialog-subtitle {\n margin: 4px 0 0 0;\n font-size: 12px;\n opacity: 0.85;\n font-weight: 400;\n}\n\n/* Modal Content Areas */\n.dialog-content {\n padding: 0;\n background: #ffffff;\n}\n\n.dialog-content .content-section {\n padding: 32px;\n}\n\n.dialog-content .content-section:not(:last-child) {\n border-bottom: 1px solid #e0e0e0;\n}\n\n.dialog-footer {\n padding: 24px 32px;\n background: #fafafa;\n border-top: 1px solid #e0e0e0;\n display: flex;\n justify-content: flex-end;\n gap: 16px;\n}\n\n/* Form Sections */\n.form-section .section-header {\n margin-bottom: 24px;\n}\n\n.form-section .section-header .section-title {\n font-size: 16px;\n font-weight: 600;\n color: #212121;\n margin: 0 0 4px 0;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-section .section-header .section-title i {\n color: #2196f3;\n font-size: 14px;\n}\n\n.form-section .section-header .section-description {\n font-size: 12px;\n color: #666666;\n margin: 0;\n}\n\n.form-grid {\n display: grid;\n gap: 24px;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n}\n\n@media (max-width: 640px) {\n .form-row {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n}\n\n/* Modern Form Fields */\n.form-field {\n margin-bottom: 24px;\n}\n\n.form-field:last-child {\n margin-bottom: 0;\n}\n\n.form-field .field-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #212121;\n margin-bottom: 8px;\n}\n\n.form-field .field-label.required::after {\n content: ' *';\n color: #f44336;\n}\n\n.form-field .field-input,\n.form-field .field-select {\n width: 100%;\n height: 36px;\n padding: 0 16px;\n border: 1px solid #bdbdbd;\n border-radius: 6px;\n font-size: 14px;\n background: #ffffff;\n transition: all 0.15s ease;\n}\n\n.form-field .field-input:focus,\n.form-field .field-select:focus {\n outline: none;\n border-color: #2196f3;\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n}\n\n.form-field .field-input.error,\n.form-field .field-select.error {\n border-color: #f44336;\n}\n\n.form-field .field-input.error:focus,\n.form-field .field-select.error:focus {\n border-color: #f44336;\n box-shadow: 0 0 0 3px rgba(244, 67, 54, 0.1);\n}\n\n.form-field .field-input::placeholder,\n.form-field .field-select::placeholder {\n color: #9e9e9e;\n}\n\n.form-field .field-select {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23666' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 16px center;\n background-repeat: no-repeat;\n background-size: 16px;\n padding-right: calc(16px + 24px);\n appearance: none;\n cursor: pointer;\n}\n\n.form-field .field-error {\n margin-top: 8px;\n font-size: 11px;\n color: #f44336;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.form-field .field-error i {\n font-size: 10px;\n}\n\n/* Modern Checkbox Fields */\n.checkbox-field {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n margin-bottom: 24px;\n cursor: pointer;\n}\n\n.checkbox-field .checkbox-input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n}\n\n.checkbox-field .checkbox-input:checked + .checkbox-label .checkbox-indicator {\n background: #2196f3;\n border-color: #2196f3;\n}\n\n.checkbox-field .checkbox-input:checked + .checkbox-label .checkbox-indicator::after {\n opacity: 1;\n transform: rotate(45deg) scale(1);\n}\n\n.checkbox-field .checkbox-input:focus + .checkbox-label .checkbox-indicator {\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n}\n\n.checkbox-field .checkbox-label {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n cursor: pointer;\n font-size: 14px;\n color: #212121;\n line-height: 1.4;\n margin: 0;\n}\n\n.checkbox-field .checkbox-indicator {\n width: 20px;\n height: 20px;\n border: 2px solid #bdbdbd;\n border-radius: 4px;\n background: #ffffff;\n flex-shrink: 0;\n position: relative;\n transition: all 0.15s ease;\n margin-top: 1px;\n}\n\n.checkbox-field .checkbox-indicator::after {\n content: '';\n position: absolute;\n left: 6px;\n top: 2px;\n width: 4px;\n height: 8px;\n border: solid #ffffff;\n border-width: 0 2px 2px 0;\n opacity: 0;\n transform: rotate(45deg) scale(0.8);\n transition: all 0.15s ease;\n}\n\n/* Role Assignment Section */\n.roles-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n\n@media (max-width: 640px) {\n .roles-grid {\n grid-template-columns: 1fr;\n }\n}\n\n.role-card {\n padding: 24px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n background: #fafafa;\n transition: all 0.2s ease;\n cursor: pointer;\n}\n\n.role-card:hover {\n border-color: rgba(33, 150, 243, 0.2);\n background: #ffffff;\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.2);\n transform: translateY(-1px);\n}\n\n.role-card.selected {\n border-color: #2196f3;\n background: #e3f2fd;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);\n}\n\n.role-card .role-content {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n}\n\n.role-card .role-info {\n flex: 1;\n min-width: 0;\n}\n\n.role-card .role-info .role-name {\n font-size: 14px;\n font-weight: 500;\n color: #212121;\n margin: 0 0 4px 0;\n line-height: 1.2;\n}\n\n.role-card .role-info .role-description {\n font-size: 12px;\n color: #666666;\n line-height: 1.4;\n margin: 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Alert Messages */\n.alert {\n padding: 16px 24px;\n border-radius: 8px;\n margin-bottom: 24px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n}\n\n.alert i {\n font-size: 16px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.alert.alert-error {\n background: rgba(244, 67, 54, 0.1);\n border: 1px solid rgba(244, 67, 54, 0.2);\n color: #c62828;\n}\n\n.alert.alert-error i {\n color: #f44336;\n}\n\n/* Button Styles */\n.dialog-footer .btn {\n padding: 8px 24px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n min-height: 36px;\n}\n\n.dialog-footer .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.dialog-footer .btn:disabled i.fa-spinner {\n animation: spin 1s linear infinite;\n}\n\n.dialog-footer .btn.btn-secondary {\n background: #ffffff;\n color: #666666;\n border-color: #bdbdbd;\n}\n\n.dialog-footer .btn.btn-secondary:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #757575;\n color: #212121;\n}\n\n.dialog-footer .btn.btn-primary {\n background: #2196f3;\n color: #ffffff;\n}\n\n.dialog-footer .btn.btn-primary:hover:not(:disabled) {\n background: #1976d2;\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.2);\n transform: translateY(-1px);\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n :host ::ng-deep .k-window {\n margin: 16px;\n max-width: none;\n width: calc(100vw - 24px) !important;\n height: calc(100vh - 24px) !important;\n }\n \n :host ::ng-deep .k-window-titlebar {\n padding: 16px 24px;\n min-height: 60px;\n }\n \n .dialog-content .content-section {\n padding: 24px 16px;\n }\n \n .dialog-footer {\n padding: 16px 24px;\n flex-direction: column-reverse;\n }\n \n .dialog-footer .btn {\n width: 100%;\n justify-content: center;\n }\n \n .roles-grid {\n grid-template-columns: 1fr;\n }\n}"], encapsulation: 2 });
455
+ }
456
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserDialogComponent, [{
457
+ type: Component,
458
+ args: [{ selector: 'mj-user-dialog', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule, WindowModule], encapsulation: ViewEncapsulation.None, template: "<kendo-window\n *ngIf=\"visible\"\n [width]=\"850\"\n [height]=\"700\"\n [resizable]=\"false\"\n [draggable]=\"true\"\n [keepContent]=\"true\"\n (close)=\"onCancel()\"\n kendoWindowContainer>\n \n <kendo-window-titlebar>\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">\n <i class=\"fa-solid fa-user\"></i>\n {{ isEditMode ? 'Edit User' : 'Create New User' }}\n </h2>\n <p class=\"dialog-subtitle\">\n {{ isEditMode ? 'Update user information and role assignments' : 'Add a new user to the system' }}\n </p>\n </div>\n </kendo-window-titlebar>\n\n <div class=\"dialog-content\">\n <form [formGroup]=\"userForm\" (ngSubmit)=\"onSubmit()\">\n \n @if (error) {\n <div class=\"content-section\">\n <div class=\"alert alert-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div>{{ error }}</div>\n </div>\n </div>\n }\n\n <!-- Basic Information Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-id-card\"></i>\n Basic Information\n </h3>\n <p class=\"section-description\">Enter the user's personal and contact details</p>\n </div>\n \n <div class=\"form-grid\">\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"name\">Username/Email</label>\n <input \n id=\"name\"\n type=\"email\" \n class=\"field-input\" \n formControlName=\"name\"\n placeholder=\"john@company.com\"\n [class.error]=\"userForm.get('name')?.invalid && userForm.get('name')?.touched\"\n />\n @if (userForm.get('name')?.invalid && userForm.get('name')?.touched) {\n <div class=\"field-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n @if (userForm.get('name')?.errors?.['required']) {\n Username/Email is required\n }\n @if (userForm.get('name')?.errors?.['email']) {\n Please enter a valid email address\n }\n </div>\n }\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"firstName\">First Name</label>\n <input \n id=\"firstName\"\n type=\"text\" \n class=\"field-input\" \n formControlName=\"firstName\"\n placeholder=\"John\"\n />\n </div>\n \n <div class=\"form-field\">\n <label class=\"field-label\" for=\"lastName\">Last Name</label>\n <input \n id=\"lastName\"\n type=\"text\" \n class=\"field-input\" \n formControlName=\"lastName\"\n placeholder=\"Doe\"\n />\n </div>\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"email\">Email Address</label>\n <input \n id=\"email\"\n type=\"email\" \n class=\"field-input\" \n formControlName=\"email\"\n placeholder=\"john@company.com\"\n [class.error]=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\"\n />\n @if (userForm.get('email')?.invalid && userForm.get('email')?.touched) {\n <div class=\"field-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n @if (userForm.get('email')?.errors?.['required']) {\n Email address is required\n }\n @if (userForm.get('email')?.errors?.['email']) {\n Please enter a valid email address\n }\n </div>\n }\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"title\">Job Title</label>\n <input \n id=\"title\"\n type=\"text\" \n class=\"field-input\" \n formControlName=\"title\"\n placeholder=\"Software Engineer\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <!-- User Settings Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n User Settings\n </h3>\n <p class=\"section-description\">Configure user type and account status</p>\n </div>\n \n <div class=\"form-grid\">\n <div class=\"form-row\">\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"type\">User Type</label>\n <select id=\"type\" class=\"field-select\" formControlName=\"type\">\n <option value=\"User\">Standard User</option>\n <option value=\"Owner\">System Owner</option>\n </select>\n </div>\n \n <div class=\"form-field\">\n <div class=\"checkbox-field\">\n <input \n id=\"isActive\"\n type=\"checkbox\" \n class=\"checkbox-input\" \n formControlName=\"isActive\"\n />\n <label class=\"checkbox-label\" for=\"isActive\">\n <div class=\"checkbox-indicator\"></div>\n <div>\n <strong>Active Account</strong>\n <div style=\"font-size: 12px; color: #666; margin-top: 2px;\">\n User can log in and access the system\n </div>\n </div>\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Role Assignment Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user-tag\"></i>\n Role Assignment\n </h3>\n <p class=\"section-description\">Select the roles to assign to this user</p>\n </div>\n \n <div class=\"roles-grid\">\n @for (role of data?.availableRoles; track role.ID) {\n <div class=\"role-card\" \n [class.selected]=\"selectedRoleIds.has(role.ID)\"\n (click)=\"toggleRole(role.ID)\">\n <div class=\"role-content\">\n <div class=\"checkbox-field\">\n <input \n type=\"checkbox\" \n class=\"checkbox-input\" \n [id]=\"'role-' + role.ID\"\n [checked]=\"selectedRoleIds.has(role.ID)\"\n (change)=\"onRoleToggle(role.ID, $event)\"\n />\n <label class=\"checkbox-label\" [for]=\"'role-' + role.ID\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n <div class=\"role-info\">\n <h4 class=\"role-name\">{{ role.Name }}</h4>\n @if (role.Description) {\n <p class=\"role-description\">{{ role.Description }}</p>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <div class=\"dialog-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n Cancel\n </button>\n <button \n type=\"submit\" \n class=\"btn btn-primary\" \n [disabled]=\"userForm.invalid || isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n {{ isEditMode ? 'Update User' : 'Create User' }}\n }\n </button>\n </div>\n </form>\n </div>\n</kendo-window>", styles: ["/* Modern Dialog Styling - Matching Dashboard Design */\n:host ::ng-deep .k-window {\n border: none;\n border-radius: 12px;\n box-shadow: 0 19px 38px rgba(0, 0, 0, 0.30), 0 15px 12px rgba(0, 0, 0, 0.22);\n background: #ffffff;\n overflow: hidden;\n}\n\n:host ::ng-deep .k-window-titlebar {\n background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%);\n border: none;\n padding: 24px 32px;\n min-height: 70px;\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-title {\n display: none; /* Hide default title */\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-actions {\n position: absolute;\n top: 24px;\n right: 24px;\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-actions .k-button {\n background: rgba(255, 255, 255, 0.1);\n border: 1px solid rgba(255, 255, 255, 0.2);\n color: #ffffff;\n border-radius: 6px;\n width: 32px;\n height: 32px;\n min-width: auto;\n}\n\n:host ::ng-deep .k-window-titlebar .k-window-actions .k-button:hover {\n background: rgba(255, 255, 255, 0.2);\n border-color: rgba(255, 255, 255, 0.3);\n}\n\n:host ::ng-deep .k-window-content {\n padding: 0;\n background: #ffffff;\n}\n\n/* Custom Title Bar */\n.dialog-header {\n position: relative;\n color: #ffffff;\n}\n\n.dialog-header .dialog-title {\n font-size: 18px;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 16px;\n margin: 0;\n}\n\n.dialog-header .dialog-title i {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 6px;\n font-size: 14px;\n}\n\n.dialog-header .dialog-subtitle {\n margin: 4px 0 0 0;\n font-size: 12px;\n opacity: 0.85;\n font-weight: 400;\n}\n\n/* Modal Content Areas */\n.dialog-content {\n padding: 0;\n background: #ffffff;\n}\n\n.dialog-content .content-section {\n padding: 32px;\n}\n\n.dialog-content .content-section:not(:last-child) {\n border-bottom: 1px solid #e0e0e0;\n}\n\n.dialog-footer {\n padding: 24px 32px;\n background: #fafafa;\n border-top: 1px solid #e0e0e0;\n display: flex;\n justify-content: flex-end;\n gap: 16px;\n}\n\n/* Form Sections */\n.form-section .section-header {\n margin-bottom: 24px;\n}\n\n.form-section .section-header .section-title {\n font-size: 16px;\n font-weight: 600;\n color: #212121;\n margin: 0 0 4px 0;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-section .section-header .section-title i {\n color: #2196f3;\n font-size: 14px;\n}\n\n.form-section .section-header .section-description {\n font-size: 12px;\n color: #666666;\n margin: 0;\n}\n\n.form-grid {\n display: grid;\n gap: 24px;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n}\n\n@media (max-width: 640px) {\n .form-row {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n}\n\n/* Modern Form Fields */\n.form-field {\n margin-bottom: 24px;\n}\n\n.form-field:last-child {\n margin-bottom: 0;\n}\n\n.form-field .field-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #212121;\n margin-bottom: 8px;\n}\n\n.form-field .field-label.required::after {\n content: ' *';\n color: #f44336;\n}\n\n.form-field .field-input,\n.form-field .field-select {\n width: 100%;\n height: 36px;\n padding: 0 16px;\n border: 1px solid #bdbdbd;\n border-radius: 6px;\n font-size: 14px;\n background: #ffffff;\n transition: all 0.15s ease;\n}\n\n.form-field .field-input:focus,\n.form-field .field-select:focus {\n outline: none;\n border-color: #2196f3;\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n}\n\n.form-field .field-input.error,\n.form-field .field-select.error {\n border-color: #f44336;\n}\n\n.form-field .field-input.error:focus,\n.form-field .field-select.error:focus {\n border-color: #f44336;\n box-shadow: 0 0 0 3px rgba(244, 67, 54, 0.1);\n}\n\n.form-field .field-input::placeholder,\n.form-field .field-select::placeholder {\n color: #9e9e9e;\n}\n\n.form-field .field-select {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23666' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 16px center;\n background-repeat: no-repeat;\n background-size: 16px;\n padding-right: calc(16px + 24px);\n appearance: none;\n cursor: pointer;\n}\n\n.form-field .field-error {\n margin-top: 8px;\n font-size: 11px;\n color: #f44336;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.form-field .field-error i {\n font-size: 10px;\n}\n\n/* Modern Checkbox Fields */\n.checkbox-field {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n margin-bottom: 24px;\n cursor: pointer;\n}\n\n.checkbox-field .checkbox-input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n}\n\n.checkbox-field .checkbox-input:checked + .checkbox-label .checkbox-indicator {\n background: #2196f3;\n border-color: #2196f3;\n}\n\n.checkbox-field .checkbox-input:checked + .checkbox-label .checkbox-indicator::after {\n opacity: 1;\n transform: rotate(45deg) scale(1);\n}\n\n.checkbox-field .checkbox-input:focus + .checkbox-label .checkbox-indicator {\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n}\n\n.checkbox-field .checkbox-label {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n cursor: pointer;\n font-size: 14px;\n color: #212121;\n line-height: 1.4;\n margin: 0;\n}\n\n.checkbox-field .checkbox-indicator {\n width: 20px;\n height: 20px;\n border: 2px solid #bdbdbd;\n border-radius: 4px;\n background: #ffffff;\n flex-shrink: 0;\n position: relative;\n transition: all 0.15s ease;\n margin-top: 1px;\n}\n\n.checkbox-field .checkbox-indicator::after {\n content: '';\n position: absolute;\n left: 6px;\n top: 2px;\n width: 4px;\n height: 8px;\n border: solid #ffffff;\n border-width: 0 2px 2px 0;\n opacity: 0;\n transform: rotate(45deg) scale(0.8);\n transition: all 0.15s ease;\n}\n\n/* Role Assignment Section */\n.roles-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n\n@media (max-width: 640px) {\n .roles-grid {\n grid-template-columns: 1fr;\n }\n}\n\n.role-card {\n padding: 24px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n background: #fafafa;\n transition: all 0.2s ease;\n cursor: pointer;\n}\n\n.role-card:hover {\n border-color: rgba(33, 150, 243, 0.2);\n background: #ffffff;\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.2);\n transform: translateY(-1px);\n}\n\n.role-card.selected {\n border-color: #2196f3;\n background: #e3f2fd;\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);\n}\n\n.role-card .role-content {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n}\n\n.role-card .role-info {\n flex: 1;\n min-width: 0;\n}\n\n.role-card .role-info .role-name {\n font-size: 14px;\n font-weight: 500;\n color: #212121;\n margin: 0 0 4px 0;\n line-height: 1.2;\n}\n\n.role-card .role-info .role-description {\n font-size: 12px;\n color: #666666;\n line-height: 1.4;\n margin: 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Alert Messages */\n.alert {\n padding: 16px 24px;\n border-radius: 8px;\n margin-bottom: 24px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n}\n\n.alert i {\n font-size: 16px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.alert.alert-error {\n background: rgba(244, 67, 54, 0.1);\n border: 1px solid rgba(244, 67, 54, 0.2);\n color: #c62828;\n}\n\n.alert.alert-error i {\n color: #f44336;\n}\n\n/* Button Styles */\n.dialog-footer .btn {\n padding: 8px 24px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n min-height: 36px;\n}\n\n.dialog-footer .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.dialog-footer .btn:disabled i.fa-spinner {\n animation: spin 1s linear infinite;\n}\n\n.dialog-footer .btn.btn-secondary {\n background: #ffffff;\n color: #666666;\n border-color: #bdbdbd;\n}\n\n.dialog-footer .btn.btn-secondary:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #757575;\n color: #212121;\n}\n\n.dialog-footer .btn.btn-primary {\n background: #2196f3;\n color: #ffffff;\n}\n\n.dialog-footer .btn.btn-primary:hover:not(:disabled) {\n background: #1976d2;\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.2);\n transform: translateY(-1px);\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n :host ::ng-deep .k-window {\n margin: 16px;\n max-width: none;\n width: calc(100vw - 24px) !important;\n height: calc(100vh - 24px) !important;\n }\n \n :host ::ng-deep .k-window-titlebar {\n padding: 16px 24px;\n min-height: 60px;\n }\n \n .dialog-content .content-section {\n padding: 24px 16px;\n }\n \n .dialog-footer {\n padding: 16px 24px;\n flex-direction: column-reverse;\n }\n \n .dialog-footer .btn {\n width: 100%;\n justify-content: center;\n }\n \n .roles-grid {\n grid-template-columns: 1fr;\n }\n}"] }]
459
+ }], () => [], { data: [{
460
+ type: Input
461
+ }], visible: [{
462
+ type: Input
463
+ }], result: [{
464
+ type: Output
465
+ }], onEscapeKey: [{
466
+ type: HostListener,
467
+ args: ['document:keydown.escape', ['$event']]
468
+ }] }); })();
469
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserDialogComponent, { className: "UserDialogComponent", filePath: "src/lib/user-management/user-dialog/user-dialog.component.ts", lineNumber: 27 }); })();
470
+ //# sourceMappingURL=user-dialog.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/user-management/user-dialog/user-dialog.component.ts","../../../../src/lib/user-management/user-dialog/user-dialog.component.html"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { OnInit, OnDestroy } from '@angular/core';
2
2
  import { BehaviorSubject } from 'rxjs';
3
3
  import { UserEntity, RoleEntity } from '@memberjunction/core-entities';
4
+ import { UserDialogData, UserDialogResult } from './user-dialog/user-dialog.component';
4
5
  import * as i0 from "@angular/core";
5
6
  interface UserStats {
6
7
  totalUsers: number;
@@ -20,24 +21,30 @@ export declare class UserManagementComponent implements OnInit, OnDestroy {
20
21
  selectedUser: UserEntity | null;
21
22
  isLoading: boolean;
22
23
  error: string | null;
24
+ showUserDialog: boolean;
25
+ userDialogData: UserDialogData | null;
23
26
  stats: UserStats;
24
27
  filters$: BehaviorSubject<FilterOptions>;
25
28
  showCreateDialog: boolean;
26
29
  showEditDialog: boolean;
27
30
  showDeleteConfirm: boolean;
28
31
  viewMode: 'grid' | 'cards';
32
+ private userRoleMap;
29
33
  gridConfig: {
30
34
  pageSize: number;
31
35
  sortField: string;
32
36
  sortDirection: string;
33
37
  };
34
38
  private destroy$;
39
+ private metadata;
35
40
  constructor();
36
41
  ngOnInit(): void;
37
42
  ngOnDestroy(): void;
38
43
  loadInitialData(): Promise<void>;
39
44
  private loadUsers;
40
45
  private loadRoles;
46
+ private loadUserRoles;
47
+ private buildUserRoleMapping;
41
48
  private setupFilterSubscription;
42
49
  private applyFilters;
43
50
  private calculateStats;
@@ -53,11 +60,13 @@ export declare class UserManagementComponent implements OnInit, OnDestroy {
53
60
  toggleUserStatus(user: UserEntity): Promise<void>;
54
61
  toggleViewMode(): void;
55
62
  exportUsers(): void;
63
+ private escapeCSV;
56
64
  refreshData(): void;
57
65
  getStatusIcon(user: UserEntity): string;
58
66
  getStatusClass(user: UserEntity): string;
59
67
  getUserTypeIcon(user: UserEntity): string;
60
68
  getUserInitials(user: UserEntity): string;
69
+ onUserDialogResult(result: UserDialogResult): void;
61
70
  static ɵfac: i0.ɵɵFactoryDeclaration<UserManagementComponent, never>;
62
71
  static ɵcmp: i0.ɵɵComponentDeclaration<UserManagementComponent, "mj-user-management", never, {}, {}, never, never, true, never>;
63
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"user-management.component.d.ts","sourceRoot":"","sources":["../../../src/lib/user-management/user-management.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AAGxE,OAAO,EAAW,eAAe,EAAiB,MAAM,MAAM,CAAC;AAG/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;;AAGvE,UAAU,SAAS;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAWa,uBAAwB,YAAW,MAAM,EAAE,SAAS;IAGxD,KAAK,EAAE,UAAU,EAAE,CAAM;IACzB,aAAa,EAAE,UAAU,EAAE,CAAM;IACjC,KAAK,EAAE,UAAU,EAAE,CAAM;IACzB,YAAY,EAAE,UAAU,GAAG,IAAI,CAAQ;IACvC,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,KAAK,EAAE,SAAS,CAKrB;IAGK,QAAQ,iCAIZ;IAGI,gBAAgB,UAAS;IACzB,cAAc,UAAS;IACvB,iBAAiB,UAAS;IAC1B,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAU;IAGpC,UAAU;;;;MAIf;IAEF,OAAO,CAAC,QAAQ,CAAuB;;IAIvC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKN,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;YAwB/B,SAAS;YAUT,SAAS;IAWvB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,cAAc;IAUf,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKlC,oBAAoB,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI;IAIjE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAOnD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKlC,aAAa,IAAI,IAAI;IAKrB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKhC,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKnC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,cAAc,IAAI,IAAI;IAItB,WAAW,IAAI,IAAI;IAKnB,WAAW,IAAI,IAAI;IAInB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIvC,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIxC,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAWzC,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;yCAtPrC,uBAAuB;2CAAvB,uBAAuB;CA2PnC"}
1
+ {"version":3,"file":"user-management.component.d.ts","sourceRoot":"","sources":["../../../src/lib/user-management/user-management.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AAGxE,OAAO,EAAW,eAAe,EAAiB,MAAM,MAAM,CAAC;AAG/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,+BAA+B,CAAC;AAEvF,OAAO,EAAuB,cAAc,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;;AAG5G,UAAU,SAAS;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAaa,uBAAwB,YAAW,MAAM,EAAE,SAAS;IAGxD,KAAK,EAAE,UAAU,EAAE,CAAM;IACzB,aAAa,EAAE,UAAU,EAAE,CAAM;IACjC,KAAK,EAAE,UAAU,EAAE,CAAM;IACzB,YAAY,EAAE,UAAU,GAAG,IAAI,CAAQ;IACvC,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,cAAc,UAAS;IACvB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAQ;IAG7C,KAAK,EAAE,SAAS,CAKrB;IAGK,QAAQ,iCAIZ;IAGI,gBAAgB,UAAS;IACzB,cAAc,UAAS;IACvB,iBAAiB,UAAS;IAC1B,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAU;IAG3C,OAAO,CAAC,WAAW,CAA+B;IAG3C,UAAU;;;;MAIf;IAEF,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAkB;;IAIlC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKN,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;YA6B/B,SAAS;YAUT,SAAS;YAWT,aAAa;IAU3B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,cAAc;IAUf,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKlC,oBAAoB,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI;IAIjE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAOnD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKlC,aAAa,IAAI,IAAI;IAQrB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAShC,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKnC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,cAAc,IAAI,IAAI;IAItB,WAAW,IAAI,IAAI;IA8C1B,OAAO,CAAC,SAAS;IAOV,WAAW,IAAI,IAAI;IAInB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIvC,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIxC,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAWzC,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAMzC,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;yCAxW9C,uBAAuB;2CAAvB,uBAAuB;CAiXnC"}