@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.
Files changed (99) hide show
  1. package/README.md +165 -17
  2. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +3 -4
  3. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
  4. package/dist/lib/config-dialogs/confirm-dialog.component.js +3 -2
  5. package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
  6. package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
  7. package/dist/lib/config-panels/artifact-config-panel.component.js +59 -50
  8. package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
  9. package/dist/lib/config-panels/base-config-panel.d.ts +8 -3
  10. package/dist/lib/config-panels/base-config-panel.d.ts.map +1 -1
  11. package/dist/lib/config-panels/base-config-panel.js +10 -3
  12. package/dist/lib/config-panels/base-config-panel.js.map +1 -1
  13. package/dist/lib/config-panels/query-config-panel.component.js +124 -99
  14. package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
  15. package/dist/lib/config-panels/view-config-panel.component.js +111 -103
  16. package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
  17. package/dist/lib/config-panels/weburl-config-panel.component.js +89 -80
  18. package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
  19. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts +79 -28
  20. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
  21. package/dist/lib/dashboard-browser/dashboard-browser.component.js +446 -447
  22. package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
  23. package/dist/lib/dashboard-card/dashboard-card.component.d.ts +69 -0
  24. package/dist/lib/dashboard-card/dashboard-card.component.d.ts.map +1 -0
  25. package/dist/lib/dashboard-card/dashboard-card.component.js +281 -0
  26. package/dist/lib/dashboard-card/dashboard-card.component.js.map +1 -0
  27. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts +18 -0
  28. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts.map +1 -0
  29. package/dist/lib/dashboard-card/dashboard-card.helpers.js +43 -0
  30. package/dist/lib/dashboard-card/dashboard-card.helpers.js.map +1 -0
  31. package/dist/lib/dashboard-card/layout-preview-cache.d.ts +15 -0
  32. package/dist/lib/dashboard-card/layout-preview-cache.d.ts.map +1 -0
  33. package/dist/lib/dashboard-card/layout-preview-cache.js +22 -0
  34. package/dist/lib/dashboard-card/layout-preview-cache.js.map +1 -0
  35. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +69 -12
  36. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
  37. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +173 -145
  38. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
  39. package/dist/lib/dashboard-viewer.module.d.ts +24 -20
  40. package/dist/lib/dashboard-viewer.module.d.ts.map +1 -1
  41. package/dist/lib/dashboard-viewer.module.js +42 -5
  42. package/dist/lib/dashboard-viewer.module.js.map +1 -1
  43. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +7 -12
  44. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
  45. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +3 -1
  46. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
  47. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts +54 -0
  48. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts.map +1 -0
  49. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js +156 -0
  50. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js.map +1 -0
  51. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +5 -11
  52. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
  53. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +3 -1
  54. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
  55. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts +147 -0
  56. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts.map +1 -0
  57. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js +536 -0
  58. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js.map +1 -0
  59. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts +20 -0
  60. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts.map +1 -0
  61. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js +80 -0
  62. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js.map +1 -0
  63. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts +28 -0
  64. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts.map +1 -0
  65. package/dist/lib/layout-preview/dashboard-layout-preview.component.js +62 -0
  66. package/dist/lib/layout-preview/dashboard-layout-preview.component.js.map +1 -0
  67. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts +33 -0
  68. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts.map +1 -0
  69. package/dist/lib/layout-preview/dashboard-layout-preview.js +138 -0
  70. package/dist/lib/layout-preview/dashboard-layout-preview.js.map +1 -0
  71. package/dist/lib/models/dashboard-layout-editor.d.ts +78 -0
  72. package/dist/lib/models/dashboard-layout-editor.d.ts.map +1 -0
  73. package/dist/lib/models/dashboard-layout-editor.js +374 -0
  74. package/dist/lib/models/dashboard-layout-editor.js.map +1 -0
  75. package/dist/lib/models/remove-part-confirm.d.ts +8 -0
  76. package/dist/lib/models/remove-part-confirm.d.ts.map +1 -0
  77. package/dist/lib/models/remove-part-confirm.js +23 -0
  78. package/dist/lib/models/remove-part-confirm.js.map +1 -0
  79. package/dist/lib/parts/artifact-part.component.js +2 -2
  80. package/dist/lib/parts/artifact-part.component.js.map +1 -1
  81. package/dist/lib/parts/query-part.component.js +2 -2
  82. package/dist/lib/parts/query-part.component.js.map +1 -1
  83. package/dist/lib/parts/view-part.component.js +2 -2
  84. package/dist/lib/parts/view-part.component.js.map +1 -1
  85. package/dist/lib/parts/weburl-part.component.js +2 -2
  86. package/dist/lib/parts/weburl-part.component.js.map +1 -1
  87. package/dist/lib/services/golden-layout-wrapper.service.d.ts +40 -0
  88. package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
  89. package/dist/lib/services/golden-layout-wrapper.service.js +117 -9
  90. package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
  91. package/dist/lib/services/stack-part-actions.d.ts +11 -0
  92. package/dist/lib/services/stack-part-actions.d.ts.map +1 -0
  93. package/dist/lib/services/stack-part-actions.js +41 -0
  94. package/dist/lib/services/stack-part-actions.js.map +1 -0
  95. package/dist/public-api.d.ts +9 -0
  96. package/dist/public-api.d.ts.map +1 -1
  97. package/dist/public-api.js +13 -0
  98. package/dist/public-api.js.map +1 -1
  99. 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", 37);
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 ViewConfigPanelComponent_ng_template_31_Template(rf, ctx) { if (rf & 1) {
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 ViewConfigPanelComponent_Conditional_63_Template(rf, ctx) { if (rf & 1) {
45
- const _r3 = i0.ɵɵgetCurrentView();
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", 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()); });
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", 21);
54
- i0.ɵɵelementStart(7, "span", 22);
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", 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()); });
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", 21);
63
- i0.ɵɵelementStart(13, "span", 22);
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", 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()); });
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", 21);
72
- i0.ɵɵelementStart(19, "span", 22);
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 ViewConfigPanelComponent_Conditional_76_Template(rf, ctx) { if (rf & 1) {
92
- const _r4 = i0.ɵɵgetCurrentView();
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 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()); });
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 ViewConfigPanelComponent_ng_template_78_Template(rf, ctx) { if (rf & 1) {
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: 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) {
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.ɵɵelementStart(21, "div", 2)(22, "label", 12);
442
- i0.ɵɵelement(23, "i", 13);
443
- i0.ɵɵtext(24, " Part Title ");
444
- i0.ɵɵelementStart(25, "span", 4);
445
- i0.ɵɵtext(26, "(optional)");
446
- i0.ɵɵelementEnd()();
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, "span", 7);
452
- i0.ɵɵtext(29, "Leave empty to use view/entity name as title");
453
- i0.ɵɵelementEnd()();
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(39, "span", 21);
465
- i0.ɵɵelementStart(40, "span", 22);
466
- i0.ɵɵelement(41, "i", 23);
467
- i0.ɵɵtext(42, " Grid ");
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(43, "label", 19)(44, "input", 24);
470
- 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); });
471
- i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_44_listener() { return ctx.onDisplayModeChange(); });
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(45, "span", 21);
474
- i0.ɵɵelementStart(46, "span", 22);
475
- i0.ɵɵelement(47, "i", 25);
476
- i0.ɵɵtext(48, " Cards ");
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(49, "label", 19)(50, "input", 26);
479
- 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); });
480
- i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_50_listener() { return ctx.onDisplayModeChange(); });
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(51, "span", 21);
483
- i0.ɵɵelementStart(52, "span", 22);
484
- i0.ɵɵelement(53, "i", 27);
485
- i0.ɵɵtext(54, " Timeline ");
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(55, "label", 19)(56, "input", 28);
488
- 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); });
489
- i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_56_listener() { return ctx.onDisplayModeChange(); });
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(57, "span", 21);
492
- i0.ɵɵelementStart(58, "span", 22);
493
- i0.ɵɵelement(59, "i", 29);
494
- i0.ɵɵtext(60, " Map ");
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(61, "span", 7);
497
- i0.ɵɵtext(62);
505
+ i0.ɵɵelementStart(53, "span", 7);
506
+ i0.ɵɵtext(54);
498
507
  i0.ɵɵelementEnd()();
499
- i0.ɵɵconditionalCreate(63, ViewConfigPanelComponent_Conditional_63_Template, 22, 9, "div", 2);
500
- i0.ɵɵelementStart(64, "div", 2)(65, "div", 30)(66, "label", 31)(67, "input", 32);
501
- 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); });
502
- i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_67_listener() { return ctx.onOptionChange(); });
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(68, "span", 33);
505
- i0.ɵɵelementStart(69, "span", 34);
506
- i0.ɵɵtext(70, "Allow Mode Switch");
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(71, "label", 31)(72, "input", 32);
509
- 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); });
510
- i0.ɵɵlistener("change", function ViewConfigPanelComponent_Template_input_change_72_listener() { return ctx.onOptionChange(); });
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(73, "span", 33);
513
- i0.ɵɵelementStart(74, "span", 34);
514
- i0.ɵɵtext(75, "Enable Selection");
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(76, ViewConfigPanelComponent_Conditional_76_Template, 8, 1, "div", 2);
525
+ i0.ɵɵconditionalCreate(68, ViewConfigPanelComponent_Conditional_68_Template, 8, 1, "div", 2);
517
526
  i0.ɵɵelementEnd()();
518
- i0.ɵɵelementStart(77, "mj-accordion-panel", 15);
519
- 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); });
520
- i0.ɵɵtemplate(78, ViewConfigPanelComponent_ng_template_78_Template, 2, 0, "ng-template", 16);
521
- i0.ɵɵelementStart(79, "div", 17)(80, "div", 2)(81, "label", 35);
522
- i0.ɵɵtext(82, " Extra Filter ");
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(83, "input", 36);
525
- 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); });
526
- i0.ɵɵlistener("input", function ViewConfigPanelComponent_Template_input_input_83_listener() { return ctx.onFilterChange(); });
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(84, "span", 7);
529
- i0.ɵɵtext(85, " SQL WHERE clause to filter records (applied in addition to view filters) ");
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" ? 63 : -1);
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 ? 76 : -1);
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']