@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.
- package/dist/lib/account-info/account-info.component.d.ts +23 -0
- package/dist/lib/account-info/account-info.component.d.ts.map +1 -0
- package/dist/lib/account-info/account-info.component.js +155 -0
- package/dist/lib/account-info/account-info.component.js.map +1 -0
- package/dist/lib/appearance-settings/appearance-settings.component.d.ts +15 -0
- package/dist/lib/appearance-settings/appearance-settings.component.d.ts.map +1 -0
- package/dist/lib/appearance-settings/appearance-settings.component.js +79 -0
- package/dist/lib/appearance-settings/appearance-settings.component.js.map +1 -0
- package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts +15 -1
- package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-dialog/application-dialog.component.js +329 -190
- package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
- package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-management.component.js +265 -184
- package/dist/lib/application-management/application-management.component.js.map +1 -1
- package/dist/lib/application-settings/application-settings.component.d.ts +113 -0
- package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -0
- package/dist/lib/application-settings/application-settings.component.js +520 -0
- package/dist/lib/application-settings/application-settings.component.js.map +1 -0
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts +1 -0
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.js +369 -192
- package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +160 -143
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
- package/dist/lib/general-settings/general-settings.component.d.ts +14 -0
- package/dist/lib/general-settings/general-settings.component.d.ts.map +1 -0
- package/dist/lib/general-settings/general-settings.component.js +50 -0
- package/dist/lib/general-settings/general-settings.component.js.map +1 -0
- package/dist/lib/module.d.ts +28 -30
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +75 -68
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.d.ts +77 -0
- package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.js +153 -77
- package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.js +93 -89
- package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
- package/dist/lib/role-management/role-management.component.d.ts +1 -0
- package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-management.component.js +275 -158
- package/dist/lib/role-management/role-management.component.js.map +1 -1
- package/dist/lib/settings/settings.component.d.ts +47 -3
- package/dist/lib/settings/settings.component.d.ts.map +1 -1
- package/dist/lib/settings/settings.component.js +339 -269
- package/dist/lib/settings/settings.component.js.map +1 -1
- package/dist/lib/shared/settings-card.component.d.ts.map +1 -1
- package/dist/lib/shared/settings-card.component.js +21 -18
- package/dist/lib/shared/settings-card.component.js.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.d.ts +11 -2
- package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.js +318 -245
- package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.d.ts +21 -3
- package/dist/lib/user-app-config/user-app-config.component.d.ts.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.js +202 -147
- package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.js +120 -116
- package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
- package/dist/lib/user-management/user-management.component.d.ts +32 -2
- package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-management.component.js +822 -297
- package/dist/lib/user-management/user-management.component.js.map +1 -1
- package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts +31 -2
- package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts.map +1 -1
- package/dist/lib/user-profile-settings/user-profile-settings.component.js +213 -80
- package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
- 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 "@
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
20
|
-
i0.ɵɵelementStart(0, "div",
|
|
21
|
-
i0.ɵɵelement(1, "
|
|
22
|
-
i0.ɵɵ
|
|
23
|
-
i0.ɵɵ
|
|
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(
|
|
27
|
-
i0.ɵɵ
|
|
21
|
+
i0.ɵɵadvance(3);
|
|
22
|
+
i0.ɵɵtextInterpolate(ctx_r1.errorMessage);
|
|
28
23
|
} }
|
|
29
|
-
function
|
|
30
|
-
i0.ɵɵelementStart(0, "div",
|
|
31
|
-
i0.ɵɵelement(1, "
|
|
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
|
|
37
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
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",
|
|
48
|
-
i0.ɵɵlistener("dblclick", function
|
|
49
|
-
i0.ɵɵelementStart(1, "div",
|
|
50
|
-
i0.ɵɵelement(2, "
|
|
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",
|
|
47
|
+
i0.ɵɵelementStart(3, "div", 36)(4, "span", 37);
|
|
53
48
|
i0.ɵɵtext(5);
|
|
54
49
|
i0.ɵɵelementEnd();
|
|
55
|
-
i0.ɵɵtemplate(6,
|
|
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",
|
|
58
|
-
i0.ɵɵlistener("click", function
|
|
59
|
-
i0.ɵɵelement(8, "
|
|
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.ɵɵ
|
|
66
|
+
i0.ɵɵconditional(item_r5.app.Description ? 6 : -1);
|
|
72
67
|
} }
|
|
73
|
-
function
|
|
74
|
-
i0.ɵɵelementStart(0, "div",
|
|
75
|
-
i0.ɵɵelement(1, "
|
|
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",
|
|
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
|
|
84
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
83
|
+
const item_r9 = i0.ɵɵnextContext().$implicit;
|
|
89
84
|
i0.ɵɵadvance();
|
|
90
|
-
i0.ɵɵtextInterpolate(
|
|
85
|
+
i0.ɵɵtextInterpolate(item_r9.app.Description);
|
|
91
86
|
} }
|
|
92
|
-
function
|
|
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",
|
|
95
|
-
i0.ɵɵlistener("
|
|
96
|
-
i0.ɵɵelementStart(1, "div",
|
|
97
|
-
i0.ɵɵelement(
|
|
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(
|
|
100
|
-
i0.ɵɵelement(
|
|
94
|
+
i0.ɵɵelementStart(4, "div", 34);
|
|
95
|
+
i0.ɵɵelement(5, "i", 35);
|
|
101
96
|
i0.ɵɵelementEnd();
|
|
102
|
-
i0.ɵɵelementStart(
|
|
103
|
-
i0.ɵɵtext(
|
|
97
|
+
i0.ɵɵelementStart(6, "div", 36)(7, "span", 37);
|
|
98
|
+
i0.ɵɵtext(8);
|
|
104
99
|
i0.ɵɵelementEnd();
|
|
105
|
-
i0.ɵɵtemplate(
|
|
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(
|
|
108
|
-
i0.ɵɵlistener("click", function
|
|
109
|
-
i0.ɵɵelement(
|
|
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(
|
|
112
|
-
i0.ɵɵlistener("click", function
|
|
113
|
-
i0.ɵɵelement(
|
|
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(
|
|
116
|
-
i0.ɵɵlistener("click", function
|
|
117
|
-
i0.ɵɵelement(
|
|
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
|
|
121
|
-
const
|
|
115
|
+
const item_r9 = ctx.$implicit;
|
|
116
|
+
const ɵ$index_115_r10 = ctx.$index;
|
|
122
117
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
123
|
-
i0.ɵɵ
|
|
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",
|
|
122
|
+
i0.ɵɵstyleProp("background-color", item_r9.app.GetColor());
|
|
126
123
|
i0.ɵɵadvance();
|
|
127
|
-
i0.ɵɵclassMap(
|
|
124
|
+
i0.ɵɵclassMap(item_r9.app.Icon || "fa-solid fa-cube");
|
|
128
125
|
i0.ɵɵadvance(3);
|
|
129
|
-
i0.ɵɵtextInterpolate(
|
|
126
|
+
i0.ɵɵtextInterpolate(item_r9.app.Name);
|
|
130
127
|
i0.ɵɵadvance();
|
|
131
|
-
i0.ɵɵ
|
|
128
|
+
i0.ɵɵconditional(item_r9.app.Description ? 9 : -1);
|
|
132
129
|
i0.ɵɵadvance(2);
|
|
133
|
-
i0.ɵɵproperty("disabled",
|
|
130
|
+
i0.ɵɵproperty("disabled", ɵ$index_115_r10 === 0);
|
|
134
131
|
i0.ɵɵadvance(2);
|
|
135
|
-
i0.ɵɵproperty("disabled",
|
|
132
|
+
i0.ɵɵproperty("disabled", ɵ$index_115_r10 === ctx_r1.activeApps.length - 1);
|
|
136
133
|
} }
|
|
137
|
-
function
|
|
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, "
|
|
140
|
-
i0.ɵɵlistener("
|
|
141
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
142
|
+
i0.ɵɵadvance();
|
|
143
|
+
i0.ɵɵrepeater(ctx_r1.activeApps);
|
|
146
144
|
} }
|
|
147
|
-
function
|
|
145
|
+
function UserAppConfigComponent_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
148
146
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
149
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
153
|
-
i0.ɵɵlistener("click", function
|
|
154
|
-
i0.ɵɵelement(6, "
|
|
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",
|
|
156
|
+
i0.ɵɵelementStart(9, "span", 24);
|
|
159
157
|
i0.ɵɵtext(10);
|
|
160
158
|
i0.ɵɵelementEnd();
|
|
161
|
-
i0.ɵɵelement(11, "
|
|
159
|
+
i0.ɵɵelement(11, "i", 25);
|
|
162
160
|
i0.ɵɵelementEnd();
|
|
163
|
-
i0.ɵɵelementStart(12, "div",
|
|
164
|
-
i0.ɵɵtemplate(13,
|
|
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(
|
|
167
|
-
i0.ɵɵlistener("click", function
|
|
168
|
-
i0.ɵɵelement(
|
|
169
|
-
i0.ɵɵelementStart(
|
|
170
|
-
i0.ɵɵtext(
|
|
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(
|
|
173
|
-
i0.ɵɵtext(
|
|
171
|
+
i0.ɵɵelementStart(21, "span", 24);
|
|
172
|
+
i0.ɵɵtext(22);
|
|
174
173
|
i0.ɵɵelementEnd();
|
|
175
|
-
i0.ɵɵelement(
|
|
174
|
+
i0.ɵɵelement(23, "i", 25);
|
|
176
175
|
i0.ɵɵelementEnd();
|
|
177
|
-
i0.ɵɵelementStart(
|
|
178
|
-
i0.ɵɵtemplate(
|
|
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.ɵɵ
|
|
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.ɵɵ
|
|
198
|
+
i0.ɵɵconditional(ctx_r1.activeApps.length === 0 ? 25 : -1);
|
|
200
199
|
i0.ɵɵadvance();
|
|
201
|
-
i0.ɵɵ
|
|
200
|
+
i0.ɵɵconditional(ctx_r1.activeApps.length > 0 ? 26 : -1);
|
|
202
201
|
} }
|
|
203
|
-
function
|
|
204
|
-
const
|
|
205
|
-
i0.ɵɵelementStart(0, "button",
|
|
206
|
-
i0.ɵɵlistener("click", function
|
|
207
|
-
i0.ɵɵelement(1, "
|
|
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
|
|
215
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
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
|
|
220
|
-
i0.ɵɵelement(0, "
|
|
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
|
|
227
|
+
function UserAppConfigComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
223
228
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
224
|
-
i0.ɵɵelementStart(0, "
|
|
225
|
-
i0.ɵɵlistener("
|
|
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(
|
|
232
|
-
i0.ɵɵ
|
|
233
|
-
i0.ɵɵ
|
|
234
|
-
i0.ɵɵ
|
|
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(
|
|
237
|
-
i0.ɵɵlistener("click", function
|
|
238
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
243
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
258
|
+
i0.ɵɵconditional(ctx_r1.errorMessage ? 10 : -1);
|
|
247
259
|
i0.ɵɵadvance();
|
|
248
|
-
i0.ɵɵ
|
|
260
|
+
i0.ɵɵconditional(!ctx_r1.isLoading ? 11 : -1);
|
|
249
261
|
i0.ɵɵadvance(3);
|
|
250
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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
|
-
*
|
|
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
|
-
|
|
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,
|
|
376
|
-
if (item.sequence !==
|
|
377
|
-
item.sequence =
|
|
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:
|
|
534
|
-
i0.ɵɵtemplate(0,
|
|
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.ɵɵ
|
|
537
|
-
|
|
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:
|
|
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
|