@memberjunction/ng-dashboard-viewer 6.2.0-edge.3 → 6.2.0-edge.4
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/README.md +165 -17
- package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +3 -4
- package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
- package/dist/lib/config-dialogs/confirm-dialog.component.js +3 -2
- package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -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 +59 -50
- package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/base-config-panel.d.ts +8 -3
- package/dist/lib/config-panels/base-config-panel.d.ts.map +1 -1
- package/dist/lib/config-panels/base-config-panel.js +10 -3
- package/dist/lib/config-panels/base-config-panel.js.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.js +124 -99
- package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.js +111 -103
- package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.js +89 -80
- package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts +79 -28
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.js +446 -447
- package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
- package/dist/lib/dashboard-card/dashboard-card.component.d.ts +69 -0
- package/dist/lib/dashboard-card/dashboard-card.component.d.ts.map +1 -0
- package/dist/lib/dashboard-card/dashboard-card.component.js +281 -0
- package/dist/lib/dashboard-card/dashboard-card.component.js.map +1 -0
- package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts +18 -0
- package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts.map +1 -0
- package/dist/lib/dashboard-card/dashboard-card.helpers.js +43 -0
- package/dist/lib/dashboard-card/dashboard-card.helpers.js.map +1 -0
- package/dist/lib/dashboard-card/layout-preview-cache.d.ts +15 -0
- package/dist/lib/dashboard-card/layout-preview-cache.d.ts.map +1 -0
- package/dist/lib/dashboard-card/layout-preview-cache.js +22 -0
- package/dist/lib/dashboard-card/layout-preview-cache.js.map +1 -0
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +69 -12
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +173 -145
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
- package/dist/lib/dashboard-viewer.module.d.ts +24 -20
- package/dist/lib/dashboard-viewer.module.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer.module.js +42 -5
- package/dist/lib/dashboard-viewer.module.js.map +1 -1
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +7 -12
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +3 -1
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
- package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts +54 -0
- package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts.map +1 -0
- package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js +156 -0
- package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js.map +1 -0
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +5 -11
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +3 -1
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
- package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts +147 -0
- package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts.map +1 -0
- package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js +536 -0
- package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js.map +1 -0
- package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts +20 -0
- package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts.map +1 -0
- package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js +80 -0
- package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js.map +1 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts +28 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts.map +1 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.component.js +62 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.component.js.map +1 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.d.ts +33 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.d.ts.map +1 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.js +138 -0
- package/dist/lib/layout-preview/dashboard-layout-preview.js.map +1 -0
- package/dist/lib/models/dashboard-layout-editor.d.ts +78 -0
- package/dist/lib/models/dashboard-layout-editor.d.ts.map +1 -0
- package/dist/lib/models/dashboard-layout-editor.js +374 -0
- package/dist/lib/models/dashboard-layout-editor.js.map +1 -0
- package/dist/lib/models/remove-part-confirm.d.ts +8 -0
- package/dist/lib/models/remove-part-confirm.d.ts.map +1 -0
- package/dist/lib/models/remove-part-confirm.js +23 -0
- package/dist/lib/models/remove-part-confirm.js.map +1 -0
- package/dist/lib/parts/artifact-part.component.js +2 -2
- package/dist/lib/parts/artifact-part.component.js.map +1 -1
- package/dist/lib/parts/query-part.component.js +2 -2
- package/dist/lib/parts/query-part.component.js.map +1 -1
- package/dist/lib/parts/view-part.component.js +2 -2
- package/dist/lib/parts/view-part.component.js.map +1 -1
- package/dist/lib/parts/weburl-part.component.js +2 -2
- package/dist/lib/parts/weburl-part.component.js.map +1 -1
- package/dist/lib/services/golden-layout-wrapper.service.d.ts +40 -0
- package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
- package/dist/lib/services/golden-layout-wrapper.service.js +117 -9
- package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
- package/dist/lib/services/stack-part-actions.d.ts +11 -0
- package/dist/lib/services/stack-part-actions.d.ts.map +1 -0
- package/dist/lib/services/stack-part-actions.js +41 -0
- package/dist/lib/services/stack-part-actions.js.map +1 -0
- package/dist/public-api.d.ts +9 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +13 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +13 -13
|
@@ -29,7 +29,7 @@ function ViewConfigPanelComponent_Conditional_10_Template(rf, ctx) { if (rf & 1)
|
|
|
29
29
|
} }
|
|
30
30
|
function ViewConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
31
31
|
i0.ɵɵelementStart(0, "span", 8);
|
|
32
|
-
i0.ɵɵelement(1, "i",
|
|
32
|
+
i0.ɵɵelement(1, "i", 34);
|
|
33
33
|
i0.ɵɵtext(2);
|
|
34
34
|
i0.ɵɵelementEnd();
|
|
35
35
|
} if (rf & 2) {
|
|
@@ -37,39 +37,60 @@ function ViewConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1)
|
|
|
37
37
|
i0.ɵɵadvance(2);
|
|
38
38
|
i0.ɵɵtextInterpolate1(" Selected: ", ctx_r1.viewName, " ");
|
|
39
39
|
} }
|
|
40
|
-
function
|
|
40
|
+
function ViewConfigPanelComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
42
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "label", 35);
|
|
43
|
+
i0.ɵɵelement(2, "i", 36);
|
|
44
|
+
i0.ɵɵtext(3, " Part Title ");
|
|
45
|
+
i0.ɵɵelementStart(4, "span", 4);
|
|
46
|
+
i0.ɵɵtext(5, "(optional)");
|
|
47
|
+
i0.ɵɵelementEnd()();
|
|
48
|
+
i0.ɵɵelementStart(6, "input", 37);
|
|
49
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_21_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.title, $event) || (ctx_r1.title = $event); return i0.ɵɵresetView($event); });
|
|
50
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_21_Template_input_input_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTitleChange()); });
|
|
51
|
+
i0.ɵɵelementEnd();
|
|
52
|
+
i0.ɵɵelementStart(7, "span", 7);
|
|
53
|
+
i0.ɵɵtext(8, "Leave empty to use view/entity name as title");
|
|
54
|
+
i0.ɵɵelementEnd()();
|
|
55
|
+
} if (rf & 2) {
|
|
56
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
57
|
+
i0.ɵɵadvance(6);
|
|
58
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.title);
|
|
59
|
+
i0.ɵɵproperty("placeholder", ctx_r1.viewName || ctx_r1.entityName ? "Default: " + (ctx_r1.viewName || ctx_r1.entityName) : "Enter a custom title");
|
|
60
|
+
} }
|
|
61
|
+
function ViewConfigPanelComponent_ng_template_23_Template(rf, ctx) { if (rf & 1) {
|
|
41
62
|
i0.ɵɵelement(0, "i", 38);
|
|
42
63
|
i0.ɵɵtext(1, " Display Options ");
|
|
43
64
|
} }
|
|
44
|
-
function
|
|
45
|
-
const
|
|
65
|
+
function ViewConfigPanelComponent_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
46
67
|
i0.ɵɵelementStart(0, "div", 2)(1, "label");
|
|
47
68
|
i0.ɵɵtext(2, "Map Style");
|
|
48
69
|
i0.ɵɵelementEnd();
|
|
49
|
-
i0.ɵɵelementStart(3, "div",
|
|
50
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
51
|
-
i0.ɵɵlistener("change", function
|
|
70
|
+
i0.ɵɵelementStart(3, "div", 15)(4, "label", 16)(5, "input", 39);
|
|
71
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_55_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.mapRenderMode, $event) || (ctx_r1.mapRenderMode = $event); return i0.ɵɵresetView($event); });
|
|
72
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_55_Template_input_change_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
52
73
|
i0.ɵɵelementEnd();
|
|
53
|
-
i0.ɵɵelement(6, "span",
|
|
54
|
-
i0.ɵɵelementStart(7, "span",
|
|
74
|
+
i0.ɵɵelement(6, "span", 18);
|
|
75
|
+
i0.ɵɵelementStart(7, "span", 19);
|
|
55
76
|
i0.ɵɵelement(8, "i", 40);
|
|
56
77
|
i0.ɵɵtext(9, " Points ");
|
|
57
78
|
i0.ɵɵelementEnd()();
|
|
58
|
-
i0.ɵɵelementStart(10, "label",
|
|
59
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
60
|
-
i0.ɵɵlistener("change", function
|
|
79
|
+
i0.ɵɵelementStart(10, "label", 16)(11, "input", 41);
|
|
80
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_55_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.mapRenderMode, $event) || (ctx_r1.mapRenderMode = $event); return i0.ɵɵresetView($event); });
|
|
81
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_55_Template_input_change_11_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
61
82
|
i0.ɵɵelementEnd();
|
|
62
|
-
i0.ɵɵelement(12, "span",
|
|
63
|
-
i0.ɵɵelementStart(13, "span",
|
|
83
|
+
i0.ɵɵelement(12, "span", 18);
|
|
84
|
+
i0.ɵɵelementStart(13, "span", 19);
|
|
64
85
|
i0.ɵɵelement(14, "i", 42);
|
|
65
86
|
i0.ɵɵtext(15, " Regions ");
|
|
66
87
|
i0.ɵɵelementEnd()();
|
|
67
|
-
i0.ɵɵelementStart(16, "label",
|
|
68
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
69
|
-
i0.ɵɵlistener("change", function
|
|
88
|
+
i0.ɵɵelementStart(16, "label", 16)(17, "input", 43);
|
|
89
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_55_Template_input_ngModelChange_17_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.mapRenderMode, $event) || (ctx_r1.mapRenderMode = $event); return i0.ɵɵresetView($event); });
|
|
90
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_55_Template_input_change_17_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
70
91
|
i0.ɵɵelementEnd();
|
|
71
|
-
i0.ɵɵelement(18, "span",
|
|
72
|
-
i0.ɵɵelementStart(19, "span",
|
|
92
|
+
i0.ɵɵelement(18, "span", 18);
|
|
93
|
+
i0.ɵɵelementStart(19, "span", 19);
|
|
73
94
|
i0.ɵɵelement(20, "i", 44);
|
|
74
95
|
i0.ɵɵtext(21, " Heatmap ");
|
|
75
96
|
i0.ɵɵelementEnd()()()();
|
|
@@ -88,14 +109,14 @@ function ViewConfigPanelComponent_Conditional_63_Template(rf, ctx) { if (rf & 1)
|
|
|
88
109
|
i0.ɵɵadvance();
|
|
89
110
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.mapRenderMode);
|
|
90
111
|
} }
|
|
91
|
-
function
|
|
92
|
-
const
|
|
112
|
+
function ViewConfigPanelComponent_Conditional_68_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
93
114
|
i0.ɵɵelementStart(0, "div", 2)(1, "label", 45);
|
|
94
115
|
i0.ɵɵtext(2, "Selection Mode");
|
|
95
116
|
i0.ɵɵelementEnd();
|
|
96
117
|
i0.ɵɵelementStart(3, "select", 46);
|
|
97
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
98
|
-
i0.ɵɵlistener("change", function
|
|
118
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_68_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.selectionMode, $event) || (ctx_r1.selectionMode = $event); return i0.ɵɵresetView($event); });
|
|
119
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Conditional_68_Template_select_change_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSelectionModeChange()); });
|
|
99
120
|
i0.ɵɵelementStart(4, "option", 47);
|
|
100
121
|
i0.ɵɵtext(5, "Single Selection");
|
|
101
122
|
i0.ɵɵelementEnd();
|
|
@@ -107,7 +128,7 @@ function ViewConfigPanelComponent_Conditional_76_Template(rf, ctx) { if (rf & 1)
|
|
|
107
128
|
i0.ɵɵadvance(3);
|
|
108
129
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.selectionMode);
|
|
109
130
|
} }
|
|
110
|
-
function
|
|
131
|
+
function ViewConfigPanelComponent_ng_template_70_Template(rf, ctx) { if (rf & 1) {
|
|
111
132
|
i0.ɵɵelement(0, "i", 49);
|
|
112
133
|
i0.ɵɵtext(1, " Advanced Filtering ");
|
|
113
134
|
} }
|
|
@@ -410,7 +431,7 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
410
431
|
} if (rf & 2) {
|
|
411
432
|
let _t;
|
|
412
433
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ViewDropdown = _t.first);
|
|
413
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
434
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 78, vars: 34, 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"], ["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"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], ["type", "text", "id", "partTitle", 1, "form-input", 3, "ngModelChange", "input", "ngModel", "placeholder"], [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) {
|
|
414
435
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
415
436
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "label");
|
|
416
437
|
i0.ɵɵelement(3, "i", 3);
|
|
@@ -438,95 +459,83 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
438
459
|
i0.ɵɵelementStart(19, "span", 7);
|
|
439
460
|
i0.ɵɵtext(20, " Use this to display all records from an entity without a saved view ");
|
|
440
461
|
i0.ɵɵelementEnd()();
|
|
441
|
-
i0.ɵɵ
|
|
442
|
-
i0.ɵɵ
|
|
443
|
-
i0.ɵɵ
|
|
444
|
-
i0.ɵɵ
|
|
445
|
-
i0.ɵɵ
|
|
446
|
-
i0.ɵɵ
|
|
447
|
-
i0.ɵɵelementStart(27, "input", 14);
|
|
448
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_27_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.title, $event) || (ctx.title = $event); return i0.ɵɵresetView($event); });
|
|
449
|
-
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Template_input_input_27_listener() { return ctx.onTitleChange(); });
|
|
462
|
+
i0.ɵɵconditionalCreate(21, ViewConfigPanelComponent_Conditional_21_Template, 9, 2, "div", 2);
|
|
463
|
+
i0.ɵɵelementStart(22, "mj-accordion-panel", 12);
|
|
464
|
+
i0.ɵɵtwoWayListener("ExpandedChange", function ViewConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_22_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showDisplayOptions, $event) || (ctx.showDisplayOptions = $event); return i0.ɵɵresetView($event); });
|
|
465
|
+
i0.ɵɵtemplate(23, ViewConfigPanelComponent_ng_template_23_Template, 2, 0, "ng-template", 13);
|
|
466
|
+
i0.ɵɵelementStart(24, "div", 14)(25, "div", 2)(26, "label");
|
|
467
|
+
i0.ɵɵtext(27, "Display Mode");
|
|
450
468
|
i0.ɵɵelementEnd();
|
|
451
|
-
i0.ɵɵelementStart(28, "
|
|
452
|
-
i0.ɵɵ
|
|
453
|
-
i0.ɵɵ
|
|
454
|
-
i0.ɵɵelementStart(30, "mj-accordion-panel", 15);
|
|
455
|
-
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); });
|
|
456
|
-
i0.ɵɵtemplate(31, ViewConfigPanelComponent_ng_template_31_Template, 2, 0, "ng-template", 16);
|
|
457
|
-
i0.ɵɵelementStart(32, "div", 17)(33, "div", 2)(34, "label");
|
|
458
|
-
i0.ɵɵtext(35, "Display Mode");
|
|
459
|
-
i0.ɵɵelementEnd();
|
|
460
|
-
i0.ɵɵelementStart(36, "div", 18)(37, "label", 19)(38, "input", 20);
|
|
461
|
-
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); });
|
|
462
|
-
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_38_listener() { return ctx.onDisplayModeChange(); });
|
|
469
|
+
i0.ɵɵelementStart(28, "div", 15)(29, "label", 16)(30, "input", 17);
|
|
470
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
471
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_30_listener() { return ctx.onDisplayModeChange(); });
|
|
463
472
|
i0.ɵɵelementEnd();
|
|
464
|
-
i0.ɵɵelement(
|
|
465
|
-
i0.ɵɵelementStart(
|
|
466
|
-
i0.ɵɵelement(
|
|
467
|
-
i0.ɵɵtext(
|
|
473
|
+
i0.ɵɵelement(31, "span", 18);
|
|
474
|
+
i0.ɵɵelementStart(32, "span", 19);
|
|
475
|
+
i0.ɵɵelement(33, "i", 20);
|
|
476
|
+
i0.ɵɵtext(34, " Grid ");
|
|
468
477
|
i0.ɵɵelementEnd()();
|
|
469
|
-
i0.ɵɵelementStart(
|
|
470
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
471
|
-
i0.ɵɵlistener("change", function
|
|
478
|
+
i0.ɵɵelementStart(35, "label", 16)(36, "input", 21);
|
|
479
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_36_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
480
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_36_listener() { return ctx.onDisplayModeChange(); });
|
|
472
481
|
i0.ɵɵelementEnd();
|
|
473
|
-
i0.ɵɵelement(
|
|
474
|
-
i0.ɵɵelementStart(
|
|
475
|
-
i0.ɵɵelement(
|
|
476
|
-
i0.ɵɵtext(
|
|
482
|
+
i0.ɵɵelement(37, "span", 18);
|
|
483
|
+
i0.ɵɵelementStart(38, "span", 19);
|
|
484
|
+
i0.ɵɵelement(39, "i", 22);
|
|
485
|
+
i0.ɵɵtext(40, " Cards ");
|
|
477
486
|
i0.ɵɵelementEnd()();
|
|
478
|
-
i0.ɵɵelementStart(
|
|
479
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
480
|
-
i0.ɵɵlistener("change", function
|
|
487
|
+
i0.ɵɵelementStart(41, "label", 16)(42, "input", 23);
|
|
488
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_42_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
489
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_42_listener() { return ctx.onDisplayModeChange(); });
|
|
481
490
|
i0.ɵɵelementEnd();
|
|
482
|
-
i0.ɵɵelement(
|
|
483
|
-
i0.ɵɵelementStart(
|
|
484
|
-
i0.ɵɵelement(
|
|
485
|
-
i0.ɵɵtext(
|
|
491
|
+
i0.ɵɵelement(43, "span", 18);
|
|
492
|
+
i0.ɵɵelementStart(44, "span", 19);
|
|
493
|
+
i0.ɵɵelement(45, "i", 24);
|
|
494
|
+
i0.ɵɵtext(46, " Timeline ");
|
|
486
495
|
i0.ɵɵelementEnd()();
|
|
487
|
-
i0.ɵɵelementStart(
|
|
488
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
489
|
-
i0.ɵɵlistener("change", function
|
|
496
|
+
i0.ɵɵelementStart(47, "label", 16)(48, "input", 25);
|
|
497
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_48_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.displayMode, $event) || (ctx.displayMode = $event); return i0.ɵɵresetView($event); });
|
|
498
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_48_listener() { return ctx.onDisplayModeChange(); });
|
|
490
499
|
i0.ɵɵelementEnd();
|
|
491
|
-
i0.ɵɵelement(
|
|
492
|
-
i0.ɵɵelementStart(
|
|
493
|
-
i0.ɵɵelement(
|
|
494
|
-
i0.ɵɵtext(
|
|
500
|
+
i0.ɵɵelement(49, "span", 18);
|
|
501
|
+
i0.ɵɵelementStart(50, "span", 19);
|
|
502
|
+
i0.ɵɵelement(51, "i", 26);
|
|
503
|
+
i0.ɵɵtext(52, " Map ");
|
|
495
504
|
i0.ɵɵelementEnd()()();
|
|
496
|
-
i0.ɵɵelementStart(
|
|
497
|
-
i0.ɵɵtext(
|
|
505
|
+
i0.ɵɵelementStart(53, "span", 7);
|
|
506
|
+
i0.ɵɵtext(54);
|
|
498
507
|
i0.ɵɵelementEnd()();
|
|
499
|
-
i0.ɵɵconditionalCreate(
|
|
500
|
-
i0.ɵɵelementStart(
|
|
501
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
502
|
-
i0.ɵɵlistener("change", function
|
|
508
|
+
i0.ɵɵconditionalCreate(55, ViewConfigPanelComponent_Conditional_55_Template, 22, 9, "div", 2);
|
|
509
|
+
i0.ɵɵelementStart(56, "div", 2)(57, "div", 27)(58, "label", 28)(59, "input", 29);
|
|
510
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_59_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.allowModeSwitch, $event) || (ctx.allowModeSwitch = $event); return i0.ɵɵresetView($event); });
|
|
511
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_59_listener() { return ctx.onOptionChange(); });
|
|
503
512
|
i0.ɵɵelementEnd();
|
|
504
|
-
i0.ɵɵelement(
|
|
505
|
-
i0.ɵɵelementStart(
|
|
506
|
-
i0.ɵɵtext(
|
|
513
|
+
i0.ɵɵelement(60, "span", 30);
|
|
514
|
+
i0.ɵɵelementStart(61, "span", 31);
|
|
515
|
+
i0.ɵɵtext(62, "Allow Mode Switch");
|
|
507
516
|
i0.ɵɵelementEnd()();
|
|
508
|
-
i0.ɵɵelementStart(
|
|
509
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
510
|
-
i0.ɵɵlistener("change", function
|
|
517
|
+
i0.ɵɵelementStart(63, "label", 28)(64, "input", 29);
|
|
518
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_64_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.enableSelection, $event) || (ctx.enableSelection = $event); return i0.ɵɵresetView($event); });
|
|
519
|
+
i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_64_listener() { return ctx.onOptionChange(); });
|
|
511
520
|
i0.ɵɵelementEnd();
|
|
512
|
-
i0.ɵɵelement(
|
|
513
|
-
i0.ɵɵelementStart(
|
|
514
|
-
i0.ɵɵtext(
|
|
521
|
+
i0.ɵɵelement(65, "span", 30);
|
|
522
|
+
i0.ɵɵelementStart(66, "span", 31);
|
|
523
|
+
i0.ɵɵtext(67, "Enable Selection");
|
|
515
524
|
i0.ɵɵelementEnd()()()();
|
|
516
|
-
i0.ɵɵconditionalCreate(
|
|
525
|
+
i0.ɵɵconditionalCreate(68, ViewConfigPanelComponent_Conditional_68_Template, 8, 1, "div", 2);
|
|
517
526
|
i0.ɵɵelementEnd()();
|
|
518
|
-
i0.ɵɵelementStart(
|
|
519
|
-
i0.ɵɵtwoWayListener("ExpandedChange", function
|
|
520
|
-
i0.ɵɵtemplate(
|
|
521
|
-
i0.ɵɵelementStart(
|
|
522
|
-
i0.ɵɵtext(
|
|
527
|
+
i0.ɵɵelementStart(69, "mj-accordion-panel", 12);
|
|
528
|
+
i0.ɵɵtwoWayListener("ExpandedChange", function ViewConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_69_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showAdvancedOptions, $event) || (ctx.showAdvancedOptions = $event); return i0.ɵɵresetView($event); });
|
|
529
|
+
i0.ɵɵtemplate(70, ViewConfigPanelComponent_ng_template_70_Template, 2, 0, "ng-template", 13);
|
|
530
|
+
i0.ɵɵelementStart(71, "div", 14)(72, "div", 2)(73, "label", 32);
|
|
531
|
+
i0.ɵɵtext(74, " Extra Filter ");
|
|
523
532
|
i0.ɵɵelementEnd();
|
|
524
|
-
i0.ɵɵelementStart(
|
|
525
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
526
|
-
i0.ɵɵlistener("input", function
|
|
533
|
+
i0.ɵɵelementStart(75, "input", 33);
|
|
534
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Template_input_ngModelChange_75_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.extraFilter, $event) || (ctx.extraFilter = $event); return i0.ɵɵresetView($event); });
|
|
535
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Template_input_input_75_listener() { return ctx.onFilterChange(); });
|
|
527
536
|
i0.ɵɵelementEnd();
|
|
528
|
-
i0.ɵɵelementStart(
|
|
529
|
-
i0.ɵɵtext(
|
|
537
|
+
i0.ɵɵelementStart(76, "span", 7);
|
|
538
|
+
i0.ɵɵtext(77, " SQL WHERE clause to filter records (applied in addition to view filters) ");
|
|
530
539
|
i0.ɵɵelementEnd()()()()();
|
|
531
540
|
} if (rf & 2) {
|
|
532
541
|
i0.ɵɵadvance(7);
|
|
@@ -540,10 +549,9 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
540
549
|
i0.ɵɵconditional(!ctx.viewError && ctx.viewId ? 11 : -1);
|
|
541
550
|
i0.ɵɵadvance(7);
|
|
542
551
|
i0.ɵɵtwoWayProperty("ngModel", ctx.entityName);
|
|
543
|
-
i0.ɵɵadvance(9);
|
|
544
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.title);
|
|
545
|
-
i0.ɵɵproperty("placeholder", ctx.viewName || ctx.entityName ? "Default: " + (ctx.viewName || ctx.entityName) : "Enter a custom title");
|
|
546
552
|
i0.ɵɵadvance(3);
|
|
553
|
+
i0.ɵɵconditional(ctx.ShowCommonFields ? 21 : -1);
|
|
554
|
+
i0.ɵɵadvance();
|
|
547
555
|
i0.ɵɵtwoWayProperty("Expanded", ctx.showDisplayOptions);
|
|
548
556
|
i0.ɵɵadvance(7);
|
|
549
557
|
i0.ɵɵclassProp("selected", ctx.displayMode === "grid");
|
|
@@ -564,13 +572,13 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
|
|
|
564
572
|
i0.ɵɵadvance(6);
|
|
565
573
|
i0.ɵɵtextInterpolate(ctx.getDisplayModeDescription());
|
|
566
574
|
i0.ɵɵadvance();
|
|
567
|
-
i0.ɵɵconditional(ctx.displayMode === "map" ?
|
|
575
|
+
i0.ɵɵconditional(ctx.displayMode === "map" ? 55 : -1);
|
|
568
576
|
i0.ɵɵadvance(4);
|
|
569
577
|
i0.ɵɵtwoWayProperty("ngModel", ctx.allowModeSwitch);
|
|
570
578
|
i0.ɵɵadvance(5);
|
|
571
579
|
i0.ɵɵtwoWayProperty("ngModel", ctx.enableSelection);
|
|
572
580
|
i0.ɵɵadvance(4);
|
|
573
|
-
i0.ɵɵconditional(ctx.enableSelection ?
|
|
581
|
+
i0.ɵɵconditional(ctx.enableSelection ? 68 : -1);
|
|
574
582
|
i0.ɵɵadvance();
|
|
575
583
|
i0.ɵɵtwoWayProperty("Expanded", ctx.showAdvancedOptions);
|
|
576
584
|
i0.ɵɵadvance(6);
|
|
@@ -583,7 +591,7 @@ ViewConfigPanelComponent = __decorate([
|
|
|
583
591
|
export { ViewConfigPanelComponent };
|
|
584
592
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewConfigPanelComponent, [{
|
|
585
593
|
type: Component,
|
|
586
|
-
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"] }]
|
|
594
|
+
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 @if (ShowCommonFields) {\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\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"] }]
|
|
587
595
|
}], () => [{ type: i0.ChangeDetectorRef }], { ViewDropdown: [{
|
|
588
596
|
type: ViewChild,
|
|
589
597
|
args: ['viewDropdown']
|