@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 QueryConfigPanelComponent_Conditional_10_Template(rf, ctx) { if (rf & 1
|
|
|
29
29
|
} }
|
|
30
30
|
function QueryConfigPanelComponent_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", 27);
|
|
33
33
|
i0.ɵɵtext(2);
|
|
34
34
|
i0.ɵɵelementEnd();
|
|
35
35
|
} if (rf & 2) {
|
|
@@ -37,10 +37,85 @@ function QueryConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1
|
|
|
37
37
|
i0.ɵɵadvance(2);
|
|
38
38
|
i0.ɵɵtextInterpolate1(" Selected: ", ctx_r1.queryName, " ");
|
|
39
39
|
} }
|
|
40
|
-
function
|
|
41
|
-
i0.ɵɵ
|
|
40
|
+
function QueryConfigPanelComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
42
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "label", 28);
|
|
43
|
+
i0.ɵɵelement(2, "i", 29);
|
|
44
|
+
i0.ɵɵtext(3, " Part Title ");
|
|
45
|
+
i0.ɵɵelementStart(4, "span", 30);
|
|
46
|
+
i0.ɵɵtext(5, "(optional)");
|
|
47
|
+
i0.ɵɵelementEnd()();
|
|
48
|
+
i0.ɵɵelementStart(6, "input", 31);
|
|
49
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Conditional_12_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 QueryConfigPanelComponent_Conditional_12_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 query 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.queryName ? "Default: " + ctx_r1.queryName : "Enter a custom title");
|
|
60
|
+
} }
|
|
61
|
+
function QueryConfigPanelComponent_ng_template_14_Template(rf, ctx) { if (rf & 1) {
|
|
62
|
+
i0.ɵɵelement(0, "i", 32);
|
|
42
63
|
i0.ɵɵtext(1, " Display Options ");
|
|
43
64
|
} }
|
|
65
|
+
function QueryConfigPanelComponent_Conditional_40_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
67
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "label", 33);
|
|
68
|
+
i0.ɵɵelement(2, "i", 34);
|
|
69
|
+
i0.ɵɵtext(3, " Auto Refresh ");
|
|
70
|
+
i0.ɵɵelementEnd();
|
|
71
|
+
i0.ɵɵelementStart(4, "select", 35);
|
|
72
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Conditional_40_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.autoRefreshSeconds, $event) || (ctx_r1.autoRefreshSeconds = $event); return i0.ɵɵresetView($event); });
|
|
73
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Conditional_40_Template_select_change_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAutoRefreshChange()); });
|
|
74
|
+
i0.ɵɵelementStart(5, "option", 36);
|
|
75
|
+
i0.ɵɵtext(6, "Disabled");
|
|
76
|
+
i0.ɵɵelementEnd();
|
|
77
|
+
i0.ɵɵelementStart(7, "option", 36);
|
|
78
|
+
i0.ɵɵtext(8, "Every 30 seconds");
|
|
79
|
+
i0.ɵɵelementEnd();
|
|
80
|
+
i0.ɵɵelementStart(9, "option", 36);
|
|
81
|
+
i0.ɵɵtext(10, "Every minute");
|
|
82
|
+
i0.ɵɵelementEnd();
|
|
83
|
+
i0.ɵɵelementStart(11, "option", 36);
|
|
84
|
+
i0.ɵɵtext(12, "Every 5 minutes");
|
|
85
|
+
i0.ɵɵelementEnd();
|
|
86
|
+
i0.ɵɵelementStart(13, "option", 36);
|
|
87
|
+
i0.ɵɵtext(14, "Every 10 minutes");
|
|
88
|
+
i0.ɵɵelementEnd()()();
|
|
89
|
+
} if (rf & 2) {
|
|
90
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
91
|
+
i0.ɵɵadvance(4);
|
|
92
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.autoRefreshSeconds);
|
|
93
|
+
i0.ɵɵadvance();
|
|
94
|
+
i0.ɵɵproperty("ngValue", 0);
|
|
95
|
+
i0.ɵɵadvance(2);
|
|
96
|
+
i0.ɵɵproperty("ngValue", 30);
|
|
97
|
+
i0.ɵɵadvance(2);
|
|
98
|
+
i0.ɵɵproperty("ngValue", 60);
|
|
99
|
+
i0.ɵɵadvance(2);
|
|
100
|
+
i0.ɵɵproperty("ngValue", 300);
|
|
101
|
+
i0.ɵɵadvance(2);
|
|
102
|
+
i0.ɵɵproperty("ngValue", 600);
|
|
103
|
+
} }
|
|
104
|
+
function QueryConfigPanelComponent_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
106
|
+
i0.ɵɵelementStart(0, "label", 23)(1, "input", 24);
|
|
107
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Conditional_43_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.showParameterControls, $event) || (ctx_r1.showParameterControls = $event); return i0.ɵɵresetView($event); });
|
|
108
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Conditional_43_Template_input_change_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
109
|
+
i0.ɵɵelementEnd();
|
|
110
|
+
i0.ɵɵelement(2, "span", 25);
|
|
111
|
+
i0.ɵɵelementStart(3, "span", 26);
|
|
112
|
+
i0.ɵɵtext(4, "Show Parameter Controls");
|
|
113
|
+
i0.ɵɵelementEnd()();
|
|
114
|
+
} if (rf & 2) {
|
|
115
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
116
|
+
i0.ɵɵadvance();
|
|
117
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.showParameterControls);
|
|
118
|
+
} }
|
|
44
119
|
/**
|
|
45
120
|
* Configuration panel for Query parts.
|
|
46
121
|
* Uses tree dropdown for category-based query selection.
|
|
@@ -293,7 +368,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
293
368
|
} if (rf & 2) {
|
|
294
369
|
let _t;
|
|
295
370
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.QueryDropdown = _t.first);
|
|
296
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
371
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 49, vars: 27, consts: [["queryDropdown", ""], [1, "config-panel", "config-panel--compact"], [1, "form-group"], [1, "fa-solid", "fa-flask"], [1, "required"], [3, "SelectionChange", "BranchConfig", "LeafConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch"], [1, "form-error"], [1, "form-hint"], [1, "form-hint", "form-hint--selected"], ["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", "parameterLayout", "value", "header", 3, "ngModelChange", "change", "ngModel"], [1, "radio-mark"], [1, "radio-label"], [1, "fa-solid", "fa-arrow-up-from-bracket"], ["type", "radio", "name", "parameterLayout", "value", "sidebar", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-table-columns"], ["type", "radio", "name", "parameterLayout", "value", "dialog", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-window-restore"], [1, "checkbox-group", "checkbox-group--compact"], [1, "checkbox-option", "checkbox-option--compact"], ["type", "checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "checkbox-mark"], [1, "checkbox-label"], [1, "fa-solid", "fa-check"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], [1, "optional-tag"], ["type", "text", "id", "partTitle", 1, "form-input", 3, "ngModelChange", "input", "ngModel", "placeholder"], [1, "fa-solid", "fa-sliders"], ["for", "autoRefresh"], [1, "fa-solid", "fa-rotate"], [1, "form-select", 3, "ngModelChange", "change", "ngModel"], [3, "ngValue"]], template: function QueryConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
297
372
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
298
373
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "label");
|
|
299
374
|
i0.ɵɵelement(3, "i", 3);
|
|
@@ -308,92 +383,53 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
308
383
|
i0.ɵɵconditionalCreate(10, QueryConfigPanelComponent_Conditional_10_Template, 2, 0, "span", 7);
|
|
309
384
|
i0.ɵɵconditionalCreate(11, QueryConfigPanelComponent_Conditional_11_Template, 3, 1, "span", 8);
|
|
310
385
|
i0.ɵɵelementEnd();
|
|
311
|
-
i0.ɵɵ
|
|
312
|
-
i0.ɵɵ
|
|
313
|
-
i0.ɵɵ
|
|
314
|
-
i0.ɵɵ
|
|
315
|
-
i0.ɵɵ
|
|
316
|
-
i0.ɵɵ
|
|
317
|
-
i0.ɵɵelementStart(18, "input", 12);
|
|
318
|
-
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.title, $event) || (ctx.title = $event); return i0.ɵɵresetView($event); });
|
|
319
|
-
i0.ɵɵlistener("input", function QueryConfigPanelComponent_Template_input_input_18_listener() { return ctx.onTitleChange(); });
|
|
320
|
-
i0.ɵɵelementEnd();
|
|
321
|
-
i0.ɵɵelementStart(19, "span", 7);
|
|
322
|
-
i0.ɵɵtext(20, "Leave empty to use query name as title");
|
|
323
|
-
i0.ɵɵelementEnd()();
|
|
324
|
-
i0.ɵɵelementStart(21, "mj-accordion-panel", 13);
|
|
325
|
-
i0.ɵɵtwoWayListener("ExpandedChange", function QueryConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_21_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showAdvancedOptions, $event) || (ctx.showAdvancedOptions = $event); return i0.ɵɵresetView($event); });
|
|
326
|
-
i0.ɵɵtemplate(22, QueryConfigPanelComponent_ng_template_22_Template, 2, 0, "ng-template", 14);
|
|
327
|
-
i0.ɵɵelementStart(23, "div", 15)(24, "div", 2)(25, "label");
|
|
328
|
-
i0.ɵɵtext(26, "Parameter Layout");
|
|
386
|
+
i0.ɵɵconditionalCreate(12, QueryConfigPanelComponent_Conditional_12_Template, 9, 2, "div", 2);
|
|
387
|
+
i0.ɵɵelementStart(13, "mj-accordion-panel", 9);
|
|
388
|
+
i0.ɵɵtwoWayListener("ExpandedChange", function QueryConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_13_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showAdvancedOptions, $event) || (ctx.showAdvancedOptions = $event); return i0.ɵɵresetView($event); });
|
|
389
|
+
i0.ɵɵtemplate(14, QueryConfigPanelComponent_ng_template_14_Template, 2, 0, "ng-template", 10);
|
|
390
|
+
i0.ɵɵelementStart(15, "div", 11)(16, "div", 2)(17, "label");
|
|
391
|
+
i0.ɵɵtext(18, "Parameter Layout");
|
|
329
392
|
i0.ɵɵelementEnd();
|
|
330
|
-
i0.ɵɵelementStart(
|
|
331
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
332
|
-
i0.ɵɵlistener("change", function
|
|
393
|
+
i0.ɵɵelementStart(19, "div", 12)(20, "label", 13)(21, "input", 14);
|
|
394
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.parameterLayout, $event) || (ctx.parameterLayout = $event); return i0.ɵɵresetView($event); });
|
|
395
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_21_listener() { return ctx.onParameterLayoutChange(); });
|
|
333
396
|
i0.ɵɵelementEnd();
|
|
334
|
-
i0.ɵɵelement(
|
|
335
|
-
i0.ɵɵelementStart(
|
|
336
|
-
i0.ɵɵelement(
|
|
337
|
-
i0.ɵɵtext(
|
|
397
|
+
i0.ɵɵelement(22, "span", 15);
|
|
398
|
+
i0.ɵɵelementStart(23, "span", 16);
|
|
399
|
+
i0.ɵɵelement(24, "i", 17);
|
|
400
|
+
i0.ɵɵtext(25, " Header ");
|
|
338
401
|
i0.ɵɵelementEnd()();
|
|
339
|
-
i0.ɵɵelementStart(
|
|
340
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
341
|
-
i0.ɵɵlistener("change", function
|
|
402
|
+
i0.ɵɵelementStart(26, "label", 13)(27, "input", 18);
|
|
403
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_27_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.parameterLayout, $event) || (ctx.parameterLayout = $event); return i0.ɵɵresetView($event); });
|
|
404
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_27_listener() { return ctx.onParameterLayoutChange(); });
|
|
342
405
|
i0.ɵɵelementEnd();
|
|
343
|
-
i0.ɵɵelement(
|
|
344
|
-
i0.ɵɵelementStart(
|
|
345
|
-
i0.ɵɵelement(
|
|
346
|
-
i0.ɵɵtext(
|
|
406
|
+
i0.ɵɵelement(28, "span", 15);
|
|
407
|
+
i0.ɵɵelementStart(29, "span", 16);
|
|
408
|
+
i0.ɵɵelement(30, "i", 19);
|
|
409
|
+
i0.ɵɵtext(31, " Sidebar ");
|
|
347
410
|
i0.ɵɵelementEnd()();
|
|
348
|
-
i0.ɵɵelementStart(
|
|
349
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
350
|
-
i0.ɵɵlistener("change", function
|
|
411
|
+
i0.ɵɵelementStart(32, "label", 13)(33, "input", 20);
|
|
412
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.parameterLayout, $event) || (ctx.parameterLayout = $event); return i0.ɵɵresetView($event); });
|
|
413
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_33_listener() { return ctx.onParameterLayoutChange(); });
|
|
351
414
|
i0.ɵɵelementEnd();
|
|
352
|
-
i0.ɵɵelement(
|
|
353
|
-
i0.ɵɵelementStart(
|
|
354
|
-
i0.ɵɵelement(
|
|
355
|
-
i0.ɵɵtext(
|
|
415
|
+
i0.ɵɵelement(34, "span", 15);
|
|
416
|
+
i0.ɵɵelementStart(35, "span", 16);
|
|
417
|
+
i0.ɵɵelement(36, "i", 21);
|
|
418
|
+
i0.ɵɵtext(37, " Dialog ");
|
|
356
419
|
i0.ɵɵelementEnd()()();
|
|
357
|
-
i0.ɵɵelementStart(
|
|
358
|
-
i0.ɵɵtext(
|
|
359
|
-
i0.ɵɵelementEnd()();
|
|
360
|
-
i0.ɵɵelementStart(48, "div", 2)(49, "label", 26);
|
|
361
|
-
i0.ɵɵelement(50, "i", 27);
|
|
362
|
-
i0.ɵɵtext(51, " Auto Refresh ");
|
|
363
|
-
i0.ɵɵelementEnd();
|
|
364
|
-
i0.ɵɵelementStart(52, "select", 28);
|
|
365
|
-
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_select_ngModelChange_52_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.autoRefreshSeconds, $event) || (ctx.autoRefreshSeconds = $event); return i0.ɵɵresetView($event); });
|
|
366
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_select_change_52_listener() { return ctx.onAutoRefreshChange(); });
|
|
367
|
-
i0.ɵɵelementStart(53, "option", 29);
|
|
368
|
-
i0.ɵɵtext(54, "Disabled");
|
|
369
|
-
i0.ɵɵelementEnd();
|
|
370
|
-
i0.ɵɵelementStart(55, "option", 29);
|
|
371
|
-
i0.ɵɵtext(56, "Every 30 seconds");
|
|
372
|
-
i0.ɵɵelementEnd();
|
|
373
|
-
i0.ɵɵelementStart(57, "option", 29);
|
|
374
|
-
i0.ɵɵtext(58, "Every minute");
|
|
375
|
-
i0.ɵɵelementEnd();
|
|
376
|
-
i0.ɵɵelementStart(59, "option", 29);
|
|
377
|
-
i0.ɵɵtext(60, "Every 5 minutes");
|
|
378
|
-
i0.ɵɵelementEnd();
|
|
379
|
-
i0.ɵɵelementStart(61, "option", 29);
|
|
380
|
-
i0.ɵɵtext(62, "Every 10 minutes");
|
|
381
|
-
i0.ɵɵelementEnd()()();
|
|
382
|
-
i0.ɵɵelementStart(63, "div", 2)(64, "div", 30)(65, "label", 31)(66, "input", 32);
|
|
383
|
-
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_66_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showParameterControls, $event) || (ctx.showParameterControls = $event); return i0.ɵɵresetView($event); });
|
|
384
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_66_listener() { return ctx.onOptionChange(); });
|
|
385
|
-
i0.ɵɵelementEnd();
|
|
386
|
-
i0.ɵɵelement(67, "span", 33);
|
|
387
|
-
i0.ɵɵelementStart(68, "span", 34);
|
|
388
|
-
i0.ɵɵtext(69, "Show Parameter Controls");
|
|
420
|
+
i0.ɵɵelementStart(38, "span", 7);
|
|
421
|
+
i0.ɵɵtext(39);
|
|
389
422
|
i0.ɵɵelementEnd()();
|
|
390
|
-
i0.ɵɵ
|
|
391
|
-
i0.ɵɵ
|
|
392
|
-
i0.ɵɵ
|
|
423
|
+
i0.ɵɵconditionalCreate(40, QueryConfigPanelComponent_Conditional_40_Template, 15, 6, "div", 2);
|
|
424
|
+
i0.ɵɵelementStart(41, "div", 2)(42, "div", 22);
|
|
425
|
+
i0.ɵɵconditionalCreate(43, QueryConfigPanelComponent_Conditional_43_Template, 5, 1, "label", 23);
|
|
426
|
+
i0.ɵɵelementStart(44, "label", 23)(45, "input", 24);
|
|
427
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_45_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showExecutionMetadata, $event) || (ctx.showExecutionMetadata = $event); return i0.ɵɵresetView($event); });
|
|
428
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_45_listener() { return ctx.onOptionChange(); });
|
|
393
429
|
i0.ɵɵelementEnd();
|
|
394
|
-
i0.ɵɵelement(
|
|
395
|
-
i0.ɵɵelementStart(
|
|
396
|
-
i0.ɵɵtext(
|
|
430
|
+
i0.ɵɵelement(46, "span", 25);
|
|
431
|
+
i0.ɵɵelementStart(47, "span", 26);
|
|
432
|
+
i0.ɵɵtext(48, "Show Execution Metadata");
|
|
397
433
|
i0.ɵɵelementEnd()()()()()()();
|
|
398
434
|
} if (rf & 2) {
|
|
399
435
|
i0.ɵɵadvance(7);
|
|
@@ -405,10 +441,9 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
405
441
|
i0.ɵɵconditional(!ctx.queryError && !ctx.queryId ? 10 : -1);
|
|
406
442
|
i0.ɵɵadvance();
|
|
407
443
|
i0.ɵɵconditional(!ctx.queryError && ctx.queryId ? 11 : -1);
|
|
408
|
-
i0.ɵɵadvance(
|
|
409
|
-
i0.ɵɵ
|
|
410
|
-
i0.ɵɵ
|
|
411
|
-
i0.ɵɵadvance(3);
|
|
444
|
+
i0.ɵɵadvance();
|
|
445
|
+
i0.ɵɵconditional(ctx.ShowCommonFields ? 12 : -1);
|
|
446
|
+
i0.ɵɵadvance();
|
|
412
447
|
i0.ɵɵtwoWayProperty("Expanded", ctx.showAdvancedOptions);
|
|
413
448
|
i0.ɵɵadvance(7);
|
|
414
449
|
i0.ɵɵclassProp("selected", ctx.parameterLayout === "header");
|
|
@@ -424,21 +459,11 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
424
459
|
i0.ɵɵtwoWayProperty("ngModel", ctx.parameterLayout);
|
|
425
460
|
i0.ɵɵadvance(6);
|
|
426
461
|
i0.ɵɵtextInterpolate(ctx.getParameterLayoutDescription());
|
|
427
|
-
i0.ɵɵadvance(5);
|
|
428
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.autoRefreshSeconds);
|
|
429
462
|
i0.ɵɵadvance();
|
|
430
|
-
i0.ɵɵ
|
|
431
|
-
i0.ɵɵadvance(
|
|
432
|
-
i0.ɵɵ
|
|
433
|
-
i0.ɵɵadvance(2);
|
|
434
|
-
i0.ɵɵproperty("ngValue", 60);
|
|
435
|
-
i0.ɵɵadvance(2);
|
|
436
|
-
i0.ɵɵproperty("ngValue", 300);
|
|
463
|
+
i0.ɵɵconditional(ctx.ShowCommonFields ? 40 : -1);
|
|
464
|
+
i0.ɵɵadvance(3);
|
|
465
|
+
i0.ɵɵconditional(ctx.ShowCommonFields ? 43 : -1);
|
|
437
466
|
i0.ɵɵadvance(2);
|
|
438
|
-
i0.ɵɵproperty("ngValue", 600);
|
|
439
|
-
i0.ɵɵadvance(5);
|
|
440
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.showParameterControls);
|
|
441
|
-
i0.ɵɵadvance(5);
|
|
442
467
|
i0.ɵɵtwoWayProperty("ngModel", ctx.showExecutionMetadata);
|
|
443
468
|
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective], styles: ["\n\n\n\n\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n.config-panel--compact[_ngcontent-%COMP%] {\n gap: 16px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] {\n gap: 8px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-select[_ngcontent-%COMP%] {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n\n\n\n\n.optional-tag[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.form-hint--selected[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n\n\n\n\n.config-section-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n\n\n\n.radio-group--horizontal[_ngcontent-%COMP%] {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n width: 8px;\n height: 8px;\n}\n\n\n\n\n\n.checkbox-group--compact[_ngcontent-%COMP%] {\n gap: 4px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-mark[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-label[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\nmj-tree-dropdown.error[_ngcontent-%COMP%] {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error[_ngcontent-%COMP%]:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}"] });
|
|
444
469
|
};
|
|
@@ -448,7 +473,7 @@ QueryConfigPanelComponent = __decorate([
|
|
|
448
473
|
export { QueryConfigPanelComponent };
|
|
449
474
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryConfigPanelComponent, [{
|
|
450
475
|
type: Component,
|
|
451
|
-
args: [{ standalone: false, selector: 'mj-query-config-panel', template: "<!-- Query Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Query Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-flask\"></i>\n Select Query\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #queryDropdown\n [BranchConfig]=\"QueryCategoryConfig\"\n [LeafConfig]=\"QueryLeafConfig\"\n [Value]=\"QueryIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse queries...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onQuerySelection($event)\"\n [class.error]=\"queryError\">\n </mj-tree-dropdown>\n @if (queryError) {\n <span class=\"form-error\">{{ queryError }}</span>\n }\n @if (!queryError && !queryId) {\n <span class=\"form-hint\">\n Browse categories or search to find a query\n </span>\n }\n @if (!queryError && queryId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ queryName }}\n </span>\n }\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]=\"queryName ? 'Default: ' + queryName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use query name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-sliders\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Parameter Layout -->\n <div class=\"form-group\">\n <label>Parameter Layout</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'header'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"header\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-arrow-up-from-bracket\"></i>\n Header\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'sidebar'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"sidebar\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-columns\"></i>\n Sidebar\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'dialog'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"dialog\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-window-restore\"></i>\n Dialog\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getParameterLayoutDescription() }}</span>\n </div>\n <!-- Auto Refresh -->\n <div class=\"form-group\">\n <label for=\"autoRefresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto Refresh\n </label>\n <select\n class=\"form-select\"\n [(ngModel)]=\"autoRefreshSeconds\"\n (change)=\"onAutoRefreshChange()\">\n <option [ngValue]=\"0\">Disabled</option>\n <option [ngValue]=\"30\">Every 30 seconds</option>\n <option [ngValue]=\"60\">Every minute</option>\n <option [ngValue]=\"300\">Every 5 minutes</option>\n <option [ngValue]=\"600\">Every 10 minutes</option>\n </select>\n </div>\n <!-- 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)]=\"showParameterControls\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Parameter Controls</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showExecutionMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Execution Metadata</span>\n </label>\n </div>\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"] }]
|
|
476
|
+
args: [{ standalone: false, selector: 'mj-query-config-panel', template: "<!-- Query Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Query Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-flask\"></i>\n Select Query\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #queryDropdown\n [BranchConfig]=\"QueryCategoryConfig\"\n [LeafConfig]=\"QueryLeafConfig\"\n [Value]=\"QueryIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse queries...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onQuerySelection($event)\"\n [class.error]=\"queryError\">\n </mj-tree-dropdown>\n @if (queryError) {\n <span class=\"form-error\">{{ queryError }}</span>\n }\n @if (!queryError && !queryId) {\n <span class=\"form-hint\">\n Browse categories or search to find a query\n </span>\n }\n @if (!queryError && queryId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ queryName }}\n </span>\n }\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]=\"queryName ? 'Default: ' + queryName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use query name as title</span>\n </div>\n }\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-sliders\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Parameter Layout -->\n <div class=\"form-group\">\n <label>Parameter Layout</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'header'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"header\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-arrow-up-from-bracket\"></i>\n Header\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'sidebar'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"sidebar\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-columns\"></i>\n Sidebar\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'dialog'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"dialog\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-window-restore\"></i>\n Dialog\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getParameterLayoutDescription() }}</span>\n </div>\n <!-- Auto Refresh -->\n @if (ShowCommonFields) {\n <div class=\"form-group\">\n <label for=\"autoRefresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto Refresh\n </label>\n <select\n class=\"form-select\"\n [(ngModel)]=\"autoRefreshSeconds\"\n (change)=\"onAutoRefreshChange()\">\n <option [ngValue]=\"0\">Disabled</option>\n <option [ngValue]=\"30\">Every 30 seconds</option>\n <option [ngValue]=\"60\">Every minute</option>\n <option [ngValue]=\"300\">Every 5 minutes</option>\n <option [ngValue]=\"600\">Every 10 minutes</option>\n </select>\n </div>\n }\n <!-- Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n @if (ShowCommonFields) {\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showParameterControls\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Parameter Controls</span>\n </label>\n }\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showExecutionMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Execution Metadata</span>\n </label>\n </div>\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"] }]
|
|
452
477
|
}], () => [{ type: i0.ChangeDetectorRef }], { QueryDropdown: [{
|
|
453
478
|
type: ViewChild,
|
|
454
479
|
args: ['queryDropdown']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/query-config-panel.component.ts","../../../src/lib/config-panels/query-config-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey } from '@memberjunction/core';\nimport { BaseConfigPanel } from './base-config-panel';\nimport { PanelConfig } from '../models/dashboard-types';\nimport {\n TreeBranchConfig,\n TreeLeafConfig,\n TreeNode,\n TreeDropdownComponent\n} from '@memberjunction/ng-trees';\n\n/**\n * Configuration panel for Query parts.\n * Uses tree dropdown for category-based query selection.\n */\n@RegisterClass(BaseConfigPanel, 'QueryPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-query-config-panel',\n templateUrl: './query-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class QueryConfigPanelComponent extends BaseConfigPanel {\n // ViewChild reference\n @ViewChild('queryDropdown') QueryDropdown!: TreeDropdownComponent;\n\n /** @deprecated Use {@link QueryDropdown}. */\n get queryDropdown(): TreeDropdownComponent {\n return this.QueryDropdown;\n }\n /** @deprecated Use {@link QueryDropdown}. */\n set queryDropdown(value: TreeDropdownComponent) {\n this.QueryDropdown = value;\n }\n\n // Form fields\n public title = '';\n public QueryId = '';\n\n /** @deprecated Use {@link QueryId}. */\n public get queryId() {\n return this.QueryId;\n }\n /** @deprecated Use {@link QueryId}. */\n public set queryId(value) {\n this.QueryId = value;\n }\n public QueryName = '';\n\n /** @deprecated Use {@link QueryName}. */\n public get queryName() {\n return this.QueryName;\n }\n /** @deprecated Use {@link QueryName}. */\n public set queryName(value) {\n this.QueryName = value;\n }\n public ShowParameterControls = true;\n\n /** @deprecated Use {@link ShowParameterControls}. */\n public get showParameterControls() {\n return this.ShowParameterControls;\n }\n /** @deprecated Use {@link ShowParameterControls}. */\n public set showParameterControls(value) {\n this.ShowParameterControls = value;\n }\n public ParameterLayout: 'header' | 'sidebar' | 'dialog' = 'header';\n\n /** @deprecated Use {@link ParameterLayout}. */\n public get parameterLayout(): 'header' | 'sidebar' | 'dialog' {\n return this.ParameterLayout;\n }\n /** @deprecated Use {@link ParameterLayout}. */\n public set parameterLayout(value: 'header' | 'sidebar' | 'dialog') {\n this.ParameterLayout = value;\n }\n public AutoRefreshSeconds = 0;\n\n /** @deprecated Use {@link AutoRefreshSeconds}. */\n public get autoRefreshSeconds() {\n return this.AutoRefreshSeconds;\n }\n /** @deprecated Use {@link AutoRefreshSeconds}. */\n public set autoRefreshSeconds(value) {\n this.AutoRefreshSeconds = value;\n }\n public ShowExecutionMetadata = true;\n\n /** @deprecated Use {@link ShowExecutionMetadata}. */\n public get showExecutionMetadata() {\n return this.ShowExecutionMetadata;\n }\n /** @deprecated Use {@link ShowExecutionMetadata}. */\n public set showExecutionMetadata(value) {\n this.ShowExecutionMetadata = value;\n }\n\n // Track previous selection name for smart title updates\n private previousQueryName = '';\n\n // Collapsible section state\n public ShowAdvancedOptions = false;\n\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public get showAdvancedOptions() {\n return this.ShowAdvancedOptions;\n }\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public set showAdvancedOptions(value) {\n this.ShowAdvancedOptions = value;\n }\n\n // Validation\n public QueryError = '';\n\n /** @deprecated Use {@link QueryError}. */\n public get queryError() {\n return this.QueryError;\n }\n /** @deprecated Use {@link QueryError}. */\n public set queryError(value) {\n this.QueryError = value;\n }\n\n // Tree configuration for Query Categories (branches) and Queries (leaves)\n public QueryCategoryConfig: TreeBranchConfig = {\n EntityName: 'MJ: Query Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n public QueryLeafConfig: TreeLeafConfig = {\n EntityName: 'MJ: Queries',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: 'CategoryID',\n DefaultIcon: 'fa-solid fa-flask',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n /**\n * Get the queryId as a CompositeKey for the tree dropdown\n */\n public get QueryIdAsKey(): CompositeKey | null {\n return this.QueryId ? CompositeKey.FromID(this.QueryId) : null; // first-pk-ok: queryId is an MJ: Queries record (QueryLeafConfig) — core entity keyed by ID\n }\n\n public initFromConfig(config: PanelConfig | null): void {\n if (config && config.type === 'Query') {\n this.QueryId = (config['queryId'] as string) || '';\n this.QueryName = (config['queryName'] as string) || '';\n this.ShowParameterControls = (config['showParameterControls'] as boolean) ?? true;\n this.ParameterLayout = (config['parameterLayout'] as 'header' | 'sidebar' | 'dialog') || 'header';\n this.AutoRefreshSeconds = (config['autoRefreshSeconds'] as number) || 0;\n this.ShowExecutionMetadata = (config['showExecutionMetadata'] as boolean) ?? true;\n } else {\n // Defaults for new Query panel\n this.QueryId = '';\n this.QueryName = '';\n this.ShowParameterControls = true;\n this.ParameterLayout = 'header';\n this.AutoRefreshSeconds = 0;\n this.ShowExecutionMetadata = true;\n }\n\n this.title = this.panel?.title || '';\n this.previousQueryName = '';\n this.QueryError = '';\n this.cdr.detectChanges();\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'Query',\n queryId: this.QueryId.trim() || undefined,\n queryName: this.QueryName.trim() || undefined,\n showParameterControls: this.ShowParameterControls,\n parameterLayout: this.ParameterLayout,\n autoRefreshSeconds: this.AutoRefreshSeconds,\n showExecutionMetadata: this.ShowExecutionMetadata\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.QueryError = '';\n\n if (!this.QueryId.trim() && !this.QueryName.trim()) {\n this.QueryError = 'Please select a query';\n errors.push(this.QueryError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.QueryName) {\n return this.QueryName;\n }\n return 'Query';\n }\n\n public getTitle(): string {\n return this.title || this.getDefaultTitle();\n }\n\n // Form event handlers\n public OnTitleChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnTitleChange}. */\n public onTitleChange(): void {\n return this.OnTitleChange();\n }\n\n /**\n * Handle query selection from tree dropdown\n */\n public OnQuerySelection(node: TreeNode | TreeNode[] | null): void {\n // Ignore null/empty selections (these happen during sync, not user interaction)\n if (!node || (Array.isArray(node) && node.length === 0)) {\n return;\n }\n\n this.QueryError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual queries, not categories)\n if (node.Type === 'leaf') {\n const oldQueryName = this.QueryName;\n this.QueryId = node.ID;\n this.QueryName = node.Label;\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldQueryName || this.title === this.previousQueryName) {\n this.title = node.Label;\n }\n this.previousQueryName = node.Label;\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnQuerySelection}. */\n public onQuerySelection(node: TreeNode | TreeNode[] | null): void {\n return this.OnQuerySelection(node);\n }\n\n public OnParameterLayoutChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnParameterLayoutChange}. */\n public onParameterLayoutChange(): void {\n return this.OnParameterLayoutChange();\n }\n\n public OnAutoRefreshChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnAutoRefreshChange}. */\n public onAutoRefreshChange(): void {\n return this.OnAutoRefreshChange();\n }\n\n public OnOptionChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnOptionChange}. */\n public onOptionChange(): void {\n return this.OnOptionChange();\n }\n\n public GetParameterLayoutDescription(): string {\n switch (this.ParameterLayout) {\n case 'sidebar':\n return 'Parameters displayed in a collapsible sidebar';\n case 'dialog':\n return 'Parameters shown in a popup dialog when needed';\n default:\n return 'Parameters displayed in the header area above results';\n }\n }\n\n /** @deprecated Use {@link GetParameterLayoutDescription}. */\n public getParameterLayoutDescription(): string {\n return this.GetParameterLayoutDescription();\n }\n}\n","<!-- Query Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Query Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-flask\"></i>\n Select Query\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #queryDropdown\n [BranchConfig]=\"QueryCategoryConfig\"\n [LeafConfig]=\"QueryLeafConfig\"\n [Value]=\"QueryIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse queries...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onQuerySelection($event)\"\n [class.error]=\"queryError\">\n </mj-tree-dropdown>\n @if (queryError) {\n <span class=\"form-error\">{{ queryError }}</span>\n }\n @if (!queryError && !queryId) {\n <span class=\"form-hint\">\n Browse categories or search to find a query\n </span>\n }\n @if (!queryError && queryId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ queryName }}\n </span>\n }\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]=\"queryName ? 'Default: ' + queryName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use query name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-sliders\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Parameter Layout -->\n <div class=\"form-group\">\n <label>Parameter Layout</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'header'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"header\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-arrow-up-from-bracket\"></i>\n Header\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'sidebar'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"sidebar\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-columns\"></i>\n Sidebar\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'dialog'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"dialog\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-window-restore\"></i>\n Dialog\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getParameterLayoutDescription() }}</span>\n </div>\n <!-- Auto Refresh -->\n <div class=\"form-group\">\n <label for=\"autoRefresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto Refresh\n </label>\n <select\n class=\"form-select\"\n [(ngModel)]=\"autoRefreshSeconds\"\n (change)=\"onAutoRefreshChange()\">\n <option [ngValue]=\"0\">Disabled</option>\n <option [ngValue]=\"30\">Every 30 seconds</option>\n <option [ngValue]=\"60\">Every minute</option>\n <option [ngValue]=\"300\">Every 5 minutes</option>\n <option [ngValue]=\"600\">Every 10 minutes</option>\n </select>\n </div>\n <!-- 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)]=\"showParameterControls\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Parameter Controls</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showExecutionMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Execution Metadata</span>\n </label>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"query-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/query-config-panel.component.ts","../../../src/lib/config-panels/query-config-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey } from '@memberjunction/core';\nimport { BaseConfigPanel } from './base-config-panel';\nimport { PanelConfig } from '../models/dashboard-types';\nimport {\n TreeBranchConfig,\n TreeLeafConfig,\n TreeNode,\n TreeDropdownComponent\n} from '@memberjunction/ng-trees';\n\n/**\n * Configuration panel for Query parts.\n * Uses tree dropdown for category-based query selection.\n */\n@RegisterClass(BaseConfigPanel, 'QueryPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-query-config-panel',\n templateUrl: './query-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class QueryConfigPanelComponent extends BaseConfigPanel {\n // ViewChild reference\n @ViewChild('queryDropdown') QueryDropdown!: TreeDropdownComponent;\n\n /** @deprecated Use {@link QueryDropdown}. */\n get queryDropdown(): TreeDropdownComponent {\n return this.QueryDropdown;\n }\n /** @deprecated Use {@link QueryDropdown}. */\n set queryDropdown(value: TreeDropdownComponent) {\n this.QueryDropdown = value;\n }\n\n // Form fields\n public title = '';\n public QueryId = '';\n\n /** @deprecated Use {@link QueryId}. */\n public get queryId() {\n return this.QueryId;\n }\n /** @deprecated Use {@link QueryId}. */\n public set queryId(value) {\n this.QueryId = value;\n }\n public QueryName = '';\n\n /** @deprecated Use {@link QueryName}. */\n public get queryName() {\n return this.QueryName;\n }\n /** @deprecated Use {@link QueryName}. */\n public set queryName(value) {\n this.QueryName = value;\n }\n public ShowParameterControls = true;\n\n /** @deprecated Use {@link ShowParameterControls}. */\n public get showParameterControls() {\n return this.ShowParameterControls;\n }\n /** @deprecated Use {@link ShowParameterControls}. */\n public set showParameterControls(value) {\n this.ShowParameterControls = value;\n }\n public ParameterLayout: 'header' | 'sidebar' | 'dialog' = 'header';\n\n /** @deprecated Use {@link ParameterLayout}. */\n public get parameterLayout(): 'header' | 'sidebar' | 'dialog' {\n return this.ParameterLayout;\n }\n /** @deprecated Use {@link ParameterLayout}. */\n public set parameterLayout(value: 'header' | 'sidebar' | 'dialog') {\n this.ParameterLayout = value;\n }\n public AutoRefreshSeconds = 0;\n\n /** @deprecated Use {@link AutoRefreshSeconds}. */\n public get autoRefreshSeconds() {\n return this.AutoRefreshSeconds;\n }\n /** @deprecated Use {@link AutoRefreshSeconds}. */\n public set autoRefreshSeconds(value) {\n this.AutoRefreshSeconds = value;\n }\n public ShowExecutionMetadata = true;\n\n /** @deprecated Use {@link ShowExecutionMetadata}. */\n public get showExecutionMetadata() {\n return this.ShowExecutionMetadata;\n }\n /** @deprecated Use {@link ShowExecutionMetadata}. */\n public set showExecutionMetadata(value) {\n this.ShowExecutionMetadata = value;\n }\n\n // Track previous selection name for smart title updates\n private previousQueryName = '';\n\n // Collapsible section state\n public ShowAdvancedOptions = false;\n\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public get showAdvancedOptions() {\n return this.ShowAdvancedOptions;\n }\n /** @deprecated Use {@link ShowAdvancedOptions}. */\n public set showAdvancedOptions(value) {\n this.ShowAdvancedOptions = value;\n }\n\n // Validation\n public QueryError = '';\n\n /** @deprecated Use {@link QueryError}. */\n public get queryError() {\n return this.QueryError;\n }\n /** @deprecated Use {@link QueryError}. */\n public set queryError(value) {\n this.QueryError = value;\n }\n\n // Tree configuration for Query Categories (branches) and Queries (leaves)\n public QueryCategoryConfig: TreeBranchConfig = {\n EntityName: 'MJ: Query Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n public QueryLeafConfig: TreeLeafConfig = {\n EntityName: 'MJ: Queries',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: 'CategoryID',\n DefaultIcon: 'fa-solid fa-flask',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n /**\n * Get the queryId as a CompositeKey for the tree dropdown\n */\n public get QueryIdAsKey(): CompositeKey | null {\n return this.QueryId ? CompositeKey.FromID(this.QueryId) : null; // first-pk-ok: queryId is an MJ: Queries record (QueryLeafConfig) — core entity keyed by ID\n }\n\n public initFromConfig(config: PanelConfig | null): void {\n if (config && config.type === 'Query') {\n this.QueryId = (config['queryId'] as string) || '';\n this.QueryName = (config['queryName'] as string) || '';\n this.ShowParameterControls = (config['showParameterControls'] as boolean) ?? true;\n this.ParameterLayout = (config['parameterLayout'] as 'header' | 'sidebar' | 'dialog') || 'header';\n this.AutoRefreshSeconds = (config['autoRefreshSeconds'] as number) || 0;\n this.ShowExecutionMetadata = (config['showExecutionMetadata'] as boolean) ?? true;\n } else {\n // Defaults for new Query panel\n this.QueryId = '';\n this.QueryName = '';\n this.ShowParameterControls = true;\n this.ParameterLayout = 'header';\n this.AutoRefreshSeconds = 0;\n this.ShowExecutionMetadata = true;\n }\n\n this.title = this.panel?.title || '';\n this.previousQueryName = '';\n this.QueryError = '';\n this.cdr.detectChanges();\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'Query',\n queryId: this.QueryId.trim() || undefined,\n queryName: this.QueryName.trim() || undefined,\n showParameterControls: this.ShowParameterControls,\n parameterLayout: this.ParameterLayout,\n autoRefreshSeconds: this.AutoRefreshSeconds,\n showExecutionMetadata: this.ShowExecutionMetadata\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.QueryError = '';\n\n if (!this.QueryId.trim() && !this.QueryName.trim()) {\n this.QueryError = 'Please select a query';\n errors.push(this.QueryError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.QueryName) {\n return this.QueryName;\n }\n return 'Query';\n }\n\n public getTitle(): string {\n return this.title || this.getDefaultTitle();\n }\n\n // Form event handlers\n public OnTitleChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnTitleChange}. */\n public onTitleChange(): void {\n return this.OnTitleChange();\n }\n\n /**\n * Handle query selection from tree dropdown\n */\n public OnQuerySelection(node: TreeNode | TreeNode[] | null): void {\n // Ignore null/empty selections (these happen during sync, not user interaction)\n if (!node || (Array.isArray(node) && node.length === 0)) {\n return;\n }\n\n this.QueryError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual queries, not categories)\n if (node.Type === 'leaf') {\n const oldQueryName = this.QueryName;\n this.QueryId = node.ID;\n this.QueryName = node.Label;\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldQueryName || this.title === this.previousQueryName) {\n this.title = node.Label;\n }\n this.previousQueryName = node.Label;\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnQuerySelection}. */\n public onQuerySelection(node: TreeNode | TreeNode[] | null): void {\n return this.OnQuerySelection(node);\n }\n\n public OnParameterLayoutChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnParameterLayoutChange}. */\n public onParameterLayoutChange(): void {\n return this.OnParameterLayoutChange();\n }\n\n public OnAutoRefreshChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnAutoRefreshChange}. */\n public onAutoRefreshChange(): void {\n return this.OnAutoRefreshChange();\n }\n\n public OnOptionChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnOptionChange}. */\n public onOptionChange(): void {\n return this.OnOptionChange();\n }\n\n public GetParameterLayoutDescription(): string {\n switch (this.ParameterLayout) {\n case 'sidebar':\n return 'Parameters displayed in a collapsible sidebar';\n case 'dialog':\n return 'Parameters shown in a popup dialog when needed';\n default:\n return 'Parameters displayed in the header area above results';\n }\n }\n\n /** @deprecated Use {@link GetParameterLayoutDescription}. */\n public getParameterLayoutDescription(): string {\n return this.GetParameterLayoutDescription();\n }\n}\n","<!-- Query Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Query Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-flask\"></i>\n Select Query\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #queryDropdown\n [BranchConfig]=\"QueryCategoryConfig\"\n [LeafConfig]=\"QueryLeafConfig\"\n [Value]=\"QueryIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse queries...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onQuerySelection($event)\"\n [class.error]=\"queryError\">\n </mj-tree-dropdown>\n @if (queryError) {\n <span class=\"form-error\">{{ queryError }}</span>\n }\n @if (!queryError && !queryId) {\n <span class=\"form-hint\">\n Browse categories or search to find a query\n </span>\n }\n @if (!queryError && queryId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ queryName }}\n </span>\n }\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]=\"queryName ? 'Default: ' + queryName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use query name as title</span>\n </div>\n }\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-sliders\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Parameter Layout -->\n <div class=\"form-group\">\n <label>Parameter Layout</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'header'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"header\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-arrow-up-from-bracket\"></i>\n Header\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'sidebar'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"sidebar\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-columns\"></i>\n Sidebar\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"parameterLayout === 'dialog'\">\n <input\n type=\"radio\"\n name=\"parameterLayout\"\n value=\"dialog\"\n [(ngModel)]=\"parameterLayout\"\n (change)=\"onParameterLayoutChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-window-restore\"></i>\n Dialog\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getParameterLayoutDescription() }}</span>\n </div>\n <!-- Auto Refresh -->\n @if (ShowCommonFields) {\n <div class=\"form-group\">\n <label for=\"autoRefresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Auto Refresh\n </label>\n <select\n class=\"form-select\"\n [(ngModel)]=\"autoRefreshSeconds\"\n (change)=\"onAutoRefreshChange()\">\n <option [ngValue]=\"0\">Disabled</option>\n <option [ngValue]=\"30\">Every 30 seconds</option>\n <option [ngValue]=\"60\">Every minute</option>\n <option [ngValue]=\"300\">Every 5 minutes</option>\n <option [ngValue]=\"600\">Every 10 minutes</option>\n </select>\n </div>\n }\n <!-- Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n @if (ShowCommonFields) {\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showParameterControls\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Parameter Controls</span>\n </label>\n }\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showExecutionMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Execution Metadata</span>\n </label>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
|