@memberjunction/ng-explorer-settings 3.2.0 → 3.4.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 (72) hide show
  1. package/dist/lib/account-info/account-info.component.d.ts +23 -0
  2. package/dist/lib/account-info/account-info.component.d.ts.map +1 -0
  3. package/dist/lib/account-info/account-info.component.js +155 -0
  4. package/dist/lib/account-info/account-info.component.js.map +1 -0
  5. package/dist/lib/appearance-settings/appearance-settings.component.d.ts +15 -0
  6. package/dist/lib/appearance-settings/appearance-settings.component.d.ts.map +1 -0
  7. package/dist/lib/appearance-settings/appearance-settings.component.js +79 -0
  8. package/dist/lib/appearance-settings/appearance-settings.component.js.map +1 -0
  9. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts +15 -1
  10. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
  11. package/dist/lib/application-management/application-dialog/application-dialog.component.js +329 -190
  12. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
  13. package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
  14. package/dist/lib/application-management/application-management.component.js +265 -184
  15. package/dist/lib/application-management/application-management.component.js.map +1 -1
  16. package/dist/lib/application-settings/application-settings.component.d.ts +113 -0
  17. package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -0
  18. package/dist/lib/application-settings/application-settings.component.js +520 -0
  19. package/dist/lib/application-settings/application-settings.component.js.map +1 -0
  20. package/dist/lib/entity-permissions/entity-permissions.component.d.ts +1 -0
  21. package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
  22. package/dist/lib/entity-permissions/entity-permissions.component.js +369 -192
  23. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  24. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
  25. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +160 -143
  26. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
  27. package/dist/lib/general-settings/general-settings.component.d.ts +14 -0
  28. package/dist/lib/general-settings/general-settings.component.d.ts.map +1 -0
  29. package/dist/lib/general-settings/general-settings.component.js +50 -0
  30. package/dist/lib/general-settings/general-settings.component.js.map +1 -0
  31. package/dist/lib/module.d.ts +28 -30
  32. package/dist/lib/module.d.ts.map +1 -1
  33. package/dist/lib/module.js +75 -68
  34. package/dist/lib/module.js.map +1 -1
  35. package/dist/lib/notification-preferences/notification-preferences.component.d.ts +77 -0
  36. package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
  37. package/dist/lib/notification-preferences/notification-preferences.component.js +153 -77
  38. package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
  39. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -1
  40. package/dist/lib/role-management/role-dialog/role-dialog.component.js +93 -89
  41. package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
  42. package/dist/lib/role-management/role-management.component.d.ts +1 -0
  43. package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
  44. package/dist/lib/role-management/role-management.component.js +275 -158
  45. package/dist/lib/role-management/role-management.component.js.map +1 -1
  46. package/dist/lib/settings/settings.component.d.ts +47 -3
  47. package/dist/lib/settings/settings.component.d.ts.map +1 -1
  48. package/dist/lib/settings/settings.component.js +339 -269
  49. package/dist/lib/settings/settings.component.js.map +1 -1
  50. package/dist/lib/shared/settings-card.component.d.ts.map +1 -1
  51. package/dist/lib/shared/settings-card.component.js +21 -18
  52. package/dist/lib/shared/settings-card.component.js.map +1 -1
  53. package/dist/lib/sql-logging/sql-logging.component.d.ts +11 -2
  54. package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
  55. package/dist/lib/sql-logging/sql-logging.component.js +318 -245
  56. package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
  57. package/dist/lib/user-app-config/user-app-config.component.d.ts +21 -3
  58. package/dist/lib/user-app-config/user-app-config.component.d.ts.map +1 -1
  59. package/dist/lib/user-app-config/user-app-config.component.js +202 -147
  60. package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
  61. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -1
  62. package/dist/lib/user-management/user-dialog/user-dialog.component.js +120 -116
  63. package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
  64. package/dist/lib/user-management/user-management.component.d.ts +32 -2
  65. package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
  66. package/dist/lib/user-management/user-management.component.js +822 -297
  67. package/dist/lib/user-management/user-management.component.js.map +1 -1
  68. package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts +31 -2
  69. package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts.map +1 -1
  70. package/dist/lib/user-profile-settings/user-profile-settings.component.js +213 -80
  71. package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
  72. package/package.json +20 -20
@@ -3,38 +3,33 @@ import { Metadata, RunView, LogError, LogStatus } from '@memberjunction/core';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@memberjunction/ng-base-application";
5
5
  import * as i2 from "@memberjunction/ng-shared";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@progress/kendo-angular-dialog";
8
- import * as i5 from "@progress/kendo-angular-buttons";
9
- import * as i6 from "@progress/kendo-angular-sortable";
10
- import * as i7 from "@memberjunction/ng-shared-generic";
11
- function UserAppConfigComponent_div_0_Template(rf, ctx) { if (rf & 1) {
12
- i0.ɵɵelement(0, "div", 2);
13
- } }
14
- function UserAppConfigComponent_kendo_window_1_div_2_Template(rf, ctx) { if (rf & 1) {
15
- i0.ɵɵelementStart(0, "div", 16);
6
+ import * as i3 from "@memberjunction/ng-shared-generic";
7
+ const _forTrack0 = ($index, $item) => $item.app.ID;
8
+ function UserAppConfigComponent_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
9
+ i0.ɵɵelementStart(0, "div", 8);
16
10
  i0.ɵɵelement(1, "mj-loading", 17);
17
11
  i0.ɵɵelementEnd();
18
12
  } }
19
- function UserAppConfigComponent_kendo_window_1_div_3_Template(rf, ctx) { if (rf & 1) {
20
- i0.ɵɵelementStart(0, "div", 18);
21
- i0.ɵɵelement(1, "span", 19);
22
- i0.ɵɵtext(2);
23
- i0.ɵɵelementEnd();
13
+ function UserAppConfigComponent_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
14
+ i0.ɵɵelementStart(0, "div", 9);
15
+ i0.ɵɵelement(1, "i", 18);
16
+ i0.ɵɵelementStart(2, "span");
17
+ i0.ɵɵtext(3);
18
+ i0.ɵɵelementEnd()();
24
19
  } if (rf & 2) {
25
20
  const ctx_r1 = i0.ɵɵnextContext(2);
26
- i0.ɵɵadvance(2);
27
- i0.ɵɵtextInterpolate1(" ", ctx_r1.errorMessage, " ");
21
+ i0.ɵɵadvance(3);
22
+ i0.ɵɵtextInterpolate(ctx_r1.errorMessage);
28
23
  } }
29
- function UserAppConfigComponent_kendo_window_1_div_4_div_13_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "div", 34);
31
- i0.ɵɵelement(1, "span", 35);
24
+ function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_13_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "div", 27);
26
+ i0.ɵɵelement(1, "i", 32);
32
27
  i0.ɵɵelementStart(2, "p");
33
28
  i0.ɵɵtext(3, "All applications added!");
34
29
  i0.ɵɵelementEnd()();
35
30
  } }
36
- function UserAppConfigComponent_kendo_window_1_div_4_div_14_span_6_Template(rf, ctx) { if (rf & 1) {
37
- i0.ɵɵelementStart(0, "span", 43);
31
+ function UserAppConfigComponent_Conditional_0_Conditional_11_For_15_Conditional_6_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵelementStart(0, "span", 38);
38
33
  i0.ɵɵtext(1);
39
34
  i0.ɵɵelementEnd();
40
35
  } if (rf & 2) {
@@ -42,21 +37,21 @@ function UserAppConfigComponent_kendo_window_1_div_4_div_14_span_6_Template(rf,
42
37
  i0.ɵɵadvance();
43
38
  i0.ɵɵtextInterpolate(item_r5.app.Description);
44
39
  } }
45
- function UserAppConfigComponent_kendo_window_1_div_4_div_14_Template(rf, ctx) { if (rf & 1) {
40
+ function UserAppConfigComponent_Conditional_0_Conditional_11_For_15_Template(rf, ctx) { if (rf & 1) {
46
41
  const _r4 = i0.ɵɵgetCurrentView();
47
- i0.ɵɵelementStart(0, "div", 36);
48
- i0.ɵɵlistener("dblclick", function UserAppConfigComponent_kendo_window_1_div_4_div_14_Template_div_dblclick_0_listener() { const item_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addApp(item_r5)); });
49
- i0.ɵɵelementStart(1, "div", 37);
50
- i0.ɵɵelement(2, "span");
42
+ i0.ɵɵelementStart(0, "div", 33);
43
+ i0.ɵɵlistener("dblclick", function UserAppConfigComponent_Conditional_0_Conditional_11_For_15_Template_div_dblclick_0_listener() { const item_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addApp(item_r5)); });
44
+ i0.ɵɵelementStart(1, "div", 34);
45
+ i0.ɵɵelement(2, "i", 35);
51
46
  i0.ɵɵelementEnd();
52
- i0.ɵɵelementStart(3, "div", 38)(4, "span", 39);
47
+ i0.ɵɵelementStart(3, "div", 36)(4, "span", 37);
53
48
  i0.ɵɵtext(5);
54
49
  i0.ɵɵelementEnd();
55
- i0.ɵɵtemplate(6, UserAppConfigComponent_kendo_window_1_div_4_div_14_span_6_Template, 2, 1, "span", 40);
50
+ i0.ɵɵtemplate(6, UserAppConfigComponent_Conditional_0_Conditional_11_For_15_Conditional_6_Template, 2, 1, "span", 38);
56
51
  i0.ɵɵelementEnd();
57
- i0.ɵɵelementStart(7, "button", 41);
58
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_div_4_div_14_Template_button_click_7_listener() { const item_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addApp(item_r5)); });
59
- i0.ɵɵelement(8, "span", 42);
52
+ i0.ɵɵelementStart(7, "button", 39);
53
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Conditional_11_For_15_Template_button_click_7_listener() { const item_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addApp(item_r5)); });
54
+ i0.ɵɵelement(8, "i", 40);
60
55
  i0.ɵɵtext(9, " Add ");
61
56
  i0.ɵɵelementEnd()();
62
57
  } if (rf & 2) {
@@ -68,114 +63,118 @@ function UserAppConfigComponent_kendo_window_1_div_4_div_14_Template(rf, ctx) {
68
63
  i0.ɵɵadvance(3);
69
64
  i0.ɵɵtextInterpolate(item_r5.app.Name);
70
65
  i0.ɵɵadvance();
71
- i0.ɵɵproperty("ngIf", item_r5.app.Description);
66
+ i0.ɵɵconditional(item_r5.app.Description ? 6 : -1);
72
67
  } }
73
- function UserAppConfigComponent_kendo_window_1_div_4_div_24_Template(rf, ctx) { if (rf & 1) {
74
- i0.ɵɵelementStart(0, "div", 34);
75
- i0.ɵɵelement(1, "span", 44);
68
+ function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_25_Template(rf, ctx) { if (rf & 1) {
69
+ i0.ɵɵelementStart(0, "div", 27);
70
+ i0.ɵɵelement(1, "i", 41);
76
71
  i0.ɵɵelementStart(2, "p");
77
72
  i0.ɵɵtext(3, "No applications selected");
78
73
  i0.ɵɵelementEnd();
79
- i0.ɵɵelementStart(4, "p", 45);
74
+ i0.ɵɵelementStart(4, "p", 42);
80
75
  i0.ɵɵtext(5, "Add apps from the available list");
81
76
  i0.ɵɵelementEnd()();
82
77
  } }
83
- function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_span_8_Template(rf, ctx) { if (rf & 1) {
84
- i0.ɵɵelementStart(0, "span", 43);
78
+ function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
79
+ i0.ɵɵelementStart(0, "span", 38);
85
80
  i0.ɵɵtext(1);
86
81
  i0.ɵɵelementEnd();
87
82
  } if (rf & 2) {
88
- const item_r8 = i0.ɵɵnextContext().item;
83
+ const item_r9 = i0.ɵɵnextContext().$implicit;
89
84
  i0.ɵɵadvance();
90
- i0.ɵɵtextInterpolate(item_r8.app.Description);
85
+ i0.ɵɵtextInterpolate(item_r9.app.Description);
91
86
  } }
92
- function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_Template(rf, ctx) { if (rf & 1) {
87
+ function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template(rf, ctx) { if (rf & 1) {
93
88
  const _r7 = i0.ɵɵgetCurrentView();
94
- i0.ɵɵelementStart(0, "div", 47);
95
- i0.ɵɵlistener("dblclick", function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_Template_div_dblclick_0_listener($event) { const item_r8 = i0.ɵɵrestoreView(_r7).item; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.removeApp(item_r8); return i0.ɵɵresetView($event.stopPropagation()); });
96
- i0.ɵɵelementStart(1, "div", 48);
97
- i0.ɵɵelement(2, "span", 49);
89
+ i0.ɵɵelementStart(0, "div", 45);
90
+ i0.ɵɵlistener("dragstart", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template_div_dragstart_0_listener($event) { const ctx_r7 = i0.ɵɵrestoreView(_r7); const item_r9 = ctx_r7.$implicit; const ɵ$index_115_r10 = ctx_r7.$index; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onDragStart($event, item_r9, ɵ$index_115_r10)); })("dragend", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template_div_dragend_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onDragEnd($event)); })("dragenter", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template_div_dragenter_0_listener($event) { const ɵ$index_115_r10 = i0.ɵɵrestoreView(_r7).$index; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onDragEnter($event, ɵ$index_115_r10)); })("dblclick", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template_div_dblclick_0_listener($event) { const item_r9 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.removeApp(item_r9); return i0.ɵɵresetView($event.stopPropagation()); });
91
+ i0.ɵɵelementStart(1, "div", 46)(2, "div", 47);
92
+ i0.ɵɵelement(3, "i", 48);
98
93
  i0.ɵɵelementEnd();
99
- i0.ɵɵelementStart(3, "div", 37);
100
- i0.ɵɵelement(4, "span");
94
+ i0.ɵɵelementStart(4, "div", 34);
95
+ i0.ɵɵelement(5, "i", 35);
101
96
  i0.ɵɵelementEnd();
102
- i0.ɵɵelementStart(5, "div", 38)(6, "span", 39);
103
- i0.ɵɵtext(7);
97
+ i0.ɵɵelementStart(6, "div", 36)(7, "span", 37);
98
+ i0.ɵɵtext(8);
104
99
  i0.ɵɵelementEnd();
105
- i0.ɵɵtemplate(8, UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_span_8_Template, 2, 1, "span", 40);
100
+ i0.ɵɵtemplate(9, UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Conditional_9_Template, 2, 1, "span", 38);
106
101
  i0.ɵɵelementEnd();
107
- i0.ɵɵelementStart(9, "div", 50)(10, "button", 51);
108
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_Template_button_click_10_listener($event) { const item_r8 = i0.ɵɵrestoreView(_r7).item; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.moveUp(item_r8); return i0.ɵɵresetView($event.stopPropagation()); });
109
- i0.ɵɵelement(11, "span", 52);
102
+ i0.ɵɵelementStart(10, "div", 49)(11, "button", 50);
103
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template_button_click_11_listener($event) { const item_r9 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.moveUp(item_r9); return i0.ɵɵresetView($event.stopPropagation()); });
104
+ i0.ɵɵelement(12, "i", 51);
110
105
  i0.ɵɵelementEnd();
111
- i0.ɵɵelementStart(12, "button", 53);
112
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_Template_button_click_12_listener($event) { const item_r8 = i0.ɵɵrestoreView(_r7).item; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.moveDown(item_r8); return i0.ɵɵresetView($event.stopPropagation()); });
113
- i0.ɵɵelement(13, "span", 54);
106
+ i0.ɵɵelementStart(13, "button", 52);
107
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template_button_click_13_listener($event) { const item_r9 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.moveDown(item_r9); return i0.ɵɵresetView($event.stopPropagation()); });
108
+ i0.ɵɵelement(14, "i", 53);
114
109
  i0.ɵɵelementEnd();
115
- i0.ɵɵelementStart(14, "button", 55);
116
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_Template_button_click_14_listener($event) { const item_r8 = i0.ɵɵrestoreView(_r7).item; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.removeApp(item_r8); return i0.ɵɵresetView($event.stopPropagation()); });
117
- i0.ɵɵelement(15, "span", 56);
118
- i0.ɵɵelementEnd()()();
110
+ i0.ɵɵelementStart(15, "button", 54);
111
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template_button_click_15_listener($event) { const item_r9 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.removeApp(item_r9); return i0.ɵɵresetView($event.stopPropagation()); });
112
+ i0.ɵɵelement(16, "i", 6);
113
+ i0.ɵɵelementEnd()()()();
119
114
  } if (rf & 2) {
120
- const item_r8 = ctx.item;
121
- const index_r9 = ctx.index;
115
+ const item_r9 = ctx.$implicit;
116
+ const ɵ$index_115_r10 = ctx.$index;
122
117
  const ctx_r1 = i0.ɵɵnextContext(4);
123
- i0.ɵɵstyleProp("border-left-color", item_r8.app.GetColor());
118
+ i0.ɵɵclassProp("dragging", ctx_r1.draggedItem === item_r9);
119
+ i0.ɵɵadvance();
120
+ i0.ɵɵstyleProp("border-left-color", item_r9.app.GetColor());
124
121
  i0.ɵɵadvance(3);
125
- i0.ɵɵstyleProp("background-color", item_r8.app.GetColor());
122
+ i0.ɵɵstyleProp("background-color", item_r9.app.GetColor());
126
123
  i0.ɵɵadvance();
127
- i0.ɵɵclassMap(item_r8.app.Icon || "fa-solid fa-cube");
124
+ i0.ɵɵclassMap(item_r9.app.Icon || "fa-solid fa-cube");
128
125
  i0.ɵɵadvance(3);
129
- i0.ɵɵtextInterpolate(item_r8.app.Name);
126
+ i0.ɵɵtextInterpolate(item_r9.app.Name);
130
127
  i0.ɵɵadvance();
131
- i0.ɵɵproperty("ngIf", item_r8.app.Description);
128
+ i0.ɵɵconditional(item_r9.app.Description ? 9 : -1);
132
129
  i0.ɵɵadvance(2);
133
- i0.ɵɵproperty("disabled", index_r9 === 0);
130
+ i0.ɵɵproperty("disabled", ɵ$index_115_r10 === 0);
134
131
  i0.ɵɵadvance(2);
135
- i0.ɵɵproperty("disabled", index_r9 === ctx_r1.activeApps.length - 1);
132
+ i0.ɵɵproperty("disabled", ɵ$index_115_r10 === ctx_r1.activeApps.length - 1);
136
133
  } }
137
- function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_Template(rf, ctx) { if (rf & 1) {
134
+ function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_Template(rf, ctx) { if (rf & 1) {
138
135
  const _r6 = i0.ɵɵgetCurrentView();
139
- i0.ɵɵelementStart(0, "kendo-sortable", 46);
140
- i0.ɵɵlistener("dragEnd", function UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_Template_kendo_sortable_dragEnd_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDragEnd($event)); });
141
- i0.ɵɵtemplate(1, UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_ng_template_1_Template, 16, 10, "ng-template");
136
+ i0.ɵɵelementStart(0, "div", 43);
137
+ i0.ɵɵlistener("dragover", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_Template_div_dragover_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDragOver($event)); })("drop", function UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_Template_div_drop_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDrop($event)); });
138
+ i0.ɵɵrepeaterCreate(1, UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_For_2_Template, 17, 12, "div", 44, _forTrack0);
142
139
  i0.ɵɵelementEnd();
143
140
  } if (rf & 2) {
144
141
  const ctx_r1 = i0.ɵɵnextContext(3);
145
- i0.ɵɵproperty("kendoSortableBinding", ctx_r1.activeApps)("animation", true);
142
+ i0.ɵɵadvance();
143
+ i0.ɵɵrepeater(ctx_r1.activeApps);
146
144
  } }
147
- function UserAppConfigComponent_kendo_window_1_div_4_Template(rf, ctx) { if (rf & 1) {
145
+ function UserAppConfigComponent_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
148
146
  const _r3 = i0.ɵɵgetCurrentView();
149
- i0.ɵɵelementStart(0, "div", 20)(1, "p", 21);
147
+ i0.ɵɵelementStart(0, "div", 10)(1, "p", 19);
150
148
  i0.ɵɵtext(2, " Select which applications appear in your app switcher and arrange them in your preferred order. Double-click to quickly add or remove. Drag and drop to reorder, or use the arrow buttons. ");
151
149
  i0.ɵɵelementEnd();
152
- i0.ɵɵelementStart(3, "div", 22)(4, "div", 23)(5, "div", 24);
153
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_div_4_Template_div_click_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.availablePanelCollapsed = !ctx_r1.availablePanelCollapsed); });
154
- i0.ɵɵelement(6, "span", 25);
150
+ i0.ɵɵelementStart(3, "div", 20)(4, "div", 21)(5, "div", 22);
151
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Conditional_11_Template_div_click_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.availablePanelCollapsed = !ctx_r1.availablePanelCollapsed); });
152
+ i0.ɵɵelement(6, "i", 23);
155
153
  i0.ɵɵelementStart(7, "h3");
156
154
  i0.ɵɵtext(8, "Available Applications");
157
155
  i0.ɵɵelementEnd();
158
- i0.ɵɵelementStart(9, "span", 26);
156
+ i0.ɵɵelementStart(9, "span", 24);
159
157
  i0.ɵɵtext(10);
160
158
  i0.ɵɵelementEnd();
161
- i0.ɵɵelement(11, "span", 27);
159
+ i0.ɵɵelement(11, "i", 25);
162
160
  i0.ɵɵelementEnd();
163
- i0.ɵɵelementStart(12, "div", 28);
164
- i0.ɵɵtemplate(13, UserAppConfigComponent_kendo_window_1_div_4_div_13_Template, 4, 0, "div", 29)(14, UserAppConfigComponent_kendo_window_1_div_4_div_14_Template, 10, 6, "div", 30);
161
+ i0.ɵɵelementStart(12, "div", 26);
162
+ i0.ɵɵtemplate(13, UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_13_Template, 4, 0, "div", 27);
163
+ i0.ɵɵrepeaterCreate(14, UserAppConfigComponent_Conditional_0_Conditional_11_For_15_Template, 10, 6, "div", 28, _forTrack0);
165
164
  i0.ɵɵelementEnd()();
166
- i0.ɵɵelementStart(15, "div", 31)(16, "div", 24);
167
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_div_4_Template_div_click_16_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.selectedPanelCollapsed = !ctx_r1.selectedPanelCollapsed); });
168
- i0.ɵɵelement(17, "span", 32);
169
- i0.ɵɵelementStart(18, "h3");
170
- i0.ɵɵtext(19, "Your Applications");
165
+ i0.ɵɵelementStart(16, "div", 29)(17, "div", 22);
166
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Conditional_11_Template_div_click_17_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.selectedPanelCollapsed = !ctx_r1.selectedPanelCollapsed); });
167
+ i0.ɵɵelement(18, "i", 30);
168
+ i0.ɵɵelementStart(19, "h3");
169
+ i0.ɵɵtext(20, "Your Applications");
171
170
  i0.ɵɵelementEnd();
172
- i0.ɵɵelementStart(20, "span", 26);
173
- i0.ɵɵtext(21);
171
+ i0.ɵɵelementStart(21, "span", 24);
172
+ i0.ɵɵtext(22);
174
173
  i0.ɵɵelementEnd();
175
- i0.ɵɵelement(22, "span", 27);
174
+ i0.ɵɵelement(23, "i", 25);
176
175
  i0.ɵɵelementEnd();
177
- i0.ɵɵelementStart(23, "div", 28);
178
- i0.ɵɵtemplate(24, UserAppConfigComponent_kendo_window_1_div_4_div_24_Template, 6, 0, "div", 29)(25, UserAppConfigComponent_kendo_window_1_div_4_kendo_sortable_25_Template, 2, 2, "kendo-sortable", 33);
176
+ i0.ɵɵelementStart(24, "div", 26);
177
+ i0.ɵɵtemplate(25, UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_25_Template, 6, 0, "div", 27)(26, UserAppConfigComponent_Conditional_0_Conditional_11_Conditional_26_Template, 3, 0, "div", 31);
179
178
  i0.ɵɵelementEnd()()()();
180
179
  } if (rf & 2) {
181
180
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -186,77 +185,86 @@ function UserAppConfigComponent_kendo_window_1_div_4_Template(rf, ctx) { if (rf
186
185
  i0.ɵɵadvance();
187
186
  i0.ɵɵclassProp("fa-chevron-down", ctx_r1.availablePanelCollapsed)("fa-chevron-up", !ctx_r1.availablePanelCollapsed);
188
187
  i0.ɵɵadvance(2);
189
- i0.ɵɵproperty("ngIf", ctx_r1.availableApps.length === 0);
190
- i0.ɵɵadvance();
191
- i0.ɵɵproperty("ngForOf", ctx_r1.availableApps);
188
+ i0.ɵɵconditional(ctx_r1.availableApps.length === 0 ? 13 : -1);
192
189
  i0.ɵɵadvance();
190
+ i0.ɵɵrepeater(ctx_r1.availableApps);
191
+ i0.ɵɵadvance(2);
193
192
  i0.ɵɵclassProp("collapsed", ctx_r1.selectedPanelCollapsed);
194
193
  i0.ɵɵadvance(6);
195
194
  i0.ɵɵtextInterpolate(ctx_r1.activeApps.length);
196
195
  i0.ɵɵadvance();
197
196
  i0.ɵɵclassProp("fa-chevron-down", ctx_r1.selectedPanelCollapsed)("fa-chevron-up", !ctx_r1.selectedPanelCollapsed);
198
197
  i0.ɵɵadvance(2);
199
- i0.ɵɵproperty("ngIf", ctx_r1.activeApps.length === 0);
198
+ i0.ɵɵconditional(ctx_r1.activeApps.length === 0 ? 25 : -1);
200
199
  i0.ɵɵadvance();
201
- i0.ɵɵproperty("ngIf", ctx_r1.activeApps.length > 0);
200
+ i0.ɵɵconditional(ctx_r1.activeApps.length > 0 ? 26 : -1);
202
201
  } }
203
- function UserAppConfigComponent_kendo_window_1_button_7_Template(rf, ctx) { if (rf & 1) {
204
- const _r10 = i0.ɵɵgetCurrentView();
205
- i0.ɵɵelementStart(0, "button", 15);
206
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.reset()); });
207
- i0.ɵɵelement(1, "span", 57);
202
+ function UserAppConfigComponent_Conditional_0_Conditional_14_Template(rf, ctx) { if (rf & 1) {
203
+ const _r11 = i0.ɵɵgetCurrentView();
204
+ i0.ɵɵelementStart(0, "button", 16);
205
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.reset()); });
206
+ i0.ɵɵelement(1, "i", 55);
208
207
  i0.ɵɵtext(2, " Reset Changes ");
209
208
  i0.ɵɵelementEnd();
210
209
  } if (rf & 2) {
211
210
  const ctx_r1 = i0.ɵɵnextContext(2);
212
211
  i0.ɵɵproperty("disabled", ctx_r1.isLoading || ctx_r1.isSaving);
213
212
  } }
214
- function UserAppConfigComponent_kendo_window_1_mj_loading_10_Template(rf, ctx) { if (rf & 1) {
215
- i0.ɵɵelement(0, "mj-loading", 58);
213
+ function UserAppConfigComponent_Conditional_0_Conditional_17_Template(rf, ctx) { if (rf & 1) {
214
+ i0.ɵɵelement(0, "mj-loading", 56);
215
+ i0.ɵɵelementStart(1, "span");
216
+ i0.ɵɵtext(2, "Saving...");
217
+ i0.ɵɵelementEnd();
216
218
  } if (rf & 2) {
217
219
  i0.ɵɵproperty("showText", false);
218
220
  } }
219
- function UserAppConfigComponent_kendo_window_1_span_11_Template(rf, ctx) { if (rf & 1) {
220
- i0.ɵɵelement(0, "span", 59);
221
+ function UserAppConfigComponent_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
222
+ i0.ɵɵelement(0, "i", 57);
223
+ i0.ɵɵelementStart(1, "span");
224
+ i0.ɵɵtext(2, "Save Changes");
225
+ i0.ɵɵelementEnd();
221
226
  } }
222
- function UserAppConfigComponent_kendo_window_1_Template(rf, ctx) { if (rf & 1) {
227
+ function UserAppConfigComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
223
228
  const _r1 = i0.ɵɵgetCurrentView();
224
- i0.ɵɵelementStart(0, "kendo-window", 3);
225
- i0.ɵɵlistener("close", function UserAppConfigComponent_kendo_window_1_Template_kendo_window_close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
226
- i0.ɵɵelementStart(1, "div", 4);
227
- i0.ɵɵtemplate(2, UserAppConfigComponent_kendo_window_1_div_2_Template, 2, 0, "div", 5)(3, UserAppConfigComponent_kendo_window_1_div_3_Template, 3, 1, "div", 6)(4, UserAppConfigComponent_kendo_window_1_div_4_Template, 26, 18, "div", 7);
228
- i0.ɵɵelementStart(5, "div", 8)(6, "div", 9);
229
- i0.ɵɵtemplate(7, UserAppConfigComponent_kendo_window_1_button_7_Template, 3, 1, "button", 10);
229
+ i0.ɵɵelementStart(0, "div", 0);
230
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
230
231
  i0.ɵɵelementEnd();
231
- i0.ɵɵelementStart(8, "div", 11)(9, "button", 12);
232
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.save()); });
233
- i0.ɵɵtemplate(10, UserAppConfigComponent_kendo_window_1_mj_loading_10_Template, 1, 1, "mj-loading", 13)(11, UserAppConfigComponent_kendo_window_1_span_11_Template, 1, 0, "span", 14);
234
- i0.ɵɵtext(12);
232
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "h2", 3);
233
+ i0.ɵɵelement(4, "i", 4);
234
+ i0.ɵɵtext(5, " Configure Apps ");
235
+ i0.ɵɵelementEnd();
236
+ i0.ɵɵelementStart(6, "button", 5);
237
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
238
+ i0.ɵɵelement(7, "i", 6);
239
+ i0.ɵɵelementEnd()();
240
+ i0.ɵɵelementStart(8, "div", 7);
241
+ i0.ɵɵtemplate(9, UserAppConfigComponent_Conditional_0_Conditional_9_Template, 2, 0, "div", 8)(10, UserAppConfigComponent_Conditional_0_Conditional_10_Template, 4, 1, "div", 9)(11, UserAppConfigComponent_Conditional_0_Conditional_11_Template, 27, 17, "div", 10);
242
+ i0.ɵɵelementStart(12, "div", 11)(13, "div", 12);
243
+ i0.ɵɵtemplate(14, UserAppConfigComponent_Conditional_0_Conditional_14_Template, 3, 1, "button", 13);
235
244
  i0.ɵɵelementEnd();
236
- i0.ɵɵelementStart(13, "button", 15);
237
- i0.ɵɵlistener("click", function UserAppConfigComponent_kendo_window_1_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
238
- i0.ɵɵtext(14, " Cancel ");
245
+ i0.ɵɵelementStart(15, "div", 14)(16, "button", 15);
246
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.save()); });
247
+ i0.ɵɵtemplate(17, UserAppConfigComponent_Conditional_0_Conditional_17_Template, 3, 1)(18, UserAppConfigComponent_Conditional_0_Conditional_18_Template, 3, 0);
248
+ i0.ɵɵelementEnd();
249
+ i0.ɵɵelementStart(19, "button", 16);
250
+ i0.ɵɵlistener("click", function UserAppConfigComponent_Conditional_0_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
251
+ i0.ɵɵtext(20, " Cancel ");
239
252
  i0.ɵɵelementEnd()()()()();
240
253
  } if (rf & 2) {
241
254
  const ctx_r1 = i0.ɵɵnextContext();
242
- i0.ɵɵproperty("top", 0)("left", 0)("resizable", false)("draggable", false);
243
- i0.ɵɵadvance(2);
244
- i0.ɵɵproperty("ngIf", ctx_r1.isLoading);
255
+ i0.ɵɵadvance(9);
256
+ i0.ɵɵconditional(ctx_r1.isLoading ? 9 : -1);
245
257
  i0.ɵɵadvance();
246
- i0.ɵɵproperty("ngIf", ctx_r1.errorMessage);
258
+ i0.ɵɵconditional(ctx_r1.errorMessage ? 10 : -1);
247
259
  i0.ɵɵadvance();
248
- i0.ɵɵproperty("ngIf", !ctx_r1.isLoading);
260
+ i0.ɵɵconditional(!ctx_r1.isLoading ? 11 : -1);
249
261
  i0.ɵɵadvance(3);
250
- i0.ɵɵproperty("ngIf", ctx_r1.hasChanges());
262
+ i0.ɵɵconditional(ctx_r1.hasChanges() ? 14 : -1);
251
263
  i0.ɵɵadvance(2);
252
264
  i0.ɵɵproperty("disabled", ctx_r1.isLoading || ctx_r1.isSaving || !ctx_r1.hasChanges());
253
265
  i0.ɵɵadvance();
254
- i0.ɵɵproperty("ngIf", ctx_r1.isSaving);
255
- i0.ɵɵadvance();
256
- i0.ɵɵproperty("ngIf", !ctx_r1.isSaving);
257
- i0.ɵɵadvance();
258
- i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save Changes", " ");
259
- i0.ɵɵadvance();
266
+ i0.ɵɵconditional(ctx_r1.isSaving ? 17 : 18);
267
+ i0.ɵɵadvance(2);
260
268
  i0.ɵɵproperty("disabled", ctx_r1.isSaving);
261
269
  } }
262
270
  /**
@@ -284,6 +292,10 @@ export class UserAppConfigComponent {
284
292
  // Panel collapse state (for mobile)
285
293
  availablePanelCollapsed = false;
286
294
  selectedPanelCollapsed = false;
295
+ // Native drag-and-drop state
296
+ draggedItem = null;
297
+ draggedIndex = -1;
298
+ dropTargetIndex = -1;
287
299
  constructor(appManager, sharedService, cdr) {
288
300
  this.appManager = appManager;
289
301
  this.sharedService = sharedService;
@@ -367,18 +379,63 @@ export class UserAppConfigComponent {
367
379
  .sort((a, b) => a.app.Name.localeCompare(b.app.Name));
368
380
  }
369
381
  /**
370
- * Handles drag-and-drop reordering of active apps
382
+ * Native drag start handler
383
+ */
384
+ onDragStart(event, item, index) {
385
+ this.draggedItem = item;
386
+ this.draggedIndex = index;
387
+ if (event.dataTransfer) {
388
+ event.dataTransfer.effectAllowed = 'move';
389
+ event.dataTransfer.setData('text/plain', index.toString());
390
+ }
391
+ }
392
+ /**
393
+ * Native drag over handler - allows drop
394
+ */
395
+ onDragOver(event) {
396
+ event.preventDefault();
397
+ if (event.dataTransfer) {
398
+ event.dataTransfer.dropEffect = 'move';
399
+ }
400
+ }
401
+ /**
402
+ * Native drag enter handler - tracks drop target
403
+ */
404
+ onDragEnter(event, index) {
405
+ event.preventDefault();
406
+ this.dropTargetIndex = index;
407
+ }
408
+ /**
409
+ * Native drag end handler - cleanup
371
410
  */
372
411
  onDragEnd(event) {
373
- if (event.index >= 0) {
412
+ this.draggedItem = null;
413
+ this.draggedIndex = -1;
414
+ this.dropTargetIndex = -1;
415
+ }
416
+ /**
417
+ * Native drop handler - reorder items
418
+ */
419
+ onDrop(event) {
420
+ event.preventDefault();
421
+ if (this.draggedIndex >= 0 && this.dropTargetIndex >= 0 && this.draggedIndex !== this.dropTargetIndex) {
422
+ // Remove item from old position
423
+ const [movedItem] = this.activeApps.splice(this.draggedIndex, 1);
424
+ // Insert at new position
425
+ this.activeApps.splice(this.dropTargetIndex, 0, movedItem);
374
426
  // Update sequences based on new order
375
- this.activeApps.forEach((item, index) => {
376
- if (item.sequence !== index) {
377
- item.sequence = index;
427
+ this.activeApps.forEach((item, idx) => {
428
+ if (item.sequence !== idx) {
429
+ item.sequence = idx;
378
430
  item.isDirty = true;
379
431
  }
380
432
  });
433
+ this.cdr.detectChanges();
381
434
  }
435
+ // Reset drag state
436
+ this.draggedItem = null;
437
+ this.draggedIndex = -1;
438
+ this.dropTargetIndex = -1;
382
439
  }
383
440
  /**
384
441
  * Adds an app to the user's active list
@@ -530,17 +587,15 @@ export class UserAppConfigComponent {
530
587
  await this.loadConfiguration();
531
588
  }
532
589
  static ɵfac = function UserAppConfigComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || UserAppConfigComponent)(i0.ɵɵdirectiveInject(i1.ApplicationManager), i0.ɵɵdirectiveInject(i2.SharedService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
533
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserAppConfigComponent, selectors: [["mj-user-app-config"]], inputs: { showDialog: "showDialog" }, outputs: { showDialogChange: "showDialogChange", configSaved: "configSaved" }, decls: 2, vars: 2, consts: [["class", "k-overlay", 4, "ngIf"], ["title", "Configure Apps", "class", "full-screen-dialog", 3, "top", "left", "resizable", "draggable", "close", 4, "ngIf"], [1, "k-overlay"], ["title", "Configure Apps", 1, "full-screen-dialog", 3, "close", "top", "left", "resizable", "draggable"], [1, "app-config-container"], ["class", "loading-container", 4, "ngIf"], ["class", "error-message", 4, "ngIf"], ["class", "config-content", 4, "ngIf"], [1, "dialog-footer"], [1, "footer-left"], ["kendoButton", "", "fillMode", "outline", 3, "disabled", "click", 4, "ngIf"], [1, "footer-right"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], ["size", "small", 3, "showText", 4, "ngIf"], ["class", "fa-solid fa-check", 4, "ngIf"], ["kendoButton", "", "fillMode", "outline", 3, "click", "disabled"], [1, "loading-container"], ["text", "Loading your app configuration...", "size", "medium"], [1, "error-message"], [1, "fa-solid", "fa-circle-exclamation"], [1, "config-content"], [1, "config-description"], [1, "panels-container"], [1, "panel", "available-apps-panel"], [1, "panel-header", 3, "click"], [1, "fa-solid", "fa-layer-group"], [1, "badge"], [1, "collapse-toggle", "fa-solid"], [1, "panel-content"], ["class", "empty-state", 4, "ngIf"], ["class", "available-app-item", 3, "dblclick", 4, "ngFor", "ngForOf"], [1, "panel", "selected-apps-panel"], [1, "fa-solid", "fa-check-circle"], ["itemClass", "app-item", "activeItemClass", "app-item dragging", 3, "kendoSortableBinding", "animation", "dragEnd", 4, "ngIf"], [1, "empty-state"], [1, "fa-solid", "fa-check-double"], [1, "available-app-item", 3, "dblclick"], [1, "app-icon"], [1, "app-info"], [1, "app-name"], ["class", "app-description", 4, "ngIf"], ["kendoButton", "", "themeColor", "primary", "fillMode", "outline", "title", "Add to your apps", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "app-description"], [1, "fa-solid", "fa-inbox"], [1, "hint"], ["itemClass", "app-item", "activeItemClass", "app-item dragging", 3, "dragEnd", "kendoSortableBinding", "animation"], [1, "app-item-content", 3, "dblclick"], [1, "drag-handle"], [1, "fa-solid", "fa-grip-vertical"], [1, "app-actions"], ["kendoButton", "", "fillMode", "flat", "title", "Move up", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["kendoButton", "", "fillMode", "flat", "title", "Move down", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["kendoButton", "", "fillMode", "flat", "themeColor", "error", "title", "Remove from your apps", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-rotate-left"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-check"]], template: function UserAppConfigComponent_Template(rf, ctx) { if (rf & 1) {
534
- i0.ɵɵtemplate(0, UserAppConfigComponent_div_0_Template, 1, 0, "div", 0)(1, UserAppConfigComponent_kendo_window_1_Template, 15, 13, "kendo-window", 1);
590
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserAppConfigComponent, selectors: [["mj-user-app-config"]], inputs: { showDialog: "showDialog" }, outputs: { showDialogChange: "showDialogChange", configSaved: "configSaved" }, decls: 1, vars: 1, consts: [["role", "presentation", 1, "modal-backdrop", 3, "click"], ["role", "dialog", "aria-modal", "true", "aria-labelledby", "app-config-title", 1, "modal-dialog", "full-screen-dialog"], [1, "modal-header"], ["id", "app-config-title", 1, "modal-title"], ["aria-hidden", "true", 1, "fa-solid", "fa-grid-2"], ["aria-label", "Close dialog", 1, "modal-close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], [1, "app-config-container"], ["role", "status", "aria-live", "polite", 1, "loading-container"], ["role", "alert", 1, "error-message"], [1, "config-content"], [1, "dialog-footer"], [1, "footer-left"], [1, "mj-btn", "mj-btn-secondary", 3, "disabled"], [1, "footer-right"], [1, "mj-btn", "mj-btn-primary", 3, "click", "disabled"], [1, "mj-btn", "mj-btn-secondary", 3, "click", "disabled"], ["text", "Loading your app configuration...", "size", "medium"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle-exclamation"], [1, "config-description"], [1, "panels-container"], [1, "panel", "available-apps-panel"], [1, "panel-header", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-layer-group"], [1, "badge"], ["aria-hidden", "true", 1, "collapse-toggle", "fa-solid"], [1, "panel-content"], [1, "empty-state"], [1, "available-app-item"], [1, "panel", "selected-apps-panel"], ["aria-hidden", "true", 1, "fa-solid", "fa-check-circle"], [1, "sortable-list"], ["aria-hidden", "true", 1, "fa-solid", "fa-check-double"], [1, "available-app-item", 3, "dblclick"], [1, "app-icon"], ["aria-hidden", "true"], [1, "app-info"], [1, "app-name"], [1, "app-description"], ["title", "Add to your apps", 1, "mj-btn", "mj-btn-primary", "mj-btn-outline", "mj-btn-sm", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], ["aria-hidden", "true", 1, "fa-solid", "fa-inbox"], [1, "hint"], [1, "sortable-list", 3, "dragover", "drop"], ["draggable", "true", 1, "app-item", 3, "dragging"], ["draggable", "true", 1, "app-item", 3, "dragstart", "dragend", "dragenter", "dblclick"], [1, "app-item-content"], [1, "drag-handle"], ["aria-hidden", "true", 1, "fa-solid", "fa-grip-vertical"], [1, "app-actions"], ["title", "Move up", 1, "mj-btn", "mj-btn-ghost", "mj-btn-sm", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-up"], ["title", "Move down", 1, "mj-btn", "mj-btn-ghost", "mj-btn-sm", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-down"], ["title", "Remove from your apps", 1, "mj-btn", "mj-btn-ghost", "mj-btn-sm", "mj-btn-danger", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate-left"], ["size", "small", 3, "showText"], ["aria-hidden", "true", 1, "fa-solid", "fa-check"]], template: function UserAppConfigComponent_Template(rf, ctx) { if (rf & 1) {
591
+ i0.ɵɵtemplate(0, UserAppConfigComponent_Conditional_0_Template, 21, 7);
535
592
  } if (rf & 2) {
536
- i0.ɵɵproperty("ngIf", ctx.showDialog);
537
- i0.ɵɵadvance();
538
- i0.ɵɵproperty("ngIf", ctx.showDialog);
539
- } }, dependencies: [i3.NgForOf, i3.NgIf, i4.WindowComponent, i5.ButtonComponent, i6.SortableComponent, i6.SortableBindingDirective, i7.LoadingComponent], styles: ["\n\n[_nghost-%COMP%] .full-screen-dialog {\n width: 100vw !important;\n height: 100vh !important;\n}\n\n[_nghost-%COMP%] .full-screen-dialog .k-window {\n border-radius: 0;\n box-shadow: none;\n}\n\n[_nghost-%COMP%] .full-screen-dialog .k-window-titlebar {\n background: var(--kendo-component-bg, #ffffff);\n border-bottom: 1px solid var(--kendo-border-color, #e0e0e0);\n padding: 16px 24px;\n}\n\n[_nghost-%COMP%] .full-screen-dialog .k-window-title {\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n\n\n[_nghost-%COMP%] .full-screen-dialog .k-window-titlebar-action:not(:last-child) {\n display: none;\n}\n\n[_nghost-%COMP%] .full-screen-dialog .k-window-content {\n padding: 0;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n\n\n.app-config-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--kendo-surface-bg, #f5f5f5);\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n color: var(--kendo-subtle-text, #666);\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n background: var(--kendo-error-bg, #ffebee);\n color: var(--kendo-error-text, #c62828);\n border-bottom: 1px solid var(--kendo-error-border, #ef9a9a);\n}\n\n.error-message[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n}\n\n\n\n.config-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 24px;\n overflow: hidden;\n}\n\n.config-description[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n color: var(--kendo-subtle-text, #666);\n font-size: 0.95rem;\n line-height: 1.5;\n}\n\n\n\n.panels-container[_ngcontent-%COMP%] {\n flex: 1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n overflow: hidden;\n}\n\n@media (max-width: 900px) {\n .panels-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n overflow-y: auto;\n }\n\n \n\n .panel-header[_ngcontent-%COMP%] .collapse-toggle[_ngcontent-%COMP%] {\n display: inline-block !important;\n color: var(--kendo-subtle-text, #666) !important;\n }\n\n \n\n .panel-header[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n }\n\n .panel-header[_ngcontent-%COMP%]:hover {\n background: var(--kendo-hover-bg, #f0f0f0);\n }\n\n \n\n .panel.collapsed[_ngcontent-%COMP%] {\n flex: 0 0 auto !important;\n }\n\n .panel.collapsed[_ngcontent-%COMP%] .panel-content[_ngcontent-%COMP%] {\n display: none !important;\n }\n\n .panel.collapsed[_ngcontent-%COMP%] .panel-header[_ngcontent-%COMP%] {\n border-bottom: none;\n }\n\n \n\n .panel[_ngcontent-%COMP%]:not(.collapsed) {\n flex: 1 1 auto;\n min-height: 150px;\n }\n}\n\n\n\n.panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: var(--kendo-component-bg, #ffffff);\n border: 1px solid var(--kendo-border-color, #e0e0e0);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 20px;\n background: var(--kendo-surface-bg, #fafafa);\n border-bottom: 1px solid var(--kendo-border-color, #e0e0e0);\n}\n\n.panel-header[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n color: var(--kendo-primary, #0078d4);\n}\n\n.panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n flex: 1;\n}\n\n.panel-header[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%] {\n background: var(--kendo-primary, #0078d4);\n color: white;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 0.85rem;\n font-weight: 500;\n}\n\n\n\n.panel-header[_ngcontent-%COMP%] .collapse-toggle[_ngcontent-%COMP%] {\n display: none;\n color: var(--kendo-subtle-text, #666);\n font-size: 0.9rem;\n margin-left: 8px;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--kendo-subtle-text, #999);\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85rem;\n opacity: 0.7;\n}\n\n\n\n[_nghost-%COMP%] .app-item {\n margin-bottom: 8px;\n cursor: grab;\n}\n\n[_nghost-%COMP%] .app-item.dragging {\n opacity: 0.8;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n.app-item-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--kendo-component-bg, #ffffff);\n border: 1px solid var(--kendo-border-color, #e0e0e0);\n border-left-width: 4px;\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.app-item-content[_ngcontent-%COMP%]:hover {\n border-color: var(--kendo-primary, #0078d4);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--kendo-subtle-text, #999);\n cursor: grab;\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.app-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.app-info[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.app-name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 0.95rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-description[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--kendo-subtle-text, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.app-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 4px 8px;\n}\n\n\n\n.available-app-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin-bottom: 8px;\n background: var(--kendo-component-bg, #ffffff);\n border: 1px solid var(--kendo-border-color, #e0e0e0);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.available-app-item[_ngcontent-%COMP%]:hover {\n border-color: var(--kendo-primary, #0078d4);\n background: var(--kendo-surface-bg, #fafafa);\n}\n\n.available-app-item[_ngcontent-%COMP%] .app-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: var(--kendo-component-bg, #ffffff);\n border-top: 1px solid var(--kendo-border-color, #e0e0e0);\n}\n\n.footer-left[_ngcontent-%COMP%], \n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n@media (max-width: 600px) {\n .config-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .panels-container[_ngcontent-%COMP%] {\n gap: 16px;\n }\n\n .app-item-content[_ngcontent-%COMP%], \n .available-app-item[_ngcontent-%COMP%] {\n padding: 10px 12px;\n }\n\n .app-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n .app-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 2px 6px;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n }\n\n .footer-left[_ngcontent-%COMP%], \n .footer-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}"] });
593
+ i0.ɵɵconditional(ctx.showDialog ? 0 : -1);
594
+ } }, dependencies: [i3.LoadingComponent], styles: ["\n\n\n\n\n\n\n.modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n}\n\n\n\n.full-screen-dialog[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: var(--mat-sys-surface);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.5rem;\n background: var(--mat-sys-surface);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n}\n\n.modal-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mat-sys-primary);\n}\n\n.modal-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border: none;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.modal-close[_ngcontent-%COMP%]:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.modal-close[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n\n\n.app-config-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n background: var(--mat-sys-surface-container-lowest);\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 1rem;\n color: var(--mat-sys-on-surface-variant);\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n background: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n border-bottom: 1px solid var(--mat-sys-error);\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1rem;\n}\n\n\n\n.config-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 1.5rem;\n overflow: hidden;\n}\n\n.config-description[_ngcontent-%COMP%] {\n margin: 0 0 1.5rem 0;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n line-height: 1.5;\n}\n\n\n\n.panels-container[_ngcontent-%COMP%] {\n flex: 1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n overflow: hidden;\n}\n\n@media (max-width: 900px) {\n .panels-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: auto;\n }\n\n \n\n .panel-header[_ngcontent-%COMP%] .collapse-toggle[_ngcontent-%COMP%] {\n display: inline-block !important;\n color: var(--mat-sys-on-surface-variant) !important;\n }\n\n \n\n .panel-header[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n }\n\n .panel-header[_ngcontent-%COMP%]:hover {\n background: var(--mat-sys-surface-container);\n }\n\n \n\n .panel.collapsed[_ngcontent-%COMP%] {\n flex: 0 0 auto !important;\n }\n\n .panel.collapsed[_ngcontent-%COMP%] .panel-content[_ngcontent-%COMP%] {\n display: none !important;\n }\n\n .panel.collapsed[_ngcontent-%COMP%] .panel-header[_ngcontent-%COMP%] {\n border-bottom: none;\n }\n\n \n\n .panel[_ngcontent-%COMP%]:not(.collapsed) {\n flex: 1 1 auto;\n min-height: 150px;\n }\n}\n\n\n\n.panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: var(--mat-sys-surface);\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-medium);\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 1rem 1.25rem;\n background: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n}\n\n.panel-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n font-size: 1.1rem;\n color: var(--mat-sys-primary);\n}\n\n.panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font: var(--mat-sys-title-medium);\n color: var(--mat-sys-on-surface);\n flex: 1;\n}\n\n.panel-header[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%] {\n background: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n padding: 0.125rem 0.625rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-medium);\n font-weight: 500;\n}\n\n\n\n.panel-header[_ngcontent-%COMP%] .collapse-toggle[_ngcontent-%COMP%] {\n display: none;\n color: var(--mat-sys-on-surface-variant);\n font-size: 0.9rem;\n margin-left: 0.5rem;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 0.75rem;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 1.5rem;\n color: var(--mat-sys-on-surface-variant);\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2.5rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font: var(--mat-sys-body-large);\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n margin-top: 0.25rem;\n font: var(--mat-sys-body-medium);\n opacity: 0.7;\n}\n\n\n\n.sortable-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n\n\n.app-item[_ngcontent-%COMP%] {\n cursor: grab;\n transition: transform 0.2s, opacity 0.2s;\n}\n\n.app-item[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.app-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.5;\n transform: scale(0.98);\n}\n\n.app-item-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mat-sys-surface);\n border: 1px solid var(--mat-sys-outline-variant);\n border-left-width: 4px;\n border-radius: var(--mat-sys-corner-small);\n transition: all 0.2s ease;\n}\n\n.app-item-content[_ngcontent-%COMP%]:hover {\n border-color: var(--mat-sys-primary);\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n cursor: grab;\n padding: 0.25rem;\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.app-icon[_ngcontent-%COMP%] {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: var(--mat-sys-corner-small);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.app-info[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.app-name[_ngcontent-%COMP%] {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n color: var(--mat-sys-on-surface);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-description[_ngcontent-%COMP%] {\n font: var(--mat-sys-body-small);\n color: var(--mat-sys-on-surface-variant);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n flex-shrink: 0;\n}\n\n\n\n.available-app-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-bottom: 0.5rem;\n background: var(--mat-sys-surface);\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-small);\n transition: all 0.2s ease;\n}\n\n.available-app-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mat-sys-primary);\n background: var(--mat-sys-surface-container);\n}\n\n.available-app-item[_ngcontent-%COMP%] .app-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.5rem;\n background: var(--mat-sys-surface);\n border-top: 1px solid var(--mat-sys-outline-variant);\n}\n\n.footer-left[_ngcontent-%COMP%], \n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.75rem;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n\n\n@media (max-width: 600px) {\n .config-content[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n\n .panels-container[_ngcontent-%COMP%] {\n gap: 1rem;\n }\n\n .app-item-content[_ngcontent-%COMP%], \n .available-app-item[_ngcontent-%COMP%] {\n padding: 0.625rem 0.75rem;\n }\n\n .app-icon[_ngcontent-%COMP%] {\n width: 2.25rem;\n height: 2.25rem;\n font-size: 1rem;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .footer-left[_ngcontent-%COMP%], \n .footer-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}\n\n\n\n@media (prefers-reduced-motion: reduce) {\n .app-item[_ngcontent-%COMP%], \n .app-item-content[_ngcontent-%COMP%], \n .available-app-item[_ngcontent-%COMP%], \n .modal-close[_ngcontent-%COMP%] {\n transition: none;\n }\n}"] });
540
595
  }
541
596
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserAppConfigComponent, [{
542
597
  type: Component,
543
- args: [{ selector: 'mj-user-app-config', template: "<div class=\"k-overlay\" *ngIf=\"showDialog\"></div>\n<kendo-window\n *ngIf=\"showDialog\"\n [top]=\"0\"\n [left]=\"0\"\n [resizable]=\"false\"\n [draggable]=\"false\"\n title=\"Configure Apps\"\n (close)=\"close()\"\n class=\"full-screen-dialog\"\n>\n <div class=\"app-config-container\">\n <!-- Loading State -->\n <div *ngIf=\"isLoading\" class=\"loading-container\">\n <mj-loading text=\"Loading your app configuration...\" size=\"medium\"></mj-loading>\n </div>\n\n <!-- Error Message -->\n <div *ngIf=\"errorMessage\" class=\"error-message\">\n <span class=\"fa-solid fa-circle-exclamation\"></span>\n {{ errorMessage }}\n </div>\n\n <!-- Main Content -->\n <div *ngIf=\"!isLoading\" class=\"config-content\">\n <p class=\"config-description\">\n Select which applications appear in your app switcher and arrange them in your preferred order.\n Double-click to quickly add or remove. Drag and drop to reorder, or use the arrow buttons.\n </p>\n\n <div class=\"panels-container\">\n <!-- Available Apps Panel -->\n <div class=\"panel available-apps-panel\" [class.collapsed]=\"availablePanelCollapsed\">\n <div class=\"panel-header\" (click)=\"availablePanelCollapsed = !availablePanelCollapsed\">\n <span class=\"fa-solid fa-layer-group\"></span>\n <h3>Available Applications</h3>\n <span class=\"badge\">{{ availableApps.length }}</span>\n <span class=\"collapse-toggle fa-solid\" [class.fa-chevron-down]=\"availablePanelCollapsed\" [class.fa-chevron-up]=\"!availablePanelCollapsed\"></span>\n </div>\n\n <div class=\"panel-content\">\n <div *ngIf=\"availableApps.length === 0\" class=\"empty-state\">\n <span class=\"fa-solid fa-check-double\"></span>\n <p>All applications added!</p>\n </div>\n\n <div *ngFor=\"let item of availableApps\" class=\"available-app-item\" (dblclick)=\"addApp(item)\">\n <div class=\"app-icon\" [style.background-color]=\"item.app.GetColor()\">\n <span [class]=\"item.app.Icon || 'fa-solid fa-cube'\"></span>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n <span class=\"app-description\" *ngIf=\"item.app.Description\">{{ item.app.Description }}</span>\n </div>\n\n <button\n kendoButton\n themeColor=\"primary\"\n fillMode=\"outline\"\n (click)=\"addApp(item)\"\n title=\"Add to your apps\"\n >\n <span class=\"fa-solid fa-plus\"></span>\n Add\n </button>\n </div>\n </div>\n </div>\n\n <!-- Selected Apps Panel -->\n <div class=\"panel selected-apps-panel\" [class.collapsed]=\"selectedPanelCollapsed\">\n <div class=\"panel-header\" (click)=\"selectedPanelCollapsed = !selectedPanelCollapsed\">\n <span class=\"fa-solid fa-check-circle\"></span>\n <h3>Your Applications</h3>\n <span class=\"badge\">{{ activeApps.length }}</span>\n <span class=\"collapse-toggle fa-solid\" [class.fa-chevron-down]=\"selectedPanelCollapsed\" [class.fa-chevron-up]=\"!selectedPanelCollapsed\"></span>\n </div>\n\n <div class=\"panel-content\">\n <div *ngIf=\"activeApps.length === 0\" class=\"empty-state\">\n <span class=\"fa-solid fa-inbox\"></span>\n <p>No applications selected</p>\n <p class=\"hint\">Add apps from the available list</p>\n </div>\n\n <kendo-sortable\n *ngIf=\"activeApps.length > 0\"\n [kendoSortableBinding]=\"activeApps\"\n [animation]=\"true\"\n itemClass=\"app-item\"\n activeItemClass=\"app-item dragging\"\n (dragEnd)=\"onDragEnd($event)\"\n >\n <ng-template let-item=\"item\" let-index=\"index\">\n <div class=\"app-item-content\" [style.border-left-color]=\"item.app.GetColor()\" (dblclick)=\"removeApp(item); $event.stopPropagation()\">\n <div class=\"drag-handle\">\n <span class=\"fa-solid fa-grip-vertical\"></span>\n </div>\n\n <div class=\"app-icon\" [style.background-color]=\"item.app.GetColor()\">\n <span [class]=\"item.app.Icon || 'fa-solid fa-cube'\"></span>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n <span class=\"app-description\" *ngIf=\"item.app.Description\">{{ item.app.Description }}</span>\n </div>\n\n <div class=\"app-actions\">\n <button\n kendoButton\n fillMode=\"flat\"\n [disabled]=\"index === 0\"\n (click)=\"moveUp(item); $event.stopPropagation()\"\n title=\"Move up\"\n >\n <span class=\"fa-solid fa-chevron-up\"></span>\n </button>\n <button\n kendoButton\n fillMode=\"flat\"\n [disabled]=\"index === activeApps.length - 1\"\n (click)=\"moveDown(item); $event.stopPropagation()\"\n title=\"Move down\"\n >\n <span class=\"fa-solid fa-chevron-down\"></span>\n </button>\n <button\n kendoButton\n fillMode=\"flat\"\n themeColor=\"error\"\n (click)=\"removeApp(item); $event.stopPropagation()\"\n title=\"Remove from your apps\"\n >\n <span class=\"fa-solid fa-xmark\"></span>\n </button>\n </div>\n </div>\n </ng-template>\n </kendo-sortable>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer Actions -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n <button\n kendoButton\n fillMode=\"outline\"\n (click)=\"reset()\"\n [disabled]=\"isLoading || isSaving\"\n *ngIf=\"hasChanges()\"\n >\n <span class=\"fa-solid fa-rotate-left\"></span>\n Reset Changes\n </button>\n </div>\n <div class=\"footer-right\">\n <button\n kendoButton\n themeColor=\"primary\"\n (click)=\"save()\"\n [disabled]=\"isLoading || isSaving || !hasChanges()\"\n >\n <mj-loading *ngIf=\"isSaving\" [showText]=\"false\" size=\"small\"></mj-loading>\n <span *ngIf=\"!isSaving\" class=\"fa-solid fa-check\"></span>\n {{ isSaving ? 'Saving...' : 'Save Changes' }}\n </button>\n <button\n kendoButton\n fillMode=\"outline\"\n (click)=\"close()\"\n [disabled]=\"isSaving\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n</kendo-window>\n", styles: ["/* Full-screen dialog overlay */\n:host ::ng-deep .full-screen-dialog {\n width: 100vw !important;\n height: 100vh !important;\n}\n\n:host ::ng-deep .full-screen-dialog .k-window {\n border-radius: 0;\n box-shadow: none;\n}\n\n:host ::ng-deep .full-screen-dialog .k-window-titlebar {\n background: var(--kendo-component-bg, #ffffff);\n border-bottom: 1px solid var(--kendo-border-color, #e0e0e0);\n padding: 16px 24px;\n}\n\n:host ::ng-deep .full-screen-dialog .k-window-title {\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n/* Hide minimize/maximize buttons, keep only close */\n:host ::ng-deep .full-screen-dialog .k-window-titlebar-action:not(:last-child) {\n display: none;\n}\n\n:host ::ng-deep .full-screen-dialog .k-window-content {\n padding: 0;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* Main container */\n.app-config-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--kendo-surface-bg, #f5f5f5);\n}\n\n/* Loading state */\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n color: var(--kendo-subtle-text, #666);\n}\n\n/* Error message */\n.error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n background: var(--kendo-error-bg, #ffebee);\n color: var(--kendo-error-text, #c62828);\n border-bottom: 1px solid var(--kendo-error-border, #ef9a9a);\n}\n\n.error-message .fa-solid {\n font-size: 1.1rem;\n}\n\n/* Config content */\n.config-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 24px;\n overflow: hidden;\n}\n\n.config-description {\n margin: 0 0 24px 0;\n color: var(--kendo-subtle-text, #666);\n font-size: 0.95rem;\n line-height: 1.5;\n}\n\n/* Panels container */\n.panels-container {\n flex: 1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n overflow: hidden;\n}\n\n@media (max-width: 900px) {\n .panels-container {\n display: flex;\n flex-direction: column;\n gap: 12px;\n overflow-y: auto;\n }\n\n /* Show collapse toggle on mobile */\n .panel-header .collapse-toggle {\n display: inline-block !important;\n color: var(--kendo-subtle-text, #666) !important;\n }\n\n /* Make header clickable on mobile */\n .panel-header {\n cursor: pointer;\n user-select: none;\n }\n\n .panel-header:hover {\n background: var(--kendo-hover-bg, #f0f0f0);\n }\n\n /* Collapsed panel - just show header */\n .panel.collapsed {\n flex: 0 0 auto !important;\n }\n\n .panel.collapsed .panel-content {\n display: none !important;\n }\n\n .panel.collapsed .panel-header {\n border-bottom: none;\n }\n\n /* Non-collapsed panel takes available space */\n .panel:not(.collapsed) {\n flex: 1 1 auto;\n min-height: 150px;\n }\n}\n\n/* Panel styles */\n.panel {\n display: flex;\n flex-direction: column;\n background: var(--kendo-component-bg, #ffffff);\n border: 1px solid var(--kendo-border-color, #e0e0e0);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 20px;\n background: var(--kendo-surface-bg, #fafafa);\n border-bottom: 1px solid var(--kendo-border-color, #e0e0e0);\n}\n\n.panel-header .fa-solid {\n font-size: 1.1rem;\n color: var(--kendo-primary, #0078d4);\n}\n\n.panel-header h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n flex: 1;\n}\n\n.panel-header .badge {\n background: var(--kendo-primary, #0078d4);\n color: white;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 0.85rem;\n font-weight: 500;\n}\n\n/* Collapse toggle - hidden by default, shown on mobile */\n.panel-header .collapse-toggle {\n display: none;\n color: var(--kendo-subtle-text, #666);\n font-size: 0.9rem;\n margin-left: 8px;\n}\n\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n/* Empty state */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--kendo-subtle-text, #999);\n text-align: center;\n}\n\n.empty-state .fa-solid {\n font-size: 2.5rem;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 0.95rem;\n}\n\n.empty-state .hint {\n margin-top: 4px;\n font-size: 0.85rem;\n opacity: 0.7;\n}\n\n/* Sortable app items */\n:host ::ng-deep .app-item {\n margin-bottom: 8px;\n cursor: grab;\n}\n\n:host ::ng-deep .app-item.dragging {\n opacity: 0.8;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n.app-item-content {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--kendo-component-bg, #ffffff);\n border: 1px solid var(--kendo-border-color, #e0e0e0);\n border-left-width: 4px;\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.app-item-content:hover {\n border-color: var(--kendo-primary, #0078d4);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.drag-handle {\n color: var(--kendo-subtle-text, #999);\n cursor: grab;\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.app-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.app-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.app-name {\n font-weight: 500;\n font-size: 0.95rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-description {\n font-size: 0.8rem;\n color: var(--kendo-subtle-text, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-actions {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.app-actions button {\n padding: 4px 8px;\n}\n\n/* Available app items */\n.available-app-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin-bottom: 8px;\n background: var(--kendo-component-bg, #ffffff);\n border: 1px solid var(--kendo-border-color, #e0e0e0);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.available-app-item:hover {\n border-color: var(--kendo-primary, #0078d4);\n background: var(--kendo-surface-bg, #fafafa);\n}\n\n.available-app-item .app-info {\n flex: 1;\n}\n\n/* Dialog footer */\n.dialog-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: var(--kendo-component-bg, #ffffff);\n border-top: 1px solid var(--kendo-border-color, #e0e0e0);\n}\n\n.footer-left,\n.footer-right {\n display: flex;\n gap: 12px;\n}\n\n.dialog-footer button {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* Responsive adjustments */\n@media (max-width: 600px) {\n .config-content {\n padding: 16px;\n }\n\n .panels-container {\n gap: 16px;\n }\n\n .app-item-content,\n .available-app-item {\n padding: 10px 12px;\n }\n\n .app-icon {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n .app-actions button {\n padding: 2px 6px;\n }\n\n .dialog-footer {\n flex-direction: column;\n gap: 12px;\n }\n\n .footer-left,\n .footer-right {\n width: 100%;\n justify-content: center;\n }\n}\n"] }]
598
+ args: [{ selector: 'mj-user-app-config', template: "<!-- Modal Backdrop -->\n@if (showDialog) {\n <div class=\"modal-backdrop\" (click)=\"close()\" role=\"presentation\"></div>\n <div\n class=\"modal-dialog full-screen-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"app-config-title\"\n >\n <!-- Dialog Header -->\n <div class=\"modal-header\">\n <h2 class=\"modal-title\" id=\"app-config-title\">\n <i class=\"fa-solid fa-grid-2\" aria-hidden=\"true\"></i>\n Configure Apps\n </h2>\n <button\n class=\"modal-close\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"app-config-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\">\n <mj-loading text=\"Loading your app configuration...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Error Message -->\n @if (errorMessage) {\n <div class=\"error-message\" role=\"alert\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n <!-- Main Content -->\n @if (!isLoading) {\n <div class=\"config-content\">\n <p class=\"config-description\">\n Select which applications appear in your app switcher and arrange them in your preferred order.\n Double-click to quickly add or remove. Drag and drop to reorder, or use the arrow buttons.\n </p>\n\n <div class=\"panels-container\">\n <!-- Available Apps Panel -->\n <div class=\"panel available-apps-panel\" [class.collapsed]=\"availablePanelCollapsed\">\n <div class=\"panel-header\" (click)=\"availablePanelCollapsed = !availablePanelCollapsed\">\n <i class=\"fa-solid fa-layer-group\" aria-hidden=\"true\"></i>\n <h3>Available Applications</h3>\n <span class=\"badge\">{{ availableApps.length }}</span>\n <i\n class=\"collapse-toggle fa-solid\"\n [class.fa-chevron-down]=\"availablePanelCollapsed\"\n [class.fa-chevron-up]=\"!availablePanelCollapsed\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"panel-content\">\n @if (availableApps.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-double\" aria-hidden=\"true\"></i>\n <p>All applications added!</p>\n </div>\n }\n\n @for (item of availableApps; track item.app.ID) {\n <div class=\"available-app-item\" (dblclick)=\"addApp(item)\">\n <div class=\"app-icon\" [style.background-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n @if (item.app.Description) {\n <span class=\"app-description\">{{ item.app.Description }}</span>\n }\n </div>\n\n <button\n class=\"mj-btn mj-btn-primary mj-btn-outline mj-btn-sm\"\n (click)=\"addApp(item)\"\n title=\"Add to your apps\"\n >\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n Add\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Selected Apps Panel -->\n <div class=\"panel selected-apps-panel\" [class.collapsed]=\"selectedPanelCollapsed\">\n <div class=\"panel-header\" (click)=\"selectedPanelCollapsed = !selectedPanelCollapsed\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <h3>Your Applications</h3>\n <span class=\"badge\">{{ activeApps.length }}</span>\n <i\n class=\"collapse-toggle fa-solid\"\n [class.fa-chevron-down]=\"selectedPanelCollapsed\"\n [class.fa-chevron-up]=\"!selectedPanelCollapsed\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"panel-content\">\n @if (activeApps.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\" aria-hidden=\"true\"></i>\n <p>No applications selected</p>\n <p class=\"hint\">Add apps from the available list</p>\n </div>\n }\n\n @if (activeApps.length > 0) {\n <div\n class=\"sortable-list\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event)\"\n >\n @for (item of activeApps; track item.app.ID; let i = $index) {\n <div\n class=\"app-item\"\n [class.dragging]=\"draggedItem === item\"\n draggable=\"true\"\n (dragstart)=\"onDragStart($event, item, i)\"\n (dragend)=\"onDragEnd($event)\"\n (dragenter)=\"onDragEnter($event, i)\"\n (dblclick)=\"removeApp(item); $event.stopPropagation()\"\n >\n <div class=\"app-item-content\" [style.border-left-color]=\"item.app.GetColor()\">\n <div class=\"drag-handle\">\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-icon\" [style.background-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n @if (item.app.Description) {\n <span class=\"app-description\">{{ item.app.Description }}</span>\n }\n </div>\n\n <div class=\"app-actions\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n [disabled]=\"i === 0\"\n (click)=\"moveUp(item); $event.stopPropagation()\"\n title=\"Move up\"\n >\n <i class=\"fa-solid fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n [disabled]=\"i === activeApps.length - 1\"\n (click)=\"moveDown(item); $event.stopPropagation()\"\n title=\"Move down\"\n >\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"removeApp(item); $event.stopPropagation()\"\n title=\"Remove from your apps\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Footer Actions - Primary on LEFT per MD3 -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (hasChanges()) {\n <button\n class=\"mj-btn mj-btn-secondary\"\n (click)=\"reset()\"\n [disabled]=\"isLoading || isSaving\"\n >\n <i class=\"fa-solid fa-rotate-left\" aria-hidden=\"true\"></i>\n Reset Changes\n </button>\n }\n </div>\n <div class=\"footer-right\">\n <button\n class=\"mj-btn mj-btn-primary\"\n (click)=\"save()\"\n [disabled]=\"isLoading || isSaving || !hasChanges()\"\n >\n @if (isSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n <span>Saving...</span>\n } @else {\n <i class=\"fa-solid fa-check\" aria-hidden=\"true\"></i>\n <span>Save Changes</span>\n }\n </button>\n <button\n class=\"mj-btn mj-btn-secondary\"\n (click)=\"close()\"\n [disabled]=\"isSaving\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["/* ============================================\n User App Config - MD3 Design System\n ============================================ */\n\n/* Modal Backdrop */\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n}\n\n/* Full-screen dialog */\n.full-screen-dialog {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: var(--mat-sys-surface);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n}\n\n/* Modal Header */\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.5rem;\n background: var(--mat-sys-surface);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n}\n\n.modal-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.modal-title i {\n color: var(--mat-sys-primary);\n}\n\n.modal-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border: none;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.modal-close:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.modal-close:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n/* Main container */\n.app-config-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n background: var(--mat-sys-surface-container-lowest);\n}\n\n/* Loading state */\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 1rem;\n color: var(--mat-sys-on-surface-variant);\n}\n\n/* Error message */\n.error-message {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n background: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n border-bottom: 1px solid var(--mat-sys-error);\n}\n\n.error-message i {\n font-size: 1.1rem;\n}\n\n/* Config content */\n.config-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 1.5rem;\n overflow: hidden;\n}\n\n.config-description {\n margin: 0 0 1.5rem 0;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n line-height: 1.5;\n}\n\n/* Panels container */\n.panels-container {\n flex: 1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n overflow: hidden;\n}\n\n@media (max-width: 900px) {\n .panels-container {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: auto;\n }\n\n /* Show collapse toggle on mobile */\n .panel-header .collapse-toggle {\n display: inline-block !important;\n color: var(--mat-sys-on-surface-variant) !important;\n }\n\n /* Make header clickable on mobile */\n .panel-header {\n cursor: pointer;\n user-select: none;\n }\n\n .panel-header:hover {\n background: var(--mat-sys-surface-container);\n }\n\n /* Collapsed panel - just show header */\n .panel.collapsed {\n flex: 0 0 auto !important;\n }\n\n .panel.collapsed .panel-content {\n display: none !important;\n }\n\n .panel.collapsed .panel-header {\n border-bottom: none;\n }\n\n /* Non-collapsed panel takes available space */\n .panel:not(.collapsed) {\n flex: 1 1 auto;\n min-height: 150px;\n }\n}\n\n/* Panel styles */\n.panel {\n display: flex;\n flex-direction: column;\n background: var(--mat-sys-surface);\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-medium);\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 1rem 1.25rem;\n background: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n}\n\n.panel-header i:first-child {\n font-size: 1.1rem;\n color: var(--mat-sys-primary);\n}\n\n.panel-header h3 {\n margin: 0;\n font: var(--mat-sys-title-medium);\n color: var(--mat-sys-on-surface);\n flex: 1;\n}\n\n.panel-header .badge {\n background: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n padding: 0.125rem 0.625rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-medium);\n font-weight: 500;\n}\n\n/* Collapse toggle - hidden by default, shown on mobile */\n.panel-header .collapse-toggle {\n display: none;\n color: var(--mat-sys-on-surface-variant);\n font-size: 0.9rem;\n margin-left: 0.5rem;\n}\n\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 0.75rem;\n}\n\n/* Empty state */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 1.5rem;\n color: var(--mat-sys-on-surface-variant);\n text-align: center;\n}\n\n.empty-state i {\n font-size: 2.5rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font: var(--mat-sys-body-large);\n}\n\n.empty-state .hint {\n margin-top: 0.25rem;\n font: var(--mat-sys-body-medium);\n opacity: 0.7;\n}\n\n/* Sortable list container */\n.sortable-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n/* App items */\n.app-item {\n cursor: grab;\n transition: transform 0.2s, opacity 0.2s;\n}\n\n.app-item:active {\n cursor: grabbing;\n}\n\n.app-item.dragging {\n opacity: 0.5;\n transform: scale(0.98);\n}\n\n.app-item-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: var(--mat-sys-surface);\n border: 1px solid var(--mat-sys-outline-variant);\n border-left-width: 4px;\n border-radius: var(--mat-sys-corner-small);\n transition: all 0.2s ease;\n}\n\n.app-item-content:hover {\n border-color: var(--mat-sys-primary);\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n.drag-handle {\n color: var(--mat-sys-on-surface-variant);\n cursor: grab;\n padding: 0.25rem;\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.app-icon {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: var(--mat-sys-corner-small);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.app-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.app-name {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n color: var(--mat-sys-on-surface);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-description {\n font: var(--mat-sys-body-small);\n color: var(--mat-sys-on-surface-variant);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-actions {\n display: flex;\n gap: 0.25rem;\n flex-shrink: 0;\n}\n\n/* Available app items */\n.available-app-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n margin-bottom: 0.5rem;\n background: var(--mat-sys-surface);\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-small);\n transition: all 0.2s ease;\n}\n\n.available-app-item:hover {\n border-color: var(--mat-sys-primary);\n background: var(--mat-sys-surface-container);\n}\n\n.available-app-item .app-info {\n flex: 1;\n}\n\n/* Dialog footer */\n.dialog-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.5rem;\n background: var(--mat-sys-surface);\n border-top: 1px solid var(--mat-sys-outline-variant);\n}\n\n.footer-left,\n.footer-right {\n display: flex;\n gap: 0.75rem;\n}\n\n.dialog-footer button {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Responsive adjustments */\n@media (max-width: 600px) {\n .config-content {\n padding: 1rem;\n }\n\n .panels-container {\n gap: 1rem;\n }\n\n .app-item-content,\n .available-app-item {\n padding: 0.625rem 0.75rem;\n }\n\n .app-icon {\n width: 2.25rem;\n height: 2.25rem;\n font-size: 1rem;\n }\n\n .dialog-footer {\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .footer-left,\n .footer-right {\n width: 100%;\n justify-content: center;\n }\n}\n\n/* Accessibility - Reduced Motion */\n@media (prefers-reduced-motion: reduce) {\n .app-item,\n .app-item-content,\n .available-app-item,\n .modal-close {\n transition: none;\n }\n}\n"] }]
544
599
  }], () => [{ type: i1.ApplicationManager }, { type: i2.SharedService }, { type: i0.ChangeDetectorRef }], { showDialog: [{
545
600
  type: Input
546
601
  }], showDialogChange: [{
@@ -548,5 +603,5 @@ export class UserAppConfigComponent {
548
603
  }], configSaved: [{
549
604
  type: Output
550
605
  }] }); })();
551
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserAppConfigComponent, { className: "UserAppConfigComponent", filePath: "src/lib/user-app-config/user-app-config.component.ts", lineNumber: 30 }); })();
606
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserAppConfigComponent, { className: "UserAppConfigComponent", filePath: "src/lib/user-app-config/user-app-config.component.ts", lineNumber: 29 }); })();
552
607
  //# sourceMappingURL=user-app-config.component.js.map