@memberjunction/ng-dashboards 5.45.1 → 5.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PredictiveStudio/at-risk.view-models.d.ts +33 -0
- package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +1 -1
- package/dist/PredictiveStudio/at-risk.view-models.js +69 -2
- package/dist/PredictiveStudio/at-risk.view-models.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-catalog.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-catalog.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-compare.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-compare.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-home.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-home.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-operate-dialog.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-operate-dialog.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.js +306 -297
- package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-production.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-registry.component.d.ts +1 -1
- package/dist/PredictiveStudio/components/ps-registry.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-registry.component.js +15 -9
- package/dist/PredictiveStudio/components/ps-registry.component.js.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts +115 -0
- package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts.map +1 -0
- package/dist/PredictiveStudio/predictive-studio-agent-context.js +119 -0
- package/dist/PredictiveStudio/predictive-studio-agent-context.js.map +1 -0
- package/dist/PredictiveStudio/predictive-studio-copilot.view-models.d.ts +36 -0
- package/dist/PredictiveStudio/predictive-studio-copilot.view-models.d.ts.map +1 -0
- package/dist/PredictiveStudio/predictive-studio-copilot.view-models.js +52 -0
- package/dist/PredictiveStudio/predictive-studio-copilot.view-models.js.map +1 -0
- package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts +9 -1
- package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-models-resource.component.js +133 -56
- package/dist/PredictiveStudio/resources/ps-models-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +50 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +591 -165
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-resource-base.d.ts +17 -0
- package/dist/PredictiveStudio/resources/ps-resource-base.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-resource-base.js +27 -1
- package/dist/PredictiveStudio/resources/ps-resource-base.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts +11 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +199 -99
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
- package/package.json +59 -59
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps-home.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-home.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { PSPanelKey } from '../predictive-studio.types';\nimport { PS_AGENT_STARTER_PROMPT } from './ps-agent-starter-prompt';\n\nexport { PS_AGENT_STARTER_PROMPT } from './ps-agent-starter-prompt';\nimport {\n PSActivityFeedItem,\n PSHomeKpis,\n PSModelEventSource,\n PSProcessRunRow,\n buildActivityFeed,\n computeHomeKpis,\n deriveModelEvents,\n} from '../predictive-studio.view-models';\n\n/**\n * Home panel — the action-forward landing: a hero \"Build a predictive model\" band with three entry\n * paths, a vertical recent-activity timeline, and a side rail of weekly KPIs. Fully live:\n *\n * - **KPIs** (published count, active experiments, best holdout AUC, scored-this-week) come from the\n * cached models/sessions + recent ML scoring runs loaded on demand, via {@link computeHomeKpis}.\n * - **Recent activity** merges recent ML scoring process runs and recent model promotions/archives\n * into one reverse-chronological feed via {@link buildActivityFeed}.\n *\n * Recent scoring runs are loaded once on init (cheap, capped) — `MJ: Process Runs` isn't bulk-cached\n * because it grows unbounded. 100% entity-agnostic.\n *\n * **\"Ask the agent\" entry path.** The hero CTA and the agent entry-path card emit {@link askAgent} with a\n * starter prompt string. The host resource (the Studio door's `PSStudioResourceComponent`) reveals the\n * docked Model Development Agent chat seeded with that prompt. The prompt is a deliberately entity-agnostic template\n * ({@link PS_AGENT_STARTER_PROMPT}) — it never names a specific entity/target, so Predictive Studio stays\n * 100% domain-neutral and the agent leads the user through choosing what to predict.\n */\n@Component({\n standalone: true,\n selector: 'ps-home',\n imports: [CommonModule, MJButtonDirective],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.scss', './ps-home.component.scss'],\n template: `\n <div class=\"ps-panel ps-home\" data-testid=\"ps-home-panel\">\n <!-- Hero -->\n <div class=\"hero\" data-testid=\"ps-home-hero\">\n <h2>Build a predictive model</h2>\n <div class=\"sub\">\n Train a model on your own data, start from a proven template, or let the Model Dev Agent\n design the pipeline for you.\n </div>\n <div class=\"hero-stats\">\n <div class=\"s\"><div class=\"n\">{{ kpis.publishedCount }}</div><div class=\"l\">Published</div></div>\n <div class=\"s\"><div class=\"n\">{{ kpis.activeExperiments }}</div><div class=\"l\">Active Experiments</div></div>\n <div class=\"s\"><div class=\"n\">{{ kpis.bestHoldout }}</div><div class=\"l\">Best Holdout AUC</div></div>\n <div class=\"s\"><div class=\"n\">{{ kpis.scoredThisWeek }}</div><div class=\"l\">Scored this week</div></div>\n </div>\n <div class=\"hero-actions\">\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"navigate.emit('pipelines')\">\n <i class=\"fa-solid fa-diagram-project\"></i> New Training Pipeline\n </button>\n <button class=\"hero-ghost\" (click)=\"onAskAgent()\">\n <i class=\"fa-solid fa-robot\"></i> Ask the Model Dev Agent\n </button>\n </div>\n </div>\n\n <!-- Entry paths -->\n <div class=\"paths\" data-testid=\"ps-home-paths\">\n <div class=\"path\" data-testid=\"ps-home-path-data\" (click)=\"navigate.emit('pipelines')\">\n <div class=\"ic\"><i class=\"fa-solid fa-table-cells-large\"></i></div>\n <h4>Start from data</h4>\n <p>Point Studio at any entity's records, pick the target you want to predict, and we'll profile features automatically.</p>\n <button mjButton variant=\"primary\" size=\"sm\"><i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Choose dataset</button>\n </div>\n <div class=\"path\" data-testid=\"ps-home-path-template\" (click)=\"navigate.emit('catalog')\">\n <div class=\"ic green\"><i class=\"fa-solid fa-layer-group\"></i></div>\n <h4>Use a template</h4>\n <p>Browse the algorithm catalog with a use-case guide that ranks each algorithm for your scenario.</p>\n <button mjButton variant=\"secondary\" size=\"sm\"><i class=\"fa-solid fa-clone\"></i> Browse catalog</button>\n </div>\n <div class=\"path\" data-testid=\"ps-home-path-agent\" (click)=\"onAskAgent()\">\n <div class=\"ic purple\"><i class=\"fa-solid fa-robot\"></i></div>\n <h4>Ask the agent</h4>\n <p>Describe the goal in plain English. The agent proposes algorithms, features, and a budget.</p>\n <button mjButton variant=\"secondary\" size=\"sm\"><i class=\"fa-solid fa-comment-dots\"></i> Open agent</button>\n </div>\n </div>\n\n <!-- Lower: timeline + side rail -->\n <div class=\"lower\">\n <div class=\"ps-card\">\n <div class=\"ps-card-head\">\n <i class=\"fa-solid fa-clock-rotate-left\" style=\"color: var(--mj-brand-primary)\"></i>\n <h3>Recent Activity</h3>\n <span class=\"ps-spacer\"></span>\n </div>\n <div class=\"ps-card-body\">\n @if (activity.length > 0) {\n <div class=\"feed\">\n @for (item of activity; track item.title + item.when) {\n <div class=\"fitem\">\n <div class=\"ev\" [class]=\"item.kind\"><i [class]=\"item.icon\"></i></div>\n <div>\n <div class=\"ftitle\">{{ item.title }}</div>\n <div class=\"ps-muted ps-small\">{{ item.detail }}</div>\n <div class=\"when\">{{ item.when }}</div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"ps-empty\" style=\"padding:32px 16px\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-clock-rotate-left\"></i></span>\n <p>No activity yet. Promote a model or run a scoring batch and it'll show up here.</p>\n </div>\n }\n </div>\n </div>\n\n <div class=\"ps-col\">\n <div class=\"ps-card\">\n <div class=\"ps-card-head\">\n <i class=\"fa-solid fa-gauge-high\" style=\"color: var(--mj-brand-primary)\"></i>\n <h3>This Week</h3>\n </div>\n <div class=\"ps-card-body\">\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Records scored</div><div class=\"v\">{{ kpis.scoredThisWeek }}</div></div>\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Best holdout AUC</div><div class=\"v\">{{ kpis.bestHoldout }}</div></div>\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Experiment runs</div><div class=\"v\">{{ kpis.experimentRuns }}</div></div>\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Published models</div><div class=\"v\">{{ kpis.publishedCount }}</div></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class PSHomeComponent implements OnInit {\n @Input() engine!: PredictiveStudioEngine;\n /** Provider to load recent scoring runs through (multi-provider correctness). */\n @Input() provider: IMetadataProvider | null = null;\n /** Acting user for the on-demand scoring-runs load. */\n @Input() currentUser: UserInfo | null = null;\n @Output() navigate = new EventEmitter<PSPanelKey>();\n /**\n * Emitted when the user clicks an \"Ask the agent\" entry path. The payload is the starter prompt to seed\n * the Model Development Agent chat with — the entity-agnostic {@link PS_AGENT_STARTER_PROMPT} by default.\n */\n @Output() askAgent = new EventEmitter<string>();\n\n private cdr = inject(ChangeDetectorRef);\n\n /** Entry-path handler — emits {@link askAgent} with the default entity-agnostic starter prompt. */\n public onAskAgent(): void {\n this.askAgent.emit(PS_AGENT_STARTER_PROMPT);\n }\n\n /** Derived KPI strip. Starts from the synchronously-available counts, refined once runs load. */\n public kpis: PSHomeKpis = { publishedCount: 0, activeExperiments: 0, bestHoldout: '—', scoredThisWeek: '0', experimentRuns: 0 };\n /** Recent-activity timeline. */\n public activity: PSActivityFeedItem[] = [];\n\n /** Cached recent scoring runs (loaded on demand). */\n private scoringRuns: PSProcessRunRow[] = [];\n\n async ngOnInit(): Promise<void> {\n // Render immediately from cached data, then refine with the on-demand scoring-run load.\n this.rebuild();\n await this.loadScoringRuns();\n this.rebuild();\n this.cdr.detectChanges();\n }\n\n /** Load the recent ML scoring runs once (cheap, capped) for the KPI + activity feed. */\n private async loadScoringRuns(): Promise<void> {\n if (!this.provider) return;\n try {\n this.scoringRuns = await this.engine.LoadRecentScoringRuns(this.provider, this.currentUser ?? undefined, {\n sinceDays: 7,\n maxRows: 50,\n });\n } catch {\n this.scoringRuns = [];\n }\n }\n\n /** Recompute the KPI strip + activity feed from the current cached data + scoring runs. */\n private rebuild(): void {\n const models = this.engine?.Models ?? [];\n const runningSessions = this.engine?.RunningSessions.length ?? 0;\n const experimentRuns = this.engine?.Iterations.length ?? 0;\n\n this.kpis = computeHomeKpis(models, runningSessions, this.scoringRuns, experimentRuns);\n\n const eventSources: PSModelEventSource[] = models.map((m) => ({\n Name: this.engine.ModelDisplayName(m),\n Algorithm: this.engine.AlgorithmName(m.AlgorithmID),\n Status: m.Status,\n Metrics: m.Metrics,\n HoldoutMetrics: m.HoldoutMetrics,\n UpdatedAt: m.__mj_UpdatedAt,\n }));\n this.activity = buildActivityFeed(this.scoringRuns, deriveModelEvents(eventSources), new Date(), 6);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ps-home.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-home.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { PSPanelKey } from '../predictive-studio.types';\nimport { PS_AGENT_STARTER_PROMPT } from './ps-agent-starter-prompt';\n\nexport { PS_AGENT_STARTER_PROMPT } from './ps-agent-starter-prompt';\nimport {\n PSActivityFeedItem,\n PSHomeKpis,\n PSModelEventSource,\n PSProcessRunRow,\n buildActivityFeed,\n computeHomeKpis,\n deriveModelEvents,\n} from '../predictive-studio.view-models';\n\n/**\n * Home panel — the action-forward landing: a hero \"Build a predictive model\" band with three entry\n * paths, a vertical recent-activity timeline, and a side rail of weekly KPIs. Fully live:\n *\n * - **KPIs** (published count, active experiments, best holdout AUC, scored-this-week) come from the\n * cached models/sessions + recent ML scoring runs loaded on demand, via {@link computeHomeKpis}.\n * - **Recent activity** merges recent ML scoring process runs and recent model promotions/archives\n * into one reverse-chronological feed via {@link buildActivityFeed}.\n *\n * Recent scoring runs are loaded once on init (cheap, capped) — `MJ: Process Runs` isn't bulk-cached\n * because it grows unbounded. 100% entity-agnostic.\n *\n * **\"Ask the agent\" entry path.** The hero CTA and the agent entry-path card emit {@link askAgent} with a\n * starter prompt string. The host resource (the Studio door's `PSStudioResourceComponent`) reveals the\n * docked Model Development Agent chat seeded with that prompt. The prompt is a deliberately entity-agnostic template\n * ({@link PS_AGENT_STARTER_PROMPT}) — it never names a specific entity/target, so Predictive Studio stays\n * 100% domain-neutral and the agent leads the user through choosing what to predict.\n */\n@Component({\n standalone: true,\n selector: 'ps-home',\n imports: [CommonModule, MJButtonDirective],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-home.component.css'],\n template: `\n <div class=\"ps-panel ps-home\" data-testid=\"ps-home-panel\">\n <!-- Hero -->\n <div class=\"hero\" data-testid=\"ps-home-hero\">\n <h2>Build a predictive model</h2>\n <div class=\"sub\">\n Train a model on your own data, start from a proven template, or let the Model Dev Agent\n design the pipeline for you.\n </div>\n <div class=\"hero-stats\">\n <div class=\"s\"><div class=\"n\">{{ kpis.publishedCount }}</div><div class=\"l\">Published</div></div>\n <div class=\"s\"><div class=\"n\">{{ kpis.activeExperiments }}</div><div class=\"l\">Active Experiments</div></div>\n <div class=\"s\"><div class=\"n\">{{ kpis.bestHoldout }}</div><div class=\"l\">Best Holdout AUC</div></div>\n <div class=\"s\"><div class=\"n\">{{ kpis.scoredThisWeek }}</div><div class=\"l\">Scored this week</div></div>\n </div>\n <div class=\"hero-actions\">\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"navigate.emit('pipelines')\">\n <i class=\"fa-solid fa-diagram-project\"></i> New Training Pipeline\n </button>\n <button class=\"hero-ghost\" (click)=\"onAskAgent()\">\n <i class=\"fa-solid fa-robot\"></i> Ask the Model Dev Agent\n </button>\n </div>\n </div>\n\n <!-- Entry paths -->\n <div class=\"paths\" data-testid=\"ps-home-paths\">\n <div class=\"path\" data-testid=\"ps-home-path-data\" (click)=\"navigate.emit('pipelines')\">\n <div class=\"ic\"><i class=\"fa-solid fa-table-cells-large\"></i></div>\n <h4>Start from data</h4>\n <p>Point Studio at any entity's records, pick the target you want to predict, and we'll profile features automatically.</p>\n <button mjButton variant=\"primary\" size=\"sm\"><i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Choose dataset</button>\n </div>\n <div class=\"path\" data-testid=\"ps-home-path-template\" (click)=\"navigate.emit('catalog')\">\n <div class=\"ic green\"><i class=\"fa-solid fa-layer-group\"></i></div>\n <h4>Use a template</h4>\n <p>Browse the algorithm catalog with a use-case guide that ranks each algorithm for your scenario.</p>\n <button mjButton variant=\"secondary\" size=\"sm\"><i class=\"fa-solid fa-clone\"></i> Browse catalog</button>\n </div>\n <div class=\"path\" data-testid=\"ps-home-path-agent\" (click)=\"onAskAgent()\">\n <div class=\"ic purple\"><i class=\"fa-solid fa-robot\"></i></div>\n <h4>Ask the agent</h4>\n <p>Describe the goal in plain English. The agent proposes algorithms, features, and a budget.</p>\n <button mjButton variant=\"secondary\" size=\"sm\"><i class=\"fa-solid fa-comment-dots\"></i> Open agent</button>\n </div>\n </div>\n\n <!-- Lower: timeline + side rail -->\n <div class=\"lower\">\n <div class=\"ps-card\">\n <div class=\"ps-card-head\">\n <i class=\"fa-solid fa-clock-rotate-left\" style=\"color: var(--mj-brand-primary)\"></i>\n <h3>Recent Activity</h3>\n <span class=\"ps-spacer\"></span>\n </div>\n <div class=\"ps-card-body\">\n @if (activity.length > 0) {\n <div class=\"feed\">\n @for (item of activity; track item.title + item.when) {\n <div class=\"fitem\">\n <div class=\"ev\" [class]=\"item.kind\"><i [class]=\"item.icon\"></i></div>\n <div>\n <div class=\"ftitle\">{{ item.title }}</div>\n <div class=\"ps-muted ps-small\">{{ item.detail }}</div>\n <div class=\"when\">{{ item.when }}</div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"ps-empty\" style=\"padding:32px 16px\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-clock-rotate-left\"></i></span>\n <p>No activity yet. Promote a model or run a scoring batch and it'll show up here.</p>\n </div>\n }\n </div>\n </div>\n\n <div class=\"ps-col\">\n <div class=\"ps-card\">\n <div class=\"ps-card-head\">\n <i class=\"fa-solid fa-gauge-high\" style=\"color: var(--mj-brand-primary)\"></i>\n <h3>This Week</h3>\n </div>\n <div class=\"ps-card-body\">\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Records scored</div><div class=\"v\">{{ kpis.scoredThisWeek }}</div></div>\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Best holdout AUC</div><div class=\"v\">{{ kpis.bestHoldout }}</div></div>\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Experiment runs</div><div class=\"v\">{{ kpis.experimentRuns }}</div></div>\n <div class=\"mini-kpi\"><div class=\"ps-muted ps-small\">Published models</div><div class=\"v\">{{ kpis.publishedCount }}</div></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class PSHomeComponent implements OnInit {\n @Input() engine!: PredictiveStudioEngine;\n /** Provider to load recent scoring runs through (multi-provider correctness). */\n @Input() provider: IMetadataProvider | null = null;\n /** Acting user for the on-demand scoring-runs load. */\n @Input() currentUser: UserInfo | null = null;\n @Output() navigate = new EventEmitter<PSPanelKey>();\n /**\n * Emitted when the user clicks an \"Ask the agent\" entry path. The payload is the starter prompt to seed\n * the Model Development Agent chat with — the entity-agnostic {@link PS_AGENT_STARTER_PROMPT} by default.\n */\n @Output() askAgent = new EventEmitter<string>();\n\n private cdr = inject(ChangeDetectorRef);\n\n /** Entry-path handler — emits {@link askAgent} with the default entity-agnostic starter prompt. */\n public onAskAgent(): void {\n this.askAgent.emit(PS_AGENT_STARTER_PROMPT);\n }\n\n /** Derived KPI strip. Starts from the synchronously-available counts, refined once runs load. */\n public kpis: PSHomeKpis = { publishedCount: 0, activeExperiments: 0, bestHoldout: '—', scoredThisWeek: '0', experimentRuns: 0 };\n /** Recent-activity timeline. */\n public activity: PSActivityFeedItem[] = [];\n\n /** Cached recent scoring runs (loaded on demand). */\n private scoringRuns: PSProcessRunRow[] = [];\n\n async ngOnInit(): Promise<void> {\n // Render immediately from cached data, then refine with the on-demand scoring-run load.\n this.rebuild();\n await this.loadScoringRuns();\n this.rebuild();\n this.cdr.detectChanges();\n }\n\n /** Load the recent ML scoring runs once (cheap, capped) for the KPI + activity feed. */\n private async loadScoringRuns(): Promise<void> {\n if (!this.provider) return;\n try {\n this.scoringRuns = await this.engine.LoadRecentScoringRuns(this.provider, this.currentUser ?? undefined, {\n sinceDays: 7,\n maxRows: 50,\n });\n } catch {\n this.scoringRuns = [];\n }\n }\n\n /** Recompute the KPI strip + activity feed from the current cached data + scoring runs. */\n private rebuild(): void {\n const models = this.engine?.Models ?? [];\n const runningSessions = this.engine?.RunningSessions.length ?? 0;\n const experimentRuns = this.engine?.Iterations.length ?? 0;\n\n this.kpis = computeHomeKpis(models, runningSessions, this.scoringRuns, experimentRuns);\n\n const eventSources: PSModelEventSource[] = models.map((m) => ({\n Name: this.engine.ModelDisplayName(m),\n Algorithm: this.engine.AlgorithmName(m.AlgorithmID),\n Status: m.Status,\n Metrics: m.Metrics,\n HoldoutMetrics: m.HoldoutMetrics,\n UpdatedAt: m.__mj_UpdatedAt,\n }));\n this.activity = buildActivityFeed(this.scoringRuns, deriveModelEvents(eventSources), new Date(), 6);\n }\n}\n"]}
|
|
@@ -448,7 +448,7 @@ export class PSOperateDialogComponent extends BaseAngularComponent {
|
|
|
448
448
|
i0.ɵɵproperty("disabled", ctx.busy);
|
|
449
449
|
i0.ɵɵadvance(2);
|
|
450
450
|
i0.ɵɵproperty("Visible", ctx.scheduleOpen)("JobTypeID", ctx.jobTypeId)("DefaultConfiguration", ctx.schedConfig)("HideJobType", true);
|
|
451
|
-
} }, dependencies: [CommonModule, MJButtonDirective, MJDialogComponent, SchedulingModule, i1.ScheduledJobDialogComponent], styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 10px; padding: 16px 18px; box-shadow: var(--mj-shadow-sm);\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: 150px 1fr 48px; align-items: center; gap: 10px; padding: 5px 0; }\n.ps-fbar .track { height: 14px; border-radius: 5px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-secondary); }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 10px;\n box-shadow: var(--mj-shadow-sm); cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "// \"Operate this model\" dialog \u2014 scope + output knobs, composed Remote Ops. Tokens only.\n\n.ps-operate {\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 4px 2px;\n}\n\n.ps-operate .op-target {\n margin: 0;\n}\n\n.ps-operate .op-hint {\n margin-top: 6px;\n}\n\n.ps-operate .op-summary {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-text-secondary);\n}\n.ps-operate .op-summary i {\n color: var(--mj-brand-primary);\n}\n\n// smaller segmented control (value-kind toggle)\n.ps-operate .ps-seg.sm button {\n font-size: 12px;\n padding: 5px 10px;\n}\n\n.op-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 2px 2px;\n}\n"], encapsulation: 2 });
|
|
451
|
+
} }, dependencies: [CommonModule, MJButtonDirective, MJDialogComponent, SchedulingModule, i1.ScheduledJobDialogComponent], styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "/* \"Operate this model\" dialog \u2014 scope + output knobs, composed Remote Ops. Tokens only. */\n\n.ps-operate {\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 4px 2px;\n}\n\n.ps-operate .op-target {\n margin: 0;\n}\n\n.ps-operate .op-hint {\n margin-top: 6px;\n}\n\n.ps-operate .op-summary {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-text-secondary);\n}\n.ps-operate .op-summary i {\n color: var(--mj-brand-primary);\n}\n\n/* smaller segmented control (value-kind toggle) */\n.ps-operate .ps-seg.sm button {\n font-size: 12px;\n padding: 5px 10px;\n}\n\n.op-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 2px 2px;\n}\n"], encapsulation: 2 });
|
|
452
452
|
}
|
|
453
453
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PSOperateDialogComponent, [{
|
|
454
454
|
type: Component,
|
|
@@ -537,7 +537,7 @@ export class PSOperateDialogComponent extends BaseAngularComponent {
|
|
|
537
537
|
[HideJobType]="true"
|
|
538
538
|
(Close)="onScheduleClose($event)">
|
|
539
539
|
</mj-scheduled-job-dialog>
|
|
540
|
-
`, styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 10px; padding: 16px 18px; box-shadow: var(--mj-shadow-sm);\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: 150px 1fr 48px; align-items: center; gap: 10px; padding: 5px 0; }\n.ps-fbar .track { height: 14px; border-radius: 5px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-secondary); }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 10px;\n box-shadow: var(--mj-shadow-sm); cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "// \"Operate this model\" dialog \u2014 scope + output knobs, composed Remote Ops. Tokens only.\n\n.ps-operate {\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 4px 2px;\n}\n\n.ps-operate .op-target {\n margin: 0;\n}\n\n.ps-operate .op-hint {\n margin-top: 6px;\n}\n\n.ps-operate .op-summary {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-text-secondary);\n}\n.ps-operate .op-summary i {\n color: var(--mj-brand-primary);\n}\n\n// smaller segmented control (value-kind toggle)\n.ps-operate .ps-seg.sm button {\n font-size: 12px;\n padding: 5px 10px;\n}\n\n.op-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 2px 2px;\n}\n"] }]
|
|
540
|
+
`, styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", "/* \"Operate this model\" dialog \u2014 scope + output knobs, composed Remote Ops. Tokens only. */\n\n.ps-operate {\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 4px 2px;\n}\n\n.ps-operate .op-target {\n margin: 0;\n}\n\n.ps-operate .op-hint {\n margin-top: 6px;\n}\n\n.ps-operate .op-summary {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-text-secondary);\n}\n.ps-operate .op-summary i {\n color: var(--mj-brand-primary);\n}\n\n/* smaller segmented control (value-kind toggle) */\n.ps-operate .ps-seg.sm button {\n font-size: 12px;\n padding: 5px 10px;\n}\n\n.op-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 2px 2px;\n}\n"] }]
|
|
541
541
|
}], null, { modelId: [{
|
|
542
542
|
type: Input
|
|
543
543
|
}], modelLabel: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps-operate-dialog.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-operate-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EACL,6CAA6C,EAC7C,4BAA4B,GAI7B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAKL,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,6BAA6B,CAAC;;;;;IA4CS,kCAAuB;IAAA,YAAY;IAAA,iBAAS;;;IAApC,+BAAc;IAAC,cAAY;IAAZ,+BAAY;;;IAE1C,+BAAuC;IAAA,YAA8E;IAAA,iBAAM;;;IAApF,cAA8E;IAA9E,mHAA8E;;;;IAJhJ,kCAAwI;IAApD,mPAAmD;IACrI,kCAA0B;IAAA,mCAAc;IAAA,iBAAS;IACjD,8GAA8E;IAChF,iBAAS;IACT,0GAA0B;;;IAJ6B,iDAA4B;IAEjF,eAA8E;IAA9E,2BAA8E;IAEhF,eAAwJ;IAAxJ,oDAAwJ;;;IAKtH,kCAAuB;IAAA,YAAY;IAAA,iBAAS;;;IAApC,+BAAc;IAAC,cAAY;IAAZ,+BAAY;;;IAE1C,+BAAuC;IAAA,YAAwE;IAAA,iBAAM;;;IAA9E,cAAwE;IAAxE,6GAAwE;;;;IAJ1I,kCAAwI;IAApD,mPAAmD;IACrI,kCAA0B;IAAA,mCAAc;IAAA,iBAAS;IACjD,8GAA8E;IAChF,iBAAS;IACT,0GAA0B;;;IAJ6B,iDAA4B;IAEjF,eAA8E;IAA9E,2BAA8E;IAEhF,eAAkJ;IAAlJ,oDAAkJ;;;IAe7E,6BAA6B;;;IAArB,4BAAW;;;;IAGpF,AADF,+BAA8C,gBACyC;IAApC,qOAA2B,OAAO,KAAC;IAAC,2BAAW;IAAA,iBAAS;IACzG,iCAAqF;IAApC,qOAA2B,OAAO,KAAC;IAAC,+BAAe;IACtG,AADsG,iBAAS,EACzG;;;IAFI,cAAwC;IAAxC,wDAAwC;IACxC,eAAwC;IAAxC,wDAAwC;;;;IAPpD,iCAEwF;IAA1D,qPAAuD;IAFrF,iBAEwF;IACxF,oCAAiC;IAAA,gIAAmE;IAAA,iBAAW;IAC/G,0GAAwB;;;IAFtB,AADA,6BAAA,4FAA8E,CAAA,mCACnD;IACI,eAAmE;IAAnE,kCAAmE;IACpG,eAKC;IALD,kDAKC;;;IAoBQ,gCAAgC;IAAA,wBAA2C;IAAC,YAAe;IAAA,iBAAO;;;IAAtB,eAAe;IAAf,4CAAe;;AA5FhH,MAAM,2BAA2B,GAAG,oBAAoB,CAAC;AAEzD;;;;;;;;;;;GAWG;AA8FH,MAAM,OAAO,wBAAyB,SAAQ,oBAAoB;IACvD,OAAO,GAAG,EAAE,CAAC;IACb,UAAU,GAAG,EAAE,CAAC;IAChB,MAAM,CAA0B;IAChC,QAAQ,GAA6B,IAAI,CAAC;IAC1C,WAAW,GAAoB,IAAI,CAAC;IAE7C,iHAAiH;IACjH,IACI,OAAO,CAAC,KAAc;QACxB,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACO,QAAQ,GAAG,KAAK,CAAC;IAEf,KAAK,GAAG,IAAI,YAAY,EAAwB,CAAC;IAEnD,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAE/C,KAAK,GAAsB,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7C,KAAK,GAAuB,EAAE,CAAC;IAC/B,KAAK,GAAmB,EAAE,CAAC;IAC3B,YAAY,GAAa,EAAE,CAAC;IAC5B,gBAAgB,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,KAAK,CAAC;IACb,SAAS,GAAG,EAAE,CAAC;IAEtB,wBAAwB;IACjB,YAAY,GAAG,KAAK,CAAC;IACrB,SAAS,GAAkB,IAAI,CAAC;IAChC,WAAW,GAAkB,IAAI,CAAC;IAEzC,8EAA8E;IAEtE,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,gBAAgB,GAAG,KAAK,EAAE,WAAW,KAAK,gBAAgB,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3G,MAAM,MAAM,GAAG,QAAQ,EAAE,cAAc;YACrC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;YACpF,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACnG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,QAA4B;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CACxB,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,QAAQ,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,EACrH,IAAI,CAAC,aAAa,CAAC,WAAW,CAC/B,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,QAA4B;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CACxB,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,QAAQ,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,EAChH,IAAI,CAAC,aAAa,CAAC,WAAW,CAC/B,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,iGAAiG;IACzF,KAAK,CAAC,cAAc;QAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CACxB,EAAE,UAAU,EAAE,yBAAyB,EAAE,WAAW,EAAE,SAAS,2BAA2B,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,EAC5H,IAAI,CAAC,aAAa,CAAC,WAAW,CAC/B,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IAEM,QAAQ,CAAC,IAAsB;QACpC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,yBAAyB;IAEzB,IAAW,OAAO;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,YAAY,CAAC;QAC3D,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK;YAC5B,CAAC,CAAC,2BAA2B,MAAM,WAAW;YAC9C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM;gBAC/B,CAAC,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,IAAI,UAAU,qBAAqB,MAAM,EAAE;gBAC3E,CAAC,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,IAAI,UAAU,qBAAqB,MAAM,EAAE,CAAC;QAClF,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW;YACnC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC7B,CAAC,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,iBAAiB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW;gBAC7I,CAAC,CAAC,oCAAoC;YACxC,CAAC,CAAC,4DAA4D,CAAC;QACnE,OAAO,UAAU,KAAK,iBAAiB,IAAI,CAAC,UAAU,iBAAiB,MAAM,GAAG,CAAC;IACnF,CAAC;IAEO,QAAQ;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IACzF,CAAC;IACO,QAAQ;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IACzF,CAAC;IAED,oBAAoB;IAEpB,uEAAuE;IAChE,KAAK,CAAC,QAAQ;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,4BAA4B,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC;YAC3I,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACpC,IAAI,CAAC,aAAa,CAAC,wBAAwB,CACzC,UAAU,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,gBAAgB,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,EACjG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC5D,IAAI,CACL,CAAC;gBACF,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,MAAM,CAAC,YAAY,IAAI,4DAA4D,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAClJ,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,uFAAuF;IAChF,KAAK,CAAC,UAAU;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,8EAA8E,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3I,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAAgC;QAC3D,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,cAAc,IAAI,CAAC,UAAU,oCAAoC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAChI,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,6FAA6F;YAC7F,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,8EAA8E,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1I,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,+BAA+B;IAE/B,qHAAqH;IAC7G,KAAK,CAAC,aAAa,CAAC,KAAa;QACvC,MAAM,MAAM,GAAG,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,2BAA2B,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACxG,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,6CAA6C,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC;YAC7H,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;gBACrD,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,MAAM,CAAC,YAAY,IAAI,uCAAuC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3H,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,yCAAyC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACnH,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAEO,GAAG,CAAC,CAAU;QACpB,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,gBAAgB,EAAE,EAAE;YACpB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,OAAO;SACnB,CAAC;IACJ,CAAC;6QApOU,wBAAwB,yBAAxB,wBAAwB;6DAAxB,wBAAwB;YAtFjC,oCAAsG;YAArB,wGAAS,cAAU,IAAC;YAGjG,AAFF,8BAAwD,aAEf;YACrC,uBAAiC;YACjC,8BAAsB;YACpB,wBAAO;YAAA,8BAAQ;YAAA,YAAmC;YAAA,iBAAS;YAAC,8DAC9D;YACF,AADE,iBAAM,EACF;YAIJ,AADF,8BAAsB,aACb;YAAA,+BAAc;YAAA,iBAAQ;YAE3B,AADF,+BAAmD,iBACwB;YAA1B,sGAAS,aAAS,KAAK,CAAC,IAAC;YAAC,wBAAiC;YAAC,0BAAQ;YAAA,iBAAS;YAC5H,kCAA2E;YAA3B,sGAAS,aAAS,MAAM,CAAC,IAAC;YAAC,wBAAsC;YAAC,8BAAY;YAAA,iBAAS;YACvI,kCAA2E;YAA3B,sGAAS,aAAS,MAAM,CAAC,IAAC;YAAC,yBAAsC;YAAC,wBAAM;YAC1H,AAD0H,iBAAS,EAC7H;YACN,kFAAkC;YAOlC,kFAAkC;YAOpC,iBAAM;YAIJ,AADF,+BAAsB,aACb;YAAA,yCAAwB;YAAA,iBAAQ;YAErC,AADF,gCAAoD,iBACyC;YAAvC,6HAA4B,SAAS,IAAC;YAAC,yBAA6C;YAAC,kCAAgB;YAAA,iBAAS;YAClK,kCAA+F;YAAzC,6HAA4B,WAAW,IAAC;YAAC,yBAAyC;YAAC,wCAAsB;YACjK,AADiK,iBAAS,EACpK;YACN,kFAAwC;YAY1C,iBAAM;YAGN,gCAAoE;YAElE,AADA,yBAA+C,eACG;YAEtD,AADE,iBAAM,EACF;YAIJ,AADF,gCAAuB,kBAC4F;YAArB,sGAAS,cAAU,IAAC;YAC9G,yBAAgC;YAAC,0BACnC;YAAA,iBAAS;YACT,mCAA0H;YAAvB,sGAAS,gBAAY,IAAC;YACvH,yBAAiC;YAAC,iCACpC;YAAA,iBAAS;YACT,4BAA+B;YAC/B,8FAAY;YACZ,mCAAiF;YAArB,sGAAS,cAAU,IAAC;YAAC,uBAAM;YAE3F,AADE,AADyF,iBAAS,EAC5F,EACI;YAGZ,oDAKoC;YAAlC,6HAAS,2BAAuB,IAAC;YACnC,iBAA0B;;YAnFyC,AAApC,AAApB,qCAAmB,6CAAoC,cAAc;YAMzD,eAAmC;YAAnC,4DAAmC;YAQ1C,eAAsC;YAAtC,mDAAsC;YACtC,eAAuC;YAAvC,oDAAuC;YACvC,eAAuC;YAAvC,oDAAuC;YAEjD,eAMC;YAND,0DAMC;YACD,cAMC;YAND,0DAMC;YAOS,eAA2C;YAA3C,wDAA2C;YAC3C,eAA6C;YAA7C,0DAA6C;YAEvD,eAWC;YAXD,gEAWC;YAMqB,eAAqB;YAArB,0DAAqB;YAM6B,eAAiB;YAAjB,mCAAiB;YAGV,eAAiB;YAAjB,mCAAiB;YAIlG,eAAiH;YAAjH,oCAAiH;YACvE,cAAiB;YAAjB,mCAAiB;YAM7D,eAAwB;YAGxB,AADA,AADA,AADA,0CAAwB,4BACD,yCACa,qBAChB;4BArFd,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB;;iFA0FnE,wBAAwB;cA7FpC,SAAS;6BACI,IAAI,YACN,mBAAmB,WACpB,CAAC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,iBAChE,iBAAiB,CAAC,IAAI,YAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFT;;kBAGA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAGL,KAAK;;kBAaL,MAAM;;kFArBI,wBAAwB","sourcesContent":["import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RunView } from '@memberjunction/core';\nimport type { IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJButtonDirective, MJDialogComponent } from '@memberjunction/ng-ui-components';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport {\n PredictiveStudioCreateScoringProcessOperation,\n RecordProcessRunNowOperation,\n MJUserViewEntity,\n MJListEntity,\n MJScheduledJobTypeEntity,\n} from '@memberjunction/core-entities';\nimport { SchedulingModule } from '@memberjunction/ng-scheduling';\nimport type { ScheduledJobDialogResult } from '@memberjunction/ng-scheduling';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport {\n OperateModelState,\n OperateScopeMode,\n OperateOutputMode,\n OperateValueKind,\n mapStateToCreateScoringInput,\n describeOperateMappingError,\n} from './ps-operate-dialog.mapping';\n\nconst RUN_RECORD_PROCESS_JOB_TYPE = 'Run Record Process';\n\n/**\n * **Operate this model** — the dialog that turns a published model into a running one. It composes\n * three primitives, no bespoke transport:\n * - **what** → the `PredictiveStudio.CreateScoringProcess` Remote Op (persists an on-demand\n * `WorkType='ML Model'` Record Process; write-back when an output column is chosen, generic otherwise);\n * - **now** → the generic `RecordProcess.RunNow` Remote Op on that process;\n * - **when** → the generic `@memberjunction/ng-scheduling` dialog (a \"Run Record Process\" scheduled job).\n *\n * The target entity is FIXED to the model's training entity (the model's features only assemble against\n * that entity), so the knobs are **scope** (everyone / a saved view / a list) and **output** (generic /\n * write-back column). Pure submit→input mapping lives in `ps-operate-dialog.mapping.ts` (unit-tested).\n */\n@Component({\n standalone: true,\n selector: 'ps-operate-dialog',\n imports: [CommonModule, MJButtonDirective, MJDialogComponent, SchedulingModule],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.scss', './ps-operate-dialog.component.scss'],\n template: `\n <mj-dialog [Visible]=\"Visible\" [Title]=\"'Operate · ' + modelLabel\" [Width]=\"640\" (Close)=\"onCancel()\">\n <div class=\"ps-operate\" data-testid=\"ps-operate-dialog\">\n <!-- target entity (fixed to the model's training entity) -->\n <div class=\"ps-callout info op-target\">\n <i class=\"fa-solid fa-table\"></i>\n <div class=\"ps-small\">\n Scores <strong>{{ state.targetEntityName || '—' }}</strong> — the entity this model was trained on.\n </div>\n </div>\n\n <!-- SCOPE -->\n <div class=\"ps-field\">\n <label>Which records?</label>\n <div class=\"ps-seg\" data-testid=\"ps-operate-scope\">\n <button [class.on]=\"state.scopeMode === 'all'\" (click)=\"setScope('all')\"><i class=\"fa-solid fa-globe\"></i> Everyone</button>\n <button [class.on]=\"state.scopeMode === 'view'\" (click)=\"setScope('view')\"><i class=\"fa-solid fa-table-list\"></i> A saved view</button>\n <button [class.on]=\"state.scopeMode === 'list'\" (click)=\"setScope('list')\"><i class=\"fa-solid fa-list-check\"></i> A list</button>\n </div>\n @if (state.scopeMode === 'view') {\n <select class=\"mj-input\" data-testid=\"ps-operate-view\" [value]=\"state.viewId || ''\" (change)=\"state.viewId = $any($event.target).value\">\n <option value=\"\" disabled>Choose a view…</option>\n @for (v of views; track v.ID) { <option [value]=\"v.ID\">{{ v.Name }}</option> }\n </select>\n @if (views.length === 0) { <div class=\"ps-small ps-muted op-hint\">No saved views for {{ state.targetEntityName }} yet — pick Everyone or a list.</div> }\n }\n @if (state.scopeMode === 'list') {\n <select class=\"mj-input\" data-testid=\"ps-operate-list\" [value]=\"state.listId || ''\" (change)=\"state.listId = $any($event.target).value\">\n <option value=\"\" disabled>Choose a list…</option>\n @for (l of lists; track l.ID) { <option [value]=\"l.ID\">{{ l.Name }}</option> }\n </select>\n @if (lists.length === 0) { <div class=\"ps-small ps-muted op-hint\">No lists for {{ state.targetEntityName }} yet — pick Everyone or a view.</div> }\n }\n </div>\n\n <!-- OUTPUT -->\n <div class=\"ps-field\">\n <label>Where do predictions go?</label>\n <div class=\"ps-seg\" data-testid=\"ps-operate-output\">\n <button [class.on]=\"state.outputMode === 'generic'\" (click)=\"state.outputMode = 'generic'\"><i class=\"fa-solid fa-clock-rotate-left\"></i> Run history only</button>\n <button [class.on]=\"state.outputMode === 'writeback'\" (click)=\"state.outputMode = 'writeback'\"><i class=\"fa-solid fa-pen-to-square\"></i> Write back to a column</button>\n </div>\n @if (state.outputMode === 'writeback') {\n <input class=\"mj-input\" type=\"text\" list=\"ps-operate-fields\" data-testid=\"ps-operate-column\"\n placeholder=\"Column on {{ state.targetEntityName }} (e.g. RenewalProbability)\"\n [value]=\"state.outputField\" (input)=\"state.outputField = $any($event.target).value\" />\n <datalist id=\"ps-operate-fields\">@for (f of entityFields; track f) { <option [value]=\"f\"></option> }</datalist>\n @if (isClassification) {\n <div class=\"ps-seg sm\" style=\"margin-top:8px\">\n <button [class.on]=\"state.valueKind === 'score'\" (click)=\"state.valueKind = 'score'\">Probability</button>\n <button [class.on]=\"state.valueKind === 'class'\" (click)=\"state.valueKind = 'class'\">Predicted class</button>\n </div>\n }\n }\n </div>\n\n <!-- live summary -->\n <div class=\"ps-callout op-summary\" data-testid=\"ps-operate-summary\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <div class=\"ps-small\" [innerHTML]=\"summary\"></div>\n </div>\n </div>\n\n <!-- footer (affirmative on the left, MJ convention) -->\n <div class=\"op-footer\">\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-operate-run\" [disabled]=\"busy\" (click)=\"onRunNow()\">\n <i class=\"fa-solid fa-play\"></i> Run now\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-operate-schedule\" [disabled]=\"busy\" (click)=\"onSchedule()\">\n <i class=\"fa-solid fa-clock\"></i> Schedule…\n </button>\n <span class=\"ps-spacer\"></span>\n @if (busy) { <span class=\"ps-small ps-muted\"><i class=\"fa-solid fa-spinner fa-spin\"></i> {{ busyLabel }}</span> }\n <button mjButton variant=\"flat\" size=\"sm\" [disabled]=\"busy\" (click)=\"onCancel()\">Cancel</button>\n </div>\n </mj-dialog>\n\n <!-- WHEN: the generic scheduling dialog, opened after the Record Process is created -->\n <mj-scheduled-job-dialog\n [Visible]=\"scheduleOpen\"\n [JobTypeID]=\"jobTypeId\"\n [DefaultConfiguration]=\"schedConfig\"\n [HideJobType]=\"true\"\n (Close)=\"onScheduleClose($event)\">\n </mj-scheduled-job-dialog>\n `,\n})\nexport class PSOperateDialogComponent extends BaseAngularComponent {\n @Input() modelId = '';\n @Input() modelLabel = '';\n @Input() engine!: PredictiveStudioEngine;\n @Input() provider: IMetadataProvider | null = null;\n @Input() currentUser: UserInfo | null = null;\n\n /** Opening the dialog (false → true) initializes the knobs + loads views/lists/fields for the model's entity. */\n @Input()\n set Visible(value: boolean) {\n const opening = value && !this._visible;\n this._visible = value;\n if (opening) {\n void this.init();\n }\n }\n get Visible(): boolean {\n return this._visible;\n }\n private _visible = false;\n\n @Output() Close = new EventEmitter<{ changed: boolean }>();\n\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n\n public state: OperateModelState = this.blankState();\n public views: MJUserViewEntity[] = [];\n public lists: MJListEntity[] = [];\n public entityFields: string[] = [];\n public isClassification = false;\n public busy = false;\n public busyLabel = '';\n\n // scheduling sub-dialog\n public scheduleOpen = false;\n public jobTypeId: string | null = null;\n public schedConfig: string | null = null;\n\n // ---- init / load (DB-light: a couple of small scoped RunViews on open) ----\n\n private async init(): Promise<void> {\n this.state = this.blankState();\n this.views = [];\n this.lists = [];\n this.entityFields = [];\n this.scheduleOpen = false;\n\n const model = this.engine?.ModelByID(this.modelId);\n this.isClassification = model?.ProblemType === 'classification';\n const pipeline = model ? this.engine.Pipelines.find((p) => UUIDsEqual(p.ID, model.PipelineID)) : undefined;\n const entity = pipeline?.TargetEntityID\n ? this.ProviderToUse.Entities.find((e) => UUIDsEqual(e.ID, pipeline.TargetEntityID))\n : undefined;\n this.state.targetEntityName = entity?.Name ?? '';\n this.entityFields = (entity?.Fields ?? []).map((f) => f.Name).sort((a, b) => a.localeCompare(b));\n\n await Promise.all([this.loadViews(entity?.ID), this.loadLists(entity?.ID), this.resolveJobType()]);\n this.cdr.detectChanges();\n }\n\n private async loadViews(entityId: string | undefined): Promise<void> {\n if (!entityId) return;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJUserViewEntity>(\n { EntityName: 'MJ: User Views', ExtraFilter: `EntityID='${entityId}'`, OrderBy: 'Name', ResultType: 'entity_object' },\n this.ProviderToUse.CurrentUser,\n );\n this.views = r.Success ? (r.Results ?? []) : [];\n }\n\n private async loadLists(entityId: string | undefined): Promise<void> {\n if (!entityId) return;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJListEntity>(\n { EntityName: 'MJ: Lists', ExtraFilter: `EntityID='${entityId}'`, OrderBy: 'Name', ResultType: 'entity_object' },\n this.ProviderToUse.CurrentUser,\n );\n this.lists = r.Success ? (r.Results ?? []) : [];\n }\n\n /** Resolve the \"Run Record Process\" scheduled-job-type id the generic scheduler dialog needs. */\n private async resolveJobType(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJScheduledJobTypeEntity>(\n { EntityName: 'MJ: Scheduled Job Types', ExtraFilter: `Name='${RUN_RECORD_PROCESS_JOB_TYPE}'`, ResultType: 'entity_object' },\n this.ProviderToUse.CurrentUser,\n );\n this.jobTypeId = r.Success ? (r.Results?.[0]?.ID ?? null) : null;\n }\n\n public setScope(mode: OperateScopeMode): void {\n this.state.scopeMode = mode;\n }\n\n // ---- live summary ----\n\n public get summary(): string {\n const entity = this.state.targetEntityName || 'the entity';\n const scope =\n this.state.scopeMode === 'all'\n ? `every record in <strong>${entity}</strong>`\n : this.state.scopeMode === 'view'\n ? `the <strong>${this.viewName() ?? 'selected'}</strong> view of ${entity}`\n : `the <strong>${this.listName() ?? 'selected'}</strong> list of ${entity}`;\n const output =\n this.state.outputMode === 'writeback'\n ? this.state.outputField.trim()\n ? `writes the ${this.state.valueKind === 'class' ? 'predicted class' : 'probability'} into <strong>${this.state.outputField.trim()}</strong>`\n : `writes back to a column you choose`\n : `records predictions in the run history (no column written)`;\n return `Scores ${scope} with <strong>${this.modelLabel}</strong> and ${output}.`;\n }\n\n private viewName(): string | null {\n return this.views.find((v) => UUIDsEqual(v.ID, this.state.viewId ?? ''))?.Name ?? null;\n }\n private listName(): string | null {\n return this.lists.find((l) => UUIDsEqual(l.ID, this.state.listId ?? ''))?.Name ?? null;\n }\n\n // ---- actions ----\n\n /** Create the scoring Record Process, then run it once immediately. */\n public async onRunNow(): Promise<void> {\n const rpId = await this.createProcess('Creating + running…');\n if (!rpId) return;\n try {\n const run = new RecordProcessRunNowOperation();\n const result = await run.Execute({ recordProcessID: rpId }, { provider: this.provider ?? undefined, user: this.currentUser ?? undefined });\n if (result.Success && result.Output) {\n this.notifications.CreateSimpleNotification(\n `Scored ${result.Output.success}/${result.Output.processed} record(s) — ${result.Output.status}.`,\n result.Output.status === 'Completed' ? 'success' : 'warning',\n 5000,\n );\n await this.refreshAndClose();\n } else {\n this.notifications.CreateSimpleNotification(result.ErrorMessage || 'Run failed (the process was created and can be run again).', 'error', 6000);\n }\n } catch (e) {\n this.notifications.CreateSimpleNotification(`Run error: ${this.msg(e)}`, 'error', 6000);\n } finally {\n this.busy = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Create the scoring Record Process, then hand it to the generic scheduler dialog. */\n public async onSchedule(): Promise<void> {\n if (!this.jobTypeId) {\n this.notifications.CreateSimpleNotification('Scheduling is unavailable — the \"Run Record Process\" job type was not found.', 'error', 6000);\n return;\n }\n const rpId = await this.createProcess('Creating process…');\n if (!rpId) return;\n this.busy = false;\n this.schedConfig = JSON.stringify({ RecordProcessID: rpId });\n this.scheduleOpen = true;\n this.cdr.detectChanges();\n }\n\n public async onScheduleClose(result: ScheduledJobDialogResult): Promise<void> {\n this.scheduleOpen = false;\n if (result?.Saved) {\n this.notifications.CreateSimpleNotification(`Scheduled \"${this.modelLabel}\" to score on a recurring cadence.`, 'success', 5000);\n await this.refreshAndClose();\n } else {\n // The on-demand Record Process still exists (it can be run or scheduled later) — just close.\n this.notifications.CreateSimpleNotification('Scoring process created (not scheduled). You can run or schedule it anytime.', 'info', 4500);\n await this.refreshAndClose();\n }\n }\n\n public onCancel(): void {\n if (this.busy) return;\n this.Close.emit({ changed: false });\n }\n\n // ---- shared op plumbing ----\n\n /** Map knobs → input and create the scoring Record Process via the Remote Op. Returns its id, or null on failure. */\n private async createProcess(label: string): Promise<string | null> {\n const mapped = mapStateToCreateScoringInput(this.state);\n if (!mapped.ok) {\n this.notifications.CreateSimpleNotification(describeOperateMappingError(mapped.error), 'warning', 4000);\n return null;\n }\n this.busy = true;\n this.busyLabel = label;\n this.cdr.detectChanges();\n try {\n const op = new PredictiveStudioCreateScoringProcessOperation();\n const result = await op.Execute(mapped.input, { provider: this.provider ?? undefined, user: this.currentUser ?? undefined });\n if (result.Success && result.Output?.recordProcessId) {\n return result.Output.recordProcessId;\n }\n this.notifications.CreateSimpleNotification(result.ErrorMessage || 'Could not create the scoring process.', 'error', 6000);\n this.busy = false;\n return null;\n } catch (e) {\n this.notifications.CreateSimpleNotification(`Could not create the scoring process: ${this.msg(e)}`, 'error', 6000);\n this.busy = false;\n return null;\n }\n }\n\n private async refreshAndClose(): Promise<void> {\n await this.engine.Config(true, this.currentUser ?? undefined, this.provider ?? undefined);\n this.busy = false;\n this.Close.emit({ changed: true });\n }\n\n private msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n }\n\n private blankState(): OperateModelState {\n return {\n modelId: this.modelId,\n targetEntityName: '',\n scopeMode: 'all',\n viewId: null,\n listId: null,\n outputMode: 'generic',\n outputField: '',\n valueKind: 'score',\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ps-operate-dialog.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-operate-dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RunView } from '@memberjunction/core';\nimport type { IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJButtonDirective, MJDialogComponent } from '@memberjunction/ng-ui-components';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport {\n PredictiveStudioCreateScoringProcessOperation,\n RecordProcessRunNowOperation,\n MJUserViewEntity,\n MJListEntity,\n MJScheduledJobTypeEntity,\n} from '@memberjunction/core-entities';\nimport { SchedulingModule } from '@memberjunction/ng-scheduling';\nimport type { ScheduledJobDialogResult } from '@memberjunction/ng-scheduling';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport {\n OperateModelState,\n OperateScopeMode,\n OperateOutputMode,\n OperateValueKind,\n mapStateToCreateScoringInput,\n describeOperateMappingError,\n} from './ps-operate-dialog.mapping';\n\nconst RUN_RECORD_PROCESS_JOB_TYPE = 'Run Record Process';\n\n/**\n * **Operate this model** — the dialog that turns a published model into a running one. It composes\n * three primitives, no bespoke transport:\n * - **what** → the `PredictiveStudio.CreateScoringProcess` Remote Op (persists an on-demand\n * `WorkType='ML Model'` Record Process; write-back when an output column is chosen, generic otherwise);\n * - **now** → the generic `RecordProcess.RunNow` Remote Op on that process;\n * - **when** → the generic `@memberjunction/ng-scheduling` dialog (a \"Run Record Process\" scheduled job).\n *\n * The target entity is FIXED to the model's training entity (the model's features only assemble against\n * that entity), so the knobs are **scope** (everyone / a saved view / a list) and **output** (generic /\n * write-back column). Pure submit→input mapping lives in `ps-operate-dialog.mapping.ts` (unit-tested).\n */\n@Component({\n standalone: true,\n selector: 'ps-operate-dialog',\n imports: [CommonModule, MJButtonDirective, MJDialogComponent, SchedulingModule],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-operate-dialog.component.css'],\n template: `\n <mj-dialog [Visible]=\"Visible\" [Title]=\"'Operate · ' + modelLabel\" [Width]=\"640\" (Close)=\"onCancel()\">\n <div class=\"ps-operate\" data-testid=\"ps-operate-dialog\">\n <!-- target entity (fixed to the model's training entity) -->\n <div class=\"ps-callout info op-target\">\n <i class=\"fa-solid fa-table\"></i>\n <div class=\"ps-small\">\n Scores <strong>{{ state.targetEntityName || '—' }}</strong> — the entity this model was trained on.\n </div>\n </div>\n\n <!-- SCOPE -->\n <div class=\"ps-field\">\n <label>Which records?</label>\n <div class=\"ps-seg\" data-testid=\"ps-operate-scope\">\n <button [class.on]=\"state.scopeMode === 'all'\" (click)=\"setScope('all')\"><i class=\"fa-solid fa-globe\"></i> Everyone</button>\n <button [class.on]=\"state.scopeMode === 'view'\" (click)=\"setScope('view')\"><i class=\"fa-solid fa-table-list\"></i> A saved view</button>\n <button [class.on]=\"state.scopeMode === 'list'\" (click)=\"setScope('list')\"><i class=\"fa-solid fa-list-check\"></i> A list</button>\n </div>\n @if (state.scopeMode === 'view') {\n <select class=\"mj-input\" data-testid=\"ps-operate-view\" [value]=\"state.viewId || ''\" (change)=\"state.viewId = $any($event.target).value\">\n <option value=\"\" disabled>Choose a view…</option>\n @for (v of views; track v.ID) { <option [value]=\"v.ID\">{{ v.Name }}</option> }\n </select>\n @if (views.length === 0) { <div class=\"ps-small ps-muted op-hint\">No saved views for {{ state.targetEntityName }} yet — pick Everyone or a list.</div> }\n }\n @if (state.scopeMode === 'list') {\n <select class=\"mj-input\" data-testid=\"ps-operate-list\" [value]=\"state.listId || ''\" (change)=\"state.listId = $any($event.target).value\">\n <option value=\"\" disabled>Choose a list…</option>\n @for (l of lists; track l.ID) { <option [value]=\"l.ID\">{{ l.Name }}</option> }\n </select>\n @if (lists.length === 0) { <div class=\"ps-small ps-muted op-hint\">No lists for {{ state.targetEntityName }} yet — pick Everyone or a view.</div> }\n }\n </div>\n\n <!-- OUTPUT -->\n <div class=\"ps-field\">\n <label>Where do predictions go?</label>\n <div class=\"ps-seg\" data-testid=\"ps-operate-output\">\n <button [class.on]=\"state.outputMode === 'generic'\" (click)=\"state.outputMode = 'generic'\"><i class=\"fa-solid fa-clock-rotate-left\"></i> Run history only</button>\n <button [class.on]=\"state.outputMode === 'writeback'\" (click)=\"state.outputMode = 'writeback'\"><i class=\"fa-solid fa-pen-to-square\"></i> Write back to a column</button>\n </div>\n @if (state.outputMode === 'writeback') {\n <input class=\"mj-input\" type=\"text\" list=\"ps-operate-fields\" data-testid=\"ps-operate-column\"\n placeholder=\"Column on {{ state.targetEntityName }} (e.g. RenewalProbability)\"\n [value]=\"state.outputField\" (input)=\"state.outputField = $any($event.target).value\" />\n <datalist id=\"ps-operate-fields\">@for (f of entityFields; track f) { <option [value]=\"f\"></option> }</datalist>\n @if (isClassification) {\n <div class=\"ps-seg sm\" style=\"margin-top:8px\">\n <button [class.on]=\"state.valueKind === 'score'\" (click)=\"state.valueKind = 'score'\">Probability</button>\n <button [class.on]=\"state.valueKind === 'class'\" (click)=\"state.valueKind = 'class'\">Predicted class</button>\n </div>\n }\n }\n </div>\n\n <!-- live summary -->\n <div class=\"ps-callout op-summary\" data-testid=\"ps-operate-summary\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <div class=\"ps-small\" [innerHTML]=\"summary\"></div>\n </div>\n </div>\n\n <!-- footer (affirmative on the left, MJ convention) -->\n <div class=\"op-footer\">\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-operate-run\" [disabled]=\"busy\" (click)=\"onRunNow()\">\n <i class=\"fa-solid fa-play\"></i> Run now\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-operate-schedule\" [disabled]=\"busy\" (click)=\"onSchedule()\">\n <i class=\"fa-solid fa-clock\"></i> Schedule…\n </button>\n <span class=\"ps-spacer\"></span>\n @if (busy) { <span class=\"ps-small ps-muted\"><i class=\"fa-solid fa-spinner fa-spin\"></i> {{ busyLabel }}</span> }\n <button mjButton variant=\"flat\" size=\"sm\" [disabled]=\"busy\" (click)=\"onCancel()\">Cancel</button>\n </div>\n </mj-dialog>\n\n <!-- WHEN: the generic scheduling dialog, opened after the Record Process is created -->\n <mj-scheduled-job-dialog\n [Visible]=\"scheduleOpen\"\n [JobTypeID]=\"jobTypeId\"\n [DefaultConfiguration]=\"schedConfig\"\n [HideJobType]=\"true\"\n (Close)=\"onScheduleClose($event)\">\n </mj-scheduled-job-dialog>\n `,\n})\nexport class PSOperateDialogComponent extends BaseAngularComponent {\n @Input() modelId = '';\n @Input() modelLabel = '';\n @Input() engine!: PredictiveStudioEngine;\n @Input() provider: IMetadataProvider | null = null;\n @Input() currentUser: UserInfo | null = null;\n\n /** Opening the dialog (false → true) initializes the knobs + loads views/lists/fields for the model's entity. */\n @Input()\n set Visible(value: boolean) {\n const opening = value && !this._visible;\n this._visible = value;\n if (opening) {\n void this.init();\n }\n }\n get Visible(): boolean {\n return this._visible;\n }\n private _visible = false;\n\n @Output() Close = new EventEmitter<{ changed: boolean }>();\n\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n\n public state: OperateModelState = this.blankState();\n public views: MJUserViewEntity[] = [];\n public lists: MJListEntity[] = [];\n public entityFields: string[] = [];\n public isClassification = false;\n public busy = false;\n public busyLabel = '';\n\n // scheduling sub-dialog\n public scheduleOpen = false;\n public jobTypeId: string | null = null;\n public schedConfig: string | null = null;\n\n // ---- init / load (DB-light: a couple of small scoped RunViews on open) ----\n\n private async init(): Promise<void> {\n this.state = this.blankState();\n this.views = [];\n this.lists = [];\n this.entityFields = [];\n this.scheduleOpen = false;\n\n const model = this.engine?.ModelByID(this.modelId);\n this.isClassification = model?.ProblemType === 'classification';\n const pipeline = model ? this.engine.Pipelines.find((p) => UUIDsEqual(p.ID, model.PipelineID)) : undefined;\n const entity = pipeline?.TargetEntityID\n ? this.ProviderToUse.Entities.find((e) => UUIDsEqual(e.ID, pipeline.TargetEntityID))\n : undefined;\n this.state.targetEntityName = entity?.Name ?? '';\n this.entityFields = (entity?.Fields ?? []).map((f) => f.Name).sort((a, b) => a.localeCompare(b));\n\n await Promise.all([this.loadViews(entity?.ID), this.loadLists(entity?.ID), this.resolveJobType()]);\n this.cdr.detectChanges();\n }\n\n private async loadViews(entityId: string | undefined): Promise<void> {\n if (!entityId) return;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJUserViewEntity>(\n { EntityName: 'MJ: User Views', ExtraFilter: `EntityID='${entityId}'`, OrderBy: 'Name', ResultType: 'entity_object' },\n this.ProviderToUse.CurrentUser,\n );\n this.views = r.Success ? (r.Results ?? []) : [];\n }\n\n private async loadLists(entityId: string | undefined): Promise<void> {\n if (!entityId) return;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJListEntity>(\n { EntityName: 'MJ: Lists', ExtraFilter: `EntityID='${entityId}'`, OrderBy: 'Name', ResultType: 'entity_object' },\n this.ProviderToUse.CurrentUser,\n );\n this.lists = r.Success ? (r.Results ?? []) : [];\n }\n\n /** Resolve the \"Run Record Process\" scheduled-job-type id the generic scheduler dialog needs. */\n private async resolveJobType(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJScheduledJobTypeEntity>(\n { EntityName: 'MJ: Scheduled Job Types', ExtraFilter: `Name='${RUN_RECORD_PROCESS_JOB_TYPE}'`, ResultType: 'entity_object' },\n this.ProviderToUse.CurrentUser,\n );\n this.jobTypeId = r.Success ? (r.Results?.[0]?.ID ?? null) : null;\n }\n\n public setScope(mode: OperateScopeMode): void {\n this.state.scopeMode = mode;\n }\n\n // ---- live summary ----\n\n public get summary(): string {\n const entity = this.state.targetEntityName || 'the entity';\n const scope =\n this.state.scopeMode === 'all'\n ? `every record in <strong>${entity}</strong>`\n : this.state.scopeMode === 'view'\n ? `the <strong>${this.viewName() ?? 'selected'}</strong> view of ${entity}`\n : `the <strong>${this.listName() ?? 'selected'}</strong> list of ${entity}`;\n const output =\n this.state.outputMode === 'writeback'\n ? this.state.outputField.trim()\n ? `writes the ${this.state.valueKind === 'class' ? 'predicted class' : 'probability'} into <strong>${this.state.outputField.trim()}</strong>`\n : `writes back to a column you choose`\n : `records predictions in the run history (no column written)`;\n return `Scores ${scope} with <strong>${this.modelLabel}</strong> and ${output}.`;\n }\n\n private viewName(): string | null {\n return this.views.find((v) => UUIDsEqual(v.ID, this.state.viewId ?? ''))?.Name ?? null;\n }\n private listName(): string | null {\n return this.lists.find((l) => UUIDsEqual(l.ID, this.state.listId ?? ''))?.Name ?? null;\n }\n\n // ---- actions ----\n\n /** Create the scoring Record Process, then run it once immediately. */\n public async onRunNow(): Promise<void> {\n const rpId = await this.createProcess('Creating + running…');\n if (!rpId) return;\n try {\n const run = new RecordProcessRunNowOperation();\n const result = await run.Execute({ recordProcessID: rpId }, { provider: this.provider ?? undefined, user: this.currentUser ?? undefined });\n if (result.Success && result.Output) {\n this.notifications.CreateSimpleNotification(\n `Scored ${result.Output.success}/${result.Output.processed} record(s) — ${result.Output.status}.`,\n result.Output.status === 'Completed' ? 'success' : 'warning',\n 5000,\n );\n await this.refreshAndClose();\n } else {\n this.notifications.CreateSimpleNotification(result.ErrorMessage || 'Run failed (the process was created and can be run again).', 'error', 6000);\n }\n } catch (e) {\n this.notifications.CreateSimpleNotification(`Run error: ${this.msg(e)}`, 'error', 6000);\n } finally {\n this.busy = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Create the scoring Record Process, then hand it to the generic scheduler dialog. */\n public async onSchedule(): Promise<void> {\n if (!this.jobTypeId) {\n this.notifications.CreateSimpleNotification('Scheduling is unavailable — the \"Run Record Process\" job type was not found.', 'error', 6000);\n return;\n }\n const rpId = await this.createProcess('Creating process…');\n if (!rpId) return;\n this.busy = false;\n this.schedConfig = JSON.stringify({ RecordProcessID: rpId });\n this.scheduleOpen = true;\n this.cdr.detectChanges();\n }\n\n public async onScheduleClose(result: ScheduledJobDialogResult): Promise<void> {\n this.scheduleOpen = false;\n if (result?.Saved) {\n this.notifications.CreateSimpleNotification(`Scheduled \"${this.modelLabel}\" to score on a recurring cadence.`, 'success', 5000);\n await this.refreshAndClose();\n } else {\n // The on-demand Record Process still exists (it can be run or scheduled later) — just close.\n this.notifications.CreateSimpleNotification('Scoring process created (not scheduled). You can run or schedule it anytime.', 'info', 4500);\n await this.refreshAndClose();\n }\n }\n\n public onCancel(): void {\n if (this.busy) return;\n this.Close.emit({ changed: false });\n }\n\n // ---- shared op plumbing ----\n\n /** Map knobs → input and create the scoring Record Process via the Remote Op. Returns its id, or null on failure. */\n private async createProcess(label: string): Promise<string | null> {\n const mapped = mapStateToCreateScoringInput(this.state);\n if (!mapped.ok) {\n this.notifications.CreateSimpleNotification(describeOperateMappingError(mapped.error), 'warning', 4000);\n return null;\n }\n this.busy = true;\n this.busyLabel = label;\n this.cdr.detectChanges();\n try {\n const op = new PredictiveStudioCreateScoringProcessOperation();\n const result = await op.Execute(mapped.input, { provider: this.provider ?? undefined, user: this.currentUser ?? undefined });\n if (result.Success && result.Output?.recordProcessId) {\n return result.Output.recordProcessId;\n }\n this.notifications.CreateSimpleNotification(result.ErrorMessage || 'Could not create the scoring process.', 'error', 6000);\n this.busy = false;\n return null;\n } catch (e) {\n this.notifications.CreateSimpleNotification(`Could not create the scoring process: ${this.msg(e)}`, 'error', 6000);\n this.busy = false;\n return null;\n }\n }\n\n private async refreshAndClose(): Promise<void> {\n await this.engine.Config(true, this.currentUser ?? undefined, this.provider ?? undefined);\n this.busy = false;\n this.Close.emit({ changed: true });\n }\n\n private msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n }\n\n private blankState(): OperateModelState {\n return {\n modelId: this.modelId,\n targetEntityName: '',\n scopeMode: 'all',\n viewId: null,\n listId: null,\n outputMode: 'generic',\n outputField: '',\n valueKind: 'score',\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps-pipelines.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-pipelines.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,YAAY,EAAS,MAAM,EAAqC,MAAM,eAAe,CAAC;AAK7H,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAuC,MAAM,+BAA+B,CAAC;AAChH,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACZ,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;;AAE5E,KAAK,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEtE,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAsCD;;;;;;;;;GASG;AACH,
|
|
1
|
+
{"version":3,"file":"ps-pipelines.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-pipelines.component.ts"],"names":[],"mappings":"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"}
|