@memberjunction/ng-dashboards 6.2.0-edge.6 → 6.2.0-edge.8
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/README.md +23 -16
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +2 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js +3 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js +3 -3
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +6 -4
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.js +8 -2
- package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +31 -10
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +14 -24
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -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 +14 -7
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +4 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/action-result-code.d.ts +80 -0
- package/dist/Actions/action-result-code.d.ts.map +1 -0
- package/dist/Actions/action-result-code.js +163 -0
- package/dist/Actions/action-result-code.js.map +1 -0
- package/dist/Actions/components/actions-overview.component.d.ts +8 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +12 -9
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +29 -9
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +65 -42
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +5 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +92 -130
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +189 -274
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts +29 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js +666 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts +56 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js +515 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts +14 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js +39 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts +17 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js +485 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts +139 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js +602 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js.map +1 -0
- package/dist/ChiefOfStaff/index.d.ts +4 -1
- package/dist/ChiefOfStaff/index.d.ts.map +1 -1
- package/dist/ChiefOfStaff/index.js +4 -1
- package/dist/ChiefOfStaff/index.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +3 -3
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +3 -0
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +21 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +32 -5
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +2 -2
- package/dist/DevTools/lazy-module-status.component.js +2 -2
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +5 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -2
- package/dist/Integration/services/integration-data.service.d.ts +1 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +4 -3
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +11 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +16 -16
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts +113 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js +1184 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +21 -10
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.js +1 -0
- package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +1 -0
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +3 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js +1 -0
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +1 -0
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +26 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +375 -252
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts +8 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.js +22 -4
- package/dist/UserRoutines/user-routines-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +1 -0
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts +162 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js +1105 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts +27 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js +119 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts +105 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js +560 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts +163 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js +1054 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts +43 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js +412 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts +73 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js +271 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js.map +1 -0
- package/dist/VideoStudio/index.d.ts +12 -0
- package/dist/VideoStudio/index.d.ts.map +1 -0
- package/dist/VideoStudio/index.js +12 -0
- package/dist/VideoStudio/index.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts +118 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js +964 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts +70 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js +600 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts +182 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js +1481 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts +102 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js +240 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts +495 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.js +992 -0
- package/dist/VideoStudio/video-studio-agent-context.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +46 -41
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +33 -7
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +8 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +10 -2
- package/dist/public-api.js.map +1 -1
- package/dist/shared/action-scheduled-job.d.ts.map +1 -1
- package/dist/shared/action-scheduled-job.js +2 -0
- package/dist/shared/action-scheduled-job.js.map +1 -1
- package/dist/video-studio-dashboards.module.d.ts +40 -0
- package/dist/video-studio-dashboards.module.d.ts.map +1 -0
- package/dist/video-studio-dashboards.module.js +159 -0
- package/dist/video-studio-dashboards.module.js.map +1 -0
- package/package.json +78 -71
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +0 -195
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +0 -1
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +0 -2910
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +0 -1
|
@@ -1 +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 EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\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 { EscapeSQLString, NormalizeUUID, UUIDsEqual } from '@memberjunction/global';\nimport { 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 AtRiskRules,\n ProblemTypes,\n type AtRiskRow,\n type RowDriver,\n type OutcomeConfig,\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, type PSRunDetailRow } from '../engine/predictive-studio.engine';\nimport { PSRowDriversComponent } from './ps-row-drivers.component';\n\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/** One displayed prediction row in the unified grid. */\nexport interface PredictionGridRow {\n recordId: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n recordName: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n score: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n scoreFormatted: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n riskPct: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n band: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n badgeColor?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n icon?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n class: string | null; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n drivers: RowDriver[]; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n status: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n scoredAtDate: Date | null; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n}\n\n/** Summary of one dynamic outcome band for toolbar filtering and KPI cards. */\nexport interface VisibleBandSummary {\n key: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n label: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n count: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n pct: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n avgScore: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n avgScoreFormatted: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n badgeColor: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n icon?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n description?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\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/** The tier a row is shown in: its key (filter and count), status label, badge colour and icon. */\ninterface RowTier {\n Key: string;\n Label: string;\n BadgeColor: string;\n Icon?: string;\n}\n\n/** {@link PSPredictionsGridComponent.RowsLoaded}'s payload: the parsed at-risk rows of the run the grid shows. */\nexport interface PredictionGridRowsLoadedEvent {\n /** The run's at-risk rows, highest risk first, exactly as the grid parsed them. */\n Rows: AtRiskRow[];\n /** True when the run has more predictions than {@link PredictiveStudioEngine.MaxRunDetailRows}; `Rows` holds the first ones. */\n Capped: boolean;\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 PSRowDriversComponent,\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\n /** @deprecated Use {@link RunId}. */\n @Input() set runId(value: string | null) {\n this.RunId = value;\n }\n /** @deprecated Use {@link RunId}. */\n get runId(): string | null {\n return this.RunId;\n }\n @Input() entityName: string | null = null;\n @Input() ProblemType: string | null = 'classification';\n\n /** @deprecated Use {@link ProblemType}. */\n @Input() set problemType(value: string | null) {\n this.ProblemType = value;\n }\n /** @deprecated Use {@link ProblemType}. */\n get problemType(): string | null {\n return this.ProblemType;\n }\n @Input() title: string | null = null;\n @Input() height = '560px';\n @Input() ReadOnly = false;\n\n /** @deprecated Use {@link ReadOnly}. */\n @Input() set readOnly(value: PSPredictionsGridComponent['ReadOnly']) {\n this.ReadOnly = value;\n }\n /** @deprecated Use {@link ReadOnly}. */\n get readOnly(): PSPredictionsGridComponent['ReadOnly'] {\n return this.ReadOnly;\n }\n\n /**\n * Emitted after the grid parses a run, with the run's at-risk rows. A host that needs the rows (counts, export, a list)\n * takes them from here rather than reading the run a second time. Also emitted, empty, when the model has no run.\n */\n @Output() RowsLoaded = new EventEmitter<PredictionGridRowsLoadedEvent>();\n /** Emitted with the error message when the run's predictions fail to load. */\n @Output() RowsLoadFailed = new EventEmitter<string>();\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 /** The run-detail cap, formatted for the footer notice. */\n public readonly MaxRunDetailRowsLabel = PredictiveStudioEngine.MaxRunDetailRowsLabel;\n\n /** The tier of a regression row whose value falls in none of the outcome bands. */\n private static readonly unbandedTier: RowTier = { Key: 'unbanded', Label: 'No band', BadgeColor: 'gray' };\n\n public isLoading = false;\n public loadError: string | null = null;\n /** True when the run has more predictions than {@link PredictiveStudioEngine.MaxRunDetailRows}; only the first are shown. */\n public DetailRowsCapped = false;\n\n public AllRows: PredictionGridRow[] = [];\n\n /** @deprecated Use {@link AllRows}. */\n public get allRows(): PredictionGridRow[] {\n return this.AllRows;\n }\n /** @deprecated Use {@link AllRows}. */\n public set allRows(value: PredictionGridRow[]) {\n this.AllRows = value;\n }\n public FilteredRows: PredictionGridRow[] = [];\n\n /** @deprecated Use {@link FilteredRows}. */\n public get filteredRows(): PredictionGridRow[] {\n return this.FilteredRows;\n }\n /** @deprecated Use {@link FilteredRows}. */\n public set filteredRows(value: PredictionGridRow[]) {\n this.FilteredRows = value;\n }\n\n public SearchText = '';\n\n /** @deprecated Use {@link SearchText}. */\n public get searchText() {\n return this.SearchText;\n }\n /** @deprecated Use {@link SearchText}. */\n public set searchText(value) {\n this.SearchText = value;\n }\n public SelectedTier: string = 'all';\n\n /** @deprecated Use {@link SelectedTier}. */\n public get selectedTier(): string {\n return this.SelectedTier;\n }\n /** @deprecated Use {@link SelectedTier}. */\n public set selectedTier(value: string) {\n this.SelectedTier = value;\n }\n public OutcomeConfig: OutcomeConfig = resolveOutcomeConfig();\n\n /** @deprecated Use {@link OutcomeConfig}. */\n public get outcomeConfig(): OutcomeConfig {\n return this.OutcomeConfig;\n }\n /** @deprecated Use {@link OutcomeConfig}. */\n public set outcomeConfig(value: OutcomeConfig) {\n this.OutcomeConfig = value;\n }\n public VisibleBands: VisibleBandSummary[] = [];\n\n /** @deprecated Use {@link VisibleBands}. */\n public get visibleBands(): VisibleBandSummary[] {\n return this.VisibleBands;\n }\n /** @deprecated Use {@link VisibleBands}. */\n public set visibleBands(value: VisibleBandSummary[]) {\n this.VisibleBands = value;\n }\n\n public ActiveView: 'grid' | 'chart' = 'grid';\n\n /** @deprecated Use {@link ActiveView}. */\n public get activeView(): 'grid' | 'chart' {\n return this.ActiveView;\n }\n /** @deprecated Use {@link ActiveView}. */\n public set activeView(value: 'grid' | 'chart') {\n this.ActiveView = value;\n }\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 /** @deprecated Use {@link ViewOptions}. */\n public get viewOptions() {\n return this.ViewOptions;\n }\n\n // Slide-in detail state\n public DetailOpen = false;\n\n /** @deprecated Use {@link DetailOpen}. */\n public get detailOpen() {\n return this.DetailOpen;\n }\n /** @deprecated Use {@link DetailOpen}. */\n public set detailOpen(value) {\n this.DetailOpen = value;\n }\n public DrawerWidthPx = 640;\n\n /** @deprecated Use {@link DrawerWidthPx}. */\n public get drawerWidthPx() {\n return this.DrawerWidthPx;\n }\n /** @deprecated Use {@link DrawerWidthPx}. */\n public set drawerWidthPx(value) {\n this.DrawerWidthPx = value;\n }\n public SelectedRow: PredictionGridRow | null = null;\n\n /** @deprecated Use {@link SelectedRow}. */\n public get selectedRow(): PredictionGridRow | null {\n return this.SelectedRow;\n }\n /** @deprecated Use {@link SelectedRow}. */\n public set selectedRow(value: PredictionGridRow | null) {\n this.SelectedRow = value;\n }\n public HistoryLoading = false;\n\n /** @deprecated Use {@link HistoryLoading}. */\n public get historyLoading() {\n return this.HistoryLoading;\n }\n /** @deprecated Use {@link HistoryLoading}. */\n public set historyLoading(value) {\n this.HistoryLoading = value;\n }\n public HistoryPoints: ModelScoreHistoryPoint[] = [];\n\n /** @deprecated Use {@link HistoryPoints}. */\n public get historyPoints(): ModelScoreHistoryPoint[] {\n return this.HistoryPoints;\n }\n /** @deprecated Use {@link HistoryPoints}. */\n public set historyPoints(value: ModelScoreHistoryPoint[]) {\n this.HistoryPoints = value;\n }\n\n public ResolvedEntityId: string | null = null;\n\n /** @deprecated Use {@link ResolvedEntityId}. */\n public get resolvedEntityId(): string | null {\n return this.ResolvedEntityId;\n }\n /** @deprecated Use {@link ResolvedEntityId}. */\n public set resolvedEntityId(value: string | null) {\n this.ResolvedEntityId = value;\n }\n public ResolvedEntityName: string | null = null;\n\n /** @deprecated Use {@link ResolvedEntityName}. */\n public get resolvedEntityName(): string | null {\n return this.ResolvedEntityName;\n }\n /** @deprecated Use {@link ResolvedEntityName}. */\n public set resolvedEntityName(value: string | null) {\n this.ResolvedEntityName = value;\n }\n\n public SubjectEntityName: string | null = null;\n\n /** @deprecated Use {@link SubjectEntityName}. */\n public get subjectEntityName(): string | null {\n return this.SubjectEntityName;\n }\n /** @deprecated Use {@link SubjectEntityName}. */\n public set subjectEntityName(value: string | null) {\n this.SubjectEntityName = value;\n }\n public SubjectRecordId: string | null = null;\n\n /** @deprecated Use {@link SubjectRecordId}. */\n public get subjectRecordId(): string | null {\n return this.SubjectRecordId;\n }\n /** @deprecated Use {@link SubjectRecordId}. */\n public set subjectRecordId(value: string | null) {\n this.SubjectRecordId = value;\n }\n public SubjectRecordName: string | null = null;\n\n /** @deprecated Use {@link SubjectRecordName}. */\n public get subjectRecordName(): string | null {\n return this.SubjectRecordName;\n }\n /** @deprecated Use {@link SubjectRecordName}. */\n public set subjectRecordName(value: string | null) {\n this.SubjectRecordName = value;\n }\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 /** @deprecated Use {@link ChartGridOptions}. */\n public get chartGridOptions(): GridOptions<PredictionGridRow> {\n return this.ChartGridOptions;\n }\n /** @deprecated Use {@link ChartGridOptions}. */\n public set chartGridOptions(value: GridOptions<PredictionGridRow>) {\n this.ChartGridOptions = value;\n }\n\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n minWidth: 80,\n };\n\n /** @deprecated Use {@link DefaultColDef}. */\n public get defaultColDef(): ColDef {\n return this.DefaultColDef;\n }\n /** @deprecated Use {@link DefaultColDef}. */\n public set defaultColDef(value: ColDef) {\n this.DefaultColDef = value;\n }\n\n /** True when the model's score is the probability of the good outcome, so risk is `1 - score` (e.g. a renewal model). */\n public IsRenewalModel = false;\n\n /** @deprecated Use {@link IsRenewalModel}. */\n public get isRenewalModel() {\n return this.IsRenewalModel;\n }\n /** @deprecated Use {@link IsRenewalModel}. */\n public set isRenewalModel(value) {\n this.IsRenewalModel = value;\n }\n public SelectedDecileIndex: number | null = null;\n\n /** @deprecated Use {@link SelectedDecileIndex}. */\n public get selectedDecileIndex(): number | null {\n return this.SelectedDecileIndex;\n }\n /** @deprecated Use {@link SelectedDecileIndex}. */\n public set selectedDecileIndex(value: number | null) {\n this.SelectedDecileIndex = value;\n }\n\n /**\n * True for a regression model. Risk bands are classification rules, so a regression model's tiers, row band, status and\n * badge come from its outcome bands on the raw value, and the risk column is hidden.\n */\n public get IsRegression(): boolean {\n return ProblemTypes.IsRegression(this.ProblemType);\n }\n\n /** @deprecated Use {@link IsRegression}. */\n public get isRegression(): boolean {\n return this.IsRegression;\n }\n\n public ColumnDefs: ColDef<PredictionGridRow>[] = [];\n\n /** @deprecated Use {@link ColumnDefs}. */\n public get columnDefs(): ColDef<PredictionGridRow>[] {\n return this.ColumnDefs;\n }\n /** @deprecated Use {@link ColumnDefs}. */\n public set columnDefs(value: ColDef<PredictionGridRow>[]) {\n this.ColumnDefs = value;\n }\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: 'status',\n headerName: statusLabel,\n width: 155,\n // The tier order: by risk for classification (the tiers are risk bands), by value for regression.\n comparator: (_a: string, _b: string, nodeA, nodeB): number =>\n this.IsRegression\n ? (nodeA.data?.score ?? 0) - (nodeB.data?.score ?? 0)\n : (nodeA.data?.riskPct ?? 0) - (nodeB.data?.riskPct ?? 0),\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 return `<span class=\"ps-badge ${badgeColor}\" title=\"${this.escapeHtml(scoreLabel)}: ${this.escapeHtml(params.data.scoreFormatted)}\">${icon}${label}</span>`;\n },\n },\n {\n field: 'riskPct',\n headerName: 'Risk',\n width: 95,\n // Risk is a classification measure (1 - score for a good-outcome model); a regression value has none.\n hide: this.IsRegression,\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string =>\n params.data ? `<span class=\"ps-mono\" data-testid=\"ps-risk-cell\">${params.data.riskPct}%</span>` : '',\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 // The arrow is the direction of RISK, not of the score column, so the tooltip says so.\n const title = `${label}: ${d.Up ? 'raises' : 'lowers'} risk`;\n return `<span class=\"ps-why-chip ${cls}\" title=\"${title}\"><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 /** @deprecated Use {@link SetupColumnDefs}. */\n public setupColumnDefs(): void {\n return this.SetupColumnDefs();\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 /** @deprecated Use {@link Reload}. */\n public async reload(): Promise<void> {\n return this.Reload();\n }\n\n private async loadPredictions(): Promise<void> {\n this.resetRunState();\n if (!this.modelId && !this.RunId) {\n this.applyFilter();\n return;\n }\n\n this.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n const provider = this.ProviderToUse;\n const user = provider.CurrentUser ?? undefined;\n const model = await this.loadModel();\n const effectiveRunId = this.RunId ?? (await this.resolveLatestRunId());\n if (!effectiveRunId) {\n this.applyFilter();\n this.RowsLoaded.emit({ Rows: [], Capped: false });\n return;\n }\n\n await this.resolveTargetEntity(model);\n\n // The run's process run details by keyset paging, read-only and only the columns the grid uses; throws on failure.\n const read = await PredictiveStudioEngine.Instance.LoadRunDetails(effectiveRunId, provider, user);\n this.applyModelOptions(model);\n const parsedAtRisk = AtRiskRules.ParseAtRiskRows(\n read.Rows.map((d) => ({ RecordID: d.RecordID, ResultPayload: d.ResultPayload })),\n { InvertedRisk: this.IsRenewalModel },\n );\n const detailByRecord = new Map<string, PSRunDetailRow>();\n for (const d of read.Rows) {\n detailByRecord.set(NormalizeUUID(d.RecordID), d);\n }\n this.AllRows = parsedAtRisk.map((r) => this.toGridRow(r, detailByRecord.get(NormalizeUUID(r.RecordID))));\n this.DetailRowsCapped = read.Capped;\n\n this.computeVisibleBands();\n this.applyFilter();\n this.RowsLoaded.emit({ Rows: parsedAtRisk, Capped: read.Capped });\n\n // 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 this.RowsLoadFailed.emit(this.loadError);\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Clears everything derived from the previous run, so a model or run switch never shows the old run's rows or notices. */\n private resetRunState(): void {\n this.AllRows = [];\n this.FilteredRows = [];\n this.VisibleBands = [];\n this.DetailRowsCapped = false;\n this.loadError = null;\n this.SelectedTier = 'all';\n this.SelectedDecileIndex = null;\n }\n\n /** The grid's model, or null when no model id is bound. */\n private async loadModel(): Promise<MJMLModelEntity | null> {\n if (!this.modelId) return null;\n const provider = this.ProviderToUse;\n const modelsRes = await RunView.FromMetadataProvider(provider).RunView<MJMLModelEntity>(\n {\n EntityName: 'MJ: ML Models',\n ExtraFilter: `ID = '${EscapeSQLString(this.modelId)}'`,\n MaxRows: 1,\n ResultType: 'entity_object',\n },\n provider.CurrentUser ?? undefined,\n );\n return modelsRes.Success && modelsRes.Results ? modelsRes.Results[0] ?? null : null;\n }\n\n /** The model's latest run when no run id is bound, or null when it has none. */\n private async resolveLatestRunId(): Promise<string | null> {\n if (!this.modelId) return null;\n const provider = this.ProviderToUse;\n const runs = await PredictiveStudioEngine.Instance.LoadRecentRunsForModel(this.modelId, provider, provider.CurrentUser ?? undefined, { maxRows: 1 });\n return runs[0]?.ID ?? null;\n }\n\n /** The model's problem type, outcome config and polarity: one rule (`BuildAtRiskOptions`), shared with the resource and the gate probe. */\n private applyModelOptions(model: MJMLModelEntity | null): void {\n if (model?.ProblemType) {\n this.ProblemType = model.ProblemType.toLowerCase();\n }\n const atRiskOptions = AtRiskRules.BuildAtRiskOptions(model ?? undefined);\n this.OutcomeConfig = atRiskOptions.OutcomeConfig;\n // A positive-polarity score is P(good outcome): risk is 1 - score, while the displayed score stays the model's own.\n this.IsRenewalModel = atRiskOptions.InvertedRisk === true;\n this.SetupColumnDefs();\n }\n\n /** One displayed row: the model's own score, its risk, and its tier (risk band, or outcome band for regression). */\n private toGridRow(r: AtRiskRow, detail: PSRunDetailRow | undefined): PredictionGridRow {\n const dt = detail?.CompletedAt ?? detail?.__mj_CreatedAt ?? null;\n const tier = this.tierFor(r);\n return {\n recordId: r.RecordID,\n recordName: r.Label || r.RecordID,\n score: r.Score,\n scoreFormatted: formatPredictionScore(r.Score, this.OutcomeConfig, this.ProblemType),\n riskPct: r.RiskPct,\n band: tier.Key,\n badgeColor: tier.BadgeColor,\n icon: tier.Icon,\n class: r.Class,\n drivers: r.Drivers || [],\n status: tier.Label,\n scoredAtDate: dt instanceof Date ? dt : dt ? new Date(dt) : null,\n };\n }\n\n /**\n * A row's tier. Classification: the risk band Core put on the row, so \"High\" is the riskiest records whatever the\n * polarity. Regression: the outcome band of the raw value (risk bands do not apply to a value such as an LTV).\n */\n private tierFor(r: AtRiskRow): RowTier {\n if (!this.IsRegression) {\n return { Key: r.Band, Label: r.Status, BadgeColor: r.BadgeColor, Icon: r.Icon };\n }\n const band = ResolveScoreBand(r.Score, this.OutcomeConfig);\n return band ? { Key: band.Key, Label: band.Label, BadgeColor: band.BadgeColor, Icon: band.Icon } : PSPredictionsGridComponent.unbandedTier;\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 = '${EscapeSQLString(model.PipelineID)}'`,\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 /** @deprecated Use {@link ScheduleVisibleRowsLookup}. */\n public scheduleVisibleRowsLookup(delayMs: number = 60): void {\n return this.ScheduleVisibleRowsLookup(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 /** @deprecated Use {@link OnGridReady}. */\n public onGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n return this.OnGridReady(event);\n }\n\n public OnChartGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n this.chartGridApi = event.api;\n this.ScheduleVisibleRowsLookup(50);\n }\n\n /** @deprecated Use {@link OnChartGridReady}. */\n public onChartGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n return this.OnChartGridReady(event);\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 /** @deprecated Use {@link OnCellClicked}. */\n public onCellClicked(event: CellClickedEvent<PredictionGridRow>): void {\n return this.OnCellClicked(event);\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 /** @deprecated Use {@link OnRowClicked}. */\n public onRowClicked(event: RowClickedEvent<PredictionGridRow>): void {\n return this.OnRowClicked(event);\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 /** @deprecated Use {@link OnSearchInput}. */\n public onSearchInput(event: Event): void {\n return this.OnSearchInput(event);\n }\n\n public SetTier(tier: string): void {\n this.SelectedTier = tier;\n this.applyFilter();\n }\n\n /** @deprecated Use {@link SetTier}. */\n public setTier(tier: string): void {\n return this.SetTier(tier);\n }\n\n public SetTierAndGrid(tier: string): void {\n this.SelectedTier = tier;\n this.ActiveView = 'grid';\n this.applyFilter();\n }\n\n /** @deprecated Use {@link SetTierAndGrid}. */\n public setTierAndGrid(tier: string): void {\n return this.SetTierAndGrid(tier);\n }\n\n public GetOutcomeBadgeClass(className: string | null | undefined): string {\n return resolveOutcomeStyle(className, this.OutcomeConfig).BadgeColor;\n }\n\n /** @deprecated Use {@link GetOutcomeBadgeClass}. */\n public getOutcomeBadgeClass(className: string | null | undefined): string {\n return this.GetOutcomeBadgeClass(className);\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 /** @deprecated Use {@link GetBadgeColorVar}. */\n public getBadgeColorVar(color: string): string {\n return this.GetBadgeColorVar(color);\n }\n\n /**\n * The tier chips and KPI cards, each with its tier's average model score. Classification: one per risk band (the\n * at-risk list's tiers). Regression: one per configured outcome band, plus any tier a row landed in outside them.\n */\n private computeVisibleBands(): void {\n const tiers: RowTier[] = this.IsRegression ? this.regressionTiers() : AtRiskRules.RiskBands.map((b) => ({ Key: b.Key, Label: b.Label, BadgeColor: b.BadgeColor, Icon: b.Icon }));\n this.VisibleBands = tiers.map((t) => this.summarizeTier(t));\n }\n\n /** The configured outcome bands, then each other tier the rows carry (e.g. values outside every band), in row order. */\n private regressionTiers(): RowTier[] {\n const tiers: RowTier[] = (this.OutcomeConfig.Bands ?? []).map((b) => ({ Key: b.Key, Label: b.Label, BadgeColor: b.BadgeColor, Icon: b.Icon }));\n const known = new Set(tiers.map((t) => t.Key));\n for (const r of this.AllRows) {\n if (!known.has(r.band)) {\n known.add(r.band);\n tiers.push({ Key: r.band, Label: r.status, BadgeColor: r.badgeColor || 'gray', Icon: r.icon });\n }\n }\n return tiers;\n }\n\n /** A tier's chip / KPI card: its row count, share and average model score. */\n private summarizeTier(t: RowTier): VisibleBandSummary {\n const total = this.AllRows.length;\n const matching = this.AllRows.filter((r) => r.band === t.Key);\n const count = matching.length;\n const rawAvg = count > 0 ? matching.reduce((sum, r) => sum + r.score, 0) / count : 0;\n return {\n key: t.Key,\n label: t.Label,\n count,\n pct: total > 0 ? Math.round((count / total) * 100) : 0,\n avgScore: Math.round(rawAvg * 100),\n avgScoreFormatted: formatPredictionScore(rawAvg, this.OutcomeConfig, this.ProblemType),\n badgeColor: t.BadgeColor,\n icon: t.Icon,\n };\n }\n\n public OnViewToggle(key: string): void {\n this.ActiveView = key === 'chart' ? 'chart' : 'grid';\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnViewToggle}. */\n public onViewToggle(key: string): void {\n return this.OnViewToggle(key);\n }\n\n public ClearSearch(): void {\n this.SearchText = '';\n this.applyFilter();\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n public clearSearch(): void {\n return this.ClearSearch();\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 /** @deprecated Use {@link SelectDecile}. */\n public selectDecile(idx: number): void {\n return this.SelectDecile(idx);\n }\n\n public ClearDecileFilter(): void {\n this.SelectedDecileIndex = null;\n this.applyFilter();\n }\n\n /** @deprecated Use {@link ClearDecileFilter}. */\n public clearDecileFilter(): void {\n return this.ClearDecileFilter();\n }\n\n /** The selected tier's label for the footer (\"High risk\", or an outcome band's label), empty when all tiers show. */\n public get SelectedTierLabel(): string {\n if (this.SelectedTier === 'all') return '';\n return this.VisibleBands.find((b) => b.key === this.SelectedTier)?.label ?? this.SelectedTier;\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 /** @deprecated Use {@link SelectedDecileLabel}. */\n public get selectedDecileLabel(): string {\n return this.SelectedDecileLabel;\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 /** @deprecated Use {@link DrillThrough}. */\n public drillThrough(row: PredictionGridRow): void {\n return this.DrillThrough(row);\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 /** @deprecated Use {@link OnDrawerWidthChanged}. */\n public onDrawerWidthChanged(width: number): void {\n return this.OnDrawerWidthChanged(width);\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 /** @deprecated Use {@link OpenDetail}. */\n public openDetail(row: PredictionGridRow): void {\n return this.OpenDetail(row);\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 /** @deprecated Use {@link CloseDetail}. */\n public closeDetail(): void {\n return this.CloseDetail();\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 /** @deprecated Use {@link OpenSubjectRecord}. */\n public openSubjectRecord(): void {\n return this.OpenSubjectRecord();\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} = '${EscapeSQLString(recordId)}'`, // 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 InvertedRisk: this.IsRenewalModel,\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 /** @deprecated Use {@link EntityDisplayName}. */\n public get entityDisplayName(): string {\n return this.EntityDisplayName;\n }\n\n // ── KPI & Chart Computations ──\n\n public get HighCount(): number {\n return this.AllRows.filter((r) => r.band === 'high').length;\n }\n\n /** @deprecated Use {@link HighCount}. */\n public get highCount(): number {\n return this.HighCount;\n }\n public get MediumCount(): number {\n return this.AllRows.filter((r) => r.band === 'medium').length;\n }\n\n /** @deprecated Use {@link MediumCount}. */\n public get mediumCount(): number {\n return this.MediumCount;\n }\n public get LowCount(): number {\n return this.AllRows.filter((r) => r.band === 'low').length;\n }\n\n /** @deprecated Use {@link LowCount}. */\n public get lowCount(): number {\n return this.LowCount;\n }\n\n public get HighPct(): number {\n return this.AllRows.length > 0 ? Math.round((this.HighCount / this.AllRows.length) * 100) : 0;\n }\n\n /** @deprecated Use {@link HighPct}. */\n public get highPct(): number {\n return this.HighPct;\n }\n public get MediumPct(): number {\n return this.AllRows.length > 0 ? Math.round((this.MediumCount / this.AllRows.length) * 100) : 0;\n }\n\n /** @deprecated Use {@link MediumPct}. */\n public get mediumPct(): number {\n return this.MediumPct;\n }\n public get LowPct(): number {\n return this.AllRows.length > 0 ? Math.round((this.LowCount / this.AllRows.length) * 100) : 0;\n }\n\n /** @deprecated Use {@link LowPct}. */\n public get lowPct(): number {\n return this.LowPct;\n }\n\n public get HighAvg(): number {\n return this.HighAvgRisk;\n }\n\n /** @deprecated Use {@link HighAvg}. */\n public get highAvg(): number {\n return this.HighAvg;\n }\n public get MediumAvg(): number {\n return this.MediumAvgRisk;\n }\n\n /** @deprecated Use {@link MediumAvg}. */\n public get mediumAvg(): number {\n return this.MediumAvg;\n }\n public get LowAvg(): number {\n return this.LowAvgRisk;\n }\n\n /** @deprecated Use {@link LowAvg}. */\n public get lowAvg(): number {\n return this.LowAvg;\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\n /** @deprecated Use {@link HighAvgRisk}. */\n public get highAvgRisk(): number {\n return this.HighAvgRisk;\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\n /** @deprecated Use {@link MediumAvgRisk}. */\n public get mediumAvgRisk(): number {\n return this.MediumAvgRisk;\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 /** @deprecated Use {@link LowAvgRisk}. */\n public get lowAvgRisk(): number {\n return this.LowAvgRisk;\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 /** @deprecated Use {@link MeanScorePct}. */\n public get meanScorePct(): number {\n return this.MeanScorePct;\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 /** @deprecated Use {@link MeanScoreFormatted}. */\n public get meanScoreFormatted(): string {\n return this.MeanScoreFormatted;\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 /** @deprecated Use {@link HistogramBins}. */\n public get histogramBins(): HistogramBin[] {\n return this.HistogramBins;\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 /** @deprecated Use {@link ClassBreakdown}. */\n public get classBreakdown(): ClassShare[] {\n return this.ClassBreakdown;\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 /** @deprecated Use {@link TrendlinePlotPoints}. */\n public get trendlinePlotPoints(): TrendlinePlotPoint[] {\n return this.TrendlinePlotPoints;\n }\n\n public get TrendlineLinePoints(): string {\n return this.TrendlinePlotPoints.map((p) => `${p.x},${p.y}`).join(' ');\n }\n\n /** @deprecated Use {@link TrendlineLinePoints}. */\n public get trendlineLinePoints(): string {\n return this.TrendlineLinePoints;\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 /** @deprecated Use {@link TrendlineAreaPoints}. */\n public get trendlineAreaPoints(): string {\n return this.TrendlineAreaPoints;\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 (+ raises risk, − lowers risk)', 'Scored At'];\n // Quoted: the drivers header carries a comma.\n const lines = [headers.map((h) => `\"${h.replace(/\"/g, '\"\"')}\"`).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 /** @deprecated Use {@link ExportCSV}. */\n public exportCSV(): void {\n return this.ExportCSV();\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 {{ SelectedTierLabel }}{{ searchText ? ' query \"' + searchText + '\"' : '' }}</span>\n }\n @if (DetailRowsCapped) {\n <span class=\"ps-muted\" data-testid=\"ps-predictions-capped\">Showing the first {{ MaxRunDetailRowsLabel }} predictions</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> Factors behind this score (associations, not causes)\n </div>\n <ps-row-drivers [Drivers]=\"selectedRow.drivers\"></ps-row-drivers>\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"]}
|
|
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 EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\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 { EscapeSQLString, NormalizeUUID, UUIDsEqual } from '@memberjunction/global';\nimport { 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 AtRiskRules,\n ProblemTypes,\n type AtRiskRow,\n type RowDriver,\n type OutcomeConfig,\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, type PSRunDetailRow } from '../engine/predictive-studio.engine';\nimport { PSRowDriversComponent } from './ps-row-drivers.component';\n\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/** One displayed prediction row in the unified grid. */\nexport interface PredictionGridRow {\n recordId: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n recordName: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n score: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n scoreFormatted: string; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n riskPct: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n band: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n badgeColor?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n icon?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n class: string | null; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n drivers: RowDriver[]; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n status: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n scoredAtDate: Date | null; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n}\n\n/** Summary of one dynamic outcome band for toolbar filtering and KPI cards. */\nexport interface VisibleBandSummary {\n key: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n label: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n count: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n pct: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n avgScore: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n avgScoreFormatted: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n badgeColor: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n icon?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n description?: string; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\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/** The tier a row is shown in: its key (filter and count), status label, badge colour and icon. */\ninterface RowTier {\n Key: string;\n Label: string;\n BadgeColor: string;\n Icon?: string;\n}\n\n/** {@link PSPredictionsGridComponent.RowsLoaded}'s payload: the parsed at-risk rows of the run the grid shows. */\nexport interface PredictionGridRowsLoadedEvent {\n /** The run's at-risk rows, highest risk first, exactly as the grid parsed them. */\n Rows: AtRiskRow[];\n /** True when the run has more predictions than {@link PredictiveStudioEngine.MaxRunDetailRows}; `Rows` holds the first ones. */\n Capped: boolean;\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 PSRowDriversComponent,\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\n /** @deprecated Use {@link RunId}. */\n @Input() set runId(value: string | null) {\n this.RunId = value;\n }\n /** @deprecated Use {@link RunId}. */\n get runId(): string | null {\n return this.RunId;\n }\n @Input() entityName: string | null = null;\n @Input() ProblemType: string | null = 'classification';\n\n /** @deprecated Use {@link ProblemType}. */\n @Input() set problemType(value: string | null) {\n this.ProblemType = value;\n }\n /** @deprecated Use {@link ProblemType}. */\n get problemType(): string | null {\n return this.ProblemType;\n }\n @Input() title: string | null = null;\n @Input() height = '560px';\n @Input() ReadOnly = false;\n\n /** @deprecated Use {@link ReadOnly}. */\n @Input() set readOnly(value: PSPredictionsGridComponent['ReadOnly']) {\n this.ReadOnly = value;\n }\n /** @deprecated Use {@link ReadOnly}. */\n get readOnly(): PSPredictionsGridComponent['ReadOnly'] {\n return this.ReadOnly;\n }\n\n /**\n * Emitted after the grid parses a run, with the run's at-risk rows. A host that needs the rows (counts, export, a list)\n * takes them from here rather than reading the run a second time. Also emitted, empty, when the model has no run.\n */\n @Output() RowsLoaded = new EventEmitter<PredictionGridRowsLoadedEvent>();\n /** Emitted with the error message when the run's predictions fail to load. */\n @Output() RowsLoadFailed = new EventEmitter<string>();\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 /** The run-detail cap, formatted for the footer notice. */\n public readonly MaxRunDetailRowsLabel = PredictiveStudioEngine.MaxRunDetailRowsLabel;\n\n /** The tier of a regression row whose value falls in none of the outcome bands. */\n private static readonly unbandedTier: RowTier = { Key: 'unbanded', Label: 'No band', BadgeColor: 'gray' };\n\n public isLoading = false;\n public loadError: string | null = null;\n /** True when the run has more predictions than {@link PredictiveStudioEngine.MaxRunDetailRows}; only the first are shown. */\n public DetailRowsCapped = false;\n\n public AllRows: PredictionGridRow[] = [];\n\n /** @deprecated Use {@link AllRows}. */\n public get allRows(): PredictionGridRow[] {\n return this.AllRows;\n }\n /** @deprecated Use {@link AllRows}. */\n public set allRows(value: PredictionGridRow[]) {\n this.AllRows = value;\n }\n public FilteredRows: PredictionGridRow[] = [];\n\n /** @deprecated Use {@link FilteredRows}. */\n public get filteredRows(): PredictionGridRow[] {\n return this.FilteredRows;\n }\n /** @deprecated Use {@link FilteredRows}. */\n public set filteredRows(value: PredictionGridRow[]) {\n this.FilteredRows = value;\n }\n\n public SearchText = '';\n\n /** @deprecated Use {@link SearchText}. */\n public get searchText() {\n return this.SearchText;\n }\n /** @deprecated Use {@link SearchText}. */\n public set searchText(value) {\n this.SearchText = value;\n }\n public SelectedTier: string = 'all';\n\n /** @deprecated Use {@link SelectedTier}. */\n public get selectedTier(): string {\n return this.SelectedTier;\n }\n /** @deprecated Use {@link SelectedTier}. */\n public set selectedTier(value: string) {\n this.SelectedTier = value;\n }\n public OutcomeConfig: OutcomeConfig = resolveOutcomeConfig();\n\n /** @deprecated Use {@link OutcomeConfig}. */\n public get outcomeConfig(): OutcomeConfig {\n return this.OutcomeConfig;\n }\n /** @deprecated Use {@link OutcomeConfig}. */\n public set outcomeConfig(value: OutcomeConfig) {\n this.OutcomeConfig = value;\n }\n public VisibleBands: VisibleBandSummary[] = [];\n\n /** @deprecated Use {@link VisibleBands}. */\n public get visibleBands(): VisibleBandSummary[] {\n return this.VisibleBands;\n }\n /** @deprecated Use {@link VisibleBands}. */\n public set visibleBands(value: VisibleBandSummary[]) {\n this.VisibleBands = value;\n }\n\n public ActiveView: 'grid' | 'chart' = 'grid';\n\n /** @deprecated Use {@link ActiveView}. */\n public get activeView(): 'grid' | 'chart' {\n return this.ActiveView;\n }\n /** @deprecated Use {@link ActiveView}. */\n public set activeView(value: 'grid' | 'chart') {\n this.ActiveView = value;\n }\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 /** @deprecated Use {@link ViewOptions}. */\n public get viewOptions() {\n return this.ViewOptions;\n }\n\n // Slide-in detail state\n public DetailOpen = false;\n\n /** @deprecated Use {@link DetailOpen}. */\n public get detailOpen() {\n return this.DetailOpen;\n }\n /** @deprecated Use {@link DetailOpen}. */\n public set detailOpen(value) {\n this.DetailOpen = value;\n }\n public DrawerWidthPx = 640;\n\n /** @deprecated Use {@link DrawerWidthPx}. */\n public get drawerWidthPx() {\n return this.DrawerWidthPx;\n }\n /** @deprecated Use {@link DrawerWidthPx}. */\n public set drawerWidthPx(value) {\n this.DrawerWidthPx = value;\n }\n public SelectedRow: PredictionGridRow | null = null;\n\n /** @deprecated Use {@link SelectedRow}. */\n public get selectedRow(): PredictionGridRow | null {\n return this.SelectedRow;\n }\n /** @deprecated Use {@link SelectedRow}. */\n public set selectedRow(value: PredictionGridRow | null) {\n this.SelectedRow = value;\n }\n public HistoryLoading = false;\n\n /** @deprecated Use {@link HistoryLoading}. */\n public get historyLoading() {\n return this.HistoryLoading;\n }\n /** @deprecated Use {@link HistoryLoading}. */\n public set historyLoading(value) {\n this.HistoryLoading = value;\n }\n public HistoryPoints: ModelScoreHistoryPoint[] = [];\n\n /** @deprecated Use {@link HistoryPoints}. */\n public get historyPoints(): ModelScoreHistoryPoint[] {\n return this.HistoryPoints;\n }\n /** @deprecated Use {@link HistoryPoints}. */\n public set historyPoints(value: ModelScoreHistoryPoint[]) {\n this.HistoryPoints = value;\n }\n\n public ResolvedEntityId: string | null = null;\n\n /** @deprecated Use {@link ResolvedEntityId}. */\n public get resolvedEntityId(): string | null {\n return this.ResolvedEntityId;\n }\n /** @deprecated Use {@link ResolvedEntityId}. */\n public set resolvedEntityId(value: string | null) {\n this.ResolvedEntityId = value;\n }\n public ResolvedEntityName: string | null = null;\n\n /** @deprecated Use {@link ResolvedEntityName}. */\n public get resolvedEntityName(): string | null {\n return this.ResolvedEntityName;\n }\n /** @deprecated Use {@link ResolvedEntityName}. */\n public set resolvedEntityName(value: string | null) {\n this.ResolvedEntityName = value;\n }\n\n public SubjectEntityName: string | null = null;\n\n /** @deprecated Use {@link SubjectEntityName}. */\n public get subjectEntityName(): string | null {\n return this.SubjectEntityName;\n }\n /** @deprecated Use {@link SubjectEntityName}. */\n public set subjectEntityName(value: string | null) {\n this.SubjectEntityName = value;\n }\n public SubjectRecordId: string | null = null;\n\n /** @deprecated Use {@link SubjectRecordId}. */\n public get subjectRecordId(): string | null {\n return this.SubjectRecordId;\n }\n /** @deprecated Use {@link SubjectRecordId}. */\n public set subjectRecordId(value: string | null) {\n this.SubjectRecordId = value;\n }\n public SubjectRecordName: string | null = null;\n\n /** @deprecated Use {@link SubjectRecordName}. */\n public get subjectRecordName(): string | null {\n return this.SubjectRecordName;\n }\n /** @deprecated Use {@link SubjectRecordName}. */\n public set subjectRecordName(value: string | null) {\n this.SubjectRecordName = value;\n }\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 /** @deprecated Use {@link ChartGridOptions}. */\n public get chartGridOptions(): GridOptions<PredictionGridRow> {\n return this.ChartGridOptions;\n }\n /** @deprecated Use {@link ChartGridOptions}. */\n public set chartGridOptions(value: GridOptions<PredictionGridRow>) {\n this.ChartGridOptions = value;\n }\n\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n minWidth: 80,\n };\n\n /** @deprecated Use {@link DefaultColDef}. */\n public get defaultColDef(): ColDef {\n return this.DefaultColDef;\n }\n /** @deprecated Use {@link DefaultColDef}. */\n public set defaultColDef(value: ColDef) {\n this.DefaultColDef = value;\n }\n\n /** True when the model's score is the probability of the good outcome, so risk is `1 - score` (e.g. a renewal model). */\n public IsRenewalModel = false;\n\n /** @deprecated Use {@link IsRenewalModel}. */\n public get isRenewalModel() {\n return this.IsRenewalModel;\n }\n /** @deprecated Use {@link IsRenewalModel}. */\n public set isRenewalModel(value) {\n this.IsRenewalModel = value;\n }\n public SelectedDecileIndex: number | null = null;\n\n /** @deprecated Use {@link SelectedDecileIndex}. */\n public get selectedDecileIndex(): number | null {\n return this.SelectedDecileIndex;\n }\n /** @deprecated Use {@link SelectedDecileIndex}. */\n public set selectedDecileIndex(value: number | null) {\n this.SelectedDecileIndex = value;\n }\n\n /**\n * True for a regression model. Risk bands are classification rules, so a regression model's tiers, row band, status and\n * badge come from its outcome bands on the raw value, and the risk column is hidden.\n */\n public get IsRegression(): boolean {\n return ProblemTypes.IsRegression(this.ProblemType);\n }\n\n /** @deprecated Use {@link IsRegression}. */\n public get isRegression(): boolean {\n return this.IsRegression;\n }\n\n public ColumnDefs: ColDef<PredictionGridRow>[] = [];\n\n /** @deprecated Use {@link ColumnDefs}. */\n public get columnDefs(): ColDef<PredictionGridRow>[] {\n return this.ColumnDefs;\n }\n /** @deprecated Use {@link ColumnDefs}. */\n public set columnDefs(value: ColDef<PredictionGridRow>[]) {\n this.ColumnDefs = value;\n }\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: 'status',\n headerName: statusLabel,\n width: 155,\n // The tier order: by risk for classification (the tiers are risk bands), by value for regression.\n comparator: (_a: string, _b: string, nodeA, nodeB): number =>\n this.IsRegression\n ? (nodeA.data?.score ?? 0) - (nodeB.data?.score ?? 0)\n : (nodeA.data?.riskPct ?? 0) - (nodeB.data?.riskPct ?? 0),\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 return `<span class=\"ps-badge ${badgeColor}\" title=\"${this.escapeHtml(scoreLabel)}: ${this.escapeHtml(params.data.scoreFormatted)}\">${icon}${label}</span>`;\n },\n },\n {\n field: 'riskPct',\n headerName: 'Risk',\n width: 95,\n // Risk is a classification measure (1 - score for a good-outcome model); a regression value has none.\n hide: this.IsRegression,\n cellRenderer: (params: ICellRendererParams<PredictionGridRow>): string =>\n params.data ? `<span class=\"ps-mono\" data-testid=\"ps-risk-cell\">${params.data.riskPct}%</span>` : '',\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 // The arrow is the direction of RISK, not of the score column, so the tooltip says so.\n const title = `${label}: ${d.Up ? 'raises' : 'lowers'} risk`;\n return `<span class=\"ps-why-chip ${cls}\" title=\"${title}\"><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 /** @deprecated Use {@link SetupColumnDefs}. */\n public setupColumnDefs(): void {\n return this.SetupColumnDefs();\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 /** @deprecated Use {@link Reload}. */\n public async reload(): Promise<void> {\n return this.Reload();\n }\n\n private async loadPredictions(): Promise<void> {\n this.resetRunState();\n if (!this.modelId && !this.RunId) {\n this.applyFilter();\n return;\n }\n\n this.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n const provider = this.ProviderToUse;\n const user = provider.CurrentUser ?? undefined;\n const model = await this.loadModel();\n const effectiveRunId = this.RunId ?? (await this.resolveLatestRunId());\n if (!effectiveRunId) {\n this.applyFilter();\n this.RowsLoaded.emit({ Rows: [], Capped: false });\n return;\n }\n\n await this.resolveTargetEntity(model);\n\n // The run's process run details by keyset paging, read-only and only the columns the grid uses; throws on failure.\n const read = await PredictiveStudioEngine.Instance.LoadRunDetails(effectiveRunId, provider, user);\n this.applyModelOptions(model);\n const parsedAtRisk = AtRiskRules.ParseAtRiskRows(\n read.Rows.map((d) => ({ RecordID: d.RecordID, ResultPayload: d.ResultPayload })),\n { InvertedRisk: this.IsRenewalModel },\n );\n const detailByRecord = new Map<string, PSRunDetailRow>();\n for (const d of read.Rows) {\n detailByRecord.set(NormalizeUUID(d.RecordID), d);\n }\n this.AllRows = parsedAtRisk.map((r) => this.toGridRow(r, detailByRecord.get(NormalizeUUID(r.RecordID))));\n this.DetailRowsCapped = read.Capped;\n\n this.computeVisibleBands();\n this.applyFilter();\n this.RowsLoaded.emit({ Rows: parsedAtRisk, Capped: read.Capped });\n\n // 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 this.RowsLoadFailed.emit(this.loadError);\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Clears everything derived from the previous run, so a model or run switch never shows the old run's rows or notices. */\n private resetRunState(): void {\n this.AllRows = [];\n this.FilteredRows = [];\n this.VisibleBands = [];\n this.DetailRowsCapped = false;\n this.loadError = null;\n this.SelectedTier = 'all';\n this.SelectedDecileIndex = null;\n }\n\n /** The grid's model, or null when no model id is bound. */\n private async loadModel(): Promise<MJMLModelEntity | null> {\n if (!this.modelId) return null;\n const provider = this.ProviderToUse;\n const modelsRes = await RunView.FromMetadataProvider(provider).RunView<MJMLModelEntity>(\n {\n EntityName: 'MJ: ML Models',\n ExtraFilter: `ID = '${EscapeSQLString(this.modelId)}'`,\n MaxRows: 1,\n SkipTotalRowCount: true,\n ResultType: 'entity_object',\n },\n provider.CurrentUser ?? undefined,\n );\n return modelsRes.Success && modelsRes.Results ? modelsRes.Results[0] ?? null : null;\n }\n\n /** The model's latest run when no run id is bound, or null when it has none. */\n private async resolveLatestRunId(): Promise<string | null> {\n if (!this.modelId) return null;\n const provider = this.ProviderToUse;\n const runs = await PredictiveStudioEngine.Instance.LoadRecentRunsForModel(this.modelId, provider, provider.CurrentUser ?? undefined, { maxRows: 1 });\n return runs[0]?.ID ?? null;\n }\n\n /** The model's problem type, outcome config and polarity: one rule (`BuildAtRiskOptions`), shared with the resource and the gate probe. */\n private applyModelOptions(model: MJMLModelEntity | null): void {\n if (model?.ProblemType) {\n this.ProblemType = model.ProblemType.toLowerCase();\n }\n const atRiskOptions = AtRiskRules.BuildAtRiskOptions(model ?? undefined);\n this.OutcomeConfig = atRiskOptions.OutcomeConfig;\n // A positive-polarity score is P(good outcome): risk is 1 - score, while the displayed score stays the model's own.\n this.IsRenewalModel = atRiskOptions.InvertedRisk === true;\n this.SetupColumnDefs();\n }\n\n /** One displayed row: the model's own score, its risk, and its tier (risk band, or outcome band for regression). */\n private toGridRow(r: AtRiskRow, detail: PSRunDetailRow | undefined): PredictionGridRow {\n const dt = detail?.CompletedAt ?? detail?.__mj_CreatedAt ?? null;\n const tier = this.tierFor(r);\n return {\n recordId: r.RecordID,\n recordName: r.Label || r.RecordID,\n score: r.Score,\n scoreFormatted: formatPredictionScore(r.Score, this.OutcomeConfig, this.ProblemType),\n riskPct: r.RiskPct,\n band: tier.Key,\n badgeColor: tier.BadgeColor,\n icon: tier.Icon,\n class: r.Class,\n drivers: r.Drivers || [],\n status: tier.Label,\n scoredAtDate: dt instanceof Date ? dt : dt ? new Date(dt) : null,\n };\n }\n\n /**\n * A row's tier. Classification: the risk band Core put on the row, so \"High\" is the riskiest records whatever the\n * polarity. Regression: the outcome band of the raw value (risk bands do not apply to a value such as an LTV).\n */\n private tierFor(r: AtRiskRow): RowTier {\n if (!this.IsRegression) {\n return { Key: r.Band, Label: r.Status, BadgeColor: r.BadgeColor, Icon: r.Icon };\n }\n const band = ResolveScoreBand(r.Score, this.OutcomeConfig);\n return band ? { Key: band.Key, Label: band.Label, BadgeColor: band.BadgeColor, Icon: band.Icon } : PSPredictionsGridComponent.unbandedTier;\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 = '${EscapeSQLString(model.PipelineID)}'`,\n MaxRows: 1,\n SkipTotalRowCount: true,\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 /** @deprecated Use {@link ScheduleVisibleRowsLookup}. */\n public scheduleVisibleRowsLookup(delayMs: number = 60): void {\n return this.ScheduleVisibleRowsLookup(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 /** @deprecated Use {@link OnGridReady}. */\n public onGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n return this.OnGridReady(event);\n }\n\n public OnChartGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n this.chartGridApi = event.api;\n this.ScheduleVisibleRowsLookup(50);\n }\n\n /** @deprecated Use {@link OnChartGridReady}. */\n public onChartGridReady(event: GridReadyEvent<PredictionGridRow>): void {\n return this.OnChartGridReady(event);\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 /** @deprecated Use {@link OnCellClicked}. */\n public onCellClicked(event: CellClickedEvent<PredictionGridRow>): void {\n return this.OnCellClicked(event);\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 /** @deprecated Use {@link OnRowClicked}. */\n public onRowClicked(event: RowClickedEvent<PredictionGridRow>): void {\n return this.OnRowClicked(event);\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 /** @deprecated Use {@link OnSearchInput}. */\n public onSearchInput(event: Event): void {\n return this.OnSearchInput(event);\n }\n\n public SetTier(tier: string): void {\n this.SelectedTier = tier;\n this.applyFilter();\n }\n\n /** @deprecated Use {@link SetTier}. */\n public setTier(tier: string): void {\n return this.SetTier(tier);\n }\n\n public SetTierAndGrid(tier: string): void {\n this.SelectedTier = tier;\n this.ActiveView = 'grid';\n this.applyFilter();\n }\n\n /** @deprecated Use {@link SetTierAndGrid}. */\n public setTierAndGrid(tier: string): void {\n return this.SetTierAndGrid(tier);\n }\n\n public GetOutcomeBadgeClass(className: string | null | undefined): string {\n return resolveOutcomeStyle(className, this.OutcomeConfig).BadgeColor;\n }\n\n /** @deprecated Use {@link GetOutcomeBadgeClass}. */\n public getOutcomeBadgeClass(className: string | null | undefined): string {\n return this.GetOutcomeBadgeClass(className);\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 /** @deprecated Use {@link GetBadgeColorVar}. */\n public getBadgeColorVar(color: string): string {\n return this.GetBadgeColorVar(color);\n }\n\n /**\n * The tier chips and KPI cards, each with its tier's average model score. Classification: one per risk band (the\n * at-risk list's tiers). Regression: one per configured outcome band, plus any tier a row landed in outside them.\n */\n private computeVisibleBands(): void {\n const tiers: RowTier[] = this.IsRegression ? this.regressionTiers() : AtRiskRules.RiskBands.map((b) => ({ Key: b.Key, Label: b.Label, BadgeColor: b.BadgeColor, Icon: b.Icon }));\n this.VisibleBands = tiers.map((t) => this.summarizeTier(t));\n }\n\n /** The configured outcome bands, then each other tier the rows carry (e.g. values outside every band), in row order. */\n private regressionTiers(): RowTier[] {\n const tiers: RowTier[] = (this.OutcomeConfig.Bands ?? []).map((b) => ({ Key: b.Key, Label: b.Label, BadgeColor: b.BadgeColor, Icon: b.Icon }));\n const known = new Set(tiers.map((t) => t.Key));\n for (const r of this.AllRows) {\n if (!known.has(r.band)) {\n known.add(r.band);\n tiers.push({ Key: r.band, Label: r.status, BadgeColor: r.badgeColor || 'gray', Icon: r.icon });\n }\n }\n return tiers;\n }\n\n /** A tier's chip / KPI card: its row count, share and average model score. */\n private summarizeTier(t: RowTier): VisibleBandSummary {\n const total = this.AllRows.length;\n const matching = this.AllRows.filter((r) => r.band === t.Key);\n const count = matching.length;\n const rawAvg = count > 0 ? matching.reduce((sum, r) => sum + r.score, 0) / count : 0;\n return {\n key: t.Key,\n label: t.Label,\n count,\n pct: total > 0 ? Math.round((count / total) * 100) : 0,\n avgScore: Math.round(rawAvg * 100),\n avgScoreFormatted: formatPredictionScore(rawAvg, this.OutcomeConfig, this.ProblemType),\n badgeColor: t.BadgeColor,\n icon: t.Icon,\n };\n }\n\n public OnViewToggle(key: string): void {\n this.ActiveView = key === 'chart' ? 'chart' : 'grid';\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnViewToggle}. */\n public onViewToggle(key: string): void {\n return this.OnViewToggle(key);\n }\n\n public ClearSearch(): void {\n this.SearchText = '';\n this.applyFilter();\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n public clearSearch(): void {\n return this.ClearSearch();\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 /** @deprecated Use {@link SelectDecile}. */\n public selectDecile(idx: number): void {\n return this.SelectDecile(idx);\n }\n\n public ClearDecileFilter(): void {\n this.SelectedDecileIndex = null;\n this.applyFilter();\n }\n\n /** @deprecated Use {@link ClearDecileFilter}. */\n public clearDecileFilter(): void {\n return this.ClearDecileFilter();\n }\n\n /** The selected tier's label for the footer (\"High risk\", or an outcome band's label), empty when all tiers show. */\n public get SelectedTierLabel(): string {\n if (this.SelectedTier === 'all') return '';\n return this.VisibleBands.find((b) => b.key === this.SelectedTier)?.label ?? this.SelectedTier;\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 /** @deprecated Use {@link SelectedDecileLabel}. */\n public get selectedDecileLabel(): string {\n return this.SelectedDecileLabel;\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 /** @deprecated Use {@link DrillThrough}. */\n public drillThrough(row: PredictionGridRow): void {\n return this.DrillThrough(row);\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 /** @deprecated Use {@link OnDrawerWidthChanged}. */\n public onDrawerWidthChanged(width: number): void {\n return this.OnDrawerWidthChanged(width);\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 /** @deprecated Use {@link OpenDetail}. */\n public openDetail(row: PredictionGridRow): void {\n return this.OpenDetail(row);\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 /** @deprecated Use {@link CloseDetail}. */\n public closeDetail(): void {\n return this.CloseDetail();\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 /** @deprecated Use {@link OpenSubjectRecord}. */\n public openSubjectRecord(): void {\n return this.OpenSubjectRecord();\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} = '${EscapeSQLString(recordId)}'`, // first-pk-ok: Single-key entity lookup by recordId\n MaxRows: 1,\n SkipTotalRowCount: true,\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 InvertedRisk: this.IsRenewalModel,\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 /** @deprecated Use {@link EntityDisplayName}. */\n public get entityDisplayName(): string {\n return this.EntityDisplayName;\n }\n\n // ── KPI & Chart Computations ──\n\n public get HighCount(): number {\n return this.AllRows.filter((r) => r.band === 'high').length;\n }\n\n /** @deprecated Use {@link HighCount}. */\n public get highCount(): number {\n return this.HighCount;\n }\n public get MediumCount(): number {\n return this.AllRows.filter((r) => r.band === 'medium').length;\n }\n\n /** @deprecated Use {@link MediumCount}. */\n public get mediumCount(): number {\n return this.MediumCount;\n }\n public get LowCount(): number {\n return this.AllRows.filter((r) => r.band === 'low').length;\n }\n\n /** @deprecated Use {@link LowCount}. */\n public get lowCount(): number {\n return this.LowCount;\n }\n\n public get HighPct(): number {\n return this.AllRows.length > 0 ? Math.round((this.HighCount / this.AllRows.length) * 100) : 0;\n }\n\n /** @deprecated Use {@link HighPct}. */\n public get highPct(): number {\n return this.HighPct;\n }\n public get MediumPct(): number {\n return this.AllRows.length > 0 ? Math.round((this.MediumCount / this.AllRows.length) * 100) : 0;\n }\n\n /** @deprecated Use {@link MediumPct}. */\n public get mediumPct(): number {\n return this.MediumPct;\n }\n public get LowPct(): number {\n return this.AllRows.length > 0 ? Math.round((this.LowCount / this.AllRows.length) * 100) : 0;\n }\n\n /** @deprecated Use {@link LowPct}. */\n public get lowPct(): number {\n return this.LowPct;\n }\n\n public get HighAvg(): number {\n return this.HighAvgRisk;\n }\n\n /** @deprecated Use {@link HighAvg}. */\n public get highAvg(): number {\n return this.HighAvg;\n }\n public get MediumAvg(): number {\n return this.MediumAvgRisk;\n }\n\n /** @deprecated Use {@link MediumAvg}. */\n public get mediumAvg(): number {\n return this.MediumAvg;\n }\n public get LowAvg(): number {\n return this.LowAvgRisk;\n }\n\n /** @deprecated Use {@link LowAvg}. */\n public get lowAvg(): number {\n return this.LowAvg;\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\n /** @deprecated Use {@link HighAvgRisk}. */\n public get highAvgRisk(): number {\n return this.HighAvgRisk;\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\n /** @deprecated Use {@link MediumAvgRisk}. */\n public get mediumAvgRisk(): number {\n return this.MediumAvgRisk;\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 /** @deprecated Use {@link LowAvgRisk}. */\n public get lowAvgRisk(): number {\n return this.LowAvgRisk;\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 /** @deprecated Use {@link MeanScorePct}. */\n public get meanScorePct(): number {\n return this.MeanScorePct;\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 /** @deprecated Use {@link MeanScoreFormatted}. */\n public get meanScoreFormatted(): string {\n return this.MeanScoreFormatted;\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 /** @deprecated Use {@link HistogramBins}. */\n public get histogramBins(): HistogramBin[] {\n return this.HistogramBins;\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 /** @deprecated Use {@link ClassBreakdown}. */\n public get classBreakdown(): ClassShare[] {\n return this.ClassBreakdown;\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 /** @deprecated Use {@link TrendlinePlotPoints}. */\n public get trendlinePlotPoints(): TrendlinePlotPoint[] {\n return this.TrendlinePlotPoints;\n }\n\n public get TrendlineLinePoints(): string {\n return this.TrendlinePlotPoints.map((p) => `${p.x},${p.y}`).join(' ');\n }\n\n /** @deprecated Use {@link TrendlineLinePoints}. */\n public get trendlineLinePoints(): string {\n return this.TrendlineLinePoints;\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 /** @deprecated Use {@link TrendlineAreaPoints}. */\n public get trendlineAreaPoints(): string {\n return this.TrendlineAreaPoints;\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 (+ raises risk, − lowers risk)', 'Scored At'];\n // Quoted: the drivers header carries a comma.\n const lines = [headers.map((h) => `\"${h.replace(/\"/g, '\"\"')}\"`).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 /** @deprecated Use {@link ExportCSV}. */\n public exportCSV(): void {\n return this.ExportCSV();\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 {{ SelectedTierLabel }}{{ searchText ? ' query \"' + searchText + '\"' : '' }}</span>\n }\n @if (DetailRowsCapped) {\n <span class=\"ps-muted\" data-testid=\"ps-predictions-capped\">Showing the first {{ MaxRunDetailRowsLabel }} predictions</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> Factors behind this score (associations, not causes)\n </div>\n <ps-row-drivers [Drivers]=\"selectedRow.drivers\"></ps-row-drivers>\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"]}
|