@memberjunction/ng-dashboard-viewer 6.2.0-edge.3 → 6.2.0-edge.5

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 (101) hide show
  1. package/README.md +165 -17
  2. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts +3 -4
  3. package/dist/lib/config-dialogs/confirm-dialog.component.d.ts.map +1 -1
  4. package/dist/lib/config-dialogs/confirm-dialog.component.js +3 -2
  5. package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
  6. package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
  7. package/dist/lib/config-panels/artifact-config-panel.component.js +59 -50
  8. package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
  9. package/dist/lib/config-panels/base-config-panel.d.ts +8 -3
  10. package/dist/lib/config-panels/base-config-panel.d.ts.map +1 -1
  11. package/dist/lib/config-panels/base-config-panel.js +10 -3
  12. package/dist/lib/config-panels/base-config-panel.js.map +1 -1
  13. package/dist/lib/config-panels/query-config-panel.component.js +124 -99
  14. package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
  15. package/dist/lib/config-panels/view-config-panel.component.js +111 -103
  16. package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
  17. package/dist/lib/config-panels/weburl-config-panel.component.js +89 -80
  18. package/dist/lib/config-panels/weburl-config-panel.component.js.map +1 -1
  19. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts +79 -28
  20. package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
  21. package/dist/lib/dashboard-browser/dashboard-browser.component.js +446 -447
  22. package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
  23. package/dist/lib/dashboard-card/dashboard-card.component.d.ts +69 -0
  24. package/dist/lib/dashboard-card/dashboard-card.component.d.ts.map +1 -0
  25. package/dist/lib/dashboard-card/dashboard-card.component.js +281 -0
  26. package/dist/lib/dashboard-card/dashboard-card.component.js.map +1 -0
  27. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts +18 -0
  28. package/dist/lib/dashboard-card/dashboard-card.helpers.d.ts.map +1 -0
  29. package/dist/lib/dashboard-card/dashboard-card.helpers.js +43 -0
  30. package/dist/lib/dashboard-card/dashboard-card.helpers.js.map +1 -0
  31. package/dist/lib/dashboard-card/layout-preview-cache.d.ts +15 -0
  32. package/dist/lib/dashboard-card/layout-preview-cache.d.ts.map +1 -0
  33. package/dist/lib/dashboard-card/layout-preview-cache.js +22 -0
  34. package/dist/lib/dashboard-card/layout-preview-cache.js.map +1 -0
  35. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +69 -12
  36. package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
  37. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +173 -145
  38. package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
  39. package/dist/lib/dashboard-viewer.module.d.ts +24 -20
  40. package/dist/lib/dashboard-viewer.module.d.ts.map +1 -1
  41. package/dist/lib/dashboard-viewer.module.js +42 -5
  42. package/dist/lib/dashboard-viewer.module.js.map +1 -1
  43. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts +7 -12
  44. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.d.ts.map +1 -1
  45. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +3 -1
  46. package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
  47. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts +54 -0
  48. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.d.ts.map +1 -0
  49. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js +156 -0
  50. package/dist/lib/dialogs/dashboard-name-dialog/dashboard-name-dialog.component.js.map +1 -0
  51. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts +5 -11
  52. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.d.ts.map +1 -1
  53. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +3 -1
  54. package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
  55. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts +147 -0
  56. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.d.ts.map +1 -0
  57. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js +536 -0
  58. package/dist/lib/dialogs/part-dialog/dashboard-part-dialog.component.js.map +1 -0
  59. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts +20 -0
  60. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.d.ts.map +1 -0
  61. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js +80 -0
  62. package/dist/lib/layout-preview/dashboard-layout-preview-node.component.js.map +1 -0
  63. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts +28 -0
  64. package/dist/lib/layout-preview/dashboard-layout-preview.component.d.ts.map +1 -0
  65. package/dist/lib/layout-preview/dashboard-layout-preview.component.js +62 -0
  66. package/dist/lib/layout-preview/dashboard-layout-preview.component.js.map +1 -0
  67. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts +33 -0
  68. package/dist/lib/layout-preview/dashboard-layout-preview.d.ts.map +1 -0
  69. package/dist/lib/layout-preview/dashboard-layout-preview.js +138 -0
  70. package/dist/lib/layout-preview/dashboard-layout-preview.js.map +1 -0
  71. package/dist/lib/models/dashboard-layout-editor.d.ts +78 -0
  72. package/dist/lib/models/dashboard-layout-editor.d.ts.map +1 -0
  73. package/dist/lib/models/dashboard-layout-editor.js +374 -0
  74. package/dist/lib/models/dashboard-layout-editor.js.map +1 -0
  75. package/dist/lib/models/remove-part-confirm.d.ts +8 -0
  76. package/dist/lib/models/remove-part-confirm.d.ts.map +1 -0
  77. package/dist/lib/models/remove-part-confirm.js +23 -0
  78. package/dist/lib/models/remove-part-confirm.js.map +1 -0
  79. package/dist/lib/parts/artifact-part.component.js +2 -2
  80. package/dist/lib/parts/artifact-part.component.js.map +1 -1
  81. package/dist/lib/parts/query-part.component.js +2 -2
  82. package/dist/lib/parts/query-part.component.js.map +1 -1
  83. package/dist/lib/parts/view-part.component.js +2 -2
  84. package/dist/lib/parts/view-part.component.js.map +1 -1
  85. package/dist/lib/parts/weburl-part.component.d.ts +6 -0
  86. package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
  87. package/dist/lib/parts/weburl-part.component.js +34 -4
  88. package/dist/lib/parts/weburl-part.component.js.map +1 -1
  89. package/dist/lib/services/golden-layout-wrapper.service.d.ts +40 -0
  90. package/dist/lib/services/golden-layout-wrapper.service.d.ts.map +1 -1
  91. package/dist/lib/services/golden-layout-wrapper.service.js +117 -9
  92. package/dist/lib/services/golden-layout-wrapper.service.js.map +1 -1
  93. package/dist/lib/services/stack-part-actions.d.ts +11 -0
  94. package/dist/lib/services/stack-part-actions.d.ts.map +1 -0
  95. package/dist/lib/services/stack-part-actions.js +41 -0
  96. package/dist/lib/services/stack-part-actions.js.map +1 -0
  97. package/dist/public-api.d.ts +9 -0
  98. package/dist/public-api.d.ts.map +1 -1
  99. package/dist/public-api.js +13 -0
  100. package/dist/public-api.js.map +1 -1
  101. package/package.json +13 -13
@@ -30,7 +30,7 @@ function ArtifactConfigPanelComponent_Conditional_10_Template(rf, ctx) { if (rf
30
30
  } }
31
31
  function ArtifactConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
32
32
  i0.ɵɵelementStart(0, "span", 8);
33
- i0.ɵɵelement(1, "i", 21);
33
+ i0.ɵɵelement(1, "i", 17);
34
34
  i0.ɵɵtext(2);
35
35
  i0.ɵɵelementEnd();
36
36
  } if (rf & 2) {
@@ -39,7 +39,7 @@ function ArtifactConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf
39
39
  i0.ɵɵtextInterpolate1(" Selected: ", ctx_r1.artifactName, " ");
40
40
  } }
41
41
  function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelementStart(0, "option", 27);
42
+ i0.ɵɵelementStart(0, "option", 23);
43
43
  i0.ɵɵtext(1);
44
44
  i0.ɵɵpipe(2, "date");
45
45
  i0.ɵɵelementEnd();
@@ -51,10 +51,10 @@ function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Templat
51
51
  } }
52
52
  function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
53
53
  const _r3 = i0.ɵɵgetCurrentView();
54
- i0.ɵɵelementStart(0, "select", 26);
54
+ i0.ɵɵelementStart(0, "select", 22);
55
55
  i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.versionNumber, $event) || (ctx_r1.versionNumber = $event); return i0.ɵɵresetView($event); });
56
56
  i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template_select_change_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onVersionChange()); });
57
- i0.ɵɵrepeaterCreate(1, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Template, 3, 6, "option", 27, i0.ɵɵrepeaterTrackByIdentity);
57
+ i0.ɵɵrepeaterCreate(1, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Template, 3, 6, "option", 23, i0.ɵɵrepeaterTrackByIdentity);
58
58
  i0.ɵɵelementEnd();
59
59
  } if (rf & 2) {
60
60
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -64,7 +64,7 @@ function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template(rf,
64
64
  } }
65
65
  function ArtifactConfigPanelComponent_Conditional_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
66
66
  i0.ɵɵelementStart(0, "span", 7);
67
- i0.ɵɵelement(1, "i", 28);
67
+ i0.ɵɵelement(1, "i", 24);
68
68
  i0.ɵɵtext(2, " Loading versions... ");
69
69
  i0.ɵɵelementEnd();
70
70
  } }
@@ -79,12 +79,12 @@ function ArtifactConfigPanelComponent_Conditional_12_Conditional_8_Template(rf,
79
79
  i0.ɵɵelementEnd();
80
80
  } }
81
81
  function ArtifactConfigPanelComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
82
- i0.ɵɵelementStart(0, "div", 2)(1, "label", 22);
83
- i0.ɵɵelement(2, "i", 23);
82
+ i0.ɵɵelementStart(0, "div", 2)(1, "label", 18);
83
+ i0.ɵɵelement(2, "i", 19);
84
84
  i0.ɵɵtext(3, " Version ");
85
85
  i0.ɵɵelementEnd();
86
- i0.ɵɵelementStart(4, "div", 24);
87
- i0.ɵɵconditionalCreate(5, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template, 3, 1, "select", 25);
86
+ i0.ɵɵelementStart(4, "div", 20);
87
+ i0.ɵɵconditionalCreate(5, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template, 3, 1, "select", 21);
88
88
  i0.ɵɵconditionalCreate(6, ArtifactConfigPanelComponent_Conditional_12_Conditional_6_Template, 3, 0, "span", 7);
89
89
  i0.ɵɵconditionalCreate(7, ArtifactConfigPanelComponent_Conditional_12_Conditional_7_Template, 2, 0, "span", 7);
90
90
  i0.ɵɵelementEnd();
@@ -101,7 +101,28 @@ function ArtifactConfigPanelComponent_Conditional_12_Template(rf, ctx) { if (rf
101
101
  i0.ɵɵadvance();
102
102
  i0.ɵɵconditional(ctx_r1.versions.length > 0 ? 8 : -1);
103
103
  } }
104
- function ArtifactConfigPanelComponent_ng_template_23_Template(rf, ctx) { if (rf & 1) {
104
+ function ArtifactConfigPanelComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
105
+ const _r5 = i0.ɵɵgetCurrentView();
106
+ i0.ɵɵelementStart(0, "div", 2)(1, "label", 25);
107
+ i0.ɵɵelement(2, "i", 26);
108
+ i0.ɵɵtext(3, " Part Title ");
109
+ i0.ɵɵelementStart(4, "span", 27);
110
+ i0.ɵɵtext(5, "(optional)");
111
+ i0.ɵɵelementEnd()();
112
+ i0.ɵɵelementStart(6, "input", 28);
113
+ i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Conditional_13_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.title, $event) || (ctx_r1.title = $event); return i0.ɵɵresetView($event); });
114
+ i0.ɵɵlistener("input", function ArtifactConfigPanelComponent_Conditional_13_Template_input_input_6_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTitleChange()); });
115
+ i0.ɵɵelementEnd();
116
+ i0.ɵɵelementStart(7, "span", 7);
117
+ i0.ɵɵtext(8, "Leave empty to use artifact name as title");
118
+ i0.ɵɵelementEnd()();
119
+ } if (rf & 2) {
120
+ const ctx_r1 = i0.ɵɵnextContext();
121
+ i0.ɵɵadvance(6);
122
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.title);
123
+ i0.ɵɵproperty("placeholder", ctx_r1.artifactName ? "Default: " + ctx_r1.artifactName : "Enter a custom title");
124
+ } }
125
+ function ArtifactConfigPanelComponent_ng_template_15_Template(rf, ctx) { if (rf & 1) {
105
126
  i0.ɵɵelement(0, "i", 29);
106
127
  i0.ɵɵtext(1, " Display Options ");
107
128
  } }
@@ -380,6 +401,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
380
401
  this.cdr.detectChanges();
381
402
  try {
382
403
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
404
+ // conversation-scope: artifact-wide read, no conversation path applies
383
405
  const result = await rv.RunView({
384
406
  EntityName: 'MJ: Artifact Versions',
385
407
  ExtraFilter: `ArtifactID = '${artifactId}'`,
@@ -422,7 +444,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
422
444
  } if (rf & 2) {
423
445
  let _t;
424
446
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ArtifactDropdown = _t.first);
425
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 41, vars: 19, consts: [["artifactDropdown", ""], [1, "config-panel", "config-panel--compact"], [1, "form-group"], [1, "fa-solid", "fa-cube"], [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, "checkbox-group", "checkbox-group--compact"], [1, "checkbox-option", "checkbox-option--compact"], ["type", "checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "checkbox-mark"], [1, "checkbox-label"], [1, "fa-solid", "fa-check"], ["for", "versionSelect"], [1, "fa-solid", "fa-code-branch"], [1, "version-select-wrapper"], ["id", "versionSelect", 1, "form-select", 3, "ngModel"], ["id", "versionSelect", 1, "form-select", 3, "ngModelChange", "change", "ngModel"], [3, "ngValue"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-sliders"]], template: function ArtifactConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
447
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 33, vars: 18, consts: [["artifactDropdown", ""], [1, "config-panel", "config-panel--compact"], [1, "form-group"], [1, "fa-solid", "fa-cube"], [1, "required"], [3, "SelectionChange", "BranchConfig", "LeafConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch"], [1, "form-error"], [1, "form-hint"], [1, "form-hint", "form-hint--selected"], ["Size", "sm", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "config-section-body"], [1, "checkbox-group", "checkbox-group--compact"], [1, "checkbox-option", "checkbox-option--compact"], ["type", "checkbox", 3, "ngModelChange", "change", "ngModel"], [1, "checkbox-mark"], [1, "checkbox-label"], [1, "fa-solid", "fa-check"], ["for", "versionSelect"], [1, "fa-solid", "fa-code-branch"], [1, "version-select-wrapper"], ["id", "versionSelect", 1, "form-select", 3, "ngModel"], ["id", "versionSelect", 1, "form-select", 3, "ngModelChange", "change", "ngModel"], [3, "ngValue"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["for", "partTitle"], [1, "fa-solid", "fa-heading"], [1, "optional-tag"], ["type", "text", "id", "partTitle", 1, "form-input", 3, "ngModelChange", "input", "ngModel", "placeholder"], [1, "fa-solid", "fa-sliders"]], template: function ArtifactConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
426
448
  const _r1 = i0.ɵɵgetCurrentView();
427
449
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "label");
428
450
  i0.ɵɵelement(3, "i", 3);
@@ -438,45 +460,33 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
438
460
  i0.ɵɵconditionalCreate(11, ArtifactConfigPanelComponent_Conditional_11_Template, 3, 1, "span", 8);
439
461
  i0.ɵɵelementEnd();
440
462
  i0.ɵɵconditionalCreate(12, ArtifactConfigPanelComponent_Conditional_12_Template, 9, 4, "div", 2);
441
- i0.ɵɵelementStart(13, "div", 2)(14, "label", 9);
442
- i0.ɵɵelement(15, "i", 10);
443
- i0.ɵɵtext(16, " Part Title ");
444
- i0.ɵɵelementStart(17, "span", 11);
445
- i0.ɵɵtext(18, "(optional)");
446
- i0.ɵɵelementEnd()();
447
- i0.ɵɵelementStart(19, "input", 12);
448
- i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.title, $event) || (ctx.title = $event); return i0.ɵɵresetView($event); });
449
- i0.ɵɵlistener("input", function ArtifactConfigPanelComponent_Template_input_input_19_listener() { return ctx.onTitleChange(); });
463
+ i0.ɵɵconditionalCreate(13, ArtifactConfigPanelComponent_Conditional_13_Template, 9, 2, "div", 2);
464
+ i0.ɵɵelementStart(14, "mj-accordion-panel", 9);
465
+ i0.ɵɵtwoWayListener("ExpandedChange", function ArtifactConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_14_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showOptions, $event) || (ctx.showOptions = $event); return i0.ɵɵresetView($event); });
466
+ i0.ɵɵtemplate(15, ArtifactConfigPanelComponent_ng_template_15_Template, 2, 0, "ng-template", 10);
467
+ i0.ɵɵelementStart(16, "div", 11)(17, "div", 12)(18, "label", 13)(19, "input", 14);
468
+ i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showHeader, $event) || (ctx.showHeader = $event); return i0.ɵɵresetView($event); });
469
+ i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_19_listener() { return ctx.onOptionChange(); });
450
470
  i0.ɵɵelementEnd();
451
- i0.ɵɵelementStart(20, "span", 7);
452
- i0.ɵɵtext(21, "Leave empty to use artifact name as title");
471
+ i0.ɵɵelement(20, "span", 15);
472
+ i0.ɵɵelementStart(21, "span", 16);
473
+ i0.ɵɵtext(22, "Show Header");
453
474
  i0.ɵɵelementEnd()();
454
- i0.ɵɵelementStart(22, "mj-accordion-panel", 13);
455
- i0.ɵɵtwoWayListener("ExpandedChange", function ArtifactConfigPanelComponent_Template_mj_accordion_panel_ExpandedChange_22_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showOptions, $event) || (ctx.showOptions = $event); return i0.ɵɵresetView($event); });
456
- i0.ɵɵtemplate(23, ArtifactConfigPanelComponent_ng_template_23_Template, 2, 0, "ng-template", 14);
457
- i0.ɵɵelementStart(24, "div", 15)(25, "div", 16)(26, "label", 17)(27, "input", 18);
458
- i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_27_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showHeader, $event) || (ctx.showHeader = $event); return i0.ɵɵresetView($event); });
459
- i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_27_listener() { return ctx.onOptionChange(); });
475
+ i0.ɵɵelementStart(23, "label", 13)(24, "input", 14);
476
+ i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_24_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showTabs, $event) || (ctx.showTabs = $event); return i0.ɵɵresetView($event); });
477
+ i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_24_listener() { return ctx.onOptionChange(); });
460
478
  i0.ɵɵelementEnd();
461
- i0.ɵɵelement(28, "span", 19);
462
- i0.ɵɵelementStart(29, "span", 20);
463
- i0.ɵɵtext(30, "Show Header");
479
+ i0.ɵɵelement(25, "span", 15);
480
+ i0.ɵɵelementStart(26, "span", 16);
481
+ i0.ɵɵtext(27, "Show Tabs");
464
482
  i0.ɵɵelementEnd()();
465
- i0.ɵɵelementStart(31, "label", 17)(32, "input", 18);
466
- i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_32_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showTabs, $event) || (ctx.showTabs = $event); return i0.ɵɵresetView($event); });
467
- i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_32_listener() { return ctx.onOptionChange(); });
483
+ i0.ɵɵelementStart(28, "label", 13)(29, "input", 14);
484
+ i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showMetadata, $event) || (ctx.showMetadata = $event); return i0.ɵɵresetView($event); });
485
+ i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_29_listener() { return ctx.onOptionChange(); });
468
486
  i0.ɵɵelementEnd();
469
- i0.ɵɵelement(33, "span", 19);
470
- i0.ɵɵelementStart(34, "span", 20);
471
- i0.ɵɵtext(35, "Show Tabs");
472
- i0.ɵɵelementEnd()();
473
- i0.ɵɵelementStart(36, "label", 17)(37, "input", 18);
474
- i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showMetadata, $event) || (ctx.showMetadata = $event); return i0.ɵɵresetView($event); });
475
- i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_37_listener() { return ctx.onOptionChange(); });
476
- i0.ɵɵelementEnd();
477
- i0.ɵɵelement(38, "span", 19);
478
- i0.ɵɵelementStart(39, "span", 20);
479
- i0.ɵɵtext(40, "Show Metadata");
487
+ i0.ɵɵelement(30, "span", 15);
488
+ i0.ɵɵelementStart(31, "span", 16);
489
+ i0.ɵɵtext(32, "Show Metadata");
480
490
  i0.ɵɵelementEnd()()()()()();
481
491
  } if (rf & 2) {
482
492
  i0.ɵɵadvance(7);
@@ -490,10 +500,9 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
490
500
  i0.ɵɵconditional(!ctx.artifactError && ctx.artifactId ? 11 : -1);
491
501
  i0.ɵɵadvance();
492
502
  i0.ɵɵconditional(ctx.artifactId ? 12 : -1);
493
- i0.ɵɵadvance(7);
494
- i0.ɵɵtwoWayProperty("ngModel", ctx.title);
495
- i0.ɵɵproperty("placeholder", ctx.artifactName ? "Default: " + ctx.artifactName : "Enter a custom title");
496
- i0.ɵɵadvance(3);
503
+ i0.ɵɵadvance();
504
+ i0.ɵɵconditional(ctx.ShowCommonFields ? 13 : -1);
505
+ i0.ɵɵadvance();
497
506
  i0.ɵɵtwoWayProperty("Expanded", ctx.showOptions);
498
507
  i0.ɵɵadvance(5);
499
508
  i0.ɵɵtwoWayProperty("ngModel", ctx.showHeader);
@@ -509,7 +518,7 @@ ArtifactConfigPanelComponent = __decorate([
509
518
  export { ArtifactConfigPanelComponent };
510
519
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ArtifactConfigPanelComponent, [{
511
520
  type: Component,
512
- args: [{ standalone: false, selector: 'mj-artifact-config-panel', template: "<!-- Artifact Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Artifact Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-cube\"></i>\n Select Artifact\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #artifactDropdown\n [BranchConfig]=\"CollectionConfig\"\n [LeafConfig]=\"ArtifactLeafConfig\"\n [Value]=\"ArtifactIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse artifacts...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onArtifactSelection($event)\"\n [class.error]=\"artifactError\">\n </mj-tree-dropdown>\n @if (artifactError) {\n <span class=\"form-error\">{{ artifactError }}</span>\n }\n @if (!artifactError && !artifactId) {\n <span class=\"form-hint\">\n Browse collections or search to find an artifact\n </span>\n }\n @if (!artifactError && artifactId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ artifactName }}\n </span>\n }\n </div>\n\n <!-- Version Selection (Available only after artifact is selected) -->\n @if (artifactId) {\n <div class=\"form-group\">\n <label for=\"versionSelect\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Version\n </label>\n <div class=\"version-select-wrapper\">\n @if (!isLoadingVersions && versions.length > 0) {\n <select\n id=\"versionSelect\"\n [(ngModel)]=\"versionNumber\"\n (change)=\"onVersionChange()\"\n class=\"form-select\">\n @for (v of versions; track v) {\n <option [ngValue]=\"v.VersionNumber\">\n v{{ v.VersionNumber }} - {{ v.__mj_CreatedAt | date:'short' }}\n </option>\n }\n </select>\n }\n @if (isLoadingVersions) {\n <span class=\"form-hint\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading versions...\n </span>\n }\n @if (!isLoadingVersions && versions.length === 0) {\n <span class=\"form-hint\">\n No versions available\n </span>\n }\n </div>\n @if (versions.length > 0) {\n <span class=\"form-hint\">\n Select which version to display (latest is default)\n </span>\n }\n </div>\n }\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]=\"artifactName ? 'Default: ' + artifactName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use artifact name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showOptions\" 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 <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showHeader\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Header</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showTabs\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Tabs</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Metadata</span>\n </label>\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"] }]
521
+ args: [{ standalone: false, selector: 'mj-artifact-config-panel', template: "<!-- Artifact Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Artifact Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-cube\"></i>\n Select Artifact\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #artifactDropdown\n [BranchConfig]=\"CollectionConfig\"\n [LeafConfig]=\"ArtifactLeafConfig\"\n [Value]=\"ArtifactIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse artifacts...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onArtifactSelection($event)\"\n [class.error]=\"artifactError\">\n </mj-tree-dropdown>\n @if (artifactError) {\n <span class=\"form-error\">{{ artifactError }}</span>\n }\n @if (!artifactError && !artifactId) {\n <span class=\"form-hint\">\n Browse collections or search to find an artifact\n </span>\n }\n @if (!artifactError && artifactId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ artifactName }}\n </span>\n }\n </div>\n\n <!-- Version Selection (Available only after artifact is selected) -->\n @if (artifactId) {\n <div class=\"form-group\">\n <label for=\"versionSelect\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Version\n </label>\n <div class=\"version-select-wrapper\">\n @if (!isLoadingVersions && versions.length > 0) {\n <select\n id=\"versionSelect\"\n [(ngModel)]=\"versionNumber\"\n (change)=\"onVersionChange()\"\n class=\"form-select\">\n @for (v of versions; track v) {\n <option [ngValue]=\"v.VersionNumber\">\n v{{ v.VersionNumber }} - {{ v.__mj_CreatedAt | date:'short' }}\n </option>\n }\n </select>\n }\n @if (isLoadingVersions) {\n <span class=\"form-hint\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading versions...\n </span>\n }\n @if (!isLoadingVersions && versions.length === 0) {\n <span class=\"form-hint\">\n No versions available\n </span>\n }\n </div>\n @if (versions.length > 0) {\n <span class=\"form-hint\">\n Select which version to display (latest is default)\n </span>\n }\n </div>\n }\n\n <!-- Title (Optional) -->\n @if (ShowCommonFields) {\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"artifactName ? 'Default: ' + artifactName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use artifact name as title</span>\n </div>\n }\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showOptions\" 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 <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showHeader\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Header</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showTabs\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Tabs</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Metadata</span>\n </label>\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"] }]
513
522
  }], () => [{ type: i0.ChangeDetectorRef }], { ArtifactDropdown: [{
514
523
  type: ViewChild,
515
524
  args: ['artifactDropdown']
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/artifact-config-panel.component.ts","../../../src/lib/config-panels/artifact-config-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild, OnInit } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { MJArtifactVersionEntity } from '@memberjunction/core-entities';\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 Artifact parts.\n * Uses tree dropdown for collection-based artifact selection.\n */\n@RegisterClass(BaseConfigPanel, 'ArtifactPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-artifact-config-panel',\n templateUrl: './artifact-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class ArtifactConfigPanelComponent extends BaseConfigPanel implements OnInit {\n // ViewChild reference\n @ViewChild('artifactDropdown') ArtifactDropdown!: TreeDropdownComponent;\n\n /** @deprecated Use {@link ArtifactDropdown}. */\n get artifactDropdown(): TreeDropdownComponent {\n return this.ArtifactDropdown;\n }\n /** @deprecated Use {@link ArtifactDropdown}. */\n set artifactDropdown(value: TreeDropdownComponent) {\n this.ArtifactDropdown = value;\n }\n\n // Form fields\n public title = '';\n public artifactId = '';\n public ArtifactName = '';\n\n /** @deprecated Use {@link ArtifactName}. */\n public get artifactName() {\n return this.ArtifactName;\n }\n /** @deprecated Use {@link ArtifactName}. */\n public set artifactName(value) {\n this.ArtifactName = value;\n }\n public VersionNumber: number | null = null;\n\n /** @deprecated Use {@link VersionNumber}. */\n public get versionNumber(): number | null {\n return this.VersionNumber;\n }\n /** @deprecated Use {@link VersionNumber}. */\n public set versionNumber(value: number | null) {\n this.VersionNumber = value;\n }\n public ShowHeader = false;\n\n /** @deprecated Use {@link ShowHeader}. */\n public get showHeader() {\n return this.ShowHeader;\n }\n /** @deprecated Use {@link ShowHeader}. */\n public set showHeader(value) {\n this.ShowHeader = value;\n } // Default false for clean dashboard embedding\n public ShowTabs = true;\n\n /** @deprecated Use {@link ShowTabs}. */\n public get showTabs() {\n return this.ShowTabs;\n }\n /** @deprecated Use {@link ShowTabs}. */\n public set showTabs(value) {\n this.ShowTabs = value;\n }\n public ShowVersionSelector = true;\n\n /** @deprecated Use {@link ShowVersionSelector}. */\n public get showVersionSelector() {\n return this.ShowVersionSelector;\n }\n /** @deprecated Use {@link ShowVersionSelector}. */\n public set showVersionSelector(value) {\n this.ShowVersionSelector = value;\n }\n public ShowMetadata = false;\n\n /** @deprecated Use {@link ShowMetadata}. */\n public get showMetadata() {\n return this.ShowMetadata;\n }\n /** @deprecated Use {@link ShowMetadata}. */\n public set showMetadata(value) {\n this.ShowMetadata = value;\n }\n\n // Version selection\n public Versions: MJArtifactVersionEntity[] = [];\n\n /** @deprecated Use {@link Versions}. */\n public get versions(): MJArtifactVersionEntity[] {\n return this.Versions;\n }\n /** @deprecated Use {@link Versions}. */\n public set versions(value: MJArtifactVersionEntity[]) {\n this.Versions = value;\n }\n public IsLoadingVersions = false;\n\n /** @deprecated Use {@link IsLoadingVersions}. */\n public get isLoadingVersions() {\n return this.IsLoadingVersions;\n }\n /** @deprecated Use {@link IsLoadingVersions}. */\n public set isLoadingVersions(value) {\n this.IsLoadingVersions = value;\n }\n private previousArtifactName = ''; // Track for smart title updates\n\n // Collapsible section state\n public ShowOptions = false;\n\n /** @deprecated Use {@link ShowOptions}. */\n public get showOptions() {\n return this.ShowOptions;\n }\n /** @deprecated Use {@link ShowOptions}. */\n public set showOptions(value) {\n this.ShowOptions = value;\n }\n\n // Validation\n public ArtifactError = '';\n\n /** @deprecated Use {@link ArtifactError}. */\n public get artifactError() {\n return this.ArtifactError;\n }\n /** @deprecated Use {@link ArtifactError}. */\n public set artifactError(value) {\n this.ArtifactError = value;\n }\n\n // Tree configuration - initialized in ngOnInit with current user filter\n public CollectionConfig!: TreeBranchConfig;\n public ArtifactLeafConfig!: TreeLeafConfig;\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n ngOnInit(): void {\n // Get current user ID for filtering\n const userId = this.ProviderToUse.CurrentUser?.ID;\n\n // Tree configuration for Collections (branches) and Artifacts (leaves)\n // Collections have hierarchical ParentID structure.\n // Filter to show only collections owned by the current user.\n this.CollectionConfig = {\n EntityName: 'MJ: Collections',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n IconField: 'Icon',\n ColorField: 'Color',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC',\n ExtraFilter: userId ? `OwnerID = '${userId}'` : ''\n };\n\n // Artifacts from MJ: Artifacts entity using M2M junction config.\n // The relationship is: Artifact -> ArtifactVersion -> CollectionArtifact -> Collection\n // We use JunctionConfig to properly parent artifacts under their collections.\n this.ArtifactLeafConfig = {\n EntityName: 'MJ: Artifacts',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: '', // Using JunctionConfig instead of direct parent field\n DefaultIcon: 'fa-solid fa-cube',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC',\n ExtraFilter: userId ? `UserID = '${userId}'` : '',\n // M2M junction configuration: Artifact -> ArtifactVersion -> CollectionArtifact -> Collection\n JunctionConfig: {\n EntityName: 'MJ: Collection Artifacts',\n LeafForeignKey: 'ArtifactVersionID', // Junction references ArtifactVersion, not Artifact directly\n BranchForeignKey: 'CollectionID',\n // Indirect mapping since junction references ArtifactVersion, not Artifact\n IndirectLeafMapping: {\n IntermediateEntity: 'MJ: Artifact Versions',\n IntermediateIDField: 'ID', // CollectionArtifact.ArtifactVersionID -> ArtifactVersion.ID\n LeafIDField: 'ArtifactID' // ArtifactVersion.ArtifactID -> Artifact.ID\n }\n }\n };\n }\n\n /**\n * Get the artifactId as a CompositeKey for the tree dropdown\n */\n public get ArtifactIdAsKey(): CompositeKey | null {\n return this.artifactId ? CompositeKey.FromID(this.artifactId) : null; // first-pk-ok: artifactId is an MJ: Artifacts record (ArtifactLeafConfig) — core entity keyed by ID\n }\n\n public async initFromConfig(config: PanelConfig | null): Promise<void> {\n if (config && config.type === 'Artifact') {\n this.artifactId = (config['artifactId'] as string) || '';\n this.VersionNumber = (config['versionNumber'] as number) ?? null;\n this.ShowHeader = (config['showHeader'] as boolean) ?? false;\n this.ShowTabs = (config['showTabs'] as boolean) ?? true;\n this.ShowVersionSelector = (config['showVersionSelector'] as boolean) ?? true;\n this.ShowMetadata = (config['showMetadata'] as boolean) ?? false;\n } else {\n // Defaults for new Artifact panel\n this.artifactId = '';\n this.VersionNumber = null;\n this.ShowHeader = false;\n this.ShowTabs = true;\n this.ShowVersionSelector = true;\n this.ShowMetadata = false;\n }\n\n this.title = this.panel?.title || '';\n this.ArtifactName = '';\n this.previousArtifactName = '';\n this.ArtifactError = '';\n this.Versions = [];\n this.cdr.detectChanges();\n\n // If editing an existing artifact config, load its versions\n if (this.artifactId) {\n await this.loadVersionsForArtifact(this.artifactId);\n }\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'Artifact',\n artifactId: this.artifactId.trim(),\n versionNumber: this.VersionNumber ?? undefined,\n showHeader: this.ShowHeader,\n showTabs: this.ShowTabs,\n showVersionSelector: this.ShowVersionSelector,\n showMetadata: this.ShowMetadata\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.ArtifactError = '';\n\n if (!this.artifactId.trim()) {\n this.ArtifactError = 'Please select an artifact';\n errors.push(this.ArtifactError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.ArtifactName) {\n return this.ArtifactName;\n }\n return 'Artifact';\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 artifact selection from tree dropdown\n */\n public async OnArtifactSelection(node: TreeNode | TreeNode[] | null): Promise<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.ArtifactError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual artifacts, not collections)\n if (node.Type === 'leaf') {\n const oldArtifactName = this.ArtifactName;\n this.artifactId = node.ID;\n this.ArtifactName = node.Label;\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldArtifactName || this.title === this.previousArtifactName) {\n this.title = node.Label;\n }\n this.previousArtifactName = node.Label;\n\n // Load versions for the selected artifact\n await this.loadVersionsForArtifact(node.ID);\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnArtifactSelection}. */\n public async onArtifactSelection(node: TreeNode | TreeNode[] | null): Promise<void> {\n return this.OnArtifactSelection(node);\n }\n\n /**\n * Load all versions for a given artifact\n */\n private async loadVersionsForArtifact(artifactId: string): Promise<void> {\n this.IsLoadingVersions = true;\n this.Versions = [];\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID = '${artifactId}'`,\n OrderBy: 'VersionNumber DESC',\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n this.Versions = result.Results;\n // Default to latest version (first in descending order) if no version selected\n if (this.Versions.length > 0 && this.VersionNumber == null) {\n this.VersionNumber = this.Versions[0].VersionNumber;\n }\n }\n } catch (error) {\n console.error('Failed to load artifact versions:', error);\n } finally {\n this.IsLoadingVersions = false;\n this.cdr.detectChanges();\n }\n }\n\n public OnVersionChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnVersionChange}. */\n public onVersionChange(): void {\n return this.OnVersionChange();\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","<!-- Artifact Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Artifact Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-cube\"></i>\n Select Artifact\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #artifactDropdown\n [BranchConfig]=\"CollectionConfig\"\n [LeafConfig]=\"ArtifactLeafConfig\"\n [Value]=\"ArtifactIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse artifacts...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onArtifactSelection($event)\"\n [class.error]=\"artifactError\">\n </mj-tree-dropdown>\n @if (artifactError) {\n <span class=\"form-error\">{{ artifactError }}</span>\n }\n @if (!artifactError && !artifactId) {\n <span class=\"form-hint\">\n Browse collections or search to find an artifact\n </span>\n }\n @if (!artifactError && artifactId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ artifactName }}\n </span>\n }\n </div>\n\n <!-- Version Selection (Available only after artifact is selected) -->\n @if (artifactId) {\n <div class=\"form-group\">\n <label for=\"versionSelect\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Version\n </label>\n <div class=\"version-select-wrapper\">\n @if (!isLoadingVersions && versions.length > 0) {\n <select\n id=\"versionSelect\"\n [(ngModel)]=\"versionNumber\"\n (change)=\"onVersionChange()\"\n class=\"form-select\">\n @for (v of versions; track v) {\n <option [ngValue]=\"v.VersionNumber\">\n v{{ v.VersionNumber }} - {{ v.__mj_CreatedAt | date:'short' }}\n </option>\n }\n </select>\n }\n @if (isLoadingVersions) {\n <span class=\"form-hint\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading versions...\n </span>\n }\n @if (!isLoadingVersions && versions.length === 0) {\n <span class=\"form-hint\">\n No versions available\n </span>\n }\n </div>\n @if (versions.length > 0) {\n <span class=\"form-hint\">\n Select which version to display (latest is default)\n </span>\n }\n </div>\n }\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]=\"artifactName ? 'Default: ' + artifactName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use artifact name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showOptions\" 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 <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showHeader\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Header</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showTabs\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Tabs</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Metadata</span>\n </label>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
1
+ {"version":3,"file":"artifact-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/artifact-config-panel.component.ts","../../../src/lib/config-panels/artifact-config-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild, OnInit } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { MJArtifactVersionEntity } from '@memberjunction/core-entities';\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 Artifact parts.\n * Uses tree dropdown for collection-based artifact selection.\n */\n@RegisterClass(BaseConfigPanel, 'ArtifactPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-artifact-config-panel',\n templateUrl: './artifact-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class ArtifactConfigPanelComponent extends BaseConfigPanel implements OnInit {\n // ViewChild reference\n @ViewChild('artifactDropdown') ArtifactDropdown!: TreeDropdownComponent;\n\n /** @deprecated Use {@link ArtifactDropdown}. */\n get artifactDropdown(): TreeDropdownComponent {\n return this.ArtifactDropdown;\n }\n /** @deprecated Use {@link ArtifactDropdown}. */\n set artifactDropdown(value: TreeDropdownComponent) {\n this.ArtifactDropdown = value;\n }\n\n // Form fields\n public title = '';\n public artifactId = '';\n public ArtifactName = '';\n\n /** @deprecated Use {@link ArtifactName}. */\n public get artifactName() {\n return this.ArtifactName;\n }\n /** @deprecated Use {@link ArtifactName}. */\n public set artifactName(value) {\n this.ArtifactName = value;\n }\n public VersionNumber: number | null = null;\n\n /** @deprecated Use {@link VersionNumber}. */\n public get versionNumber(): number | null {\n return this.VersionNumber;\n }\n /** @deprecated Use {@link VersionNumber}. */\n public set versionNumber(value: number | null) {\n this.VersionNumber = value;\n }\n public ShowHeader = false;\n\n /** @deprecated Use {@link ShowHeader}. */\n public get showHeader() {\n return this.ShowHeader;\n }\n /** @deprecated Use {@link ShowHeader}. */\n public set showHeader(value) {\n this.ShowHeader = value;\n } // Default false for clean dashboard embedding\n public ShowTabs = true;\n\n /** @deprecated Use {@link ShowTabs}. */\n public get showTabs() {\n return this.ShowTabs;\n }\n /** @deprecated Use {@link ShowTabs}. */\n public set showTabs(value) {\n this.ShowTabs = value;\n }\n public ShowVersionSelector = true;\n\n /** @deprecated Use {@link ShowVersionSelector}. */\n public get showVersionSelector() {\n return this.ShowVersionSelector;\n }\n /** @deprecated Use {@link ShowVersionSelector}. */\n public set showVersionSelector(value) {\n this.ShowVersionSelector = value;\n }\n public ShowMetadata = false;\n\n /** @deprecated Use {@link ShowMetadata}. */\n public get showMetadata() {\n return this.ShowMetadata;\n }\n /** @deprecated Use {@link ShowMetadata}. */\n public set showMetadata(value) {\n this.ShowMetadata = value;\n }\n\n // Version selection\n public Versions: MJArtifactVersionEntity[] = [];\n\n /** @deprecated Use {@link Versions}. */\n public get versions(): MJArtifactVersionEntity[] {\n return this.Versions;\n }\n /** @deprecated Use {@link Versions}. */\n public set versions(value: MJArtifactVersionEntity[]) {\n this.Versions = value;\n }\n public IsLoadingVersions = false;\n\n /** @deprecated Use {@link IsLoadingVersions}. */\n public get isLoadingVersions() {\n return this.IsLoadingVersions;\n }\n /** @deprecated Use {@link IsLoadingVersions}. */\n public set isLoadingVersions(value) {\n this.IsLoadingVersions = value;\n }\n private previousArtifactName = ''; // Track for smart title updates\n\n // Collapsible section state\n public ShowOptions = false;\n\n /** @deprecated Use {@link ShowOptions}. */\n public get showOptions() {\n return this.ShowOptions;\n }\n /** @deprecated Use {@link ShowOptions}. */\n public set showOptions(value) {\n this.ShowOptions = value;\n }\n\n // Validation\n public ArtifactError = '';\n\n /** @deprecated Use {@link ArtifactError}. */\n public get artifactError() {\n return this.ArtifactError;\n }\n /** @deprecated Use {@link ArtifactError}. */\n public set artifactError(value) {\n this.ArtifactError = value;\n }\n\n // Tree configuration - initialized in ngOnInit with current user filter\n public CollectionConfig!: TreeBranchConfig;\n public ArtifactLeafConfig!: TreeLeafConfig;\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n ngOnInit(): void {\n // Get current user ID for filtering\n const userId = this.ProviderToUse.CurrentUser?.ID;\n\n // Tree configuration for Collections (branches) and Artifacts (leaves)\n // Collections have hierarchical ParentID structure.\n // Filter to show only collections owned by the current user.\n this.CollectionConfig = {\n EntityName: 'MJ: Collections',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n IconField: 'Icon',\n ColorField: 'Color',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC',\n ExtraFilter: userId ? `OwnerID = '${userId}'` : ''\n };\n\n // Artifacts from MJ: Artifacts entity using M2M junction config.\n // The relationship is: Artifact -> ArtifactVersion -> CollectionArtifact -> Collection\n // We use JunctionConfig to properly parent artifacts under their collections.\n this.ArtifactLeafConfig = {\n EntityName: 'MJ: Artifacts',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentField: '', // Using JunctionConfig instead of direct parent field\n DefaultIcon: 'fa-solid fa-cube',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC',\n ExtraFilter: userId ? `UserID = '${userId}'` : '',\n // M2M junction configuration: Artifact -> ArtifactVersion -> CollectionArtifact -> Collection\n JunctionConfig: {\n EntityName: 'MJ: Collection Artifacts',\n LeafForeignKey: 'ArtifactVersionID', // Junction references ArtifactVersion, not Artifact directly\n BranchForeignKey: 'CollectionID',\n // Indirect mapping since junction references ArtifactVersion, not Artifact\n IndirectLeafMapping: {\n IntermediateEntity: 'MJ: Artifact Versions',\n IntermediateIDField: 'ID', // CollectionArtifact.ArtifactVersionID -> ArtifactVersion.ID\n LeafIDField: 'ArtifactID' // ArtifactVersion.ArtifactID -> Artifact.ID\n }\n }\n };\n }\n\n /**\n * Get the artifactId as a CompositeKey for the tree dropdown\n */\n public get ArtifactIdAsKey(): CompositeKey | null {\n return this.artifactId ? CompositeKey.FromID(this.artifactId) : null; // first-pk-ok: artifactId is an MJ: Artifacts record (ArtifactLeafConfig) — core entity keyed by ID\n }\n\n public async initFromConfig(config: PanelConfig | null): Promise<void> {\n if (config && config.type === 'Artifact') {\n this.artifactId = (config['artifactId'] as string) || '';\n this.VersionNumber = (config['versionNumber'] as number) ?? null;\n this.ShowHeader = (config['showHeader'] as boolean) ?? false;\n this.ShowTabs = (config['showTabs'] as boolean) ?? true;\n this.ShowVersionSelector = (config['showVersionSelector'] as boolean) ?? true;\n this.ShowMetadata = (config['showMetadata'] as boolean) ?? false;\n } else {\n // Defaults for new Artifact panel\n this.artifactId = '';\n this.VersionNumber = null;\n this.ShowHeader = false;\n this.ShowTabs = true;\n this.ShowVersionSelector = true;\n this.ShowMetadata = false;\n }\n\n this.title = this.panel?.title || '';\n this.ArtifactName = '';\n this.previousArtifactName = '';\n this.ArtifactError = '';\n this.Versions = [];\n this.cdr.detectChanges();\n\n // If editing an existing artifact config, load its versions\n if (this.artifactId) {\n await this.loadVersionsForArtifact(this.artifactId);\n }\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'Artifact',\n artifactId: this.artifactId.trim(),\n versionNumber: this.VersionNumber ?? undefined,\n showHeader: this.ShowHeader,\n showTabs: this.ShowTabs,\n showVersionSelector: this.ShowVersionSelector,\n showMetadata: this.ShowMetadata\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.ArtifactError = '';\n\n if (!this.artifactId.trim()) {\n this.ArtifactError = 'Please select an artifact';\n errors.push(this.ArtifactError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.ArtifactName) {\n return this.ArtifactName;\n }\n return 'Artifact';\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 artifact selection from tree dropdown\n */\n public async OnArtifactSelection(node: TreeNode | TreeNode[] | null): Promise<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.ArtifactError = '';\n\n if (!Array.isArray(node)) {\n // Only accept leaf nodes (actual artifacts, not collections)\n if (node.Type === 'leaf') {\n const oldArtifactName = this.ArtifactName;\n this.artifactId = node.ID;\n this.ArtifactName = node.Label;\n\n // Smart title update: if title matches old name, update to new name\n if (!this.title || this.title === oldArtifactName || this.title === this.previousArtifactName) {\n this.title = node.Label;\n }\n this.previousArtifactName = node.Label;\n\n // Load versions for the selected artifact\n await this.loadVersionsForArtifact(node.ID);\n }\n }\n\n this.emitConfigChanged();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnArtifactSelection}. */\n public async onArtifactSelection(node: TreeNode | TreeNode[] | null): Promise<void> {\n return this.OnArtifactSelection(node);\n }\n\n /**\n * Load all versions for a given artifact\n */\n private async loadVersionsForArtifact(artifactId: string): Promise<void> {\n this.IsLoadingVersions = true;\n this.Versions = [];\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // conversation-scope: artifact-wide read, no conversation path applies\n const result = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID = '${artifactId}'`,\n OrderBy: 'VersionNumber DESC',\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n this.Versions = result.Results;\n // Default to latest version (first in descending order) if no version selected\n if (this.Versions.length > 0 && this.VersionNumber == null) {\n this.VersionNumber = this.Versions[0].VersionNumber;\n }\n }\n } catch (error) {\n console.error('Failed to load artifact versions:', error);\n } finally {\n this.IsLoadingVersions = false;\n this.cdr.detectChanges();\n }\n }\n\n public OnVersionChange(): void {\n this.emitConfigChanged();\n }\n\n /** @deprecated Use {@link OnVersionChange}. */\n public onVersionChange(): void {\n return this.OnVersionChange();\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","<!-- Artifact Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Artifact Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-cube\"></i>\n Select Artifact\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #artifactDropdown\n [BranchConfig]=\"CollectionConfig\"\n [LeafConfig]=\"ArtifactLeafConfig\"\n [Value]=\"ArtifactIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse artifacts...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onArtifactSelection($event)\"\n [class.error]=\"artifactError\">\n </mj-tree-dropdown>\n @if (artifactError) {\n <span class=\"form-error\">{{ artifactError }}</span>\n }\n @if (!artifactError && !artifactId) {\n <span class=\"form-hint\">\n Browse collections or search to find an artifact\n </span>\n }\n @if (!artifactError && artifactId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ artifactName }}\n </span>\n }\n </div>\n\n <!-- Version Selection (Available only after artifact is selected) -->\n @if (artifactId) {\n <div class=\"form-group\">\n <label for=\"versionSelect\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Version\n </label>\n <div class=\"version-select-wrapper\">\n @if (!isLoadingVersions && versions.length > 0) {\n <select\n id=\"versionSelect\"\n [(ngModel)]=\"versionNumber\"\n (change)=\"onVersionChange()\"\n class=\"form-select\">\n @for (v of versions; track v) {\n <option [ngValue]=\"v.VersionNumber\">\n v{{ v.VersionNumber }} - {{ v.__mj_CreatedAt | date:'short' }}\n </option>\n }\n </select>\n }\n @if (isLoadingVersions) {\n <span class=\"form-hint\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading versions...\n </span>\n }\n @if (!isLoadingVersions && versions.length === 0) {\n <span class=\"form-hint\">\n No versions available\n </span>\n }\n </div>\n @if (versions.length > 0) {\n <span class=\"form-hint\">\n Select which version to display (latest is default)\n </span>\n }\n </div>\n }\n\n <!-- Title (Optional) -->\n @if (ShowCommonFields) {\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"artifactName ? 'Default: ' + artifactName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use artifact name as title</span>\n </div>\n }\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showOptions\" 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 <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showHeader\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Header</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showTabs\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Tabs</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Metadata</span>\n </label>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
@@ -24,8 +24,8 @@ export interface ConfigPanelResult {
24
24
  * They communicate with their container via the configChanged output.
25
25
  *
26
26
  * This allows the same panel to be used:
27
- * 1. Embedded in the add-panel-dialog (step 2)
28
- * 2. Wrapped in a dialog for editing existing panels
27
+ * 1. As the Source section of the part dialog (`mj-dashboard-part-dialog`), which adds and edits parts
28
+ * 2. In the deprecated add-panel and edit-part dialogs
29
29
  *
30
30
  * Subclasses are registered with @RegisterClass and instantiated via ClassFactory.
31
31
  */
@@ -33,6 +33,11 @@ export declare abstract class BaseConfigPanel extends BaseAngularComponent {
33
33
  protected cdr: ChangeDetectorRef;
34
34
  /** The part type being configured */
35
35
  partType: MJDashboardPartTypeEntity | null;
36
+ /**
37
+ * Shows the fields that the part dialog shows itself: the title and, for a query, the
38
+ * parameter-controls and auto refresh options. The part dialog sets it to false.
39
+ */
40
+ ShowCommonFields: boolean;
36
41
  /** The existing panel (for editing) or null (for creating) */
37
42
  panel: DashboardPanel | null;
38
43
  /** The initial configuration to populate form fields */
@@ -89,6 +94,6 @@ export declare abstract class BaseConfigPanel extends BaseAngularComponent {
89
94
  */
90
95
  protected emitConfigChanged(): void;
91
96
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseConfigPanel, never>;
92
- static ɵdir: i0.ɵɵDirectiveDeclaration<BaseConfigPanel, never, never, { "partType": { "alias": "partType"; "required": false; }; "panel": { "alias": "panel"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "configChanged": "configChanged"; }, never, never, true, never>;
97
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BaseConfigPanel, never, never, { "partType": { "alias": "partType"; "required": false; }; "ShowCommonFields": { "alias": "ShowCommonFields"; "required": false; }; "panel": { "alias": "panel"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "configChanged": "configChanged"; }, never, never, true, never>;
93
98
  }
94
99
  //# sourceMappingURL=base-config-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-config-panel.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/base-config-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,iBAAiB,EAAa,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;;AAExE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,sCAAsC;IACtC,MAAM,EAAE,WAAW,CAAC;IACpB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,8BACsB,eAAgB,SAAQ,oBAAoB;IA0BlD,SAAS,CAAC,GAAG,EAAE,iBAAiB;IAzB5C,qCAAqC;IAC5B,QAAQ,EAAE,yBAAyB,GAAG,IAAI,CAAQ;IAE3D,8DAA8D;IACrD,KAAK,EAAE,cAAc,GAAG,IAAI,CAAQ;IAE7C,wDAAwD;IACxD,IACI,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,EAKnC;IACD,IAAI,MAAM,IAAI,WAAW,GAAG,IAAI,CAE/B;IACD,OAAO,CAAC,OAAO,CAA4B;IAE3C;;;OAGG;IACO,aAAa,kCAAyC;gBAE1C,GAAG,EAAE,iBAAiB;IAI5C;;;OAGG;aACa,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAEhE;;OAEG;aACa,WAAW,IAAI,WAAW;IAE1C;;;OAGG;IACI,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAIvD;;OAEG;aACa,QAAQ,IAAI,MAAM;IAElC;;OAEG;aACa,eAAe,IAAI,MAAM;IAEzC;;OAEG;IACI,OAAO,IAAI,MAAM;IAIxB;;OAEG;IACI,cAAc,IAAI,MAAM;IAI/B;;;OAGG;IACI,SAAS,IAAI,iBAAiB;IAWrC;;;OAGG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;yCA5FjB,eAAe;2CAAf,eAAe;CA+FpC"}
1
+ {"version":3,"file":"base-config-panel.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/base-config-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,iBAAiB,EAAa,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;;AAExE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,sCAAsC;IACtC,MAAM,EAAE,WAAW,CAAC;IACpB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,8BACsB,eAAgB,SAAQ,oBAAoB;IAgClD,SAAS,CAAC,GAAG,EAAE,iBAAiB;IA/B5C,qCAAqC;IAC5B,QAAQ,EAAE,yBAAyB,GAAG,IAAI,CAAQ;IAE3D;;;OAGG;IACM,gBAAgB,UAAQ;IAEjC,8DAA8D;IACrD,KAAK,EAAE,cAAc,GAAG,IAAI,CAAQ;IAE7C,wDAAwD;IACxD,IACI,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,EAKnC;IACD,IAAI,MAAM,IAAI,WAAW,GAAG,IAAI,CAE/B;IACD,OAAO,CAAC,OAAO,CAA4B;IAE3C;;;OAGG;IACO,aAAa,kCAAyC;gBAE1C,GAAG,EAAE,iBAAiB;IAI5C;;;OAGG;aACa,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAEhE;;OAEG;aACa,WAAW,IAAI,WAAW;IAE1C;;;OAGG;IACI,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAIvD;;OAEG;aACa,QAAQ,IAAI,MAAM;IAElC;;OAEG;aACa,eAAe,IAAI,MAAM;IAEzC;;OAEG;IACI,OAAO,IAAI,MAAM;IAIxB;;OAEG;IACI,cAAc,IAAI,MAAM;IAI/B;;;OAGG;IACI,SAAS,IAAI,iBAAiB;IAWrC;;;OAGG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;yCAlGjB,eAAe;2CAAf,eAAe;CAqGpC"}
@@ -7,8 +7,8 @@ import * as i0 from "@angular/core";
7
7
  * They communicate with their container via the configChanged output.
8
8
  *
9
9
  * This allows the same panel to be used:
10
- * 1. Embedded in the add-panel-dialog (step 2)
11
- * 2. Wrapped in a dialog for editing existing panels
10
+ * 1. As the Source section of the part dialog (`mj-dashboard-part-dialog`), which adds and edits parts
11
+ * 2. In the deprecated add-panel and edit-part dialogs
12
12
  *
13
13
  * Subclasses are registered with @RegisterClass and instantiated via ClassFactory.
14
14
  */
@@ -16,6 +16,11 @@ export class BaseConfigPanel extends BaseAngularComponent {
16
16
  cdr;
17
17
  /** The part type being configured */
18
18
  partType = null;
19
+ /**
20
+ * Shows the fields that the part dialog shows itself: the title and, for a query, the
21
+ * parameter-controls and auto refresh options. The part dialog sets it to false.
22
+ */
23
+ ShowCommonFields = true;
19
24
  /** The existing panel (for editing) or null (for creating) */
20
25
  panel = null;
21
26
  /** The initial configuration to populate form fields */
@@ -79,12 +84,14 @@ export class BaseConfigPanel extends BaseAngularComponent {
79
84
  this.configChanged.emit(this.getResult());
80
85
  }
81
86
  static ɵfac = function BaseConfigPanel_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || BaseConfigPanel)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
82
- static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseConfigPanel, inputs: { partType: "partType", panel: "panel", config: "config" }, outputs: { configChanged: "configChanged" }, features: [i0.ɵɵInheritDefinitionFeature] });
87
+ static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseConfigPanel, inputs: { partType: "partType", ShowCommonFields: "ShowCommonFields", panel: "panel", config: "config" }, outputs: { configChanged: "configChanged" }, features: [i0.ɵɵInheritDefinitionFeature] });
83
88
  }
84
89
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseConfigPanel, [{
85
90
  type: Directive
86
91
  }], () => [{ type: i0.ChangeDetectorRef }], { partType: [{
87
92
  type: Input
93
+ }], ShowCommonFields: [{
94
+ type: Input
88
95
  }], panel: [{
89
96
  type: Input
90
97
  }], config: [{
@@ -1 +1 @@
1
- {"version":3,"file":"base-config-panel.js","sourceRoot":"","sources":["../../../src/lib/config-panels/base-config-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAmBrE;;;;;;;;;;GAUG;AAEH,MAAM,OAAgB,eAAgB,SAAQ,oBAAoB;IA0BxC;IAzBtB,qCAAqC;IAC5B,QAAQ,GAAqC,IAAI,CAAC;IAE3D,8DAA8D;IACrD,KAAK,GAA0B,IAAI,CAAC;IAE7C,wDAAwD;IACxD,IACI,MAAM,CAAC,KAAyB;QAChC,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IACD,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IACO,OAAO,GAAuB,IAAI,CAAC;IAE3C;;;OAGG;IACO,aAAa,GAAG,IAAI,YAAY,EAAqB,CAAC;IAEhE,YAAsB,GAAsB;QACxC,KAAK,EAAE,CAAC;QADU,QAAG,GAAH,GAAG,CAAmB;IAE5C,CAAC;IAaD;;;OAGG;IACI,QAAQ;QACX,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;IAYD;;OAEG;IACI,OAAO;QACV,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACI,cAAc;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,0BAA0B,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACI,SAAS;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE;YAC1B,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YACpB,OAAO,EAAE,UAAU,CAAC,KAAK;YACzB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC5B,CAAC;IACN,CAAC;IAED;;;OAGG;IACO,iBAAiB;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;yGA9FiB,eAAe;6DAAf,eAAe;;iFAAf,eAAe;cADpC,SAAS;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAgBL,MAAM","sourcesContent":["import { Input, Output, EventEmitter, ChangeDetectorRef, Directive } from '@angular/core';\nimport { MJDashboardPartTypeEntity } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { PanelConfig, DashboardPanel } from '../models/dashboard-types';\n\n/**\n * Result emitted when configuration changes or is validated\n */\nexport interface ConfigPanelResult {\n /** The current panel configuration */\n config: PanelConfig;\n /** Current title */\n title: string;\n /** Current icon */\n icon?: string;\n /** Whether the configuration is valid */\n isValid: boolean;\n /** Validation errors (if any) */\n errors: string[];\n}\n\n/**\n * Base class for config panels.\n * Config panels contain ONLY the form content - no dialog chrome (header, footer, buttons).\n * They communicate with their container via the configChanged output.\n *\n * This allows the same panel to be used:\n * 1. Embedded in the add-panel-dialog (step 2)\n * 2. Wrapped in a dialog for editing existing panels\n *\n * Subclasses are registered with @RegisterClass and instantiated via ClassFactory.\n */\n@Directive()\nexport abstract class BaseConfigPanel extends BaseAngularComponent {\n /** The part type being configured */\n @Input() partType: MJDashboardPartTypeEntity | null = null;\n\n /** The existing panel (for editing) or null (for creating) */\n @Input() panel: DashboardPanel | null = null;\n\n /** The initial configuration to populate form fields */\n @Input()\n set config(value: PanelConfig | null) {\n if (value !== this._config) {\n this._config = value;\n this.initFromConfig(value);\n }\n }\n get config(): PanelConfig | null {\n return this._config;\n }\n private _config: PanelConfig | null = null;\n\n /**\n * Emitted when configuration changes.\n * Container should listen to this to update save button state, etc.\n */\n @Output() configChanged = new EventEmitter<ConfigPanelResult>();\n\n constructor(protected cdr: ChangeDetectorRef) {\n super();\n }\n\n /**\n * Initialize form fields from a configuration.\n * Called when config input changes.\n */\n public abstract initFromConfig(config: PanelConfig | null): void;\n\n /**\n * Build the configuration object from current form values.\n */\n public abstract buildConfig(): PanelConfig;\n\n /**\n * Validate the current form values.\n * @returns Validation result with valid flag and error messages\n */\n public validate(): { valid: boolean; errors: string[] } {\n return { valid: true, errors: [] };\n }\n\n /**\n * Get the current title for the panel.\n */\n public abstract getTitle(): string;\n\n /**\n * Get the default title for this part type.\n */\n public abstract getDefaultTitle(): string;\n\n /**\n * Get the current icon for the panel.\n */\n public getIcon(): string {\n return this.panel?.icon || this.getDefaultIcon();\n }\n\n /**\n * Get the default icon for this part type.\n */\n public getDefaultIcon(): string {\n return this.partType?.Icon || 'fa-solid fa-puzzle-piece';\n }\n\n /**\n * Get the current configuration result.\n * Called by container to get the final config when saving.\n */\n public getResult(): ConfigPanelResult {\n const validation = this.validate();\n return {\n config: this.buildConfig(),\n title: this.getTitle(),\n icon: this.getIcon(),\n isValid: validation.valid,\n errors: validation.errors\n };\n }\n\n /**\n * Emit configuration changed event.\n * Call this whenever form values change.\n */\n protected emitConfigChanged(): void {\n this.configChanged.emit(this.getResult());\n }\n}\n"]}
1
+ {"version":3,"file":"base-config-panel.js","sourceRoot":"","sources":["../../../src/lib/config-panels/base-config-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAmBrE;;;;;;;;;;GAUG;AAEH,MAAM,OAAgB,eAAgB,SAAQ,oBAAoB;IAgCxC;IA/BtB,qCAAqC;IAC5B,QAAQ,GAAqC,IAAI,CAAC;IAE3D;;;OAGG;IACM,gBAAgB,GAAG,IAAI,CAAC;IAEjC,8DAA8D;IACrD,KAAK,GAA0B,IAAI,CAAC;IAE7C,wDAAwD;IACxD,IACI,MAAM,CAAC,KAAyB;QAChC,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IACD,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IACO,OAAO,GAAuB,IAAI,CAAC;IAE3C;;;OAGG;IACO,aAAa,GAAG,IAAI,YAAY,EAAqB,CAAC;IAEhE,YAAsB,GAAsB;QACxC,KAAK,EAAE,CAAC;QADU,QAAG,GAAH,GAAG,CAAmB;IAE5C,CAAC;IAaD;;;OAGG;IACI,QAAQ;QACX,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;IAYD;;OAEG;IACI,OAAO;QACV,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACI,cAAc;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,0BAA0B,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACI,SAAS;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE;YAC1B,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YACpB,OAAO,EAAE,UAAU,CAAC,KAAK;YACzB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC5B,CAAC;IACN,CAAC;IAED;;;OAGG;IACO,iBAAiB;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;yGApGiB,eAAe;6DAAf,eAAe;;iFAAf,eAAe;cADpC,SAAS;;kBAGL,KAAK;;kBAML,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAgBL,MAAM","sourcesContent":["import { Input, Output, EventEmitter, ChangeDetectorRef, Directive } from '@angular/core';\nimport { MJDashboardPartTypeEntity } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { PanelConfig, DashboardPanel } from '../models/dashboard-types';\n\n/**\n * Result emitted when configuration changes or is validated\n */\nexport interface ConfigPanelResult {\n /** The current panel configuration */\n config: PanelConfig;\n /** Current title */\n title: string;\n /** Current icon */\n icon?: string;\n /** Whether the configuration is valid */\n isValid: boolean;\n /** Validation errors (if any) */\n errors: string[];\n}\n\n/**\n * Base class for config panels.\n * Config panels contain ONLY the form content - no dialog chrome (header, footer, buttons).\n * They communicate with their container via the configChanged output.\n *\n * This allows the same panel to be used:\n * 1. As the Source section of the part dialog (`mj-dashboard-part-dialog`), which adds and edits parts\n * 2. In the deprecated add-panel and edit-part dialogs\n *\n * Subclasses are registered with @RegisterClass and instantiated via ClassFactory.\n */\n@Directive()\nexport abstract class BaseConfigPanel extends BaseAngularComponent {\n /** The part type being configured */\n @Input() partType: MJDashboardPartTypeEntity | null = null;\n\n /**\n * Shows the fields that the part dialog shows itself: the title and, for a query, the\n * parameter-controls and auto refresh options. The part dialog sets it to false.\n */\n @Input() ShowCommonFields = true;\n\n /** The existing panel (for editing) or null (for creating) */\n @Input() panel: DashboardPanel | null = null;\n\n /** The initial configuration to populate form fields */\n @Input()\n set config(value: PanelConfig | null) {\n if (value !== this._config) {\n this._config = value;\n this.initFromConfig(value);\n }\n }\n get config(): PanelConfig | null {\n return this._config;\n }\n private _config: PanelConfig | null = null;\n\n /**\n * Emitted when configuration changes.\n * Container should listen to this to update save button state, etc.\n */\n @Output() configChanged = new EventEmitter<ConfigPanelResult>();\n\n constructor(protected cdr: ChangeDetectorRef) {\n super();\n }\n\n /**\n * Initialize form fields from a configuration.\n * Called when config input changes.\n */\n public abstract initFromConfig(config: PanelConfig | null): void;\n\n /**\n * Build the configuration object from current form values.\n */\n public abstract buildConfig(): PanelConfig;\n\n /**\n * Validate the current form values.\n * @returns Validation result with valid flag and error messages\n */\n public validate(): { valid: boolean; errors: string[] } {\n return { valid: true, errors: [] };\n }\n\n /**\n * Get the current title for the panel.\n */\n public abstract getTitle(): string;\n\n /**\n * Get the default title for this part type.\n */\n public abstract getDefaultTitle(): string;\n\n /**\n * Get the current icon for the panel.\n */\n public getIcon(): string {\n return this.panel?.icon || this.getDefaultIcon();\n }\n\n /**\n * Get the default icon for this part type.\n */\n public getDefaultIcon(): string {\n return this.partType?.Icon || 'fa-solid fa-puzzle-piece';\n }\n\n /**\n * Get the current configuration result.\n * Called by container to get the final config when saving.\n */\n public getResult(): ConfigPanelResult {\n const validation = this.validate();\n return {\n config: this.buildConfig(),\n title: this.getTitle(),\n icon: this.getIcon(),\n isValid: validation.valid,\n errors: validation.errors\n };\n }\n\n /**\n * Emit configuration changed event.\n * Call this whenever form values change.\n */\n protected emitConfigChanged(): void {\n this.configChanged.emit(this.getResult());\n }\n}\n"]}