@memberjunction/ng-dashboard-viewer 5.43.0 → 5.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/config-panels/artifact-config-panel.component.d.ts +0 -1
- package/dist/lib/config-panels/artifact-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/artifact-config-panel.component.js +49 -63
- package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.d.ts +0 -1
- package/dist/lib/config-panels/query-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.js +110 -124
- package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.d.ts +0 -2
- package/dist/lib/config-panels/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.js +142 -171
- package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.js +2 -2
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts +4 -0
- package/dist/lib/dashboard-browser/dashboard-browser.component.d.ts.map +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.js +205 -272
- package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts +46 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js +229 -49
- package/dist/lib/dashboard-viewer/dashboard-viewer.component.js.map +1 -1
- package/dist/lib/dashboard-viewer.module.d.ts +2 -1
- package/dist/lib/dashboard-viewer.module.d.ts.map +1 -1
- package/dist/lib/dashboard-viewer.module.js +11 -3
- package/dist/lib/dashboard-viewer.module.js.map +1 -1
- package/dist/lib/parts/artifact-part.component.d.ts.map +1 -1
- package/dist/lib/parts/artifact-part.component.js +25 -32
- package/dist/lib/parts/artifact-part.component.js.map +1 -1
- package/dist/lib/parts/query-part.component.d.ts.map +1 -1
- package/dist/lib/parts/query-part.component.js +25 -32
- package/dist/lib/parts/query-part.component.js.map +1 -1
- package/dist/lib/parts/view-part.component.d.ts.map +1 -1
- package/dist/lib/parts/view-part.component.js +25 -32
- package/dist/lib/parts/view-part.component.js.map +1 -1
- package/dist/lib/parts/weburl-part.component.d.ts.map +1 -1
- package/dist/lib/parts/weburl-part.component.js +46 -52
- package/dist/lib/parts/weburl-part.component.js.map +1 -1
- package/package.json +13 -11
- package/dist/__tests__/exports.test.d.ts +0 -2
- package/dist/__tests__/exports.test.d.ts.map +0 -1
- package/dist/__tests__/exports.test.js +0 -17
- package/dist/__tests__/exports.test.js.map +0 -1
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
|
@@ -51,7 +51,6 @@ export declare class ArtifactConfigPanelComponent extends BaseConfigPanel implem
|
|
|
51
51
|
private loadVersionsForArtifact;
|
|
52
52
|
onVersionChange(): void;
|
|
53
53
|
onOptionChange(): void;
|
|
54
|
-
toggleOptions(): void;
|
|
55
54
|
static ɵfac: i0.ɵɵFactoryDeclaration<ArtifactConfigPanelComponent, never>;
|
|
56
55
|
static ɵcmp: i0.ɵɵComponentDeclaration<ArtifactConfigPanelComponent, "mj-artifact-config-panel", never, {}, {}, never, never, false, never>;
|
|
57
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/artifact-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAW,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,qBAAqB,EACxB,MAAM,0BAA0B,CAAC;;AAElC;;;GAGG;AACH,qBAOa,4BAA6B,SAAQ,eAAgB,YAAW,MAAM;IAEhD,gBAAgB,EAAG,qBAAqB,CAAC;IAGjE,KAAK,SAAM;IACX,UAAU,SAAM;IAChB,YAAY,SAAM;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,UAAU,UAAS;IACnB,QAAQ,UAAQ;IAChB,mBAAmB,UAAQ;IAC3B,YAAY,UAAS;IAGrB,QAAQ,EAAE,uBAAuB,EAAE,CAAM;IACzC,iBAAiB,UAAS;IACjC,OAAO,CAAC,oBAAoB,CAAM;IAG3B,WAAW,UAAS;IAGpB,aAAa,SAAM;IAGnB,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,kBAAkB,EAAG,cAAc,CAAC;gBAE/B,GAAG,EAAE,iBAAiB;IAIlC,QAAQ,IAAI,IAAI;IA+ChB;;OAEG;IACH,IAAW,eAAe,IAAI,YAAY,GAAG,IAAI,CAEhD;IAEY,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B/D,WAAW,IAAI,WAAW;IAYjB,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAazD,eAAe,IAAI,MAAM;IAOzB,QAAQ,IAAI,MAAM;IAKlB,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACU,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BnF;;OAEG;YACW,uBAAuB;IA6B9B,eAAe,IAAI,IAAI;IAIvB,cAAc,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"artifact-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/artifact-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAW,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,qBAAqB,EACxB,MAAM,0BAA0B,CAAC;;AAElC;;;GAGG;AACH,qBAOa,4BAA6B,SAAQ,eAAgB,YAAW,MAAM;IAEhD,gBAAgB,EAAG,qBAAqB,CAAC;IAGjE,KAAK,SAAM;IACX,UAAU,SAAM;IAChB,YAAY,SAAM;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,UAAU,UAAS;IACnB,QAAQ,UAAQ;IAChB,mBAAmB,UAAQ;IAC3B,YAAY,UAAS;IAGrB,QAAQ,EAAE,uBAAuB,EAAE,CAAM;IACzC,iBAAiB,UAAS;IACjC,OAAO,CAAC,oBAAoB,CAAM;IAG3B,WAAW,UAAS;IAGpB,aAAa,SAAM;IAGnB,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,kBAAkB,EAAG,cAAc,CAAC;gBAE/B,GAAG,EAAE,iBAAiB;IAIlC,QAAQ,IAAI,IAAI;IA+ChB;;OAEG;IACH,IAAW,eAAe,IAAI,YAAY,GAAG,IAAI,CAEhD;IAEY,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B/D,WAAW,IAAI,WAAW;IAYjB,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAazD,eAAe,IAAI,MAAM;IAOzB,QAAQ,IAAI,MAAM;IAKlB,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACU,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BnF;;OAEG;YACW,uBAAuB;IA6B9B,eAAe,IAAI,IAAI;IAIvB,cAAc,IAAI,IAAI;yCApOpB,4BAA4B;2CAA5B,4BAA4B;CAuOxC"}
|
|
@@ -11,7 +11,8 @@ import { BaseConfigPanel } from './base-config-panel';
|
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@angular/forms";
|
|
13
13
|
import * as i2 from "@memberjunction/ng-trees";
|
|
14
|
-
import * as i3 from "@
|
|
14
|
+
import * as i3 from "@memberjunction/ng-ui-components";
|
|
15
|
+
import * as i4 from "@angular/common";
|
|
15
16
|
const _c0 = ["artifactDropdown"];
|
|
16
17
|
function ArtifactConfigPanelComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
17
18
|
i0.ɵɵelementStart(0, "span", 6);
|
|
@@ -29,7 +30,7 @@ function ArtifactConfigPanelComponent_Conditional_10_Template(rf, ctx) { if (rf
|
|
|
29
30
|
} }
|
|
30
31
|
function ArtifactConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
31
32
|
i0.ɵɵelementStart(0, "span", 8);
|
|
32
|
-
i0.ɵɵelement(1, "i",
|
|
33
|
+
i0.ɵɵelement(1, "i", 21);
|
|
33
34
|
i0.ɵɵtext(2);
|
|
34
35
|
i0.ɵɵelementEnd();
|
|
35
36
|
} if (rf & 2) {
|
|
@@ -38,7 +39,7 @@ function ArtifactConfigPanelComponent_Conditional_11_Template(rf, ctx) { if (rf
|
|
|
38
39
|
i0.ɵɵtextInterpolate1(" Selected: ", ctx_r1.artifactName, " ");
|
|
39
40
|
} }
|
|
40
41
|
function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
-
i0.ɵɵelementStart(0, "option",
|
|
42
|
+
i0.ɵɵelementStart(0, "option", 27);
|
|
42
43
|
i0.ɵɵtext(1);
|
|
43
44
|
i0.ɵɵpipe(2, "date");
|
|
44
45
|
i0.ɵɵelementEnd();
|
|
@@ -50,10 +51,10 @@ function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Templat
|
|
|
50
51
|
} }
|
|
51
52
|
function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
52
53
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
53
|
-
i0.ɵɵelementStart(0, "select",
|
|
54
|
+
i0.ɵɵelementStart(0, "select", 26);
|
|
54
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); });
|
|
55
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()); });
|
|
56
|
-
i0.ɵɵrepeaterCreate(1, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Template, 3, 6, "option",
|
|
57
|
+
i0.ɵɵrepeaterCreate(1, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_For_2_Template, 3, 6, "option", 27, i0.ɵɵrepeaterTrackByIdentity);
|
|
57
58
|
i0.ɵɵelementEnd();
|
|
58
59
|
} if (rf & 2) {
|
|
59
60
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -63,7 +64,7 @@ function ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template(rf,
|
|
|
63
64
|
} }
|
|
64
65
|
function ArtifactConfigPanelComponent_Conditional_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
65
66
|
i0.ɵɵelementStart(0, "span", 7);
|
|
66
|
-
i0.ɵɵelement(1, "i",
|
|
67
|
+
i0.ɵɵelement(1, "i", 28);
|
|
67
68
|
i0.ɵɵtext(2, " Loading versions... ");
|
|
68
69
|
i0.ɵɵelementEnd();
|
|
69
70
|
} }
|
|
@@ -78,12 +79,12 @@ function ArtifactConfigPanelComponent_Conditional_12_Conditional_8_Template(rf,
|
|
|
78
79
|
i0.ɵɵelementEnd();
|
|
79
80
|
} }
|
|
80
81
|
function ArtifactConfigPanelComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
81
|
-
i0.ɵɵelementStart(0, "div", 2)(1, "label",
|
|
82
|
-
i0.ɵɵelement(2, "i",
|
|
82
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "label", 22);
|
|
83
|
+
i0.ɵɵelement(2, "i", 23);
|
|
83
84
|
i0.ɵɵtext(3, " Version ");
|
|
84
85
|
i0.ɵɵelementEnd();
|
|
85
|
-
i0.ɵɵelementStart(4, "div",
|
|
86
|
-
i0.ɵɵconditionalCreate(5, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template, 3, 1, "select",
|
|
86
|
+
i0.ɵɵelementStart(4, "div", 24);
|
|
87
|
+
i0.ɵɵconditionalCreate(5, ArtifactConfigPanelComponent_Conditional_12_Conditional_5_Template, 3, 1, "select", 25);
|
|
87
88
|
i0.ɵɵconditionalCreate(6, ArtifactConfigPanelComponent_Conditional_12_Conditional_6_Template, 3, 0, "span", 7);
|
|
88
89
|
i0.ɵɵconditionalCreate(7, ArtifactConfigPanelComponent_Conditional_12_Conditional_7_Template, 2, 0, "span", 7);
|
|
89
90
|
i0.ɵɵelementEnd();
|
|
@@ -100,40 +101,9 @@ function ArtifactConfigPanelComponent_Conditional_12_Template(rf, ctx) { if (rf
|
|
|
100
101
|
i0.ɵɵadvance();
|
|
101
102
|
i0.ɵɵconditional(ctx_r1.versions.length > 0 ? 8 : -1);
|
|
102
103
|
} }
|
|
103
|
-
function
|
|
104
|
-
|
|
105
|
-
i0.ɵɵ
|
|
106
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Conditional_28_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.showHeader, $event) || (ctx_r1.showHeader = $event); return i0.ɵɵresetView($event); });
|
|
107
|
-
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Conditional_28_Template_input_change_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
108
|
-
i0.ɵɵelementEnd();
|
|
109
|
-
i0.ɵɵelement(4, "span", 30);
|
|
110
|
-
i0.ɵɵelementStart(5, "span", 31);
|
|
111
|
-
i0.ɵɵtext(6, "Show Header");
|
|
112
|
-
i0.ɵɵelementEnd()();
|
|
113
|
-
i0.ɵɵelementStart(7, "label", 28)(8, "input", 29);
|
|
114
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Conditional_28_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.showTabs, $event) || (ctx_r1.showTabs = $event); return i0.ɵɵresetView($event); });
|
|
115
|
-
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Conditional_28_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
116
|
-
i0.ɵɵelementEnd();
|
|
117
|
-
i0.ɵɵelement(9, "span", 30);
|
|
118
|
-
i0.ɵɵelementStart(10, "span", 31);
|
|
119
|
-
i0.ɵɵtext(11, "Show Tabs");
|
|
120
|
-
i0.ɵɵelementEnd()();
|
|
121
|
-
i0.ɵɵelementStart(12, "label", 28)(13, "input", 29);
|
|
122
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Conditional_28_Template_input_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.showMetadata, $event) || (ctx_r1.showMetadata = $event); return i0.ɵɵresetView($event); });
|
|
123
|
-
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Conditional_28_Template_input_change_13_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOptionChange()); });
|
|
124
|
-
i0.ɵɵelementEnd();
|
|
125
|
-
i0.ɵɵelement(14, "span", 30);
|
|
126
|
-
i0.ɵɵelementStart(15, "span", 31);
|
|
127
|
-
i0.ɵɵtext(16, "Show Metadata");
|
|
128
|
-
i0.ɵɵelementEnd()()()();
|
|
129
|
-
} if (rf & 2) {
|
|
130
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
131
|
-
i0.ɵɵadvance(3);
|
|
132
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.showHeader);
|
|
133
|
-
i0.ɵɵadvance(5);
|
|
134
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.showTabs);
|
|
135
|
-
i0.ɵɵadvance(5);
|
|
136
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.showMetadata);
|
|
104
|
+
function ArtifactConfigPanelComponent_ng_template_23_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
+
i0.ɵɵelement(0, "i", 29);
|
|
106
|
+
i0.ɵɵtext(1, " Display Options ");
|
|
137
107
|
} }
|
|
138
108
|
/**
|
|
139
109
|
* Configuration panel for Artifact parts.
|
|
@@ -342,16 +312,13 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
342
312
|
onOptionChange() {
|
|
343
313
|
this.emitConfigChanged();
|
|
344
314
|
}
|
|
345
|
-
toggleOptions() {
|
|
346
|
-
this.showOptions = !this.showOptions;
|
|
347
|
-
}
|
|
348
315
|
static ɵfac = function ArtifactConfigPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
349
316
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactConfigPanelComponent, selectors: [["mj-artifact-config-panel"]], viewQuery: function ArtifactConfigPanelComponent_Query(rf, ctx) { if (rf & 1) {
|
|
350
317
|
i0.ɵɵviewQuery(_c0, 5);
|
|
351
318
|
} if (rf & 2) {
|
|
352
319
|
let _t;
|
|
353
320
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.artifactDropdown = _t.first);
|
|
354
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
321
|
+
} }, 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) {
|
|
355
322
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
356
323
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "label");
|
|
357
324
|
i0.ɵɵelement(3, "i", 3);
|
|
@@ -380,16 +347,33 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
380
347
|
i0.ɵɵelementStart(20, "span", 7);
|
|
381
348
|
i0.ɵɵtext(21, "Leave empty to use artifact name as title");
|
|
382
349
|
i0.ɵɵelementEnd()();
|
|
383
|
-
i0.ɵɵelementStart(22, "
|
|
384
|
-
i0.ɵɵ
|
|
385
|
-
i0.ɵɵ
|
|
386
|
-
i0.ɵɵ
|
|
387
|
-
i0.ɵɵ
|
|
350
|
+
i0.ɵɵelementStart(22, "mj-accordion-panel", 13);
|
|
351
|
+
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); });
|
|
352
|
+
i0.ɵɵtemplate(23, ArtifactConfigPanelComponent_ng_template_23_Template, 2, 0, "ng-template", 14);
|
|
353
|
+
i0.ɵɵelementStart(24, "div", 15)(25, "div", 16)(26, "label", 17)(27, "input", 18);
|
|
354
|
+
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); });
|
|
355
|
+
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_27_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
|
|
388
356
|
i0.ɵɵelementEnd();
|
|
389
|
-
i0.ɵɵelement(
|
|
357
|
+
i0.ɵɵelement(28, "span", 19);
|
|
358
|
+
i0.ɵɵelementStart(29, "span", 20);
|
|
359
|
+
i0.ɵɵtext(30, "Show Header");
|
|
360
|
+
i0.ɵɵelementEnd()();
|
|
361
|
+
i0.ɵɵelementStart(31, "label", 17)(32, "input", 18);
|
|
362
|
+
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); });
|
|
363
|
+
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_32_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
|
|
390
364
|
i0.ɵɵelementEnd();
|
|
391
|
-
i0.ɵɵ
|
|
365
|
+
i0.ɵɵelement(33, "span", 19);
|
|
366
|
+
i0.ɵɵelementStart(34, "span", 20);
|
|
367
|
+
i0.ɵɵtext(35, "Show Tabs");
|
|
392
368
|
i0.ɵɵelementEnd()();
|
|
369
|
+
i0.ɵɵelementStart(36, "label", 17)(37, "input", 18);
|
|
370
|
+
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); });
|
|
371
|
+
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_37_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
|
|
372
|
+
i0.ɵɵelementEnd();
|
|
373
|
+
i0.ɵɵelement(38, "span", 19);
|
|
374
|
+
i0.ɵɵelementStart(39, "span", 20);
|
|
375
|
+
i0.ɵɵtext(40, "Show Metadata");
|
|
376
|
+
i0.ɵɵelementEnd()()()()()();
|
|
393
377
|
} if (rf & 2) {
|
|
394
378
|
i0.ɵɵadvance(7);
|
|
395
379
|
i0.ɵɵclassProp("error", ctx.artifactError);
|
|
@@ -405,13 +389,15 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
405
389
|
i0.ɵɵadvance(7);
|
|
406
390
|
i0.ɵɵtwoWayProperty("ngModel", ctx.title);
|
|
407
391
|
i0.ɵɵproperty("placeholder", ctx.artifactName ? "Default: " + ctx.artifactName : "Enter a custom title");
|
|
408
|
-
i0.ɵɵadvance(
|
|
409
|
-
i0.ɵɵ
|
|
410
|
-
i0.ɵɵadvance(
|
|
411
|
-
i0.ɵɵ
|
|
412
|
-
i0.ɵɵadvance();
|
|
413
|
-
i0.ɵɵ
|
|
414
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent, i3.DatePipe], styles: ["\n\n\n\n\n\n\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n\n.config-panel--compact[_ngcontent-%COMP%] {\n gap: 16px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] {\n gap: 8px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-select[_ngcontent-%COMP%] {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n\n\n\n\n\n.optional-tag[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-hint--selected[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n\n\n\n.collapsible-section[_ngcontent-%COMP%] {\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n overflow: hidden;\n}\n\n.collapsible-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 12px 16px;\n border: none;\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.collapsible-header[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.collapsible-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.collapsible-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.collapsible-content[_ngcontent-%COMP%] {\n padding: 16px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n\n\n\n\n.radio-group--horizontal[_ngcontent-%COMP%] {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n width: 8px;\n height: 8px;\n}\n\n\n\n\n\n\n.checkbox-group--compact[_ngcontent-%COMP%] {\n gap: 4px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-mark[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-label[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\nmj-tree-dropdown.error[_ngcontent-%COMP%] {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error[_ngcontent-%COMP%]:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}"] });
|
|
392
|
+
i0.ɵɵadvance(3);
|
|
393
|
+
i0.ɵɵtwoWayProperty("Expanded", ctx.showOptions);
|
|
394
|
+
i0.ɵɵadvance(5);
|
|
395
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.showHeader);
|
|
396
|
+
i0.ɵɵadvance(5);
|
|
397
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.showTabs);
|
|
398
|
+
i0.ɵɵadvance(5);
|
|
399
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.showMetadata);
|
|
400
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i4.DatePipe], styles: ["\n\n\n\n\n\n\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n\n.config-panel--compact[_ngcontent-%COMP%] {\n gap: 16px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] {\n gap: 8px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-select[_ngcontent-%COMP%] {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n\n\n\n\n\n.optional-tag[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.form-hint--selected[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n\n\n\n\n\n.config-section-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n\n\n\n\n.radio-group--horizontal[_ngcontent-%COMP%] {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n width: 8px;\n height: 8px;\n}\n\n\n\n\n\n\n.checkbox-group--compact[_ngcontent-%COMP%] {\n gap: 4px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-mark[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-label[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\nmj-tree-dropdown.error[_ngcontent-%COMP%] {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error[_ngcontent-%COMP%]:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}"] });
|
|
415
401
|
};
|
|
416
402
|
ArtifactConfigPanelComponent = __decorate([
|
|
417
403
|
RegisterClass(BaseConfigPanel, 'ArtifactPanelConfigDialog')
|
|
@@ -419,7 +405,7 @@ ArtifactConfigPanelComponent = __decorate([
|
|
|
419
405
|
export { ArtifactConfigPanelComponent };
|
|
420
406
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ArtifactConfigPanelComponent, [{
|
|
421
407
|
type: Component,
|
|
422
|
-
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 (Collapsible) -->\n <div class=\"collapsible-section\">\n <button\n type=\"button\"\n class=\"collapsible-header\"\n (click)=\"toggleOptions()\"\n [attr.aria-expanded]=\"showOptions\">\n <span class=\"collapsible-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Display Options\n </span>\n <i class=\"collapsible-chevron fa-solid\"\n [class.fa-chevron-down]=\"!showOptions\"\n [class.fa-chevron-up]=\"showOptions\"></i>\n </button>\n\n @if (showOptions) {\n <div class=\"collapsible-content\">\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 }\n </div>\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 Collapsible Section\n ======================================== */\n\n.collapsible-section {\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n overflow: hidden;\n}\n\n.collapsible-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 12px 16px;\n border: none;\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.collapsible-header:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.collapsible-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.collapsible-chevron {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.collapsible-content {\n padding: 16px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\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"] }]
|
|
408
|
+
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"] }]
|
|
423
409
|
}], () => [{ type: i0.ChangeDetectorRef }], { artifactDropdown: [{
|
|
424
410
|
type: ViewChild,
|
|
425
411
|
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 // Form fields\n public title = '';\n public artifactId = '';\n public artifactName = '';\n public versionNumber: number | null = null;\n public showHeader = false; // Default false for clean dashboard embedding\n public showTabs = true;\n public showVersionSelector = true;\n public showMetadata = false;\n\n // Version selection\n public versions: MJArtifactVersionEntity[] = [];\n public isLoadingVersions = false;\n private previousArtifactName = ''; // Track for smart title updates\n\n // Collapsible section state\n public showOptions = false;\n\n // Validation\n public artifactError = '';\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;\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 /**\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 /**\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 public onOptionChange(): void {\n this.emitConfigChanged();\n }\n\n public toggleOptions(): void {\n this.showOptions = !this.showOptions;\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 (Collapsible) -->\n <div class=\"collapsible-section\">\n <button\n type=\"button\"\n class=\"collapsible-header\"\n (click)=\"toggleOptions()\"\n [attr.aria-expanded]=\"showOptions\">\n <span class=\"collapsible-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Display Options\n </span>\n <i class=\"collapsible-chevron fa-solid\"\n [class.fa-chevron-down]=\"!showOptions\"\n [class.fa-chevron-up]=\"showOptions\"></i>\n </button>\n\n @if (showOptions) {\n <div class=\"collapsible-content\">\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 }\n </div>\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 // Form fields\n public title = '';\n public artifactId = '';\n public artifactName = '';\n public versionNumber: number | null = null;\n public showHeader = false; // Default false for clean dashboard embedding\n public showTabs = true;\n public showVersionSelector = true;\n public showMetadata = false;\n\n // Version selection\n public versions: MJArtifactVersionEntity[] = [];\n public isLoadingVersions = false;\n private previousArtifactName = ''; // Track for smart title updates\n\n // Collapsible section state\n public showOptions = false;\n\n // Validation\n public artifactError = '';\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;\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 /**\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 /**\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 public onOptionChange(): void {\n this.emitConfigChanged();\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"]}
|
|
@@ -43,7 +43,6 @@ export declare class QueryConfigPanelComponent extends BaseConfigPanel {
|
|
|
43
43
|
onParameterLayoutChange(): void;
|
|
44
44
|
onAutoRefreshChange(): void;
|
|
45
45
|
onOptionChange(): void;
|
|
46
|
-
toggleAdvancedOptions(): void;
|
|
47
46
|
getParameterLayoutDescription(): string;
|
|
48
47
|
static ɵfac: i0.ɵɵFactoryDeclaration<QueryConfigPanelComponent, never>;
|
|
49
48
|
static ɵcmp: i0.ɵɵComponentDeclaration<QueryConfigPanelComponent, "mj-query-config-panel", never, {}, {}, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/query-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,qBAAqB,EACxB,MAAM,0BAA0B,CAAC;;AAElC;;;GAGG;AACH,qBAOa,yBAA0B,SAAQ,eAAe;IAE9B,aAAa,EAAG,qBAAqB,CAAC;IAG3D,KAAK,SAAM;IACX,OAAO,SAAM;IACb,SAAS,SAAM;IACf,qBAAqB,UAAQ;IAC7B,eAAe,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAY;IAC5D,kBAAkB,SAAK;IACvB,qBAAqB,UAAQ;IAGpC,OAAO,CAAC,iBAAiB,CAAM;IAGxB,mBAAmB,UAAS;IAG5B,UAAU,SAAM;IAGhB,mBAAmB,EAAE,gBAAgB,CAQ1C;IAEK,eAAe,EAAE,cAAc,CAQpC;gBAEU,GAAG,EAAE,iBAAiB;IAIlC;;OAEG;IACH,IAAW,YAAY,IAAI,YAAY,GAAG,IAAI,CAE7C;IAEM,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAwBhD,WAAW,IAAI,WAAW;IAYjB,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAazD,eAAe,IAAI,MAAM;IAOzB,QAAQ,IAAI,MAAM;IAKlB,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACI,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IA2B1D,uBAAuB,IAAI,IAAI;IAI/B,mBAAmB,IAAI,IAAI;IAI3B,cAAc,IAAI,IAAI;IAItB,
|
|
1
|
+
{"version":3,"file":"query-config-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/config-panels/query-config-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,iBAAiB,EAAa,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,qBAAqB,EACxB,MAAM,0BAA0B,CAAC;;AAElC;;;GAGG;AACH,qBAOa,yBAA0B,SAAQ,eAAe;IAE9B,aAAa,EAAG,qBAAqB,CAAC;IAG3D,KAAK,SAAM;IACX,OAAO,SAAM;IACb,SAAS,SAAM;IACf,qBAAqB,UAAQ;IAC7B,eAAe,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAY;IAC5D,kBAAkB,SAAK;IACvB,qBAAqB,UAAQ;IAGpC,OAAO,CAAC,iBAAiB,CAAM;IAGxB,mBAAmB,UAAS;IAG5B,UAAU,SAAM;IAGhB,mBAAmB,EAAE,gBAAgB,CAQ1C;IAEK,eAAe,EAAE,cAAc,CAQpC;gBAEU,GAAG,EAAE,iBAAiB;IAIlC;;OAEG;IACH,IAAW,YAAY,IAAI,YAAY,GAAG,IAAI,CAE7C;IAEM,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAwBhD,WAAW,IAAI,WAAW;IAYjB,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAazD,eAAe,IAAI,MAAM;IAOzB,QAAQ,IAAI,MAAM;IAKlB,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACI,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IA2B1D,uBAAuB,IAAI,IAAI;IAI/B,mBAAmB,IAAI,IAAI;IAI3B,cAAc,IAAI,IAAI;IAItB,6BAA6B,IAAI,MAAM;yCAjKrC,yBAAyB;2CAAzB,yBAAyB;CA2KrC"}
|