@memberjunction/ng-dashboard-viewer 6.1.0-edge.5 → 6.1.0-edge.6
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/breadcrumb/dashboard-breadcrumb.component.js +1 -1
- package/dist/lib/config-dialogs/confirm-dialog.component.js +2 -2
- package/dist/lib/config-dialogs/confirm-dialog.component.js.map +1 -1
- package/dist/lib/config-panels/artifact-config-panel.component.js +7 -7
- package/dist/lib/config-panels/artifact-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/query-config-panel.component.js +10 -10
- package/dist/lib/config-panels/query-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/view-config-panel.component.js +12 -12
- package/dist/lib/config-panels/view-config-panel.component.js.map +1 -1
- package/dist/lib/config-panels/weburl-config-panel.component.js +1 -1
- package/dist/lib/dashboard-browser/dashboard-browser.component.js +9 -9
- package/dist/lib/dashboard-browser/dashboard-browser.component.js.map +1 -1
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js +2 -2
- package/dist/lib/dialogs/add-panel-dialog/add-panel-dialog.component.js.map +1 -1
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js +2 -2
- package/dist/lib/dialogs/edit-part-dialog/edit-part-dialog.component.js.map +1 -1
- package/dist/lib/parts/weburl-part.component.js +1 -1
- package/package.json +20 -20
|
@@ -221,7 +221,7 @@ export class DashboardBreadcrumbComponent {
|
|
|
221
221
|
i0.ɵɵconditionalCreate(0, DashboardBreadcrumbComponent_Conditional_0_Template, 8, 8, "div", 0);
|
|
222
222
|
} if (rf & 2) {
|
|
223
223
|
i0.ɵɵconditional(ctx.Visible ? 0 : -1);
|
|
224
|
-
} }, styles: ["\n\n
|
|
224
|
+
} }, styles: ["\n\n.dashboard-breadcrumb[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 12px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-wrap: wrap;\n}\n\n\n.dashboard-breadcrumb.large[_ngcontent-%COMP%] {\n padding: 16px 24px;\n}\n\n.dashboard-breadcrumb.large[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%] {\n font-size: 15px;\n padding: 8px 12px;\n}\n\n.dashboard-breadcrumb.large[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.dashboard-breadcrumb.large[_ngcontent-%COMP%] .breadcrumb-item.root[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.dashboard-breadcrumb.large[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n.breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 13px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s, border-color 0.15s;\n border: 2px solid transparent;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%]:hover {\n background: transparent;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.breadcrumb-item.root[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n.breadcrumb-item.drop-target[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 10px;\n}\n\n\n.breadcrumb-item.dashboard-name[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-item.dashboard-name[_ngcontent-%COMP%]:hover {\n background: transparent;\n}\n\n.breadcrumb-item.dashboard-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}"], changeDetection: 0 });
|
|
225
225
|
}
|
|
226
226
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DashboardBreadcrumbComponent, [{
|
|
227
227
|
type: Component,
|
|
@@ -5,7 +5,7 @@ function ConfirmDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
5
5
|
i0.ɵɵelementStart(0, "div", 1);
|
|
6
6
|
i0.ɵɵlistener("click", function ConfirmDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancel()); });
|
|
7
7
|
i0.ɵɵelementStart(1, "div", 2);
|
|
8
|
-
i0.ɵɵlistener("click", function ConfirmDialogComponent_Conditional_0_Template_div_click_1_listener($event) {
|
|
8
|
+
i0.ɵɵlistener("click", function ConfirmDialogComponent_Conditional_0_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
|
|
9
9
|
i0.ɵɵelementStart(2, "div", 3)(3, "div", 4);
|
|
10
10
|
i0.ɵɵelement(4, "i");
|
|
11
11
|
i0.ɵɵelementEnd();
|
|
@@ -89,7 +89,7 @@ export class ConfirmDialogComponent {
|
|
|
89
89
|
i0.ɵɵconditionalCreate(0, ConfirmDialogComponent_Conditional_0_Template, 14, 12, "div", 0);
|
|
90
90
|
} if (rf & 2) {
|
|
91
91
|
i0.ɵɵconditional(ctx.visible ? 0 : -1);
|
|
92
|
-
} }, styles: ["\n\n\n\n\n\n\n\n\n\n.config-dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n\n\n\n.config-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 25px 80px rgba(0, 0, 0, 0.35);\n width: 520px;\n max-width: 90vw;\n max-height: 85vh;\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideUp 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n\n\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 24px;\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n flex-shrink: 0;\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n flex: 1;\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.close-button[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 10px;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.close-button[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.08);\n color: var(--mj-text-primary);\n}\n\n.close-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n\n\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 24px;\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.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 20px 24px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 28px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.btn-primary[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n\n\n.confirm-dialog[_ngcontent-%COMP%] {\n width: 400px;\n}\n\n.confirm-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n text-align: center;\n padding: 32px 24px;\n}\n\n.confirm-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 20px;\n}\n\n.confirm-icon.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n.confirm-icon.warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-status-warning);\n}\n\n.confirm-icon.danger[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.confirm-icon.danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-status-error);\n}\n\n.confirm-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.confirm-message[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n line-height: 1.5;\n}\n\n.confirm-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] {\n justify-content: center;\n}\n\n.btn-danger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 28px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-status-error);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n}\n\n.btn-danger[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}"] });
|
|
92
|
+
} }, styles: ["\n\n\n\n\n\n\n\n.config-dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n\n\n.config-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 25px 80px rgba(0, 0, 0, 0.35);\n width: 520px;\n max-width: 90vw;\n max-height: 85vh;\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideUp 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 24px;\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n flex-shrink: 0;\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n flex: 1;\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.close-button[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 10px;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.close-button[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.08);\n color: var(--mj-text-primary);\n}\n\n.close-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 20px 24px;\n border-top: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 28px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.btn-primary[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n\n.confirm-dialog[_ngcontent-%COMP%] {\n width: 400px;\n}\n\n.confirm-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n text-align: center;\n padding: 32px 24px;\n}\n\n.confirm-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 20px;\n}\n\n.confirm-icon.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n.confirm-icon.warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-status-warning);\n}\n\n.confirm-icon.danger[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}\n\n.confirm-icon.danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-status-error);\n}\n\n.confirm-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.confirm-message[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n line-height: 1.5;\n}\n\n.confirm-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] {\n justify-content: center;\n}\n\n.btn-danger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 28px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-status-error);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n}\n\n.btn-danger[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}"] });
|
|
93
93
|
}
|
|
94
94
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfirmDialogComponent, [{
|
|
95
95
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/config-dialogs/confirm-dialog.component.ts","../../../src/lib/config-dialogs/confirm-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC;;;;ICExF,8BAAsD;IAAnB,uLAAS,eAAQ,KAAC;IACnD,8BAA6E;IAAnC,
|
|
1
|
+
{"version":3,"file":"confirm-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/config-dialogs/confirm-dialog.component.ts","../../../src/lib/config-dialogs/confirm-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC;;;;ICExF,8BAAsD;IAAnB,uLAAS,eAAQ,KAAC;IACnD,8BAA6E;IAAnC,oHAAS,wBAAwB,IAAC;IAGxE,AADF,8BAA4B,aACwE;IAChG,oBAA2B;IAC7B,iBAAM;IACN,6BAA0B;IAAA,YAAW;IAAA,iBAAK;IAC1C,4BAA2B;IAAA,YAAa;IAC1C,AAD0C,iBAAI,EACxC;IAGJ,AADF,8BAA2B,iBAGH;IAApB,2LAAS,gBAAS,KAAC;IACnB,aACF;IAAA,iBAAS;IACT,kCAAiD;IAAnB,2LAAS,eAAQ,KAAC;IAAC,aAAgB;IAGvE,AADE,AADE,AADmE,iBAAS,EACtE,EACF,EACF;;;IAhB0B,eAAoC;IAAC,AAArC,oDAAoC,oCAAmC;IAC5F,cAAmB;IAAnB,+BAAmB;IAEE,eAAW;IAAX,kCAAW;IACV,eAAa;IAAb,oCAAa;IAKtC,eAA0D;IAA1D,sEAA0D;IAE1D,cACF;IADE,mDACF;IACiD,eAAgB;IAAhB,uCAAgB;;ADZzE;;GAEG;AAOH,MAAM,OAAO,sBAAsB;IA4BX;IA3BpB,oCAAoC;IAC3B,OAAO,GAAG,KAAK,CAAC;IAEzB,oDAAoD;IAC3C,IAAI,GAAsB,SAAS,CAAC;IAE7C,mBAAmB;IACV,KAAK,GAAG,gBAAgB,CAAC;IAElC,qBAAqB;IACZ,OAAO,GAAG,mCAAmC,CAAC;IAEvD,0BAA0B;IACjB,WAAW,GAAG,SAAS,CAAC;IAEjC,yBAAyB;IAChB,UAAU,GAAG,QAAQ,CAAC;IAE/B,+EAA+E;IACtE,IAAI,GAAG,EAAE,CAAC;IAEnB,iCAAiC;IACvB,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE/C,gCAAgC;IACtB,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE/C,YAAoB,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAEvC,OAAO;QACV,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAEhC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,QAAQ;gBACT,OAAO,mBAAmB,CAAC;YAC/B,KAAK,MAAM;gBACP,OAAO,yBAAyB,CAAC;YACrC;gBACI,OAAO,kCAAkC,CAAC;QAClD,CAAC;IACL,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAEM,MAAM;QACT,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;gHAjDQ,sBAAsB;6DAAtB,sBAAsB;YCfnC,0FAAe;;YAAf,sCAsBC;;;iFDPY,sBAAsB;cANlC,SAAS;6BACI,KAAK,YACL,mBAAmB;;kBAM5B,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,MAAM;;kBAGN,MAAM;;kFA1BE,sBAAsB","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';\n\n/**\n * Confirmation dialog types\n */\nexport type ConfirmDialogType = 'warning' | 'danger' | 'info';\n\n/**\n * A nice confirmation dialog to replace browser confirm().\n */\n@Component({\n standalone: false,\n selector: 'mj-confirm-dialog',\n templateUrl: './confirm-dialog.component.html',\n styleUrls: ['./config-dialog.component.css']\n})\nexport class ConfirmDialogComponent {\n /** Whether the dialog is visible */\n @Input() visible = false;\n\n /** Dialog type (affects icon and button styling) */\n @Input() type: ConfirmDialogType = 'warning';\n\n /** Dialog title */\n @Input() title = 'Confirm Action';\n\n /** Dialog message */\n @Input() message = 'Are you sure you want to proceed?';\n\n /** Confirm button text */\n @Input() confirmText = 'Confirm';\n\n /** Cancel button text */\n @Input() cancelText = 'Cancel';\n\n /** Custom icon class (optional, uses default based on type if not provided) */\n @Input() icon = '';\n\n /** Emitted when user confirms */\n @Output() confirmed = new EventEmitter<void>();\n\n /** Emitted when user cancels */\n @Output() cancelled = new EventEmitter<void>();\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n public getIcon(): string {\n if (this.icon) return this.icon;\n\n switch (this.type) {\n case 'danger':\n return 'fa-solid fa-trash';\n case 'info':\n return 'fa-solid fa-info-circle';\n default:\n return 'fa-solid fa-exclamation-triangle';\n }\n }\n\n public confirm(): void {\n this.confirmed.emit();\n }\n\n public cancel(): void {\n this.cancelled.emit();\n }\n}\n","<!-- Confirm Dialog -->\n@if (visible) {\n <div class=\"config-dialog-overlay\" (click)=\"cancel()\">\n <div class=\"config-dialog confirm-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Content -->\n <div class=\"dialog-content\">\n <div class=\"confirm-icon\" [class.warning]=\"type === 'warning'\" [class.danger]=\"type === 'danger'\">\n <i [class]=\"getIcon()\"></i>\n </div>\n <h3 class=\"confirm-title\">{{ title }}</h3>\n <p class=\"confirm-message\">{{ message }}</p>\n </div>\n <!-- Footer - Action button on left, Cancel on right -->\n <div class=\"dialog-footer\">\n <button\n [class]=\"type === 'danger' ? 'btn-danger' : 'btn-primary'\"\n (click)=\"confirm()\">\n {{ confirmText }}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancel()\">{{ cancelText }}</button>\n </div>\n </div>\n </div>\n}\n"]}
|
|
@@ -183,7 +183,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
183
183
|
* Get the artifactId as a CompositeKey for the tree dropdown
|
|
184
184
|
*/
|
|
185
185
|
get ArtifactIdAsKey() {
|
|
186
|
-
return this.artifactId ? CompositeKey.FromID(this.artifactId) : null;
|
|
186
|
+
return this.artifactId ? CompositeKey.FromID(this.artifactId) : null; // first-pk-ok: artifactId is an MJ: Artifacts record (ArtifactLeafConfig) — core entity keyed by ID
|
|
187
187
|
}
|
|
188
188
|
async initFromConfig(config) {
|
|
189
189
|
if (config && config.type === 'Artifact') {
|
|
@@ -327,7 +327,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
327
327
|
i0.ɵɵtext(6, "*");
|
|
328
328
|
i0.ɵɵelementEnd()();
|
|
329
329
|
i0.ɵɵelementStart(7, "mj-tree-dropdown", 5, 0);
|
|
330
|
-
i0.ɵɵlistener("SelectionChange", function ArtifactConfigPanelComponent_Template_mj_tree_dropdown_SelectionChange_7_listener($event) {
|
|
330
|
+
i0.ɵɵlistener("SelectionChange", function ArtifactConfigPanelComponent_Template_mj_tree_dropdown_SelectionChange_7_listener($event) { return ctx.onArtifactSelection($event); });
|
|
331
331
|
i0.ɵɵelementEnd();
|
|
332
332
|
i0.ɵɵconditionalCreate(9, ArtifactConfigPanelComponent_Conditional_9_Template, 2, 1, "span", 6);
|
|
333
333
|
i0.ɵɵconditionalCreate(10, ArtifactConfigPanelComponent_Conditional_10_Template, 2, 0, "span", 7);
|
|
@@ -342,7 +342,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
342
342
|
i0.ɵɵelementEnd()();
|
|
343
343
|
i0.ɵɵelementStart(19, "input", 12);
|
|
344
344
|
i0.ɵɵtwoWayListener("ngModelChange", function ArtifactConfigPanelComponent_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.title, $event) || (ctx.title = $event); return i0.ɵɵresetView($event); });
|
|
345
|
-
i0.ɵɵlistener("input", function ArtifactConfigPanelComponent_Template_input_input_19_listener() {
|
|
345
|
+
i0.ɵɵlistener("input", function ArtifactConfigPanelComponent_Template_input_input_19_listener() { return ctx.onTitleChange(); });
|
|
346
346
|
i0.ɵɵelementEnd();
|
|
347
347
|
i0.ɵɵelementStart(20, "span", 7);
|
|
348
348
|
i0.ɵɵtext(21, "Leave empty to use artifact name as title");
|
|
@@ -352,7 +352,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
352
352
|
i0.ɵɵtemplate(23, ArtifactConfigPanelComponent_ng_template_23_Template, 2, 0, "ng-template", 14);
|
|
353
353
|
i0.ɵɵelementStart(24, "div", 15)(25, "div", 16)(26, "label", 17)(27, "input", 18);
|
|
354
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() {
|
|
355
|
+
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_27_listener() { return ctx.onOptionChange(); });
|
|
356
356
|
i0.ɵɵelementEnd();
|
|
357
357
|
i0.ɵɵelement(28, "span", 19);
|
|
358
358
|
i0.ɵɵelementStart(29, "span", 20);
|
|
@@ -360,7 +360,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
360
360
|
i0.ɵɵelementEnd()();
|
|
361
361
|
i0.ɵɵelementStart(31, "label", 17)(32, "input", 18);
|
|
362
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() {
|
|
363
|
+
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_32_listener() { return ctx.onOptionChange(); });
|
|
364
364
|
i0.ɵɵelementEnd();
|
|
365
365
|
i0.ɵɵelement(33, "span", 19);
|
|
366
366
|
i0.ɵɵelementStart(34, "span", 20);
|
|
@@ -368,7 +368,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
368
368
|
i0.ɵɵelementEnd()();
|
|
369
369
|
i0.ɵɵelementStart(36, "label", 17)(37, "input", 18);
|
|
370
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() {
|
|
371
|
+
i0.ɵɵlistener("change", function ArtifactConfigPanelComponent_Template_input_change_37_listener() { return ctx.onOptionChange(); });
|
|
372
372
|
i0.ɵɵelementEnd();
|
|
373
373
|
i0.ɵɵelement(38, "span", 19);
|
|
374
374
|
i0.ɵɵelementStart(39, "span", 20);
|
|
@@ -397,7 +397,7 @@ let ArtifactConfigPanelComponent = class ArtifactConfigPanelComponent extends Ba
|
|
|
397
397
|
i0.ɵɵtwoWayProperty("ngModel", ctx.showTabs);
|
|
398
398
|
i0.ɵɵadvance(5);
|
|
399
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}"] });
|
|
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.config-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n.config-panel--compact[_ngcontent-%COMP%] {\n gap: 16px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] {\n gap: 8px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-select[_ngcontent-%COMP%] {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n\n\n\n\n.optional-tag[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.form-hint--selected[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n\n\n\n\n.config-section-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n\n\n\n.radio-group--horizontal[_ngcontent-%COMP%] {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n width: 8px;\n height: 8px;\n}\n\n\n\n\n\n.checkbox-group--compact[_ngcontent-%COMP%] {\n gap: 4px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-mark[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-label[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\nmj-tree-dropdown.error[_ngcontent-%COMP%] {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error[_ngcontent-%COMP%]:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}"] });
|
|
401
401
|
};
|
|
402
402
|
ArtifactConfigPanelComponent = __decorate([
|
|
403
403
|
RegisterClass(BaseConfigPanel, 'ArtifactPanelConfigDialog')
|
|
@@ -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","<!-- Artifact Config Panel - Compact layout with tree dropdown and collapsible sections -->\n<div class=\"config-panel config-panel--compact\">\n <!-- Artifact Selection (Primary) -->\n <div class=\"form-group\">\n <label>\n <i class=\"fa-solid fa-cube\"></i>\n Select Artifact\n <span class=\"required\">*</span>\n </label>\n <mj-tree-dropdown\n #artifactDropdown\n [BranchConfig]=\"CollectionConfig\"\n [LeafConfig]=\"ArtifactLeafConfig\"\n [Value]=\"ArtifactIdAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search or browse artifacts...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"onArtifactSelection($event)\"\n [class.error]=\"artifactError\">\n </mj-tree-dropdown>\n @if (artifactError) {\n <span class=\"form-error\">{{ artifactError }}</span>\n }\n @if (!artifactError && !artifactId) {\n <span class=\"form-hint\">\n Browse collections or search to find an artifact\n </span>\n }\n @if (!artifactError && artifactId) {\n <span class=\"form-hint form-hint--selected\">\n <i class=\"fa-solid fa-check\"></i>\n Selected: {{ artifactName }}\n </span>\n }\n </div>\n\n <!-- Version Selection (Available only after artifact is selected) -->\n @if (artifactId) {\n <div class=\"form-group\">\n <label for=\"versionSelect\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Version\n </label>\n <div class=\"version-select-wrapper\">\n @if (!isLoadingVersions && versions.length > 0) {\n <select\n id=\"versionSelect\"\n [(ngModel)]=\"versionNumber\"\n (change)=\"onVersionChange()\"\n class=\"form-select\">\n @for (v of versions; track v) {\n <option [ngValue]=\"v.VersionNumber\">\n v{{ v.VersionNumber }} - {{ v.__mj_CreatedAt | date:'short' }}\n </option>\n }\n </select>\n }\n @if (isLoadingVersions) {\n <span class=\"form-hint\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading versions...\n </span>\n }\n @if (!isLoadingVersions && versions.length === 0) {\n <span class=\"form-hint\">\n No versions available\n </span>\n }\n </div>\n @if (versions.length > 0) {\n <span class=\"form-hint\">\n Select which version to display (latest is default)\n </span>\n }\n </div>\n }\n\n <!-- Title (Optional) -->\n <div class=\"form-group\">\n <label for=\"partTitle\">\n <i class=\"fa-solid fa-heading\"></i>\n Part Title\n <span class=\"optional-tag\">(optional)</span>\n </label>\n <input\n type=\"text\"\n id=\"partTitle\"\n [(ngModel)]=\"title\"\n (input)=\"onTitleChange()\"\n [placeholder]=\"artifactName ? 'Default: ' + artifactName : 'Enter a custom title'\"\n class=\"form-input\">\n <span class=\"form-hint\">Leave empty to use artifact name as title</span>\n </div>\n\n <!-- Display Options -->\n <mj-accordion-panel [(Expanded)]=\"showOptions\" Size=\"sm\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-sliders\"></i>\n Display Options\n </ng-template>\n <div class=\"config-section-body\">\n <div class=\"checkbox-group checkbox-group--compact\">\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showHeader\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Header</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showTabs\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Tabs</span>\n </label>\n <label class=\"checkbox-option checkbox-option--compact\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"showMetadata\"\n (change)=\"onOptionChange()\">\n <span class=\"checkbox-mark\"></span>\n <span class=\"checkbox-label\">Show Metadata</span>\n </label>\n </div>\n </div>\n </mj-accordion-panel>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"artifact-config-panel.component.js","sourceRoot":"","sources":["../../../src/lib/config-panels/artifact-config-panel.component.ts","../../../src/lib/config-panels/artifact-config-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectorRef, ViewChild, OnInit } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { BaseConfigPanel } from './base-config-panel';\nimport { PanelConfig } from '../models/dashboard-types';\nimport {\n TreeBranchConfig,\n TreeLeafConfig,\n TreeNode,\n TreeDropdownComponent\n} from '@memberjunction/ng-trees';\n\n/**\n * Configuration panel for Artifact parts.\n * Uses tree dropdown for collection-based artifact selection.\n */\n@RegisterClass(BaseConfigPanel, 'ArtifactPanelConfigDialog')\n@Component({\n standalone: false,\n selector: 'mj-artifact-config-panel',\n templateUrl: './artifact-config-panel.component.html',\n styleUrls: ['./config-panel.component.css']\n})\nexport class ArtifactConfigPanelComponent extends BaseConfigPanel implements OnInit {\n // ViewChild reference\n @ViewChild('artifactDropdown') artifactDropdown!: TreeDropdownComponent;\n\n // 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; // first-pk-ok: artifactId is an MJ: Artifacts record (ArtifactLeafConfig) — core entity keyed by ID\n }\n\n public async initFromConfig(config: PanelConfig | null): Promise<void> {\n if (config && config.type === 'Artifact') {\n this.artifactId = (config['artifactId'] as string) || '';\n this.versionNumber = (config['versionNumber'] as number) ?? null;\n this.showHeader = (config['showHeader'] as boolean) ?? false;\n this.showTabs = (config['showTabs'] as boolean) ?? true;\n this.showVersionSelector = (config['showVersionSelector'] as boolean) ?? true;\n this.showMetadata = (config['showMetadata'] as boolean) ?? false;\n } else {\n // Defaults for new Artifact panel\n this.artifactId = '';\n this.versionNumber = null;\n this.showHeader = false;\n this.showTabs = true;\n this.showVersionSelector = true;\n this.showMetadata = false;\n }\n\n this.title = this.panel?.title || '';\n this.artifactName = '';\n this.previousArtifactName = '';\n this.artifactError = '';\n this.versions = [];\n this.cdr.detectChanges();\n\n // If editing an existing artifact config, load its versions\n if (this.artifactId) {\n await this.loadVersionsForArtifact(this.artifactId);\n }\n }\n\n public buildConfig(): PanelConfig {\n return {\n type: 'Artifact',\n artifactId: this.artifactId.trim(),\n versionNumber: this.versionNumber ?? undefined,\n showHeader: this.showHeader,\n showTabs: this.showTabs,\n showVersionSelector: this.showVersionSelector,\n showMetadata: this.showMetadata\n };\n }\n\n public override validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n this.artifactError = '';\n\n if (!this.artifactId.trim()) {\n this.artifactError = 'Please select an artifact';\n errors.push(this.artifactError);\n }\n\n this.cdr.detectChanges();\n return { valid: errors.length === 0, errors };\n }\n\n public getDefaultTitle(): string {\n if (this.artifactName) {\n return this.artifactName;\n }\n return 'Artifact';\n }\n\n public getTitle(): string {\n return this.title || this.getDefaultTitle();\n }\n\n // Form event handlers\n public onTitleChange(): void {\n this.emitConfigChanged();\n }\n\n /**\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"]}
|
|
@@ -88,7 +88,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
88
88
|
* Get the queryId as a CompositeKey for the tree dropdown
|
|
89
89
|
*/
|
|
90
90
|
get QueryIdAsKey() {
|
|
91
|
-
return this.queryId ? CompositeKey.FromID(this.queryId) : null;
|
|
91
|
+
return this.queryId ? CompositeKey.FromID(this.queryId) : null; // first-pk-ok: queryId is an MJ: Queries record (QueryLeafConfig) — core entity keyed by ID
|
|
92
92
|
}
|
|
93
93
|
initFromConfig(config) {
|
|
94
94
|
if (config && config.type === 'Query') {
|
|
@@ -206,7 +206,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
206
206
|
i0.ɵɵtext(6, "*");
|
|
207
207
|
i0.ɵɵelementEnd()();
|
|
208
208
|
i0.ɵɵelementStart(7, "mj-tree-dropdown", 5, 0);
|
|
209
|
-
i0.ɵɵlistener("SelectionChange", function QueryConfigPanelComponent_Template_mj_tree_dropdown_SelectionChange_7_listener($event) {
|
|
209
|
+
i0.ɵɵlistener("SelectionChange", function QueryConfigPanelComponent_Template_mj_tree_dropdown_SelectionChange_7_listener($event) { return ctx.onQuerySelection($event); });
|
|
210
210
|
i0.ɵɵelementEnd();
|
|
211
211
|
i0.ɵɵconditionalCreate(9, QueryConfigPanelComponent_Conditional_9_Template, 2, 1, "span", 6);
|
|
212
212
|
i0.ɵɵconditionalCreate(10, QueryConfigPanelComponent_Conditional_10_Template, 2, 0, "span", 7);
|
|
@@ -220,7 +220,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
220
220
|
i0.ɵɵelementEnd()();
|
|
221
221
|
i0.ɵɵelementStart(18, "input", 12);
|
|
222
222
|
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.title, $event) || (ctx.title = $event); return i0.ɵɵresetView($event); });
|
|
223
|
-
i0.ɵɵlistener("input", function QueryConfigPanelComponent_Template_input_input_18_listener() {
|
|
223
|
+
i0.ɵɵlistener("input", function QueryConfigPanelComponent_Template_input_input_18_listener() { return ctx.onTitleChange(); });
|
|
224
224
|
i0.ɵɵelementEnd();
|
|
225
225
|
i0.ɵɵelementStart(19, "span", 7);
|
|
226
226
|
i0.ɵɵtext(20, "Leave empty to use query name as title");
|
|
@@ -233,7 +233,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
233
233
|
i0.ɵɵelementEnd();
|
|
234
234
|
i0.ɵɵelementStart(27, "div", 16)(28, "label", 17)(29, "input", 18);
|
|
235
235
|
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.parameterLayout, $event) || (ctx.parameterLayout = $event); return i0.ɵɵresetView($event); });
|
|
236
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_29_listener() {
|
|
236
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_29_listener() { return ctx.onParameterLayoutChange(); });
|
|
237
237
|
i0.ɵɵelementEnd();
|
|
238
238
|
i0.ɵɵelement(30, "span", 19);
|
|
239
239
|
i0.ɵɵelementStart(31, "span", 20);
|
|
@@ -242,7 +242,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
242
242
|
i0.ɵɵelementEnd()();
|
|
243
243
|
i0.ɵɵelementStart(34, "label", 17)(35, "input", 22);
|
|
244
244
|
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_35_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.parameterLayout, $event) || (ctx.parameterLayout = $event); return i0.ɵɵresetView($event); });
|
|
245
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_35_listener() {
|
|
245
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_35_listener() { return ctx.onParameterLayoutChange(); });
|
|
246
246
|
i0.ɵɵelementEnd();
|
|
247
247
|
i0.ɵɵelement(36, "span", 19);
|
|
248
248
|
i0.ɵɵelementStart(37, "span", 20);
|
|
@@ -251,7 +251,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
251
251
|
i0.ɵɵelementEnd()();
|
|
252
252
|
i0.ɵɵelementStart(40, "label", 17)(41, "input", 24);
|
|
253
253
|
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_41_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.parameterLayout, $event) || (ctx.parameterLayout = $event); return i0.ɵɵresetView($event); });
|
|
254
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_41_listener() {
|
|
254
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_41_listener() { return ctx.onParameterLayoutChange(); });
|
|
255
255
|
i0.ɵɵelementEnd();
|
|
256
256
|
i0.ɵɵelement(42, "span", 19);
|
|
257
257
|
i0.ɵɵelementStart(43, "span", 20);
|
|
@@ -267,7 +267,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
267
267
|
i0.ɵɵelementEnd();
|
|
268
268
|
i0.ɵɵelementStart(52, "select", 28);
|
|
269
269
|
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_select_ngModelChange_52_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.autoRefreshSeconds, $event) || (ctx.autoRefreshSeconds = $event); return i0.ɵɵresetView($event); });
|
|
270
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_select_change_52_listener() {
|
|
270
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_select_change_52_listener() { return ctx.onAutoRefreshChange(); });
|
|
271
271
|
i0.ɵɵelementStart(53, "option", 29);
|
|
272
272
|
i0.ɵɵtext(54, "Disabled");
|
|
273
273
|
i0.ɵɵelementEnd();
|
|
@@ -285,7 +285,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
285
285
|
i0.ɵɵelementEnd()()();
|
|
286
286
|
i0.ɵɵelementStart(63, "div", 2)(64, "div", 30)(65, "label", 31)(66, "input", 32);
|
|
287
287
|
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_66_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showParameterControls, $event) || (ctx.showParameterControls = $event); return i0.ɵɵresetView($event); });
|
|
288
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_66_listener() {
|
|
288
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_66_listener() { return ctx.onOptionChange(); });
|
|
289
289
|
i0.ɵɵelementEnd();
|
|
290
290
|
i0.ɵɵelement(67, "span", 33);
|
|
291
291
|
i0.ɵɵelementStart(68, "span", 34);
|
|
@@ -293,7 +293,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
293
293
|
i0.ɵɵelementEnd()();
|
|
294
294
|
i0.ɵɵelementStart(70, "label", 31)(71, "input", 32);
|
|
295
295
|
i0.ɵɵtwoWayListener("ngModelChange", function QueryConfigPanelComponent_Template_input_ngModelChange_71_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showExecutionMetadata, $event) || (ctx.showExecutionMetadata = $event); return i0.ɵɵresetView($event); });
|
|
296
|
-
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_71_listener() {
|
|
296
|
+
i0.ɵɵlistener("change", function QueryConfigPanelComponent_Template_input_change_71_listener() { return ctx.onOptionChange(); });
|
|
297
297
|
i0.ɵɵelementEnd();
|
|
298
298
|
i0.ɵɵelement(72, "span", 33);
|
|
299
299
|
i0.ɵɵelementStart(73, "span", 34);
|
|
@@ -344,7 +344,7 @@ let QueryConfigPanelComponent = class QueryConfigPanelComponent extends BaseConf
|
|
|
344
344
|
i0.ɵɵtwoWayProperty("ngModel", ctx.showParameterControls);
|
|
345
345
|
i0.ɵɵadvance(5);
|
|
346
346
|
i0.ɵɵtwoWayProperty("ngModel", ctx.showExecutionMetadata);
|
|
347
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective], styles: ["\n\n\n\n\n\n\n\n\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}"] });
|
|
347
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.RadioControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective], styles: ["\n\n\n\n\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 8px 0;\n}\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n width: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] > label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.form-input[_ngcontent-%COMP%] {\n padding: 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-input.error[_ngcontent-%COMP%]:focus {\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.input-with-action[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.input-with-action[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.input-action-btn[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.input-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.form-error[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.form-error[_ngcontent-%COMP%]::before {\n content: '\\f071';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n}\n\n\n\n\n\n.radio-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.radio-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.radio-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.radio-option[_ngcontent-%COMP%] input[type=\"radio\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.radio-mark[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.radio-option.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n content: '';\n width: 10px;\n height: 10px;\n background: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.radio-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.radio-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.radio-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n}\n\n.radio-badge.recommended[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.radio-badge.secure[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.radio-badge.warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n.checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n background: var(--mj-bg-surface);\n}\n\n.checkbox-option[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n background: var(--mj-bg-surface-card);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n display: none;\n}\n\n.checkbox-mark[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n margin-top: 2px;\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.checkbox-option[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .checkbox-mark[_ngcontent-%COMP%]::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 12px;\n color: var(--mj-text-inverse);\n}\n\n.checkbox-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.checkbox-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.form-select[_ngcontent-%COMP%] {\n padding: 14px 40px 14px 16px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 15px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 16px center;\n}\n\n.form-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n\n.config-panel--compact[_ngcontent-%COMP%] {\n gap: 16px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] {\n gap: 8px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n}\n\n.config-panel--compact[_ngcontent-%COMP%] .form-select[_ngcontent-%COMP%] {\n padding: 10px 36px 10px 14px;\n font-size: 14px;\n}\n\n\n\n\n\n.optional-tag[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.form-hint--selected[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.form-hint--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n\n\n\n\n.config-section-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n\n\n\n.radio-group--horizontal[_ngcontent-%COMP%] {\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n flex: 1;\n min-width: 120px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] {\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.radio-option--compact[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n}\n\n.radio-option--compact.selected[_ngcontent-%COMP%] .radio-mark[_ngcontent-%COMP%]::after {\n width: 8px;\n height: 8px;\n}\n\n\n\n\n\n.checkbox-group--compact[_ngcontent-%COMP%] {\n gap: 4px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] {\n padding: 10px 14px;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-mark[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 0;\n}\n\n.checkbox-option--compact[_ngcontent-%COMP%] .checkbox-label[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\nmj-tree-dropdown.error[_ngcontent-%COMP%] {\n --dropdown-border-color: var(--mj-status-error);\n}\n\nmj-tree-dropdown.error[_ngcontent-%COMP%]:focus-within {\n --dropdown-border-focus: var(--mj-status-error);\n}"] });
|
|
348
348
|
};
|
|
349
349
|
QueryConfigPanelComponent = __decorate([
|
|
350
350
|
RegisterClass(BaseConfigPanel, 'QueryPanelConfigDialog')
|