@memberjunction/ng-dashboard-viewer 6.1.0-edge.4 → 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.
@@ -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\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\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\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\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\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 });
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) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
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,0JAAS,wBAAwB,KAAC;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"]}
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) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onArtifactSelection($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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onTitleChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
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":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAqB,SAAS,EAAU,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;;;;;;;;ICkBhD,+BAAyB;IAAA,YAAmB;IAAA,iBAAO;;;IAA1B,cAAmB;IAAnB,0CAAmB;;;IAG5C,+BAAwB;IACtB,kEACF;IAAA,iBAAO;;;IAGP,+BAA4C;IAC1C,wBAAiC;IACjC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,8DACF;;;IAmBQ,kCAAoC;IAClC,YACF;;IAAA,iBAAS;;;IAFD,4CAA2B;IACjC,cACF;IADE,+GACF;;;;IARJ,kCAIsB;IAFpB,+UAA2B;IAC3B,kNAAU,wBAAiB,KAAC;IAE5B,kJAIC;IACH,iBAAS;;;IARP,oDAA2B;IAG3B,cAIC;IAJD,8BAIC;;;IAIH,+BAAwB;IACtB,wBAA2C;IAC3C,qCACF;IAAA,iBAAO;;;IAGP,+BAAwB;IACtB,uCACF;IAAA,iBAAO;;;IAIT,+BAAwB;IACtB,qEACF;IAAA,iBAAO;;;IAjCT,AADF,8BAAwB,gBACK;IACzB,wBAAuC;IACvC,yBACF;IAAA,iBAAQ;IACR,+BAAoC;IAClC,iHAAiD;IAajD,8GAAyB;IAMzB,8GAAmD;IAKrD,iBAAM;IACN,8GAA2B;IAK7B,iBAAM;;;IA9BF,eAYC;IAZD,kFAYC;IACD,cAKC;IALD,mDAKC;IACD,cAIC;IAJD,oFAIC;IAEH,cAIC;IAJD,qDAIC;;;IAwBD,wBAAmC;IACnC,iCACF;;ADvFJ;;;GAGG;AAQI,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,eAAe;IAC7D,sBAAsB;IACS,gBAAgB,CAAyB;IAExE,cAAc;IACP,KAAK,GAAG,EAAE,CAAC;IACX,UAAU,GAAG,EAAE,CAAC;IAChB,YAAY,GAAG,EAAE,CAAC;IAClB,aAAa,GAAkB,IAAI,CAAC;IACpC,UAAU,GAAG,KAAK,CAAC,CAAC,8CAA8C;IAClE,QAAQ,GAAG,IAAI,CAAC;IAChB,mBAAmB,GAAG,IAAI,CAAC;IAC3B,YAAY,GAAG,KAAK,CAAC;IAE5B,oBAAoB;IACb,QAAQ,GAA8B,EAAE,CAAC;IACzC,iBAAiB,GAAG,KAAK,CAAC;IACzB,oBAAoB,GAAG,EAAE,CAAC,CAAC,gCAAgC;IAEnE,4BAA4B;IACrB,WAAW,GAAG,KAAK,CAAC;IAE3B,aAAa;IACN,aAAa,GAAG,EAAE,CAAC;IAE1B,wEAAwE;IACjE,gBAAgB,CAAoB;IACpC,kBAAkB,CAAkB;IAE3C,YAAY,GAAsB;QAC9B,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,QAAQ;QACJ,oCAAoC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;QAElD,uEAAuE;QACvE,oDAAoD;QACpD,6DAA6D;QAC7D,IAAI,CAAC,gBAAgB,GAAG;YACpB,UAAU,EAAE,iBAAiB;YAC7B,YAAY,EAAE,MAAM;YACpB,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,UAAU;YACzB,WAAW,EAAE,oBAAoB;YACjC,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,OAAO;YACnB,gBAAgB,EAAE,aAAa;YAC/B,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;SACrD,CAAC;QAEF,iEAAiE;QACjE,uFAAuF;QACvF,8EAA8E;QAC9E,IAAI,CAAC,kBAAkB,GAAG;YACtB,UAAU,EAAE,eAAe;YAC3B,YAAY,EAAE,MAAM;YACpB,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,EAAE,EAAE,sDAAsD;YACvE,WAAW,EAAE,kBAAkB;YAC/B,gBAAgB,EAAE,aAAa;YAC/B,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;YACjD,8FAA8F;YAC9F,cAAc,EAAE;gBACZ,UAAU,EAAE,0BAA0B;gBACtC,cAAc,EAAE,mBAAmB,EAAE,6DAA6D;gBAClG,gBAAgB,EAAE,cAAc;gBAChC,2EAA2E;gBAC3E,mBAAmB,EAAE;oBACjB,kBAAkB,EAAE,uBAAuB;oBAC3C,mBAAmB,EAAE,IAAI,EAAE,6DAA6D;oBACxF,WAAW,EAAE,YAAY,CAAC,4CAA4C;iBACzE;aACJ;SACJ,CAAC;IACN,CAAC;IAED;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,MAA0B;QAClD,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACvC,IAAI,CAAC,UAAU,GAAI,MAAM,CAAC,YAAY,CAAY,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,aAAa,GAAI,MAAM,CAAC,eAAe,CAAY,IAAI,IAAI,CAAC;YACjE,IAAI,CAAC,UAAU,GAAI,MAAM,CAAC,YAAY,CAAa,IAAI,KAAK,CAAC;YAC7D,IAAI,CAAC,QAAQ,GAAI,MAAM,CAAC,UAAU,CAAa,IAAI,IAAI,CAAC;YACxD,IAAI,CAAC,mBAAmB,GAAI,MAAM,CAAC,qBAAqB,CAAa,IAAI,IAAI,CAAC;YAC9E,IAAI,CAAC,YAAY,GAAI,MAAM,CAAC,cAAc,CAAa,IAAI,KAAK,CAAC;QACrE,CAAC;aAAM,CAAC;YACJ,kCAAkC;YAClC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,4DAA4D;QAC5D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAEM,WAAW;QACd,OAAO;YACH,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YAClC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,SAAS;YAC9C,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,YAAY,EAAE,IAAI,CAAC,YAAY;SAClC,CAAC;IACN,CAAC;IAEe,QAAQ;QACpB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,2BAA2B,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAEM,eAAe;QAClB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IAChD,CAAC;IAED,sBAAsB;IACf,aAAa;QAChB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,mBAAmB,CAAC,IAAkC;QAC/D,gFAAgF;QAChF,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAExB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,6DAA6D;YAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACvB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;gBAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC;gBAE/B,oEAAoE;gBACpE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5F,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC5B,CAAC;gBACD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC;gBAEvC,0CAA0C;gBAC1C,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;QACL,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CAAC,UAAkB;QACpD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAA0B;gBACrD,UAAU,EAAE,uBAAuB;gBACnC,WAAW,EAAE,iBAAiB,UAAU,GAAG;gBAC3C,OAAO,EAAE,oBAAoB;gBAC7B,UAAU,EAAE,eAAe;aAC9B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC/B,+EAA+E;gBAC/E,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;oBACzD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBACxD,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAEM,eAAe;QAClB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAEM,cAAc;QACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;sHAtOQ,4BAA4B;6DAA5B,4BAA4B;;;;;;;YCpBrC,AADF,AAFF,8BAAgD,aAEtB,YACf;YACL,uBAAgC;YAChC,iCACA;YAAA,+BAAuB;YAAA,iBAAC;YAC1B,AAD0B,iBAAO,EACzB;YACR,8CAUgC;YAD9B,mLAAmB,+BAA2B,KAAC;YAEjD,iBAAmB;YACnB,+FAAqB;YAGrB,iGAAqC;YAKrC,iGAAoC;YAMtC,iBAAM;YAGN,gGAAkB;YA0ChB,AADF,+BAAwB,gBACC;YACrB,yBAAmC;YACnC,6BACA;YAAA,iCAA2B;YAAA,2BAAU;YACvC,AADuC,iBAAO,EACtC;YACR,kCAMqB;YAHnB,wPAAmB;YACnB,+IAAS,mBAAe,KAAC;YAJ3B,iBAMqB;YACrB,gCAAwB;YAAA,0DAAyC;YACnE,AADmE,iBAAO,EACpE;YAGN,+CAAyD;YAArC,mRAA0B;YAC5C,gGAA8B;YAOxB,AADF,AADF,AADF,gCAAiC,eACqB,iBACM,iBAIxB;YAD5B,kQAAwB;YACxB,iJAAU,oBAAgB,KAAC;YAH7B,iBAG8B;YAC9B,4BAAmC;YACnC,iCAA6B;YAAA,4BAAW;YAC1C,AAD0C,iBAAO,EACzC;YAEN,AADF,kCAAwD,iBAIxB;YAD5B,8PAAsB;YACtB,iJAAU,oBAAgB,KAAC;YAH7B,iBAG8B;YAC9B,4BAAmC;YACnC,iCAA6B;YAAA,0BAAS;YACxC,AADwC,iBAAO,EACvC;YAEN,AADF,kCAAwD,iBAIxB;YAD5B,sQAA0B;YAC1B,iJAAU,oBAAgB,KAAC;YAH7B,iBAG8B;YAC9B,4BAAmC;YACnC,iCAA6B;YAAA,8BAAa;YAKpD,AADE,AADE,AADE,AADE,AAD4C,iBAAO,EAC3C,EACJ,EACF,EACa,EACjB;;YA/GA,eAA6B;YAA7B,0CAA6B;YAF7B,AADA,AADA,AADA,AADA,AADA,AADA,mDAAiC,sCACA,8BACR,2BACC,2BACA,gDACqB,sBAC1B;YAIvB,eAEC;YAFD,4CAEC;YACD,cAIC;YAJD,iEAIC;YACD,cAKC;YALD,gEAKC;YAIH,cAsCC;YAtCD,0CAsCC;YAYG,eAAmB;YAAnB,yCAAmB;YAEnB,wGAAkF;YAMlE,eAA0B;YAA1B,gDAA0B;YAUpC,eAAwB;YAAxB,8CAAwB;YAQxB,eAAsB;YAAtB,4CAAsB;YAQtB,eAA0B;YAA1B,gDAA0B;;;ADlGzB,4BAA4B;IAPxC,aAAa,CAAC,eAAe,EAAE,2BAA2B,CAAC;GAO/C,4BAA4B,CAuOxC;;iFAvOY,4BAA4B;cANxC,SAAS;6BACI,KAAK,YACL,0BAA0B;;kBAMnC,SAAS;mBAAC,kBAAkB;;kFAFpB,4BAA4B","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) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onQuerySelection($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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onTitleChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onParameterLayoutChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onParameterLayoutChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onParameterLayoutChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAutoRefreshChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
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() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOptionChange()); });
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')