@memberjunction/ng-dashboard-viewer 5.43.0 → 5.44.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/config-panels/artifact-config-panel.component.d.ts +0 -1
- package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/artifact-config-panel.component.js +49 -63
- package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.d.ts +0 -1
- package/dist/lib/config-panels/query-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.js +110 -124
- package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.d.ts +0 -2
- package/dist/lib/config-panels/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.js +142 -171
- package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.js +2 -2
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts +4 -0
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.js +205 -272
- package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +46 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +229 -49
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
- package/dist/lib/dashboard-viewer.module.d.ts +2 -1
- package/dist/lib/dashboard-viewer.module.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer.module.js +11 -3
- package/dist/lib/dashboard-viewer.module.js.map +1 -1
- package/dist/lib/parts/artifact-part.component.d.ts.map +1 -1
- package/dist/lib/parts/artifact-part.component.js +25 -32
- package/dist/lib/parts/artifact-part.component.js.map +1 -1
- package/dist/lib/parts/query-part.component.d.ts.map +1 -1
- package/dist/lib/parts/query-part.component.js +25 -32
- package/dist/lib/parts/query-part.component.js.map +1 -1
- package/dist/lib/parts/view-part.component.d.ts.map +1 -1
- package/dist/lib/parts/view-part.component.js +25 -32
- package/dist/lib/parts/view-part.component.js.map +1 -1
- package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
- package/dist/lib/parts/weburl-part.component.js +46 -52
- package/dist/lib/parts/weburl-part.component.js.map +1 -1
- package/package.json +13 -11
- package/dist/__tests__/exports.test.d.ts +0 -2
- package/dist/__tests__/exports.test.d.ts.map +0 -1
- package/dist/__tests__/exports.test.js +0 -17
- package/dist/__tests__/exports.test.js.map +0 -1
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
|
@@ -11,6 +11,7 @@ import { BaseConfigPanel } from './base-config-panel';
|
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@angular/forms";
|
|
13
13
|
import * as i2 from "@memberjunction/ng-trees";
|
|
14
|
+
import * as i3 from "@memberjunction/ng-ui-components";
|
|
14
15
|
const _c0 = ["viewDropdown"];
|
|
15
16
|
function ViewConfigPanelComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
16
17
|
i0.ɵɵelementStart(0, "span", 6);
|
|
@@ -28,7 +29,7 @@ function ViewConfigPanelComponent_Conditional_10_Template(rf, ctx) { if (rf & 1)
|
|
|
28
29
|
} }
|
|
29
30
|
function ViewConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
30
31
|
i0.ɵɵelementStart(0, "span", 8);
|
|
31
|
-
i0.ɵɵelement(1, "i",
|
|
32
|
+
i0.ɵɵelement(1, "i", 37);
|
|
32
33
|
i0.ɵɵtext(2);
|
|
33
34
|
i0.ɵɵelementEnd();
|
|
34
35
|
} if (rf & 2) {
|
|
@@ -36,40 +37,44 @@ function ViewConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1)
|
|
|
36
37
|
i0.ɵɵadvance(2);
|
|
37
38
|
i0.ɵɵtextInterpolate1(" Selected: ", ctx_r1.viewName, " ");
|
|
38
39
|
} }
|
|
39
|
-
function
|
|
40
|
-
|
|
40
|
+
function ViewConfigPanelComponent_ng_template_31_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
+
i0.ɵɵelement(0, "i", 38);
|
|
42
|
+
i0.ɵɵtext(1, " Display Options ");
|
|
43
|
+
} }
|
|
44
|
+
function ViewConfigPanelComponent_Conditional_63_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
41
46
|
i0.ɵɵelementStart(0, "div", 2)(1, "label");
|
|
42
47
|
i0.ɵɵtext(2, "Map Style");
|
|
43
48
|
i0.ɵɵelementEnd();
|
|
44
|
-
i0.ɵɵelementStart(3, "div",
|
|
45
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
46
|
-
i0.ɵɵlistener("change", function
|
|
49
|
+
i0.ɵɵelementStart(3, "div", 18)(4, "label", 19)(5, "input", 39);
|
|
50
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_63_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.mapRenderMode, $event) || (ctx_r1.mapRenderMode = $event); return i0.ɵɵresetView($event); });
|
|
51
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_63_Template_input_change_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
47
52
|
i0.ɵɵelementEnd();
|
|
48
|
-
i0.ɵɵelement(6, "span",
|
|
49
|
-
i0.ɵɵelementStart(7, "span",
|
|
50
|
-
i0.ɵɵelement(8, "i",
|
|
53
|
+
i0.ɵɵelement(6, "span", 21);
|
|
54
|
+
i0.ɵɵelementStart(7, "span", 22);
|
|
55
|
+
i0.ɵɵelement(8, "i", 40);
|
|
51
56
|
i0.ɵɵtext(9, " Points ");
|
|
52
57
|
i0.ɵɵelementEnd()();
|
|
53
|
-
i0.ɵɵelementStart(10, "label",
|
|
54
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
55
|
-
i0.ɵɵlistener("change", function
|
|
58
|
+
i0.ɵɵelementStart(10, "label", 19)(11, "input", 41);
|
|
59
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_63_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.mapRenderMode, $event) || (ctx_r1.mapRenderMode = $event); return i0.ɵɵresetView($event); });
|
|
60
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_63_Template_input_change_11_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
56
61
|
i0.ɵɵelementEnd();
|
|
57
|
-
i0.ɵɵelement(12, "span",
|
|
58
|
-
i0.ɵɵelementStart(13, "span",
|
|
59
|
-
i0.ɵɵelement(14, "i",
|
|
62
|
+
i0.ɵɵelement(12, "span", 21);
|
|
63
|
+
i0.ɵɵelementStart(13, "span", 22);
|
|
64
|
+
i0.ɵɵelement(14, "i", 42);
|
|
60
65
|
i0.ɵɵtext(15, " Regions ");
|
|
61
66
|
i0.ɵɵelementEnd()();
|
|
62
|
-
i0.ɵɵelementStart(16, "label",
|
|
63
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
64
|
-
i0.ɵɵlistener("change", function
|
|
67
|
+
i0.ɵɵelementStart(16, "label", 19)(17, "input", 43);
|
|
68
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_63_Template_input_ngModelChange_17_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.mapRenderMode, $event) || (ctx_r1.mapRenderMode = $event); return i0.ɵɵresetView($event); });
|
|
69
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_63_Template_input_change_17_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
65
70
|
i0.ɵɵelementEnd();
|
|
66
|
-
i0.ɵɵelement(18, "span",
|
|
67
|
-
i0.ɵɵelementStart(19, "span",
|
|
68
|
-
i0.ɵɵelement(20, "i",
|
|
71
|
+
i0.ɵɵelement(18, "span", 21);
|
|
72
|
+
i0.ɵɵelementStart(19, "span", 22);
|
|
73
|
+
i0.ɵɵelement(20, "i", 44);
|
|
69
74
|
i0.ɵɵtext(21, " Heatmap ");
|
|
70
75
|
i0.ɵɵelementEnd()()()();
|
|
71
76
|
} if (rf & 2) {
|
|
72
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
77
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
73
78
|
i0.ɵɵadvance(4);
|
|
74
79
|
i0.ɵɵclassProp("selected", ctx_r1.mapRenderMode === "point");
|
|
75
80
|
i0.ɵɵadvance();
|
|
@@ -83,133 +88,28 @@ function ViewConfigPanelComponent_Conditional_36_Conditional_31_Template(rf, ctx
|
|
|
83
88
|
i0.ɵɵadvance();
|
|
84
89
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.mapRenderMode);
|
|
85
90
|
} }
|
|
86
|
-
function
|
|
87
|
-
const
|
|
88
|
-
i0.ɵɵelementStart(0, "div", 2)(1, "label",
|
|
91
|
+
function ViewConfigPanelComponent_Conditional_76_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
93
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "label", 45);
|
|
89
94
|
i0.ɵɵtext(2, "Selection Mode");
|
|
90
95
|
i0.ɵɵelementEnd();
|
|
91
|
-
i0.ɵɵelementStart(3, "select",
|
|
92
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
93
|
-
i0.ɵɵlistener("change", function
|
|
94
|
-
i0.ɵɵelementStart(4, "option",
|
|
96
|
+
i0.ɵɵelementStart(3, "select", 46);
|
|
97
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_76_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.selectionMode, $event) || (ctx_r1.selectionMode = $event); return i0.ɵɵresetView($event); });
|
|
98
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_76_Template_select_change_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSelectionModeChange()); });
|
|
99
|
+
i0.ɵɵelementStart(4, "option", 47);
|
|
95
100
|
i0.ɵɵtext(5, "Single Selection");
|
|
96
101
|
i0.ɵɵelementEnd();
|
|
97
|
-
i0.ɵɵelementStart(6, "option",
|
|
102
|
+
i0.ɵɵelementStart(6, "option", 48);
|
|
98
103
|
i0.ɵɵtext(7, "Multiple Selection");
|
|
99
104
|
i0.ɵɵelementEnd()()();
|
|
100
105
|
} if (rf & 2) {
|
|
101
|
-
const ctx_r1 = i0.ɵɵnextContext(
|
|
106
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
102
107
|
i0.ɵɵadvance(3);
|
|
103
108
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.selectionMode);
|
|
104
109
|
} }
|
|
105
|
-
function
|
|
106
|
-
|
|
107
|
-
i0.ɵɵ
|
|
108
|
-
i0.ɵɵtext(3, "Display Mode");
|
|
109
|
-
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(4, "div", 23)(5, "label", 24)(6, "input", 25);
|
|
111
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_36_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.displayMode, $event) || (ctx_r1.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
112
|
-
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_36_Template_input_change_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDisplayModeChange()); });
|
|
113
|
-
i0.ɵɵelementEnd();
|
|
114
|
-
i0.ɵɵelement(7, "span", 26);
|
|
115
|
-
i0.ɵɵelementStart(8, "span", 27);
|
|
116
|
-
i0.ɵɵelement(9, "i", 28);
|
|
117
|
-
i0.ɵɵtext(10, " Grid ");
|
|
118
|
-
i0.ɵɵelementEnd()();
|
|
119
|
-
i0.ɵɵelementStart(11, "label", 24)(12, "input", 29);
|
|
120
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_36_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.displayMode, $event) || (ctx_r1.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
121
|
-
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_36_Template_input_change_12_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDisplayModeChange()); });
|
|
122
|
-
i0.ɵɵelementEnd();
|
|
123
|
-
i0.ɵɵelement(13, "span", 26);
|
|
124
|
-
i0.ɵɵelementStart(14, "span", 27);
|
|
125
|
-
i0.ɵɵelement(15, "i", 30);
|
|
126
|
-
i0.ɵɵtext(16, " Cards ");
|
|
127
|
-
i0.ɵɵelementEnd()();
|
|
128
|
-
i0.ɵɵelementStart(17, "label", 24)(18, "input", 31);
|
|
129
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_36_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.displayMode, $event) || (ctx_r1.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
130
|
-
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_36_Template_input_change_18_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDisplayModeChange()); });
|
|
131
|
-
i0.ɵɵelementEnd();
|
|
132
|
-
i0.ɵɵelement(19, "span", 26);
|
|
133
|
-
i0.ɵɵelementStart(20, "span", 27);
|
|
134
|
-
i0.ɵɵelement(21, "i", 32);
|
|
135
|
-
i0.ɵɵtext(22, " Timeline ");
|
|
136
|
-
i0.ɵɵelementEnd()();
|
|
137
|
-
i0.ɵɵelementStart(23, "label", 24)(24, "input", 33);
|
|
138
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_36_Template_input_ngModelChange_24_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.displayMode, $event) || (ctx_r1.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
139
|
-
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_36_Template_input_change_24_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDisplayModeChange()); });
|
|
140
|
-
i0.ɵɵelementEnd();
|
|
141
|
-
i0.ɵɵelement(25, "span", 26);
|
|
142
|
-
i0.ɵɵelementStart(26, "span", 27);
|
|
143
|
-
i0.ɵɵelement(27, "i", 34);
|
|
144
|
-
i0.ɵɵtext(28, " Map ");
|
|
145
|
-
i0.ɵɵelementEnd()()();
|
|
146
|
-
i0.ɵɵelementStart(29, "span", 7);
|
|
147
|
-
i0.ɵɵtext(30);
|
|
148
|
-
i0.ɵɵelementEnd()();
|
|
149
|
-
i0.ɵɵconditionalCreate(31, ViewConfigPanelComponent_Conditional_36_Conditional_31_Template, 22, 9, "div", 2);
|
|
150
|
-
i0.ɵɵelementStart(32, "div", 2)(33, "div", 35)(34, "label", 36)(35, "input", 37);
|
|
151
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_36_Template_input_ngModelChange_35_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.allowModeSwitch, $event) || (ctx_r1.allowModeSwitch = $event); return i0.ɵɵresetView($event); });
|
|
152
|
-
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_36_Template_input_change_35_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
153
|
-
i0.ɵɵelementEnd();
|
|
154
|
-
i0.ɵɵelement(36, "span", 38);
|
|
155
|
-
i0.ɵɵelementStart(37, "span", 39);
|
|
156
|
-
i0.ɵɵtext(38, "Allow Mode Switch");
|
|
157
|
-
i0.ɵɵelementEnd()();
|
|
158
|
-
i0.ɵɵelementStart(39, "label", 36)(40, "input", 37);
|
|
159
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_36_Template_input_ngModelChange_40_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.enableSelection, $event) || (ctx_r1.enableSelection = $event); return i0.ɵɵresetView($event); });
|
|
160
|
-
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_36_Template_input_change_40_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
161
|
-
i0.ɵɵelementEnd();
|
|
162
|
-
i0.ɵɵelement(41, "span", 38);
|
|
163
|
-
i0.ɵɵelementStart(42, "span", 39);
|
|
164
|
-
i0.ɵɵtext(43, "Enable Selection");
|
|
165
|
-
i0.ɵɵelementEnd()()()();
|
|
166
|
-
i0.ɵɵconditionalCreate(44, ViewConfigPanelComponent_Conditional_36_Conditional_44_Template, 8, 1, "div", 2);
|
|
167
|
-
i0.ɵɵelementEnd();
|
|
168
|
-
} if (rf & 2) {
|
|
169
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
170
|
-
i0.ɵɵadvance(5);
|
|
171
|
-
i0.ɵɵclassProp("selected", ctx_r1.displayMode === "grid");
|
|
172
|
-
i0.ɵɵadvance();
|
|
173
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.displayMode);
|
|
174
|
-
i0.ɵɵadvance(5);
|
|
175
|
-
i0.ɵɵclassProp("selected", ctx_r1.displayMode === "cards");
|
|
176
|
-
i0.ɵɵadvance();
|
|
177
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.displayMode);
|
|
178
|
-
i0.ɵɵadvance(5);
|
|
179
|
-
i0.ɵɵclassProp("selected", ctx_r1.displayMode === "timeline");
|
|
180
|
-
i0.ɵɵadvance();
|
|
181
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.displayMode);
|
|
182
|
-
i0.ɵɵadvance(5);
|
|
183
|
-
i0.ɵɵclassProp("selected", ctx_r1.displayMode === "map");
|
|
184
|
-
i0.ɵɵadvance();
|
|
185
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.displayMode);
|
|
186
|
-
i0.ɵɵadvance(6);
|
|
187
|
-
i0.ɵɵtextInterpolate(ctx_r1.getDisplayModeDescription());
|
|
188
|
-
i0.ɵɵadvance();
|
|
189
|
-
i0.ɵɵconditional(ctx_r1.displayMode === "map" ? 31 : -1);
|
|
190
|
-
i0.ɵɵadvance(4);
|
|
191
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.allowModeSwitch);
|
|
192
|
-
i0.ɵɵadvance(5);
|
|
193
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.enableSelection);
|
|
194
|
-
i0.ɵɵadvance(4);
|
|
195
|
-
i0.ɵɵconditional(ctx_r1.enableSelection ? 44 : -1);
|
|
196
|
-
} }
|
|
197
|
-
function ViewConfigPanelComponent_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
198
|
-
const _r6 = i0.ɵɵgetCurrentView();
|
|
199
|
-
i0.ɵɵelementStart(0, "div", 20)(1, "div", 2)(2, "label", 50);
|
|
200
|
-
i0.ɵɵtext(3, " Extra Filter ");
|
|
201
|
-
i0.ɵɵelementEnd();
|
|
202
|
-
i0.ɵɵelementStart(4, "input", 51);
|
|
203
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_43_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.extraFilter, $event) || (ctx_r1.extraFilter = $event); return i0.ɵɵresetView($event); });
|
|
204
|
-
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_43_Template_input_input_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilterChange()); });
|
|
205
|
-
i0.ɵɵelementEnd();
|
|
206
|
-
i0.ɵɵelementStart(5, "span", 7);
|
|
207
|
-
i0.ɵɵtext(6, " SQL WHERE clause to filter records (applied in addition to view filters) ");
|
|
208
|
-
i0.ɵɵelementEnd()()();
|
|
209
|
-
} if (rf & 2) {
|
|
210
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
211
|
-
i0.ɵɵadvance(4);
|
|
212
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.extraFilter);
|
|
110
|
+
function ViewConfigPanelComponent_ng_template_78_Template(rf, ctx) { if (rf & 1) {
|
|
111
|
+
i0.ɵɵelement(0, "i", 49);
|
|
112
|
+
i0.ɵɵtext(1, " Advanced Filtering ");
|
|
213
113
|
} }
|
|
214
114
|
/**
|
|
215
115
|
* Configuration panel for View parts.
|
|
@@ -376,12 +276,6 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
376
276
|
onFilterChange() {
|
|
377
277
|
this.emitConfigChanged();
|
|
378
278
|
}
|
|
379
|
-
toggleDisplayOptions() {
|
|
380
|
-
this.showDisplayOptions = !this.showDisplayOptions;
|
|
381
|
-
}
|
|
382
|
-
toggleAdvancedOptions() {
|
|
383
|
-
this.showAdvancedOptions = !this.showAdvancedOptions;
|
|
384
|
-
}
|
|
385
279
|
getDisplayModeDescription() {
|
|
386
280
|
switch (this.displayMode) {
|
|
387
281
|
case 'cards':
|
|
@@ -400,7 +294,7 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
400
294
|
} if (rf & 2) {
|
|
401
295
|
let _t;
|
|
402
296
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewDropdown = _t.first);
|
|
403
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
297
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 86, vars: 35, consts: [["viewDropdown", ""], [1, "config-panel", "config-panel--compact"], [1, "form-group"], [1, "fa-solid", "fa-table"], [1, "optional-tag"], [3, "SelectionChange", "BranchConfig", "LeafConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch"], [1, "form-error"], [1, "form-hint"], [1, "form-hint", "form-hint--selected"], ["for", "entityName"], [1, "fa-solid", "fa-database"], ["type", "text", "id", "entityName", "placeholder", "e.g., Accounts, Contacts, Users", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], ["type", "text", "id", "partTitle", 1, "form-input", 3, "ngModelChange", "input", "ngModel", "placeholder"], ["Size", "sm", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "config-section-body"], [1, "radio-group", "radio-group--horizontal"], [1, "radio-option", "radio-option--compact"], ["type", "radio", "name", "displayMode", "value", "grid", 3, "ngModelChange", "change", "ngModel"], [1, "radio-mark"], [1, "radio-label"], [1, "fa-solid", "fa-table-cells"], ["type", "radio", "name", "displayMode", "value", "cards", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-id-card"], ["type", "radio", "name", "displayMode", "value", "timeline", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-timeline"], ["type", "radio", "name", "displayMode", "value", "map", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-map-location-dot"], [1, "checkbox-group", "checkbox-group--compact"], [1, "checkbox-option", "checkbox-option--compact"], ["type", "checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "checkbox-mark"], [1, "checkbox-label"], ["for", "extraFilter"], ["type", "text", "id", "extraFilter", "placeholder", "e.g., Status = 'Active'", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-grip"], ["type", "radio", "name", "mapRenderMode", "value", "point", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-map-pin"], ["type", "radio", "name", "mapRenderMode", "value", "choropleth", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-earth-americas"], ["type", "radio", "name", "mapRenderMode", "value", "heatmap", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-fire"], ["for", "selectionMode"], ["id", "selectionMode", 1, "form-select", 3, "ngModelChange", "change", "ngModel"], ["value", "single"], ["value", "multiple"], [1, "fa-solid", "fa-filter"]], template: function ViewConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
404
298
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
405
299
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "label");
|
|
406
300
|
i0.ɵɵelement(3, "i", 3);
|
|
@@ -441,26 +335,83 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
441
335
|
i0.ɵɵelementStart(28, "span", 7);
|
|
442
336
|
i0.ɵɵtext(29, "Leave empty to use view/entity name as title");
|
|
443
337
|
i0.ɵɵelementEnd()();
|
|
444
|
-
i0.ɵɵelementStart(30, "
|
|
445
|
-
i0.ɵɵ
|
|
446
|
-
i0.ɵɵ
|
|
447
|
-
i0.ɵɵ
|
|
448
|
-
i0.ɵɵtext(
|
|
338
|
+
i0.ɵɵelementStart(30, "mj-accordion-panel", 15);
|
|
339
|
+
i0.ɵɵtwoWayListener("ExpandedChange", function ViewConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_30_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showDisplayOptions, $event) || (ctx.showDisplayOptions = $event); return i0.ɵɵresetView($event); });
|
|
340
|
+
i0.ɵɵtemplate(31, ViewConfigPanelComponent_ng_template_31_Template, 2, 0, "ng-template", 16);
|
|
341
|
+
i0.ɵɵelementStart(32, "div", 17)(33, "div", 2)(34, "label");
|
|
342
|
+
i0.ɵɵtext(35, "Display Mode");
|
|
449
343
|
i0.ɵɵelementEnd();
|
|
450
|
-
i0.ɵɵ
|
|
344
|
+
i0.ɵɵelementStart(36, "div", 18)(37, "label", 19)(38, "input", 20);
|
|
345
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_38_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
346
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_38_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDisplayModeChange()); });
|
|
451
347
|
i0.ɵɵelementEnd();
|
|
452
|
-
i0.ɵɵ
|
|
348
|
+
i0.ɵɵelement(39, "span", 21);
|
|
349
|
+
i0.ɵɵelementStart(40, "span", 22);
|
|
350
|
+
i0.ɵɵelement(41, "i", 23);
|
|
351
|
+
i0.ɵɵtext(42, " Grid ");
|
|
352
|
+
i0.ɵɵelementEnd()();
|
|
353
|
+
i0.ɵɵelementStart(43, "label", 19)(44, "input", 24);
|
|
354
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_44_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
355
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_44_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDisplayModeChange()); });
|
|
453
356
|
i0.ɵɵelementEnd();
|
|
454
|
-
i0.ɵɵ
|
|
455
|
-
i0.ɵɵ
|
|
456
|
-
i0.ɵɵ
|
|
457
|
-
i0.ɵɵ
|
|
458
|
-
i0.ɵɵ
|
|
357
|
+
i0.ɵɵelement(45, "span", 21);
|
|
358
|
+
i0.ɵɵelementStart(46, "span", 22);
|
|
359
|
+
i0.ɵɵelement(47, "i", 25);
|
|
360
|
+
i0.ɵɵtext(48, " Cards ");
|
|
361
|
+
i0.ɵɵelementEnd()();
|
|
362
|
+
i0.ɵɵelementStart(49, "label", 19)(50, "input", 26);
|
|
363
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_50_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
364
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_50_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDisplayModeChange()); });
|
|
459
365
|
i0.ɵɵelementEnd();
|
|
460
|
-
i0.ɵɵelement(
|
|
366
|
+
i0.ɵɵelement(51, "span", 21);
|
|
367
|
+
i0.ɵɵelementStart(52, "span", 22);
|
|
368
|
+
i0.ɵɵelement(53, "i", 27);
|
|
369
|
+
i0.ɵɵtext(54, " Timeline ");
|
|
370
|
+
i0.ɵɵelementEnd()();
|
|
371
|
+
i0.ɵɵelementStart(55, "label", 19)(56, "input", 28);
|
|
372
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_56_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
373
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_56_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDisplayModeChange()); });
|
|
461
374
|
i0.ɵɵelementEnd();
|
|
462
|
-
i0.ɵɵ
|
|
375
|
+
i0.ɵɵelement(57, "span", 21);
|
|
376
|
+
i0.ɵɵelementStart(58, "span", 22);
|
|
377
|
+
i0.ɵɵelement(59, "i", 29);
|
|
378
|
+
i0.ɵɵtext(60, " Map ");
|
|
379
|
+
i0.ɵɵelementEnd()()();
|
|
380
|
+
i0.ɵɵelementStart(61, "span", 7);
|
|
381
|
+
i0.ɵɵtext(62);
|
|
463
382
|
i0.ɵɵelementEnd()();
|
|
383
|
+
i0.ɵɵconditionalCreate(63, ViewConfigPanelComponent_Conditional_63_Template, 22, 9, "div", 2);
|
|
384
|
+
i0.ɵɵelementStart(64, "div", 2)(65, "div", 30)(66, "label", 31)(67, "input", 32);
|
|
385
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_67_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.allowModeSwitch, $event) || (ctx.allowModeSwitch = $event); return i0.ɵɵresetView($event); });
|
|
386
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_67_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
|
|
387
|
+
i0.ɵɵelementEnd();
|
|
388
|
+
i0.ɵɵelement(68, "span", 33);
|
|
389
|
+
i0.ɵɵelementStart(69, "span", 34);
|
|
390
|
+
i0.ɵɵtext(70, "Allow Mode Switch");
|
|
391
|
+
i0.ɵɵelementEnd()();
|
|
392
|
+
i0.ɵɵelementStart(71, "label", 31)(72, "input", 32);
|
|
393
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_72_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.enableSelection, $event) || (ctx.enableSelection = $event); return i0.ɵɵresetView($event); });
|
|
394
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_72_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
|
|
395
|
+
i0.ɵɵelementEnd();
|
|
396
|
+
i0.ɵɵelement(73, "span", 33);
|
|
397
|
+
i0.ɵɵelementStart(74, "span", 34);
|
|
398
|
+
i0.ɵɵtext(75, "Enable Selection");
|
|
399
|
+
i0.ɵɵelementEnd()()()();
|
|
400
|
+
i0.ɵɵconditionalCreate(76, ViewConfigPanelComponent_Conditional_76_Template, 8, 1, "div", 2);
|
|
401
|
+
i0.ɵɵelementEnd()();
|
|
402
|
+
i0.ɵɵelementStart(77, "mj-accordion-panel", 15);
|
|
403
|
+
i0.ɵɵtwoWayListener("ExpandedChange", function ViewConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_77_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showAdvancedOptions, $event) || (ctx.showAdvancedOptions = $event); return i0.ɵɵresetView($event); });
|
|
404
|
+
i0.ɵɵtemplate(78, ViewConfigPanelComponent_ng_template_78_Template, 2, 0, "ng-template", 16);
|
|
405
|
+
i0.ɵɵelementStart(79, "div", 17)(80, "div", 2)(81, "label", 35);
|
|
406
|
+
i0.ɵɵtext(82, " Extra Filter ");
|
|
407
|
+
i0.ɵɵelementEnd();
|
|
408
|
+
i0.ɵɵelementStart(83, "input", 36);
|
|
409
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_83_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.extraFilter, $event) || (ctx.extraFilter = $event); return i0.ɵɵresetView($event); });
|
|
410
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Template_input_input_83_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onFilterChange()); });
|
|
411
|
+
i0.ɵɵelementEnd();
|
|
412
|
+
i0.ɵɵelementStart(84, "span", 7);
|
|
413
|
+
i0.ɵɵtext(85, " SQL WHERE clause to filter records (applied in addition to view filters) ");
|
|
414
|
+
i0.ɵɵelementEnd()()()()();
|
|
464
415
|
} if (rf & 2) {
|
|
465
416
|
i0.ɵɵadvance(7);
|
|
466
417
|
i0.ɵɵclassProp("error", ctx.viewError);
|
|
@@ -476,19 +427,39 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
476
427
|
i0.ɵɵadvance(9);
|
|
477
428
|
i0.ɵɵtwoWayProperty("ngModel", ctx.title);
|
|
478
429
|
i0.ɵɵproperty("placeholder", ctx.viewName || ctx.entityName ? "Default: " + (ctx.viewName || ctx.entityName) : "Enter a custom title");
|
|
479
|
-
i0.ɵɵadvance(
|
|
480
|
-
i0.ɵɵ
|
|
481
|
-
i0.ɵɵadvance(
|
|
482
|
-
i0.ɵɵclassProp("
|
|
430
|
+
i0.ɵɵadvance(3);
|
|
431
|
+
i0.ɵɵtwoWayProperty("Expanded", ctx.showDisplayOptions);
|
|
432
|
+
i0.ɵɵadvance(7);
|
|
433
|
+
i0.ɵɵclassProp("selected", ctx.displayMode === "grid");
|
|
483
434
|
i0.ɵɵadvance();
|
|
484
|
-
i0.ɵɵ
|
|
485
|
-
i0.ɵɵadvance(
|
|
486
|
-
i0.ɵɵ
|
|
435
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.displayMode);
|
|
436
|
+
i0.ɵɵadvance(5);
|
|
437
|
+
i0.ɵɵclassProp("selected", ctx.displayMode === "cards");
|
|
438
|
+
i0.ɵɵadvance();
|
|
439
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.displayMode);
|
|
440
|
+
i0.ɵɵadvance(5);
|
|
441
|
+
i0.ɵɵclassProp("selected", ctx.displayMode === "timeline");
|
|
442
|
+
i0.ɵɵadvance();
|
|
443
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.displayMode);
|
|
444
|
+
i0.ɵɵadvance(5);
|
|
445
|
+
i0.ɵɵclassProp("selected", ctx.displayMode === "map");
|
|
446
|
+
i0.ɵɵadvance();
|
|
447
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.displayMode);
|
|
448
|
+
i0.ɵɵadvance(6);
|
|
449
|
+
i0.ɵɵtextInterpolate(ctx.getDisplayModeDescription());
|
|
450
|
+
i0.ɵɵadvance();
|
|
451
|
+
i0.ɵɵconditional(ctx.displayMode === "map" ? 63 : -1);
|
|
452
|
+
i0.ɵɵadvance(4);
|
|
453
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.allowModeSwitch);
|
|
454
|
+
i0.ɵɵadvance(5);
|
|
455
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.enableSelection);
|
|
487
456
|
i0.ɵɵadvance(4);
|
|
488
|
-
i0.ɵɵ
|
|
457
|
+
i0.ɵɵconditional(ctx.enableSelection ? 76 : -1);
|
|
489
458
|
i0.ɵɵadvance();
|
|
490
|
-
i0.ɵɵ
|
|
491
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent], styles: ["\n\n\n\n\n\n\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n\n.config-panel--compact[_ngcontent-%COMP%] {\n gap: 16px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] {\n gap: 8px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-select[_ngcontent-%COMP%] {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n\n\n\n\n\n.optional-tag[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-hint--selected[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n\n\n\n.collapsible-section[_ngcontent-%COMP%] {\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n overflow: hidden;\n}\n\n.collapsible-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 12px 16px;\n border: none;\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.collapsible-header[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.collapsible-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.collapsible-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.collapsible-content[_ngcontent-%COMP%] {\n padding: 16px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n\n\n\n\n.radio-group--horizontal[_ngcontent-%COMP%] {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n width: 8px;\n height: 8px;\n}\n\n\n\n\n\n\n.checkbox-group--compact[_ngcontent-%COMP%] {\n gap: 4px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-mark[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-label[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\nmj-tree-dropdown.error[_ngcontent-%COMP%] {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error[_ngcontent-%COMP%]:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}"] });
|
|
459
|
+
i0.ɵɵtwoWayProperty("Expanded", ctx.showAdvancedOptions);
|
|
460
|
+
i0.ɵɵadvance(6);
|
|
461
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.extraFilter);
|
|
462
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective], styles: ["\n\n\n\n\n\n\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n\n.config-panel--compact[_ngcontent-%COMP%] {\n gap: 16px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] {\n gap: 8px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-select[_ngcontent-%COMP%] {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n\n\n\n\n\n.optional-tag[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-hint--selected[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n\n\n\n\n\n.config-section-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n\n\n\n\n.radio-group--horizontal[_ngcontent-%COMP%] {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n width: 8px;\n height: 8px;\n}\n\n\n\n\n\n\n.checkbox-group--compact[_ngcontent-%COMP%] {\n gap: 4px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-mark[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-label[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\nmj-tree-dropdown.error[_ngcontent-%COMP%] {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error[_ngcontent-%COMP%]:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}"] });
|
|
492
463
|
};
|
|
493
464
|
ViewConfigPanelComponent = __decorate([
|
|
494
465
|
RegisterClass(BaseConfigPanel, 'ViewPanelConfigDialog')
|
|
@@ -496,7 +467,7 @@ ViewConfigPanelComponent = __decorate([
|
|
|
496
467
|
export { ViewConfigPanelComponent };
|
|
497
468
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewConfigPanelComponent, [{
|
|
498
469
|
type: Component,
|
|
499
|
-
args: [{ standalone: false, selector: 'mj-dashboard-view-config-panel', template: "<!-- View Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- View Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-table\"></i>\n Select View\n <span class=\"optional-tag\">(or enter entity below)</span>\n </label>\n <mj-tree-dropdown\n #viewDropdown\n [BranchConfig]=\"ViewCategoryConfig\"\n [LeafConfig]=\"ViewLeafConfig\"\n [Value]=\"ViewIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse saved views...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onViewSelection($event)\"\n [class.error]=\"viewError\">\n </mj-tree-dropdown>\n @if (viewError) {\n <span class=\"form-error\">{{ viewError }}</span>\n }\n @if (!viewError && !viewId && !entityName) {\n <span class=\"form-hint\">\n Select a saved view or enter an entity name below\n </span>\n }\n @if (!viewError && viewId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ viewName }}\n </span>\n }\n </div>\n\n <!-- Entity Name (Alternative) -->\n <div class=\"form-group\">\n <label for=\"entityName\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Name\n <span class=\"optional-tag\">(alternative to view)</span>\n </label>\n <input\n type=\"text\"\n id=\"entityName\"\n [(ngModel)]=\"entityName\"\n (input)=\"onEntityChange()\"\n placeholder=\"e.g., Accounts, Contacts, Users\"\n class=\"form-input\">\n <span class=\"form-hint\">\n Use this to display all records from an entity without a saved view\n </span>\n </div>\n\n <!-- Title (Optional) -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"viewName || entityName ? 'Default: ' + (viewName || entityName) : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use view/entity name as title</span>\n </div>\n\n <!-- Display Options (Collapsible) -->\n <div class=\"collapsible-section\">\n <button\n type=\"button\"\n class=\"collapsible-header\"\n (click)=\"toggleDisplayOptions()\"\n [attr.aria-expanded]=\"showDisplayOptions\">\n <span class=\"collapsible-title\">\n <i class=\"fa-solid fa-grip\"></i>\n Display Options\n </span>\n <i class=\"collapsible-chevron fa-solid\"\n [class.fa-chevron-down]=\"!showDisplayOptions\"\n [class.fa-chevron-up]=\"showDisplayOptions\"></i>\n </button>\n\n @if (showDisplayOptions) {\n <div class=\"collapsible-content\">\n <!-- Display Mode -->\n <div class=\"form-group\">\n <label>Display Mode</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'grid'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"grid\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-cells\"></i>\n Grid\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'cards'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"cards\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-id-card\"></i>\n Cards\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'timeline'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"timeline\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-timeline\"></i>\n Timeline\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'map'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"map\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n Map\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getDisplayModeDescription() }}</span>\n </div>\n <!-- Map Render Mode (only shown when map is selected) -->\n @if (displayMode === 'map') {\n <div class=\"form-group\">\n <label>Map Style</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'point'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"point\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-pin\"></i>\n Points\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'choropleth'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"choropleth\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-earth-americas\"></i>\n Regions\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'heatmap'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"heatmap\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-fire\"></i>\n Heatmap\n </span>\n </label>\n </div>\n </div>\n }\n <!-- Selection Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowModeSwitch\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Allow Mode Switch</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"enableSelection\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Enable Selection</span>\n </label>\n </div>\n </div>\n <!-- Selection Mode -->\n @if (enableSelection) {\n <div class=\"form-group\">\n <label for=\"selectionMode\">Selection Mode</label>\n <select\n id=\"selectionMode\"\n class=\"form-select\"\n [(ngModel)]=\"selectionMode\"\n (change)=\"onSelectionModeChange()\">\n <option value=\"single\">Single Selection</option>\n <option value=\"multiple\">Multiple Selection</option>\n </select>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Advanced Options (Collapsible) -->\n <div class=\"collapsible-section\">\n <button\n type=\"button\"\n class=\"collapsible-header\"\n (click)=\"toggleAdvancedOptions()\"\n [attr.aria-expanded]=\"showAdvancedOptions\">\n <span class=\"collapsible-title\">\n <i class=\"fa-solid fa-filter\"></i>\n Advanced Filtering\n </span>\n <i class=\"collapsible-chevron fa-solid\"\n [class.fa-chevron-down]=\"!showAdvancedOptions\"\n [class.fa-chevron-up]=\"showAdvancedOptions\"></i>\n </button>\n\n @if (showAdvancedOptions) {\n <div class=\"collapsible-content\">\n <!-- Extra Filter -->\n <div class=\"form-group\">\n <label for=\"extraFilter\">\n Extra Filter\n </label>\n <input\n type=\"text\"\n id=\"extraFilter\"\n [(ngModel)]=\"extraFilter\"\n (input)=\"onFilterChange()\"\n placeholder=\"e.g., Status = 'Active'\"\n class=\"form-input\">\n <span class=\"form-hint\">\n SQL WHERE clause to filter records (applied in addition to view filters)\n </span>\n </div>\n </div>\n }\n </div>\n</div>\n", styles: ["/**\n * Shared styles for Config Panels (form content only, no dialog chrome)\n */\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.config-panel {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n/* ========================================\n Form Groups\n ======================================== */\n\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group > label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group > label i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group > label .required {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Form Inputs\n ======================================== */\n\n.form-input {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action .form-input {\n flex: 1;\n}\n\n.input-action-btn {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Form Hints & Errors\n ======================================== */\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n/* ========================================\n Radio Group\n ======================================== */\n\n.radio-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option input[type=\"radio\"] {\n display: none;\n}\n\n.radio-mark {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected .radio-mark {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected .radio-mark::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n/* ========================================\n Checkbox Group\n ======================================== */\n\n.checkbox-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option input[type=\"checkbox\"] {\n display: none;\n}\n\n.checkbox-mark {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option input:checked + .checkbox-mark {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option input:checked + .checkbox-mark::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Select/Dropdown\n ======================================== */\n\n.form-select {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* ========================================\n Compact Panel Variant\n ======================================== */\n\n.config-panel--compact {\n gap: 16px;\n}\n\n.config-panel--compact .form-group {\n gap: 8px;\n}\n\n.config-panel--compact .form-input {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact .form-select {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n/* ========================================\n Optional Tag\n ======================================== */\n\n.optional-tag {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Selected Hint (Success State)\n ======================================== */\n\n.form-hint--selected {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected i {\n color: var(--mj-status-success);\n}\n\n/* ========================================\n Collapsible Section\n ======================================== */\n\n.collapsible-section {\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n overflow: hidden;\n}\n\n.collapsible-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 12px 16px;\n border: none;\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.collapsible-header:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.collapsible-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.collapsible-chevron {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.collapsible-content {\n padding: 16px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ========================================\n Horizontal Radio Group\n ======================================== */\n\n.radio-group--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact .radio-label {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact .radio-label i {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact .radio-mark {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected .radio-mark::after {\n width: 8px;\n height: 8px;\n}\n\n/* ========================================\n Compact Checkbox Group\n ======================================== */\n\n.checkbox-group--compact {\n gap: 4px;\n}\n\n.checkbox-option--compact {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact .checkbox-mark {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact .checkbox-label {\n font-size: 13px;\n}\n\n/* ========================================\n Tree Dropdown Error State\n ======================================== */\n\nmj-tree-dropdown.error {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}\n"] }]
|
|
470
|
+
args: [{ standalone: false, selector: 'mj-dashboard-view-config-panel', template: "<!-- View Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- View Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-table\"></i>\n Select View\n <span class=\"optional-tag\">(or enter entity below)</span>\n </label>\n <mj-tree-dropdown\n #viewDropdown\n [BranchConfig]=\"ViewCategoryConfig\"\n [LeafConfig]=\"ViewLeafConfig\"\n [Value]=\"ViewIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse saved views...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onViewSelection($event)\"\n [class.error]=\"viewError\">\n </mj-tree-dropdown>\n @if (viewError) {\n <span class=\"form-error\">{{ viewError }}</span>\n }\n @if (!viewError && !viewId && !entityName) {\n <span class=\"form-hint\">\n Select a saved view or enter an entity name below\n </span>\n }\n @if (!viewError && viewId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ viewName }}\n </span>\n }\n </div>\n\n <!-- Entity Name (Alternative) -->\n <div class=\"form-group\">\n <label for=\"entityName\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Name\n <span class=\"optional-tag\">(alternative to view)</span>\n </label>\n <input\n type=\"text\"\n id=\"entityName\"\n [(ngModel)]=\"entityName\"\n (input)=\"onEntityChange()\"\n placeholder=\"e.g., Accounts, Contacts, Users\"\n class=\"form-input\">\n <span class=\"form-hint\">\n Use this to display all records from an entity without a saved view\n </span>\n </div>\n\n <!-- Title (Optional) -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"viewName || entityName ? 'Default: ' + (viewName || entityName) : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use view/entity name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showDisplayOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grip\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Display Mode -->\n <div class=\"form-group\">\n <label>Display Mode</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'grid'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"grid\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-cells\"></i>\n Grid\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'cards'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"cards\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-id-card\"></i>\n Cards\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'timeline'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"timeline\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-timeline\"></i>\n Timeline\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'map'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"map\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n Map\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getDisplayModeDescription() }}</span>\n </div>\n <!-- Map Render Mode (only shown when map is selected) -->\n @if (displayMode === 'map') {\n <div class=\"form-group\">\n <label>Map Style</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'point'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"point\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-pin\"></i>\n Points\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'choropleth'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"choropleth\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-earth-americas\"></i>\n Regions\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'heatmap'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"heatmap\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-fire\"></i>\n Heatmap\n </span>\n </label>\n </div>\n </div>\n }\n <!-- Selection Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowModeSwitch\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Allow Mode Switch</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"enableSelection\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Enable Selection</span>\n </label>\n </div>\n </div>\n <!-- Selection Mode -->\n @if (enableSelection) {\n <div class=\"form-group\">\n <label for=\"selectionMode\">Selection Mode</label>\n <select\n id=\"selectionMode\"\n class=\"form-select\"\n [(ngModel)]=\"selectionMode\"\n (change)=\"onSelectionModeChange()\">\n <option value=\"single\">Single Selection</option>\n <option value=\"multiple\">Multiple Selection</option>\n </select>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Advanced Filtering -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-filter\"></i>\n Advanced Filtering\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Extra Filter -->\n <div class=\"form-group\">\n <label for=\"extraFilter\">\n Extra Filter\n </label>\n <input\n type=\"text\"\n id=\"extraFilter\"\n [(ngModel)]=\"extraFilter\"\n (input)=\"onFilterChange()\"\n placeholder=\"e.g., Status = 'Active'\"\n class=\"form-input\">\n <span class=\"form-hint\">\n SQL WHERE clause to filter records (applied in addition to view filters)\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n", styles: ["/**\n * Shared styles for Config Panels (form content only, no dialog chrome)\n */\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.config-panel {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n/* ========================================\n Form Groups\n ======================================== */\n\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group > label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group > label i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group > label .required {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Form Inputs\n ======================================== */\n\n.form-input {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action .form-input {\n flex: 1;\n}\n\n.input-action-btn {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Form Hints & Errors\n ======================================== */\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n/* ========================================\n Radio Group\n ======================================== */\n\n.radio-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option input[type=\"radio\"] {\n display: none;\n}\n\n.radio-mark {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected .radio-mark {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected .radio-mark::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n/* ========================================\n Checkbox Group\n ======================================== */\n\n.checkbox-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option input[type=\"checkbox\"] {\n display: none;\n}\n\n.checkbox-mark {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option input:checked + .checkbox-mark {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option input:checked + .checkbox-mark::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Select/Dropdown\n ======================================== */\n\n.form-select {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* ========================================\n Compact Panel Variant\n ======================================== */\n\n.config-panel--compact {\n gap: 16px;\n}\n\n.config-panel--compact .form-group {\n gap: 8px;\n}\n\n.config-panel--compact .form-input {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact .form-select {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n/* ========================================\n Optional Tag\n ======================================== */\n\n.optional-tag {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Selected Hint (Success State)\n ======================================== */\n\n.form-hint--selected {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected i {\n color: var(--mj-status-success);\n}\n\n/* ========================================\n Config-panel accordion body\n (the collapsible sections now use <mj-accordion-panel>;\n this only lays out the form-groups inside the projected body)\n ======================================== */\n\n.config-section-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ========================================\n Horizontal Radio Group\n ======================================== */\n\n.radio-group--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact .radio-label {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact .radio-label i {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact .radio-mark {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected .radio-mark::after {\n width: 8px;\n height: 8px;\n}\n\n/* ========================================\n Compact Checkbox Group\n ======================================== */\n\n.checkbox-group--compact {\n gap: 4px;\n}\n\n.checkbox-option--compact {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact .checkbox-mark {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact .checkbox-label {\n font-size: 13px;\n}\n\n/* ========================================\n Tree Dropdown Error State\n ======================================== */\n\nmj-tree-dropdown.error {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}\n"] }]
|
|
500
471
|
}], () => [{ type: i0.ChangeDetectorRef }], { viewDropdown: [{
|
|
501
472
|
type: ViewChild,
|
|
502
473
|
args: ['viewDropdown']
|