@memberjunction/ng-dashboards 6.1.2 → 6.2.0-edge.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/AI/components/vectors/vector-management-resource.component.d.ts +6 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +99 -45
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +4 -0
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +16 -6
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +4 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +14 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +2 -2
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
- package/dist/DevTools/graphql-console.component.js +2 -0
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +4 -12
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +39 -78
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +3 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +7 -6
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +3 -0
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +7 -6
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/at-risk.view-models.d.ts +41 -3
- package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +1 -1
- package/dist/PredictiveStudio/at-risk.view-models.js +99 -6
- package/dist/PredictiveStudio/at-risk.view-models.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-catalog.component.d.ts +4 -1
- package/dist/PredictiveStudio/components/ps-catalog.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-catalog.component.js +61 -37
- package/dist/PredictiveStudio/components/ps-catalog.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +12 -0
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +426 -184
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +84 -0
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +1397 -0
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +66 -34
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.js +2456 -743
- package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +194 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +1902 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-production.component.d.ts +17 -1
- package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-production.component.js +653 -372
- package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-registry.component.d.ts +21 -61
- package/dist/PredictiveStudio/components/ps-registry.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-registry.component.js +214 -681
- package/dist/PredictiveStudio/components/ps-registry.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +49 -0
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +658 -0
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +1 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +42 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js +90 -0
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -0
- package/dist/PredictiveStudio/predictive-studio.view-models.d.ts +14 -2
- package/dist/PredictiveStudio/predictive-studio.view-models.d.ts.map +1 -1
- package/dist/PredictiveStudio/predictive-studio.view-models.js +41 -5
- package/dist/PredictiveStudio/predictive-studio.view-models.js.map +1 -1
- 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 +178 -65
- package/dist/PredictiveStudio/resources/ps-models-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +9 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +307 -369
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-resource-base.js +1 -1
- package/dist/PredictiveStudio/resources/ps-resource-base.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts +17 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +309 -138
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +1 -0
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +6 -5
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/predictive-studio-dashboards.module.d.ts +10 -8
- package/dist/predictive-studio-dashboards.module.d.ts.map +1 -1
- package/dist/predictive-studio-dashboards.module.js +13 -3
- package/dist/predictive-studio-dashboards.module.js.map +1 -1
- package/package.json +64 -63
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ps-predictions-grid.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-predictions-grid.component.ts","../../../src/PredictiveStudio/components/ps-predictions-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport {\n MJButtonDirective,\n MJViewToggleComponent,\n MjSlidePanelComponent,\n} from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { CompositeKey, LogError, RunView, EntityRecordNameInput, EntityRecordNameResult } from '@memberjunction/core';\nimport { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';\nimport { MJProcessRunDetailEntity, MJMLModelEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { AgGridModule } from 'ag-grid-angular';\nimport {\n AllCommunityModule,\n CellClickedEvent,\n ColDef,\n GetRowIdParams,\n GridApi,\n GridOptions,\n GridReadyEvent,\n ICellRendererParams,\n IRowNode,\n ModuleRegistry,\n RowClickedEvent,\n Theme,\n themeAlpine,\n} from 'ag-grid-community';\n\nimport {\n parseAtRiskRows,\n resolveRenewalPolarity,\n type RenewalPolarityResult,\n type RowDriver,\n} from '../at-risk.view-models';\nimport {\n type OutcomeConfig,\n type OutcomeBand,\n resolveOutcomeConfig,\n resolveScoreBand,\n resolveOutcomeStyle,\n formatPredictionScore,\n} from '@memberjunction/predictive-studio-core';\nimport {\n PredictiveStudioScoreHistoryService,\n type ModelScoreHistoryPoint,\n} from '../predictive-studio-score-history.service';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\n\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/** One displayed prediction row in the unified grid. */\nexport interface PredictionGridRow {\n recordId: string;\n recordName: string;\n score: number;\n scoreFormatted: string;\n riskPct: number;\n band: string;\n badgeColor?: string;\n icon?: string;\n class: string | null;\n drivers: RowDriver[];\n status: string;\n scoredAtDate: Date | null;\n}\n\n/** Summary of one dynamic outcome band for toolbar filtering and KPI cards. */\nexport interface VisibleBandSummary {\n key: string;\n label: string;\n count: number;\n pct: number;\n avgScore: number;\n avgScoreFormatted: string;\n badgeColor: string;\n icon?: string;\n description?: string;\n}\n\ninterface HistogramBin {\n idx: number;\n label: string;\n shortLabel: string;\n count: number;\n pct: number;\n pctFormatted: string;\n height: number;\n color: string;\n riskLabel: string;\n}\n\ninterface ClassShare {\n name: string;\n count: number;\n pct: number;\n color: string;\n}\n\ninterface TrendlinePlotPoint {\n runId: string;\n x: number;\n y: number;\n scoreFormatted: string;\n dateStr: string;\n class: string | null;\n color: string;\n}\n\n/**\n * **PSPredictionsGridComponent** — Unified enterprise grid and analytics component for\n * model predictions. Shared between:\n * 1. **Predictions tab** (`PSPredictionsResourceComponent`) — business view of all at-risk records.\n * 2. **Models tab** (`PSProductionComponent`) — analyst run drill-in view.\n *\n * Supports:\n * - Virtualized AG Grid scrolling for thousands of rows (no artificial 50/200 cap).\n * - Automatic target entity record display name resolution (e.g. member/customer names).\n * - Direct drill-through to the entity record in MemberJunction Explorer.\n * - Slide-in detail drawer (`mj-slide-panel`) with local explainability and historical trendlines across runs.\n * - Segmented view toggle (`mj-view-toggle`) between Grid View and Chart View (10-decile histogram + risk tiers).\n */\n@Component({\n standalone: true,\n selector: 'ps-predictions-grid',\n templateUrl: './ps-predictions-grid.component.html',\n styleUrls: ['../predictive-studio.shared.css', './ps-predictions-grid.component.css'],\n imports: [\n CommonModule,\n FormsModule,\n SharedGenericModule,\n MJButtonDirective,\n MJViewToggleComponent,\n MjSlidePanelComponent,\n AgGridModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PSPredictionsGridComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy {\n @Input() modelId: string | null = null;\n @Input() runId: string | null = null;\n @Input() entityName: string | null = null;\n @Input() problemType: string | null = 'classification';\n @Input() title: string | null = null;\n @Input() height = '560px';\n @Input() readOnly = false;\n\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly navigationService = inject(NavigationService);\n private readonly scoreHistoryService = inject(PredictiveStudioScoreHistoryService);\n\n public readonly Math = Math;\n\n public isLoading = false;\n public loadError: string | null = null;\n\n public allRows: PredictionGridRow[] = [];\n public filteredRows: PredictionGridRow[] = [];\n\n public searchText = '';\n public selectedTier: string = 'all';\n public outcomeConfig: OutcomeConfig = resolveOutcomeConfig();\n public visibleBands: VisibleBandSummary[] = [];\n\n public activeView: 'grid' | 'chart' = 'grid';\n public readonly viewOptions = [\n { key: 'grid', icon: 'fa-solid fa-table', title: 'Grid View' },\n { key: 'chart', icon: 'fa-solid fa-chart-column', title: 'Chart View' },\n ];\n\n // Slide-in detail state\n public detailOpen = false;\n public drawerWidthPx = 640;\n public selectedRow: PredictionGridRow | null = null;\n public historyLoading = false;\n public historyPoints: ModelScoreHistoryPoint[] = [];\n\n public resolvedEntityId: string | null = null;\n public resolvedEntityName: string | null = null;\n\n public subjectEntityName: string | null = null;\n public subjectRecordId: string | null = null;\n public subjectRecordName: string | null = null;\n\n private gridApi: GridApi<PredictionGridRow> | null = null;\n private chartGridApi: GridApi<PredictionGridRow> | null = null;\n\n // Viewport-visible record name lookup cache and state\n private recordNameCache = new Map<string, string>();\n private inFlightLookups = new Set<string>();\n private visibleLookupDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n // ── AG Grid Configuration ──\n public Theme: Theme = themeAlpine.withParams({\n backgroundColor: 'var(--mj-bg-surface)',\n foregroundColor: 'var(--mj-text-primary)',\n textColor: 'var(--mj-text-primary)',\n borderColor: 'var(--mj-border-default)',\n chromeBackgroundColor: 'var(--mj-bg-surface-card)',\n headerBackgroundColor: 'var(--mj-bg-surface-card)',\n headerTextColor: 'var(--mj-text-secondary)',\n cellTextColor: 'var(--mj-text-primary)',\n subtleTextColor: 'var(--mj-text-muted)',\n dataBackgroundColor: 'var(--mj-bg-surface)',\n oddRowBackgroundColor: 'var(--mj-bg-surface-card)',\n rowHoverColor: 'var(--mj-bg-surface-hover, color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface)))',\n selectedRowBackgroundColor: 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))',\n accentColor: 'var(--mj-brand-primary)',\n borderRadius: 'var(--mj-radius-sm)',\n browserColorScheme: 'inherit',\n });\n\n public GridOptions: GridOptions<PredictionGridRow> = {\n animateRows: true,\n rowHeight: 46,\n headerHeight: 40,\n suppressCellFocus: true,\n enableCellTextSelection: true,\n suppressNoRowsOverlay: true,\n rowSelection: { mode: 'singleRow', enableClickSelection: false },\n getRowId: (params: GetRowIdParams<PredictionGridRow>) => params.data.recordId,\n onBodyScrollEnd: () => this.scheduleVisibleRowsLookup(),\n onViewportChanged: () => this.scheduleVisibleRowsLookup(),\n onFirstDataRendered: () => this.scheduleVisibleRowsLookup(),\n onModelUpdated: () => this.scheduleVisibleRowsLookup(),\n onCellClicked: (event: CellClickedEvent<PredictionGridRow>) => this.onCellClicked(event),\n };\n\n public chartGridOptions: GridOptions<PredictionGridRow> = {\n animateRows: true,\n rowHeight: 46,\n headerHeight: 40,\n suppressCellFocus: true,\n enableCellTextSelection: true,\n suppressNoRowsOverlay: true,\n rowSelection: { mode: 'singleRow', enableClickSelection: false },\n getRowId: (params: GetRowIdParams<PredictionGridRow>) => params.data.recordId,\n onBodyScrollEnd: () => this.scheduleVisibleRowsLookup(),\n onViewportChanged: () => this.scheduleVisibleRowsLookup(),\n onFirstDataRendered: () => this.scheduleVisibleRowsLookup(),\n onModelUpdated: () => this.scheduleVisibleRowsLookup(),\n onCellClicked: (event: CellClickedEvent<PredictionGridRow>) => this.onCellClicked(event),\n };\n\n public defaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n minWidth: 80,\n };\n\n public isRenewalModel = false;\n public selectedDecileIndex: number | null = null;\n\n public get isRegression(): boolean {\n return (\n (this.problemType ?? '').toLowerCase() === 'regression' ||\n this.outcomeConfig?.Format === 'currency' ||\n this.outcomeConfig?.Format === 'number'\n );\n }\n\n public columnDefs: ColDef<PredictionGridRow>[] = [];\n\n public setupColumnDefs(): void {\n const scoreLabel = this.outcomeConfig.ScoreLabel || 'Prediction Score';\n const statusLabel = this.outcomeConfig.StatusLabel || 'Risk Level';\n\n this.columnDefs = [\n {\n field: 'recordName',\n headerName: 'Record',\n flex: 2,\n minWidth: 220,\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string => {\n if (!params.data) return '';\n const hasCustomName = Boolean(params.data.recordName && params.data.recordName !== params.data.recordId);\n const name = this.escapeHtml(params.data.recordName || params.data.recordId);\n const id = this.escapeHtml(params.data.recordId);\n return `\n <div class=\"pg-record-cell\">\n <div class=\"pg-record-title-row\">\n <a class=\"pg-record-link\" data-action=\"open-record\" href=\"javascript:void(0)\" title=\"Open record in Explorer\">\n <span class=\"pg-record-name\">${name}</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square pg-record-open-icon\"></i>\n </a>\n </div>\n ${hasCustomName ? `<span class=\"pg-record-id ps-mono\" title=\"${id}\">${id}</span>` : ''}\n </div>\n `;\n },\n },\n {\n field: 'score',\n headerName: scoreLabel,\n width: 175,\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string => {\n if (!params.data) return '';\n const badgeColor = params.data.badgeColor || 'gray';\n const colorClass = `badge-${badgeColor}`;\n const formatted = this.escapeHtml(params.data.scoreFormatted);\n\n if (this.isRegression) {\n return `\n <div class=\"pg-score-cell\">\n <span class=\"pg-score-val ${colorClass}\" style=\"font-weight: 600; font-size: 13.5px;\">${formatted}</span>\n </div>\n `;\n }\n\n const pct = Math.min(100, Math.max(0, Math.round(params.data.score * 100)));\n return `\n <div class=\"pg-score-cell\">\n <span class=\"pg-score-val ${colorClass}\">${formatted}</span>\n <div class=\"pg-score-bar\">\n <div class=\"pg-score-fill ${colorClass}\" style=\"width: ${pct}%\"></div>\n </div>\n </div>\n `;\n },\n },\n {\n field: 'riskPct',\n headerName: statusLabel,\n width: 155,\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string => {\n if (!params.data) return '';\n const badgeColor = params.data.badgeColor || 'gray';\n const icon = params.data.icon ? `<i class=\"fa-solid ${this.escapeHtml(params.data.icon)}\"></i> ` : '';\n const label = this.escapeHtml(params.data.status || params.data.band);\n if (this.isRegression) {\n return `<span class=\"ps-badge ${badgeColor}\" title=\"${scoreLabel}: ${this.escapeHtml(params.data.scoreFormatted)}\">${icon}${label}</span>`;\n }\n const pct = Math.round(params.data.score * 100);\n return `<span class=\"ps-badge ${badgeColor}\" title=\"${pct}% ${scoreLabel}\">${icon}${label} (${pct}%)</span>`;\n },\n },\n {\n field: 'class',\n headerName: 'Predicted Outcome',\n width: 135,\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string => {\n if (!params.data || !params.data.class) return '<span class=\"ps-muted\">—</span>';\n const cls = this.escapeHtml(params.data.class);\n const style = resolveOutcomeStyle(params.data.class, this.outcomeConfig);\n const icon = style.Icon ? `<i class=\"fa-solid ${style.Icon}\"></i> ` : '';\n return `<span class=\"ps-badge ${style.BadgeColor}\">${icon}${cls}</span>`;\n },\n },\n {\n field: 'drivers',\n headerName: 'Key Factors',\n flex: 2,\n minWidth: 220,\n sortable: false,\n cellDataType: false,\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string => {\n if (!params.data || !params.data.drivers || params.data.drivers.length === 0) {\n return '<span class=\"ps-muted\">—</span>';\n }\n const chips = params.data.drivers.slice(0, 2).map((d) => {\n const cls = d.up ? 'up' : 'down';\n const icon = d.up ? 'fa-arrow-up' : 'fa-arrow-down';\n const label = this.escapeHtml(d.label);\n return `<span class=\"ps-why-chip ${cls}\" title=\"${label}\"><i class=\"fa-solid ${icon}\"></i> ${label}</span>`;\n }).join('');\n return `<div class=\"pg-drivers-cell\">${chips}</div>`;\n },\n },\n {\n field: 'scoredAtDate',\n headerName: 'Scored At',\n width: 145,\n comparator: (_a: Date | null, _b: Date | null, nodeA, nodeB): number =>\n (nodeA.data?.scoredAtDate?.getTime() ?? 0) - (nodeB.data?.scoredAtDate?.getTime() ?? 0),\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string => {\n if (!params.data || !params.data.scoredAtDate) return '<span class=\"ps-muted\">—</span>';\n const d = params.data.scoredAtDate;\n return `<span class=\"ps-small ps-muted\">${d.toLocaleDateString()} ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>`;\n },\n },\n {\n headerName: '',\n width: 50,\n sortable: false,\n resizable: false,\n cellRenderer: (): string => {\n return `<button class=\"pg-action-btn\" title=\"View details & score history\"><i class=\"fa-solid fa-chevron-right\"></i></button>`;\n },\n },\n ];\n\n if (this.gridApi) {\n this.gridApi.setGridOption('columnDefs', this.columnDefs);\n }\n if (this.chartGridApi) {\n this.chartGridApi.setGridOption('columnDefs', this.columnDefs);\n }\n }\n\n ngOnInit(): void {\n const pref = UserInfoEngine.Instance.GetSetting('mj.predictiveStudio.predictions.drawerWidth');\n if (pref) {\n const w = parseInt(pref, 10);\n if (!isNaN(w) && w >= 360 && w <= 1400) {\n this.drawerWidthPx = w;\n }\n }\n this.setupColumnDefs();\n void this.loadPredictions();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n (changes['modelId'] && !changes['modelId'].firstChange) ||\n (changes['runId'] && !changes['runId'].firstChange) ||\n (changes['entityName'] && !changes['entityName'].firstChange)\n ) {\n void this.loadPredictions();\n }\n }\n\n ngOnDestroy(): void {\n if (this.visibleLookupDebounceTimer) {\n clearTimeout(this.visibleLookupDebounceTimer);\n this.visibleLookupDebounceTimer = null;\n }\n this.recordNameCache.clear();\n this.inFlightLookups.clear();\n this.gridApi = null;\n this.chartGridApi = null;\n }\n\n // ── Data Loading & Name Resolution ──\n\n public async reload(): Promise<void> {\n await this.loadPredictions();\n }\n\n private async loadPredictions(): Promise<void> {\n if (!this.modelId && !this.runId) {\n this.allRows = [];\n this.applyFilter();\n return;\n }\n\n this.isLoading = true;\n this.loadError = null;\n this.cdr.markForCheck();\n\n try {\n const provider = this.ProviderToUse;\n const user = provider.CurrentUser ?? undefined;\n\n // 1. Resolve effective run ID and model entity\n let effectiveRunId = this.runId;\n let model: MJMLModelEntity | null = null;\n\n if (this.modelId) {\n const modelsRes = await RunView.FromMetadataProvider(provider).RunView<MJMLModelEntity>(\n {\n EntityName: 'MJ: ML Models',\n ExtraFilter: `ID = '${this.modelId.replace(/'/g, \"''\")}'`,\n MaxRows: 1,\n ResultType: 'entity_object',\n },\n user,\n );\n model = modelsRes.Success && modelsRes.Results ? modelsRes.Results[0] : null;\n }\n\n if (!effectiveRunId && this.modelId) {\n // Query latest process run for this model using engine\n try {\n const engine = PredictiveStudioEngine.Instance;\n const runs = await engine.LoadRecentRunsForModel(this.modelId, provider, user, { maxRows: 1 });\n if (runs && runs.length > 0) {\n effectiveRunId = runs[0].ID;\n }\n } catch {\n // Fallback if engine is not yet primed\n }\n }\n\n if (!effectiveRunId) {\n this.allRows = [];\n this.applyFilter();\n this.isLoading = false;\n this.cdr.markForCheck();\n return;\n }\n\n // 2. Resolve target entity\n await this.resolveTargetEntity(model);\n\n // 3. Load full process run details (removing 50/200 cap)\n const detailsRes = await RunView.FromMetadataProvider(provider).RunView<MJProcessRunDetailEntity>(\n {\n EntityName: 'MJ: Process Run Details',\n ExtraFilter: `ProcessRunID = '${effectiveRunId.replace(/'/g, \"''\")}'`,\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 10000,\n ResultType: 'entity_object',\n },\n user,\n );\n\n if (!detailsRes.Success || !detailsRes.Results) {\n this.allRows = [];\n this.applyFilter();\n this.isLoading = false;\n this.cdr.markForCheck();\n return;\n }\n\n // 4. Resolve OutcomeConfig and determine polarity\n if (model?.ProblemType) {\n this.problemType = model.ProblemType.toLowerCase();\n }\n this.outcomeConfig = resolveOutcomeConfig(model ?? undefined);\n this.isRenewalModel = this.outcomeConfig.Polarity === 'positive' && !this.isRegression;\n this.setupColumnDefs();\n\n const polarity = resolveRenewalPolarity(\n detailsRes.Results.map((d) => d.ResultPayload),\n model?.TargetVariable,\n );\n\n // When the model outputs P(Renewed) (scoreIsLapseRisk = false), adverse risk is inverted (1 - score).\n // When the model outputs P(Lapse) (scoreIsLapseRisk = true), adverse risk is ALREADY score (invertedRisk = false).\n const shouldInvertRisk = polarity.isRenewalModel ? !polarity.scoreIsLapseRisk : false;\n\n const parsedAtRisk = parseAtRiskRows(\n detailsRes.Results.map((d) => ({ recordId: d.RecordID, ResultPayload: d.ResultPayload })),\n { invertedRisk: shouldInvertRisk, outcomeConfig: this.outcomeConfig },\n );\n\n // Map details into indexed lookup for scoredAt timestamp\n const detailByRecord = new Map<string, MJProcessRunDetailEntity>();\n for (const d of detailsRes.Results) {\n detailByRecord.set(NormalizeUUID(d.RecordID), d);\n }\n\n this.allRows = parsedAtRisk.map((r) => {\n const detail = detailByRecord.get(NormalizeUUID(r.recordId));\n const dt = detail?.CompletedAt ?? detail?.__mj_CreatedAt ?? null;\n // For renewal models, the primary displayed score is Renewal Probability (0–1).\n // If the raw score was lapse risk, renewal probability is 1 - r.score.\n // Otherwise, raw score is already renewal probability.\n const displayScore = polarity.isRenewalModel\n ? (polarity.scoreIsLapseRisk ? Math.max(0, Math.min(1, 1 - r.score)) : r.score)\n : r.score;\n\n const resolved = this.outcomeConfig\n ? resolveScoreBand(displayScore, this.outcomeConfig)\n : null;\n\n const formatted = formatPredictionScore(displayScore, this.outcomeConfig, this.problemType);\n\n return {\n recordId: r.recordId,\n recordName: r.label ?? r.recordId,\n score: displayScore,\n scoreFormatted: formatted,\n riskPct: r.riskPct,\n band: resolved?.Key ?? r.band,\n badgeColor: resolved?.BadgeColor ?? r.badgeColor,\n icon: resolved?.Icon ?? r.icon,\n class: r.class,\n drivers: r.drivers ?? [],\n status: resolved?.Label ?? r.status ?? detail?.Status ?? 'Succeeded',\n scoredAtDate: dt instanceof Date ? dt : dt ? new Date(dt) : null,\n };\n });\n\n this.computeVisibleBands();\n this.applyFilter();\n\n // 5. Schedule lazy lookup of record names for visible rows\n this.scheduleVisibleRowsLookup(0);\n } catch (err) {\n this.loadError = err instanceof Error ? err.message : String(err);\n LogError(`PSPredictionsGridComponent.loadPredictions: ${this.loadError}`);\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private async resolveTargetEntity(model: MJMLModelEntity | null): Promise<void> {\n const provider = this.ProviderToUse;\n if (this.entityName) {\n const e = provider.EntityByName(this.entityName);\n if (e) {\n this.resolvedEntityId = e.ID;\n this.resolvedEntityName = e.Name;\n return;\n }\n }\n\n if (model?.PipelineID) {\n const pRes = await RunView.FromMetadataProvider(provider).RunView<Record<string, unknown>>(\n {\n EntityName: 'MJ: ML Training Pipelines',\n ExtraFilter: `ID = '${model.PipelineID.replace(/'/g, \"''\")}'`,\n MaxRows: 1,\n ResultType: 'simple',\n Fields: ['TargetEntityID'],\n },\n provider.CurrentUser ?? undefined,\n );\n if (pRes.Success && pRes.Results && pRes.Results.length > 0) {\n const tId = pRes.Results[0]['TargetEntityID'];\n if (typeof tId === 'string' && tId) {\n const e = provider.Entities.find((ent) => UUIDsEqual(ent.ID, tId));\n if (e) {\n this.resolvedEntityId = e.ID;\n this.resolvedEntityName = e.Name;\n return;\n }\n }\n }\n }\n }\n\n /**\n * Returns row nodes currently rendered in the AG Grid viewport.\n * Virtualized grids only render rows visible on screen (plus a small buffer).\n */\n private getVisibleRowNodes(): IRowNode<PredictionGridRow>[] {\n const apis = [this.gridApi, this.chartGridApi].filter((api): api is GridApi<PredictionGridRow> => Boolean(api));\n if (apis.length === 0) return [];\n\n const nodes: IRowNode<PredictionGridRow>[] = [];\n for (const api of apis) {\n const rendered = api.getRenderedNodes();\n if (rendered && rendered.length > 0) {\n nodes.push(...rendered);\n continue;\n }\n\n const firstIdx = api.getFirstDisplayedRowIndex();\n const lastIdx = api.getLastDisplayedRowIndex();\n if (firstIdx < 0 || lastIdx < 0) continue;\n\n for (let i = firstIdx; i <= lastIdx; i++) {\n const node = api.getDisplayedRowAtIndex(i);\n if (node) {\n nodes.push(node);\n }\n }\n }\n return nodes;\n }\n\n /**\n * Schedule lazy lookup of record names for rows currently visible in the AG Grid viewport.\n * Debounced so rapid scrolling does not trigger redundant batches.\n */\n public scheduleVisibleRowsLookup(delayMs: number = 60): void {\n if (this.visibleLookupDebounceTimer) {\n clearTimeout(this.visibleLookupDebounceTimer);\n }\n this.visibleLookupDebounceTimer = setTimeout(() => {\n void this.resolveVisibleRecordNames();\n }, delayMs);\n }\n\n /**\n * Resolve display names (e.g. member name, company name) ONLY for visible rows in the viewport\n * using ProviderToUse.GetEntityRecordNames.\n */\n private async resolveVisibleRecordNames(): Promise<void> {\n if ((!this.gridApi && !this.chartGridApi) || !this.resolvedEntityName) {\n return;\n }\n\n const provider = this.ProviderToUse;\n const entity = provider.EntityByName(this.resolvedEntityName);\n if (!entity) {\n return;\n }\n\n const visibleNodes = this.getVisibleRowNodes();\n if (visibleNodes.length === 0) {\n return;\n }\n\n const needed: { normId: string; recordId: string; node: IRowNode<PredictionGridRow> }[] = [];\n const cachedToUpdate: IRowNode<PredictionGridRow>[] = [];\n\n for (const node of visibleNodes) {\n const data = node.data;\n if (!data || !data.recordId) continue;\n\n const normId = NormalizeUUID(data.recordId);\n if (this.recordNameCache.has(normId)) {\n const cachedName = this.recordNameCache.get(normId);\n if (cachedName && data.recordName !== cachedName) {\n data.recordName = cachedName;\n cachedToUpdate.push(node);\n }\n continue;\n }\n\n if (this.inFlightLookups.has(normId)) {\n continue;\n }\n\n needed.push({ normId, recordId: data.recordId, node });\n }\n\n if (cachedToUpdate.length > 0) {\n if (this.gridApi) {\n this.gridApi.refreshCells({ rowNodes: cachedToUpdate, columns: ['recordName'], force: true });\n }\n if (this.chartGridApi) {\n this.chartGridApi.refreshCells({ rowNodes: cachedToUpdate, columns: ['recordName'], force: true });\n }\n }\n\n if (needed.length === 0) {\n return;\n }\n\n // Mark as in-flight\n for (const item of needed) {\n this.inFlightLookups.add(item.normId);\n }\n\n try {\n const inputs: EntityRecordNameInput[] = needed.map((item) => ({\n EntityName: entity.Name,\n CompositeKey: CompositeKey.FromURLSegment(entity, item.recordId),\n }));\n\n const results: EntityRecordNameResult[] = await provider.GetEntityRecordNames(\n inputs,\n provider.CurrentUser ?? undefined,\n );\n\n const nodesToRefresh: IRowNode<PredictionGridRow>[] = [];\n\n for (let i = 0; i < results.length; i++) {\n const res = results[i];\n const item = needed[i];\n if (!item) continue;\n\n if (res && res.Success && res.RecordName) {\n this.recordNameCache.set(item.normId, res.RecordName);\n if (item.node.data) {\n item.node.data.recordName = res.RecordName;\n nodesToRefresh.push(item.node);\n }\n } else {\n // Fallback: cache the recordId to avoid repeatedly re-querying failed records\n this.recordNameCache.set(item.normId, item.recordId);\n }\n }\n\n // Keep allRows in sync so client-side filter and view toggle retain resolved names\n for (const row of this.allRows) {\n const cached = this.recordNameCache.get(NormalizeUUID(row.recordId));\n if (cached && row.recordName !== cached) {\n row.recordName = cached;\n }\n }\n\n if (nodesToRefresh.length > 0) {\n if (this.gridApi) {\n this.gridApi.refreshCells({ rowNodes: nodesToRefresh, columns: ['recordName'], force: true });\n }\n if (this.chartGridApi) {\n this.chartGridApi.refreshCells({ rowNodes: nodesToRefresh, columns: ['recordName'], force: true });\n }\n }\n\n this.cdr.markForCheck();\n } catch (err) {\n LogError(`PSPredictionsGridComponent.resolveVisibleRecordNames failed: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n for (const item of needed) {\n this.inFlightLookups.delete(item.normId);\n }\n }\n }\n\n // ── Grid & Toolbar Event Handlers ──\n\n public onGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n this.gridApi = event.api;\n this.scheduleVisibleRowsLookup(50);\n }\n\n public onChartGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n this.chartGridApi = event.api;\n this.scheduleVisibleRowsLookup(50);\n }\n\n public onCellClicked(event: CellClickedEvent<PredictionGridRow>): void {\n const target = event.event?.target as HTMLElement | null;\n if (target && target.closest('[data-action=\"open-record\"]')) {\n if (event.data) {\n this.drillThrough(event.data);\n }\n }\n }\n\n public onRowClicked(event: RowClickedEvent<PredictionGridRow>): void {\n const target = event.event?.target as HTMLElement | null;\n if (target && target.closest('[data-action=\"open-record\"]')) {\n return; // Handled by cell link click; do not open detail drawer\n }\n if (event.data) {\n this.openDetail(event.data);\n }\n }\n\n public onSearchInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.searchText = target.value ?? '';\n this.applyFilter();\n }\n\n public setTier(tier: string): void {\n this.selectedTier = tier;\n this.applyFilter();\n }\n\n public setTierAndGrid(tier: string): void {\n this.selectedTier = tier;\n this.activeView = 'grid';\n this.applyFilter();\n }\n\n public getOutcomeBadgeClass(className: string | null | undefined): string {\n return resolveOutcomeStyle(className, this.outcomeConfig).BadgeColor;\n }\n\n public getBadgeColorVar(color: string): string {\n switch (color) {\n case 'green':\n return 'var(--mj-status-success)';\n case 'red':\n return 'var(--mj-status-error)';\n case 'amber':\n return 'var(--mj-status-warning)';\n case 'blue':\n return 'var(--mj-brand-primary)';\n default:\n return 'var(--mj-text-muted)';\n }\n }\n\n private computeVisibleBands(): void {\n const total = this.allRows.length;\n const bands = this.outcomeConfig.Bands ?? [];\n this.visibleBands = bands.map((b) => {\n const matching = this.allRows.filter((r) => r.band === b.Key);\n const count = matching.length;\n const pct = total > 0 ? Math.round((count / total) * 100) : 0;\n const rawAvg = count > 0 ? matching.reduce((sum, r) => sum + r.score, 0) / count : 0;\n const avgScore = Math.round(rawAvg * 100);\n const avgScoreFormatted = formatPredictionScore(rawAvg, this.outcomeConfig, this.problemType);\n return {\n key: b.Key,\n label: b.Label,\n count,\n pct,\n avgScore,\n avgScoreFormatted,\n badgeColor: b.BadgeColor,\n icon: b.Icon,\n description: b.Description,\n };\n });\n\n const knownKeys = new Set(bands.map((b) => b.Key));\n const extraKeys = new Set(this.allRows.map((r) => r.band).filter((k) => !knownKeys.has(k)));\n for (const k of extraKeys) {\n const matching = this.allRows.filter((r) => r.band === k);\n const count = matching.length;\n const pct = total > 0 ? Math.round((count / total) * 100) : 0;\n const rawAvg = count > 0 ? matching.reduce((sum, r) => sum + r.score, 0) / count : 0;\n const avgScore = Math.round(rawAvg * 100);\n const avgScoreFormatted = formatPredictionScore(rawAvg, this.outcomeConfig, this.problemType);\n this.visibleBands.push({\n key: k,\n label: k.charAt(0).toUpperCase() + k.slice(1),\n count,\n pct,\n avgScore,\n avgScoreFormatted,\n badgeColor: 'gray',\n });\n }\n }\n\n public onViewToggle(key: string): void {\n this.activeView = key === 'chart' ? 'chart' : 'grid';\n this.cdr.markForCheck();\n }\n\n public clearSearch(): void {\n this.searchText = '';\n this.applyFilter();\n }\n\n public selectDecile(idx: number): void {\n if (this.selectedDecileIndex === idx) {\n this.selectedDecileIndex = null;\n } else {\n this.selectedDecileIndex = idx;\n }\n this.applyFilter();\n\n if (this.selectedDecileIndex !== null) {\n setTimeout(() => {\n const el = document.getElementById('pg-drilldown-anchor');\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 50);\n }\n }\n\n public clearDecileFilter(): void {\n this.selectedDecileIndex = null;\n this.applyFilter();\n }\n\n public get selectedDecileLabel(): string {\n if (this.selectedDecileIndex === null) return '';\n return `${this.selectedDecileIndex * 10}%–${(this.selectedDecileIndex + 1) * 10}%`;\n }\n\n private applyFilter(): void {\n let rows = this.allRows;\n\n if (this.selectedTier !== 'all') {\n rows = rows.filter((r) => r.band === this.selectedTier);\n }\n\n if (this.selectedDecileIndex !== null) {\n const minScore = this.selectedDecileIndex * 0.10;\n const maxScore = this.selectedDecileIndex === 9 ? 1.01 : (this.selectedDecileIndex + 1) * 0.10;\n rows = rows.filter((r) => r.score >= minScore && r.score < maxScore);\n }\n\n if (this.searchText.trim()) {\n const q = this.searchText.trim().toLowerCase();\n rows = rows.filter((r) =>\n r.recordName.toLowerCase().includes(q) ||\n r.recordId.toLowerCase().includes(q) ||\n (r.class && r.class.toLowerCase().includes(q)) ||\n r.drivers.some((d) => d.label.toLowerCase().includes(q)),\n );\n }\n\n this.filteredRows = rows;\n this.cdr.markForCheck();\n this.scheduleVisibleRowsLookup(30);\n }\n\n // ── Drill-Through Navigation ──\n\n public drillThrough(row: PredictionGridRow): void {\n const entName = this.resolvedEntityName || this.entityName;\n if (!entName) return;\n\n try {\n const entity = this.ProviderToUse.EntityByName(entName);\n const ck = CompositeKey.FromURLSegment(entity, row.recordId);\n this.navigationService.OpenEntityRecord(entName, ck);\n } catch (err) {\n LogError(`PSPredictionsGridComponent.drillThrough failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── Slide-In Detail & Score History ──\n\n public onDrawerWidthChanged(width: number): void {\n this.drawerWidthPx = width;\n UserInfoEngine.Instance.SetSettingDebounced('mj.predictiveStudio.predictions.drawerWidth', width.toString());\n }\n\n public openDetail(row: PredictionGridRow): void {\n this.selectedRow = row;\n this.detailOpen = true;\n this.historyPoints = [];\n this.historyLoading = true;\n this.subjectEntityName = null;\n this.subjectRecordId = null;\n this.subjectRecordName = null;\n this.cdr.markForCheck();\n\n void this.loadScoreHistory(row.recordId);\n\n const entName = this.resolvedEntityName || this.entityName;\n if (entName) {\n void this.resolveSubjectRecord(entName, row.recordId);\n }\n }\n\n public closeDetail(): void {\n this.detailOpen = false;\n this.selectedRow = null;\n this.historyPoints = [];\n this.subjectEntityName = null;\n this.subjectRecordId = null;\n this.subjectRecordName = null;\n this.cdr.markForCheck();\n }\n\n public openSubjectRecord(): void {\n if (!this.subjectEntityName || !this.subjectRecordId) return;\n try {\n const entity = this.ProviderToUse.EntityByName(this.subjectEntityName);\n if (!entity) return;\n const ck = CompositeKey.FromURLSegment(entity, this.subjectRecordId);\n this.navigationService.OpenEntityRecord(this.subjectEntityName, ck);\n } catch (err) {\n LogError(`PSPredictionsGridComponent.openSubjectRecord failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private async resolveSubjectRecord(targetEntityName: string, recordId: string): Promise<void> {\n try {\n const provider = this.ProviderToUse;\n const entity = provider.EntityByName(targetEntityName);\n if (!entity) return;\n\n const candidates = [\n { field: 'PersonID', entity: 'MJ_BizApps_Common: People' },\n { field: 'MemberID', entity: 'MoreCheese: Member Profiles' },\n { field: 'ContactID', entity: 'MJ_BizApps_Common: Contacts' },\n { field: 'AccountID', entity: 'MJ_BizApps_Common: Accounts' },\n { field: 'CustomerID', entity: 'MJ_BizApps_Common: Customers' },\n ];\n\n let matchedField: string | null = null;\n let targetRelatedEntityName: string | null = null;\n\n for (const c of candidates) {\n const f = entity.Fields.find((fld) => fld.Name.toLowerCase() === c.field.toLowerCase());\n if (f) {\n matchedField = f.Name;\n targetRelatedEntityName = f.RelatedEntity || c.entity;\n break;\n }\n }\n\n if (!matchedField || !targetRelatedEntityName) {\n const personField = entity.Fields.find((fld) => fld.RelatedEntity && fld.RelatedEntity.toLowerCase().includes('people'));\n if (personField) {\n matchedField = personField.Name;\n targetRelatedEntityName = personField.RelatedEntity;\n }\n }\n\n if (!matchedField || !targetRelatedEntityName) return;\n\n const recRes = await RunView.FromMetadataProvider(provider).RunView<Record<string, unknown>>(\n {\n EntityName: entity.Name,\n ExtraFilter: `${entity.FirstPrimaryKey.Name} = '${recordId.replace(/'/g, \"''\")}'`, // first-pk-ok: Single-key entity lookup by recordId\n MaxRows: 1,\n ResultType: 'simple',\n Fields: [matchedField],\n },\n provider.CurrentUser ?? undefined,\n );\n\n if (recRes.Success && recRes.Results && recRes.Results.length > 0) {\n const subjectId = recRes.Results[0][matchedField];\n if (typeof subjectId === 'string' && subjectId) {\n this.subjectEntityName = targetRelatedEntityName;\n this.subjectRecordId = subjectId;\n\n const relatedEntity = provider.EntityByName(targetRelatedEntityName);\n if (relatedEntity) {\n const names = await provider.GetEntityRecordNames(\n [\n {\n EntityName: targetRelatedEntityName,\n CompositeKey: CompositeKey.FromURLSegment(relatedEntity, subjectId),\n },\n ],\n provider.CurrentUser ?? undefined,\n );\n\n if (names && names.length > 0 && names[0].Success) {\n this.subjectRecordName = names[0].RecordName ?? null;\n }\n }\n this.cdr.markForCheck();\n }\n }\n } catch (err) {\n LogError(`PSPredictionsGridComponent.resolveSubjectRecord failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private async loadScoreHistory(recordId: string): Promise<void> {\n this.historyLoading = true;\n try {\n this.historyPoints = await this.scoreHistoryService.LoadRecordScoreHistory({\n provider: this.ProviderToUse,\n user: this.ProviderToUse.CurrentUser ?? undefined,\n entityId: this.resolvedEntityId,\n recordId,\n modelId: this.modelId,\n outcomeConfig: this.outcomeConfig,\n problemType: this.problemType,\n });\n } finally {\n this.historyLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n public get entityDisplayName(): string {\n return this.resolvedEntityName || this.entityName || 'Entity Record';\n }\n\n // ── KPI & Chart Computations ──\n\n public get highCount(): number {\n return this.allRows.filter((r) => r.band === 'high').length;\n }\n public get mediumCount(): number {\n return this.allRows.filter((r) => r.band === 'medium').length;\n }\n public get lowCount(): number {\n return this.allRows.filter((r) => r.band === 'low').length;\n }\n\n public get highPct(): number {\n return this.allRows.length > 0 ? Math.round((this.highCount / this.allRows.length) * 100) : 0;\n }\n public get mediumPct(): number {\n return this.allRows.length > 0 ? Math.round((this.mediumCount / this.allRows.length) * 100) : 0;\n }\n public get lowPct(): number {\n return this.allRows.length > 0 ? Math.round((this.lowCount / this.allRows.length) * 100) : 0;\n }\n\n public get highAvg(): number {\n return this.highAvgRisk;\n }\n public get mediumAvg(): number {\n return this.mediumAvgRisk;\n }\n public get lowAvg(): number {\n return this.lowAvgRisk;\n }\n\n public get highAvgRisk(): number {\n const list = this.allRows.filter((r) => r.band === 'high');\n return list.length > 0 ? Math.round(list.reduce((acc, r) => acc + r.riskPct, 0) / list.length) : 0;\n }\n public get mediumAvgRisk(): number {\n const list = this.allRows.filter((r) => r.band === 'medium');\n return list.length > 0 ? Math.round(list.reduce((acc, r) => acc + r.riskPct, 0) / list.length) : 0;\n }\n public get lowAvgRisk(): number {\n const list = this.allRows.filter((r) => r.band === 'low');\n return list.length > 0 ? Math.round(list.reduce((acc, r) => acc + r.riskPct, 0) / list.length) : 0;\n }\n\n public get meanScorePct(): number {\n if (this.allRows.length === 0) return 0;\n const total = this.allRows.reduce((acc, r) => acc + r.score, 0);\n return Math.round((total / this.allRows.length) * 100);\n }\n\n public get meanScoreFormatted(): string {\n if (this.allRows.length === 0) return '—';\n const total = this.allRows.reduce((acc, r) => acc + r.score, 0);\n const avg = total / this.allRows.length;\n return formatPredictionScore(avg, this.outcomeConfig, this.problemType);\n }\n\n public get histogramBins(): HistogramBin[] {\n const total = this.allRows.length;\n if (total === 0) return [];\n\n const isReg = this.isRegression;\n let minScore = 0;\n let maxScore = 1;\n\n if (isReg) {\n const scores = this.allRows.map((r) => r.score);\n minScore = Math.min(...scores);\n maxScore = Math.max(...scores);\n if (maxScore <= minScore) {\n maxScore = minScore + 1;\n }\n }\n\n const range = maxScore - minScore;\n const step = range / 10;\n const counts = new Array(10).fill(0);\n\n for (const r of this.allRows) {\n const normalized = isReg ? (r.score - minScore) / range : r.score;\n const idx = Math.min(9, Math.max(0, Math.floor(normalized * 10)));\n counts[idx]++;\n }\n\n const maxCount = Math.max(...counts, 1);\n\n return counts.map((count, idx) => {\n const binMin = minScore + idx * step;\n const binMax = minScore + (idx + 1) * step;\n const pct = (count / total) * 100;\n const pctFormatted = pct < 0.1 && count > 0 ? '<0.1%' : pct.toFixed(1) + '%';\n\n // Power scale height so smaller decile bins (e.g. 2, 21, 35) are visible alongside 5,390\n const height = count === 0 ? 0 : Math.round(14 + Math.pow(count / maxCount, 0.45) * 116);\n\n const centerScore = (binMin + binMax) / 2;\n const band = resolveScoreBand(centerScore, this.outcomeConfig);\n const color = band ? this.getBadgeColorVar(band.BadgeColor) : 'var(--mj-brand-primary)';\n\n let label: string;\n let shortLabel: string;\n if (isReg) {\n const fmtMin = formatPredictionScore(binMin, this.outcomeConfig, this.problemType);\n const fmtMax = formatPredictionScore(binMax, this.outcomeConfig, this.problemType);\n label = `${fmtMin}–${fmtMax}`;\n shortLabel = fmtMin;\n } else {\n const lower = idx * 10;\n const upper = (idx + 1) * 10;\n label = `${lower}%–${upper}%`;\n shortLabel = `${lower}%`;\n }\n const riskLabel = band ? band.Label : label;\n\n return {\n idx,\n label,\n shortLabel,\n count,\n pct: Math.round(pct),\n pctFormatted,\n height,\n color,\n riskLabel,\n };\n });\n }\n\n public get classBreakdown(): ClassShare[] {\n const total = this.allRows.length;\n if (total === 0) return [];\n\n const counts = new Map<string, number>();\n for (const r of this.allRows) {\n if (r.class) {\n counts.set(r.class, (counts.get(r.class) ?? 0) + 1);\n }\n }\n\n const palette = [\n 'var(--mj-brand-primary)',\n 'var(--mj-status-error)',\n 'var(--mj-status-warning)',\n 'var(--mj-status-success)',\n '#7b3ff0',\n '#d98213',\n ];\n\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([name, count], i) => ({\n name,\n count,\n pct: Math.round((count / total) * 100),\n color: palette[i % palette.length],\n }));\n }\n\n // ── Trendline SVG Plotting ──\n\n public get trendlinePlotPoints(): TrendlinePlotPoint[] {\n const pts = this.historyPoints;\n if (pts.length === 0) return [];\n\n const isReg = this.isRegression;\n let minScore = 0;\n let maxScore = 1;\n if (isReg) {\n const scores = pts.map((p) => p.score);\n minScore = Math.min(...scores);\n maxScore = Math.max(...scores);\n if (maxScore <= minScore) {\n maxScore = minScore + 1;\n }\n }\n const range = maxScore - minScore;\n\n const xStart = 60;\n const xEnd = 500;\n const yTop = 20;\n const yBottom = 130;\n const ySpan = yBottom - yTop;\n\n const step = pts.length > 1 ? (xEnd - xStart) / (pts.length - 1) : 0;\n\n return pts.map((pt, i) => {\n const x = pts.length === 1 ? (xStart + xEnd) / 2 : Math.round(xStart + i * step);\n const clampedScore = isReg\n ? Math.max(0, Math.min(1, (pt.score - minScore) / range))\n : Math.max(0, Math.min(1, pt.score));\n const y = Math.round(yBottom - clampedScore * ySpan);\n const band = resolveScoreBand(pt.score, this.outcomeConfig);\n const color = band ? this.getBadgeColorVar(band.BadgeColor) : 'var(--mj-brand-primary)';\n return {\n runId: pt.runId,\n x,\n y,\n scoreFormatted: pt.scoreFormatted,\n dateStr: pt.runDate.toLocaleDateString(),\n class: pt.class,\n color,\n };\n });\n }\n\n public get trendlineLinePoints(): string {\n return this.trendlinePlotPoints.map((p) => `${p.x},${p.y}`).join(' ');\n }\n\n public get trendlineAreaPoints(): string {\n const plot = this.trendlinePlotPoints;\n if (plot.length === 0) return '';\n const first = plot[0];\n const last = plot[plot.length - 1];\n return `${first.x},130 ` + plot.map((p) => `${p.x},${p.y}`).join(' ') + ` ${last.x},130`;\n }\n\n // ── CSV Export ──\n\n public exportCSV(): void {\n if (this.allRows.length === 0) return;\n\n const scoreHeader = this.outcomeConfig.ScoreLabel || 'Prediction Score';\n const statusHeader = this.outcomeConfig.StatusLabel || 'Risk Level';\n const headers = ['Record ID', 'Record Name', scoreHeader, statusHeader, 'Predicted Class', 'Top Drivers', 'Scored At'];\n const lines = [headers.join(',')];\n\n for (const r of this.filteredRows) {\n const driversStr = r.drivers.map((d) => `${d.up ? '+' : '-'}${d.label}`).join('; ');\n const statusStr = `${r.status || r.band} (${r.scoreFormatted})`;\n const rowData = [\n `\"${r.recordId.replace(/\"/g, '\"\"')}\"`,\n `\"${(r.recordName || r.recordId).replace(/\"/g, '\"\"')}\"`,\n r.scoreFormatted,\n statusStr,\n `\"${(r.class || '').replace(/\"/g, '\"\"')}\"`,\n `\"${driversStr.replace(/\"/g, '\"\"')}\"`,\n `\"${r.scoredAtDate ? r.scoredAtDate.toISOString() : ''}\"`,\n ];\n lines.push(rowData.join(','));\n }\n\n const blob = new Blob([lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `predictions_${this.resolvedEntityName || 'records'}_${new Date().toISOString().slice(0, 10)}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n}\n","<div class=\"ps-pred-grid-host\" [style.height]=\"height\">\n <!-- ───────── TOOLBAR ───────── -->\n <div class=\"pg-toolbar\">\n <div class=\"pg-toolbar-left\">\n <div class=\"pg-search-box\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input\n type=\"text\"\n class=\"pg-search-input\"\n placeholder=\"Filter records, outcome, factors...\"\n [value]=\"searchText\"\n (input)=\"onSearchInput($event)\" />\n @if (searchText) {\n <button type=\"button\" class=\"pg-search-clear\" (click)=\"clearSearch()\" title=\"Clear filter\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n\n <div class=\"pg-tier-filters\">\n <button\n type=\"button\"\n class=\"pg-tier-btn\"\n [class.active]=\"selectedTier === 'all'\"\n (click)=\"setTier('all')\">\n All <span class=\"pg-count-pill\">({{ allRows.length | number }})</span>\n </button>\n @for (b of visibleBands; track b.key) {\n <button\n type=\"button\"\n class=\"pg-tier-btn\"\n [class.active]=\"selectedTier === b.key\"\n (click)=\"setTier(b.key)\">\n {{ b.label }} <span class=\"pg-count-pill\">({{ b.count | number }})</span>\n </button>\n }\n\n @if (selectedDecileIndex !== null) {\n <div class=\"pg-decile-pill\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Decile {{ selectedDecileLabel }}</span>\n <button type=\"button\" (click)=\"clearDecileFilter()\" title=\"Clear decile filter\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n }\n </div>\n </div>\n\n <div class=\"pg-toolbar-right\">\n <mj-view-toggle\n [Options]=\"viewOptions\"\n [ActiveKey]=\"activeView\"\n (KeyChange)=\"onViewToggle($event)\">\n </mj-view-toggle>\n\n <button\n mjButton\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"allRows.length === 0\"\n (click)=\"exportCSV()\">\n <i class=\"fa-solid fa-file-export\"></i> Export\n </button>\n </div>\n </div>\n\n <!-- ───────── MAIN VIEW CONTAINER ───────── -->\n <div class=\"pg-view-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading predictions...\" size=\"medium\"></mj-loading>\n } @else if (loadError) {\n <div class=\"ps-load-error\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div class=\"ps-load-error-text\">\n <strong>Couldn't load predictions</strong>\n <span class=\"ps-load-error-detail\">{{ loadError }}</span>\n </div>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"reload()\"><i class=\"fa-solid fa-rotate-right\"></i> Try again</button>\n </div>\n } @else if (allRows.length === 0) {\n <div class=\"ps-empty\" style=\"padding: 32px\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-chart-line\"></i></span>\n <h3>No predictions available</h3>\n <p>Run this model from Models in Production or wait for the scheduled job to produce predictions.</p>\n </div>\n } @else {\n <!-- GRID VIEW -->\n @if (activeView === 'grid') {\n <ag-grid-angular\n class=\"pg-grid\"\n [theme]=\"Theme\"\n [columnDefs]=\"columnDefs\"\n [defaultColDef]=\"defaultColDef\"\n [gridOptions]=\"GridOptions\"\n [rowData]=\"filteredRows\"\n (gridReady)=\"onGridReady($event)\"\n (rowClicked)=\"onRowClicked($event)\"\n (cellClicked)=\"onCellClicked($event)\">\n </ag-grid-angular>\n\n <div class=\"pg-footer\">\n <span>Showing <strong>{{ filteredRows.length }}</strong> of {{ allRows.length }} predictions</span>\n @if (selectedTier !== 'all' || searchText) {\n <span class=\"ps-muted\">Filtered by {{ selectedTier !== 'all' ? selectedTier + ' risk' : '' }}{{ searchText ? ' query \"' + searchText + '\"' : '' }}</span>\n }\n <span class=\"ps-muted\">Click any row to inspect details & score history</span>\n </div>\n }\n\n <!-- CHART VIEW -->\n @if (activeView === 'chart') {\n <div class=\"pg-chart-container\">\n <!-- KPI Summary Cards -->\n <div class=\"pg-chart-cards\">\n <div class=\"pg-chart-card total\">\n <span class=\"pg-chart-card-lbl\"><i class=\"fa-solid fa-users ps-muted\"></i> Scored Cohort</span>\n <span class=\"pg-chart-card-val\">{{ allRows.length | number }}</span>\n <span class=\"pg-chart-card-sub\">Total records</span>\n </div>\n @for (b of visibleBands; track b.key) {\n <div class=\"pg-chart-card\" [class]=\"'tier-' + b.key\" (click)=\"setTierAndGrid(b.key)\">\n <span class=\"pg-chart-card-lbl\">\n @if (b.icon) {\n <i class=\"fa-solid {{ b.icon }}\" [style.color]=\"getBadgeColorVar(b.badgeColor)\"></i>\n }\n {{ b.label }}\n </span>\n <span class=\"pg-chart-card-val\" [style.color]=\"getBadgeColorVar(b.badgeColor)\">\n {{ b.count | number }}\n </span>\n <span class=\"pg-chart-card-sub\">{{ b.pct }}% of cohort (avg {{ b.avgScoreFormatted }} {{ outcomeConfig.ScoreLabel }})</span>\n </div>\n }\n </div>\n\n <!-- Score Distribution Histogram -->\n <div class=\"pg-chart-section\">\n <div class=\"pg-chart-section-title\">\n <div style=\"display:flex;align-items:center;gap:8px\">\n <i class=\"fa-solid fa-chart-simple ps-muted\"></i>\n <span>{{ outcomeConfig.ScoreLabel }} Distribution (10 Bins)</span>\n </div>\n <div class=\"pg-chart-meta\">\n <span class=\"ps-small ps-muted\">Cohort Mean: <strong>{{ meanScoreFormatted }}</strong></span>\n @if (selectedDecileIndex !== null) {\n <button type=\"button\" class=\"pg-clear-decile-btn\" (click)=\"clearDecileFilter()\">\n <i class=\"fa-solid fa-xmark\"></i> Clear Decile Filter\n </button>\n }\n </div>\n </div>\n\n <!-- Modern Interactive Flex Histogram -->\n <div class=\"pg-histogram\">\n <div class=\"pg-h-columns\">\n @for (b of histogramBins; track b.label) {\n <div\n class=\"pg-h-col\"\n [class.active]=\"selectedDecileIndex === b.idx\"\n [class.empty]=\"b.count === 0\"\n (click)=\"selectDecile(b.idx)\">\n\n <!-- Count label above bar -->\n <span class=\"pg-h-count\" [title]=\"b.count + ' records'\">\n {{ b.count > 0 ? (b.count | number) : '0' }}\n </span>\n\n <!-- Bar track & fill -->\n <div class=\"pg-h-bar-track\">\n <div\n class=\"pg-h-bar\"\n [style.height.px]=\"b.height\"\n [style.background]=\"b.color\">\n </div>\n </div>\n\n <!-- Footer labels -->\n <div class=\"pg-h-footer\">\n <span class=\"pg-h-range\">{{ b.shortLabel }}</span>\n <span class=\"pg-h-pct\">{{ b.pctFormatted }}</span>\n </div>\n\n <!-- Tooltip card -->\n <div class=\"pg-h-tooltip\">\n <div class=\"pg-h-tt-head\">{{ b.label }} {{ outcomeConfig.ScoreLabel }}</div>\n <div class=\"pg-h-tt-row\">\n <span class=\"pg-h-tt-val\">{{ b.count | number }} records</span>\n <span class=\"pg-h-tt-pct\">({{ b.pctFormatted }} of cohort)</span>\n </div>\n <div class=\"pg-h-tt-badge\" [style.color]=\"b.color\">{{ b.riskLabel }}</div>\n <div class=\"pg-h-tt-hint\">{{ selectedDecileIndex === b.idx ? 'Click to clear filter' : 'Click to filter grid' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Predicted Class Breakdown (for Classification) -->\n @if (classBreakdown.length > 0) {\n <div class=\"pg-chart-section\">\n <div class=\"pg-chart-section-title\">\n <span><i class=\"fa-solid fa-layer-group ps-muted\"></i> Predicted Outcome Classes</span>\n </div>\n <div style=\"display:flex;height:24px;border-radius:var(--mj-radius-full);overflow:hidden;background:var(--mj-bg-surface-sunken);margin-bottom:8px\">\n @for (c of classBreakdown; track c.name) {\n <div\n [style.width.%]=\"c.pct\"\n [style.background]=\"c.color\"\n [title]=\"c.name + ': ' + c.count + ' (' + c.pct + '%)'\">\n </div>\n }\n </div>\n <div style=\"display:flex;gap:16px;flex-wrap:wrap\">\n @for (c of classBreakdown; track c.name) {\n <div style=\"display:flex;align-items:center;gap:6px;font-size:var(--mj-text-xs)\">\n <span [style.background]=\"c.color\" style=\"width:10px;height:10px;border-radius:2px;display:inline-block\"></span>\n <strong>{{ c.name }}</strong>\n <span class=\"ps-muted\">{{ c.count }} ({{ c.pct }}%)</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Segment Drilldown Grid Section — Only shown when a decile segment is selected -->\n @if (selectedDecileIndex !== null) {\n <div id=\"pg-drilldown-anchor\" class=\"pg-chart-section pg-chart-drilldown-section\">\n <div class=\"pg-chart-section-title\">\n <div style=\"display:flex;align-items:center;gap:8px\">\n <i class=\"fa-solid fa-table-list ps-muted\"></i>\n <span>\n Decile Drill-Down:\n <strong style=\"color:var(--mj-brand-primary)\">{{ selectedDecileLabel }}</strong>\n {{ outcomeConfig.ScoreLabel }}\n @if (histogramBins[selectedDecileIndex]) {\n <span class=\"ps-badge\" [style.color]=\"histogramBins[selectedDecileIndex].color\" style=\"margin-left:6px\">\n {{ histogramBins[selectedDecileIndex].riskLabel }}\n </span>\n }\n </span>\n </div>\n <div class=\"pg-chart-meta\">\n <span class=\"ps-small ps-muted\">\n Showing <strong>{{ filteredRows.length | number }}</strong> of {{ allRows.length | number }} records\n </span>\n <button type=\"button\" class=\"pg-clear-decile-btn\" (click)=\"clearDecileFilter()\">\n <i class=\"fa-solid fa-xmark\"></i> Show All Deciles\n </button>\n </div>\n </div>\n\n <!-- Drill-Down AG Grid -->\n <div class=\"pg-chart-grid-host\">\n <ag-grid-angular\n class=\"pg-grid pg-chart-ag-grid\"\n [theme]=\"Theme\"\n [columnDefs]=\"columnDefs\"\n [defaultColDef]=\"defaultColDef\"\n [gridOptions]=\"chartGridOptions\"\n [rowData]=\"filteredRows\"\n (gridReady)=\"onChartGridReady($event)\"\n (rowClicked)=\"onRowClicked($event)\"\n (cellClicked)=\"onCellClicked($event)\">\n </ag-grid-angular>\n </div>\n\n <div class=\"pg-drilldown-footer\">\n <span class=\"ps-muted\">Click any row to inspect explainability drivers and score history in the slide-in drawer</span>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- ───────── SLIDE-IN DETAIL PANEL ───────── -->\n @if (detailOpen && selectedRow) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Record Prediction & Score History\"\n [Resizable]=\"true\"\n [WidthPx]=\"drawerWidthPx\"\n (WidthChanged)=\"onDrawerWidthChanged($event)\"\n (Closed)=\"closeDetail()\">\n\n <div class=\"pg-detail-body\">\n <!-- Record header -->\n <div class=\"pg-detail-record-head\">\n <div class=\"pg-detail-record-info\">\n <h3>{{ selectedRow.recordName || selectedRow.recordId }}</h3>\n <div style=\"display:flex;align-items:center;gap:8px\">\n <span class=\"ps-badge blue\">{{ entityDisplayName || 'Entity Record' }}</span>\n <span class=\"ps-mono ps-small ps-muted\">{{ selectedRow.recordId }}</span>\n </div>\n </div>\n <div class=\"pg-detail-record-actions\" style=\"display:flex;gap:8px;align-items:center;flex-wrap:wrap\">\n <button\n mjButton\n variant=\"primary\"\n size=\"sm\"\n (click)=\"drillThrough(selectedRow)\"\n title=\"Open record in Explorer\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open {{ entityDisplayName || 'Record' }}\n </button>\n @if (subjectEntityName && subjectRecordId) {\n <button\n mjButton\n variant=\"secondary\"\n size=\"sm\"\n (click)=\"openSubjectRecord()\"\n title=\"Open subject record (e.g. Person, Account) in Explorer\">\n <i class=\"fa-solid fa-user\"></i> Open {{ subjectEntityName.replace('MJ_BizApps_Common: ', '').replace('MJ_BizApps_', '') }} ({{ subjectRecordName || 'Profile' }})\n </button>\n }\n </div>\n </div>\n\n <!-- Prediction Summary Card -->\n <div class=\"pg-detail-pred-card\">\n <div class=\"pg-detail-score-circle\" [class]=\"'badge-' + (selectedRow.badgeColor || 'gray')\">\n {{ selectedRow.scoreFormatted }}\n </div>\n <div class=\"pg-detail-meta\">\n <div class=\"pg-detail-meta-line\">\n <strong>{{ outcomeConfig.StatusLabel }}:</strong>\n <span class=\"ps-badge\" [class]=\"selectedRow.badgeColor || 'gray'\" style=\"margin-left:6px\">\n @if (selectedRow.icon) {\n <i class=\"fa-solid {{ selectedRow.icon }}\"></i>\n }\n {{ selectedRow.status || selectedRow.band }}\n </span>\n </div>\n @if (selectedRow.class) {\n <div class=\"pg-detail-meta-line\">\n <strong>Predicted Outcome:</strong>\n <span class=\"ps-badge\" [class]=\"getOutcomeBadgeClass(selectedRow.class)\">\n {{ selectedRow.class }}\n </span>\n </div>\n }\n <div class=\"pg-detail-meta-line\">\n <strong>{{ outcomeConfig.ScoreLabel }}:</strong>\n <span style=\"font-weight:700;color:var(--mj-text-primary)\">{{ selectedRow.scoreFormatted }}</span>\n </div>\n <div class=\"pg-detail-meta-sub\">\n Scored: {{ selectedRow.scoredAtDate ? (selectedRow.scoredAtDate | date:'medium') : '—' }}\n </div>\n </div>\n </div>\n\n <!-- Explainability: Local Feature Drivers -->\n <div class=\"pg-detail-drivers-wrap\">\n <div class=\"ps-section-title\">\n <i class=\"fa-solid fa-lightbulb\" style=\"color:var(--mj-status-warning)\"></i> Key Decision Drivers (Explainability)\n </div>\n @if (!selectedRow.drivers || selectedRow.drivers.length === 0) {\n <div class=\"ps-small ps-muted\">No individual driver breakdown was recorded for this row.</div>\n } @else {\n <div class=\"pg-detail-drivers-list\">\n @for (d of selectedRow.drivers; track d.label) {\n <div class=\"pg-detail-driver-item\">\n <div class=\"pg-detail-driver-label\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"d.up\" [class.fa-arrow-down]=\"!d.up\" [style.color]=\"d.up ? 'var(--mj-status-error)' : 'var(--mj-status-success)'\"></i>\n {{ d.label }}\n </div>\n <span class=\"ps-badge\" [class]=\"d.up ? 'red' : 'green'\">\n {{ d.up ? 'Increases Risk' : 'Lowers Risk' }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Historical Trendline across Runs -->\n <div class=\"pg-trendline-wrap\">\n <div class=\"ps-section-title\" style=\"display:flex;align-items:center;justify-content:space-between\">\n <span><i class=\"fa-solid fa-clock-rotate-left ps-muted\"></i> Historical Score Trendline</span>\n <span class=\"ps-small ps-muted\">{{ historyPoints.length }} run{{ historyPoints.length === 1 ? '' : 's' }} recorded</span>\n </div>\n\n @if (historyLoading) {\n <mj-loading text=\"Loading score history...\" size=\"small\"></mj-loading>\n } @else if (historyPoints.length > 1) {\n <!-- Interactive SVG Trendline -->\n <svg class=\"pg-trendline-svg\" viewBox=\"0 0 540 160\" preserveAspectRatio=\"none\">\n <!-- Background grid lines -->\n <line x1=\"40\" y1=\"20\" x2=\"520\" y2=\"20\" stroke=\"var(--mj-border-subtle)\" stroke-dasharray=\"3,3\" />\n <line x1=\"40\" y1=\"75\" x2=\"520\" y2=\"75\" stroke=\"var(--mj-border-subtle)\" stroke-dasharray=\"3,3\" />\n <line x1=\"40\" y1=\"130\" x2=\"520\" y2=\"130\" stroke=\"var(--mj-border-default)\" />\n\n <!-- Y-axis labels -->\n <text x=\"32\" y=\"24\" font-size=\"10\" text-anchor=\"end\" fill=\"var(--mj-text-muted)\">100%</text>\n <text x=\"32\" y=\"79\" font-size=\"10\" text-anchor=\"end\" fill=\"var(--mj-text-muted)\">50%</text>\n <text x=\"32\" y=\"134\" font-size=\"10\" text-anchor=\"end\" fill=\"var(--mj-text-muted)\">0%</text>\n\n <!-- Filled area under curve -->\n <polygon [attr.points]=\"trendlineAreaPoints\" fill=\"color-mix(in srgb, var(--mj-brand-primary) 12%, transparent)\" />\n\n <!-- Trend line path -->\n <polyline [attr.points]=\"trendlineLinePoints\" fill=\"none\" stroke=\"var(--mj-brand-primary)\" stroke-width=\"2.5\" />\n\n <!-- Data points -->\n @for (p of trendlinePlotPoints; track p.runId) {\n <circle\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"5\"\n [attr.fill]=\"p.color\"\n stroke=\"var(--mj-bg-surface)\"\n stroke-width=\"2\">\n <title>{{ p.dateStr }}: {{ p.scoreFormatted }} ({{ p.class || 'No class' }})</title>\n </circle>\n <text\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y - 9\"\n font-size=\"10\"\n font-weight=\"700\"\n text-anchor=\"middle\"\n fill=\"var(--mj-text-primary)\">\n {{ p.scoreFormatted }}\n </text>\n }\n </svg>\n\n <!-- Runs Table -->\n <table class=\"pg-history-table\">\n <thead>\n <tr>\n <th>When</th>\n <th>Status</th>\n <th>Score</th>\n <th>Change</th>\n <th>Class</th>\n </tr>\n </thead>\n <tbody>\n @for (pt of historyPoints; track pt.runId) {\n <tr>\n <td>{{ pt.runDate | date:'short' }}</td>\n <td><span class=\"ps-badge\" [class]=\"pt.status === 'Succeeded' ? 'green' : 'gray'\">{{ pt.status }}</span></td>\n <td><strong class=\"ps-mono\">{{ pt.scoreFormatted }}</strong></td>\n <td>\n @if (pt.delta == null) {\n <span class=\"pg-delta-pill neutral\">Baseline</span>\n } @else if (pt.delta > 0.005) {\n <span class=\"pg-delta-pill up\"><i class=\"fa-solid fa-arrow-up\"></i> +{{ (pt.delta * 100).toFixed(1) }}%</span>\n } @else if (pt.delta < -0.005) {\n <span class=\"pg-delta-pill down\"><i class=\"fa-solid fa-arrow-down\"></i> {{ (pt.delta * 100).toFixed(1) }}%</span>\n } @else {\n <span class=\"pg-delta-pill neutral\">0%</span>\n }\n </td>\n <td>{{ pt.class || '—' }}</td>\n </tr>\n }\n </tbody>\n </table>\n } @else if (historyPoints.length === 1) {\n <div class=\"ps-small ps-muted\">\n This record has been scored once so far ({{ historyPoints[0].runDate | date:'medium' }}). As more runs occur over time, the score trendline will track changes here.\n </div>\n } @else {\n <div class=\"ps-small ps-muted\">No historical runs found for this record.</div>\n }\n </div>\n </div>\n </mj-slide-panel>\n }\n</div>\n"]}
|
|
@@ -62,14 +62,29 @@ export declare class PSProductionComponent extends BaseAngularComponent implemen
|
|
|
62
62
|
selectedBindings: BindingVM[];
|
|
63
63
|
runs: PSProcessRunRow[];
|
|
64
64
|
loadingRuns: boolean;
|
|
65
|
+
loadingDetails: boolean;
|
|
65
66
|
/** Whether the "Operate this model" dialog is open for the selected model. */
|
|
66
67
|
operateOpen: boolean;
|
|
67
68
|
/** The run whose per-record predictions are drilled into (null = the run list). */
|
|
68
69
|
selectedRunId: string | null;
|
|
69
70
|
runDetails: RunDetailVM[];
|
|
70
|
-
|
|
71
|
+
listSizePct: number;
|
|
72
|
+
detailSizePct: number;
|
|
73
|
+
isListCollapsed: boolean;
|
|
74
|
+
isHeaderCollapsed: boolean;
|
|
75
|
+
isDeploymentCollapsed: boolean;
|
|
76
|
+
isRunFocused: boolean;
|
|
77
|
+
get runGridHeight(): string;
|
|
71
78
|
ngOnInit(): void;
|
|
72
79
|
ngOnDestroy(): void;
|
|
80
|
+
toggleHeaderCollapse(): void;
|
|
81
|
+
toggleDeploymentCollapse(): void;
|
|
82
|
+
toggleRunFocus(): void;
|
|
83
|
+
private updateFocusState;
|
|
84
|
+
private loadLayoutPrefs;
|
|
85
|
+
onSplitDragEnd(sizes: readonly (number | '*')[]): void;
|
|
86
|
+
toggleList(): void;
|
|
87
|
+
private saveLayoutPrefs;
|
|
73
88
|
get scheduledModelCount(): number;
|
|
74
89
|
get boundModelCount(): number;
|
|
75
90
|
get idleModelCount(): number;
|
|
@@ -78,6 +93,7 @@ export declare class PSProductionComponent extends BaseAngularComponent implemen
|
|
|
78
93
|
private bindingsForModel;
|
|
79
94
|
private toBindingVM;
|
|
80
95
|
private resolveEntityName;
|
|
96
|
+
get selectedTargetEntityName(): string | null;
|
|
81
97
|
get selected(): ProductionModelVM;
|
|
82
98
|
/**
|
|
83
99
|
* Close the Operate dialog. On a successful change the dialog already refreshed the engine
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps-production.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-production.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,SAAS,EAAE,MAAM,EAA6B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ps-production.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-production.component.ts"],"names":[],"mappings":"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"}
|