@memberjunction/ng-explorer-settings 2.50.0 → 2.51.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 (66) hide show
  1. package/README.md +89 -1
  2. package/dist/lib/application-management/application-management.component.d.ts +59 -0
  3. package/dist/lib/application-management/application-management.component.d.ts.map +1 -0
  4. package/dist/lib/application-management/application-management.component.js +540 -0
  5. package/dist/lib/application-management/application-management.component.js.map +1 -0
  6. package/dist/lib/entity-permissions/entity-permissions.component.d.ts +71 -0
  7. package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -0
  8. package/dist/lib/entity-permissions/entity-permissions.component.js +667 -0
  9. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -0
  10. package/dist/lib/module.d.ts +19 -23
  11. package/dist/lib/module.d.ts.map +1 -1
  12. package/dist/lib/module.js +13 -38
  13. package/dist/lib/module.js.map +1 -1
  14. package/dist/lib/role-management/role-management.component.d.ts +56 -0
  15. package/dist/lib/role-management/role-management.component.d.ts.map +1 -0
  16. package/dist/lib/role-management/role-management.component.js +464 -0
  17. package/dist/lib/role-management/role-management.component.js.map +1 -0
  18. package/dist/lib/settings/settings.component.d.ts +42 -51
  19. package/dist/lib/settings/settings.component.d.ts.map +1 -1
  20. package/dist/lib/settings/settings.component.js +432 -198
  21. package/dist/lib/settings/settings.component.js.map +1 -1
  22. package/dist/lib/shared/components/settings-card/settings-card.component.d.ts +27 -0
  23. package/dist/lib/shared/components/settings-card/settings-card.component.d.ts.map +1 -0
  24. package/dist/lib/shared/components/settings-card/settings-card.component.js +167 -0
  25. package/dist/lib/shared/components/settings-card/settings-card.component.js.map +1 -0
  26. package/dist/lib/shared/settings-card.component.d.ts +11 -0
  27. package/dist/lib/shared/settings-card.component.d.ts.map +1 -0
  28. package/dist/lib/shared/settings-card.component.js +73 -0
  29. package/dist/lib/shared/settings-card.component.js.map +1 -0
  30. package/dist/lib/shared/shared-settings.module.d.ts +9 -0
  31. package/dist/lib/shared/shared-settings.module.d.ts.map +1 -0
  32. package/dist/lib/shared/shared-settings.module.js +25 -0
  33. package/dist/lib/shared/shared-settings.module.js.map +1 -0
  34. package/dist/lib/sql-logging/sql-logging.component.d.ts +176 -0
  35. package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -0
  36. package/dist/lib/sql-logging/sql-logging.component.js +946 -0
  37. package/dist/lib/sql-logging/sql-logging.component.js.map +1 -0
  38. package/dist/lib/user-management/user-management.component.d.ts +65 -0
  39. package/dist/lib/user-management/user-management.component.d.ts.map +1 -0
  40. package/dist/lib/user-management/user-management.component.js +643 -0
  41. package/dist/lib/user-management/user-management.component.js.map +1 -0
  42. package/dist/public-api.d.ts +1 -5
  43. package/dist/public-api.d.ts.map +1 -1
  44. package/dist/public-api.js +1 -5
  45. package/dist/public-api.js.map +1 -1
  46. package/package.json +13 -13
  47. package/dist/lib/application-entities-grid/application-entities-grid.component.d.ts +0 -50
  48. package/dist/lib/application-entities-grid/application-entities-grid.component.d.ts.map +0 -1
  49. package/dist/lib/application-entities-grid/application-entities-grid.component.js +0 -342
  50. package/dist/lib/application-entities-grid/application-entities-grid.component.js.map +0 -1
  51. package/dist/lib/single-application/single-application.component.d.ts +0 -22
  52. package/dist/lib/single-application/single-application.component.d.ts.map +0 -1
  53. package/dist/lib/single-application/single-application.component.js +0 -130
  54. package/dist/lib/single-application/single-application.component.js.map +0 -1
  55. package/dist/lib/single-role/single-role.component.d.ts +0 -36
  56. package/dist/lib/single-role/single-role.component.d.ts.map +0 -1
  57. package/dist/lib/single-role/single-role.component.js +0 -188
  58. package/dist/lib/single-role/single-role.component.js.map +0 -1
  59. package/dist/lib/single-user/single-user.component.d.ts +0 -24
  60. package/dist/lib/single-user/single-user.component.d.ts.map +0 -1
  61. package/dist/lib/single-user/single-user.component.js +0 -176
  62. package/dist/lib/single-user/single-user.component.js.map +0 -1
  63. package/dist/lib/user-roles-grid/user-roles-grid.component.d.ts +0 -42
  64. package/dist/lib/user-roles-grid/user-roles-grid.component.d.ts.map +0 -1
  65. package/dist/lib/user-roles-grid/user-roles-grid.component.js +0 -326
  66. package/dist/lib/user-roles-grid/user-roles-grid.component.js.map +0 -1
@@ -0,0 +1,540 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { Subject, BehaviorSubject } from 'rxjs';
5
+ import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
6
+ import { RunView, Metadata } from '@memberjunction/core';
7
+ import { SharedSettingsModule } from '../shared/shared-settings.module';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ const _forTrack0 = ($index, $item) => $item.ID;
11
+ function ApplicationManagementComponent_Conditional_56_Template(rf, ctx) { if (rf & 1) {
12
+ i0.ɵɵelementStart(0, "div", 28)(1, "div", 32);
13
+ i0.ɵɵelement(2, "div", 33)(3, "div", 33)(4, "div", 33);
14
+ i0.ɵɵelementEnd();
15
+ i0.ɵɵelementStart(5, "div", 34);
16
+ i0.ɵɵtext(6, "Loading applications...");
17
+ i0.ɵɵelementEnd()();
18
+ } }
19
+ function ApplicationManagementComponent_Conditional_57_Template(rf, ctx) { if (rf & 1) {
20
+ const _r1 = i0.ɵɵgetCurrentView();
21
+ i0.ɵɵelementStart(0, "div", 29)(1, "div", 35);
22
+ i0.ɵɵelement(2, "i", 36);
23
+ i0.ɵɵelementStart(3, "p", 37);
24
+ i0.ɵɵtext(4);
25
+ i0.ɵɵelementEnd();
26
+ i0.ɵɵelementStart(5, "button", 38);
27
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_57_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadInitialData()); });
28
+ i0.ɵɵelement(6, "i", 3);
29
+ i0.ɵɵtext(7, " Try Again ");
30
+ i0.ɵɵelementEnd()()();
31
+ } if (rf & 2) {
32
+ const ctx_r1 = i0.ɵɵnextContext();
33
+ i0.ɵɵadvance(4);
34
+ i0.ɵɵtextInterpolate(ctx_r1.error);
35
+ } }
36
+ function ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_For_2_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelementStart(0, "span", 70);
38
+ i0.ɵɵtext(1, "Public");
39
+ i0.ɵɵelementEnd();
40
+ } }
41
+ function ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 68);
43
+ i0.ɵɵtext(2);
44
+ i0.ɵɵelementEnd();
45
+ i0.ɵɵelementStart(3, "div", 69);
46
+ i0.ɵɵtemplate(4, ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_For_2_Conditional_0_Conditional_4_Template, 2, 0, "span", 70);
47
+ i0.ɵɵelementStart(5, "span", 71);
48
+ i0.ɵɵtext(6);
49
+ i0.ɵɵelementEnd()()();
50
+ } if (rf & 2) {
51
+ const appEntity_r5 = i0.ɵɵnextContext().$implicit;
52
+ i0.ɵɵadvance(2);
53
+ i0.ɵɵtextInterpolate(ctx.Name);
54
+ i0.ɵɵadvance(2);
55
+ i0.ɵɵconditional(appEntity_r5.DefaultForNewUser ? 4 : -1);
56
+ i0.ɵɵadvance(2);
57
+ i0.ɵɵtextInterpolate1("Order: ", appEntity_r5.Sequence, "");
58
+ } }
59
+ function ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_For_2_Template(rf, ctx) { if (rf & 1) {
60
+ i0.ɵɵtemplate(0, ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_For_2_Conditional_0_Template, 7, 3, "div", 67);
61
+ } if (rf & 2) {
62
+ let tmp_23_0;
63
+ const appEntity_r5 = ctx.$implicit;
64
+ const ctx_r1 = i0.ɵɵnextContext(5);
65
+ i0.ɵɵconditional((tmp_23_0 = ctx_r1.getEntityInfo(appEntity_r5.EntityID)) ? 0 : -1, tmp_23_0);
66
+ } }
67
+ function ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "div", 65);
69
+ i0.ɵɵrepeaterCreate(1, ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_For_2_Template, 1, 1, null, null, _forTrack0);
70
+ i0.ɵɵelementEnd();
71
+ } if (rf & 2) {
72
+ const app_r4 = i0.ɵɵnextContext(2).$implicit;
73
+ const ctx_r1 = i0.ɵɵnextContext(2);
74
+ i0.ɵɵadvance();
75
+ i0.ɵɵrepeater(ctx_r1.getAppEntities(app_r4.ID));
76
+ } }
77
+ function ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_27_Template(rf, ctx) { if (rf & 1) {
78
+ i0.ɵɵelementStart(0, "p", 66);
79
+ i0.ɵɵtext(1, "No entities configured for this application");
80
+ i0.ɵɵelementEnd();
81
+ } }
82
+ function ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Template(rf, ctx) { if (rf & 1) {
83
+ i0.ɵɵelementStart(0, "div", 58)(1, "div", 59)(2, "div", 60);
84
+ i0.ɵɵelement(3, "i", 16);
85
+ i0.ɵɵelementStart(4, "span", 12);
86
+ i0.ɵɵtext(5, "Entities:");
87
+ i0.ɵɵelementEnd();
88
+ i0.ɵɵelementStart(6, "span", 11);
89
+ i0.ɵɵtext(7);
90
+ i0.ɵɵelementEnd()();
91
+ i0.ɵɵelementStart(8, "div", 60);
92
+ i0.ɵɵelement(9, "i", 61);
93
+ i0.ɵɵelementStart(10, "span", 12);
94
+ i0.ɵɵtext(11, "Created:");
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵelementStart(12, "span", 11);
97
+ i0.ɵɵtext(13);
98
+ i0.ɵɵpipe(14, "date");
99
+ i0.ɵɵelementEnd()();
100
+ i0.ɵɵelementStart(15, "div", 60);
101
+ i0.ɵɵelement(16, "i", 62);
102
+ i0.ɵɵelementStart(17, "span", 12);
103
+ i0.ɵɵtext(18, "Updated:");
104
+ i0.ɵɵelementEnd();
105
+ i0.ɵɵelementStart(19, "span", 11);
106
+ i0.ɵɵtext(20);
107
+ i0.ɵɵpipe(21, "date");
108
+ i0.ɵɵelementEnd()()();
109
+ i0.ɵɵelementStart(22, "div", 63)(23, "h4", 64);
110
+ i0.ɵɵelement(24, "i", 16);
111
+ i0.ɵɵtext(25, " Application Entities ");
112
+ i0.ɵɵelementEnd();
113
+ i0.ɵɵtemplate(26, ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_26_Template, 3, 0, "div", 65)(27, ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Conditional_27_Template, 2, 0, "p", 66);
114
+ i0.ɵɵelementEnd()();
115
+ } if (rf & 2) {
116
+ const app_r4 = i0.ɵɵnextContext().$implicit;
117
+ const ctx_r1 = i0.ɵɵnextContext(2);
118
+ i0.ɵɵadvance(7);
119
+ i0.ɵɵtextInterpolate(ctx_r1.getAppEntities(app_r4.ID).length);
120
+ i0.ɵɵadvance(6);
121
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(14, 4, app_r4.__mj_CreatedAt, "short"));
122
+ i0.ɵɵadvance(7);
123
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(21, 7, app_r4.__mj_UpdatedAt, "short"));
124
+ i0.ɵɵadvance(6);
125
+ i0.ɵɵconditional(ctx_r1.getAppEntities(app_r4.ID).length > 0 ? 26 : 27);
126
+ } }
127
+ function ApplicationManagementComponent_Conditional_58_For_3_Template(rf, ctx) { if (rf & 1) {
128
+ const _r3 = i0.ɵɵgetCurrentView();
129
+ i0.ɵɵelementStart(0, "div", 42)(1, "div", 43);
130
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_58_For_3_Template_div_click_1_listener() { const app_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleAppExpansion(app_r4.ID)); });
131
+ i0.ɵɵelementStart(2, "div", 44)(3, "div", 45);
132
+ i0.ɵɵelement(4, "i");
133
+ i0.ɵɵelementEnd();
134
+ i0.ɵɵelementStart(5, "div", 46)(6, "h3", 47);
135
+ i0.ɵɵtext(7);
136
+ i0.ɵɵelementEnd();
137
+ i0.ɵɵelementStart(8, "p", 48);
138
+ i0.ɵɵtext(9);
139
+ i0.ɵɵelementEnd()()();
140
+ i0.ɵɵelementStart(10, "div", 49)(11, "span", 50);
141
+ i0.ɵɵtext(12);
142
+ i0.ɵɵelementEnd();
143
+ i0.ɵɵelementStart(13, "div", 51);
144
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_58_For_3_Template_div_click_13_listener($event) { i0.ɵɵrestoreView(_r3); return i0.ɵɵresetView($event.stopPropagation()); });
145
+ i0.ɵɵelementStart(14, "button", 52);
146
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_58_For_3_Template_button_click_14_listener() { const app_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.editApplication(app_r4)); });
147
+ i0.ɵɵelement(15, "i", 53);
148
+ i0.ɵɵelementEnd();
149
+ i0.ɵɵelementStart(16, "button", 54);
150
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_58_For_3_Template_button_click_16_listener() { const app_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.confirmDeleteApplication(app_r4)); });
151
+ i0.ɵɵelement(17, "i", 55);
152
+ i0.ɵɵelementEnd()();
153
+ i0.ɵɵelementStart(18, "button", 56);
154
+ i0.ɵɵelement(19, "i", 57);
155
+ i0.ɵɵelementEnd()()();
156
+ i0.ɵɵtemplate(20, ApplicationManagementComponent_Conditional_58_For_3_Conditional_20_Template, 28, 10, "div", 58);
157
+ i0.ɵɵelementEnd();
158
+ } if (rf & 2) {
159
+ const app_r4 = ctx.$implicit;
160
+ const ctx_r1 = i0.ɵɵnextContext(2);
161
+ i0.ɵɵclassProp("expanded", ctx_r1.isAppExpanded(app_r4.ID));
162
+ i0.ɵɵadvance(4);
163
+ i0.ɵɵclassMap("fa-solid " + ctx_r1.getAppIcon(app_r4));
164
+ i0.ɵɵadvance(3);
165
+ i0.ɵɵtextInterpolate(app_r4.Name);
166
+ i0.ɵɵadvance(2);
167
+ i0.ɵɵtextInterpolate(app_r4.Description || "No description available");
168
+ i0.ɵɵadvance(2);
169
+ i0.ɵɵclassMap(ctx_r1.getAppStatusClass(app_r4));
170
+ i0.ɵɵadvance();
171
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getAppStatusLabel(app_r4), " ");
172
+ i0.ɵɵadvance(8);
173
+ i0.ɵɵconditional(ctx_r1.isAppExpanded(app_r4.ID) ? 20 : -1);
174
+ } }
175
+ function ApplicationManagementComponent_Conditional_58_Conditional_4_Template(rf, ctx) { if (rf & 1) {
176
+ i0.ɵɵelementStart(0, "div", 41);
177
+ i0.ɵɵelement(1, "i", 72);
178
+ i0.ɵɵelementStart(2, "p", 73);
179
+ i0.ɵɵtext(3, "No applications found");
180
+ i0.ɵɵelementEnd();
181
+ i0.ɵɵelementStart(4, "p", 74);
182
+ i0.ɵɵtext(5, "Try adjusting your filters or create a new application");
183
+ i0.ɵɵelementEnd()();
184
+ } }
185
+ function ApplicationManagementComponent_Conditional_58_Template(rf, ctx) { if (rf & 1) {
186
+ i0.ɵɵelementStart(0, "div", 30)(1, "div", 39);
187
+ i0.ɵɵrepeaterCreate(2, ApplicationManagementComponent_Conditional_58_For_3_Template, 21, 10, "div", 40, _forTrack0);
188
+ i0.ɵɵtemplate(4, ApplicationManagementComponent_Conditional_58_Conditional_4_Template, 6, 0, "div", 41);
189
+ i0.ɵɵelementEnd()();
190
+ } if (rf & 2) {
191
+ const ctx_r1 = i0.ɵɵnextContext();
192
+ i0.ɵɵadvance(2);
193
+ i0.ɵɵrepeater(ctx_r1.filteredApplications);
194
+ i0.ɵɵadvance(2);
195
+ i0.ɵɵconditional(ctx_r1.filteredApplications.length === 0 ? 4 : -1);
196
+ } }
197
+ function ApplicationManagementComponent_Conditional_59_Template(rf, ctx) { if (rf & 1) {
198
+ const _r6 = i0.ɵɵgetCurrentView();
199
+ i0.ɵɵelementStart(0, "div", 75);
200
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_59_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showDeleteConfirm = false); });
201
+ i0.ɵɵelementStart(1, "div", 76);
202
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_59_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r6); return i0.ɵɵresetView($event.stopPropagation()); });
203
+ i0.ɵɵelementStart(2, "div", 77)(3, "h3", 78);
204
+ i0.ɵɵelement(4, "i", 79);
205
+ i0.ɵɵtext(5, " Confirm Delete ");
206
+ i0.ɵɵelementEnd();
207
+ i0.ɵɵelementStart(6, "button", 80);
208
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_59_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showDeleteConfirm = false); });
209
+ i0.ɵɵelement(7, "i", 81);
210
+ i0.ɵɵelementEnd()();
211
+ i0.ɵɵelementStart(8, "div", 82)(9, "p");
212
+ i0.ɵɵtext(10, "Are you sure you want to delete the application ");
213
+ i0.ɵɵelementStart(11, "strong");
214
+ i0.ɵɵtext(12);
215
+ i0.ɵɵelementEnd();
216
+ i0.ɵɵtext(13, "?");
217
+ i0.ɵɵelementEnd();
218
+ i0.ɵɵelementStart(14, "p", 83);
219
+ i0.ɵɵelement(15, "i", 84);
220
+ i0.ɵɵtext(16, " This will remove all entity associations for this application. ");
221
+ i0.ɵɵelementEnd()();
222
+ i0.ɵɵelementStart(17, "div", 85)(18, "button", 86);
223
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_59_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showDeleteConfirm = false); });
224
+ i0.ɵɵtext(19, "Cancel");
225
+ i0.ɵɵelementEnd();
226
+ i0.ɵɵelementStart(20, "button", 87);
227
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Conditional_59_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.deleteApplication()); });
228
+ i0.ɵɵelement(21, "i", 55);
229
+ i0.ɵɵtext(22, " Delete Application ");
230
+ i0.ɵɵelementEnd()()()();
231
+ } if (rf & 2) {
232
+ const ctx_r1 = i0.ɵɵnextContext();
233
+ i0.ɵɵadvance(12);
234
+ i0.ɵɵtextInterpolate(ctx_r1.selectedApp.Name);
235
+ } }
236
+ export class ApplicationManagementComponent {
237
+ // State management
238
+ applications = [];
239
+ filteredApplications = [];
240
+ selectedApp = null;
241
+ isLoading = false;
242
+ error = null;
243
+ // Application entities mapping
244
+ appEntities = new Map();
245
+ // Stats
246
+ stats = {
247
+ totalApplications: 0,
248
+ activeApplications: 0,
249
+ totalEntities: 0,
250
+ publicEntities: 0
251
+ };
252
+ // Filters
253
+ filters$ = new BehaviorSubject({
254
+ status: 'all',
255
+ search: ''
256
+ });
257
+ // UI State
258
+ showCreateDialog = false;
259
+ showEditDialog = false;
260
+ showDeleteConfirm = false;
261
+ expandedAppId = null;
262
+ destroy$ = new Subject();
263
+ metadata = new Metadata();
264
+ constructor() { }
265
+ ngOnInit() {
266
+ this.loadInitialData();
267
+ this.setupFilterSubscription();
268
+ }
269
+ ngOnDestroy() {
270
+ this.destroy$.next();
271
+ this.destroy$.complete();
272
+ }
273
+ async loadInitialData() {
274
+ try {
275
+ this.isLoading = true;
276
+ this.error = null;
277
+ // Load applications and their entities
278
+ const [apps, appEntities] = await Promise.all([
279
+ this.loadApplications(),
280
+ this.loadApplicationEntities()
281
+ ]);
282
+ this.applications = apps;
283
+ this.processApplicationEntities(appEntities);
284
+ this.calculateStats();
285
+ this.applyFilters();
286
+ }
287
+ catch (error) {
288
+ console.error('Error loading application data:', error);
289
+ this.error = 'Failed to load application data. Please try again.';
290
+ }
291
+ finally {
292
+ this.isLoading = false;
293
+ }
294
+ }
295
+ async loadApplications() {
296
+ const rv = new RunView();
297
+ const result = await rv.RunView({
298
+ EntityName: 'Applications',
299
+ ResultType: 'entity_object',
300
+ OrderBy: 'Name ASC'
301
+ });
302
+ return result.Success ? result.Results : [];
303
+ }
304
+ async loadApplicationEntities() {
305
+ const rv = new RunView();
306
+ const result = await rv.RunView({
307
+ EntityName: 'Application Entities',
308
+ ResultType: 'entity_object',
309
+ OrderBy: 'ApplicationID, Sequence'
310
+ });
311
+ return result.Success ? result.Results : [];
312
+ }
313
+ processApplicationEntities(appEntities) {
314
+ this.appEntities.clear();
315
+ for (const appEntity of appEntities) {
316
+ const appId = appEntity.ApplicationID;
317
+ if (!this.appEntities.has(appId)) {
318
+ this.appEntities.set(appId, []);
319
+ }
320
+ this.appEntities.get(appId).push(appEntity);
321
+ }
322
+ }
323
+ setupFilterSubscription() {
324
+ this.filters$
325
+ .pipe(debounceTime(300), distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), takeUntil(this.destroy$))
326
+ .subscribe(() => {
327
+ this.applyFilters();
328
+ });
329
+ }
330
+ applyFilters() {
331
+ const filters = this.filters$.value;
332
+ let filtered = [...this.applications];
333
+ // Apply status filter - for now, all applications are considered active
334
+ // In the future, we might add an IsActive field to the Applications table
335
+ if (filters.status === 'inactive') {
336
+ // Currently no way to determine inactive apps
337
+ filtered = [];
338
+ }
339
+ // Apply search filter
340
+ if (filters.search) {
341
+ const searchLower = filters.search.toLowerCase();
342
+ filtered = filtered.filter(app => app.Name?.toLowerCase().includes(searchLower) ||
343
+ app.Description?.toLowerCase().includes(searchLower));
344
+ }
345
+ this.filteredApplications = filtered;
346
+ }
347
+ calculateStats() {
348
+ // For now, consider all applications as active
349
+ const activeApps = this.applications;
350
+ let totalEntities = 0;
351
+ let publicEntities = 0;
352
+ for (const [, entities] of this.appEntities) {
353
+ totalEntities += entities.length;
354
+ publicEntities += entities.filter(e => e.DefaultForNewUser).length;
355
+ }
356
+ this.stats = {
357
+ totalApplications: this.applications.length,
358
+ activeApplications: activeApps.length,
359
+ totalEntities,
360
+ publicEntities
361
+ };
362
+ }
363
+ // Public methods for template
364
+ onSearchChange(event) {
365
+ const value = event.target.value;
366
+ this.updateFilter({ search: value });
367
+ }
368
+ onStatusFilterChange(status) {
369
+ this.updateFilter({ status });
370
+ }
371
+ updateFilter(partial) {
372
+ this.filters$.next({
373
+ ...this.filters$.value,
374
+ ...partial
375
+ });
376
+ }
377
+ toggleAppExpansion(appId) {
378
+ this.expandedAppId = this.expandedAppId === appId ? null : appId;
379
+ }
380
+ isAppExpanded(appId) {
381
+ return this.expandedAppId === appId;
382
+ }
383
+ getAppEntities(appId) {
384
+ return this.appEntities.get(appId) || [];
385
+ }
386
+ getEntityInfo(entityId) {
387
+ return this.metadata.Entities.find(e => e.ID === entityId);
388
+ }
389
+ createNewApplication() {
390
+ this.selectedApp = null;
391
+ this.showCreateDialog = true;
392
+ }
393
+ editApplication(app) {
394
+ this.selectedApp = app;
395
+ this.showEditDialog = true;
396
+ }
397
+ confirmDeleteApplication(app) {
398
+ this.selectedApp = app;
399
+ this.showDeleteConfirm = true;
400
+ }
401
+ async deleteApplication() {
402
+ if (!this.selectedApp)
403
+ return;
404
+ try {
405
+ // Implement application deletion logic
406
+ this.showDeleteConfirm = false;
407
+ await this.loadInitialData();
408
+ }
409
+ catch (error) {
410
+ console.error('Error deleting application:', error);
411
+ this.error = 'Failed to delete application';
412
+ }
413
+ }
414
+ getAppIcon(app) {
415
+ // You can customize icons based on app type or name
416
+ return 'fa-grid-2';
417
+ }
418
+ getAppStatusClass(app) {
419
+ // For now, all apps are considered active
420
+ return 'status-active';
421
+ }
422
+ getAppStatusLabel(app) {
423
+ // For now, all apps are considered active
424
+ return 'Active';
425
+ }
426
+ refreshData() {
427
+ this.loadInitialData();
428
+ }
429
+ static ɵfac = function ApplicationManagementComponent_Factory(t) { return new (t || ApplicationManagementComponent)(); };
430
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationManagementComponent, selectors: [["mj-application-management"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 60, vars: 18, consts: [[1, "application-management-container"], [1, "action-buttons"], [1, "btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-refresh"], [1, "btn-primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "stats-grid", 2, "display", "flex"], [1, "stat-card"], [1, "stat-icon", "stat-icon-total"], [1, "fa-solid", "fa-grid-2"], [1, "stat-content"], [1, "stat-value"], [1, "stat-label"], [1, "stat-icon", "stat-icon-active"], [1, "fa-solid", "fa-check-circle"], [1, "stat-icon", "stat-icon-entities"], [1, "fa-solid", "fa-database"], [1, "stat-icon", "stat-icon-public"], [1, "fa-solid", "fa-globe"], [1, "filters-section"], [1, "filters-row"], [1, "search-container"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search applications by name or description...", 1, "search-input", 3, "input", "value"], [1, "filter-group"], [1, "filter-label"], [1, "filter-buttons"], [1, "filter-btn", 3, "click"], [1, "loading-container"], [1, "error-container"], [1, "content-area"], [1, "modal-backdrop"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "error-content"], [1, "fa-solid", "fa-exclamation-triangle", "error-icon"], [1, "error-message"], [1, "retry-button", 3, "click"], [1, "applications-list"], [1, "app-card", 3, "expanded"], [1, "empty-state"], [1, "app-card"], [1, "app-header", 3, "click"], [1, "app-info"], [1, "app-icon-wrapper"], [1, "app-details"], [1, "app-name"], [1, "app-description"], [1, "app-meta"], [1, "status-badge"], [1, "app-actions", 3, "click"], ["title", "Edit", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-edit"], ["title", "Delete", 1, "action-btn", "action-btn-danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "expand-btn"], [1, "fa-solid", "fa-chevron-down"], [1, "app-content"], [1, "app-stats"], [1, "stat-item"], [1, "fa-solid", "fa-calendar"], [1, "fa-solid", "fa-clock"], [1, "entities-section"], [1, "section-title"], [1, "entities-grid"], [1, "no-entities"], [1, "entity-item"], [1, "entity-name"], [1, "entity-meta"], [1, "entity-badge", "public"], [1, "entity-sequence"], [1, "fa-solid", "fa-grid-2", "empty-icon"], [1, "empty-text"], [1, "empty-subtext"], [1, "modal-backdrop", 3, "click"], [1, "modal-dialog", 3, "click"], [1, "modal-header"], [1, "modal-title"], [1, "fa-solid", "fa-exclamation-triangle", "text-danger"], [1, "modal-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "modal-body"], [1, "text-warning"], [1, "fa-solid", "fa-warning"], [1, "modal-footer"], [1, "btn-secondary", 3, "click"], [1, "btn-danger", 3, "click"]], template: function ApplicationManagementComponent_Template(rf, ctx) { if (rf & 1) {
431
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "button", 2);
432
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Template_button_click_2_listener() { return ctx.refreshData(); });
433
+ i0.ɵɵelement(3, "i", 3);
434
+ i0.ɵɵtext(4, " Refresh ");
435
+ i0.ɵɵelementEnd();
436
+ i0.ɵɵelementStart(5, "button", 4);
437
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Template_button_click_5_listener() { return ctx.createNewApplication(); });
438
+ i0.ɵɵelement(6, "i", 5);
439
+ i0.ɵɵtext(7, " Add Application ");
440
+ i0.ɵɵelementEnd()();
441
+ i0.ɵɵelementStart(8, "div", 6)(9, "div", 7)(10, "div", 8);
442
+ i0.ɵɵelement(11, "i", 9);
443
+ i0.ɵɵelementEnd();
444
+ i0.ɵɵelementStart(12, "div", 10)(13, "div", 11);
445
+ i0.ɵɵtext(14);
446
+ i0.ɵɵelementEnd();
447
+ i0.ɵɵelementStart(15, "div", 12);
448
+ i0.ɵɵtext(16, "Total Applications");
449
+ i0.ɵɵelementEnd()()();
450
+ i0.ɵɵelementStart(17, "div", 7)(18, "div", 13);
451
+ i0.ɵɵelement(19, "i", 14);
452
+ i0.ɵɵelementEnd();
453
+ i0.ɵɵelementStart(20, "div", 10)(21, "div", 11);
454
+ i0.ɵɵtext(22);
455
+ i0.ɵɵelementEnd();
456
+ i0.ɵɵelementStart(23, "div", 12);
457
+ i0.ɵɵtext(24, "Active Applications");
458
+ i0.ɵɵelementEnd()()();
459
+ i0.ɵɵelementStart(25, "div", 7)(26, "div", 15);
460
+ i0.ɵɵelement(27, "i", 16);
461
+ i0.ɵɵelementEnd();
462
+ i0.ɵɵelementStart(28, "div", 10)(29, "div", 11);
463
+ i0.ɵɵtext(30);
464
+ i0.ɵɵelementEnd();
465
+ i0.ɵɵelementStart(31, "div", 12);
466
+ i0.ɵɵtext(32, "Total Entities");
467
+ i0.ɵɵelementEnd()()();
468
+ i0.ɵɵelementStart(33, "div", 7)(34, "div", 17);
469
+ i0.ɵɵelement(35, "i", 18);
470
+ i0.ɵɵelementEnd();
471
+ i0.ɵɵelementStart(36, "div", 10)(37, "div", 11);
472
+ i0.ɵɵtext(38);
473
+ i0.ɵɵelementEnd();
474
+ i0.ɵɵelementStart(39, "div", 12);
475
+ i0.ɵɵtext(40, "Public Entities");
476
+ i0.ɵɵelementEnd()()()();
477
+ i0.ɵɵelementStart(41, "div", 19)(42, "div", 20)(43, "div", 21);
478
+ i0.ɵɵelement(44, "i", 22);
479
+ i0.ɵɵelementStart(45, "input", 23);
480
+ i0.ɵɵlistener("input", function ApplicationManagementComponent_Template_input_input_45_listener($event) { return ctx.onSearchChange($event); });
481
+ i0.ɵɵelementEnd()();
482
+ i0.ɵɵelementStart(46, "div", 24)(47, "label", 25);
483
+ i0.ɵɵtext(48, "Status");
484
+ i0.ɵɵelementEnd();
485
+ i0.ɵɵelementStart(49, "div", 26)(50, "button", 27);
486
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Template_button_click_50_listener() { return ctx.onStatusFilterChange("all"); });
487
+ i0.ɵɵtext(51, " All ");
488
+ i0.ɵɵelementEnd();
489
+ i0.ɵɵelementStart(52, "button", 27);
490
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Template_button_click_52_listener() { return ctx.onStatusFilterChange("active"); });
491
+ i0.ɵɵtext(53, " Active ");
492
+ i0.ɵɵelementEnd();
493
+ i0.ɵɵelementStart(54, "button", 27);
494
+ i0.ɵɵlistener("click", function ApplicationManagementComponent_Template_button_click_54_listener() { return ctx.onStatusFilterChange("inactive"); });
495
+ i0.ɵɵtext(55, " Inactive ");
496
+ i0.ɵɵelementEnd()()()()();
497
+ i0.ɵɵtemplate(56, ApplicationManagementComponent_Conditional_56_Template, 7, 0, "div", 28)(57, ApplicationManagementComponent_Conditional_57_Template, 8, 1, "div", 29)(58, ApplicationManagementComponent_Conditional_58_Template, 5, 1, "div", 30)(59, ApplicationManagementComponent_Conditional_59_Template, 23, 1, "div", 31);
498
+ i0.ɵɵelementEnd();
499
+ } if (rf & 2) {
500
+ i0.ɵɵadvance(2);
501
+ i0.ɵɵproperty("disabled", ctx.isLoading);
502
+ i0.ɵɵadvance();
503
+ i0.ɵɵclassProp("fa-spin", ctx.isLoading);
504
+ i0.ɵɵadvance(11);
505
+ i0.ɵɵtextInterpolate(ctx.stats.totalApplications);
506
+ i0.ɵɵadvance(8);
507
+ i0.ɵɵtextInterpolate(ctx.stats.activeApplications);
508
+ i0.ɵɵadvance(8);
509
+ i0.ɵɵtextInterpolate(ctx.stats.totalEntities);
510
+ i0.ɵɵadvance(8);
511
+ i0.ɵɵtextInterpolate(ctx.stats.publicEntities);
512
+ i0.ɵɵadvance(7);
513
+ i0.ɵɵproperty("value", ctx.filters$.value.search);
514
+ i0.ɵɵadvance(5);
515
+ i0.ɵɵclassProp("active", ctx.filters$.value.status === "all");
516
+ i0.ɵɵadvance(2);
517
+ i0.ɵɵclassProp("active", ctx.filters$.value.status === "active");
518
+ i0.ɵɵadvance(2);
519
+ i0.ɵɵclassProp("active", ctx.filters$.value.status === "inactive");
520
+ i0.ɵɵadvance(2);
521
+ i0.ɵɵconditional(ctx.isLoading ? 56 : -1);
522
+ i0.ɵɵadvance();
523
+ i0.ɵɵconditional(ctx.error && !ctx.isLoading ? 57 : -1);
524
+ i0.ɵɵadvance();
525
+ i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 58 : -1);
526
+ i0.ɵɵadvance();
527
+ i0.ɵɵconditional(ctx.showDeleteConfirm && ctx.selectedApp ? 59 : -1);
528
+ } }, dependencies: [CommonModule, i1.DatePipe, FormsModule,
529
+ SharedSettingsModule], styles: ["@import '../shared/styles/variables';\n@import '../shared/styles/mixins';\n\n.application-management-container[_ngcontent-%COMP%] {\n @include scrollable-container;\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem;\n}\n\n//[_ngcontent-%COMP%] Action[_ngcontent-%COMP%] Buttons\n.action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-end;\n margin-bottom: 1.5rem;\n\n @media (max-width: 768px) {\n justify-content: center;\n flex-wrap: wrap;\n }\n}\n\n//[_ngcontent-%COMP%] Buttons\n.btn-primary[_ngcontent-%COMP%] {\n @include button-base;\n background-color: #2196f3;\n color: white;\n \n &:hover {\n background-color: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.3);\n }\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n @include button-base;\n background-color: #ffffff;\n color: #374151;\n border: 1px solid #e5e7eb;\n \n &:hover {\n background-color: #f9fafb;\n border-color: #2196f3;\n color: #2196f3;\n }\n}\n\n.btn-danger[_ngcontent-%COMP%] {\n @include button-base;\n background-color: #f44336;\n color: white;\n \n &:hover {\n background-color: #d32f2f;\n }\n}\n\n//[_ngcontent-%COMP%] Stats[_ngcontent-%COMP%] Grid\n.stats-grid[_ngcontent-%COMP%] {\n display: grid !important;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 1.5rem;\n margin-bottom: 2rem;\n width: 100%;\n\n @media (max-width: 768px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 1rem;\n }\n}\n\n.stat-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n padding: 1.5rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n display: flex;\n margin-right: 10px;\n align-items: center;\n gap: 1rem;\n transition: all 0.3s ease;\n min-width: 0; // Prevent grid blowout\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n }\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.5rem;\n\n &-total {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n &-active {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n &-entities {\n background: rgba(156, 39, 176, 0.1);\n color: #9c27b0;\n }\n\n &-public {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n }\n}\n\n.stat-content[_ngcontent-%COMP%] {\n flex: 1;\n\n .stat-value {\n font-size: 2rem;\n font-weight: 700;\n color: #1f2937;\n line-height: 1;\n }\n\n .stat-label {\n color: #6b7280;\n font-size: 0.875rem;\n margin-top: 0.25rem;\n }\n}\n\n//[_ngcontent-%COMP%] Filters[_ngcontent-%COMP%] Section\n.filters-section[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n padding: 1.5rem;\n margin-bottom: 1.5rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filters-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 1.5rem;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.search-container[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 250px;\n position: relative;\n\n .search-icon {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: #6b7280;\n font-size: 1rem;\n }\n\n .search-input {\n width: 100%;\n padding: 0.75rem 1rem 0.75rem 2.75rem;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 0.95rem;\n transition: all 0.2s;\n\n &:focus {\n outline: none;\n border-color: #2196f3;\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n }\n }\n}\n\n.filter-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n\n .filter-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: #374151;\n }\n\n .filter-buttons {\n display: flex;\n background: #f3f4f6;\n border-radius: 8px;\n padding: 4px;\n }\n\n .filter-btn {\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover {\n color: #374151;\n }\n\n &.active {\n background: white;\n color: #2196f3;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n }\n}\n\n//[_ngcontent-%COMP%] Content[_ngcontent-%COMP%] Area\n.content-area[_ngcontent-%COMP%] {\n @include scrollable-content;\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n padding: 1.5rem;\n}\n\n//[_ngcontent-%COMP%] Applications[_ngcontent-%COMP%] List\n.applications-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-height: calc(100vh - 450px); // Dynamic height\n overflow-y: auto;\n padding-right: 0.5rem; // Space for scrollbar\n}\n\n.app-card[_ngcontent-%COMP%] {\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n overflow: hidden;\n transition: all 0.3s ease;\n\n &:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n\n &.expanded {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n \n .expand-btn i {\n transform: rotate(180deg);\n }\n }\n}\n\n.app-header[_ngcontent-%COMP%] {\n padding: 1.5rem;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n background: #f9fafb;\n transition: background-color 0.2s;\n\n &:hover {\n background: #f3f4f6;\n }\n}\n\n.app-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n}\n\n.app-icon-wrapper[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: rgba(33, 150, 243, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n color: #2196f3;\n font-size: 1.25rem;\n}\n\n.app-details[_ngcontent-%COMP%] {\n flex: 1;\n\n .app-name {\n font-size: 1.125rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0 0 0.25rem 0;\n }\n\n .app-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n }\n}\n\n.app-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 0.375rem 0.75rem;\n border-radius: 20px;\n font-size: 0.75rem;\n font-weight: 600;\n\n &.status-active {\n background: rgba(76, 175, 80, 0.1);\n color: #388e3c;\n }\n\n &.status-inactive {\n background: rgba(244, 67, 54, 0.1);\n color: #d32f2f;\n }\n}\n\n.app-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n padding: 0.5rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 1rem;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover {\n background: white;\n color: #2196f3;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n &-danger:hover {\n color: #f44336;\n }\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n padding: 0.5rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 1rem;\n cursor: pointer;\n transition: all 0.2s;\n\n i {\n transition: transform 0.3s ease;\n }\n}\n\n//[_ngcontent-%COMP%] App[_ngcontent-%COMP%] Content[_ngcontent-%COMP%] (Expanded)\n.app-content[_ngcontent-%COMP%] {\n padding: 1.5rem;\n background: white;\n border-top: 1px solid #e5e7eb;\n animation: _ngcontent-%COMP%_slideDown 0.3s ease-out;\n}\n\n.app-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 2rem;\n margin-bottom: 1.5rem;\n flex-wrap: wrap;\n\n .stat-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n\n i {\n color: #6b7280;\n }\n\n .stat-label {\n color: #6b7280;\n }\n\n .stat-value {\n color: #1f2937;\n font-weight: 500;\n }\n }\n}\n\n.entities-section[_ngcontent-%COMP%] {\n padding: 1rem;\n background: #f9fafb;\n border-radius: 8px;\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0 0 1rem 0;\n\n i {\n color: #2196f3;\n }\n }\n}\n\n.entities-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 0.75rem;\n}\n\n.entity-item[_ngcontent-%COMP%] {\n padding: 0.75rem;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n transition: all 0.2s;\n\n &:hover {\n border-color: #2196f3;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n\n .entity-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #1f2937;\n margin-bottom: 0.25rem;\n }\n\n .entity-meta {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n color: #6b7280;\n }\n}\n\n.entity-badge[_ngcontent-%COMP%] {\n padding: 0.125rem 0.5rem;\n border-radius: 12px;\n font-size: 0.625rem;\n font-weight: 600;\n\n &.public {\n background: rgba(255, 152, 0, 0.1);\n color: #f57c00;\n }\n}\n\n.entity-sequence[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: #9ca3af;\n}\n\n.no-entities[_ngcontent-%COMP%] {\n color: #6b7280;\n font-size: 0.875rem;\n text-align: center;\n padding: 1rem;\n margin: 0;\n}\n\n//[_ngcontent-%COMP%] Empty[_ngcontent-%COMP%] State\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 4rem 2rem;\n\n .empty-icon {\n font-size: 4rem;\n color: #e5e7eb;\n margin-bottom: 1rem;\n }\n\n .empty-text {\n font-size: 1.25rem;\n font-weight: 600;\n color: #374151;\n margin: 0 0 0.5rem 0;\n }\n\n .empty-subtext {\n color: #6b7280;\n margin: 0;\n }\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] State\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem 2rem;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 60px;\n height: 60px;\n margin-bottom: 1rem;\n\n .spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n\n &:nth-child(1) {\n border-color: #2196f3 transparent transparent transparent;\n animation-delay: -0.45s;\n }\n\n &:nth-child(2) {\n border-color: transparent #9c27b0 transparent transparent;\n animation-delay: -0.3s;\n }\n\n &:nth-child(3) {\n border-color: transparent transparent #ff9800 transparent;\n animation-delay: -0.15s;\n }\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n color: #6b7280;\n font-size: 0.95rem;\n}\n\n//[_ngcontent-%COMP%] Error[_ngcontent-%COMP%] State\n.error-container[_ngcontent-%COMP%] {\n text-align: center;\n padding: 4rem 2rem;\n\n .error-icon {\n font-size: 3rem;\n color: #f44336;\n margin-bottom: 1rem;\n }\n\n .error-message {\n color: #374151;\n margin-bottom: 1.5rem;\n }\n\n .retry-button {\n @include button-base;\n background-color: #2196f3;\n color: white;\n }\n}\n\n//[_ngcontent-%COMP%] Modal[_ngcontent-%COMP%] Styles\n.modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: fadeIn 0.2s ease;\n}\n\n.modal-dialog[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n max-width: 500px;\n width: 90%;\n max-height: 90vh;\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideUp 0.3s ease;\n}\n\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1.5rem;\n border-bottom: 1px solid #e5e7eb;\n\n .modal-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.25rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0;\n }\n\n .modal-close {\n padding: 0.5rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n\n &:hover {\n background: #f3f4f6;\n color: #374151;\n }\n }\n}\n\n.modal-body[_ngcontent-%COMP%] {\n padding: 1.5rem;\n\n p {\n margin: 0 0 1rem 0;\n color: #374151;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .text-warning {\n color: #f57c00;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n}\n\n.modal-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.5rem;\n border-top: 1px solid #e5e7eb;\n background: #f9fafb;\n}\n\n//[_ngcontent-%COMP%] Animations\n@keyframes[_ngcontent-%COMP%] fadeIn[_ngcontent-%COMP%] {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 800px;\n }\n}\n\n//[_ngcontent-%COMP%] Utility[_ngcontent-%COMP%] Classes\n.text-danger[_ngcontent-%COMP%] {\n color: #f44336;\n}"] });
530
+ }
531
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ApplicationManagementComponent, [{
532
+ type: Component,
533
+ args: [{ selector: 'mj-application-management', standalone: true, imports: [
534
+ CommonModule,
535
+ FormsModule,
536
+ SharedSettingsModule
537
+ ], template: "<div class=\"application-management-container\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\">\n <button class=\"btn-secondary\" (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <i class=\"fa-solid fa-refresh\" [class.fa-spin]=\"isLoading\"></i>\n Refresh\n </button>\n <button class=\"btn-primary\" (click)=\"createNewApplication()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Application\n </button>\n </div>\n\n <!-- Stats Cards -->\n <div class=\"stats-grid\" style=\"display: flex\">\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-total\">\n <i class=\"fa-solid fa-grid-2\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ stats.totalApplications }}</div>\n <div class=\"stat-label\">Total Applications</div>\n </div>\n </div>\n \n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-active\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ stats.activeApplications }}</div>\n <div class=\"stat-label\">Active Applications</div>\n </div>\n </div>\n \n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-entities\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ stats.totalEntities }}</div>\n <div class=\"stat-label\">Total Entities</div>\n </div>\n </div>\n \n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-public\">\n <i class=\"fa-solid fa-globe\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ stats.publicEntities }}</div>\n <div class=\"stat-label\">Public Entities</div>\n </div>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\">\n <div class=\"filters-row\">\n <!-- Search -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input \n type=\"text\" \n class=\"search-input\" \n placeholder=\"Search applications by name or description...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.search\"\n />\n </div>\n \n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">Status</label>\n <div class=\"filter-buttons\">\n <button \n class=\"filter-btn\"\n [class.active]=\"filters$.value.status === 'all'\"\n (click)=\"onStatusFilterChange('all')\"\n >\n All\n </button>\n <button \n class=\"filter-btn\"\n [class.active]=\"filters$.value.status === 'active'\"\n (click)=\"onStatusFilterChange('active')\"\n >\n Active\n </button>\n <button \n class=\"filter-btn\"\n [class.active]=\"filters$.value.status === 'inactive'\"\n (click)=\"onStatusFilterChange('inactive')\"\n >\n Inactive\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">Loading applications...</div>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"retry-button\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Content Area -->\n @if (!isLoading && !error) {\n <div class=\"content-area\">\n <div class=\"applications-list\">\n @for (app of filteredApplications; track app.ID) {\n <div class=\"app-card\" [class.expanded]=\"isAppExpanded(app.ID)\">\n <div class=\"app-header\" (click)=\"toggleAppExpansion(app.ID)\">\n <div class=\"app-info\">\n <div class=\"app-icon-wrapper\">\n <i [class]=\"'fa-solid ' + getAppIcon(app)\"></i>\n </div>\n <div class=\"app-details\">\n <h3 class=\"app-name\">{{ app.Name }}</h3>\n <p class=\"app-description\">{{ app.Description || 'No description available' }}</p>\n </div>\n </div>\n \n <div class=\"app-meta\">\n <span class=\"status-badge\" [class]=\"getAppStatusClass(app)\">\n {{ getAppStatusLabel(app) }}\n </span>\n <div class=\"app-actions\" (click)=\"$event.stopPropagation()\">\n <button class=\"action-btn\" (click)=\"editApplication(app)\" title=\"Edit\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"action-btn action-btn-danger\" (click)=\"confirmDeleteApplication(app)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n <button class=\"expand-btn\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n @if (isAppExpanded(app.ID)) {\n <div class=\"app-content\">\n <div class=\"app-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-database\"></i>\n <span class=\"stat-label\">Entities:</span>\n <span class=\"stat-value\">{{ getAppEntities(app.ID).length }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span class=\"stat-label\">Created:</span>\n <span class=\"stat-value\">{{ app.__mj_CreatedAt | date:'short' }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"stat-label\">Updated:</span>\n <span class=\"stat-value\">{{ app.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n </div>\n \n <div class=\"entities-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-database\"></i>\n Application Entities\n </h4>\n \n @if (getAppEntities(app.ID).length > 0) {\n <div class=\"entities-grid\">\n @for (appEntity of getAppEntities(app.ID); track appEntity.ID) {\n @if (getEntityInfo(appEntity.EntityID); as entity) {\n <div class=\"entity-item\">\n <div class=\"entity-name\">{{ entity.Name }}</div>\n <div class=\"entity-meta\">\n @if (appEntity.DefaultForNewUser) {\n <span class=\"entity-badge public\">Public</span>\n }\n <span class=\"entity-sequence\">Order: {{ appEntity.Sequence }}</span>\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <p class=\"no-entities\">No entities configured for this application</p>\n }\n </div>\n </div>\n }\n </div>\n }\n \n @if (filteredApplications.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-grid-2 empty-icon\"></i>\n <p class=\"empty-text\">No applications found</p>\n <p class=\"empty-subtext\">Try adjusting your filters or create a new application</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm && selectedApp) {\n <div class=\"modal-backdrop\" (click)=\"showDeleteConfirm = false\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\">\n <i class=\"fa-solid fa-exclamation-triangle text-danger\"></i>\n Confirm Delete\n </h3>\n <button class=\"modal-close\" (click)=\"showDeleteConfirm = false\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete the application <strong>{{ selectedApp.Name }}</strong>?</p>\n <p class=\"text-warning\">\n <i class=\"fa-solid fa-warning\"></i>\n This will remove all entity associations for this application.\n </p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-secondary\" (click)=\"showDeleteConfirm = false\">Cancel</button>\n <button class=\"btn-danger\" (click)=\"deleteApplication()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete Application\n </button>\n </div>\n </div>\n </div>\n }\n</div>", styles: ["@import '../shared/styles/variables';\n@import '../shared/styles/mixins';\n\n.application-management-container {\n @include scrollable-container;\n max-width: 1200px;\n margin: 0 auto;\n padding: 2rem;\n}\n\n// Action Buttons\n.action-buttons {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-end;\n margin-bottom: 1.5rem;\n\n @media (max-width: 768px) {\n justify-content: center;\n flex-wrap: wrap;\n }\n}\n\n// Buttons\n.btn-primary {\n @include button-base;\n background-color: #2196f3;\n color: white;\n \n &:hover {\n background-color: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.3);\n }\n}\n\n.btn-secondary {\n @include button-base;\n background-color: #ffffff;\n color: #374151;\n border: 1px solid #e5e7eb;\n \n &:hover {\n background-color: #f9fafb;\n border-color: #2196f3;\n color: #2196f3;\n }\n}\n\n.btn-danger {\n @include button-base;\n background-color: #f44336;\n color: white;\n \n &:hover {\n background-color: #d32f2f;\n }\n}\n\n// Stats Grid\n.stats-grid {\n display: grid !important;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 1.5rem;\n margin-bottom: 2rem;\n width: 100%;\n\n @media (max-width: 768px) {\n grid-template-columns: repeat(2, 1fr);\n gap: 1rem;\n }\n}\n\n.stat-card {\n background: white;\n border-radius: 12px;\n padding: 1.5rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n display: flex;\n margin-right: 10px;\n align-items: center;\n gap: 1rem;\n transition: all 0.3s ease;\n min-width: 0; // Prevent grid blowout\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n }\n}\n\n.stat-icon {\n width: 60px;\n height: 60px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.5rem;\n\n &-total {\n background: rgba(33, 150, 243, 0.1);\n color: #2196f3;\n }\n\n &-active {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n }\n\n &-entities {\n background: rgba(156, 39, 176, 0.1);\n color: #9c27b0;\n }\n\n &-public {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n }\n}\n\n.stat-content {\n flex: 1;\n\n .stat-value {\n font-size: 2rem;\n font-weight: 700;\n color: #1f2937;\n line-height: 1;\n }\n\n .stat-label {\n color: #6b7280;\n font-size: 0.875rem;\n margin-top: 0.25rem;\n }\n}\n\n// Filters Section\n.filters-section {\n background: white;\n border-radius: 12px;\n padding: 1.5rem;\n margin-bottom: 1.5rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filters-row {\n display: flex;\n gap: 1.5rem;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.search-container {\n flex: 1;\n min-width: 250px;\n position: relative;\n\n .search-icon {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: #6b7280;\n font-size: 1rem;\n }\n\n .search-input {\n width: 100%;\n padding: 0.75rem 1rem 0.75rem 2.75rem;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 0.95rem;\n transition: all 0.2s;\n\n &:focus {\n outline: none;\n border-color: #2196f3;\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n }\n }\n}\n\n.filter-group {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n\n .filter-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: #374151;\n }\n\n .filter-buttons {\n display: flex;\n background: #f3f4f6;\n border-radius: 8px;\n padding: 4px;\n }\n\n .filter-btn {\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover {\n color: #374151;\n }\n\n &.active {\n background: white;\n color: #2196f3;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n }\n}\n\n// Content Area\n.content-area {\n @include scrollable-content;\n background: white;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n padding: 1.5rem;\n}\n\n// Applications List\n.applications-list {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-height: calc(100vh - 450px); // Dynamic height\n overflow-y: auto;\n padding-right: 0.5rem; // Space for scrollbar\n}\n\n.app-card {\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n overflow: hidden;\n transition: all 0.3s ease;\n\n &:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n }\n\n &.expanded {\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n \n .expand-btn i {\n transform: rotate(180deg);\n }\n }\n}\n\n.app-header {\n padding: 1.5rem;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n background: #f9fafb;\n transition: background-color 0.2s;\n\n &:hover {\n background: #f3f4f6;\n }\n}\n\n.app-info {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n}\n\n.app-icon-wrapper {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: rgba(33, 150, 243, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n color: #2196f3;\n font-size: 1.25rem;\n}\n\n.app-details {\n flex: 1;\n\n .app-name {\n font-size: 1.125rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0 0 0.25rem 0;\n }\n\n .app-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n }\n}\n\n.app-meta {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.status-badge {\n padding: 0.375rem 0.75rem;\n border-radius: 20px;\n font-size: 0.75rem;\n font-weight: 600;\n\n &.status-active {\n background: rgba(76, 175, 80, 0.1);\n color: #388e3c;\n }\n\n &.status-inactive {\n background: rgba(244, 67, 54, 0.1);\n color: #d32f2f;\n }\n}\n\n.app-actions {\n display: flex;\n gap: 0.5rem;\n}\n\n.action-btn {\n padding: 0.5rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 1rem;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover {\n background: white;\n color: #2196f3;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n &-danger:hover {\n color: #f44336;\n }\n}\n\n.expand-btn {\n padding: 0.5rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 1rem;\n cursor: pointer;\n transition: all 0.2s;\n\n i {\n transition: transform 0.3s ease;\n }\n}\n\n// App Content (Expanded)\n.app-content {\n padding: 1.5rem;\n background: white;\n border-top: 1px solid #e5e7eb;\n animation: slideDown 0.3s ease-out;\n}\n\n.app-stats {\n display: flex;\n gap: 2rem;\n margin-bottom: 1.5rem;\n flex-wrap: wrap;\n\n .stat-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n\n i {\n color: #6b7280;\n }\n\n .stat-label {\n color: #6b7280;\n }\n\n .stat-value {\n color: #1f2937;\n font-weight: 500;\n }\n }\n}\n\n.entities-section {\n padding: 1rem;\n background: #f9fafb;\n border-radius: 8px;\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0 0 1rem 0;\n\n i {\n color: #2196f3;\n }\n }\n}\n\n.entities-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 0.75rem;\n}\n\n.entity-item {\n padding: 0.75rem;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n transition: all 0.2s;\n\n &:hover {\n border-color: #2196f3;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n }\n\n .entity-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #1f2937;\n margin-bottom: 0.25rem;\n }\n\n .entity-meta {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n color: #6b7280;\n }\n}\n\n.entity-badge {\n padding: 0.125rem 0.5rem;\n border-radius: 12px;\n font-size: 0.625rem;\n font-weight: 600;\n\n &.public {\n background: rgba(255, 152, 0, 0.1);\n color: #f57c00;\n }\n}\n\n.entity-sequence {\n font-size: 0.75rem;\n color: #9ca3af;\n}\n\n.no-entities {\n color: #6b7280;\n font-size: 0.875rem;\n text-align: center;\n padding: 1rem;\n margin: 0;\n}\n\n// Empty State\n.empty-state {\n text-align: center;\n padding: 4rem 2rem;\n\n .empty-icon {\n font-size: 4rem;\n color: #e5e7eb;\n margin-bottom: 1rem;\n }\n\n .empty-text {\n font-size: 1.25rem;\n font-weight: 600;\n color: #374151;\n margin: 0 0 0.5rem 0;\n }\n\n .empty-subtext {\n color: #6b7280;\n margin: 0;\n }\n}\n\n// Loading State\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem 2rem;\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n margin-bottom: 1rem;\n\n .spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n\n &:nth-child(1) {\n border-color: #2196f3 transparent transparent transparent;\n animation-delay: -0.45s;\n }\n\n &:nth-child(2) {\n border-color: transparent #9c27b0 transparent transparent;\n animation-delay: -0.3s;\n }\n\n &:nth-child(3) {\n border-color: transparent transparent #ff9800 transparent;\n animation-delay: -0.15s;\n }\n }\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text {\n color: #6b7280;\n font-size: 0.95rem;\n}\n\n// Error State\n.error-container {\n text-align: center;\n padding: 4rem 2rem;\n\n .error-icon {\n font-size: 3rem;\n color: #f44336;\n margin-bottom: 1rem;\n }\n\n .error-message {\n color: #374151;\n margin-bottom: 1.5rem;\n }\n\n .retry-button {\n @include button-base;\n background-color: #2196f3;\n color: white;\n }\n}\n\n// Modal Styles\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: fadeIn 0.2s ease;\n}\n\n.modal-dialog {\n background: white;\n border-radius: 12px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n max-width: 500px;\n width: 90%;\n max-height: 90vh;\n overflow: hidden;\n animation: slideUp 0.3s ease;\n}\n\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1.5rem;\n border-bottom: 1px solid #e5e7eb;\n\n .modal-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.25rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0;\n }\n\n .modal-close {\n padding: 0.5rem;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n\n &:hover {\n background: #f3f4f6;\n color: #374151;\n }\n }\n}\n\n.modal-body {\n padding: 1.5rem;\n\n p {\n margin: 0 0 1rem 0;\n color: #374151;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n .text-warning {\n color: #f57c00;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n}\n\n.modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.5rem;\n border-top: 1px solid #e5e7eb;\n background: #f9fafb;\n}\n\n// Animations\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 800px;\n }\n}\n\n// Utility Classes\n.text-danger {\n color: #f44336;\n}"] }]
538
+ }], () => [], null); })();
539
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationManagementComponent, { className: "ApplicationManagementComponent", filePath: "src/lib/application-management/application-management.component.ts", lineNumber: 33 }); })();
540
+ //# sourceMappingURL=application-management.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-management.component.js","sourceRoot":"","sources":["../../../src/lib/application-management/application-management.component.ts","../../../src/lib/application-management/application-management.component.html"],"names":[],"mappings":"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"}