@memberjunction/ng-explorer-settings 3.2.0 → 3.3.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/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/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/module.d.ts +20 -25
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +20 -44
- 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 +54 -1
- package/dist/lib/settings/settings.component.d.ts.map +1 -1
- package/dist/lib/settings/settings.component.js +528 -182
- 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 +12 -3
- 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 +21 -20
|
@@ -10,33 +10,32 @@ import { Subject, BehaviorSubject } from 'rxjs';
|
|
|
10
10
|
import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
11
11
|
import { BaseNavigationComponent } from '@memberjunction/ng-shared';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "
|
|
14
|
-
import * as i2 from "../
|
|
15
|
-
import * as i3 from "
|
|
16
|
-
import * as i4 from "../
|
|
17
|
-
import * as i5 from "../
|
|
18
|
-
import * as i6 from "../
|
|
19
|
-
import * as i7 from "../
|
|
20
|
-
import * as i8 from "../
|
|
13
|
+
import * as i1 from "@angular/common";
|
|
14
|
+
import * as i2 from "../shared/settings-card.component";
|
|
15
|
+
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
16
|
+
import * as i4 from "../sql-logging/sql-logging.component";
|
|
17
|
+
import * as i5 from "../user-management/user-management.component";
|
|
18
|
+
import * as i6 from "../role-management/role-management.component";
|
|
19
|
+
import * as i7 from "../application-management/application-management.component";
|
|
20
|
+
import * as i8 from "../entity-permissions/entity-permissions.component";
|
|
21
|
+
import * as i9 from "../user-profile-settings/user-profile-settings.component";
|
|
22
|
+
import * as i10 from "../notification-preferences/notification-preferences.component";
|
|
21
23
|
const _forTrack0 = ($index, $item) => $item.id;
|
|
22
|
-
function
|
|
23
|
-
i0.ɵɵelementStart(0, "div",
|
|
24
|
-
i0.ɵɵelement(
|
|
24
|
+
function SettingsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
+
i0.ɵɵelementStart(0, "div", 1);
|
|
26
|
+
i0.ɵɵelement(1, "mj-loading", 4);
|
|
25
27
|
i0.ɵɵelementEnd();
|
|
26
|
-
i0.ɵɵelementStart(6, "div", 14);
|
|
27
|
-
i0.ɵɵtext(7, "Loading settings...");
|
|
28
|
-
i0.ɵɵelementEnd()()();
|
|
29
28
|
} }
|
|
30
|
-
function
|
|
29
|
+
function SettingsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
31
30
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
32
|
-
i0.ɵɵelementStart(0, "div",
|
|
33
|
-
i0.ɵɵelement(2, "i",
|
|
34
|
-
i0.ɵɵelementStart(3, "p",
|
|
31
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 5);
|
|
32
|
+
i0.ɵɵelement(2, "i", 6);
|
|
33
|
+
i0.ɵɵelementStart(3, "p", 7);
|
|
35
34
|
i0.ɵɵtext(4);
|
|
36
35
|
i0.ɵɵelementEnd();
|
|
37
|
-
i0.ɵɵelementStart(5, "button",
|
|
38
|
-
i0.ɵɵlistener("click", function
|
|
39
|
-
i0.ɵɵelement(6, "i",
|
|
36
|
+
i0.ɵɵelementStart(5, "button", 8);
|
|
37
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadInitialData()); });
|
|
38
|
+
i0.ɵɵelement(6, "i", 9);
|
|
40
39
|
i0.ɵɵtext(7, " Try Again ");
|
|
41
40
|
i0.ɵɵelementEnd()()();
|
|
42
41
|
} if (rf & 2) {
|
|
@@ -44,50 +43,58 @@ function SettingsComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
|
44
43
|
i0.ɵɵadvance(4);
|
|
45
44
|
i0.ɵɵtextInterpolate(ctx_r1.error);
|
|
46
45
|
} }
|
|
47
|
-
function
|
|
48
|
-
i0.ɵɵ
|
|
46
|
+
function SettingsComponent_Conditional_3_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
47
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
48
|
+
i0.ɵɵelementStart(0, "button", 28);
|
|
49
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
|
|
50
|
+
i0.ɵɵelement(1, "i", 29);
|
|
51
|
+
i0.ɵɵelementEnd();
|
|
52
|
+
} }
|
|
53
|
+
function SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
+
i0.ɵɵelementStart(0, "span", 34);
|
|
49
55
|
i0.ɵɵtext(1);
|
|
50
56
|
i0.ɵɵelementEnd();
|
|
51
57
|
} if (rf & 2) {
|
|
52
|
-
const
|
|
53
|
-
i0.ɵɵclassMap("badge-" + (
|
|
58
|
+
const tab_r6 = i0.ɵɵnextContext().$implicit;
|
|
59
|
+
i0.ɵɵclassMap("badge-" + (tab_r6.badgeColor || "primary"));
|
|
54
60
|
i0.ɵɵadvance();
|
|
55
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
61
|
+
i0.ɵɵtextInterpolate1(" ", tab_r6.badgeCount, " ");
|
|
56
62
|
} }
|
|
57
|
-
function
|
|
58
|
-
const
|
|
59
|
-
i0.ɵɵelementStart(0, "li",
|
|
60
|
-
i0.ɵɵlistener("click", function
|
|
61
|
-
i0.ɵɵelement(1, "i");
|
|
62
|
-
i0.ɵɵelementStart(2, "span",
|
|
63
|
+
function SettingsComponent_Conditional_3_Conditional_1_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
64
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
65
|
+
i0.ɵɵelementStart(0, "li", 30);
|
|
66
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_For_8_Template_li_click_0_listener() { const tab_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onTabChange(tab_r6.id)); })("keydown.enter", function SettingsComponent_Conditional_3_Conditional_1_For_8_Template_li_keydown_enter_0_listener() { const tab_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onTabChange(tab_r6.id)); });
|
|
67
|
+
i0.ɵɵelement(1, "i", 31);
|
|
68
|
+
i0.ɵɵelementStart(2, "span", 32);
|
|
63
69
|
i0.ɵɵtext(3);
|
|
64
70
|
i0.ɵɵelementEnd();
|
|
65
|
-
i0.ɵɵtemplate(4,
|
|
71
|
+
i0.ɵɵtemplate(4, SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_4_Template, 2, 3, "span", 33);
|
|
66
72
|
i0.ɵɵelementEnd();
|
|
67
73
|
} if (rf & 2) {
|
|
68
|
-
const
|
|
74
|
+
const tab_r6 = ctx.$implicit;
|
|
69
75
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
70
|
-
i0.ɵɵclassProp("active", ctx_r1.activeTab ===
|
|
76
|
+
i0.ɵɵclassProp("active", ctx_r1.activeTab === tab_r6.id);
|
|
77
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.activeTab === tab_r6.id)("aria-controls", "panel-" + tab_r6.id);
|
|
71
78
|
i0.ɵɵadvance();
|
|
72
|
-
i0.ɵɵclassMap(
|
|
79
|
+
i0.ɵɵclassMap(tab_r6.icon);
|
|
73
80
|
i0.ɵɵadvance(2);
|
|
74
|
-
i0.ɵɵtextInterpolate(
|
|
81
|
+
i0.ɵɵtextInterpolate(tab_r6.label);
|
|
75
82
|
i0.ɵɵadvance();
|
|
76
|
-
i0.ɵɵconditional(
|
|
83
|
+
i0.ɵɵconditional(tab_r6.badgeCount && tab_r6.badgeCount > 0 ? 4 : -1);
|
|
77
84
|
} }
|
|
78
|
-
function
|
|
79
|
-
const
|
|
80
|
-
i0.ɵɵelementStart(0, "div",
|
|
85
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_11_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
87
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "h2", 35);
|
|
81
88
|
i0.ɵɵtext(2, "General Settings");
|
|
82
89
|
i0.ɵɵelementEnd();
|
|
83
|
-
i0.ɵɵelementStart(3, "div",
|
|
84
|
-
i0.ɵɵlistener("toggle", function
|
|
85
|
-
i0.ɵɵelementStart(5, "div",
|
|
90
|
+
i0.ɵɵelementStart(3, "div", 36)(4, "mj-settings-card", 37);
|
|
91
|
+
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_1_Case_11_Template_mj_settings_card_toggle_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("profile")); });
|
|
92
|
+
i0.ɵɵelementStart(5, "div", 38);
|
|
86
93
|
i0.ɵɵelement(6, "mj-user-profile-settings");
|
|
87
94
|
i0.ɵɵelementEnd()();
|
|
88
|
-
i0.ɵɵelementStart(7, "mj-settings-card",
|
|
89
|
-
i0.ɵɵlistener("toggle", function
|
|
90
|
-
i0.ɵɵelementStart(8, "div",
|
|
95
|
+
i0.ɵɵelementStart(7, "mj-settings-card", 39);
|
|
96
|
+
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_1_Case_11_Template_mj_settings_card_toggle_7_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("preferences")); });
|
|
97
|
+
i0.ɵɵelementStart(8, "div", 38)(9, "p");
|
|
91
98
|
i0.ɵɵtext(10, "Customize your experience with display and behavior preferences.");
|
|
92
99
|
i0.ɵɵelementEnd()()()()();
|
|
93
100
|
} if (rf & 2) {
|
|
@@ -97,50 +104,52 @@ function SettingsComponent_Conditional_12_Conditional_1_Case_7_Template(rf, ctx)
|
|
|
97
104
|
i0.ɵɵadvance(3);
|
|
98
105
|
i0.ɵɵproperty("expanded", ctx_r1.isSectionExpanded("preferences"));
|
|
99
106
|
} }
|
|
100
|
-
function
|
|
101
|
-
i0.ɵɵelementStart(0, "div",
|
|
102
|
-
i0.ɵɵtext(2, "Notification Preferences");
|
|
103
|
-
i0.ɵɵelementEnd();
|
|
104
|
-
i0.ɵɵelementStart(3, "p", 43);
|
|
105
|
-
i0.ɵɵtext(4, "Manage how you receive notifications for different types of events");
|
|
106
|
-
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelement(5, "mj-notification-preferences");
|
|
108
|
-
i0.ɵɵelementEnd();
|
|
109
|
-
} }
|
|
110
|
-
function SettingsComponent_Conditional_12_Conditional_1_Case_9_Template(rf, ctx) { if (rf & 1) {
|
|
111
|
-
i0.ɵɵelementStart(0, "div", 29)(1, "h2", 38);
|
|
107
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_12_Template(rf, ctx) { if (rf & 1) {
|
|
108
|
+
i0.ɵɵelementStart(0, "div", 22)(1, "h2", 35);
|
|
112
109
|
i0.ɵɵtext(2, "User Management");
|
|
113
110
|
i0.ɵɵelementEnd();
|
|
114
|
-
i0.ɵɵelementStart(3, "p",
|
|
111
|
+
i0.ɵɵelementStart(3, "p", 40);
|
|
115
112
|
i0.ɵɵtext(4, "Manage user accounts, roles, and permissions");
|
|
116
113
|
i0.ɵɵelementEnd();
|
|
117
114
|
i0.ɵɵelement(5, "mj-user-management");
|
|
118
115
|
i0.ɵɵelementEnd();
|
|
119
116
|
} }
|
|
120
|
-
function
|
|
121
|
-
i0.ɵɵelementStart(0, "div",
|
|
117
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_13_Template(rf, ctx) { if (rf & 1) {
|
|
118
|
+
i0.ɵɵelementStart(0, "div", 23)(1, "h2", 35);
|
|
122
119
|
i0.ɵɵtext(2, "Role Management");
|
|
123
120
|
i0.ɵɵelementEnd();
|
|
124
|
-
i0.ɵɵelementStart(3, "p",
|
|
121
|
+
i0.ɵɵelementStart(3, "p", 40);
|
|
125
122
|
i0.ɵɵtext(4, "Define and manage security roles.");
|
|
126
123
|
i0.ɵɵelementEnd();
|
|
127
124
|
i0.ɵɵelement(5, "mj-role-management");
|
|
128
125
|
i0.ɵɵelementEnd();
|
|
129
126
|
} }
|
|
130
|
-
function
|
|
131
|
-
i0.ɵɵelementStart(0, "div",
|
|
127
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_14_Template(rf, ctx) { if (rf & 1) {
|
|
128
|
+
i0.ɵɵelementStart(0, "div", 24);
|
|
132
129
|
i0.ɵɵelement(1, "mj-application-management");
|
|
133
130
|
i0.ɵɵelementEnd();
|
|
134
131
|
} }
|
|
135
|
-
function
|
|
136
|
-
i0.ɵɵelementStart(0, "div",
|
|
132
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_15_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
137
134
|
i0.ɵɵelement(1, "mj-entity-permissions");
|
|
138
135
|
i0.ɵɵelementEnd();
|
|
139
136
|
} }
|
|
140
|
-
function
|
|
141
|
-
i0.ɵɵ
|
|
137
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_16_Template(rf, ctx) { if (rf & 1) {
|
|
138
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "h2", 35);
|
|
139
|
+
i0.ɵɵtext(2, "Notifications");
|
|
140
|
+
i0.ɵɵelementEnd();
|
|
141
|
+
i0.ɵɵelementStart(3, "p", 40);
|
|
142
|
+
i0.ɵɵtext(4, "Configure how and when you receive notifications");
|
|
143
|
+
i0.ɵɵelementEnd();
|
|
144
|
+
i0.ɵɵelement(5, "mj-notification-preferences");
|
|
145
|
+
i0.ɵɵelementEnd();
|
|
146
|
+
} }
|
|
147
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_18_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
+
i0.ɵɵelementStart(0, "div", 51);
|
|
149
|
+
i0.ɵɵelement(1, "mj-sql-logging");
|
|
150
|
+
i0.ɵɵelementEnd();
|
|
142
151
|
} }
|
|
143
|
-
function
|
|
152
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
144
153
|
i0.ɵɵelementStart(0, "div", 52)(1, "h3");
|
|
145
154
|
i0.ɵɵtext(2, "Performance Settings");
|
|
146
155
|
i0.ɵɵelementEnd();
|
|
@@ -148,7 +157,7 @@ function SettingsComponent_Conditional_12_Conditional_1_Case_13_Case_19_Template
|
|
|
148
157
|
i0.ɵɵtext(4, "Performance monitoring and optimization tools coming soon.");
|
|
149
158
|
i0.ɵɵelementEnd()();
|
|
150
159
|
} }
|
|
151
|
-
function
|
|
160
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_20_Template(rf, ctx) { if (rf & 1) {
|
|
152
161
|
i0.ɵɵelementStart(0, "div", 53)(1, "h3");
|
|
153
162
|
i0.ɵɵtext(2, "Developer Tools");
|
|
154
163
|
i0.ɵɵelementEnd();
|
|
@@ -156,134 +165,293 @@ function SettingsComponent_Conditional_12_Conditional_1_Case_13_Case_20_Template
|
|
|
156
165
|
i0.ɵɵtext(4, "Advanced developer options coming soon.");
|
|
157
166
|
i0.ɵɵelementEnd()();
|
|
158
167
|
} }
|
|
159
|
-
function
|
|
160
|
-
const
|
|
161
|
-
i0.ɵɵelementStart(0, "div",
|
|
168
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_17_Template(rf, ctx) { if (rf & 1) {
|
|
169
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
170
|
+
i0.ɵɵelementStart(0, "div", 27)(1, "h2", 35);
|
|
162
171
|
i0.ɵɵtext(2, "Advanced Settings");
|
|
163
172
|
i0.ɵɵelementEnd();
|
|
164
|
-
i0.ɵɵelementStart(3, "div",
|
|
165
|
-
i0.ɵɵelement(4, "i",
|
|
173
|
+
i0.ɵɵelementStart(3, "div", 41);
|
|
174
|
+
i0.ɵɵelement(4, "i", 42);
|
|
166
175
|
i0.ɵɵelementStart(5, "span");
|
|
167
176
|
i0.ɵɵtext(6, "Beta features - Use with caution");
|
|
168
177
|
i0.ɵɵelementEnd()();
|
|
169
|
-
i0.ɵɵelementStart(7, "div",
|
|
170
|
-
i0.ɵɵlistener("click", function
|
|
171
|
-
i0.ɵɵelement(9, "i",
|
|
178
|
+
i0.ɵɵelementStart(7, "div", 43)(8, "button", 44);
|
|
179
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Case_17_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("sql-logging")); });
|
|
180
|
+
i0.ɵɵelement(9, "i", 45);
|
|
172
181
|
i0.ɵɵtext(10, " SQL Logging ");
|
|
173
182
|
i0.ɵɵelementEnd();
|
|
174
|
-
i0.ɵɵelementStart(11, "button",
|
|
175
|
-
i0.ɵɵlistener("click", function
|
|
176
|
-
i0.ɵɵelement(12, "i",
|
|
183
|
+
i0.ɵɵelementStart(11, "button", 46);
|
|
184
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Case_17_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("performance")); });
|
|
185
|
+
i0.ɵɵelement(12, "i", 47);
|
|
177
186
|
i0.ɵɵtext(13, " Performance ");
|
|
178
187
|
i0.ɵɵelementEnd();
|
|
179
|
-
i0.ɵɵelementStart(14, "button",
|
|
180
|
-
i0.ɵɵlistener("click", function
|
|
181
|
-
i0.ɵɵelement(15, "i",
|
|
188
|
+
i0.ɵɵelementStart(14, "button", 48);
|
|
189
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Case_17_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("developer")); });
|
|
190
|
+
i0.ɵɵelement(15, "i", 49);
|
|
182
191
|
i0.ɵɵtext(16, " Developer Tools ");
|
|
183
192
|
i0.ɵɵelementEnd()();
|
|
184
|
-
i0.ɵɵelementStart(17, "div",
|
|
185
|
-
i0.ɵɵtemplate(18,
|
|
193
|
+
i0.ɵɵelementStart(17, "div", 50);
|
|
194
|
+
i0.ɵɵtemplate(18, SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_18_Template, 2, 0, "div", 51)(19, SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_19_Template, 5, 0, "div", 52)(20, SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_20_Template, 5, 0, "div", 53);
|
|
186
195
|
i0.ɵɵelementEnd()();
|
|
187
196
|
} if (rf & 2) {
|
|
188
|
-
let
|
|
197
|
+
let tmp_9_0;
|
|
189
198
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
190
199
|
i0.ɵɵadvance(8);
|
|
191
200
|
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "sql-logging");
|
|
201
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "sql-logging");
|
|
192
202
|
i0.ɵɵadvance(3);
|
|
193
203
|
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "performance");
|
|
204
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "performance");
|
|
194
205
|
i0.ɵɵadvance(3);
|
|
195
206
|
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "developer");
|
|
207
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "developer");
|
|
196
208
|
i0.ɵɵadvance(4);
|
|
197
|
-
i0.ɵɵconditional((
|
|
209
|
+
i0.ɵɵconditional((tmp_9_0 = ctx_r1.advancedActiveTab) === "sql-logging" ? 18 : tmp_9_0 === "performance" ? 19 : tmp_9_0 === "developer" ? 20 : -1);
|
|
198
210
|
} }
|
|
199
|
-
function
|
|
200
|
-
|
|
201
|
-
i0.ɵɵ
|
|
211
|
+
function SettingsComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
212
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
213
|
+
i0.ɵɵelementStart(0, "div", 10)(1, "nav", 12)(2, "div", 13);
|
|
214
|
+
i0.ɵɵelement(3, "i", 14);
|
|
215
|
+
i0.ɵɵelementStart(4, "input", 15);
|
|
216
|
+
i0.ɵɵlistener("input", function SettingsComponent_Conditional_3_Conditional_1_Template_input_input_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSearchChange($event)); });
|
|
217
|
+
i0.ɵɵelementEnd();
|
|
218
|
+
i0.ɵɵtemplate(5, SettingsComponent_Conditional_3_Conditional_1_Conditional_5_Template, 2, 0, "button", 16);
|
|
219
|
+
i0.ɵɵelementEnd();
|
|
220
|
+
i0.ɵɵelementStart(6, "ul", 17);
|
|
221
|
+
i0.ɵɵrepeaterCreate(7, SettingsComponent_Conditional_3_Conditional_1_For_8_Template, 5, 8, "li", 18, _forTrack0);
|
|
202
222
|
i0.ɵɵelementEnd()();
|
|
203
|
-
i0.ɵɵelementStart(
|
|
204
|
-
i0.ɵɵtemplate(
|
|
223
|
+
i0.ɵɵelementStart(9, "div", 19)(10, "div", 20);
|
|
224
|
+
i0.ɵɵtemplate(11, SettingsComponent_Conditional_3_Conditional_1_Case_11_Template, 11, 2, "div", 21)(12, SettingsComponent_Conditional_3_Conditional_1_Case_12_Template, 6, 0, "div", 22)(13, SettingsComponent_Conditional_3_Conditional_1_Case_13_Template, 6, 0, "div", 23)(14, SettingsComponent_Conditional_3_Conditional_1_Case_14_Template, 2, 0, "div", 24)(15, SettingsComponent_Conditional_3_Conditional_1_Case_15_Template, 2, 0, "div", 25)(16, SettingsComponent_Conditional_3_Conditional_1_Case_16_Template, 6, 0, "div", 26)(17, SettingsComponent_Conditional_3_Conditional_1_Case_17_Template, 21, 10, "div", 27);
|
|
205
225
|
i0.ɵɵelementEnd()()();
|
|
206
226
|
} if (rf & 2) {
|
|
207
|
-
let
|
|
227
|
+
let tmp_6_0;
|
|
208
228
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
209
|
-
i0.ɵɵadvance(3);
|
|
210
|
-
i0.ɵɵrepeater(ctx_r1.tabs);
|
|
211
229
|
i0.ɵɵadvance(4);
|
|
212
|
-
i0.ɵɵ
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
i0.ɵɵ
|
|
216
|
-
i0.ɵɵ
|
|
217
|
-
i0.ɵɵ
|
|
230
|
+
i0.ɵɵproperty("value", ctx_r1.searchTerm$.value);
|
|
231
|
+
i0.ɵɵadvance();
|
|
232
|
+
i0.ɵɵconditional(ctx_r1.searchTerm$.value ? 5 : -1);
|
|
233
|
+
i0.ɵɵadvance(2);
|
|
234
|
+
i0.ɵɵrepeater(ctx_r1.filteredTabs);
|
|
235
|
+
i0.ɵɵadvance(2);
|
|
236
|
+
i0.ɵɵattribute("id", "panel-" + ctx_r1.activeTab);
|
|
237
|
+
i0.ɵɵadvance(2);
|
|
238
|
+
i0.ɵɵconditional((tmp_6_0 = ctx_r1.activeTab) === "general" ? 11 : tmp_6_0 === "users" ? 12 : tmp_6_0 === "roles" ? 13 : tmp_6_0 === "applications" ? 14 : tmp_6_0 === "permissions" ? 15 : tmp_6_0 === "notifications" ? 16 : tmp_6_0 === "advanced" ? 17 : -1);
|
|
218
239
|
} }
|
|
219
|
-
function
|
|
220
|
-
i0.ɵɵ
|
|
221
|
-
i0.ɵɵ
|
|
240
|
+
function SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
241
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
242
|
+
i0.ɵɵelementStart(0, "header", 54)(1, "button", 64);
|
|
243
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleMobileNav()); });
|
|
244
|
+
i0.ɵɵelement(2, "i", 65);
|
|
222
245
|
i0.ɵɵelementEnd();
|
|
223
|
-
i0.ɵɵelementStart(3, "
|
|
224
|
-
i0.ɵɵtext(4, "
|
|
246
|
+
i0.ɵɵelementStart(3, "h1", 66);
|
|
247
|
+
i0.ɵɵtext(4, "Settings");
|
|
225
248
|
i0.ɵɵelementEnd();
|
|
226
|
-
i0.ɵɵelement(5, "
|
|
249
|
+
i0.ɵɵelement(5, "div", 67);
|
|
250
|
+
i0.ɵɵelementEnd();
|
|
251
|
+
} if (rf & 2) {
|
|
252
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
253
|
+
i0.ɵɵadvance();
|
|
254
|
+
i0.ɵɵattribute("aria-expanded", ctx_r1.isMobileNavOpen);
|
|
255
|
+
} }
|
|
256
|
+
function SettingsComponent_Conditional_3_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
257
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
258
|
+
i0.ɵɵelementStart(0, "div", 68);
|
|
259
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.closeMobileNav()); });
|
|
227
260
|
i0.ɵɵelementEnd();
|
|
228
261
|
} }
|
|
229
|
-
function
|
|
230
|
-
i0.ɵɵelementStart(0, "span",
|
|
262
|
+
function SettingsComponent_Conditional_3_Conditional_2_For_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
+
i0.ɵɵelementStart(0, "span", 71);
|
|
231
264
|
i0.ɵɵtext(1);
|
|
232
265
|
i0.ɵɵelementEnd();
|
|
233
266
|
} if (rf & 2) {
|
|
234
|
-
const
|
|
235
|
-
i0.ɵɵclassMap("badge-" + (
|
|
267
|
+
const tab_r13 = i0.ɵɵnextContext().$implicit;
|
|
268
|
+
i0.ɵɵclassMap("badge-" + (tab_r13.badgeColor || "primary"));
|
|
236
269
|
i0.ɵɵadvance();
|
|
237
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
270
|
+
i0.ɵɵtextInterpolate1(" ", tab_r13.badgeCount, " ");
|
|
238
271
|
} }
|
|
239
|
-
function
|
|
240
|
-
const
|
|
241
|
-
i0.ɵɵelementStart(0, "button",
|
|
242
|
-
i0.ɵɵlistener("click", function
|
|
243
|
-
i0.ɵɵelement(1, "i");
|
|
244
|
-
i0.ɵɵ
|
|
245
|
-
i0.ɵɵ
|
|
246
|
-
i0.ɵɵ
|
|
247
|
-
i0.ɵɵ
|
|
272
|
+
function SettingsComponent_Conditional_3_Conditional_2_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
273
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
274
|
+
i0.ɵɵelementStart(0, "button", 69);
|
|
275
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_For_9_Template_button_click_0_listener() { const tab_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onMobileTabChange(tab_r13.id)); });
|
|
276
|
+
i0.ɵɵelement(1, "i", 31);
|
|
277
|
+
i0.ɵɵelementStart(2, "span", 62);
|
|
278
|
+
i0.ɵɵtext(3);
|
|
279
|
+
i0.ɵɵelementEnd();
|
|
280
|
+
i0.ɵɵtemplate(4, SettingsComponent_Conditional_3_Conditional_2_For_9_Conditional_4_Template, 2, 3, "span", 70);
|
|
281
|
+
i0.ɵɵelementEnd();
|
|
248
282
|
} if (rf & 2) {
|
|
249
|
-
const
|
|
283
|
+
const tab_r13 = ctx.$implicit;
|
|
250
284
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
251
|
-
i0.ɵɵclassProp("active", ctx_r1.activeTab ===
|
|
252
|
-
i0.ɵɵ
|
|
253
|
-
i0.ɵɵclassMap(tab_r8.icon);
|
|
285
|
+
i0.ɵɵclassProp("active", ctx_r1.activeTab === tab_r13.id);
|
|
286
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.activeTab === tab_r13.id)("aria-label", tab_r13.label);
|
|
254
287
|
i0.ɵɵadvance();
|
|
255
|
-
i0.ɵɵ
|
|
288
|
+
i0.ɵɵclassMap(tab_r13.icon);
|
|
256
289
|
i0.ɵɵadvance(2);
|
|
257
|
-
i0.ɵɵtextInterpolate(
|
|
290
|
+
i0.ɵɵtextInterpolate(tab_r13.label);
|
|
291
|
+
i0.ɵɵadvance();
|
|
292
|
+
i0.ɵɵconditional(tab_r13.badgeCount && tab_r13.badgeCount > 0 ? 4 : -1);
|
|
258
293
|
} }
|
|
259
|
-
function
|
|
260
|
-
i0.ɵɵ
|
|
261
|
-
i0.ɵɵ
|
|
262
|
-
i0.ɵɵ
|
|
263
|
-
i0.ɵɵ
|
|
294
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_16_Template(rf, ctx) { if (rf & 1) {
|
|
295
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
296
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "h2", 35);
|
|
297
|
+
i0.ɵɵtext(2, "General Settings");
|
|
298
|
+
i0.ɵɵelementEnd();
|
|
299
|
+
i0.ɵɵelementStart(3, "div", 36)(4, "mj-settings-card", 37);
|
|
300
|
+
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_2_Case_16_Template_mj_settings_card_toggle_4_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("profile")); });
|
|
301
|
+
i0.ɵɵelementStart(5, "div", 38);
|
|
302
|
+
i0.ɵɵelement(6, "mj-user-profile-settings");
|
|
264
303
|
i0.ɵɵelementEnd()();
|
|
304
|
+
i0.ɵɵelementStart(7, "mj-settings-card", 39);
|
|
305
|
+
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_2_Case_16_Template_mj_settings_card_toggle_7_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("preferences")); });
|
|
306
|
+
i0.ɵɵelementStart(8, "div", 38)(9, "p");
|
|
307
|
+
i0.ɵɵtext(10, "Customize your experience with display and behavior preferences.");
|
|
308
|
+
i0.ɵɵelementEnd()()()()();
|
|
309
|
+
} if (rf & 2) {
|
|
310
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
311
|
+
i0.ɵɵadvance(4);
|
|
312
|
+
i0.ɵɵproperty("expanded", ctx_r1.isSectionExpanded("profile"));
|
|
313
|
+
i0.ɵɵadvance(3);
|
|
314
|
+
i0.ɵɵproperty("expanded", ctx_r1.isSectionExpanded("preferences"));
|
|
265
315
|
} }
|
|
266
|
-
function
|
|
267
|
-
i0.ɵɵelementStart(0, "div",
|
|
268
|
-
i0.ɵɵ
|
|
316
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_17_Template(rf, ctx) { if (rf & 1) {
|
|
317
|
+
i0.ɵɵelementStart(0, "div", 22)(1, "h2", 35);
|
|
318
|
+
i0.ɵɵtext(2, "User Management");
|
|
319
|
+
i0.ɵɵelementEnd();
|
|
320
|
+
i0.ɵɵelementStart(3, "p", 40);
|
|
321
|
+
i0.ɵɵtext(4, "Manage user accounts, roles, and permissions");
|
|
269
322
|
i0.ɵɵelementEnd();
|
|
270
|
-
i0.ɵɵ
|
|
271
|
-
i0.ɵɵ
|
|
272
|
-
|
|
323
|
+
i0.ɵɵelement(5, "mj-user-management");
|
|
324
|
+
i0.ɵɵelementEnd();
|
|
325
|
+
} }
|
|
326
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_18_Template(rf, ctx) { if (rf & 1) {
|
|
327
|
+
i0.ɵɵelementStart(0, "div", 23)(1, "h2", 35);
|
|
328
|
+
i0.ɵɵtext(2, "Role Management");
|
|
329
|
+
i0.ɵɵelementEnd();
|
|
330
|
+
i0.ɵɵelementStart(3, "p", 40);
|
|
331
|
+
i0.ɵɵtext(4, "Define and manage security roles.");
|
|
332
|
+
i0.ɵɵelementEnd();
|
|
333
|
+
i0.ɵɵelement(5, "mj-role-management");
|
|
334
|
+
i0.ɵɵelementEnd();
|
|
335
|
+
} }
|
|
336
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
337
|
+
i0.ɵɵelementStart(0, "div", 24);
|
|
338
|
+
i0.ɵɵelement(1, "mj-application-management");
|
|
339
|
+
i0.ɵɵelementEnd();
|
|
340
|
+
} }
|
|
341
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_20_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
343
|
+
i0.ɵɵelement(1, "mj-entity-permissions");
|
|
344
|
+
i0.ɵɵelementEnd();
|
|
345
|
+
} }
|
|
346
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_21_Template(rf, ctx) { if (rf & 1) {
|
|
347
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "h2", 35);
|
|
348
|
+
i0.ɵɵtext(2, "Notifications");
|
|
349
|
+
i0.ɵɵelementEnd();
|
|
350
|
+
i0.ɵɵelementStart(3, "p", 40);
|
|
351
|
+
i0.ɵɵtext(4, "Configure how and when you receive notifications");
|
|
352
|
+
i0.ɵɵelementEnd();
|
|
353
|
+
i0.ɵɵelement(5, "mj-notification-preferences");
|
|
354
|
+
i0.ɵɵelementEnd();
|
|
355
|
+
} }
|
|
356
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_18_Template(rf, ctx) { if (rf & 1) {
|
|
357
|
+
i0.ɵɵelementStart(0, "div", 75);
|
|
358
|
+
i0.ɵɵelement(1, "mj-sql-logging");
|
|
359
|
+
i0.ɵɵelementEnd();
|
|
360
|
+
} }
|
|
361
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
362
|
+
i0.ɵɵelementStart(0, "div", 76)(1, "h3");
|
|
363
|
+
i0.ɵɵtext(2, "Performance Settings");
|
|
364
|
+
i0.ɵɵelementEnd();
|
|
365
|
+
i0.ɵɵelementStart(3, "p");
|
|
366
|
+
i0.ɵɵtext(4, "Performance monitoring and optimization tools coming soon.");
|
|
367
|
+
i0.ɵɵelementEnd()();
|
|
368
|
+
} }
|
|
369
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_20_Template(rf, ctx) { if (rf & 1) {
|
|
370
|
+
i0.ɵɵelementStart(0, "div", 77)(1, "h3");
|
|
371
|
+
i0.ɵɵtext(2, "Developer Tools");
|
|
372
|
+
i0.ɵɵelementEnd();
|
|
373
|
+
i0.ɵɵelementStart(3, "p");
|
|
374
|
+
i0.ɵɵtext(4, "Advanced developer options coming soon.");
|
|
375
|
+
i0.ɵɵelementEnd()();
|
|
376
|
+
} }
|
|
377
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_22_Template(rf, ctx) { if (rf & 1) {
|
|
378
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
379
|
+
i0.ɵɵelementStart(0, "div", 27)(1, "h2", 35);
|
|
380
|
+
i0.ɵɵtext(2, "Advanced Settings");
|
|
381
|
+
i0.ɵɵelementEnd();
|
|
382
|
+
i0.ɵɵelementStart(3, "div", 41);
|
|
383
|
+
i0.ɵɵelement(4, "i", 42);
|
|
384
|
+
i0.ɵɵelementStart(5, "span");
|
|
385
|
+
i0.ɵɵtext(6, "Beta features - Use with caution");
|
|
386
|
+
i0.ɵɵelementEnd()();
|
|
387
|
+
i0.ɵɵelementStart(7, "div", 43)(8, "button", 72);
|
|
388
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Case_22_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("sql-logging")); });
|
|
389
|
+
i0.ɵɵelement(9, "i", 45);
|
|
390
|
+
i0.ɵɵtext(10, " SQL Logging ");
|
|
391
|
+
i0.ɵɵelementEnd();
|
|
392
|
+
i0.ɵɵelementStart(11, "button", 73);
|
|
393
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Case_22_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("performance")); });
|
|
394
|
+
i0.ɵɵelement(12, "i", 47);
|
|
395
|
+
i0.ɵɵtext(13, " Performance ");
|
|
396
|
+
i0.ɵɵelementEnd();
|
|
397
|
+
i0.ɵɵelementStart(14, "button", 74);
|
|
398
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Case_22_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("developer")); });
|
|
399
|
+
i0.ɵɵelement(15, "i", 49);
|
|
400
|
+
i0.ɵɵtext(16, " Developer Tools ");
|
|
401
|
+
i0.ɵɵelementEnd()();
|
|
402
|
+
i0.ɵɵelementStart(17, "div", 50);
|
|
403
|
+
i0.ɵɵtemplate(18, SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_18_Template, 2, 0, "div", 75)(19, SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_19_Template, 5, 0, "div", 76)(20, SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_20_Template, 5, 0, "div", 77);
|
|
404
|
+
i0.ɵɵelementEnd()();
|
|
405
|
+
} if (rf & 2) {
|
|
406
|
+
let tmp_9_0;
|
|
407
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
408
|
+
i0.ɵɵadvance(8);
|
|
409
|
+
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "sql-logging");
|
|
410
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "sql-logging");
|
|
411
|
+
i0.ɵɵadvance(3);
|
|
412
|
+
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "performance");
|
|
413
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "performance");
|
|
414
|
+
i0.ɵɵadvance(3);
|
|
415
|
+
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "developer");
|
|
416
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "developer");
|
|
417
|
+
i0.ɵɵadvance(4);
|
|
418
|
+
i0.ɵɵconditional((tmp_9_0 = ctx_r1.advancedActiveTab) === "sql-logging" ? 18 : tmp_9_0 === "performance" ? 19 : tmp_9_0 === "developer" ? 20 : -1);
|
|
419
|
+
} }
|
|
420
|
+
function SettingsComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
421
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
422
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
423
|
+
i0.ɵɵtemplate(1, SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template, 6, 1, "header", 54)(2, SettingsComponent_Conditional_3_Conditional_2_Conditional_2_Template, 1, 0, "div", 55);
|
|
424
|
+
i0.ɵɵelementStart(3, "nav", 56)(4, "div", 57)(5, "span", 58);
|
|
425
|
+
i0.ɵɵtext(6, "Settings");
|
|
426
|
+
i0.ɵɵelementEnd()();
|
|
427
|
+
i0.ɵɵelementStart(7, "div", 59);
|
|
428
|
+
i0.ɵɵrepeaterCreate(8, SettingsComponent_Conditional_3_Conditional_2_For_9_Template, 5, 8, "button", 60, _forTrack0);
|
|
429
|
+
i0.ɵɵelementStart(10, "button", 61);
|
|
430
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeSettings()); });
|
|
431
|
+
i0.ɵɵelement(11, "i", 29);
|
|
432
|
+
i0.ɵɵelementStart(12, "span", 62);
|
|
433
|
+
i0.ɵɵtext(13, "Close");
|
|
434
|
+
i0.ɵɵelementEnd()()()();
|
|
435
|
+
i0.ɵɵelementStart(14, "div", 63)(15, "div", 20);
|
|
436
|
+
i0.ɵɵtemplate(16, SettingsComponent_Conditional_3_Conditional_2_Case_16_Template, 11, 2, "div", 21)(17, SettingsComponent_Conditional_3_Conditional_2_Case_17_Template, 6, 0, "div", 22)(18, SettingsComponent_Conditional_3_Conditional_2_Case_18_Template, 6, 0, "div", 23)(19, SettingsComponent_Conditional_3_Conditional_2_Case_19_Template, 2, 0, "div", 24)(20, SettingsComponent_Conditional_3_Conditional_2_Case_20_Template, 2, 0, "div", 25)(21, SettingsComponent_Conditional_3_Conditional_2_Case_21_Template, 6, 0, "div", 26)(22, SettingsComponent_Conditional_3_Conditional_2_Case_22_Template, 21, 10, "div", 27);
|
|
273
437
|
i0.ɵɵelementEnd()()();
|
|
274
438
|
} if (rf & 2) {
|
|
275
|
-
let
|
|
439
|
+
let tmp_6_0;
|
|
276
440
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
277
|
-
i0.ɵɵadvance(
|
|
278
|
-
i0.ɵɵconditional(
|
|
279
|
-
i0.ɵɵadvance(
|
|
280
|
-
i0.ɵɵ
|
|
281
|
-
i0.ɵɵadvance(
|
|
282
|
-
i0.ɵɵ
|
|
441
|
+
i0.ɵɵadvance();
|
|
442
|
+
i0.ɵɵconditional(!ctx_r1.isMobileNavOpen ? 1 : -1);
|
|
443
|
+
i0.ɵɵadvance();
|
|
444
|
+
i0.ɵɵconditional(ctx_r1.isMobileNavOpen ? 2 : -1);
|
|
445
|
+
i0.ɵɵadvance();
|
|
446
|
+
i0.ɵɵclassProp("open", ctx_r1.isMobileNavOpen);
|
|
447
|
+
i0.ɵɵadvance(5);
|
|
448
|
+
i0.ɵɵrepeater(ctx_r1.filteredTabs);
|
|
449
|
+
i0.ɵɵadvance(8);
|
|
450
|
+
i0.ɵɵconditional((tmp_6_0 = ctx_r1.activeTab) === "general" ? 16 : tmp_6_0 === "users" ? 17 : tmp_6_0 === "roles" ? 18 : tmp_6_0 === "applications" ? 19 : tmp_6_0 === "permissions" ? 20 : tmp_6_0 === "notifications" ? 21 : tmp_6_0 === "advanced" ? 22 : -1);
|
|
283
451
|
} }
|
|
284
|
-
function
|
|
285
|
-
i0.ɵɵelementStart(0, "div",
|
|
286
|
-
i0.ɵɵtemplate(1,
|
|
452
|
+
function SettingsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
453
|
+
i0.ɵɵelementStart(0, "div", 3);
|
|
454
|
+
i0.ɵɵtemplate(1, SettingsComponent_Conditional_3_Conditional_1_Template, 18, 4, "div", 10)(2, SettingsComponent_Conditional_3_Conditional_2_Template, 23, 5, "div", 11);
|
|
287
455
|
i0.ɵɵelementEnd();
|
|
288
456
|
} if (rf & 2) {
|
|
289
457
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -293,6 +461,7 @@ function SettingsComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
|
293
461
|
i0.ɵɵconditional(ctx_r1.isMobile ? 2 : -1);
|
|
294
462
|
} }
|
|
295
463
|
let SettingsComponent = class SettingsComponent extends BaseNavigationComponent {
|
|
464
|
+
location;
|
|
296
465
|
stateChange = new EventEmitter();
|
|
297
466
|
// State management
|
|
298
467
|
activeTab = 'general';
|
|
@@ -300,6 +469,11 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
300
469
|
searchTerm$ = new BehaviorSubject('');
|
|
301
470
|
isLoading = false;
|
|
302
471
|
error = null;
|
|
472
|
+
// Search state
|
|
473
|
+
filteredTabs = [];
|
|
474
|
+
searchResults = [];
|
|
475
|
+
isSearching = false;
|
|
476
|
+
showSearchResults = false;
|
|
303
477
|
// Tab configuration
|
|
304
478
|
tabs = [
|
|
305
479
|
{
|
|
@@ -308,12 +482,6 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
308
482
|
icon: 'fa-solid fa-cog',
|
|
309
483
|
badgeCount: 0
|
|
310
484
|
},
|
|
311
|
-
{
|
|
312
|
-
id: 'notifications',
|
|
313
|
-
label: 'Notifications',
|
|
314
|
-
icon: 'fa-solid fa-bell',
|
|
315
|
-
badgeCount: 0
|
|
316
|
-
},
|
|
317
485
|
{
|
|
318
486
|
id: 'users',
|
|
319
487
|
label: 'Users',
|
|
@@ -338,6 +506,12 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
338
506
|
icon: 'fa-solid fa-lock',
|
|
339
507
|
badgeCount: 0
|
|
340
508
|
},
|
|
509
|
+
{
|
|
510
|
+
id: 'notifications',
|
|
511
|
+
label: 'Notifications',
|
|
512
|
+
icon: 'fa-solid fa-bell',
|
|
513
|
+
badgeCount: 0
|
|
514
|
+
},
|
|
341
515
|
{
|
|
342
516
|
id: 'advanced',
|
|
343
517
|
label: 'Advanced',
|
|
@@ -346,17 +520,108 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
346
520
|
badgeColor: 'warning'
|
|
347
521
|
}
|
|
348
522
|
];
|
|
523
|
+
// Searchable content registry
|
|
524
|
+
searchableItems = [
|
|
525
|
+
// General tab
|
|
526
|
+
{
|
|
527
|
+
id: 'profile',
|
|
528
|
+
tabId: 'general',
|
|
529
|
+
sectionId: 'profile',
|
|
530
|
+
label: 'Profile Information',
|
|
531
|
+
keywords: ['profile', 'avatar', 'picture', 'photo', 'name', 'user', 'image', 'account'],
|
|
532
|
+
description: 'Manage your profile picture and account information'
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
id: 'preferences',
|
|
536
|
+
tabId: 'general',
|
|
537
|
+
sectionId: 'preferences',
|
|
538
|
+
label: 'Preferences',
|
|
539
|
+
keywords: ['preferences', 'settings', 'display', 'theme', 'appearance', 'layout'],
|
|
540
|
+
description: 'Customize your experience with display and behavior preferences'
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
id: 'notifications',
|
|
544
|
+
tabId: 'notifications',
|
|
545
|
+
sectionId: 'notifications',
|
|
546
|
+
label: 'Notifications',
|
|
547
|
+
keywords: ['notifications', 'alerts', 'email', 'push', 'messages', 'inbox'],
|
|
548
|
+
description: 'Configure how and when you receive notifications'
|
|
549
|
+
},
|
|
550
|
+
// Users tab
|
|
551
|
+
{
|
|
552
|
+
id: 'users',
|
|
553
|
+
tabId: 'users',
|
|
554
|
+
label: 'User Management',
|
|
555
|
+
keywords: ['users', 'accounts', 'members', 'people', 'employees', 'team', 'manage users', 'add user', 'delete user'],
|
|
556
|
+
description: 'Manage user accounts, roles, and permissions'
|
|
557
|
+
},
|
|
558
|
+
// Roles tab
|
|
559
|
+
{
|
|
560
|
+
id: 'roles',
|
|
561
|
+
tabId: 'roles',
|
|
562
|
+
label: 'Role Management',
|
|
563
|
+
keywords: ['roles', 'permissions', 'security', 'access', 'groups', 'authorization', 'admin', 'moderator'],
|
|
564
|
+
description: 'Define and manage security roles'
|
|
565
|
+
},
|
|
566
|
+
// Applications tab
|
|
567
|
+
{
|
|
568
|
+
id: 'applications',
|
|
569
|
+
tabId: 'applications',
|
|
570
|
+
label: 'Applications',
|
|
571
|
+
keywords: ['applications', 'apps', 'modules', 'entities', 'navigation', 'menu'],
|
|
572
|
+
description: 'Configure application settings and entity associations'
|
|
573
|
+
},
|
|
574
|
+
// Permissions tab
|
|
575
|
+
{
|
|
576
|
+
id: 'permissions',
|
|
577
|
+
tabId: 'permissions',
|
|
578
|
+
label: 'Entity Permissions',
|
|
579
|
+
keywords: ['permissions', 'entities', 'access', 'crud', 'security', 'read', 'write', 'delete', 'create'],
|
|
580
|
+
description: 'Manage entity-level permissions and access control'
|
|
581
|
+
},
|
|
582
|
+
// Advanced tab - SQL Logging
|
|
583
|
+
{
|
|
584
|
+
id: 'sql-logging',
|
|
585
|
+
tabId: 'advanced',
|
|
586
|
+
sectionId: 'sql-logging',
|
|
587
|
+
label: 'SQL Logging',
|
|
588
|
+
keywords: ['sql', 'logging', 'database', 'queries', 'debug', 'performance', 'trace', 'monitor'],
|
|
589
|
+
description: 'Monitor and debug SQL queries'
|
|
590
|
+
},
|
|
591
|
+
// Advanced tab - Performance
|
|
592
|
+
{
|
|
593
|
+
id: 'performance',
|
|
594
|
+
tabId: 'advanced',
|
|
595
|
+
sectionId: 'performance',
|
|
596
|
+
label: 'Performance',
|
|
597
|
+
keywords: ['performance', 'speed', 'optimization', 'monitoring', 'metrics', 'cache'],
|
|
598
|
+
description: 'Performance monitoring and optimization tools'
|
|
599
|
+
},
|
|
600
|
+
// Advanced tab - Developer
|
|
601
|
+
{
|
|
602
|
+
id: 'developer',
|
|
603
|
+
tabId: 'advanced',
|
|
604
|
+
sectionId: 'developer',
|
|
605
|
+
label: 'Developer Tools',
|
|
606
|
+
keywords: ['developer', 'tools', 'debug', 'api', 'code', 'testing', 'console'],
|
|
607
|
+
description: 'Advanced developer options and debugging tools'
|
|
608
|
+
}
|
|
609
|
+
];
|
|
349
610
|
// Section expansion state
|
|
350
611
|
expandedSections = ['profile', 'preferences'];
|
|
351
612
|
// Mobile state
|
|
352
613
|
isMobile = window.innerWidth < 768;
|
|
614
|
+
isMobileNavOpen = false;
|
|
353
615
|
destroy$ = new Subject();
|
|
354
|
-
constructor() {
|
|
616
|
+
constructor(location) {
|
|
355
617
|
// Listen for window resize
|
|
356
618
|
super();
|
|
619
|
+
this.location = location;
|
|
357
620
|
window.addEventListener('resize', this.handleResize.bind(this));
|
|
358
621
|
}
|
|
359
622
|
ngOnInit() {
|
|
623
|
+
// Initialize filtered tabs with all tabs
|
|
624
|
+
this.filteredTabs = [...this.tabs];
|
|
360
625
|
this.setupSearchFilter();
|
|
361
626
|
this.loadInitialData();
|
|
362
627
|
}
|
|
@@ -367,7 +632,7 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
367
632
|
}
|
|
368
633
|
setupSearchFilter() {
|
|
369
634
|
this.searchTerm$
|
|
370
|
-
.pipe(debounceTime(
|
|
635
|
+
.pipe(debounceTime(200), distinctUntilChanged(), takeUntil(this.destroy$))
|
|
371
636
|
.subscribe(term => {
|
|
372
637
|
this.filterContent(term);
|
|
373
638
|
this.emitStateChange();
|
|
@@ -412,12 +677,90 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
412
677
|
setAdvancedTab(tabId) {
|
|
413
678
|
this.advancedActiveTab = tabId;
|
|
414
679
|
}
|
|
680
|
+
/**
|
|
681
|
+
* Filters searchable content based on search term
|
|
682
|
+
* Matches against labels, keywords, and descriptions
|
|
683
|
+
*/
|
|
415
684
|
filterContent(term) {
|
|
416
|
-
|
|
417
|
-
|
|
685
|
+
if (!term || term.trim() === '') {
|
|
686
|
+
this.showSearchResults = false;
|
|
687
|
+
this.searchResults = [];
|
|
688
|
+
this.filteredTabs = [...this.tabs];
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
const searchLower = term.toLowerCase().trim();
|
|
692
|
+
this.isSearching = true;
|
|
693
|
+
// Filter searchable items
|
|
694
|
+
this.searchResults = this.searchableItems.filter(item => {
|
|
695
|
+
const matchesLabel = item.label.toLowerCase().includes(searchLower);
|
|
696
|
+
const matchesKeywords = item.keywords.some(kw => kw.toLowerCase().includes(searchLower));
|
|
697
|
+
const matchesDescription = item.description?.toLowerCase().includes(searchLower) || false;
|
|
698
|
+
return matchesLabel || matchesKeywords || matchesDescription;
|
|
699
|
+
});
|
|
700
|
+
// Get unique tabs that have matching results
|
|
701
|
+
const matchingTabIds = new Set(this.searchResults.map(r => r.tabId));
|
|
702
|
+
this.filteredTabs = this.tabs.filter(tab => matchingTabIds.has(tab.id));
|
|
703
|
+
this.showSearchResults = true;
|
|
704
|
+
this.isSearching = false;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* Navigates to a search result
|
|
708
|
+
* Switches to the correct tab and expands the relevant section
|
|
709
|
+
*/
|
|
710
|
+
navigateToSearchResult(result) {
|
|
711
|
+
this.activeTab = result.tabId;
|
|
712
|
+
// If it's a section within a tab, expand it
|
|
713
|
+
if (result.sectionId && !this.expandedSections.includes(result.sectionId)) {
|
|
714
|
+
this.expandedSections.push(result.sectionId);
|
|
715
|
+
}
|
|
716
|
+
// If advanced tab, set the sub-tab
|
|
717
|
+
if (result.tabId === 'advanced' && result.sectionId) {
|
|
718
|
+
this.advancedActiveTab = result.sectionId;
|
|
719
|
+
}
|
|
720
|
+
// Clear search after navigation
|
|
721
|
+
this.clearSearch();
|
|
722
|
+
this.emitStateChange();
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* Clears the search and resets the view
|
|
726
|
+
*/
|
|
727
|
+
clearSearch() {
|
|
728
|
+
this.searchTerm$.next('');
|
|
729
|
+
this.showSearchResults = false;
|
|
730
|
+
this.searchResults = [];
|
|
731
|
+
this.filteredTabs = [...this.tabs];
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* Toggles the mobile navigation rail open/closed
|
|
735
|
+
*/
|
|
736
|
+
toggleMobileNav() {
|
|
737
|
+
this.isMobileNavOpen = !this.isMobileNavOpen;
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* Closes the mobile navigation rail
|
|
741
|
+
*/
|
|
742
|
+
closeMobileNav() {
|
|
743
|
+
this.isMobileNavOpen = false;
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Closes the settings page and navigates back
|
|
747
|
+
*/
|
|
748
|
+
closeSettings() {
|
|
749
|
+
this.location.back();
|
|
750
|
+
}
|
|
751
|
+
/**
|
|
752
|
+
* Handles tab change on mobile and closes the nav rail
|
|
753
|
+
*/
|
|
754
|
+
onMobileTabChange(tabId) {
|
|
755
|
+
this.onTabChange(tabId);
|
|
756
|
+
this.closeMobileNav();
|
|
418
757
|
}
|
|
419
758
|
handleResize() {
|
|
420
759
|
this.isMobile = window.innerWidth < 768;
|
|
760
|
+
// Close mobile nav on resize to desktop
|
|
761
|
+
if (!this.isMobile) {
|
|
762
|
+
this.isMobileNavOpen = false;
|
|
763
|
+
}
|
|
421
764
|
}
|
|
422
765
|
emitStateChange() {
|
|
423
766
|
const state = {
|
|
@@ -438,6 +781,20 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
438
781
|
this.expandedSections = [...state.expandedSections];
|
|
439
782
|
}
|
|
440
783
|
}
|
|
784
|
+
/**
|
|
785
|
+
* Gets the icon for a tab by its ID
|
|
786
|
+
*/
|
|
787
|
+
getTabIconById(tabId) {
|
|
788
|
+
const tab = this.tabs.find(t => t.id === tabId);
|
|
789
|
+
return tab?.icon || 'fa-solid fa-cog';
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
792
|
+
* Gets the label for a tab by its ID
|
|
793
|
+
*/
|
|
794
|
+
getTabLabelById(tabId) {
|
|
795
|
+
const tab = this.tabs.find(t => t.id === tabId);
|
|
796
|
+
return tab?.label || tabId;
|
|
797
|
+
}
|
|
441
798
|
getTabIcon(tab) {
|
|
442
799
|
return tab.icon;
|
|
443
800
|
}
|
|
@@ -451,30 +808,19 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
451
808
|
}
|
|
452
809
|
return classes.join(' ');
|
|
453
810
|
}
|
|
454
|
-
static ɵfac = function SettingsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SettingsComponent)(); };
|
|
455
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsComponent, selectors: [["mj-settings"]], outputs: { stateChange: "stateChange" }, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
456
|
-
i0.ɵɵelementStart(0, "div", 0)
|
|
457
|
-
i0.ɵɵ
|
|
458
|
-
i0.ɵɵelementStart(4, "h1");
|
|
459
|
-
i0.ɵɵtext(5, "Settings");
|
|
460
|
-
i0.ɵɵelementEnd()();
|
|
461
|
-
i0.ɵɵelementStart(6, "div", 4)(7, "div", 5);
|
|
462
|
-
i0.ɵɵelement(8, "i", 6);
|
|
463
|
-
i0.ɵɵelementStart(9, "input", 7);
|
|
464
|
-
i0.ɵɵlistener("input", function SettingsComponent_Template_input_input_9_listener($event) { return ctx.onSearchChange($event); });
|
|
465
|
-
i0.ɵɵelementEnd()()()();
|
|
466
|
-
i0.ɵɵtemplate(10, SettingsComponent_Conditional_10_Template, 8, 0, "div", 8)(11, SettingsComponent_Conditional_11_Template, 8, 1, "div", 9)(12, SettingsComponent_Conditional_12_Template, 3, 2, "div", 10);
|
|
811
|
+
static ɵfac = function SettingsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SettingsComponent)(i0.ɵɵdirectiveInject(i1.Location)); };
|
|
812
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsComponent, selectors: [["mj-settings"]], outputs: { stateChange: "stateChange" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [[1, "mj-page-container"], ["role", "status", "aria-live", "polite", 1, "loading-container"], ["role", "alert", 1, "error-container"], [1, "settings-content"], ["text", "Loading settings..."], [1, "error-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-triangle", "error-icon"], [1, "error-message"], [1, "retry-button", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-refresh"], [1, "desktop-layout", 2, "display", "flex"], [1, "mobile-layout"], ["role", "navigation", "aria-label", "Settings navigation", 1, "side-navigation"], [1, "nav-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "nav-search-icon"], ["type", "text", "placeholder", "Search settings...", "aria-label", "Search settings", 1, "nav-search-input", 3, "input", "value"], ["aria-label", "Clear search", "tabindex", "0", 1, "nav-search-clear"], ["role", "tablist", "aria-orientation", "vertical", 1, "nav-list"], ["role", "tab", "tabindex", "0", 1, "nav-item", 3, "active"], ["role", "tabpanel", 1, "content-area"], [1, "tab-content"], [1, "general-settings"], [1, "users-settings"], [1, "roles-settings"], [1, "applications-settings"], [1, "permissions-settings"], [1, "notifications-settings"], [1, "advanced-settings"], ["aria-label", "Clear search", "tabindex", "0", 1, "nav-search-clear", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["role", "tab", "tabindex", "0", 1, "nav-item", 3, "click", "keydown.enter"], ["aria-hidden", "true"], [1, "nav-label"], [1, "nav-badge", 3, "class"], [1, "nav-badge"], [1, "section-title"], [1, "mj-grid", "mj-grid-responsive"], ["title", "Profile Information", "icon", "fa-solid fa-user", 3, "toggle", "expanded"], [1, "card-content"], ["title", "Preferences", "icon", "fa-solid fa-sliders", 3, "toggle", "expanded"], [1, "section-description"], [1, "beta-warning"], ["aria-hidden", "true", 1, "fa-solid", "fa-flask"], ["role", "tablist", "aria-label", "Advanced settings tabs", 1, "advanced-tabs"], ["role", "tab", "aria-controls", "panel-sql-logging", 1, "tab-btn", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-database"], ["role", "tab", "aria-controls", "panel-performance", 1, "tab-btn", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-gauge-high"], ["role", "tab", "aria-controls", "panel-developer", 1, "tab-btn", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-code"], [1, "advanced-tab-content"], ["id", "panel-sql-logging", "role", "tabpanel"], ["id", "panel-performance", "role", "tabpanel", 1, "performance-settings"], ["id", "panel-developer", "role", "tabpanel", 1, "developer-settings"], [1, "mobile-header"], ["aria-hidden", "true", 1, "mobile-nav-backdrop"], ["role", "navigation", "aria-label", "Settings navigation", 1, "mobile-nav-rail"], [1, "nav-rail-header"], [1, "nav-rail-title"], ["role", "tablist", 1, "nav-rail-items"], ["role", "tab", 1, "nav-rail-item", 3, "active"], ["aria-label", "Close settings", 1, "nav-rail-item", "nav-rail-close-item", 3, "click"], [1, "nav-rail-label"], [1, "mobile-content"], ["aria-label", "Toggle navigation menu", 1, "mobile-header-icon", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-bars"], [1, "mobile-header-title"], [1, "mobile-header-spacer"], ["aria-hidden", "true", 1, "mobile-nav-backdrop", 3, "click"], ["role", "tab", 1, "nav-rail-item", 3, "click"], [1, "rail-badge", 3, "class"], [1, "rail-badge"], ["role", "tab", "aria-controls", "panel-sql-logging-mobile", 1, "tab-btn", 3, "click"], ["role", "tab", "aria-controls", "panel-performance-mobile", 1, "tab-btn", 3, "click"], ["role", "tab", "aria-controls", "panel-developer-mobile", 1, "tab-btn", 3, "click"], ["id", "panel-sql-logging-mobile", "role", "tabpanel"], ["id", "panel-performance-mobile", "role", "tabpanel", 1, "performance-settings"], ["id", "panel-developer-mobile", "role", "tabpanel", 1, "developer-settings"]], template: function SettingsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
813
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
814
|
+
i0.ɵɵtemplate(1, SettingsComponent_Conditional_1_Template, 2, 0, "div", 1)(2, SettingsComponent_Conditional_2_Template, 8, 1, "div", 2)(3, SettingsComponent_Conditional_3_Template, 3, 2, "div", 3);
|
|
467
815
|
i0.ɵɵelementEnd();
|
|
468
816
|
} if (rf & 2) {
|
|
469
|
-
i0.ɵɵadvance(9);
|
|
470
|
-
i0.ɵɵproperty("value", ctx.searchTerm$.value);
|
|
471
817
|
i0.ɵɵadvance();
|
|
472
|
-
i0.ɵɵconditional(ctx.isLoading ?
|
|
818
|
+
i0.ɵɵconditional(ctx.isLoading ? 1 : -1);
|
|
473
819
|
i0.ɵɵadvance();
|
|
474
|
-
i0.ɵɵconditional(ctx.error && !ctx.isLoading ?
|
|
820
|
+
i0.ɵɵconditional(ctx.error && !ctx.isLoading ? 2 : -1);
|
|
475
821
|
i0.ɵɵadvance();
|
|
476
|
-
i0.ɵɵconditional(!ctx.isLoading && !ctx.error ?
|
|
477
|
-
} }, dependencies: [i1.SettingsCardComponent, i2.SqlLoggingComponent, i3.UserManagementComponent, i4.RoleManagementComponent, i5.ApplicationManagementComponent, i6.EntityPermissionsComponent, i7.UserProfileSettingsComponent, i8.NotificationPreferencesComponent], styles: ["@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n.settings-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: #f5f7fa;\n overflow: hidden;\n position: relative;\n}\n\n.settings-header[_ngcontent-%COMP%] {\n background-color: #ffffff;\n border-bottom: 1px solid #e5e7eb;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n z-index: 10;\n}\n\n.header-content[_ngcontent-%COMP%] {\n padding: 1.5rem 2rem;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 2rem;\n}\n@media (max-width: 768px) {\n .header-content[_ngcontent-%COMP%] {\n padding: 1rem;\n flex-direction: column;\n gap: 1rem;\n }\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n.header-title[_ngcontent-%COMP%] .header-icon[_ngcontent-%COMP%] {\n font-size: 1.75rem;\n color: #2196f3;\n}\n.header-title[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.75rem;\n font-weight: 600;\n color: #1f2937;\n}\n\n.header-search[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n max-width: 400px;\n}\n.header-search[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: #6b7280;\n font-size: 1rem;\n}\n.header-search[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 0.75rem 1rem 0.75rem 2.75rem;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 0.95rem;\n transition: all 0.2s;\n background-color: #f9fafb;\n}\n.header-search[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #2196f3;\n background-color: #ffffff;\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n}\n.header-search[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%]::placeholder {\n color: #9ca3af;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 60px;\n height: 60px;\n margin: 0 auto 1rem;\n}\n.loading-spinner[_ngcontent-%COMP%] .spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n}\n.loading-spinner[_ngcontent-%COMP%] .spinner-ring[_ngcontent-%COMP%]:nth-child(1) {\n border-color: #2196f3 transparent transparent transparent;\n animation-delay: -0.45s;\n}\n.loading-spinner[_ngcontent-%COMP%] .spinner-ring[_ngcontent-%COMP%]:nth-child(2) {\n border-color: transparent #4caf50 transparent transparent;\n animation-delay: -0.3s;\n}\n.loading-spinner[_ngcontent-%COMP%] .spinner-ring[_ngcontent-%COMP%]:nth-child(3) {\n border-color: transparent transparent #ff9800 transparent;\n animation-delay: -0.15s;\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.loading-text[_ngcontent-%COMP%] {\n color: #6b7280;\n font-size: 0.95rem;\n}\n\n.error-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content[_ngcontent-%COMP%] {\n text-align: center;\n max-width: 400px;\n}\n.error-content[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: #f44336;\n margin-bottom: 1rem;\n}\n.error-content[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n color: #374151;\n margin-bottom: 1.5rem;\n font-size: 1rem;\n}\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n padding: 0.625rem 1.25rem;\n font-size: 0.95rem;\n font-weight: 500;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n background-color: #2196f3;\n color: white;\n padding: 0.75rem 1.5rem;\n font-size: 0.95rem;\n border-radius: 8px;\n transition: all 0.2s;\n}\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n}\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:hover {\n background-color: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.3);\n}\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n}\n\n.settings-content[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n flex-direction: column;\n width: 100%;\n}\n\n.desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content[_ngcontent-%COMP%] .desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n[_nghost-%COMP%] .desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.side-navigation[_ngcontent-%COMP%] {\n width: 260px;\n background-color: #ffffff;\n border-right: 1px solid #e5e7eb;\n overflow-y: auto;\n flex-shrink: 0;\n}\n\n.nav-list[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n padding: 0.875rem 1.5rem;\n cursor: pointer;\n transition: all 0.2s;\n color: #4b5563;\n font-size: 0.95rem;\n}\n.nav-item[_ngcontent-%COMP%]:hover {\n background-color: #f3f4f6;\n color: #1f2937;\n}\n.nav-item.active[_ngcontent-%COMP%] {\n background-color: #eff6ff;\n color: #2196f3;\n font-weight: 500;\n}\n.nav-item.active[_ngcontent-%COMP%]::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background-color: #2196f3;\n}\n.nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n.nav-item[_ngcontent-%COMP%] .nav-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n.nav-item[_ngcontent-%COMP%] .nav-badge[_ngcontent-%COMP%] {\n padding: 0.125rem 0.5rem;\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: #dbeafe;\n color: #1e40af;\n}\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-danger[_ngcontent-%COMP%] {\n background-color: #fee2e2;\n color: #991b1b;\n}\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: #fef3c7;\n color: #92400e;\n}\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-success[_ngcontent-%COMP%] {\n background-color: #d1fae5;\n color: #065f46;\n}\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 2rem;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n@media (max-width: 768px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n.tab-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n}\n\n.section-title[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0 0 0.5rem 0;\n}\n\n.section-description[_ngcontent-%COMP%] {\n color: #6b7280;\n margin: 0 0 2rem 0;\n font-size: 0.95rem;\n}\n\n.settings-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n@media (max-width: 768px) {\n .settings-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n}\n\n.card-content[_ngcontent-%COMP%] {\n padding: 1rem;\n color: #4b5563;\n font-size: 0.95rem;\n}\n.card-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n.beta-warning[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n background-color: #fef3c7;\n color: #92400e;\n border-radius: 6px;\n font-size: 0.875rem;\n margin-bottom: 1.5rem;\n}\n.beta-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n}\n\n.mobile-layout[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.mobile-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n padding-bottom: 80px;\n}\n\n.mobile-navigation[_ngcontent-%COMP%] {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: #ffffff;\n border-top: 1px solid #e5e7eb;\n box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05);\n z-index: 100;\n}\n\n.nav-tabs[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-around;\n align-items: center;\n padding: 0.5rem 0;\n}\n\n.nav-tab[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.25rem;\n padding: 0.5rem;\n background: none;\n border: none;\n color: #9ca3af;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 0.75rem;\n min-width: 60px;\n}\n.nav-tab.active[_ngcontent-%COMP%] {\n color: #2196f3;\n}\n.nav-tab.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n transform: scale(1.1);\n}\n.nav-tab[_ngcontent-%COMP%]:active {\n transform: scale(0.95);\n}\n.nav-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n transition: transform 0.2s;\n}\n.nav-tab[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: 0.25rem;\n right: 0.25rem;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n font-size: 0.625rem;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.nav-tab[_ngcontent-%COMP%] .tab-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: #2196f3;\n color: white;\n}\n.nav-tab[_ngcontent-%COMP%] .tab-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: #ff9800;\n color: white;\n}\n.nav-tab[_ngcontent-%COMP%] .tab-label[_ngcontent-%COMP%] {\n margin-top: 0.125rem;\n}\n\n.more-tab[_ngcontent-%COMP%] {\n color: #6b7280;\n}\n\n.advanced-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid #e5e7eb;\n margin-bottom: 2rem;\n margin-top: 1.5rem;\n}\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6b7280;\n font-size: 0.95rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n}\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:hover {\n color: #374151;\n background: #f9fafb;\n}\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: #eff6ff;\n}\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n}\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n}\n\n.advanced-tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: white;\n border-radius: 12px;\n padding: 0;\n min-height: 500px;\n max-height: calc(100vh - 350px);\n}\n\n.performance-settings[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] {\n padding: 2rem;\n}\n.performance-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n color: #1f2937;\n font-size: 1.25rem;\n}\n.performance-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: #6b7280;\n font-size: 0.95rem;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.general-settings[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n.general-settings[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}"] });
|
|
822
|
+
i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 3 : -1);
|
|
823
|
+
} }, dependencies: [i2.SettingsCardComponent, i3.LoadingComponent, i4.SqlLoggingComponent, i5.UserManagementComponent, i6.RoleManagementComponent, i7.ApplicationManagementComponent, i8.EntityPermissionsComponent, i9.UserProfileSettingsComponent, i10.NotificationPreferencesComponent], styles: ["\n\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n --settings-primary: #0076B6;\n --settings-primary-container: #AAE7FD;\n --settings-secondary: #F5A623;\n --settings-secondary-container: #FFECD6;\n --settings-tertiary: #4CAF50;\n --settings-tertiary-container: #C8E6C9;\n --settings-error: #D32F2F;\n --settings-error-container: #FFCDD2;\n}\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n@media (max-width: 768px) {\n [_nghost-%COMP%] {\n height: auto;\n min-height: 100vh;\n overflow: visible;\n }\n}\n\n\n\n.mj-page-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n@media (max-width: 768px) {\n .mj-page-container[_ngcontent-%COMP%] {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 100vh;\n }\n}\n\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n\n\n\n\n\n.settings-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mat-sys-surface);\n overflow-y: auto;\n position: relative;\n}\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-text[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n\n\n\n\n.error-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content[_ngcontent-%COMP%] {\n text-align: center;\n max-width: 400px;\n}\n\n.error-content[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mat-sys-error);\n margin-bottom: 1rem;\n}\n\n.error-content[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface);\n margin-bottom: 1.5rem;\n font: var(--mat-sys-body-large);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font: var(--mat-sys-label-large);\n font-weight: 500;\n border: none;\n border-radius: 20px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n white-space: nowrap;\n min-height: 44px;\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: var(--mat-sys-primary-hover, var(--mat-sys-primary));\n transform: translateY(-1px);\n box-shadow: var(--mat-sys-elevation-2);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n}\n\n\n\n\n\n\n.settings-content[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n}\n\n@media (max-width: 768px) {\n .settings-content[_ngcontent-%COMP%] {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 0;\n flex: none;\n }\n}\n\n.desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content[_ngcontent-%COMP%] .desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n\n\n\n\n\n.side-navigation[_ngcontent-%COMP%] {\n width: 280px;\n background: linear-gradient(180deg, var(--mat-sys-surface) 0%, var(--mat-sys-surface-container-lowest) 100%);\n border-right: 1px solid var(--mat-sys-outline-variant);\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n\n\n.nav-search[_ngcontent-%COMP%] {\n position: relative;\n padding: 1rem;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface);\n}\n\n.nav-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 1.75rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mat-sys-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n z-index: 1;\n}\n\n.nav-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 0.75rem 2.75rem 0.75rem 2.5rem;\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-body-medium);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--settings-primary);\n background-color: var(--mat-sys-surface);\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.nav-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mat-sys-on-surface-variant);\n}\n\n.nav-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.25rem;\n background: transparent;\n border: none;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n border-radius: var(--mat-sys-corner-full);\n min-width: 32px;\n min-height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n z-index: 1;\n}\n\n.nav-search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-clear[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--settings-primary);\n outline-offset: 2px;\n}\n\n.nav-list[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n margin: 0.25rem 0.75rem;\n border-radius: var(--mat-sys-corner-medium);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n border: 2px solid transparent;\n}\n\n.nav-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n transform: translateX(4px);\n}\n\n.nav-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n\n\n.nav-item[aria-controls=\"panel-general\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-primary);\n --item-container: var(--settings-primary-container);\n}\n\n.nav-item[aria-controls=\"panel-users\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-secondary);\n --item-container: var(--settings-secondary-container);\n}\n\n.nav-item[aria-controls=\"panel-roles\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-tertiary);\n --item-container: var(--settings-tertiary-container);\n}\n\n.nav-item[aria-controls=\"panel-applications\"][_ngcontent-%COMP%] {\n --item-color: #9C27B0;\n --item-container: #E1BEE7;\n}\n\n.nav-item[aria-controls=\"panel-permissions\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-error);\n --item-container: var(--settings-error-container);\n}\n\n.nav-item[aria-controls=\"panel-advanced\"][_ngcontent-%COMP%] {\n --item-color: #FF6F00;\n --item-container: #FFE0B2;\n}\n\n.nav-item.active[_ngcontent-%COMP%] {\n background-color: var(--item-container);\n color: var(--item-color);\n font-weight: 600;\n border-color: var(--item-color);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.nav-item[_ngcontent-%COMP%]:hover:not(.active) {\n border-color: var(--item-color);\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge[_ngcontent-%COMP%] {\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-weight: 600;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-on-primary-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-danger[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-tertiary-container);\n color: var(--mat-sys-on-tertiary-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-success[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n}\n\n\n\n\n\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n background: linear-gradient(180deg, var(--mat-sys-surface-container-lowest) 0%, var(--mat-sys-surface) 100%);\n}\n\n@media (max-width: 768px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n.tab-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow-x: hidden;\n padding: 1.5rem 2rem;\n}\n\n@media (max-width: 768px) {\n .tab-content[_ngcontent-%COMP%] {\n height: auto;\n min-height: 0;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 0.5rem;\n }\n}\n\n\n\n\n\n.section-title[_ngcontent-%COMP%] {\n font: var(--mat-sys-headline-small);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0 0 1rem 0;\n padding-bottom: 0.75rem;\n border-bottom: 3px solid var(--mat-sys-outline-variant);\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.section-title[_ngcontent-%COMP%]::before {\n content: \"\";\n width: 4px;\n height: 2rem;\n background: linear-gradient(180deg, var(--settings-primary) 0%, var(--settings-tertiary) 100%);\n border-radius: 2px;\n}\n\n.section-description[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n margin: 0 0 1.5rem 0;\n font: var(--mat-sys-body-large);\n padding: 1rem 1.25rem;\n background-color: var(--mat-sys-surface-container);\n border-radius: var(--mat-sys-corner-medium);\n}\n\n\n\n\n\n.settings-grid[_ngcontent-%COMP%], \n.mj-grid[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n\n.mj-grid-responsive[_ngcontent-%COMP%] {\n \n\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n@media (max-width: 768px) {\n .settings-grid[_ngcontent-%COMP%], \n .mj-grid[_ngcontent-%COMP%], \n .mj-grid-responsive[_ngcontent-%COMP%] {\n gap: 1rem;\n margin-top: 0.5rem;\n }\n}\n\n\n\n\n\n.general-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n margin-bottom: 0.25rem;\n}\n\n.users-settings[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%] {\n margin-bottom: 0.5rem;\n}\n\n\n\n\n\n.card-content[_ngcontent-%COMP%] {\n padding: 1rem;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-medium);\n}\n\n.card-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n\n\n\n\n.beta-warning[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1.25rem;\n background: linear-gradient(135deg, #FFE0B2 0%, var(--settings-secondary-container) 100%);\n color: #FF6F00;\n border-radius: var(--mat-sys-corner-medium);\n font: var(--mat-sys-label-large);\n font-weight: 600;\n margin-bottom: 1.5rem;\n max-width: 100%;\n box-sizing: border-box;\n border: 2px solid #FF6F00;\n box-shadow: 0 2px 8px rgba(255, 111, 0, 0.2);\n}\n\n.beta-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n@media (max-width: 768px) {\n .beta-warning[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n padding: 0.5rem 0.75rem;\n margin-bottom: 0.75rem;\n }\n}\n\n\n\n\n\n\n.mobile-layout[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n width: 100%;\n max-width: 100vw;\n overflow: visible;\n box-sizing: border-box;\n}\n\n\n\n.mobile-header[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 0.5rem;\n background-color: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n z-index: 100;\n box-sizing: border-box;\n}\n\n.mobile-header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n min-width: 48px;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-surface-container-high);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%]:active {\n transform: scale(0.95);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n}\n\n.mobile-header-title[_ngcontent-%COMP%] {\n flex: 1;\n text-align: center;\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0;\n padding: 0 0.5rem;\n}\n\n.mobile-header-spacer[_ngcontent-%COMP%] {\n width: 48px;\n min-width: 48px;\n}\n\n\n\n.mobile-nav-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n.mobile-nav-rail[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: 280px;\n max-width: 80vw;\n background-color: var(--mat-sys-surface);\n border-right: 1px solid var(--mat-sys-outline-variant);\n display: flex;\n flex-direction: column;\n z-index: 1001;\n transform: translateX(-100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: var(--mat-sys-elevation-4);\n overflow: hidden;\n}\n\n.mobile-nav-rail.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.nav-rail-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n min-height: 64px;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface-container);\n flex-shrink: 0;\n}\n\n.nav-rail-title[_ngcontent-%COMP%] {\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n}\n\n\n\n.nav-rail-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.25rem;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1;\n}\n\n\n\n.nav-rail-close-item[_ngcontent-%COMP%] {\n margin-top: auto;\n border-top: 1px solid var(--mat-sys-outline-variant);\n padding-top: 0.75rem !important;\n margin-top: 0.5rem;\n background-color: var(--mat-sys-error-container) !important;\n color: var(--mat-sys-on-error-container) !important;\n}\n\n.nav-rail-close-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-error) !important;\n color: var(--mat-sys-on-error) !important;\n}\n\n.nav-rail-close-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n}\n\n\n\n.nav-rail-item[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1rem;\n width: 100%;\n padding: 0.875rem 1rem;\n background: transparent;\n border: none;\n border-radius: var(--mat-sys-corner-medium);\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n text-align: left;\n min-height: 56px;\n}\n\n.nav-rail-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.nav-rail-label[_ngcontent-%COMP%] {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n flex: 1;\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:hover:not(.active) {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-rail-item.active[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-primary);\n}\n\n.nav-rail-item.active[_ngcontent-%COMP%] .nav-rail-label[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:active {\n transform: scale(0.98);\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n\n\n.rail-badge[_ngcontent-%COMP%] {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 11px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.rail-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.rail-badge.badge-danger[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-error);\n color: var(--mat-sys-on-error);\n}\n\n.rail-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-tertiary);\n color: var(--mat-sys-on-tertiary);\n}\n\n.rail-badge.badge-success[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary);\n color: var(--mat-sys-on-secondary);\n}\n\n\n\n.mobile-content[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 100vw;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 72px 0.75rem 2rem 0.75rem;\n min-width: 0;\n box-sizing: border-box;\n -webkit-overflow-scrolling: touch;\n flex: 1;\n}\n\n\n\n@media (max-width: 374px) {\n .mobile-nav-rail[_ngcontent-%COMP%] {\n width: 260px;\n }\n\n .mobile-content[_ngcontent-%COMP%] {\n padding: 64px 0.5rem 1.5rem 0.5rem;\n }\n\n .mobile-header[_ngcontent-%COMP%] {\n height: 52px;\n padding: 0 0.25rem;\n }\n\n .mobile-header-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n min-width: 44px;\n }\n\n .mobile-header-spacer[_ngcontent-%COMP%] {\n width: 44px;\n min-width: 44px;\n }\n\n .mobile-header-title[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n }\n}\n\n\n\n\n\n\n.advanced-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid var(--mat-sys-outline-variant);\n margin-bottom: 1rem;\n margin-top: 1rem;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n -webkit-overflow-scrolling: touch;\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-label-large);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n min-height: 44px;\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n\n\n@media (max-width: 768px) {\n .advanced-tabs[_ngcontent-%COMP%] {\n gap: 0;\n margin-bottom: 1rem;\n margin-top: 1rem;\n border-bottom: none;\n border: 1px solid var(--mat-sys-outline);\n border-radius: var(--mat-sys-corner-full);\n padding: 0;\n background-color: var(--mat-sys-surface-container-low);\n overflow-x: hidden;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.625rem 0.5rem;\n font-size: 0.75rem;\n border-bottom: none;\n border-radius: 0;\n border-right: 1px solid var(--mat-sys-outline);\n min-width: 0;\n justify-content: center;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:last-child {\n border-right: none;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:first-child {\n border-radius: var(--mat-sys-corner-full) 0 0 var(--mat-sys-corner-full);\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:last-child {\n border-radius: 0 var(--mat-sys-corner-full) var(--mat-sys-corner-full) 0;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n border-bottom: none;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n }\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:hover {\n color: var(--mat-sys-on-surface);\n background: var(--mat-sys-surface-container);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: -2px;\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] {\n color: var(--mat-sys-primary);\n border-bottom-color: var(--mat-sys-primary);\n background: var(--mat-sys-primary-container);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mat-sys-primary);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n}\n\n\n\n\n\n\n.advanced-tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: visible;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: var(--mat-sys-surface);\n border-radius: var(--mat-sys-corner-large);\n padding: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .advanced-tab-content[_ngcontent-%COMP%] {\n height: auto;\n min-height: 200px;\n overflow-y: visible;\n }\n}\n\n.performance-settings[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] {\n padding: 2rem;\n}\n\n.performance-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.performance-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n\n\n\n\n\n.general-settings[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n width: 100%;\n max-width: 100%;\n height: auto;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: visible;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .general-settings[_ngcontent-%COMP%], \n .users-settings[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] {\n gap: 0.75rem;\n height: auto;\n min-height: auto;\n }\n\n .section-title[_ngcontent-%COMP%] {\n margin-bottom: 0.5rem;\n font-size: 1.375rem;\n }\n\n .section-description[_ngcontent-%COMP%] {\n margin-bottom: 0.75rem;\n }\n}\n\n\n\n.general-settings[_ngcontent-%COMP%] > mj-settings-card[_ngcontent-%COMP%], \n.general-settings[_ngcontent-%COMP%] > .mj-grid[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > mj-user-management[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > mj-role-management[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%] > mj-application-management[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%] > mj-entity-permissions[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] > .advanced-tabs[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] > .advanced-tab-content[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .users-settings[_ngcontent-%COMP%] > mj-user-management[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%] > mj-role-management[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%] > mj-application-management[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%] > mj-entity-permissions[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] > .advanced-tab-content[_ngcontent-%COMP%] {\n flex: none;\n height: auto !important;\n min-height: 0;\n max-height: none !important;\n overflow-y: visible !important;\n overflow-x: hidden;\n }\n}\n\n\n\n.general-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > .section-description[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > .section-description[_ngcontent-%COMP%] {\n flex-shrink: 0;\n flex-grow: 0;\n}\n\n\n\n\n\n\n@media (prefers-reduced-motion: reduce) {\n .general-settings[_ngcontent-%COMP%], \n .users-settings[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] {\n animation: none;\n }\n\n .nav-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .nav-item[_ngcontent-%COMP%], \n .tab-btn[_ngcontent-%COMP%], \n .search-input[_ngcontent-%COMP%], \n .retry-button[_ngcontent-%COMP%], \n .search-result-item[_ngcontent-%COMP%] {\n transition: none;\n }\n}\n\n\n\n\n\n@media (max-width: 640px) {\n .side-navigation[_ngcontent-%COMP%] {\n width: 200px;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n }\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 1.5rem;\n }\n}\n\n\n\n@media (max-width: 768px) {\n .mobile-layout[_ngcontent-%COMP%] mj-user-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-role-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-application-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-entity-permissions[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-sql-logging[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-settings-card[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-user-profile-settings[_ngcontent-%COMP%] {\n display: block;\n height: auto !important;\n max-height: none !important;\n overflow: visible !important;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] .general-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .users-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .roles-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .applications-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .permissions-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .advanced-settings[_ngcontent-%COMP%] {\n height: auto !important;\n min-height: 0 !important;\n max-height: none !important;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] .mj-grid[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .mj-grid-responsive[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .card-content[_ngcontent-%COMP%] {\n height: auto !important;\n min-height: 0 !important;\n }\n}\n\n@media (min-width: 1440px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 2.5rem 3rem;\n }\n\n .side-navigation[_ngcontent-%COMP%] {\n width: 280px;\n }\n}\n\n\n\n\n\n@media (max-width: 768px) {\n \n\n body[_ngcontent-%COMP%] {\n position: relative;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n .mobile-content[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n .tab-content[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n -webkit-overflow-scrolling: touch;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] *[_ngcontent-%COMP%] {\n box-sizing: border-box;\n }\n}"] });
|
|
478
824
|
};
|
|
479
825
|
SettingsComponent = __decorate([
|
|
480
826
|
RegisterClass(BaseNavigationComponent, 'Settings')
|
|
@@ -482,9 +828,9 @@ SettingsComponent = __decorate([
|
|
|
482
828
|
export { SettingsComponent };
|
|
483
829
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SettingsComponent, [{
|
|
484
830
|
type: Component,
|
|
485
|
-
args: [{ selector: 'mj-settings', template: "<div class=\"mj-page-container\">\n <!-- Header Section -->\n <div class=\"mj-header\">\n <div class=\"mj-header-title\">\n <i class=\"fa-solid fa-cog\"></i>\n <h1>Settings</h1>\n </div>\n \n <div class=\"mj-header-actions\">\n <div class=\"mj-search\">\n <i class=\"fa-solid fa-search mj-search-icon\"></i>\n <input \n type=\"text\" \n class=\"mj-search-input\" \n placeholder=\"Search settings...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"searchTerm$.value\"\n />\n </div>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">Loading settings...</div>\n </div>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"retry-button\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n @if (!isLoading && !error) {\n <div class=\"settings-content\">\n <!-- Desktop Layout -->\n @if (!isMobile) {\n <div class=\"desktop-layout\" style=\"display: flex;\">\n <!-- Side Navigation -->\n <nav class=\"side-navigation\">\n <ul class=\"nav-list\">\n @for (tab of tabs; track tab.id) {\n <li \n class=\"nav-item\"\n [class.active]=\"activeTab === tab.id\"\n (click)=\"onTabChange(tab.id)\"\n >\n <i [class]=\"tab.icon\"></i>\n <span class=\"nav-label\">{{ tab.label }}</span>\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"nav-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n </li>\n }\n </ul>\n </nav>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <div class=\"tab-content\">\n @switch (activeTab) {\n @case ('general') {\n <div class=\"general-settings\">\n <h2 class=\"section-title\">General Settings</h2>\n <div class=\"mj-grid mj-grid-responsive\">\n <mj-settings-card\n title=\"Profile Information\"\n icon=\"fa-solid fa-user\"\n [expanded]=\"isSectionExpanded('profile')\"\n (toggle)=\"toggleSection('profile')\"\n >\n <div class=\"card-content\">\n <mj-user-profile-settings></mj-user-profile-settings>\n </div>\n </mj-settings-card>\n\n <mj-settings-card\n title=\"Preferences\"\n icon=\"fa-solid fa-sliders\"\n [expanded]=\"isSectionExpanded('preferences')\"\n (toggle)=\"toggleSection('preferences')\"\n >\n <div class=\"card-content\">\n <p>Customize your experience with display and behavior preferences.</p>\n <!-- Preferences content will go here -->\n </div>\n </mj-settings-card>\n </div>\n </div>\n }\n\n @case ('notifications') {\n <div class=\"notifications-settings\">\n <h2 class=\"section-title\">Notification Preferences</h2>\n <p class=\"section-description\">Manage how you receive notifications for different types of events</p>\n <mj-notification-preferences></mj-notification-preferences>\n </div>\n }\n\n @case ('users') {\n <div class=\"users-settings\">\n <h2 class=\"section-title\">User Management</h2>\n <p class=\"section-description\">Manage user accounts, roles, and permissions</p>\n <mj-user-management></mj-user-management>\n </div>\n }\n \n @case ('roles') {\n <div class=\"roles-settings\">\n <h2 class=\"section-title\">Role Management</h2>\n <p class=\"section-description\">Define and manage security roles.</p>\n <mj-role-management></mj-role-management>\n </div>\n }\n \n @case ('applications') {\n <div class=\"applications-settings\">\n <mj-application-management></mj-application-management>\n </div>\n }\n \n @case ('permissions') {\n <div class=\"permissions-settings\">\n <mj-entity-permissions></mj-entity-permissions>\n </div>\n }\n \n @case ('advanced') {\n <div class=\"advanced-settings\">\n <h2 class=\"section-title\">Advanced Settings</h2>\n <div class=\"beta-warning\">\n <i class=\"fa-solid fa-flask\"></i>\n <span>Beta features - Use with caution</span>\n </div>\n \n <!-- Tab Navigation -->\n <div class=\"advanced-tabs\">\n <button \n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'sql-logging'\"\n (click)=\"setAdvancedTab('sql-logging')\"\n >\n <i class=\"fa-solid fa-database\"></i>\n SQL Logging\n </button>\n <button \n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'performance'\"\n (click)=\"setAdvancedTab('performance')\"\n >\n <i class=\"fa-solid fa-gauge-high\"></i>\n Performance\n </button>\n <button \n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'developer'\"\n (click)=\"setAdvancedTab('developer')\"\n >\n <i class=\"fa-solid fa-code\"></i>\n Developer Tools\n </button>\n </div>\n \n <!-- Tab Content -->\n <div class=\"advanced-tab-content\">\n @switch (advancedActiveTab) {\n @case ('sql-logging') {\n <mj-sql-logging></mj-sql-logging>\n }\n @case ('performance') {\n <div class=\"performance-settings\">\n <h3>Performance Settings</h3>\n <p>Performance monitoring and optimization tools coming soon.</p>\n </div>\n }\n @case ('developer') {\n <div class=\"developer-settings\">\n <h3>Developer Tools</h3>\n <p>Advanced developer options coming soon.</p>\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Mobile Layout -->\n @if (isMobile) {\n <div class=\"mobile-layout\">\n <!-- Mobile Content -->\n <div class=\"mobile-content\">\n @switch (activeTab) {\n @case ('general') {\n <div class=\"general-settings\">\n <h2 class=\"section-title\">General Settings</h2>\n <!-- Same content as desktop but responsive -->\n </div>\n }\n @case ('users') {\n <div class=\"users-settings\">\n <h2 class=\"section-title\">User Management</h2>\n <p class=\"section-description\">Manage user accounts, roles, and permissions</p>\n <mj-user-management></mj-user-management>\n </div>\n }\n <!-- Other cases similar to desktop -->\n }\n </div>\n\n <!-- Mobile Bottom Navigation -->\n <nav class=\"mobile-navigation\">\n <div class=\"nav-tabs\">\n @for (tab of tabs.slice(0, 5); track tab.id) {\n <button \n class=\"nav-tab\"\n [class.active]=\"activeTab === tab.id\"\n (click)=\"onTabChange(tab.id)\"\n >\n <i [class]=\"tab.icon\"></i>\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"tab-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n <span class=\"tab-label\">{{ tab.label }}</span>\n </button>\n }\n @if (tabs.length > 5) {\n <button class=\"nav-tab more-tab\">\n <i class=\"fa-solid fa-ellipsis\"></i>\n <span class=\"tab-label\">More</span>\n </button>\n }\n </div>\n </nav>\n </div>\n }\n </div>\n }\n</div>", styles: ["@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n.settings-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: #f5f7fa;\n overflow: hidden;\n position: relative;\n}\n\n.settings-header {\n background-color: #ffffff;\n border-bottom: 1px solid #e5e7eb;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n z-index: 10;\n}\n\n.header-content {\n padding: 1.5rem 2rem;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 2rem;\n}\n@media (max-width: 768px) {\n .header-content {\n padding: 1rem;\n flex-direction: column;\n gap: 1rem;\n }\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n.header-title .header-icon {\n font-size: 1.75rem;\n color: #2196f3;\n}\n.header-title h1 {\n margin: 0;\n font-size: 1.75rem;\n font-weight: 600;\n color: #1f2937;\n}\n\n.header-search {\n position: relative;\n width: 100%;\n max-width: 400px;\n}\n.header-search .search-icon {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: #6b7280;\n font-size: 1rem;\n}\n.header-search .search-input {\n width: 100%;\n padding: 0.75rem 1rem 0.75rem 2.75rem;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 0.95rem;\n transition: all 0.2s;\n background-color: #f9fafb;\n}\n.header-search .search-input:focus {\n outline: none;\n border-color: #2196f3;\n background-color: #ffffff;\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);\n}\n.header-search .search-input::placeholder {\n color: #9ca3af;\n}\n\n.loading-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n margin: 0 auto 1rem;\n}\n.loading-spinner .spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n}\n.loading-spinner .spinner-ring:nth-child(1) {\n border-color: #2196f3 transparent transparent transparent;\n animation-delay: -0.45s;\n}\n.loading-spinner .spinner-ring:nth-child(2) {\n border-color: transparent #4caf50 transparent transparent;\n animation-delay: -0.3s;\n}\n.loading-spinner .spinner-ring:nth-child(3) {\n border-color: transparent transparent #ff9800 transparent;\n animation-delay: -0.15s;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.loading-text {\n color: #6b7280;\n font-size: 0.95rem;\n}\n\n.error-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content {\n text-align: center;\n max-width: 400px;\n}\n.error-content .error-icon {\n font-size: 3rem;\n color: #f44336;\n margin-bottom: 1rem;\n}\n.error-content .error-message {\n color: #374151;\n margin-bottom: 1.5rem;\n font-size: 1rem;\n}\n.error-content .retry-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n padding: 0.625rem 1.25rem;\n font-size: 0.95rem;\n font-weight: 500;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n background-color: #2196f3;\n color: white;\n padding: 0.75rem 1.5rem;\n font-size: 0.95rem;\n border-radius: 8px;\n transition: all 0.2s;\n}\n.error-content .retry-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.error-content .retry-button i {\n font-size: 0.875rem;\n}\n.error-content .retry-button:hover {\n background-color: #1976d2;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.3);\n}\n.error-content .retry-button i {\n margin-right: 0.5rem;\n}\n\n.settings-content {\n display: flex;\n flex: 1;\n overflow: hidden;\n flex-direction: column;\n width: 100%;\n}\n\n.desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content .desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n:host ::ng-deep .desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.side-navigation {\n width: 260px;\n background-color: #ffffff;\n border-right: 1px solid #e5e7eb;\n overflow-y: auto;\n flex-shrink: 0;\n}\n\n.nav-list {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 0.875rem 1.5rem;\n cursor: pointer;\n transition: all 0.2s;\n color: #4b5563;\n font-size: 0.95rem;\n}\n.nav-item:hover {\n background-color: #f3f4f6;\n color: #1f2937;\n}\n.nav-item.active {\n background-color: #eff6ff;\n color: #2196f3;\n font-weight: 500;\n}\n.nav-item.active::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background-color: #2196f3;\n}\n.nav-item i {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n.nav-item .nav-label {\n flex: 1;\n}\n.nav-item .nav-badge {\n padding: 0.125rem 0.5rem;\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n.nav-item .nav-badge.badge-primary {\n background-color: #dbeafe;\n color: #1e40af;\n}\n.nav-item .nav-badge.badge-danger {\n background-color: #fee2e2;\n color: #991b1b;\n}\n.nav-item .nav-badge.badge-warning {\n background-color: #fef3c7;\n color: #92400e;\n}\n.nav-item .nav-badge.badge-success {\n background-color: #d1fae5;\n color: #065f46;\n}\n\n.content-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 2rem;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n@media (max-width: 768px) {\n .content-area {\n padding: 1rem;\n }\n}\n\n.tab-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n}\n\n.section-title {\n font-size: 1.5rem;\n font-weight: 600;\n color: #1f2937;\n margin: 0 0 0.5rem 0;\n}\n\n.section-description {\n color: #6b7280;\n margin: 0 0 2rem 0;\n font-size: 0.95rem;\n}\n\n.settings-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n@media (max-width: 768px) {\n .settings-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n}\n\n.card-content {\n padding: 1rem;\n color: #4b5563;\n font-size: 0.95rem;\n}\n.card-content p {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n.beta-warning {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n background-color: #fef3c7;\n color: #92400e;\n border-radius: 6px;\n font-size: 0.875rem;\n margin-bottom: 1.5rem;\n}\n.beta-warning i {\n font-size: 1rem;\n}\n\n.mobile-layout {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.mobile-content {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n padding-bottom: 80px;\n}\n\n.mobile-navigation {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: #ffffff;\n border-top: 1px solid #e5e7eb;\n box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05);\n z-index: 100;\n}\n\n.nav-tabs {\n display: flex;\n justify-content: space-around;\n align-items: center;\n padding: 0.5rem 0;\n}\n\n.nav-tab {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.25rem;\n padding: 0.5rem;\n background: none;\n border: none;\n color: #9ca3af;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 0.75rem;\n min-width: 60px;\n}\n.nav-tab.active {\n color: #2196f3;\n}\n.nav-tab.active i {\n transform: scale(1.1);\n}\n.nav-tab:active {\n transform: scale(0.95);\n}\n.nav-tab i {\n font-size: 1.25rem;\n transition: transform 0.2s;\n}\n.nav-tab .tab-badge {\n position: absolute;\n top: 0.25rem;\n right: 0.25rem;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n font-size: 0.625rem;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.nav-tab .tab-badge.badge-primary {\n background-color: #2196f3;\n color: white;\n}\n.nav-tab .tab-badge.badge-warning {\n background-color: #ff9800;\n color: white;\n}\n.nav-tab .tab-label {\n margin-top: 0.125rem;\n}\n\n.more-tab {\n color: #6b7280;\n}\n\n.advanced-tabs {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid #e5e7eb;\n margin-bottom: 2rem;\n margin-top: 1.5rem;\n}\n.advanced-tabs .tab-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6b7280;\n font-size: 0.95rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n}\n.advanced-tabs .tab-btn:hover {\n color: #374151;\n background: #f9fafb;\n}\n.advanced-tabs .tab-btn.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: #eff6ff;\n}\n.advanced-tabs .tab-btn.active i {\n color: #2196f3;\n}\n.advanced-tabs .tab-btn i {\n font-size: 1.125rem;\n}\n\n.advanced-tab-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: white;\n border-radius: 12px;\n padding: 0;\n min-height: 500px;\n max-height: calc(100vh - 350px);\n}\n\n.performance-settings,\n.developer-settings {\n padding: 2rem;\n}\n.performance-settings h3,\n.developer-settings h3 {\n margin: 0 0 1rem 0;\n color: #1f2937;\n font-size: 1.25rem;\n}\n.performance-settings p,\n.developer-settings p {\n color: #6b7280;\n font-size: 0.95rem;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.general-settings,\n.users-settings,\n.roles-settings,\n.applications-settings,\n.permissions-settings,\n.advanced-settings {\n animation: fadeIn 0.3s ease-out;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n.general-settings > *,\n.users-settings > *,\n.roles-settings > *,\n.applications-settings > *,\n.permissions-settings > *,\n.advanced-settings > * {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n"] }]
|
|
486
|
-
}], () => [], { stateChange: [{
|
|
831
|
+
args: [{ selector: 'mj-settings', template: "<div class=\"mj-page-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\">\n <mj-loading text=\"Loading settings...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\" role=\"alert\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\" aria-hidden=\"true\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"retry-button\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\" aria-hidden=\"true\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n @if (!isLoading && !error) {\n <div class=\"settings-content\">\n <!-- Desktop Layout -->\n @if (!isMobile) {\n <div class=\"desktop-layout\" style=\"display: flex;\">\n <!-- Side Navigation -->\n <nav class=\"side-navigation\" role=\"navigation\" aria-label=\"Settings navigation\">\n <!-- Search Bar -->\n <div class=\"nav-search\">\n <i class=\"fa-solid fa-search nav-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"nav-search-input\"\n placeholder=\"Search settings...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"searchTerm$.value\"\n aria-label=\"Search settings\"\n />\n @if (searchTerm$.value) {\n <button\n class=\"nav-search-clear\"\n (click)=\"clearSearch()\"\n aria-label=\"Clear search\"\n tabindex=\"0\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n\n <ul class=\"nav-list\" role=\"tablist\" aria-orientation=\"vertical\">\n @for (tab of filteredTabs; track tab.id) {\n <li\n class=\"nav-item\"\n [class.active]=\"activeTab === tab.id\"\n (click)=\"onTabChange(tab.id)\"\n (keydown.enter)=\"onTabChange(tab.id)\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.id\"\n [attr.aria-controls]=\"'panel-' + tab.id\"\n tabindex=\"0\"\n >\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n <span class=\"nav-label\">{{ tab.label }}</span>\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"nav-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n </li>\n }\n </ul>\n </nav>\n\n <!-- Content Area -->\n <div class=\"content-area\" role=\"tabpanel\" [attr.id]=\"'panel-' + activeTab\">\n <div class=\"tab-content\">\n @switch (activeTab) {\n @case ('general') {\n <div class=\"general-settings\">\n <h2 class=\"section-title\">General Settings</h2>\n <div class=\"mj-grid mj-grid-responsive\">\n <mj-settings-card\n title=\"Profile Information\"\n icon=\"fa-solid fa-user\"\n [expanded]=\"isSectionExpanded('profile')\"\n (toggle)=\"toggleSection('profile')\"\n >\n <div class=\"card-content\">\n <mj-user-profile-settings></mj-user-profile-settings>\n </div>\n </mj-settings-card>\n\n <mj-settings-card\n title=\"Preferences\"\n icon=\"fa-solid fa-sliders\"\n [expanded]=\"isSectionExpanded('preferences')\"\n (toggle)=\"toggleSection('preferences')\"\n >\n <div class=\"card-content\">\n <p>Customize your experience with display and behavior preferences.</p>\n <!-- Preferences content will go here -->\n </div>\n </mj-settings-card>\n </div>\n </div>\n }\n\n @case ('users') {\n <div class=\"users-settings\">\n <h2 class=\"section-title\">User Management</h2>\n <p class=\"section-description\">Manage user accounts, roles, and permissions</p>\n <mj-user-management></mj-user-management>\n </div>\n }\n\n @case ('roles') {\n <div class=\"roles-settings\">\n <h2 class=\"section-title\">Role Management</h2>\n <p class=\"section-description\">Define and manage security roles.</p>\n <mj-role-management></mj-role-management>\n </div>\n }\n\n @case ('applications') {\n <div class=\"applications-settings\">\n <mj-application-management></mj-application-management>\n </div>\n }\n\n @case ('permissions') {\n <div class=\"permissions-settings\">\n <mj-entity-permissions></mj-entity-permissions>\n </div>\n }\n\n @case ('notifications') {\n <div class=\"notifications-settings\">\n <h2 class=\"section-title\">Notifications</h2>\n <p class=\"section-description\">Configure how and when you receive notifications</p>\n <mj-notification-preferences></mj-notification-preferences>\n </div>\n }\n\n @case ('advanced') {\n <div class=\"advanced-settings\">\n <h2 class=\"section-title\">Advanced Settings</h2>\n <div class=\"beta-warning\">\n <i class=\"fa-solid fa-flask\" aria-hidden=\"true\"></i>\n <span>Beta features - Use with caution</span>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"advanced-tabs\" role=\"tablist\" aria-label=\"Advanced settings tabs\">\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'sql-logging'\"\n (click)=\"setAdvancedTab('sql-logging')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'sql-logging'\"\n aria-controls=\"panel-sql-logging\"\n >\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n SQL Logging\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'performance'\"\n (click)=\"setAdvancedTab('performance')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'performance'\"\n aria-controls=\"panel-performance\"\n >\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n Performance\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'developer'\"\n (click)=\"setAdvancedTab('developer')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'developer'\"\n aria-controls=\"panel-developer\"\n >\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i>\n Developer Tools\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"advanced-tab-content\">\n @switch (advancedActiveTab) {\n @case ('sql-logging') {\n <div id=\"panel-sql-logging\" role=\"tabpanel\">\n <mj-sql-logging></mj-sql-logging>\n </div>\n }\n @case ('performance') {\n <div id=\"panel-performance\" role=\"tabpanel\" class=\"performance-settings\">\n <h3>Performance Settings</h3>\n <p>Performance monitoring and optimization tools coming soon.</p>\n </div>\n }\n @case ('developer') {\n <div id=\"panel-developer\" role=\"tabpanel\" class=\"developer-settings\">\n <h3>Developer Tools</h3>\n <p>Advanced developer options coming soon.</p>\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Mobile Layout -->\n @if (isMobile) {\n <div class=\"mobile-layout\">\n <!-- Mobile Header (Hidden when nav is open) -->\n @if (!isMobileNavOpen) {\n <header class=\"mobile-header\">\n <button\n class=\"mobile-header-icon\"\n (click)=\"toggleMobileNav()\"\n aria-label=\"Toggle navigation menu\"\n [attr.aria-expanded]=\"isMobileNavOpen\"\n >\n <i class=\"fa-solid fa-bars\" aria-hidden=\"true\"></i>\n </button>\n <h1 class=\"mobile-header-title\">Settings</h1>\n <div class=\"mobile-header-spacer\"></div>\n </header>\n }\n\n <!-- Backdrop Overlay -->\n @if (isMobileNavOpen) {\n <div\n class=\"mobile-nav-backdrop\"\n (click)=\"closeMobileNav()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!-- Mobile Navigation Rail (Collapsible) -->\n <nav\n class=\"mobile-nav-rail\"\n [class.open]=\"isMobileNavOpen\"\n role=\"navigation\"\n aria-label=\"Settings navigation\"\n >\n <!-- Navigation Header -->\n <div class=\"nav-rail-header\">\n <span class=\"nav-rail-title\">Settings</span>\n </div>\n\n <!-- Navigation Items -->\n <div class=\"nav-rail-items\" role=\"tablist\">\n @for (tab of filteredTabs; track tab.id) {\n <button\n class=\"nav-rail-item\"\n [class.active]=\"activeTab === tab.id\"\n (click)=\"onMobileTabChange(tab.id)\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.id\"\n [attr.aria-label]=\"tab.label\"\n >\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n <span class=\"nav-rail-label\">{{ tab.label }}</span>\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"rail-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n </button>\n }\n\n <!-- Close Navigation Item -->\n <button\n class=\"nav-rail-item nav-rail-close-item\"\n (click)=\"closeSettings()\"\n aria-label=\"Close settings\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n <span class=\"nav-rail-label\">Close</span>\n </button>\n </div>\n </nav>\n\n <!-- Mobile Content Area -->\n <div class=\"mobile-content\">\n <div class=\"tab-content\">\n @switch (activeTab) {\n @case ('general') {\n <div class=\"general-settings\">\n <h2 class=\"section-title\">General Settings</h2>\n <div class=\"mj-grid mj-grid-responsive\">\n <mj-settings-card\n title=\"Profile Information\"\n icon=\"fa-solid fa-user\"\n [expanded]=\"isSectionExpanded('profile')\"\n (toggle)=\"toggleSection('profile')\"\n >\n <div class=\"card-content\">\n <mj-user-profile-settings></mj-user-profile-settings>\n </div>\n </mj-settings-card>\n\n <mj-settings-card\n title=\"Preferences\"\n icon=\"fa-solid fa-sliders\"\n [expanded]=\"isSectionExpanded('preferences')\"\n (toggle)=\"toggleSection('preferences')\"\n >\n <div class=\"card-content\">\n <p>Customize your experience with display and behavior preferences.</p>\n </div>\n </mj-settings-card>\n </div>\n </div>\n }\n @case ('users') {\n <div class=\"users-settings\">\n <h2 class=\"section-title\">User Management</h2>\n <p class=\"section-description\">Manage user accounts, roles, and permissions</p>\n <mj-user-management></mj-user-management>\n </div>\n }\n @case ('roles') {\n <div class=\"roles-settings\">\n <h2 class=\"section-title\">Role Management</h2>\n <p class=\"section-description\">Define and manage security roles.</p>\n <mj-role-management></mj-role-management>\n </div>\n }\n @case ('applications') {\n <div class=\"applications-settings\">\n <mj-application-management></mj-application-management>\n </div>\n }\n @case ('permissions') {\n <div class=\"permissions-settings\">\n <mj-entity-permissions></mj-entity-permissions>\n </div>\n }\n @case ('notifications') {\n <div class=\"notifications-settings\">\n <h2 class=\"section-title\">Notifications</h2>\n <p class=\"section-description\">Configure how and when you receive notifications</p>\n <mj-notification-preferences></mj-notification-preferences>\n </div>\n }\n @case ('advanced') {\n <div class=\"advanced-settings\">\n <h2 class=\"section-title\">Advanced Settings</h2>\n <div class=\"beta-warning\">\n <i class=\"fa-solid fa-flask\" aria-hidden=\"true\"></i>\n <span>Beta features - Use with caution</span>\n </div>\n\n <!-- Tab Navigation (Mobile) -->\n <div class=\"advanced-tabs\" role=\"tablist\" aria-label=\"Advanced settings tabs\">\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'sql-logging'\"\n (click)=\"setAdvancedTab('sql-logging')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'sql-logging'\"\n aria-controls=\"panel-sql-logging-mobile\"\n >\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n SQL Logging\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'performance'\"\n (click)=\"setAdvancedTab('performance')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'performance'\"\n aria-controls=\"panel-performance-mobile\"\n >\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n Performance\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'developer'\"\n (click)=\"setAdvancedTab('developer')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'developer'\"\n aria-controls=\"panel-developer-mobile\"\n >\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i>\n Developer Tools\n </button>\n </div>\n\n <!-- Tab Content (Mobile) -->\n <div class=\"advanced-tab-content\">\n @switch (advancedActiveTab) {\n @case ('sql-logging') {\n <div id=\"panel-sql-logging-mobile\" role=\"tabpanel\">\n <mj-sql-logging></mj-sql-logging>\n </div>\n }\n @case ('performance') {\n <div id=\"panel-performance-mobile\" role=\"tabpanel\" class=\"performance-settings\">\n <h3>Performance Settings</h3>\n <p>Performance monitoring and optimization tools coming soon.</p>\n </div>\n }\n @case ('developer') {\n <div id=\"panel-developer-mobile\" role=\"tabpanel\" class=\"developer-settings\">\n <h3>Developer Tools</h3>\n <p>Advanced developer options coming soon.</p>\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n</div>\n", styles: ["/* ============================================\n Settings Component - MD3 Design System\n Material Design 3 compliant styles with proper token usage\n ============================================ */\n\n/* ============================================\n Custom Color Palette\n ============================================ */\n:host {\n --settings-primary: #0076B6;\n --settings-primary-container: #AAE7FD;\n --settings-secondary: #F5A623;\n --settings-secondary-container: #FFECD6;\n --settings-tertiary: #4CAF50;\n --settings-tertiary-container: #C8E6C9;\n --settings-error: #D32F2F;\n --settings-error-container: #FFCDD2;\n}\n\n/* ============================================\n Host & Page Container\n ============================================ */\n\n/* Host element must fill its container */\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n@media (max-width: 768px) {\n :host {\n height: auto;\n min-height: 100vh;\n overflow: visible;\n }\n}\n\n/* Page container needs proper height and scrolling */\n.mj-page-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n@media (max-width: 768px) {\n .mj-page-container {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 100vh;\n }\n}\n\n/* ============================================\n Keyframe Animations\n ============================================ */\n\n@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n/* ============================================\n Settings Container & Main Layout\n ============================================ */\n\n.settings-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mat-sys-surface);\n overflow-y: auto;\n position: relative;\n}\n\n/* ============================================\n Loading State\n ============================================ */\n.loading-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-text {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n/* ============================================\n Error State\n ============================================ */\n.error-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content {\n text-align: center;\n max-width: 400px;\n}\n\n.error-content .error-icon {\n font-size: 3rem;\n color: var(--mat-sys-error);\n margin-bottom: 1rem;\n}\n\n.error-content .error-message {\n color: var(--mat-sys-on-surface);\n margin-bottom: 1.5rem;\n font: var(--mat-sys-body-large);\n}\n\n.error-content .retry-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font: var(--mat-sys-label-large);\n font-weight: 500;\n border: none;\n border-radius: 20px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n white-space: nowrap;\n min-height: 44px;\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.error-content .retry-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.error-content .retry-button:hover:not(:disabled) {\n background-color: var(--mat-sys-primary-hover, var(--mat-sys-primary));\n transform: translateY(-1px);\n box-shadow: var(--mat-sys-elevation-2);\n}\n\n.error-content .retry-button i {\n font-size: 0.875rem;\n}\n\n/* ============================================\n Main Content Area & Tab Layout\n ============================================ */\n\n.settings-content {\n display: flex;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n}\n\n@media (max-width: 768px) {\n .settings-content {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 0;\n flex: none;\n }\n}\n\n.desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content .desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n/* ============================================\n Side Navigation (Desktop Only)\n ============================================ */\n\n.side-navigation {\n width: 280px;\n background: linear-gradient(180deg, var(--mat-sys-surface) 0%, var(--mat-sys-surface-container-lowest) 100%);\n border-right: 1px solid var(--mat-sys-outline-variant);\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n/* Navigation Search Bar */\n.nav-search {\n position: relative;\n padding: 1rem;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface);\n}\n\n.nav-search-icon {\n position: absolute;\n left: 1.75rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mat-sys-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n z-index: 1;\n}\n\n.nav-search-input {\n width: 100%;\n padding: 0.75rem 2.75rem 0.75rem 2.5rem;\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-body-medium);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-input:focus {\n outline: none;\n border-color: var(--settings-primary);\n background-color: var(--mat-sys-surface);\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.nav-search-input::placeholder {\n color: var(--mat-sys-on-surface-variant);\n}\n\n.nav-search-clear {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.25rem;\n background: transparent;\n border: none;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n border-radius: var(--mat-sys-corner-full);\n min-width: 32px;\n min-height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n z-index: 1;\n}\n\n.nav-search-clear:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-clear:focus-visible {\n outline: 2px solid var(--settings-primary);\n outline-offset: 2px;\n}\n\n.nav-list {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n margin: 0.25rem 0.75rem;\n border-radius: var(--mat-sys-corner-medium);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n border: 2px solid transparent;\n}\n\n.nav-item:hover {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n transform: translateX(4px);\n}\n\n.nav-item:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n/* Color-coded navigation items */\n.nav-item[aria-controls=\"panel-general\"] {\n --item-color: var(--settings-primary);\n --item-container: var(--settings-primary-container);\n}\n\n.nav-item[aria-controls=\"panel-users\"] {\n --item-color: var(--settings-secondary);\n --item-container: var(--settings-secondary-container);\n}\n\n.nav-item[aria-controls=\"panel-roles\"] {\n --item-color: var(--settings-tertiary);\n --item-container: var(--settings-tertiary-container);\n}\n\n.nav-item[aria-controls=\"panel-applications\"] {\n --item-color: #9C27B0;\n --item-container: #E1BEE7;\n}\n\n.nav-item[aria-controls=\"panel-permissions\"] {\n --item-color: var(--settings-error);\n --item-container: var(--settings-error-container);\n}\n\n.nav-item[aria-controls=\"panel-advanced\"] {\n --item-color: #FF6F00;\n --item-container: #FFE0B2;\n}\n\n.nav-item.active {\n background-color: var(--item-container);\n color: var(--item-color);\n font-weight: 600;\n border-color: var(--item-color);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.nav-item:hover:not(.active) {\n border-color: var(--item-color);\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.nav-item i {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.nav-item .nav-label {\n flex: 1;\n}\n\n.nav-item .nav-badge {\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-weight: 600;\n}\n\n.nav-item .nav-badge.badge-primary {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-on-primary-container);\n}\n\n.nav-item .nav-badge.badge-danger {\n background-color: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n}\n\n.nav-item .nav-badge.badge-warning {\n background-color: var(--mat-sys-tertiary-container);\n color: var(--mat-sys-on-tertiary-container);\n}\n\n.nav-item .nav-badge.badge-success {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n}\n\n/* ============================================\n Content Area & Tab Panels\n ============================================ */\n\n.content-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n background: linear-gradient(180deg, var(--mat-sys-surface-container-lowest) 0%, var(--mat-sys-surface) 100%);\n}\n\n@media (max-width: 768px) {\n .content-area {\n padding: 1rem;\n }\n}\n\n.tab-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow-x: hidden;\n padding: 1.5rem 2rem;\n}\n\n@media (max-width: 768px) {\n .tab-content {\n height: auto;\n min-height: 0;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 0.5rem;\n }\n}\n\n/* ============================================\n Section Titles\n ============================================ */\n.section-title {\n font: var(--mat-sys-headline-small);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0 0 1rem 0;\n padding-bottom: 0.75rem;\n border-bottom: 3px solid var(--mat-sys-outline-variant);\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.section-title::before {\n content: \"\";\n width: 4px;\n height: 2rem;\n background: linear-gradient(180deg, var(--settings-primary) 0%, var(--settings-tertiary) 100%);\n border-radius: 2px;\n}\n\n.section-description {\n color: var(--mat-sys-on-surface-variant);\n margin: 0 0 1.5rem 0;\n font: var(--mat-sys-body-large);\n padding: 1rem 1.25rem;\n background-color: var(--mat-sys-surface-container);\n border-radius: var(--mat-sys-corner-medium);\n}\n\n/* ============================================\n Settings Grid\n ============================================ */\n.settings-grid,\n.mj-grid {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n\n.mj-grid-responsive {\n /* Single column stacked layout */\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n@media (max-width: 768px) {\n .settings-grid,\n .mj-grid,\n .mj-grid-responsive {\n gap: 1rem;\n margin-top: 0.5rem;\n }\n}\n\n/* ============================================\n Section Title & Description Spacing\n ============================================ */\n.general-settings .section-title,\n.users-settings .section-title,\n.roles-settings .section-title {\n margin-bottom: 0.25rem;\n}\n\n.users-settings .section-description,\n.roles-settings .section-description {\n margin-bottom: 0.5rem;\n}\n\n/* ============================================\n Card Content\n ============================================ */\n.card-content {\n padding: 1rem;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-medium);\n}\n\n.card-content p {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n/* ============================================\n Beta Warning\n ============================================ */\n.beta-warning {\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1.25rem;\n background: linear-gradient(135deg, #FFE0B2 0%, var(--settings-secondary-container) 100%);\n color: #FF6F00;\n border-radius: var(--mat-sys-corner-medium);\n font: var(--mat-sys-label-large);\n font-weight: 600;\n margin-bottom: 1.5rem;\n max-width: 100%;\n box-sizing: border-box;\n border: 2px solid #FF6F00;\n box-shadow: 0 2px 8px rgba(255, 111, 0, 0.2);\n}\n\n.beta-warning i {\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n@media (max-width: 768px) {\n .beta-warning {\n font-size: 0.8125rem;\n padding: 0.5rem 0.75rem;\n margin-bottom: 0.75rem;\n }\n}\n\n/* ============================================\n Mobile Layout with Collapsible Navigation Rail\n ============================================ */\n\n.mobile-layout {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n width: 100%;\n max-width: 100vw;\n overflow: visible;\n box-sizing: border-box;\n}\n\n/* Mobile Header */\n.mobile-header {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 0.5rem;\n background-color: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n z-index: 100;\n box-sizing: border-box;\n}\n\n.mobile-header-icon {\n width: 48px;\n height: 48px;\n min-width: 48px;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.mobile-header-icon:hover {\n background-color: var(--mat-sys-surface-container-high);\n}\n\n.mobile-header-icon:active {\n transform: scale(0.95);\n}\n\n.mobile-header-icon i {\n font-size: 1.25rem;\n}\n\n.mobile-header-title {\n flex: 1;\n text-align: center;\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0;\n padding: 0 0.5rem;\n}\n\n.mobile-header-spacer {\n width: 48px;\n min-width: 48px;\n}\n\n/* Backdrop Overlay */\n.mobile-nav-backdrop {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Collapsible Navigation Rail */\n.mobile-nav-rail {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: 280px;\n max-width: 80vw;\n background-color: var(--mat-sys-surface);\n border-right: 1px solid var(--mat-sys-outline-variant);\n display: flex;\n flex-direction: column;\n z-index: 1001;\n transform: translateX(-100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: var(--mat-sys-elevation-4);\n overflow: hidden;\n}\n\n.mobile-nav-rail.open {\n transform: translateX(0);\n}\n\n/* Navigation Rail Header */\n.nav-rail-header {\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n min-height: 64px;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface-container);\n flex-shrink: 0;\n}\n\n.nav-rail-title {\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n}\n\n/* Navigation Items Container */\n.nav-rail-items {\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.25rem;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1;\n}\n\n/* Close Navigation Item */\n.nav-rail-close-item {\n margin-top: auto;\n border-top: 1px solid var(--mat-sys-outline-variant);\n padding-top: 0.75rem !important;\n margin-top: 0.5rem;\n background-color: var(--mat-sys-error-container) !important;\n color: var(--mat-sys-on-error-container) !important;\n}\n\n.nav-rail-close-item:hover {\n background-color: var(--mat-sys-error) !important;\n color: var(--mat-sys-on-error) !important;\n}\n\n.nav-rail-close-item i {\n font-size: 1.5rem;\n}\n\n/* Navigation Item */\n.nav-rail-item {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1rem;\n width: 100%;\n padding: 0.875rem 1rem;\n background: transparent;\n border: none;\n border-radius: var(--mat-sys-corner-medium);\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n text-align: left;\n min-height: 56px;\n}\n\n.nav-rail-item i {\n font-size: 1.5rem;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.nav-rail-label {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n flex: 1;\n}\n\n.nav-rail-item:hover:not(.active) {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-rail-item.active {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-primary);\n}\n\n.nav-rail-item.active .nav-rail-label {\n font-weight: 600;\n}\n\n.nav-rail-item:active {\n transform: scale(0.98);\n}\n\n.nav-rail-item:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n/* Badge indicator */\n.rail-badge {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 11px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.rail-badge.badge-primary {\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.rail-badge.badge-danger {\n background-color: var(--mat-sys-error);\n color: var(--mat-sys-on-error);\n}\n\n.rail-badge.badge-warning {\n background-color: var(--mat-sys-tertiary);\n color: var(--mat-sys-on-tertiary);\n}\n\n.rail-badge.badge-success {\n background-color: var(--mat-sys-secondary);\n color: var(--mat-sys-on-secondary);\n}\n\n/* Mobile Content Area */\n.mobile-content {\n width: 100%;\n max-width: 100vw;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 72px 0.75rem 2rem 0.75rem;\n min-width: 0;\n box-sizing: border-box;\n -webkit-overflow-scrolling: touch;\n flex: 1;\n}\n\n/* Responsive adjustments */\n@media (max-width: 374px) {\n .mobile-nav-rail {\n width: 260px;\n }\n\n .mobile-content {\n padding: 64px 0.5rem 1.5rem 0.5rem;\n }\n\n .mobile-header {\n height: 52px;\n padding: 0 0.25rem;\n }\n\n .mobile-header-icon {\n width: 44px;\n height: 44px;\n min-width: 44px;\n }\n\n .mobile-header-spacer {\n width: 44px;\n min-width: 44px;\n }\n\n .mobile-header-title {\n font-size: 1.125rem;\n }\n}\n\n/* ============================================\n Advanced Settings Sub-Tabs\n ============================================ */\n\n.advanced-tabs {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid var(--mat-sys-outline-variant);\n margin-bottom: 1rem;\n margin-top: 1rem;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n -webkit-overflow-scrolling: touch;\n}\n\n.advanced-tabs .tab-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-label-large);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n min-height: 44px;\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n/* Mobile-specific tab adjustments - Segmented Button Style */\n@media (max-width: 768px) {\n .advanced-tabs {\n gap: 0;\n margin-bottom: 1rem;\n margin-top: 1rem;\n border-bottom: none;\n border: 1px solid var(--mat-sys-outline);\n border-radius: var(--mat-sys-corner-full);\n padding: 0;\n background-color: var(--mat-sys-surface-container-low);\n overflow-x: hidden;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n .advanced-tabs .tab-btn {\n flex: 1;\n padding: 0.625rem 0.5rem;\n font-size: 0.75rem;\n border-bottom: none;\n border-radius: 0;\n border-right: 1px solid var(--mat-sys-outline);\n min-width: 0;\n justify-content: center;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .advanced-tabs .tab-btn:last-child {\n border-right: none;\n }\n\n .advanced-tabs .tab-btn:first-child {\n border-radius: var(--mat-sys-corner-full) 0 0 var(--mat-sys-corner-full);\n }\n\n .advanced-tabs .tab-btn:last-child {\n border-radius: 0 var(--mat-sys-corner-full) var(--mat-sys-corner-full) 0;\n }\n\n .advanced-tabs .tab-btn.active {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n border-bottom: none;\n }\n\n .advanced-tabs .tab-btn i {\n font-size: 0.875rem;\n }\n}\n\n.advanced-tabs .tab-btn:hover {\n color: var(--mat-sys-on-surface);\n background: var(--mat-sys-surface-container);\n}\n\n.advanced-tabs .tab-btn:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: -2px;\n}\n\n.advanced-tabs .tab-btn.active {\n color: var(--mat-sys-primary);\n border-bottom-color: var(--mat-sys-primary);\n background: var(--mat-sys-primary-container);\n}\n\n.advanced-tabs .tab-btn.active i {\n color: var(--mat-sys-primary);\n}\n\n.advanced-tabs .tab-btn i {\n font-size: 1.125rem;\n}\n\n/* ============================================\n Advanced Tab Content Panels\n ============================================ */\n\n.advanced-tab-content {\n flex: 1;\n overflow-y: visible;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: var(--mat-sys-surface);\n border-radius: var(--mat-sys-corner-large);\n padding: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n/* Ensure scrolling works on mobile */\n@media (max-width: 768px) {\n .advanced-tab-content {\n height: auto;\n min-height: 200px;\n overflow-y: visible;\n }\n}\n\n.performance-settings,\n.developer-settings {\n padding: 2rem;\n}\n\n.performance-settings h3,\n.developer-settings h3 {\n margin: 0 0 1rem 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.performance-settings p,\n.developer-settings p {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n/* ============================================\n Settings Panel Containers with Fade-In Animation\n ============================================ */\n\n.general-settings,\n.users-settings,\n.roles-settings,\n.applications-settings,\n.permissions-settings,\n.advanced-settings {\n animation: fadeIn 0.3s ease-out;\n width: 100%;\n max-width: 100%;\n height: auto;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: visible;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n\n/* Mobile-specific adjustments */\n@media (max-width: 768px) {\n .general-settings,\n .users-settings,\n .roles-settings,\n .applications-settings,\n .permissions-settings,\n .advanced-settings {\n gap: 0.75rem;\n height: auto;\n min-height: auto;\n }\n\n .section-title {\n margin-bottom: 0.5rem;\n font-size: 1.375rem;\n }\n\n .section-description {\n margin-bottom: 0.75rem;\n }\n}\n\n/* Only apply flex: 1 to actual content components, not titles/descriptions */\n.general-settings > mj-settings-card,\n.general-settings > .mj-grid,\n.users-settings > mj-user-management,\n.roles-settings > mj-role-management,\n.applications-settings > mj-application-management,\n.permissions-settings > mj-entity-permissions,\n.advanced-settings > .advanced-tabs,\n.advanced-settings > .advanced-tab-content {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n/* Allow content to flow naturally on mobile */\n@media (max-width: 768px) {\n .users-settings > mj-user-management,\n .roles-settings > mj-role-management,\n .applications-settings > mj-application-management,\n .permissions-settings > mj-entity-permissions,\n .advanced-settings > .advanced-tab-content {\n flex: none;\n height: auto !important;\n min-height: 0;\n max-height: none !important;\n overflow-y: visible !important;\n overflow-x: hidden;\n }\n}\n\n/* Titles and descriptions should not flex or grow */\n.general-settings > .section-title,\n.users-settings > .section-title,\n.roles-settings > .section-title,\n.users-settings > .section-description,\n.roles-settings > .section-description {\n flex-shrink: 0;\n flex-grow: 0;\n}\n\n/* ============================================\n Accessibility: Reduced Motion Support\n ============================================ */\n\n@media (prefers-reduced-motion: reduce) {\n .general-settings,\n .users-settings,\n .roles-settings,\n .applications-settings,\n .permissions-settings,\n .advanced-settings {\n animation: none;\n }\n\n .nav-tab i,\n .nav-item,\n .tab-btn,\n .search-input,\n .retry-button,\n .search-result-item {\n transition: none;\n }\n}\n\n/* ============================================\n Responsive Breakpoints\n ============================================ */\n@media (max-width: 640px) {\n .side-navigation {\n width: 200px;\n }\n\n .nav-item {\n padding: 0.75rem 1rem;\n }\n}\n\n@media (max-width: 1024px) {\n .content-area {\n padding: 1.5rem;\n }\n}\n\n/* Mobile scroll fix - ensure all child components flow naturally */\n@media (max-width: 768px) {\n .mobile-layout mj-user-management,\n .mobile-layout mj-role-management,\n .mobile-layout mj-application-management,\n .mobile-layout mj-entity-permissions,\n .mobile-layout mj-sql-logging,\n .mobile-layout mj-settings-card,\n .mobile-layout mj-user-profile-settings {\n display: block;\n height: auto !important;\n max-height: none !important;\n overflow: visible !important;\n }\n\n /* Ensure all nested content areas flow naturally */\n .mobile-layout .general-settings,\n .mobile-layout .users-settings,\n .mobile-layout .roles-settings,\n .mobile-layout .applications-settings,\n .mobile-layout .permissions-settings,\n .mobile-layout .advanced-settings {\n height: auto !important;\n min-height: 0 !important;\n max-height: none !important;\n }\n\n /* Ensure mj-grid and card content can expand */\n .mobile-layout .mj-grid,\n .mobile-layout .mj-grid-responsive,\n .mobile-layout .card-content {\n height: auto !important;\n min-height: 0 !important;\n }\n}\n\n@media (min-width: 1440px) {\n .content-area {\n padding: 2.5rem 3rem;\n }\n\n .side-navigation {\n width: 280px;\n }\n}\n\n/* ============================================\n iOS Safari Mobile Scrolling Fix\n ============================================ */\n@media (max-width: 768px) {\n /* Prevent iOS from restricting body scrolling */\n body {\n position: relative;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n }\n\n /* Allow mobile layout and all parents to expand naturally */\n .mobile-layout,\n .mobile-layout > *,\n .mobile-content > *,\n .tab-content > * {\n -webkit-overflow-scrolling: touch;\n }\n\n /* Prevent fixed heights from blocking scroll */\n .mobile-layout * {\n box-sizing: border-box;\n }\n}\n"] }]
|
|
832
|
+
}], () => [{ type: i1.Location }], { stateChange: [{
|
|
487
833
|
type: Output
|
|
488
834
|
}] }); })();
|
|
489
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SettingsComponent, { className: "SettingsComponent", filePath: "src/lib/settings/settings.component.ts", lineNumber:
|
|
835
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SettingsComponent, { className: "SettingsComponent", filePath: "src/lib/settings/settings.component.ts", lineNumber: 38 }); })();
|
|
490
836
|
//# sourceMappingURL=settings.component.js.map
|