@memberjunction/ng-dashboard-viewer 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +58 -8
- package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
- package/dist/lib/config-dialogs/confirm-dialog.component.js +119 -17
- package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
- package/dist/lib/config-panels/artifact-config-panel.component.d.ts +63 -11
- package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/artifact-config-panel.component.js +152 -48
- package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.d.ts +57 -9
- package/dist/lib/config-panels/query-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.js +142 -46
- package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.d.ts +69 -11
- package/dist/lib/config-panels/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.js +165 -49
- package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.d.ts +42 -6
- package/dist/lib/config-panels/weburl-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.js +113 -41
- package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.js +7 -4
- package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +163 -12
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +332 -78
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +63 -9
- 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 +172 -66
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +11 -1
- 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 +30 -10
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
- package/dist/lib/models/dashboard-types.d.ts +8 -0
- package/dist/lib/models/dashboard-types.d.ts.map +1 -1
- package/dist/lib/models/dashboard-types.js +21 -5
- package/dist/lib/models/dashboard-types.js.map +1 -1
- package/dist/lib/parts/artifact-part.component.d.ts +63 -7
- package/dist/lib/parts/artifact-part.component.d.ts.map +1 -1
- package/dist/lib/parts/artifact-part.component.js +98 -22
- package/dist/lib/parts/artifact-part.component.js.map +1 -1
- package/dist/lib/parts/query-part.component.d.ts +26 -4
- package/dist/lib/parts/query-part.component.d.ts.map +1 -1
- package/dist/lib/parts/query-part.component.js +62 -18
- package/dist/lib/parts/query-part.component.js.map +1 -1
- package/dist/lib/parts/view-part.component.d.ts +21 -3
- package/dist/lib/parts/view-part.component.d.ts.map +1 -1
- package/dist/lib/parts/view-part.component.js +55 -19
- package/dist/lib/parts/view-part.component.js.map +1 -1
- package/dist/lib/parts/weburl-part.component.d.ts +29 -5
- package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
- package/dist/lib/parts/weburl-part.component.js +63 -15
- package/dist/lib/parts/weburl-part.component.js.map +1 -1
- package/dist/lib/services/golden-layout-wrapper.service.d.ts +65 -5
- package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
- package/dist/lib/services/golden-layout-wrapper.service.js +135 -27
- package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
- package/package.json +13 -13
|
@@ -47,21 +47,93 @@ function QueryConfigPanelComponent_ng_template_22_Template(rf, ctx) { if (rf & 1
|
|
|
47
47
|
*/
|
|
48
48
|
let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConfigPanel {
|
|
49
49
|
// ViewChild reference
|
|
50
|
-
|
|
50
|
+
QueryDropdown;
|
|
51
|
+
/** @deprecated Use {@link QueryDropdown}. */
|
|
52
|
+
get queryDropdown() {
|
|
53
|
+
return this.QueryDropdown;
|
|
54
|
+
}
|
|
55
|
+
/** @deprecated Use {@link QueryDropdown}. */
|
|
56
|
+
set queryDropdown(value) {
|
|
57
|
+
this.QueryDropdown = value;
|
|
58
|
+
}
|
|
51
59
|
// Form fields
|
|
52
60
|
title = '';
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
QueryId = '';
|
|
62
|
+
/** @deprecated Use {@link QueryId}. */
|
|
63
|
+
get queryId() {
|
|
64
|
+
return this.QueryId;
|
|
65
|
+
}
|
|
66
|
+
/** @deprecated Use {@link QueryId}. */
|
|
67
|
+
set queryId(value) {
|
|
68
|
+
this.QueryId = value;
|
|
69
|
+
}
|
|
70
|
+
QueryName = '';
|
|
71
|
+
/** @deprecated Use {@link QueryName}. */
|
|
72
|
+
get queryName() {
|
|
73
|
+
return this.QueryName;
|
|
74
|
+
}
|
|
75
|
+
/** @deprecated Use {@link QueryName}. */
|
|
76
|
+
set queryName(value) {
|
|
77
|
+
this.QueryName = value;
|
|
78
|
+
}
|
|
79
|
+
ShowParameterControls = true;
|
|
80
|
+
/** @deprecated Use {@link ShowParameterControls}. */
|
|
81
|
+
get showParameterControls() {
|
|
82
|
+
return this.ShowParameterControls;
|
|
83
|
+
}
|
|
84
|
+
/** @deprecated Use {@link ShowParameterControls}. */
|
|
85
|
+
set showParameterControls(value) {
|
|
86
|
+
this.ShowParameterControls = value;
|
|
87
|
+
}
|
|
88
|
+
ParameterLayout = 'header';
|
|
89
|
+
/** @deprecated Use {@link ParameterLayout}. */
|
|
90
|
+
get parameterLayout() {
|
|
91
|
+
return this.ParameterLayout;
|
|
92
|
+
}
|
|
93
|
+
/** @deprecated Use {@link ParameterLayout}. */
|
|
94
|
+
set parameterLayout(value) {
|
|
95
|
+
this.ParameterLayout = value;
|
|
96
|
+
}
|
|
97
|
+
AutoRefreshSeconds = 0;
|
|
98
|
+
/** @deprecated Use {@link AutoRefreshSeconds}. */
|
|
99
|
+
get autoRefreshSeconds() {
|
|
100
|
+
return this.AutoRefreshSeconds;
|
|
101
|
+
}
|
|
102
|
+
/** @deprecated Use {@link AutoRefreshSeconds}. */
|
|
103
|
+
set autoRefreshSeconds(value) {
|
|
104
|
+
this.AutoRefreshSeconds = value;
|
|
105
|
+
}
|
|
106
|
+
ShowExecutionMetadata = true;
|
|
107
|
+
/** @deprecated Use {@link ShowExecutionMetadata}. */
|
|
108
|
+
get showExecutionMetadata() {
|
|
109
|
+
return this.ShowExecutionMetadata;
|
|
110
|
+
}
|
|
111
|
+
/** @deprecated Use {@link ShowExecutionMetadata}. */
|
|
112
|
+
set showExecutionMetadata(value) {
|
|
113
|
+
this.ShowExecutionMetadata = value;
|
|
114
|
+
}
|
|
59
115
|
// Track previous selection name for smart title updates
|
|
60
116
|
previousQueryName = '';
|
|
61
117
|
// Collapsible section state
|
|
62
|
-
|
|
118
|
+
ShowAdvancedOptions = false;
|
|
119
|
+
/** @deprecated Use {@link ShowAdvancedOptions}. */
|
|
120
|
+
get showAdvancedOptions() {
|
|
121
|
+
return this.ShowAdvancedOptions;
|
|
122
|
+
}
|
|
123
|
+
/** @deprecated Use {@link ShowAdvancedOptions}. */
|
|
124
|
+
set showAdvancedOptions(value) {
|
|
125
|
+
this.ShowAdvancedOptions = value;
|
|
126
|
+
}
|
|
63
127
|
// Validation
|
|
64
|
-
|
|
128
|
+
QueryError = '';
|
|
129
|
+
/** @deprecated Use {@link QueryError}. */
|
|
130
|
+
get queryError() {
|
|
131
|
+
return this.QueryError;
|
|
132
|
+
}
|
|
133
|
+
/** @deprecated Use {@link QueryError}. */
|
|
134
|
+
set queryError(value) {
|
|
135
|
+
this.QueryError = value;
|
|
136
|
+
}
|
|
65
137
|
// Tree configuration for Query Categories (branches) and Queries (leaves)
|
|
66
138
|
QueryCategoryConfig = {
|
|
67
139
|
EntityName: 'MJ: Query Categories',
|
|
@@ -88,55 +160,55 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
88
160
|
* Get the queryId as a CompositeKey for the tree dropdown
|
|
89
161
|
*/
|
|
90
162
|
get QueryIdAsKey() {
|
|
91
|
-
return this.
|
|
163
|
+
return this.QueryId ? CompositeKey.FromID(this.QueryId) : null; // first-pk-ok: queryId is an MJ: Queries record (QueryLeafConfig) — core entity keyed by ID
|
|
92
164
|
}
|
|
93
165
|
initFromConfig(config) {
|
|
94
166
|
if (config && config.type === 'Query') {
|
|
95
|
-
this.
|
|
96
|
-
this.
|
|
97
|
-
this.
|
|
98
|
-
this.
|
|
99
|
-
this.
|
|
100
|
-
this.
|
|
167
|
+
this.QueryId = config['queryId'] || '';
|
|
168
|
+
this.QueryName = config['queryName'] || '';
|
|
169
|
+
this.ShowParameterControls = config['showParameterControls'] ?? true;
|
|
170
|
+
this.ParameterLayout = config['parameterLayout'] || 'header';
|
|
171
|
+
this.AutoRefreshSeconds = config['autoRefreshSeconds'] || 0;
|
|
172
|
+
this.ShowExecutionMetadata = config['showExecutionMetadata'] ?? true;
|
|
101
173
|
}
|
|
102
174
|
else {
|
|
103
175
|
// Defaults for new Query panel
|
|
104
|
-
this.
|
|
105
|
-
this.
|
|
106
|
-
this.
|
|
107
|
-
this.
|
|
108
|
-
this.
|
|
109
|
-
this.
|
|
176
|
+
this.QueryId = '';
|
|
177
|
+
this.QueryName = '';
|
|
178
|
+
this.ShowParameterControls = true;
|
|
179
|
+
this.ParameterLayout = 'header';
|
|
180
|
+
this.AutoRefreshSeconds = 0;
|
|
181
|
+
this.ShowExecutionMetadata = true;
|
|
110
182
|
}
|
|
111
183
|
this.title = this.panel?.title || '';
|
|
112
184
|
this.previousQueryName = '';
|
|
113
|
-
this.
|
|
185
|
+
this.QueryError = '';
|
|
114
186
|
this.cdr.detectChanges();
|
|
115
187
|
}
|
|
116
188
|
buildConfig() {
|
|
117
189
|
return {
|
|
118
190
|
type: 'Query',
|
|
119
|
-
queryId: this.
|
|
120
|
-
queryName: this.
|
|
121
|
-
showParameterControls: this.
|
|
122
|
-
parameterLayout: this.
|
|
123
|
-
autoRefreshSeconds: this.
|
|
124
|
-
showExecutionMetadata: this.
|
|
191
|
+
queryId: this.QueryId.trim() || undefined,
|
|
192
|
+
queryName: this.QueryName.trim() || undefined,
|
|
193
|
+
showParameterControls: this.ShowParameterControls,
|
|
194
|
+
parameterLayout: this.ParameterLayout,
|
|
195
|
+
autoRefreshSeconds: this.AutoRefreshSeconds,
|
|
196
|
+
showExecutionMetadata: this.ShowExecutionMetadata
|
|
125
197
|
};
|
|
126
198
|
}
|
|
127
199
|
validate() {
|
|
128
200
|
const errors = [];
|
|
129
|
-
this.
|
|
130
|
-
if (!this.
|
|
131
|
-
this.
|
|
132
|
-
errors.push(this.
|
|
201
|
+
this.QueryError = '';
|
|
202
|
+
if (!this.QueryId.trim() && !this.QueryName.trim()) {
|
|
203
|
+
this.QueryError = 'Please select a query';
|
|
204
|
+
errors.push(this.QueryError);
|
|
133
205
|
}
|
|
134
206
|
this.cdr.detectChanges();
|
|
135
207
|
return { valid: errors.length === 0, errors };
|
|
136
208
|
}
|
|
137
209
|
getDefaultTitle() {
|
|
138
|
-
if (this.
|
|
139
|
-
return this.
|
|
210
|
+
if (this.QueryName) {
|
|
211
|
+
return this.QueryName;
|
|
140
212
|
}
|
|
141
213
|
return 'Query';
|
|
142
214
|
}
|
|
@@ -144,24 +216,28 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
144
216
|
return this.title || this.getDefaultTitle();
|
|
145
217
|
}
|
|
146
218
|
// Form event handlers
|
|
147
|
-
|
|
219
|
+
OnTitleChange() {
|
|
148
220
|
this.emitConfigChanged();
|
|
149
221
|
}
|
|
222
|
+
/** @deprecated Use {@link OnTitleChange}. */
|
|
223
|
+
onTitleChange() {
|
|
224
|
+
return this.OnTitleChange();
|
|
225
|
+
}
|
|
150
226
|
/**
|
|
151
227
|
* Handle query selection from tree dropdown
|
|
152
228
|
*/
|
|
153
|
-
|
|
229
|
+
OnQuerySelection(node) {
|
|
154
230
|
// Ignore null/empty selections (these happen during sync, not user interaction)
|
|
155
231
|
if (!node || (Array.isArray(node) && node.length === 0)) {
|
|
156
232
|
return;
|
|
157
233
|
}
|
|
158
|
-
this.
|
|
234
|
+
this.QueryError = '';
|
|
159
235
|
if (!Array.isArray(node)) {
|
|
160
236
|
// Only accept leaf nodes (actual queries, not categories)
|
|
161
237
|
if (node.Type === 'leaf') {
|
|
162
|
-
const oldQueryName = this.
|
|
163
|
-
this.
|
|
164
|
-
this.
|
|
238
|
+
const oldQueryName = this.QueryName;
|
|
239
|
+
this.QueryId = node.ID;
|
|
240
|
+
this.QueryName = node.Label;
|
|
165
241
|
// Smart title update: if title matches old name, update to new name
|
|
166
242
|
if (!this.title || this.title === oldQueryName || this.title === this.previousQueryName) {
|
|
167
243
|
this.title = node.Label;
|
|
@@ -172,17 +248,33 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
172
248
|
this.emitConfigChanged();
|
|
173
249
|
this.cdr.detectChanges();
|
|
174
250
|
}
|
|
251
|
+
/** @deprecated Use {@link OnQuerySelection}. */
|
|
252
|
+
onQuerySelection(node) {
|
|
253
|
+
return this.OnQuerySelection(node);
|
|
254
|
+
}
|
|
255
|
+
OnParameterLayoutChange() {
|
|
256
|
+
this.emitConfigChanged();
|
|
257
|
+
}
|
|
258
|
+
/** @deprecated Use {@link OnParameterLayoutChange}. */
|
|
175
259
|
onParameterLayoutChange() {
|
|
260
|
+
return this.OnParameterLayoutChange();
|
|
261
|
+
}
|
|
262
|
+
OnAutoRefreshChange() {
|
|
176
263
|
this.emitConfigChanged();
|
|
177
264
|
}
|
|
265
|
+
/** @deprecated Use {@link OnAutoRefreshChange}. */
|
|
178
266
|
onAutoRefreshChange() {
|
|
267
|
+
return this.OnAutoRefreshChange();
|
|
268
|
+
}
|
|
269
|
+
OnOptionChange() {
|
|
179
270
|
this.emitConfigChanged();
|
|
180
271
|
}
|
|
272
|
+
/** @deprecated Use {@link OnOptionChange}. */
|
|
181
273
|
onOptionChange() {
|
|
182
|
-
this.
|
|
274
|
+
return this.OnOptionChange();
|
|
183
275
|
}
|
|
184
|
-
|
|
185
|
-
switch (this.
|
|
276
|
+
GetParameterLayoutDescription() {
|
|
277
|
+
switch (this.ParameterLayout) {
|
|
186
278
|
case 'sidebar':
|
|
187
279
|
return 'Parameters displayed in a collapsible sidebar';
|
|
188
280
|
case 'dialog':
|
|
@@ -191,12 +283,16 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
191
283
|
return 'Parameters displayed in the header area above results';
|
|
192
284
|
}
|
|
193
285
|
}
|
|
286
|
+
/** @deprecated Use {@link GetParameterLayoutDescription}. */
|
|
287
|
+
getParameterLayoutDescription() {
|
|
288
|
+
return this.GetParameterLayoutDescription();
|
|
289
|
+
}
|
|
194
290
|
static ɵfac = function QueryConfigPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
195
291
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryConfigPanelComponent, selectors: [["mj-query-config-panel"]], viewQuery: function QueryConfigPanelComponent_Query(rf, ctx) { if (rf & 1) {
|
|
196
292
|
i0.ɵɵviewQuery(_c0, 5);
|
|
197
293
|
} if (rf & 2) {
|
|
198
294
|
let _t;
|
|
199
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
295
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.QueryDropdown = _t.first);
|
|
200
296
|
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 75, vars: 33, 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"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], [1, "optional-tag"], ["type", "text", "id", "partTitle", 1, "form-input", 3, "ngModelChange", "input", "ngModel", "placeholder"], ["Size", "sm", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "config-section-body"], [1, "radio-group", "radio-group--horizontal"], [1, "radio-option", "radio-option--compact"], ["type", "radio", "name", "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"], ["for", "autoRefresh"], [1, "fa-solid", "fa-rotate"], [1, "form-select", 3, "ngModelChange", "change", "ngModel"], [3, "ngValue"], [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"], [1, "fa-solid", "fa-sliders"]], template: function QueryConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
201
297
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
202
298
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "label");
|
|
@@ -353,7 +449,7 @@ export { QueryConfigPanelComponent };
|
|
|
353
449
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryConfigPanelComponent, [{
|
|
354
450
|
type: Component,
|
|
355
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"] }]
|
|
356
|
-
}], () => [{ type: i0.ChangeDetectorRef }], {
|
|
452
|
+
}], () => [{ type: i0.ChangeDetectorRef }], { QueryDropdown: [{
|
|
357
453
|
type: ViewChild,
|
|
358
454
|
args: ['queryDropdown']
|
|
359
455
|
}] }); })();
|
|
@@ -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 // Form fields\n public title = '';\n public queryId = '';\n public queryName = '';\n public showParameterControls = true;\n public parameterLayout: 'header' | 'sidebar' | 'dialog' = 'header';\n public autoRefreshSeconds = 0;\n public showExecutionMetadata = true;\n\n // Track previous selection name for smart title updates\n private previousQueryName = '';\n\n // Collapsible section state\n public showAdvancedOptions = false;\n\n // Validation\n public queryError = '';\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 /**\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 public onParameterLayoutChange(): void {\n this.emitConfigChanged();\n }\n\n public onAutoRefreshChange(): void {\n this.emitConfigChanged();\n }\n\n public onOptionChange(): void {\n this.emitConfigChanged();\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","<!-- 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 <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"]}
|
|
@@ -9,21 +9,65 @@ import * as i0 from "@angular/core";
|
|
|
9
9
|
* Uses tree dropdown for category-based view selection.
|
|
10
10
|
*/
|
|
11
11
|
export declare class ViewConfigPanelComponent extends BaseConfigPanel {
|
|
12
|
-
|
|
12
|
+
ViewDropdown: TreeDropdownComponent;
|
|
13
|
+
/** @deprecated Use {@link ViewDropdown}. */
|
|
14
|
+
get viewDropdown(): TreeDropdownComponent;
|
|
15
|
+
/** @deprecated Use {@link ViewDropdown}. */
|
|
16
|
+
set viewDropdown(value: TreeDropdownComponent);
|
|
13
17
|
title: string;
|
|
14
18
|
entityName: string;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
ViewId: string;
|
|
20
|
+
/** @deprecated Use {@link ViewId}. */
|
|
21
|
+
get viewId(): string;
|
|
22
|
+
/** @deprecated Use {@link ViewId}. */
|
|
23
|
+
set viewId(value: string);
|
|
24
|
+
ViewName: string;
|
|
25
|
+
/** @deprecated Use {@link ViewName}. */
|
|
26
|
+
get viewName(): string;
|
|
27
|
+
/** @deprecated Use {@link ViewName}. */
|
|
28
|
+
set viewName(value: string);
|
|
29
|
+
ExtraFilter: string;
|
|
30
|
+
/** @deprecated Use {@link ExtraFilter}. */
|
|
31
|
+
get extraFilter(): string;
|
|
32
|
+
/** @deprecated Use {@link ExtraFilter}. */
|
|
33
|
+
set extraFilter(value: string);
|
|
34
|
+
DisplayMode: 'grid' | 'cards' | 'timeline' | 'map';
|
|
35
|
+
/** @deprecated Use {@link DisplayMode}. */
|
|
36
|
+
get displayMode(): 'grid' | 'cards' | 'timeline' | 'map';
|
|
37
|
+
/** @deprecated Use {@link DisplayMode}. */
|
|
38
|
+
set displayMode(value: 'grid' | 'cards' | 'timeline' | 'map');
|
|
39
|
+
MapRenderMode: 'point' | 'choropleth' | 'heatmap';
|
|
40
|
+
/** @deprecated Use {@link MapRenderMode}. */
|
|
41
|
+
get mapRenderMode(): 'point' | 'choropleth' | 'heatmap';
|
|
42
|
+
/** @deprecated Use {@link MapRenderMode}. */
|
|
43
|
+
set mapRenderMode(value: 'point' | 'choropleth' | 'heatmap');
|
|
44
|
+
AllowModeSwitch: boolean;
|
|
45
|
+
/** @deprecated Use {@link AllowModeSwitch}. */
|
|
46
|
+
get allowModeSwitch(): boolean;
|
|
47
|
+
/** @deprecated Use {@link AllowModeSwitch}. */
|
|
48
|
+
set allowModeSwitch(value: boolean);
|
|
49
|
+
EnableSelection: boolean;
|
|
50
|
+
/** @deprecated Use {@link EnableSelection}. */
|
|
51
|
+
get enableSelection(): boolean;
|
|
52
|
+
/** @deprecated Use {@link EnableSelection}. */
|
|
53
|
+
set enableSelection(value: boolean);
|
|
22
54
|
selectionMode: 'none' | 'single' | 'multiple';
|
|
23
55
|
private previousViewName;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
56
|
+
ShowDisplayOptions: boolean;
|
|
57
|
+
/** @deprecated Use {@link ShowDisplayOptions}. */
|
|
58
|
+
get showDisplayOptions(): boolean;
|
|
59
|
+
/** @deprecated Use {@link ShowDisplayOptions}. */
|
|
60
|
+
set showDisplayOptions(value: boolean);
|
|
61
|
+
ShowAdvancedOptions: boolean;
|
|
62
|
+
/** @deprecated Use {@link ShowAdvancedOptions}. */
|
|
63
|
+
get showAdvancedOptions(): boolean;
|
|
64
|
+
/** @deprecated Use {@link ShowAdvancedOptions}. */
|
|
65
|
+
set showAdvancedOptions(value: boolean);
|
|
66
|
+
ViewError: string;
|
|
67
|
+
/** @deprecated Use {@link ViewError}. */
|
|
68
|
+
get viewError(): string;
|
|
69
|
+
/** @deprecated Use {@link ViewError}. */
|
|
70
|
+
set viewError(value: string);
|
|
27
71
|
ViewCategoryConfig: TreeBranchConfig;
|
|
28
72
|
ViewLeafConfig: TreeLeafConfig;
|
|
29
73
|
constructor(cdr: ChangeDetectorRef);
|
|
@@ -39,16 +83,30 @@ export declare class ViewConfigPanelComponent extends BaseConfigPanel {
|
|
|
39
83
|
};
|
|
40
84
|
getDefaultTitle(): string;
|
|
41
85
|
getTitle(): string;
|
|
86
|
+
OnTitleChange(): void;
|
|
87
|
+
/** @deprecated Use {@link OnTitleChange}. */
|
|
42
88
|
onTitleChange(): void;
|
|
43
89
|
/**
|
|
44
90
|
* Handle view selection from tree dropdown
|
|
45
91
|
*/
|
|
92
|
+
OnViewSelection(node: TreeNode | TreeNode[] | null): void;
|
|
93
|
+
/** @deprecated Use {@link OnViewSelection}. */
|
|
46
94
|
onViewSelection(node: TreeNode | TreeNode[] | null): void;
|
|
95
|
+
OnEntityChange(): void;
|
|
96
|
+
/** @deprecated Use {@link OnEntityChange}. */
|
|
47
97
|
onEntityChange(): void;
|
|
98
|
+
OnDisplayModeChange(): void;
|
|
99
|
+
/** @deprecated Use {@link OnDisplayModeChange}. */
|
|
48
100
|
onDisplayModeChange(): void;
|
|
101
|
+
OnOptionChange(): void;
|
|
102
|
+
/** @deprecated Use {@link OnOptionChange}. */
|
|
49
103
|
onOptionChange(): void;
|
|
104
|
+
OnSelectionModeChange(): void;
|
|
105
|
+
/** @deprecated Use {@link OnSelectionModeChange}. */
|
|
50
106
|
onSelectionModeChange(): void;
|
|
51
107
|
onFilterChange(): void;
|
|
108
|
+
GetDisplayModeDescription(): string;
|
|
109
|
+
/** @deprecated Use {@link GetDisplayModeDescription}. */
|
|
52
110
|
getDisplayModeDescription(): string;
|
|
53
111
|
static ɵfac: i0.ɵɵFactoryDeclaration<ViewConfigPanelComponent, never>;
|
|
54
112
|
static ɵcmp: i0.ɵɵComponentDeclaration<ViewConfigPanelComponent, "mj-dashboard-view-config-panel", never, {}, {}, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/view-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,qBAAqB,EACxB,MAAM,0BAA0B,CAAC;;AAElC;;;GAGG;AACH,qBAOa,wBAAyB,SAAQ,eAAe;IAE9B,YAAY,EAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"view-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/view-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,qBAAqB,EACxB,MAAM,0BAA0B,CAAC;;AAElC;;;GAGG;AACH,qBAOa,wBAAyB,SAAQ,eAAe;IAE9B,YAAY,EAAG,qBAAqB,CAAC;IAEhE,4CAA4C;IAC5C,IAAI,YAAY,IAAI,qBAAqB,CAExC;IACD,4CAA4C;IAC5C,IAAI,YAAY,CAAC,KAAK,EAAE,qBAAqB,EAE5C;IAGM,KAAK,SAAM;IACX,UAAU,SAAM;IAChB,MAAM,SAAM;IAEnB,sCAAsC;IACtC,IAAW,MAAM,WAEhB;IACD,sCAAsC;IACtC,IAAW,MAAM,CAAC,KAAK,QAAA,EAEtB;IACM,QAAQ,SAAM;IAErB,wCAAwC;IACxC,IAAW,QAAQ,WAElB;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,QAAA,EAExB;IACM,WAAW,SAAM;IAExB,2CAA2C;IAC3C,IAAW,WAAW,WAErB;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,QAAA,EAE3B;IACM,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAU;IAEnE,2CAA2C;IAC3C,IAAW,WAAW,IAAI,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAE9D;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,EAElE;IACM,aAAa,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAAW;IAEnE,6CAA6C;IAC7C,IAAW,aAAa,IAAI,OAAO,GAAG,YAAY,GAAG,SAAS,CAE7D;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,EAEjE;IACM,eAAe,UAAQ;IAE9B,+CAA+C;IAC/C,IAAW,eAAe,YAEzB;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,SAAA,EAE/B;IACM,eAAe,UAAQ;IAE9B,+CAA+C;IAC/C,IAAW,eAAe,YAEzB;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,SAAA,EAE/B;IACM,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAY;IAGhE,OAAO,CAAC,gBAAgB,CAAM;IAGvB,kBAAkB,UAAS;IAElC,kDAAkD;IAClD,IAAW,kBAAkB,YAE5B;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAK,SAAA,EAElC;IACM,mBAAmB,UAAS;IAEnC,mDAAmD;IACnD,IAAW,mBAAmB,YAE7B;IACD,mDAAmD;IACnD,IAAW,mBAAmB,CAAC,KAAK,SAAA,EAEnC;IAGM,SAAS,SAAM;IAEtB,yCAAyC;IACzC,IAAW,SAAS,WAEnB;IACD,yCAAyC;IACzC,IAAW,SAAS,CAAC,KAAK,QAAA,EAEzB;IAGM,kBAAkB,EAAE,gBAAgB,CAQzC;IAEK,cAAc,EAAE,cAAc,CAQnC;gBAEU,GAAG,EAAE,iBAAiB;IAIlC;;OAEG;IACH,IAAW,WAAW,IAAI,YAAY,GAAG,IAAI,CAE5C;IAEM,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IA4BhD,WAAW,IAAI,WAAW;IAcjB,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAczD,eAAe,IAAI,MAAM;IAUzB,QAAQ,IAAI,MAAM;IAKlB,aAAa,IAAI,IAAI;IAI5B,6CAA6C;IACtC,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACI,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IAgChE,+CAA+C;IACxC,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IAIzD,cAAc,IAAI,IAAI;IAK7B,8CAA8C;IACvC,cAAc,IAAI,IAAI;IAItB,mBAAmB,IAAI,IAAI;IAIlC,mDAAmD;IAC5C,mBAAmB,IAAI,IAAI;IAI3B,cAAc,IAAI,IAAI;IAI7B,8CAA8C;IACvC,cAAc,IAAI,IAAI;IAItB,qBAAqB,IAAI,IAAI;IAIpC,qDAAqD;IAC9C,qBAAqB,IAAI,IAAI;IAI7B,cAAc,IAAI,IAAI;IAKtB,yBAAyB,IAAI,MAAM;IAa1C,yDAAyD;IAClD,yBAAyB,IAAI,MAAM;yCA7UjC,wBAAwB;2CAAxB,wBAAwB;CAgVpC"}
|