@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.
Files changed (60) hide show
  1. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +58 -8
  2. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
  3. package/dist/lib/config-dialogs/confirm-dialog.component.js +119 -17
  4. package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
  5. package/dist/lib/config-panels/artifact-config-panel.component.d.ts +63 -11
  6. package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
  7. package/dist/lib/config-panels/artifact-config-panel.component.js +152 -48
  8. package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
  9. package/dist/lib/config-panels/query-config-panel.component.d.ts +57 -9
  10. package/dist/lib/config-panels/query-config-panel.component.d.ts.map +1 -1
  11. package/dist/lib/config-panels/query-config-panel.component.js +142 -46
  12. package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
  13. package/dist/lib/config-panels/view-config-panel.component.d.ts +69 -11
  14. package/dist/lib/config-panels/view-config-panel.component.d.ts.map +1 -1
  15. package/dist/lib/config-panels/view-config-panel.component.js +165 -49
  16. package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
  17. package/dist/lib/config-panels/weburl-config-panel.component.d.ts +42 -6
  18. package/dist/lib/config-panels/weburl-config-panel.component.d.ts.map +1 -1
  19. package/dist/lib/config-panels/weburl-config-panel.component.js +113 -41
  20. package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
  21. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
  22. package/dist/lib/dashboard-browser/dashboard-browser.component.js +7 -4
  23. package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
  24. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +163 -12
  25. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
  26. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +332 -78
  27. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
  28. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +63 -9
  29. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
  30. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +172 -66
  31. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
  32. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +11 -1
  33. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
  34. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +30 -10
  35. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
  36. package/dist/lib/models/dashboard-types.d.ts +8 -0
  37. package/dist/lib/models/dashboard-types.d.ts.map +1 -1
  38. package/dist/lib/models/dashboard-types.js +21 -5
  39. package/dist/lib/models/dashboard-types.js.map +1 -1
  40. package/dist/lib/parts/artifact-part.component.d.ts +63 -7
  41. package/dist/lib/parts/artifact-part.component.d.ts.map +1 -1
  42. package/dist/lib/parts/artifact-part.component.js +98 -22
  43. package/dist/lib/parts/artifact-part.component.js.map +1 -1
  44. package/dist/lib/parts/query-part.component.d.ts +26 -4
  45. package/dist/lib/parts/query-part.component.d.ts.map +1 -1
  46. package/dist/lib/parts/query-part.component.js +62 -18
  47. package/dist/lib/parts/query-part.component.js.map +1 -1
  48. package/dist/lib/parts/view-part.component.d.ts +21 -3
  49. package/dist/lib/parts/view-part.component.d.ts.map +1 -1
  50. package/dist/lib/parts/view-part.component.js +55 -19
  51. package/dist/lib/parts/view-part.component.js.map +1 -1
  52. package/dist/lib/parts/weburl-part.component.d.ts +29 -5
  53. package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
  54. package/dist/lib/parts/weburl-part.component.js +63 -15
  55. package/dist/lib/parts/weburl-part.component.js.map +1 -1
  56. package/dist/lib/services/golden-layout-wrapper.service.d.ts +65 -5
  57. package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
  58. package/dist/lib/services/golden-layout-wrapper.service.js +135 -27
  59. package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
  60. package/package.json +13 -13
@@ -117,25 +117,113 @@ function ViewConfigPanelComponent_ng_template_78_Template(rf, ctx) { if (rf & 1)
117
117
  */
118
118
  let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfigPanel {
119
119
  // ViewChild reference
120
- viewDropdown;
120
+ ViewDropdown;
121
+ /** @deprecated Use {@link ViewDropdown}. */
122
+ get viewDropdown() {
123
+ return this.ViewDropdown;
124
+ }
125
+ /** @deprecated Use {@link ViewDropdown}. */
126
+ set viewDropdown(value) {
127
+ this.ViewDropdown = value;
128
+ }
121
129
  // Form fields
122
130
  title = '';
123
131
  entityName = '';
124
- viewId = '';
125
- viewName = '';
126
- extraFilter = '';
127
- displayMode = 'grid';
128
- mapRenderMode = 'point';
129
- allowModeSwitch = true;
130
- enableSelection = true;
132
+ ViewId = '';
133
+ /** @deprecated Use {@link ViewId}. */
134
+ get viewId() {
135
+ return this.ViewId;
136
+ }
137
+ /** @deprecated Use {@link ViewId}. */
138
+ set viewId(value) {
139
+ this.ViewId = value;
140
+ }
141
+ ViewName = '';
142
+ /** @deprecated Use {@link ViewName}. */
143
+ get viewName() {
144
+ return this.ViewName;
145
+ }
146
+ /** @deprecated Use {@link ViewName}. */
147
+ set viewName(value) {
148
+ this.ViewName = value;
149
+ }
150
+ ExtraFilter = '';
151
+ /** @deprecated Use {@link ExtraFilter}. */
152
+ get extraFilter() {
153
+ return this.ExtraFilter;
154
+ }
155
+ /** @deprecated Use {@link ExtraFilter}. */
156
+ set extraFilter(value) {
157
+ this.ExtraFilter = value;
158
+ }
159
+ DisplayMode = 'grid';
160
+ /** @deprecated Use {@link DisplayMode}. */
161
+ get displayMode() {
162
+ return this.DisplayMode;
163
+ }
164
+ /** @deprecated Use {@link DisplayMode}. */
165
+ set displayMode(value) {
166
+ this.DisplayMode = value;
167
+ }
168
+ MapRenderMode = 'point';
169
+ /** @deprecated Use {@link MapRenderMode}. */
170
+ get mapRenderMode() {
171
+ return this.MapRenderMode;
172
+ }
173
+ /** @deprecated Use {@link MapRenderMode}. */
174
+ set mapRenderMode(value) {
175
+ this.MapRenderMode = value;
176
+ }
177
+ AllowModeSwitch = true;
178
+ /** @deprecated Use {@link AllowModeSwitch}. */
179
+ get allowModeSwitch() {
180
+ return this.AllowModeSwitch;
181
+ }
182
+ /** @deprecated Use {@link AllowModeSwitch}. */
183
+ set allowModeSwitch(value) {
184
+ this.AllowModeSwitch = value;
185
+ }
186
+ EnableSelection = true;
187
+ /** @deprecated Use {@link EnableSelection}. */
188
+ get enableSelection() {
189
+ return this.EnableSelection;
190
+ }
191
+ /** @deprecated Use {@link EnableSelection}. */
192
+ set enableSelection(value) {
193
+ this.EnableSelection = value;
194
+ }
131
195
  selectionMode = 'single';
132
196
  // Track previous selection name for smart title updates
133
197
  previousViewName = '';
134
198
  // Collapsible section states
135
- showDisplayOptions = false;
136
- showAdvancedOptions = false;
199
+ ShowDisplayOptions = false;
200
+ /** @deprecated Use {@link ShowDisplayOptions}. */
201
+ get showDisplayOptions() {
202
+ return this.ShowDisplayOptions;
203
+ }
204
+ /** @deprecated Use {@link ShowDisplayOptions}. */
205
+ set showDisplayOptions(value) {
206
+ this.ShowDisplayOptions = value;
207
+ }
208
+ ShowAdvancedOptions = false;
209
+ /** @deprecated Use {@link ShowAdvancedOptions}. */
210
+ get showAdvancedOptions() {
211
+ return this.ShowAdvancedOptions;
212
+ }
213
+ /** @deprecated Use {@link ShowAdvancedOptions}. */
214
+ set showAdvancedOptions(value) {
215
+ this.ShowAdvancedOptions = value;
216
+ }
137
217
  // Validation
138
- viewError = '';
218
+ ViewError = '';
219
+ /** @deprecated Use {@link ViewError}. */
220
+ get viewError() {
221
+ return this.ViewError;
222
+ }
223
+ /** @deprecated Use {@link ViewError}. */
224
+ set viewError(value) {
225
+ this.ViewError = value;
226
+ }
139
227
  // Tree configuration for User View Categories (branches) and User Views (leaves)
140
228
  ViewCategoryConfig = {
141
229
  EntityName: 'MJ: User View Categories',
@@ -162,62 +250,62 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
162
250
  * Get the viewId as a CompositeKey for the tree dropdown
163
251
  */
164
252
  get ViewIdAsKey() {
165
- return this.viewId ? CompositeKey.FromID(this.viewId) : null; // first-pk-ok: viewId is an MJ: User Views record (ViewLeafConfig) — core entity keyed by ID
253
+ return this.ViewId ? CompositeKey.FromID(this.ViewId) : null; // first-pk-ok: viewId is an MJ: User Views record (ViewLeafConfig) — core entity keyed by ID
166
254
  }
167
255
  initFromConfig(config) {
168
256
  if (config && config.type === 'View') {
169
257
  this.entityName = config['entityName'] || '';
170
- this.viewId = config['viewId'] || '';
171
- this.extraFilter = config['extraFilter'] || '';
172
- this.displayMode = config['displayMode'] || 'grid';
173
- this.mapRenderMode = config['mapRenderMode'] || 'point';
174
- this.allowModeSwitch = config['allowModeSwitch'] ?? true;
175
- this.enableSelection = config['enableSelection'] ?? true;
258
+ this.ViewId = config['viewId'] || '';
259
+ this.ExtraFilter = config['extraFilter'] || '';
260
+ this.DisplayMode = config['displayMode'] || 'grid';
261
+ this.MapRenderMode = config['mapRenderMode'] || 'point';
262
+ this.AllowModeSwitch = config['allowModeSwitch'] ?? true;
263
+ this.EnableSelection = config['enableSelection'] ?? true;
176
264
  this.selectionMode = config['selectionMode'] || 'single';
177
265
  }
178
266
  else {
179
267
  // Defaults for new View panel
180
268
  this.entityName = '';
181
- this.viewId = '';
182
- this.extraFilter = '';
183
- this.displayMode = 'grid';
184
- this.allowModeSwitch = true;
185
- this.enableSelection = true;
269
+ this.ViewId = '';
270
+ this.ExtraFilter = '';
271
+ this.DisplayMode = 'grid';
272
+ this.AllowModeSwitch = true;
273
+ this.EnableSelection = true;
186
274
  this.selectionMode = 'single';
187
275
  }
188
276
  this.title = this.panel?.title || '';
189
- this.viewName = '';
277
+ this.ViewName = '';
190
278
  this.previousViewName = '';
191
- this.viewError = '';
279
+ this.ViewError = '';
192
280
  this.cdr.detectChanges();
193
281
  }
194
282
  buildConfig() {
195
283
  return {
196
284
  type: 'View',
197
285
  entityName: this.entityName.trim() || undefined,
198
- viewId: this.viewId.trim() || undefined,
199
- extraFilter: this.extraFilter.trim() || undefined,
200
- displayMode: this.displayMode,
201
- mapRenderMode: this.displayMode === 'map' ? this.mapRenderMode : undefined,
202
- allowModeSwitch: this.allowModeSwitch,
203
- enableSelection: this.enableSelection,
286
+ viewId: this.ViewId.trim() || undefined,
287
+ extraFilter: this.ExtraFilter.trim() || undefined,
288
+ displayMode: this.DisplayMode,
289
+ mapRenderMode: this.DisplayMode === 'map' ? this.MapRenderMode : undefined,
290
+ allowModeSwitch: this.AllowModeSwitch,
291
+ enableSelection: this.EnableSelection,
204
292
  selectionMode: this.selectionMode
205
293
  };
206
294
  }
207
295
  validate() {
208
296
  const errors = [];
209
- this.viewError = '';
297
+ this.ViewError = '';
210
298
  // At least entity name or view ID should be provided
211
- if (!this.entityName.trim() && !this.viewId.trim()) {
212
- this.viewError = 'Please select a saved view or enter an entity name';
213
- errors.push(this.viewError);
299
+ if (!this.entityName.trim() && !this.ViewId.trim()) {
300
+ this.ViewError = 'Please select a saved view or enter an entity name';
301
+ errors.push(this.ViewError);
214
302
  }
215
303
  this.cdr.detectChanges();
216
304
  return { valid: errors.length === 0, errors };
217
305
  }
218
306
  getDefaultTitle() {
219
- if (this.viewName) {
220
- return this.viewName;
307
+ if (this.ViewName) {
308
+ return this.ViewName;
221
309
  }
222
310
  if (this.entityName) {
223
311
  return this.entityName;
@@ -228,24 +316,28 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
228
316
  return this.title || this.getDefaultTitle();
229
317
  }
230
318
  // Form event handlers
231
- onTitleChange() {
319
+ OnTitleChange() {
232
320
  this.emitConfigChanged();
233
321
  }
322
+ /** @deprecated Use {@link OnTitleChange}. */
323
+ onTitleChange() {
324
+ return this.OnTitleChange();
325
+ }
234
326
  /**
235
327
  * Handle view selection from tree dropdown
236
328
  */
237
- onViewSelection(node) {
329
+ OnViewSelection(node) {
238
330
  // Ignore null/empty selections (these happen during sync, not user interaction)
239
331
  if (!node || (Array.isArray(node) && node.length === 0)) {
240
332
  return;
241
333
  }
242
- this.viewError = '';
334
+ this.ViewError = '';
243
335
  if (!Array.isArray(node)) {
244
336
  // Only accept leaf nodes (actual views, not categories)
245
337
  if (node.Type === 'leaf') {
246
- const oldViewName = this.viewName;
247
- this.viewId = node.ID;
248
- this.viewName = node.Label;
338
+ const oldViewName = this.ViewName;
339
+ this.ViewId = node.ID;
340
+ this.ViewName = node.Label;
249
341
  // Extract entity name from the view data if available
250
342
  if (node.Data && node.Data['Entity']) {
251
343
  this.entityName = String(node.Data['Entity']);
@@ -260,24 +352,44 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
260
352
  this.emitConfigChanged();
261
353
  this.cdr.detectChanges();
262
354
  }
355
+ /** @deprecated Use {@link OnViewSelection}. */
356
+ onViewSelection(node) {
357
+ return this.OnViewSelection(node);
358
+ }
359
+ OnEntityChange() {
360
+ this.ViewError = '';
361
+ this.emitConfigChanged();
362
+ }
363
+ /** @deprecated Use {@link OnEntityChange}. */
263
364
  onEntityChange() {
264
- this.viewError = '';
365
+ return this.OnEntityChange();
366
+ }
367
+ OnDisplayModeChange() {
265
368
  this.emitConfigChanged();
266
369
  }
370
+ /** @deprecated Use {@link OnDisplayModeChange}. */
267
371
  onDisplayModeChange() {
372
+ return this.OnDisplayModeChange();
373
+ }
374
+ OnOptionChange() {
268
375
  this.emitConfigChanged();
269
376
  }
377
+ /** @deprecated Use {@link OnOptionChange}. */
270
378
  onOptionChange() {
379
+ return this.OnOptionChange();
380
+ }
381
+ OnSelectionModeChange() {
271
382
  this.emitConfigChanged();
272
383
  }
384
+ /** @deprecated Use {@link OnSelectionModeChange}. */
273
385
  onSelectionModeChange() {
274
- this.emitConfigChanged();
386
+ return this.OnSelectionModeChange();
275
387
  }
276
388
  onFilterChange() {
277
389
  this.emitConfigChanged();
278
390
  }
279
- getDisplayModeDescription() {
280
- switch (this.displayMode) {
391
+ GetDisplayModeDescription() {
392
+ switch (this.DisplayMode) {
281
393
  case 'cards':
282
394
  return 'Display records as cards in a responsive grid layout';
283
395
  case 'timeline':
@@ -288,12 +400,16 @@ let ViewConfigPanelComponent = class ViewConfigPanelComponent extends BaseConfig
288
400
  return 'Display records in a traditional table/grid format';
289
401
  }
290
402
  }
403
+ /** @deprecated Use {@link GetDisplayModeDescription}. */
404
+ getDisplayModeDescription() {
405
+ return this.GetDisplayModeDescription();
406
+ }
291
407
  static ɵfac = function ViewConfigPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ViewConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
292
408
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewConfigPanelComponent, selectors: [["mj-dashboard-view-config-panel"]], viewQuery: function ViewConfigPanelComponent_Query(rf, ctx) { if (rf & 1) {
293
409
  i0.ɵɵviewQuery(_c0, 5);
294
410
  } if (rf & 2) {
295
411
  let _t;
296
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewDropdown = _t.first);
412
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ViewDropdown = _t.first);
297
413
  } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 86, vars: 35, consts: [["viewDropdown", ""], [1, "config-panel", "config-panel--compact"], [1, "form-group"], [1, "fa-solid", "fa-table"], [1, "optional-tag"], [3, "SelectionChange", "BranchConfig", "LeafConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch"], [1, "form-error"], [1, "form-hint"], [1, "form-hint", "form-hint--selected"], ["for", "entityName"], [1, "fa-solid", "fa-database"], ["type", "text", "id", "entityName", "placeholder", "e.g., Accounts, Contacts, Users", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], ["type", "text", "id", "partTitle", 1, "form-input", 3, "ngModelChange", "input", "ngModel", "placeholder"], ["Size", "sm", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "config-section-body"], [1, "radio-group", "radio-group--horizontal"], [1, "radio-option", "radio-option--compact"], ["type", "radio", "name", "displayMode", "value", "grid", 3, "ngModelChange", "change", "ngModel"], [1, "radio-mark"], [1, "radio-label"], [1, "fa-solid", "fa-table-cells"], ["type", "radio", "name", "displayMode", "value", "cards", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-id-card"], ["type", "radio", "name", "displayMode", "value", "timeline", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-timeline"], ["type", "radio", "name", "displayMode", "value", "map", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-map-location-dot"], [1, "checkbox-group", "checkbox-group--compact"], [1, "checkbox-option", "checkbox-option--compact"], ["type", "checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "checkbox-mark"], [1, "checkbox-label"], ["for", "extraFilter"], ["type", "text", "id", "extraFilter", "placeholder", "e.g., Status = 'Active'", 1, "form-input", 3, "ngModelChange", "input", "ngModel"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-grip"], ["type", "radio", "name", "mapRenderMode", "value", "point", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-map-pin"], ["type", "radio", "name", "mapRenderMode", "value", "choropleth", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-earth-americas"], ["type", "radio", "name", "mapRenderMode", "value", "heatmap", 3, "ngModelChange", "change", "ngModel"], [1, "fa-solid", "fa-fire"], ["for", "selectionMode"], ["id", "selectionMode", 1, "form-select", 3, "ngModelChange", "change", "ngModel"], ["value", "single"], ["value", "multiple"], [1, "fa-solid", "fa-filter"]], template: function ViewConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
298
414
  const _r1 = i0.ɵɵgetCurrentView();
299
415
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "label");
@@ -468,7 +584,7 @@ export { ViewConfigPanelComponent };
468
584
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewConfigPanelComponent, [{
469
585
  type: Component,
470
586
  args: [{ standalone: false, selector: 'mj-dashboard-view-config-panel', template: "<!-- View Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- View Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-table\"></i>\n Select View\n <span class=\"optional-tag\">(or enter entity below)</span>\n </label>\n <mj-tree-dropdown\n #viewDropdown\n [BranchConfig]=\"ViewCategoryConfig\"\n [LeafConfig]=\"ViewLeafConfig\"\n [Value]=\"ViewIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse saved views...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onViewSelection($event)\"\n [class.error]=\"viewError\">\n </mj-tree-dropdown>\n @if (viewError) {\n <span class=\"form-error\">{{ viewError }}</span>\n }\n @if (!viewError && !viewId && !entityName) {\n <span class=\"form-hint\">\n Select a saved view or enter an entity name below\n </span>\n }\n @if (!viewError && viewId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ viewName }}\n </span>\n }\n </div>\n\n <!-- Entity Name (Alternative) -->\n <div class=\"form-group\">\n <label for=\"entityName\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Name\n <span class=\"optional-tag\">(alternative to view)</span>\n </label>\n <input\n type=\"text\"\n id=\"entityName\"\n [(ngModel)]=\"entityName\"\n (input)=\"onEntityChange()\"\n placeholder=\"e.g., Accounts, Contacts, Users\"\n class=\"form-input\">\n <span class=\"form-hint\">\n Use this to display all records from an entity without a saved view\n </span>\n </div>\n\n <!-- Title (Optional) -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"viewName || entityName ? 'Default: ' + (viewName || entityName) : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use view/entity name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showDisplayOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grip\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Display Mode -->\n <div class=\"form-group\">\n <label>Display Mode</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'grid'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"grid\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-cells\"></i>\n Grid\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'cards'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"cards\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-id-card\"></i>\n Cards\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'timeline'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"timeline\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-timeline\"></i>\n Timeline\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'map'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"map\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n Map\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getDisplayModeDescription() }}</span>\n </div>\n <!-- Map Render Mode (only shown when map is selected) -->\n @if (displayMode === 'map') {\n <div class=\"form-group\">\n <label>Map Style</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'point'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"point\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-pin\"></i>\n Points\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'choropleth'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"choropleth\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-earth-americas\"></i>\n Regions\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'heatmap'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"heatmap\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-fire\"></i>\n Heatmap\n </span>\n </label>\n </div>\n </div>\n }\n <!-- Selection Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowModeSwitch\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Allow Mode Switch</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"enableSelection\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Enable Selection</span>\n </label>\n </div>\n </div>\n <!-- Selection Mode -->\n @if (enableSelection) {\n <div class=\"form-group\">\n <label for=\"selectionMode\">Selection Mode</label>\n <select\n id=\"selectionMode\"\n class=\"form-select\"\n [(ngModel)]=\"selectionMode\"\n (change)=\"onSelectionModeChange()\">\n <option value=\"single\">Single Selection</option>\n <option value=\"multiple\">Multiple Selection</option>\n </select>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Advanced Filtering -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-filter\"></i>\n Advanced Filtering\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Extra Filter -->\n <div class=\"form-group\">\n <label for=\"extraFilter\">\n Extra Filter\n </label>\n <input\n type=\"text\"\n id=\"extraFilter\"\n [(ngModel)]=\"extraFilter\"\n (input)=\"onFilterChange()\"\n placeholder=\"e.g., Status = 'Active'\"\n class=\"form-input\">\n <span class=\"form-hint\">\n SQL WHERE clause to filter records (applied in addition to view filters)\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n", styles: ["/**\n * Shared styles for Config Panels (form content only, no dialog chrome)\n */\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.config-panel {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n/* ========================================\n Form Groups\n ======================================== */\n\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group > label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group > label i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group > label .required {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Form Inputs\n ======================================== */\n\n.form-input {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action .form-input {\n flex: 1;\n}\n\n.input-action-btn {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Form Hints & Errors\n ======================================== */\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n/* ========================================\n Radio Group\n ======================================== */\n\n.radio-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option input[type=\"radio\"] {\n display: none;\n}\n\n.radio-mark {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected .radio-mark {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected .radio-mark::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n/* ========================================\n Checkbox Group\n ======================================== */\n\n.checkbox-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option input[type=\"checkbox\"] {\n display: none;\n}\n\n.checkbox-mark {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option input:checked + .checkbox-mark {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option input:checked + .checkbox-mark::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Select/Dropdown\n ======================================== */\n\n.form-select {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* ========================================\n Compact Panel Variant\n ======================================== */\n\n.config-panel--compact {\n gap: 16px;\n}\n\n.config-panel--compact .form-group {\n gap: 8px;\n}\n\n.config-panel--compact .form-input {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact .form-select {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n/* ========================================\n Optional Tag\n ======================================== */\n\n.optional-tag {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* ========================================\n Selected Hint (Success State)\n ======================================== */\n\n.form-hint--selected {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected i {\n color: var(--mj-status-success);\n}\n\n/* ========================================\n Config-panel accordion body\n (the collapsible sections now use <mj-accordion-panel>;\n this only lays out the form-groups inside the projected body)\n ======================================== */\n\n.config-section-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* ========================================\n Horizontal Radio Group\n ======================================== */\n\n.radio-group--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact .radio-label {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact .radio-label i {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact .radio-mark {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected .radio-mark::after {\n width: 8px;\n height: 8px;\n}\n\n/* ========================================\n Compact Checkbox Group\n ======================================== */\n\n.checkbox-group--compact {\n gap: 4px;\n}\n\n.checkbox-option--compact {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact .checkbox-mark {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact .checkbox-label {\n font-size: 13px;\n}\n\n/* ========================================\n Tree Dropdown Error State\n ======================================== */\n\nmj-tree-dropdown.error {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}\n"] }]
471
- }], () => [{ type: i0.ChangeDetectorRef }], { viewDropdown: [{
587
+ }], () => [{ type: i0.ChangeDetectorRef }], { ViewDropdown: [{
472
588
  type: ViewChild,
473
589
  args: ['viewDropdown']
474
590
  }] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"view-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/view-config-panel.component.ts","../../../src/lib/config-panels/view-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 View parts.\n * Uses tree dropdown for category-based view selection.\n */\n@RegisterClass(BaseConfigPanel, 'ViewPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-view-config-panel',\n templateUrl: './view-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class ViewConfigPanelComponent extends BaseConfigPanel {\n // ViewChild reference\n @ViewChild('viewDropdown') viewDropdown!: TreeDropdownComponent;\n\n // Form fields\n public title = '';\n public entityName = '';\n public viewId = '';\n public viewName = '';\n public extraFilter = '';\n public displayMode: 'grid' | 'cards' | 'timeline' | 'map' = 'grid';\n public mapRenderMode: 'point' | 'choropleth' | 'heatmap' = 'point';\n public allowModeSwitch = true;\n public enableSelection = true;\n public selectionMode: 'none' | 'single' | 'multiple' = 'single';\n\n // Track previous selection name for smart title updates\n private previousViewName = '';\n\n // Collapsible section states\n public showDisplayOptions = false;\n public showAdvancedOptions = false;\n\n // Validation\n public viewError = '';\n\n // Tree configuration for User View Categories (branches) and User Views (leaves)\n public ViewCategoryConfig: TreeBranchConfig = {\n EntityName: 'MJ: User View 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 ViewLeafConfig: TreeLeafConfig = {\n EntityName: 'MJ: User Views',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: 'CategoryID',\n DefaultIcon: 'fa-solid fa-table',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n /**\n * Get the viewId as a CompositeKey for the tree dropdown\n */\n public get ViewIdAsKey(): CompositeKey | null {\n return this.viewId ? CompositeKey.FromID(this.viewId) : null; // first-pk-ok: viewId is an MJ: User Views record (ViewLeafConfig) — core entity keyed by ID\n }\n\n public initFromConfig(config: PanelConfig | null): void {\n if (config && config.type === 'View') {\n this.entityName = (config['entityName'] as string) || '';\n this.viewId = (config['viewId'] as string) || '';\n this.extraFilter = (config['extraFilter'] as string) || '';\n this.displayMode = (config['displayMode'] as 'grid' | 'cards' | 'timeline' | 'map') || 'grid';\n this.mapRenderMode = (config['mapRenderMode'] as 'point' | 'choropleth' | 'heatmap') || 'point';\n this.allowModeSwitch = (config['allowModeSwitch'] as boolean) ?? true;\n this.enableSelection = (config['enableSelection'] as boolean) ?? true;\n this.selectionMode = (config['selectionMode'] as 'none' | 'single' | 'multiple') || 'single';\n } else {\n // Defaults for new View panel\n this.entityName = '';\n this.viewId = '';\n this.extraFilter = '';\n this.displayMode = 'grid';\n this.allowModeSwitch = true;\n this.enableSelection = true;\n this.selectionMode = 'single';\n }\n\n this.title = this.panel?.title || '';\n this.viewName = '';\n this.previousViewName = '';\n this.viewError = '';\n this.cdr.detectChanges();\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'View',\n entityName: this.entityName.trim() || undefined,\n viewId: this.viewId.trim() || undefined,\n extraFilter: this.extraFilter.trim() || undefined,\n displayMode: this.displayMode,\n mapRenderMode: this.displayMode === 'map' ? this.mapRenderMode : undefined,\n allowModeSwitch: this.allowModeSwitch,\n enableSelection: this.enableSelection,\n selectionMode: this.selectionMode\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.viewError = '';\n\n // At least entity name or view ID should be provided\n if (!this.entityName.trim() && !this.viewId.trim()) {\n this.viewError = 'Please select a saved view or enter an entity name';\n errors.push(this.viewError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.viewName) {\n return this.viewName;\n }\n if (this.entityName) {\n return this.entityName;\n }\n return 'View';\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 view selection from tree dropdown\n */\n public onViewSelection(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.viewError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual views, not categories)\n if (node.Type === 'leaf') {\n const oldViewName = this.viewName;\n this.viewId = node.ID;\n this.viewName = node.Label;\n\n // Extract entity name from the view data if available\n if (node.Data && node.Data['Entity']) {\n this.entityName = String(node.Data['Entity']);\n }\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldViewName || this.title === this.previousViewName) {\n this.title = node.Label;\n }\n this.previousViewName = node.Label;\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n public onEntityChange(): void {\n this.viewError = '';\n this.emitConfigChanged();\n }\n\n public onDisplayModeChange(): void {\n this.emitConfigChanged();\n }\n\n public onOptionChange(): void {\n this.emitConfigChanged();\n }\n\n public onSelectionModeChange(): void {\n this.emitConfigChanged();\n }\n\n public onFilterChange(): void {\n this.emitConfigChanged();\n }\n\n\n public getDisplayModeDescription(): string {\n switch (this.displayMode) {\n case 'cards':\n return 'Display records as cards in a responsive grid layout';\n case 'timeline':\n return 'Display records chronologically along a timeline';\n case 'map':\n return 'Display geo-coded records on an interactive map';\n default:\n return 'Display records in a traditional table/grid format';\n }\n }\n}\n","<!-- View Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- View Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-table\"></i>\n Select View\n <span class=\"optional-tag\">(or enter entity below)</span>\n </label>\n <mj-tree-dropdown\n #viewDropdown\n [BranchConfig]=\"ViewCategoryConfig\"\n [LeafConfig]=\"ViewLeafConfig\"\n [Value]=\"ViewIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse saved views...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onViewSelection($event)\"\n [class.error]=\"viewError\">\n </mj-tree-dropdown>\n @if (viewError) {\n <span class=\"form-error\">{{ viewError }}</span>\n }\n @if (!viewError && !viewId && !entityName) {\n <span class=\"form-hint\">\n Select a saved view or enter an entity name below\n </span>\n }\n @if (!viewError && viewId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ viewName }}\n </span>\n }\n </div>\n\n <!-- Entity Name (Alternative) -->\n <div class=\"form-group\">\n <label for=\"entityName\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Name\n <span class=\"optional-tag\">(alternative to view)</span>\n </label>\n <input\n type=\"text\"\n id=\"entityName\"\n [(ngModel)]=\"entityName\"\n (input)=\"onEntityChange()\"\n placeholder=\"e.g., Accounts, Contacts, Users\"\n class=\"form-input\">\n <span class=\"form-hint\">\n Use this to display all records from an entity without a saved view\n </span>\n </div>\n\n <!-- Title (Optional) -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"viewName || entityName ? 'Default: ' + (viewName || entityName) : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use view/entity name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showDisplayOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grip\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Display Mode -->\n <div class=\"form-group\">\n <label>Display Mode</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'grid'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"grid\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-cells\"></i>\n Grid\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'cards'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"cards\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-id-card\"></i>\n Cards\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'timeline'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"timeline\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-timeline\"></i>\n Timeline\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'map'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"map\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n Map\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getDisplayModeDescription() }}</span>\n </div>\n <!-- Map Render Mode (only shown when map is selected) -->\n @if (displayMode === 'map') {\n <div class=\"form-group\">\n <label>Map Style</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'point'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"point\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-pin\"></i>\n Points\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'choropleth'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"choropleth\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-earth-americas\"></i>\n Regions\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'heatmap'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"heatmap\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-fire\"></i>\n Heatmap\n </span>\n </label>\n </div>\n </div>\n }\n <!-- Selection Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowModeSwitch\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Allow Mode Switch</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"enableSelection\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Enable Selection</span>\n </label>\n </div>\n </div>\n <!-- Selection Mode -->\n @if (enableSelection) {\n <div class=\"form-group\">\n <label for=\"selectionMode\">Selection Mode</label>\n <select\n id=\"selectionMode\"\n class=\"form-select\"\n [(ngModel)]=\"selectionMode\"\n (change)=\"onSelectionModeChange()\">\n <option value=\"single\">Single Selection</option>\n <option value=\"multiple\">Multiple Selection</option>\n </select>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Advanced Filtering -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-filter\"></i>\n Advanced Filtering\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Extra Filter -->\n <div class=\"form-group\">\n <label for=\"extraFilter\">\n Extra Filter\n </label>\n <input\n type=\"text\"\n id=\"extraFilter\"\n [(ngModel)]=\"extraFilter\"\n (input)=\"onFilterChange()\"\n placeholder=\"e.g., Status = 'Active'\"\n class=\"form-input\">\n <span class=\"form-hint\">\n SQL WHERE clause to filter records (applied in addition to view filters)\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
1
+ {"version":3,"file":"view-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/view-config-panel.component.ts","../../../src/lib/config-panels/view-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 View parts.\n * Uses tree dropdown for category-based view selection.\n */\n@RegisterClass(BaseConfigPanel, 'ViewPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-view-config-panel',\n templateUrl: './view-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class ViewConfigPanelComponent extends BaseConfigPanel {\n // ViewChild reference\n @ViewChild('viewDropdown') ViewDropdown!: TreeDropdownComponent;\n\n /** @deprecated Use {@link ViewDropdown}. */\n get viewDropdown(): TreeDropdownComponent {\n return this.ViewDropdown;\n }\n /** @deprecated Use {@link ViewDropdown}. */\n set viewDropdown(value: TreeDropdownComponent) {\n this.ViewDropdown = value;\n }\n\n // Form fields\n public title = '';\n public entityName = '';\n public ViewId = '';\n\n /** @deprecated Use {@link ViewId}. */\n public get viewId() {\n return this.ViewId;\n }\n /** @deprecated Use {@link ViewId}. */\n public set viewId(value) {\n this.ViewId = value;\n }\n public ViewName = '';\n\n /** @deprecated Use {@link ViewName}. */\n public get viewName() {\n return this.ViewName;\n }\n /** @deprecated Use {@link ViewName}. */\n public set viewName(value) {\n this.ViewName = value;\n }\n public ExtraFilter = '';\n\n /** @deprecated Use {@link ExtraFilter}. */\n public get extraFilter() {\n return this.ExtraFilter;\n }\n /** @deprecated Use {@link ExtraFilter}. */\n public set extraFilter(value) {\n this.ExtraFilter = value;\n }\n public DisplayMode: 'grid' | 'cards' | 'timeline' | 'map' = 'grid';\n\n /** @deprecated Use {@link DisplayMode}. */\n public get displayMode(): 'grid' | 'cards' | 'timeline' | 'map' {\n return this.DisplayMode;\n }\n /** @deprecated Use {@link DisplayMode}. */\n public set displayMode(value: 'grid' | 'cards' | 'timeline' | 'map') {\n this.DisplayMode = value;\n }\n public MapRenderMode: 'point' | 'choropleth' | 'heatmap' = 'point';\n\n /** @deprecated Use {@link MapRenderMode}. */\n public get mapRenderMode(): 'point' | 'choropleth' | 'heatmap' {\n return this.MapRenderMode;\n }\n /** @deprecated Use {@link MapRenderMode}. */\n public set mapRenderMode(value: 'point' | 'choropleth' | 'heatmap') {\n this.MapRenderMode = value;\n }\n public AllowModeSwitch = true;\n\n /** @deprecated Use {@link AllowModeSwitch}. */\n public get allowModeSwitch() {\n return this.AllowModeSwitch;\n }\n /** @deprecated Use {@link AllowModeSwitch}. */\n public set allowModeSwitch(value) {\n this.AllowModeSwitch = value;\n }\n public EnableSelection = true;\n\n /** @deprecated Use {@link EnableSelection}. */\n public get enableSelection() {\n return this.EnableSelection;\n }\n /** @deprecated Use {@link EnableSelection}. */\n public set enableSelection(value) {\n this.EnableSelection = value;\n }\n public selectionMode: 'none' | 'single' | 'multiple' = 'single';\n\n // Track previous selection name for smart title updates\n private previousViewName = '';\n\n // Collapsible section states\n public ShowDisplayOptions = false;\n\n /** @deprecated Use {@link ShowDisplayOptions}. */\n public get showDisplayOptions() {\n return this.ShowDisplayOptions;\n }\n /** @deprecated Use {@link ShowDisplayOptions}. */\n public set showDisplayOptions(value) {\n this.ShowDisplayOptions = value;\n }\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 ViewError = '';\n\n /** @deprecated Use {@link ViewError}. */\n public get viewError() {\n return this.ViewError;\n }\n /** @deprecated Use {@link ViewError}. */\n public set viewError(value) {\n this.ViewError = value;\n }\n\n // Tree configuration for User View Categories (branches) and User Views (leaves)\n public ViewCategoryConfig: TreeBranchConfig = {\n EntityName: 'MJ: User View 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 ViewLeafConfig: TreeLeafConfig = {\n EntityName: 'MJ: User Views',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: 'CategoryID',\n DefaultIcon: 'fa-solid fa-table',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n /**\n * Get the viewId as a CompositeKey for the tree dropdown\n */\n public get ViewIdAsKey(): CompositeKey | null {\n return this.ViewId ? CompositeKey.FromID(this.ViewId) : null; // first-pk-ok: viewId is an MJ: User Views record (ViewLeafConfig) — core entity keyed by ID\n }\n\n public initFromConfig(config: PanelConfig | null): void {\n if (config && config.type === 'View') {\n this.entityName = (config['entityName'] as string) || '';\n this.ViewId = (config['viewId'] as string) || '';\n this.ExtraFilter = (config['extraFilter'] as string) || '';\n this.DisplayMode = (config['displayMode'] as 'grid' | 'cards' | 'timeline' | 'map') || 'grid';\n this.MapRenderMode = (config['mapRenderMode'] as 'point' | 'choropleth' | 'heatmap') || 'point';\n this.AllowModeSwitch = (config['allowModeSwitch'] as boolean) ?? true;\n this.EnableSelection = (config['enableSelection'] as boolean) ?? true;\n this.selectionMode = (config['selectionMode'] as 'none' | 'single' | 'multiple') || 'single';\n } else {\n // Defaults for new View panel\n this.entityName = '';\n this.ViewId = '';\n this.ExtraFilter = '';\n this.DisplayMode = 'grid';\n this.AllowModeSwitch = true;\n this.EnableSelection = true;\n this.selectionMode = 'single';\n }\n\n this.title = this.panel?.title || '';\n this.ViewName = '';\n this.previousViewName = '';\n this.ViewError = '';\n this.cdr.detectChanges();\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'View',\n entityName: this.entityName.trim() || undefined,\n viewId: this.ViewId.trim() || undefined,\n extraFilter: this.ExtraFilter.trim() || undefined,\n displayMode: this.DisplayMode,\n mapRenderMode: this.DisplayMode === 'map' ? this.MapRenderMode : undefined,\n allowModeSwitch: this.AllowModeSwitch,\n enableSelection: this.EnableSelection,\n selectionMode: this.selectionMode\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.ViewError = '';\n\n // At least entity name or view ID should be provided\n if (!this.entityName.trim() && !this.ViewId.trim()) {\n this.ViewError = 'Please select a saved view or enter an entity name';\n errors.push(this.ViewError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.ViewName) {\n return this.ViewName;\n }\n if (this.entityName) {\n return this.entityName;\n }\n return 'View';\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 view selection from tree dropdown\n */\n public OnViewSelection(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.ViewError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual views, not categories)\n if (node.Type === 'leaf') {\n const oldViewName = this.ViewName;\n this.ViewId = node.ID;\n this.ViewName = node.Label;\n\n // Extract entity name from the view data if available\n if (node.Data && node.Data['Entity']) {\n this.entityName = String(node.Data['Entity']);\n }\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldViewName || this.title === this.previousViewName) {\n this.title = node.Label;\n }\n this.previousViewName = node.Label;\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnViewSelection}. */\n public onViewSelection(node: TreeNode | TreeNode[] | null): void {\n return this.OnViewSelection(node);\n }\n\n public OnEntityChange(): void {\n this.ViewError = '';\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnEntityChange}. */\n public onEntityChange(): void {\n return this.OnEntityChange();\n }\n\n public OnDisplayModeChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnDisplayModeChange}. */\n public onDisplayModeChange(): void {\n return this.OnDisplayModeChange();\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 OnSelectionModeChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnSelectionModeChange}. */\n public onSelectionModeChange(): void {\n return this.OnSelectionModeChange();\n }\n\n public onFilterChange(): void {\n this.emitConfigChanged();\n }\n\n\n public GetDisplayModeDescription(): string {\n switch (this.DisplayMode) {\n case 'cards':\n return 'Display records as cards in a responsive grid layout';\n case 'timeline':\n return 'Display records chronologically along a timeline';\n case 'map':\n return 'Display geo-coded records on an interactive map';\n default:\n return 'Display records in a traditional table/grid format';\n }\n }\n\n /** @deprecated Use {@link GetDisplayModeDescription}. */\n public getDisplayModeDescription(): string {\n return this.GetDisplayModeDescription();\n }\n}\n","<!-- View Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- View Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-table\"></i>\n Select View\n <span class=\"optional-tag\">(or enter entity below)</span>\n </label>\n <mj-tree-dropdown\n #viewDropdown\n [BranchConfig]=\"ViewCategoryConfig\"\n [LeafConfig]=\"ViewLeafConfig\"\n [Value]=\"ViewIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse saved views...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onViewSelection($event)\"\n [class.error]=\"viewError\">\n </mj-tree-dropdown>\n @if (viewError) {\n <span class=\"form-error\">{{ viewError }}</span>\n }\n @if (!viewError && !viewId && !entityName) {\n <span class=\"form-hint\">\n Select a saved view or enter an entity name below\n </span>\n }\n @if (!viewError && viewId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ viewName }}\n </span>\n }\n </div>\n\n <!-- Entity Name (Alternative) -->\n <div class=\"form-group\">\n <label for=\"entityName\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Name\n <span class=\"optional-tag\">(alternative to view)</span>\n </label>\n <input\n type=\"text\"\n id=\"entityName\"\n [(ngModel)]=\"entityName\"\n (input)=\"onEntityChange()\"\n placeholder=\"e.g., Accounts, Contacts, Users\"\n class=\"form-input\">\n <span class=\"form-hint\">\n Use this to display all records from an entity without a saved view\n </span>\n </div>\n\n <!-- Title (Optional) -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"viewName || entityName ? 'Default: ' + (viewName || entityName) : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use view/entity name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showDisplayOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grip\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Display Mode -->\n <div class=\"form-group\">\n <label>Display Mode</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'grid'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"grid\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-table-cells\"></i>\n Grid\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'cards'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"cards\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-id-card\"></i>\n Cards\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'timeline'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"timeline\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-timeline\"></i>\n Timeline\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"displayMode === 'map'\">\n <input\n type=\"radio\"\n name=\"displayMode\"\n value=\"map\"\n [(ngModel)]=\"displayMode\"\n (change)=\"onDisplayModeChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n Map\n </span>\n </label>\n </div>\n <span class=\"form-hint\">{{ getDisplayModeDescription() }}</span>\n </div>\n <!-- Map Render Mode (only shown when map is selected) -->\n @if (displayMode === 'map') {\n <div class=\"form-group\">\n <label>Map Style</label>\n <div class=\"radio-group radio-group--horizontal\">\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'point'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"point\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-map-pin\"></i>\n Points\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'choropleth'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"choropleth\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-earth-americas\"></i>\n Regions\n </span>\n </label>\n <label class=\"radio-option radio-option--compact\" [class.selected]=\"mapRenderMode === 'heatmap'\">\n <input type=\"radio\" name=\"mapRenderMode\" value=\"heatmap\"\n [(ngModel)]=\"mapRenderMode\" (change)=\"onOptionChange()\">\n <span class=\"radio-mark\"></span>\n <span class=\"radio-label\">\n <i class=\"fa-solid fa-fire\"></i>\n Heatmap\n </span>\n </label>\n </div>\n </div>\n }\n <!-- Selection Options -->\n <div class=\"form-group\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"allowModeSwitch\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Allow Mode Switch</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"enableSelection\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Enable Selection</span>\n </label>\n </div>\n </div>\n <!-- Selection Mode -->\n @if (enableSelection) {\n <div class=\"form-group\">\n <label for=\"selectionMode\">Selection Mode</label>\n <select\n id=\"selectionMode\"\n class=\"form-select\"\n [(ngModel)]=\"selectionMode\"\n (change)=\"onSelectionModeChange()\">\n <option value=\"single\">Single Selection</option>\n <option value=\"multiple\">Multiple Selection</option>\n </select>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Advanced Filtering -->\n <mj-accordion-panel [(Expanded)]=\"showAdvancedOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-filter\"></i>\n Advanced Filtering\n </ng-template>\n <div class=\"config-section-body\">\n <!-- Extra Filter -->\n <div class=\"form-group\">\n <label for=\"extraFilter\">\n Extra Filter\n </label>\n <input\n type=\"text\"\n id=\"extraFilter\"\n [(ngModel)]=\"extraFilter\"\n (input)=\"onFilterChange()\"\n placeholder=\"e.g., Status = 'Active'\"\n class=\"form-input\">\n <span class=\"form-hint\">\n SQL WHERE clause to filter records (applied in addition to view filters)\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
@@ -8,12 +8,36 @@ import * as i0 from "@angular/core";
8
8
  */
9
9
  export declare class WebURLConfigPanelComponent extends BaseConfigPanel {
10
10
  title: string;
11
- url: string;
12
- sandboxMode: 'standard' | 'strict' | 'permissive';
13
- allowFullscreen: boolean;
14
- refreshOnResize: boolean;
15
- urlError: string;
16
- showUrlPreview: boolean;
11
+ Url: string;
12
+ /** @deprecated Use {@link Url}. */
13
+ get url(): string;
14
+ /** @deprecated Use {@link Url}. */
15
+ set url(value: string);
16
+ SandboxMode: 'standard' | 'strict' | 'permissive';
17
+ /** @deprecated Use {@link SandboxMode}. */
18
+ get sandboxMode(): 'standard' | 'strict' | 'permissive';
19
+ /** @deprecated Use {@link SandboxMode}. */
20
+ set sandboxMode(value: 'standard' | 'strict' | 'permissive');
21
+ AllowFullscreen: boolean;
22
+ /** @deprecated Use {@link AllowFullscreen}. */
23
+ get allowFullscreen(): boolean;
24
+ /** @deprecated Use {@link AllowFullscreen}. */
25
+ set allowFullscreen(value: boolean);
26
+ RefreshOnResize: boolean;
27
+ /** @deprecated Use {@link RefreshOnResize}. */
28
+ get refreshOnResize(): boolean;
29
+ /** @deprecated Use {@link RefreshOnResize}. */
30
+ set refreshOnResize(value: boolean);
31
+ UrlError: string;
32
+ /** @deprecated Use {@link UrlError}. */
33
+ get urlError(): string;
34
+ /** @deprecated Use {@link UrlError}. */
35
+ set urlError(value: string);
36
+ ShowUrlPreview: boolean;
37
+ /** @deprecated Use {@link ShowUrlPreview}. */
38
+ get showUrlPreview(): boolean;
39
+ /** @deprecated Use {@link ShowUrlPreview}. */
40
+ set showUrlPreview(value: boolean);
17
41
  constructor(cdr: ChangeDetectorRef);
18
42
  initFromConfig(config: PanelConfig | null): void;
19
43
  buildConfig(): PanelConfig;
@@ -23,12 +47,24 @@ export declare class WebURLConfigPanelComponent extends BaseConfigPanel {
23
47
  };
24
48
  getDefaultTitle(): string;
25
49
  getTitle(): string;
50
+ OnTitleChange(): void;
51
+ /** @deprecated Use {@link OnTitleChange}. */
26
52
  onTitleChange(): void;
53
+ OnUrlChange(): void;
54
+ /** @deprecated Use {@link OnUrlChange}. */
27
55
  onUrlChange(): void;
56
+ OnSandboxModeChange(): void;
57
+ /** @deprecated Use {@link OnSandboxModeChange}. */
28
58
  onSandboxModeChange(): void;
59
+ OnOptionChange(): void;
60
+ /** @deprecated Use {@link OnOptionChange}. */
29
61
  onOptionChange(): void;
62
+ PreviewUrl(): void;
63
+ /** @deprecated Use {@link PreviewUrl}. */
30
64
  previewUrl(): void;
31
65
  private isValidUrl;
66
+ GetSandboxModeDescription(): string;
67
+ /** @deprecated Use {@link GetSandboxModeDescription}. */
32
68
  getSandboxModeDescription(): string;
33
69
  static ɵfac: i0.ɵɵFactoryDeclaration<WebURLConfigPanelComponent, never>;
34
70
  static ɵcmp: i0.ɵɵComponentDeclaration<WebURLConfigPanelComponent, "mj-weburl-config-panel", never, {}, {}, never, never, false, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"weburl-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/weburl-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;;AAExD;;;GAGG;AACH,qBAOa,0BAA2B,SAAQ,eAAe;IAEpD,KAAK,SAAM;IACX,GAAG,SAAM;IACT,WAAW,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAc;IAC/D,eAAe,UAAQ;IACvB,eAAe,UAAS;IAGxB,QAAQ,SAAM;IACd,cAAc,UAAS;gBAElB,GAAG,EAAE,iBAAiB;IAI3B,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAoBhD,WAAW,IAAI,WAAW;IAUjB,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAgBzD,eAAe,IAAI,MAAM;IAYzB,QAAQ,IAAI,MAAM;IAKlB,aAAa,IAAI,IAAI;IAIrB,WAAW,IAAI,IAAI;IAgBnB,mBAAmB,IAAI,IAAI;IAI3B,cAAc,IAAI,IAAI;IAItB,UAAU,IAAI,IAAI;IAMzB,OAAO,CAAC,UAAU;IASX,yBAAyB,IAAI,MAAM;yCA1HjC,0BAA0B;2CAA1B,0BAA0B;CAoItC"}
1
+ {"version":3,"file":"weburl-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/weburl-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;;AAExD;;;GAGG;AACH,qBAOa,0BAA2B,SAAQ,eAAe;IAEpD,KAAK,SAAM;IACX,GAAG,SAAM;IAEhB,mCAAmC;IACnC,IAAW,GAAG,WAEb;IACD,mCAAmC;IACnC,IAAW,GAAG,CAAC,KAAK,QAAA,EAEnB;IACM,WAAW,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAc;IAEtE,2CAA2C;IAC3C,IAAW,WAAW,IAAI,UAAU,GAAG,QAAQ,GAAG,YAAY,CAE7D;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,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,UAAS;IAE/B,+CAA+C;IAC/C,IAAW,eAAe,YAEzB;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,SAAA,EAE/B;IAGM,QAAQ,SAAM;IAErB,wCAAwC;IACxC,IAAW,QAAQ,WAElB;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,QAAA,EAExB;IACM,cAAc,UAAS;IAE9B,8CAA8C;IAC9C,IAAW,cAAc,YAExB;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAK,SAAA,EAE9B;gBAEW,GAAG,EAAE,iBAAiB;IAI3B,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAoBhD,WAAW,IAAI,WAAW;IAUjB,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAgBzD,eAAe,IAAI,MAAM;IAYzB,QAAQ,IAAI,MAAM;IAKlB,aAAa,IAAI,IAAI;IAI5B,6CAA6C;IACtC,aAAa,IAAI,IAAI;IAIrB,WAAW,IAAI,IAAI;IAgB1B,2CAA2C;IACpC,WAAW,IAAI,IAAI;IAInB,mBAAmB,IAAI,IAAI;IAIlC,mDAAmD;IAC5C,mBAAmB,IAAI,IAAI;IAI3B,cAAc,IAAI,IAAI;IAI7B,8CAA8C;IACvC,cAAc,IAAI,IAAI;IAItB,UAAU,IAAI,IAAI;IAMzB,0CAA0C;IACnC,UAAU,IAAI,IAAI;IAIzB,OAAO,CAAC,UAAU;IASX,yBAAyB,IAAI,MAAM;IAW1C,yDAAyD;IAClD,yBAAyB,IAAI,MAAM;yCArNjC,0BAA0B;2CAA1B,0BAA0B;CAwNtC"}