@memberjunction/ng-core-entity-forms 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +218 -70
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +794 -262
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +385 -93
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +686 -238
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +387 -107
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
- package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
- package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
- package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
- package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +209 -28
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +494 -138
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
- package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
- package/dist/lib/custom/Files/file-form.component.js +2 -2
- package/dist/lib/custom/Files/file-form.component.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +664 -208
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +31 -0
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.js +52 -16
- package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +107 -10
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.js +291 -101
- package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +429 -109
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +110 -4
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +858 -86
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
- package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
- package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts +142 -17
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +333 -113
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +217 -27
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +549 -169
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
- package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-checks.js +5 -1
- package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
- package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +390 -47
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +1015 -343
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Users/user-overview.panel.js +2 -2
- package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +6 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +84 -12
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +89 -5
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +165 -37
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +140 -15
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +326 -100
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +59 -51
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +155 -119
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +45 -19
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js +95 -43
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +20 -16
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +73 -65
- package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.d.ts +133 -14
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +322 -124
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +43 -42
|
@@ -9,11 +9,11 @@ import { RegisterClassEx } from '@memberjunction/global';
|
|
|
9
9
|
import { BaseFormPanel } from '@memberjunction/ng-base-forms';
|
|
10
10
|
import { CompositeKey, LogError, Metadata, RunView } from '@memberjunction/core';
|
|
11
11
|
import { resolveOutcomeConfig, resolveOutcomeStyle, resolveScoreBand, } from '@memberjunction/predictive-studio-core';
|
|
12
|
-
import {
|
|
12
|
+
import { BandFor, FilterHistoryByModel, FormatLastScored, FormatValue, GaugePct, GetDistinctModelsFromHistory, ParseDrivers, ParseHistoryItem, ResolveLabel, ToNumber, ValueKind, } from './model-prediction.logic';
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
14
14
|
import * as i1 from "@memberjunction/ng-base-forms";
|
|
15
15
|
import * as i2 from "@angular/common";
|
|
16
|
-
const _forTrack0 = ($index, $item) => $item.
|
|
16
|
+
const _forTrack0 = ($index, $item) => $item.BindingId;
|
|
17
17
|
const _forTrack1 = ($index, $item) => $item.name;
|
|
18
18
|
const _forTrack2 = ($index, $item) => $item.id;
|
|
19
19
|
const _forTrack3 = ($index, $item) => $item.modelId;
|
|
@@ -27,13 +27,13 @@ function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_9_Te
|
|
|
27
27
|
} if (rf & 2) {
|
|
28
28
|
const card_r3 = i0.ɵɵnextContext().$implicit;
|
|
29
29
|
i0.ɵɵadvance(3);
|
|
30
|
-
i0.ɵɵtextInterpolate1("Scored ", card_r3.
|
|
30
|
+
i0.ɵɵtextInterpolate1("Scored ", card_r3.LastScored);
|
|
31
31
|
} }
|
|
32
32
|
function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_16_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
33
33
|
i0.ɵɵelement(0, "i");
|
|
34
34
|
} if (rf & 2) {
|
|
35
35
|
const card_r3 = i0.ɵɵnextContext(2).$implicit;
|
|
36
|
-
i0.ɵɵclassMap("fa-solid " + card_r3.
|
|
36
|
+
i0.ɵɵclassMap("fa-solid " + card_r3.BadgeIcon);
|
|
37
37
|
} }
|
|
38
38
|
function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
39
39
|
i0.ɵɵelementStart(0, "span", 23);
|
|
@@ -43,11 +43,11 @@ function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_16_T
|
|
|
43
43
|
i0.ɵɵelementEnd()();
|
|
44
44
|
} if (rf & 2) {
|
|
45
45
|
const card_r3 = i0.ɵɵnextContext().$implicit;
|
|
46
|
-
i0.ɵɵclassMap("mpp-badge-" + card_r3.
|
|
46
|
+
i0.ɵɵclassMap("mpp-badge-" + card_r3.BadgeColor);
|
|
47
47
|
i0.ɵɵadvance();
|
|
48
|
-
i0.ɵɵconditional(card_r3.
|
|
48
|
+
i0.ɵɵconditional(card_r3.BadgeIcon ? 1 : -1);
|
|
49
49
|
i0.ɵɵadvance(2);
|
|
50
|
-
i0.ɵɵtextInterpolate(card_r3.
|
|
50
|
+
i0.ɵɵtextInterpolate(card_r3.StatusLabel);
|
|
51
51
|
} }
|
|
52
52
|
function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
53
53
|
i0.ɵɵelementStart(0, "div", 19)(1, "div", 25);
|
|
@@ -64,11 +64,11 @@ function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_17_T
|
|
|
64
64
|
i0.ɵɵelementEnd()()();
|
|
65
65
|
} if (rf & 2) {
|
|
66
66
|
const card_r3 = i0.ɵɵnextContext().$implicit;
|
|
67
|
-
i0.ɵɵattribute("aria-label", card_r3.
|
|
67
|
+
i0.ɵɵattribute("aria-label", card_r3.Label + " " + card_r3.DisplayValue + (card_r3.StatusLabel ? ", " + card_r3.StatusLabel : ""));
|
|
68
68
|
i0.ɵɵadvance(2);
|
|
69
|
-
i0.ɵɵclassMap("mpp-color-" + card_r3.
|
|
70
|
-
i0.ɵɵstyleProp("width", card_r3.
|
|
71
|
-
i0.ɵɵclassProp("mpp-band-low", card_r3.
|
|
69
|
+
i0.ɵɵclassMap("mpp-color-" + card_r3.BadgeColor);
|
|
70
|
+
i0.ɵɵstyleProp("width", card_r3.GaugePct, "%");
|
|
71
|
+
i0.ɵɵclassProp("mpp-band-low", card_r3.Band === "low")("mpp-band-mid", card_r3.Band === "mid")("mpp-band-high", card_r3.Band === "high");
|
|
72
72
|
} }
|
|
73
73
|
function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_18_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
74
74
|
i0.ɵɵelementStart(0, "div", 30)(1, "span", 31);
|
|
@@ -84,7 +84,7 @@ function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_18_F
|
|
|
84
84
|
i0.ɵɵadvance();
|
|
85
85
|
i0.ɵɵtextInterpolate(driver_r5.name);
|
|
86
86
|
i0.ɵɵadvance(2);
|
|
87
|
-
i0.ɵɵstyleProp("width", driver_r5.
|
|
87
|
+
i0.ɵɵstyleProp("width", driver_r5.RelativePct, "%");
|
|
88
88
|
} }
|
|
89
89
|
function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
90
90
|
i0.ɵɵelementStart(0, "div", 20)(1, "div", 28);
|
|
@@ -96,7 +96,7 @@ function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Conditional_18_T
|
|
|
96
96
|
} if (rf & 2) {
|
|
97
97
|
const card_r3 = i0.ɵɵnextContext().$implicit;
|
|
98
98
|
i0.ɵɵadvance(4);
|
|
99
|
-
i0.ɵɵrepeater(card_r3.
|
|
99
|
+
i0.ɵɵrepeater(card_r3.Drivers);
|
|
100
100
|
} }
|
|
101
101
|
function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
102
102
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
@@ -126,21 +126,21 @@ function ModelPredictionPanel_Conditional_0_Conditional_1_For_2_Template(rf, ctx
|
|
|
126
126
|
} if (rf & 2) {
|
|
127
127
|
const card_r3 = ctx.$implicit;
|
|
128
128
|
i0.ɵɵadvance(4);
|
|
129
|
-
i0.ɵɵtextInterpolate(card_r3.
|
|
129
|
+
i0.ɵɵtextInterpolate(card_r3.Label);
|
|
130
130
|
i0.ɵɵadvance(4);
|
|
131
|
-
i0.ɵɵtextInterpolate(card_r3.
|
|
131
|
+
i0.ɵɵtextInterpolate(card_r3.Provenance);
|
|
132
132
|
i0.ɵɵadvance();
|
|
133
|
-
i0.ɵɵconditional(card_r3.
|
|
133
|
+
i0.ɵɵconditional(card_r3.LastScored ? 9 : -1);
|
|
134
134
|
i0.ɵɵadvance(5);
|
|
135
|
-
i0.ɵɵclassProp("mpp-value-muted", card_r3.
|
|
135
|
+
i0.ɵɵclassProp("mpp-value-muted", card_r3.DisplayValue === "\u2014");
|
|
136
136
|
i0.ɵɵadvance();
|
|
137
|
-
i0.ɵɵtextInterpolate1(" ", card_r3.
|
|
137
|
+
i0.ɵɵtextInterpolate1(" ", card_r3.DisplayValue, " ");
|
|
138
138
|
i0.ɵɵadvance();
|
|
139
|
-
i0.ɵɵconditional(card_r3.
|
|
139
|
+
i0.ɵɵconditional(card_r3.StatusLabel ? 16 : -1);
|
|
140
140
|
i0.ɵɵadvance();
|
|
141
|
-
i0.ɵɵconditional(card_r3.
|
|
141
|
+
i0.ɵɵconditional(card_r3.IsProbability ? 17 : -1);
|
|
142
142
|
i0.ɵɵadvance();
|
|
143
|
-
i0.ɵɵconditional(card_r3.
|
|
143
|
+
i0.ɵɵconditional(card_r3.Drivers.length > 0 ? 18 : -1);
|
|
144
144
|
} }
|
|
145
145
|
function ModelPredictionPanel_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
146
146
|
i0.ɵɵelementStart(0, "div", 1);
|
|
@@ -182,7 +182,7 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_Conditi
|
|
|
182
182
|
const ctx_r3 = i0.ɵɵnextContext(5);
|
|
183
183
|
i0.ɵɵclassProp("active", ctx_r3.SelectedModelId === mod_r8.modelId);
|
|
184
184
|
i0.ɵɵadvance();
|
|
185
|
-
i0.ɵɵtextInterpolate2(" ", mod_r8.
|
|
185
|
+
i0.ɵɵtextInterpolate2(" ", mod_r8.ModelName, " (", mod_r8.count, ") ");
|
|
186
186
|
} }
|
|
187
187
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
188
188
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
@@ -209,13 +209,13 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_
|
|
|
209
209
|
} if (rf & 2) {
|
|
210
210
|
const item_r10 = i0.ɵɵnextContext().$implicit;
|
|
211
211
|
i0.ɵɵadvance();
|
|
212
|
-
i0.ɵɵtextInterpolate1("(", i0.ɵɵpipeBind2(2, 1, item_r10.
|
|
212
|
+
i0.ɵɵtextInterpolate1("(", i0.ɵɵpipeBind2(2, 1, item_r10.NumericValue * 100, "1.0-1"), "%)");
|
|
213
213
|
} }
|
|
214
214
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
215
215
|
i0.ɵɵelement(0, "i");
|
|
216
216
|
} if (rf & 2) {
|
|
217
217
|
const item_r10 = i0.ɵɵnextContext(2).$implicit;
|
|
218
|
-
i0.ɵɵclassMap("fa-solid " + item_r10.
|
|
218
|
+
i0.ɵɵclassMap("fa-solid " + item_r10.BadgeIcon);
|
|
219
219
|
} }
|
|
220
220
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
221
221
|
i0.ɵɵelementStart(0, "span", 60);
|
|
@@ -225,11 +225,11 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_
|
|
|
225
225
|
i0.ɵɵelementEnd()();
|
|
226
226
|
} if (rf & 2) {
|
|
227
227
|
const item_r10 = i0.ɵɵnextContext().$implicit;
|
|
228
|
-
i0.ɵɵclassMap("mpp-badge-" + item_r10.
|
|
228
|
+
i0.ɵɵclassMap("mpp-badge-" + item_r10.BadgeColor);
|
|
229
229
|
i0.ɵɵadvance();
|
|
230
|
-
i0.ɵɵconditional(item_r10.
|
|
230
|
+
i0.ɵɵconditional(item_r10.BadgeIcon ? 1 : -1);
|
|
231
231
|
i0.ɵɵadvance(2);
|
|
232
|
-
i0.ɵɵtextInterpolate(item_r10.
|
|
232
|
+
i0.ɵɵtextInterpolate(item_r10.StatusLabel);
|
|
233
233
|
} }
|
|
234
234
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_Conditional_24_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
235
235
|
i0.ɵɵelementStart(0, "div", 63)(1, "strong");
|
|
@@ -240,7 +240,7 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_
|
|
|
240
240
|
} if (rf & 2) {
|
|
241
241
|
const item_r10 = i0.ɵɵnextContext(2).$implicit;
|
|
242
242
|
i0.ɵɵadvance(3);
|
|
243
|
-
i0.ɵɵtextInterpolate1(" ", item_r10.
|
|
243
|
+
i0.ɵɵtextInterpolate1(" ", item_r10.ErrorMessage, " ");
|
|
244
244
|
} }
|
|
245
245
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_Conditional_24_Conditional_4_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
246
246
|
i0.ɵɵelementStart(0, "div", 71)(1, "span", 72);
|
|
@@ -254,7 +254,7 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_
|
|
|
254
254
|
i0.ɵɵadvance(2);
|
|
255
255
|
i0.ɵɵtextInterpolate(d_r11.name);
|
|
256
256
|
i0.ɵɵadvance(2);
|
|
257
|
-
i0.ɵɵstyleProp("width", d_r11.
|
|
257
|
+
i0.ɵɵstyleProp("width", d_r11.RelativePct, "%");
|
|
258
258
|
} }
|
|
259
259
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_Conditional_24_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
260
260
|
i0.ɵɵelementStart(0, "div", 64)(1, "div", 66);
|
|
@@ -267,7 +267,7 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_
|
|
|
267
267
|
} if (rf & 2) {
|
|
268
268
|
const item_r10 = i0.ɵɵnextContext(2).$implicit;
|
|
269
269
|
i0.ɵɵadvance(5);
|
|
270
|
-
i0.ɵɵrepeater(item_r10.
|
|
270
|
+
i0.ɵɵrepeater(item_r10.Drivers);
|
|
271
271
|
} }
|
|
272
272
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
273
273
|
i0.ɵɵelementStart(0, "tr", 59)(1, "td", 61)(2, "div", 62);
|
|
@@ -284,11 +284,11 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_
|
|
|
284
284
|
} if (rf & 2) {
|
|
285
285
|
const item_r10 = i0.ɵɵnextContext().$implicit;
|
|
286
286
|
i0.ɵɵadvance(3);
|
|
287
|
-
i0.ɵɵconditional(item_r10.
|
|
287
|
+
i0.ɵɵconditional(item_r10.ErrorMessage ? 3 : -1);
|
|
288
288
|
i0.ɵɵadvance();
|
|
289
|
-
i0.ɵɵconditional(item_r10.
|
|
289
|
+
i0.ɵɵconditional(item_r10.Drivers.length > 0 ? 4 : -1);
|
|
290
290
|
i0.ɵɵadvance(6);
|
|
291
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(11, 3, item_r10.
|
|
291
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(11, 3, item_r10.RawPayload));
|
|
292
292
|
} }
|
|
293
293
|
function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_Template(rf, ctx) { if (rf & 1) {
|
|
294
294
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
@@ -326,17 +326,17 @@ function ModelPredictionPanel_Conditional_0_Conditional_11_Conditional_3_For_17_
|
|
|
326
326
|
const ctx_r3 = i0.ɵɵnextContext(4);
|
|
327
327
|
i0.ɵɵclassProp("expanded", ctx_r3.ExpandedHistoryItemId === item_r10.id);
|
|
328
328
|
i0.ɵɵadvance(2);
|
|
329
|
-
i0.ɵɵtextInterpolate(item_r10.
|
|
329
|
+
i0.ɵɵtextInterpolate(item_r10.FormattedTime);
|
|
330
330
|
i0.ɵɵadvance(3);
|
|
331
|
-
i0.ɵɵtextInterpolate(item_r10.
|
|
331
|
+
i0.ɵɵtextInterpolate(item_r10.ModelName);
|
|
332
332
|
i0.ɵɵadvance(2);
|
|
333
|
-
i0.ɵɵtextInterpolate(item_r10.
|
|
333
|
+
i0.ɵɵtextInterpolate(item_r10.Provenance);
|
|
334
334
|
i0.ɵɵadvance(4);
|
|
335
|
-
i0.ɵɵtextInterpolate(item_r10.
|
|
335
|
+
i0.ɵɵtextInterpolate(item_r10.DisplayValue);
|
|
336
336
|
i0.ɵɵadvance();
|
|
337
|
-
i0.ɵɵconditional(item_r10.
|
|
337
|
+
i0.ɵɵconditional(item_r10.PredictedClass && item_r10.NumericValue != null && item_r10.IsProbability ? 12 : -1);
|
|
338
338
|
i0.ɵɵadvance();
|
|
339
|
-
i0.ɵɵconditional(item_r10.
|
|
339
|
+
i0.ɵɵconditional(item_r10.StatusLabel ? 13 : -1);
|
|
340
340
|
i0.ɵɵadvance(2);
|
|
341
341
|
i0.ɵɵclassMap("mpp-status-" + item_r10.status.toLowerCase());
|
|
342
342
|
i0.ɵɵadvance();
|
|
@@ -441,7 +441,7 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
441
441
|
/** True once the binding lookup has completed (success or empty). */
|
|
442
442
|
this.Loaded = false;
|
|
443
443
|
/** Resolved models by ID for lineage and history decoration. */
|
|
444
|
-
this.
|
|
444
|
+
this.ModelsById = new Map();
|
|
445
445
|
/** Historical prediction runs for this record across models. */
|
|
446
446
|
this.HistoryItems = [];
|
|
447
447
|
/** Loading flag for historical predictions lookup. */
|
|
@@ -455,6 +455,14 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
455
455
|
/** Entity-ID we last loaded cards for, to avoid redundant lookups. */
|
|
456
456
|
this.loadedForEntityId = null;
|
|
457
457
|
}
|
|
458
|
+
/** @deprecated Use {@link ModelsById}. */
|
|
459
|
+
get modelsById() {
|
|
460
|
+
return this.ModelsById;
|
|
461
|
+
}
|
|
462
|
+
/** @deprecated Use {@link ModelsById}. */
|
|
463
|
+
set modelsById(value) {
|
|
464
|
+
this.ModelsById = value;
|
|
465
|
+
}
|
|
458
466
|
async ngOnInit() {
|
|
459
467
|
await this.loadCards();
|
|
460
468
|
}
|
|
@@ -464,11 +472,11 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
464
472
|
}
|
|
465
473
|
/** Filtered history items based on currently selected model. */
|
|
466
474
|
get FilteredHistory() {
|
|
467
|
-
return
|
|
475
|
+
return FilterHistoryByModel(this.HistoryItems, this.SelectedModelId);
|
|
468
476
|
}
|
|
469
477
|
/** Distinct models in prediction history with counts. */
|
|
470
478
|
get ModelSummaries() {
|
|
471
|
-
return
|
|
479
|
+
return GetDistinctModelsFromHistory(this.HistoryItems);
|
|
472
480
|
}
|
|
473
481
|
/**
|
|
474
482
|
* Look up active scoring bindings for THIS record's entity and build a card
|
|
@@ -492,7 +500,7 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
492
500
|
}
|
|
493
501
|
else {
|
|
494
502
|
const models = await this.loadModelsForBindings(bindings);
|
|
495
|
-
this.
|
|
503
|
+
this.ModelsById = models;
|
|
496
504
|
this.Cards = this.buildCards(bindings, models);
|
|
497
505
|
}
|
|
498
506
|
// Preload history in the background for this record
|
|
@@ -542,14 +550,14 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
542
550
|
}
|
|
543
551
|
// Ensure any models referenced in historical payloads are loaded
|
|
544
552
|
await this.ensureModelsLoadedForHistory(rawDetails);
|
|
545
|
-
this.HistoryItems = rawDetails.map(d =>
|
|
553
|
+
this.HistoryItems = rawDetails.map(d => ParseHistoryItem({
|
|
546
554
|
ID: d.ID,
|
|
547
555
|
ProcessRunID: d.ProcessRunID,
|
|
548
556
|
Status: d.Status,
|
|
549
557
|
CompletedAt: d.CompletedAt,
|
|
550
558
|
ResultPayload: d.ResultPayload,
|
|
551
559
|
ErrorMessage: d.ErrorMessage,
|
|
552
|
-
}, this.
|
|
560
|
+
}, this.ModelsById));
|
|
553
561
|
}
|
|
554
562
|
catch (e) {
|
|
555
563
|
LogError(`[ModelPredictionPanel] Error loading prediction history: ${e instanceof Error ? e.message : String(e)}`);
|
|
@@ -661,7 +669,7 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
661
669
|
const rec = parsed;
|
|
662
670
|
const out = (rec['output'] && typeof rec['output'] === 'object' ? rec['output'] : rec);
|
|
663
671
|
const mid = typeof out['modelId'] === 'string' ? out['modelId'] : null;
|
|
664
|
-
if (mid && !this.
|
|
672
|
+
if (mid && !this.ModelsById.has(mid) && !missingModelIds.includes(mid)) {
|
|
665
673
|
missingModelIds.push(mid);
|
|
666
674
|
}
|
|
667
675
|
}
|
|
@@ -681,7 +689,7 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
681
689
|
}, this.contextUser());
|
|
682
690
|
if (result.Success && result.Results) {
|
|
683
691
|
for (const model of result.Results) {
|
|
684
|
-
this.
|
|
692
|
+
this.ModelsById.set(model.ID, model);
|
|
685
693
|
}
|
|
686
694
|
}
|
|
687
695
|
}
|
|
@@ -702,8 +710,8 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
702
710
|
// The column name is data-driven (from the binding), so reading it
|
|
703
711
|
// dynamically via Get() is the legitimate use of the dynamic accessor.
|
|
704
712
|
const rawValue = binding.TargetColumn ? this.Record.Get(binding.TargetColumn) : null;
|
|
705
|
-
const numeric =
|
|
706
|
-
const kind =
|
|
713
|
+
const numeric = ToNumber(rawValue);
|
|
714
|
+
const kind = ValueKind(model.ProblemType, numeric);
|
|
707
715
|
const outcomeConfig = resolveOutcomeConfig({
|
|
708
716
|
Lineage: model.Lineage,
|
|
709
717
|
TargetVariable: model.TargetVariable,
|
|
@@ -728,22 +736,22 @@ let ModelPredictionPanel = class ModelPredictionPanel extends BaseFormPanel {
|
|
|
728
736
|
statusLabel = style.DisplayLabel ?? rawValue;
|
|
729
737
|
}
|
|
730
738
|
return {
|
|
731
|
-
|
|
739
|
+
BindingId: binding.ID,
|
|
732
740
|
modelId: model.ID,
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
statusBand,
|
|
741
|
-
statusLabel,
|
|
742
|
-
badgeColor,
|
|
743
|
-
badgeIcon,
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
741
|
+
Label: ResolveLabel(model.TargetVariable, binding.TargetColumn),
|
|
742
|
+
IsProbability: kind === 'probability',
|
|
743
|
+
IsNumeric: kind === 'numeric',
|
|
744
|
+
IsClass: kind === 'class',
|
|
745
|
+
DisplayValue: FormatValue(rawValue, numeric, kind),
|
|
746
|
+
GaugePct: kind === 'probability' && numeric != null ? GaugePct(numeric) : 0,
|
|
747
|
+
Band: kind === 'probability' && numeric != null ? BandFor(numeric) : null,
|
|
748
|
+
StatusBand: statusBand,
|
|
749
|
+
StatusLabel: statusLabel,
|
|
750
|
+
BadgeColor: badgeColor,
|
|
751
|
+
BadgeIcon: badgeIcon,
|
|
752
|
+
Drivers: ParseDrivers(model.FeatureImportance),
|
|
753
|
+
Provenance: `${model.Pipeline} v${model.Version}`,
|
|
754
|
+
LastScored: FormatLastScored(binding.LastScoredAt),
|
|
747
755
|
};
|
|
748
756
|
}
|
|
749
757
|
/** RunView scoped to the form's provider when available (multi-provider safe). */
|
|
@@ -776,7 +784,7 @@ ModelPredictionPanel = __decorate([
|
|
|
776
784
|
export { ModelPredictionPanel };
|
|
777
785
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModelPredictionPanel, [{
|
|
778
786
|
type: Component,
|
|
779
|
-
args: [{ standalone: false, selector: 'mj-model-prediction-panel', template: "<!--\n Entity-agnostic model-prediction panel. Renders NOTHING unless the current\n record's entity has active scoring bindings or historical prediction runs.\n Driven entirely by metadata \u2014 no entity-specific or domain-specific markup.\n-->\n@if (HasPredictions) {\n <mj-collapsible-panel\n SectionKey=\"modelPredictions\"\n SectionName=\"Model Predictions\"\n Icon=\"fa-solid fa-wand-magic-sparkles\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\"\n [BadgeCount]=\"Cards.length\">\n\n <!-- Active prediction cards -->\n @if (Cards.length > 0) {\n <div class=\"mpp-cards\">\n @for (card of Cards; track card.bindingId) {\n <div class=\"mpp-card\">\n\n <!-- Header: label + provenance + history button -->\n <div class=\"mpp-card-head\">\n <div class=\"mpp-head-left\">\n <div class=\"mpp-label\">{{ card.label }}</div>\n <div class=\"mpp-provenance\">\n <i class=\"fa-solid fa-diagram-project mpp-prov-icon\" aria-hidden=\"true\"></i>\n <span>{{ card.provenance }}</span>\n @if (card.lastScored) {\n <span class=\"mpp-dot\" aria-hidden=\"true\">\u00B7</span>\n <span class=\"mpp-scored\">Scored {{ card.lastScored }}</span>\n }\n </div>\n </div>\n <button type=\"button\" \n class=\"mpp-card-history-btn\" \n (click)=\"OpenHistoryForModel(card.modelId, $event)\" \n title=\"View prediction history for this model\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> History\n </button>\n </div>\n\n <!-- Value -->\n <div class=\"mpp-value-row\">\n <span class=\"mpp-value\" [class.mpp-value-muted]=\"card.displayValue === '\u2014'\">\n {{ card.displayValue }}\n </span>\n @if (card.statusLabel) {\n <span class=\"mpp-status-badge\" [class]=\"'mpp-badge-' + card.badgeColor\">\n @if (card.badgeIcon) {\n <i [class]=\"'fa-solid ' + card.badgeIcon\"></i>\n }\n <span>{{ card.statusLabel }}</span>\n </span>\n }\n </div>\n\n <!-- Probability gauge \u2014 semantic color matching outcome polarity -->\n @if (card.isProbability) {\n <div class=\"mpp-gauge\" role=\"img\"\n [attr.aria-label]=\"card.label + ' ' + card.displayValue + (card.statusLabel ? ', ' + card.statusLabel : '')\">\n <div class=\"mpp-gauge-track\">\n <div class=\"mpp-gauge-fill\"\n [class.mpp-band-low]=\"card.band === 'low'\"\n [class.mpp-band-mid]=\"card.band === 'mid'\"\n [class.mpp-band-high]=\"card.band === 'high'\"\n [class]=\"'mpp-color-' + card.badgeColor\"\n [style.width.%]=\"card.gaugePct\"></div>\n </div>\n <div class=\"mpp-gauge-scale\">\n <span>0%</span>\n <span>50%</span>\n <span>100%</span>\n </div>\n </div>\n }\n\n <!-- Top drivers (feature importance) \u2014 omitted cleanly when unavailable -->\n @if (card.drivers.length > 0) {\n <div class=\"mpp-drivers\">\n <div class=\"mpp-drivers-title\">\n <i class=\"fa-solid fa-ranking-star\" aria-hidden=\"true\"></i>\n Top drivers\n </div>\n @for (driver of card.drivers; track driver.name) {\n <div class=\"mpp-driver\">\n <span class=\"mpp-driver-name\" [title]=\"driver.name\">{{ driver.name }}</span>\n <span class=\"mpp-driver-bar-track\">\n <span class=\"mpp-driver-bar-fill\" [style.width.%]=\"driver.relativePct\"></span>\n </span>\n </div>\n }\n </div>\n }\n\n </div>\n }\n </div>\n }\n\n <!-- Prediction History Section -->\n <div class=\"mpp-history-section\">\n <div class=\"mpp-history-header\" (click)=\"ToggleHistorySection()\" role=\"button\" tabindex=\"0\">\n <div class=\"mpp-history-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>Prediction History</span>\n @if (HistoryItems.length > 0) {\n <span class=\"mpp-history-badge\">{{ HistoryItems.length }}</span>\n }\n </div>\n <div class=\"mpp-history-chevron\">\n <i [class]=\"ShowHistorySection ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </div>\n </div>\n\n @if (ShowHistorySection) {\n <div class=\"mpp-history-body\">\n @if (LoadingHistory) {\n <div class=\"mpp-history-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading prediction history\u2026\n </div>\n } @else if (HistoryItems.length === 0) {\n <div class=\"mpp-history-empty\">\n No historical prediction runs recorded for this record yet.\n </div>\n } @else {\n <!-- Multi-model filter tabs if multiple models present -->\n @if (ModelSummaries.length > 1) {\n <div class=\"mpp-model-filters\">\n <button type=\"button\" \n class=\"mpp-filter-pill\" \n [class.active]=\"SelectedModelId === null || SelectedModelId === 'ALL'\"\n (click)=\"SelectModelFilter(null)\">\n All Models ({{ HistoryItems.length }})\n </button>\n @for (mod of ModelSummaries; track mod.modelId) {\n <button type=\"button\" \n class=\"mpp-filter-pill\" \n [class.active]=\"SelectedModelId === mod.modelId\"\n (click)=\"SelectModelFilter(mod.modelId)\">\n {{ mod.modelName }} ({{ mod.count }})\n </button>\n }\n </div>\n }\n\n <!-- History table -->\n <div class=\"mpp-history-table-wrap\">\n <table class=\"mpp-history-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Model</th>\n <th>Prediction</th>\n <th>Status</th>\n <th class=\"actions-th\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (item of FilteredHistory; track item.id) {\n <tr class=\"mpp-history-row\" [class.expanded]=\"ExpandedHistoryItemId === item.id\">\n <td class=\"mpp-col-date\">{{ item.formattedTime }}</td>\n <td class=\"mpp-col-model\">\n <div class=\"mpp-history-model-name\">{{ item.modelName }}</div>\n <div class=\"mpp-history-model-prov\">{{ item.provenance }}</div>\n </td>\n <td class=\"mpp-col-pred\">\n <div class=\"mpp-pred-cell\">\n <span class=\"mpp-history-pred-val\">{{ item.displayValue }}</span>\n @if (item.predictedClass && item.numericValue != null && item.isProbability) {\n <span class=\"mpp-history-pred-sub\">({{ (item.numericValue * 100) | number:'1.0-1' }}%)</span>\n }\n @if (item.statusLabel) {\n <span class=\"mpp-status-badge mpp-badge-sm\" [class]=\"'mpp-badge-' + item.badgeColor\">\n @if (item.badgeIcon) {\n <i [class]=\"'fa-solid ' + item.badgeIcon\"></i>\n }\n <span>{{ item.statusLabel }}</span>\n </span>\n }\n </div>\n </td>\n <td class=\"mpp-col-status\">\n <span class=\"mpp-status-pill\" [class]=\"'mpp-status-' + item.status.toLowerCase()\">\n {{ item.status }}\n </span>\n </td>\n <td class=\"mpp-col-actions\">\n <button type=\"button\" \n class=\"mpp-action-btn\"\n (click)=\"ToggleHistoryDetails(item, $event)\" \n [title]=\"ExpandedHistoryItemId === item.id ? 'Hide details' : 'Inspect payload & drivers'\">\n <i [class]=\"ExpandedHistoryItemId === item.id ? 'fa-solid fa-chevron-up' : 'fa-solid fa-code'\"></i>\n {{ ExpandedHistoryItemId === item.id ? 'Close' : 'Inspect' }}\n </button>\n <button type=\"button\" \n class=\"mpp-action-btn mpp-action-drilldown\"\n (click)=\"DrilldownToPredictionRecord(item, $event)\"\n title=\"Open underlying Process Run Detail record in Explorer\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open Row\n </button>\n </td>\n </tr>\n @if (ExpandedHistoryItemId === item.id) {\n <tr class=\"mpp-history-detail-row\">\n <td colspan=\"5\">\n <div class=\"mpp-history-detail-pane\">\n @if (item.errorMessage) {\n <div class=\"mpp-detail-error\">\n <strong>Error:</strong> {{ item.errorMessage }}\n </div>\n }\n @if (item.drivers.length > 0) {\n <div class=\"mpp-detail-drivers\">\n <div class=\"mpp-detail-subtitle\"><i class=\"fa-solid fa-ranking-star\"></i> Attributed Drivers</div>\n <div class=\"mpp-detail-driver-list\">\n @for (d of item.drivers; track d.name) {\n <div class=\"mpp-detail-driver-item\">\n <span class=\"mpp-driver-name\">{{ d.name }}</span>\n <span class=\"mpp-driver-bar-track\">\n <span class=\"mpp-driver-bar-fill\" [style.width.%]=\"d.relativePct\"></span>\n </span>\n </div>\n }\n </div>\n </div>\n }\n <div class=\"mpp-detail-payload\">\n <div class=\"mpp-detail-subtitle\"><i class=\"fa-solid fa-file-code\"></i> Result Payload</div>\n <pre class=\"mpp-payload-pre\">{{ item.rawPayload | json }}</pre>\n </div>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n\n </mj-collapsible-panel>\n}\n", styles: ["/* Entity-agnostic model-prediction panel.\n Design-token-clean: every color is a --mj-* semantic token. The gauge bands\n are intentionally NEUTRAL \u2014 they encode position on the value axis (low/mid/high)\n via opacity of a single brand color, never green=good / red=bad. */\n\n.mpp-cards {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 4px 2px;\n}\n\n.mpp-card {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface-card);\n padding: 14px 16px;\n}\n\n/* ---- Header ---- */\n.mpp-card-head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.mpp-label {\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-provenance {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.mpp-prov-icon {\n color: var(--mj-brand-primary);\n}\n\n.mpp-dot {\n color: var(--mj-text-disabled);\n}\n\n/* ---- Primary value ---- */\n.mpp-value-row {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 2px 0 10px;\n}\n\n/* ---- Status Badge ---- */\n.mpp-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: var(--mj-radius-full, 9999px);\n line-height: 1.3;\n}\n\n.mpp-badge-sm {\n padding: 1px 6px;\n font-size: 0.7rem;\n}\n\n.mpp-badge-green {\n background: color-mix(in srgb, var(--mj-status-success, #16a34a) 15%, transparent);\n color: var(--mj-status-success, #16a34a);\n}\n\n.mpp-badge-red {\n background: color-mix(in srgb, var(--mj-status-danger, #dc2626) 15%, transparent);\n color: var(--mj-status-danger, #dc2626);\n}\n\n.mpp-badge-amber {\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 15%, transparent);\n color: var(--mj-status-warning, #d97706);\n}\n\n.mpp-badge-blue {\n background: color-mix(in srgb, var(--mj-status-info, #2563eb) 15%, transparent);\n color: var(--mj-status-info, #2563eb);\n}\n\n.mpp-badge-gray {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.mpp-pred-cell {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.mpp-value {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.1;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.mpp-value-muted {\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n/* ---- Gauge (neutral tercile) ---- */\n.mpp-gauge {\n margin-bottom: 4px;\n}\n\n.mpp-gauge-track {\n position: relative;\n height: 10px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.mpp-gauge-fill {\n height: 100%;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n}\n\n/* Band shading: same brand hue, varied opacity = neutral position cue only. */\n.mpp-band-low {\n background: color-mix(in srgb, var(--mj-brand-primary) 55%, transparent);\n}\n.mpp-band-mid {\n background: color-mix(in srgb, var(--mj-brand-primary) 78%, transparent);\n}\n.mpp-band-high {\n background: var(--mj-brand-primary);\n}\n\n/* Outcome polarity gauge fill colors */\n.mpp-gauge-fill.mpp-color-green {\n background: var(--mj-status-success, #16a34a);\n}\n.mpp-gauge-fill.mpp-color-red {\n background: var(--mj-status-danger, #dc2626);\n}\n.mpp-gauge-fill.mpp-color-amber {\n background: var(--mj-status-warning, #d97706);\n}\n.mpp-gauge-fill.mpp-color-blue {\n background: var(--mj-status-info, #2563eb);\n}\n.mpp-gauge-fill.mpp-color-gray {\n background: var(--mj-text-muted);\n}\n\n.mpp-gauge-scale {\n display: flex;\n justify-content: space-between;\n margin-top: 4px;\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n/* ---- Drivers ---- */\n.mpp-drivers {\n margin-top: 12px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n}\n\n.mpp-drivers-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.mpp-driver {\n display: grid;\n grid-template-columns: minmax(80px, 38%) 1fr;\n align-items: center;\n gap: 10px;\n margin-bottom: 6px;\n}\n\n.mpp-driver-name {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mpp-driver-bar-track {\n display: block;\n height: 7px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.mpp-driver-bar-fill {\n display: block;\n height: 100%;\n border-radius: var(--mj-radius-full, 9999px);\n background: color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n transition: width 0.3s ease;\n}\n\n/* ---- Card History Action Button ---- */\n.mpp-head-left {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mpp-card-history-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 4px);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mpp-card-history-btn:hover {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n/* ---- Prediction History Section ---- */\n.mpp-history-section {\n margin-top: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.mpp-history-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.mpp-history-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mpp-history-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-history-title i {\n color: var(--mj-brand-primary);\n}\n\n.mpp-history-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 6px;\n font-size: 0.7rem;\n font-weight: 600;\n border-radius: 999px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n}\n\n.mpp-history-chevron {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.mpp-history-body {\n padding: 12px 14px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.mpp-history-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n padding: 8px 0;\n}\n\n.mpp-history-empty {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n padding: 8px 0;\n}\n\n/* ---- Multi-Model Filter Tabs ---- */\n.mpp-model-filters {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.mpp-filter-pill {\n padding: 3px 10px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mpp-filter-pill:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-hover, var(--mj-brand-primary));\n}\n\n.mpp-filter-pill.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-color: var(--mj-brand-primary);\n}\n\n/* ---- History Table ---- */\n.mpp-history-table-wrap {\n overflow-x: auto;\n}\n\n.mpp-history-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8rem;\n}\n\n.mpp-history-table th {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n padding: 6px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mpp-history-table th.actions-th {\n text-align: right;\n}\n\n.mpp-history-table td {\n padding: 8px;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n vertical-align: middle;\n}\n\n.mpp-history-row:hover td {\n background: var(--mj-bg-surface-hover);\n}\n\n.mpp-history-row.expanded td {\n background: var(--mj-bg-surface-sunken);\n}\n\n.mpp-col-date {\n white-space: nowrap;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.mpp-col-model {\n min-width: 140px;\n}\n\n.mpp-history-model-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-history-model-prov {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.mpp-col-pred {\n white-space: nowrap;\n}\n\n.mpp-history-pred-val {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-history-pred-sub {\n margin-left: 4px;\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* Status Pill */\n.mpp-status-pill {\n display: inline-block;\n padding: 1px 7px;\n font-size: 0.7rem;\n font-weight: 600;\n border-radius: 999px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n.mpp-status-succeeded {\n background: color-mix(in srgb, var(--mj-status-success, #16a34a) 15%, transparent);\n color: var(--mj-status-success, #16a34a);\n}\n\n.mpp-status-failed {\n background: color-mix(in srgb, var(--mj-status-danger, #dc2626) 15%, transparent);\n color: var(--mj-status-danger, #dc2626);\n}\n\n.mpp-status-pending,\n.mpp-status-skipped {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n/* Actions in History Row */\n.mpp-col-actions {\n text-align: right;\n white-space: nowrap;\n}\n\n.mpp-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 7px;\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 4px);\n cursor: pointer;\n margin-left: 4px;\n transition: all 0.15s ease;\n}\n\n.mpp-action-btn:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-hover, var(--mj-brand-primary));\n}\n\n.mpp-action-drilldown {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.mpp-action-drilldown:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n}\n\n/* Inspection Drawer */\n.mpp-history-detail-row td {\n padding: 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mpp-history-detail-pane {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.mpp-detail-subtitle {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.mpp-detail-error {\n font-size: 0.78rem;\n color: var(--mj-status-danger, #dc2626);\n background: color-mix(in srgb, var(--mj-status-danger, #dc2626) 8%, transparent);\n padding: 6px 10px;\n border-radius: var(--mj-radius-sm, 4px);\n}\n\n.mpp-detail-driver-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-width: 380px;\n}\n\n.mpp-detail-driver-item {\n display: grid;\n grid-template-columns: minmax(80px, 45%) 1fr;\n align-items: center;\n gap: 8px;\n}\n\n.mpp-detail-payload {\n margin-top: 2px;\n}\n\n.mpp-payload-pre {\n margin: 0;\n padding: 8px 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.72rem;\n line-height: 1.4;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 4px);\n overflow-x: auto;\n max-height: 200px;\n color: var(--mj-text-primary);\n}\n"] }]
|
|
787
|
+
args: [{ standalone: false, selector: 'mj-model-prediction-panel', template: "<!--\n Entity-agnostic model-prediction panel. Renders NOTHING unless the current\n record's entity has active scoring bindings or historical prediction runs.\n Driven entirely by metadata \u2014 no entity-specific or domain-specific markup.\n-->\n@if (HasPredictions) {\n <mj-collapsible-panel\n SectionKey=\"modelPredictions\"\n SectionName=\"Model Predictions\"\n Icon=\"fa-solid fa-wand-magic-sparkles\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\"\n [BadgeCount]=\"Cards.length\">\n\n <!-- Active prediction cards -->\n @if (Cards.length > 0) {\n <div class=\"mpp-cards\">\n @for (card of Cards; track card.BindingId) {\n <div class=\"mpp-card\">\n\n <!-- Header: label + provenance + history button -->\n <div class=\"mpp-card-head\">\n <div class=\"mpp-head-left\">\n <div class=\"mpp-label\">{{ card.Label }}</div>\n <div class=\"mpp-provenance\">\n <i class=\"fa-solid fa-diagram-project mpp-prov-icon\" aria-hidden=\"true\"></i>\n <span>{{ card.Provenance }}</span>\n @if (card.LastScored) {\n <span class=\"mpp-dot\" aria-hidden=\"true\">\u00B7</span>\n <span class=\"mpp-scored\">Scored {{ card.LastScored }}</span>\n }\n </div>\n </div>\n <button type=\"button\" \n class=\"mpp-card-history-btn\" \n (click)=\"OpenHistoryForModel(card.modelId, $event)\" \n title=\"View prediction history for this model\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> History\n </button>\n </div>\n\n <!-- Value -->\n <div class=\"mpp-value-row\">\n <span class=\"mpp-value\" [class.mpp-value-muted]=\"card.DisplayValue === '\u2014'\">\n {{ card.DisplayValue }}\n </span>\n @if (card.StatusLabel) {\n <span class=\"mpp-status-badge\" [class]=\"'mpp-badge-' + card.BadgeColor\">\n @if (card.BadgeIcon) {\n <i [class]=\"'fa-solid ' + card.BadgeIcon\"></i>\n }\n <span>{{ card.StatusLabel }}</span>\n </span>\n }\n </div>\n\n <!-- Probability gauge \u2014 semantic color matching outcome polarity -->\n @if (card.IsProbability) {\n <div class=\"mpp-gauge\" role=\"img\"\n [attr.aria-label]=\"card.Label + ' ' + card.DisplayValue + (card.StatusLabel ? ', ' + card.StatusLabel : '')\">\n <div class=\"mpp-gauge-track\">\n <div class=\"mpp-gauge-fill\"\n [class.mpp-band-low]=\"card.Band === 'low'\"\n [class.mpp-band-mid]=\"card.Band === 'mid'\"\n [class.mpp-band-high]=\"card.Band === 'high'\"\n [class]=\"'mpp-color-' + card.BadgeColor\"\n [style.width.%]=\"card.GaugePct\"></div>\n </div>\n <div class=\"mpp-gauge-scale\">\n <span>0%</span>\n <span>50%</span>\n <span>100%</span>\n </div>\n </div>\n }\n\n <!-- Top drivers (feature importance) \u2014 omitted cleanly when unavailable -->\n @if (card.Drivers.length > 0) {\n <div class=\"mpp-drivers\">\n <div class=\"mpp-drivers-title\">\n <i class=\"fa-solid fa-ranking-star\" aria-hidden=\"true\"></i>\n Top drivers\n </div>\n @for (driver of card.Drivers; track driver.name) {\n <div class=\"mpp-driver\">\n <span class=\"mpp-driver-name\" [title]=\"driver.name\">{{ driver.name }}</span>\n <span class=\"mpp-driver-bar-track\">\n <span class=\"mpp-driver-bar-fill\" [style.width.%]=\"driver.RelativePct\"></span>\n </span>\n </div>\n }\n </div>\n }\n\n </div>\n }\n </div>\n }\n\n <!-- Prediction History Section -->\n <div class=\"mpp-history-section\">\n <div class=\"mpp-history-header\" (click)=\"ToggleHistorySection()\" role=\"button\" tabindex=\"0\">\n <div class=\"mpp-history-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>Prediction History</span>\n @if (HistoryItems.length > 0) {\n <span class=\"mpp-history-badge\">{{ HistoryItems.length }}</span>\n }\n </div>\n <div class=\"mpp-history-chevron\">\n <i [class]=\"ShowHistorySection ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </div>\n </div>\n\n @if (ShowHistorySection) {\n <div class=\"mpp-history-body\">\n @if (LoadingHistory) {\n <div class=\"mpp-history-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading prediction history\u2026\n </div>\n } @else if (HistoryItems.length === 0) {\n <div class=\"mpp-history-empty\">\n No historical prediction runs recorded for this record yet.\n </div>\n } @else {\n <!-- Multi-model filter tabs if multiple models present -->\n @if (ModelSummaries.length > 1) {\n <div class=\"mpp-model-filters\">\n <button type=\"button\" \n class=\"mpp-filter-pill\" \n [class.active]=\"SelectedModelId === null || SelectedModelId === 'ALL'\"\n (click)=\"SelectModelFilter(null)\">\n All Models ({{ HistoryItems.length }})\n </button>\n @for (mod of ModelSummaries; track mod.modelId) {\n <button type=\"button\" \n class=\"mpp-filter-pill\" \n [class.active]=\"SelectedModelId === mod.modelId\"\n (click)=\"SelectModelFilter(mod.modelId)\">\n {{ mod.ModelName }} ({{ mod.count }})\n </button>\n }\n </div>\n }\n\n <!-- History table -->\n <div class=\"mpp-history-table-wrap\">\n <table class=\"mpp-history-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Model</th>\n <th>Prediction</th>\n <th>Status</th>\n <th class=\"actions-th\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (item of FilteredHistory; track item.id) {\n <tr class=\"mpp-history-row\" [class.expanded]=\"ExpandedHistoryItemId === item.id\">\n <td class=\"mpp-col-date\">{{ item.FormattedTime }}</td>\n <td class=\"mpp-col-model\">\n <div class=\"mpp-history-model-name\">{{ item.ModelName }}</div>\n <div class=\"mpp-history-model-prov\">{{ item.Provenance }}</div>\n </td>\n <td class=\"mpp-col-pred\">\n <div class=\"mpp-pred-cell\">\n <span class=\"mpp-history-pred-val\">{{ item.DisplayValue }}</span>\n @if (item.PredictedClass && item.NumericValue != null && item.IsProbability) {\n <span class=\"mpp-history-pred-sub\">({{ (item.NumericValue * 100) | number:'1.0-1' }}%)</span>\n }\n @if (item.StatusLabel) {\n <span class=\"mpp-status-badge mpp-badge-sm\" [class]=\"'mpp-badge-' + item.BadgeColor\">\n @if (item.BadgeIcon) {\n <i [class]=\"'fa-solid ' + item.BadgeIcon\"></i>\n }\n <span>{{ item.StatusLabel }}</span>\n </span>\n }\n </div>\n </td>\n <td class=\"mpp-col-status\">\n <span class=\"mpp-status-pill\" [class]=\"'mpp-status-' + item.status.toLowerCase()\">\n {{ item.status }}\n </span>\n </td>\n <td class=\"mpp-col-actions\">\n <button type=\"button\" \n class=\"mpp-action-btn\"\n (click)=\"ToggleHistoryDetails(item, $event)\" \n [title]=\"ExpandedHistoryItemId === item.id ? 'Hide details' : 'Inspect payload & drivers'\">\n <i [class]=\"ExpandedHistoryItemId === item.id ? 'fa-solid fa-chevron-up' : 'fa-solid fa-code'\"></i>\n {{ ExpandedHistoryItemId === item.id ? 'Close' : 'Inspect' }}\n </button>\n <button type=\"button\" \n class=\"mpp-action-btn mpp-action-drilldown\"\n (click)=\"DrilldownToPredictionRecord(item, $event)\"\n title=\"Open underlying Process Run Detail record in Explorer\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open Row\n </button>\n </td>\n </tr>\n @if (ExpandedHistoryItemId === item.id) {\n <tr class=\"mpp-history-detail-row\">\n <td colspan=\"5\">\n <div class=\"mpp-history-detail-pane\">\n @if (item.ErrorMessage) {\n <div class=\"mpp-detail-error\">\n <strong>Error:</strong> {{ item.ErrorMessage }}\n </div>\n }\n @if (item.Drivers.length > 0) {\n <div class=\"mpp-detail-drivers\">\n <div class=\"mpp-detail-subtitle\"><i class=\"fa-solid fa-ranking-star\"></i> Attributed Drivers</div>\n <div class=\"mpp-detail-driver-list\">\n @for (d of item.Drivers; track d.name) {\n <div class=\"mpp-detail-driver-item\">\n <span class=\"mpp-driver-name\">{{ d.name }}</span>\n <span class=\"mpp-driver-bar-track\">\n <span class=\"mpp-driver-bar-fill\" [style.width.%]=\"d.RelativePct\"></span>\n </span>\n </div>\n }\n </div>\n </div>\n }\n <div class=\"mpp-detail-payload\">\n <div class=\"mpp-detail-subtitle\"><i class=\"fa-solid fa-file-code\"></i> Result Payload</div>\n <pre class=\"mpp-payload-pre\">{{ item.RawPayload | json }}</pre>\n </div>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n\n </mj-collapsible-panel>\n}\n", styles: ["/* Entity-agnostic model-prediction panel.\n Design-token-clean: every color is a --mj-* semantic token. The gauge bands\n are intentionally NEUTRAL \u2014 they encode position on the value axis (low/mid/high)\n via opacity of a single brand color, never green=good / red=bad. */\n\n.mpp-cards {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 4px 2px;\n}\n\n.mpp-card {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface-card);\n padding: 14px 16px;\n}\n\n/* ---- Header ---- */\n.mpp-card-head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.mpp-label {\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-provenance {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.mpp-prov-icon {\n color: var(--mj-brand-primary);\n}\n\n.mpp-dot {\n color: var(--mj-text-disabled);\n}\n\n/* ---- Primary value ---- */\n.mpp-value-row {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 2px 0 10px;\n}\n\n/* ---- Status Badge ---- */\n.mpp-status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: var(--mj-radius-full, 9999px);\n line-height: 1.3;\n}\n\n.mpp-badge-sm {\n padding: 1px 6px;\n font-size: 0.7rem;\n}\n\n.mpp-badge-green {\n background: color-mix(in srgb, var(--mj-status-success, #16a34a) 15%, transparent);\n color: var(--mj-status-success, #16a34a);\n}\n\n.mpp-badge-red {\n background: color-mix(in srgb, var(--mj-status-danger, #dc2626) 15%, transparent);\n color: var(--mj-status-danger, #dc2626);\n}\n\n.mpp-badge-amber {\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 15%, transparent);\n color: var(--mj-status-warning, #d97706);\n}\n\n.mpp-badge-blue {\n background: color-mix(in srgb, var(--mj-status-info, #2563eb) 15%, transparent);\n color: var(--mj-status-info, #2563eb);\n}\n\n.mpp-badge-gray {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.mpp-pred-cell {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.mpp-value {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.1;\n color: var(--mj-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.mpp-value-muted {\n color: var(--mj-text-disabled);\n font-weight: 500;\n}\n\n/* ---- Gauge (neutral tercile) ---- */\n.mpp-gauge {\n margin-bottom: 4px;\n}\n\n.mpp-gauge-track {\n position: relative;\n height: 10px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.mpp-gauge-fill {\n height: 100%;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n}\n\n/* Band shading: same brand hue, varied opacity = neutral position cue only. */\n.mpp-band-low {\n background: color-mix(in srgb, var(--mj-brand-primary) 55%, transparent);\n}\n.mpp-band-mid {\n background: color-mix(in srgb, var(--mj-brand-primary) 78%, transparent);\n}\n.mpp-band-high {\n background: var(--mj-brand-primary);\n}\n\n/* Outcome polarity gauge fill colors */\n.mpp-gauge-fill.mpp-color-green {\n background: var(--mj-status-success, #16a34a);\n}\n.mpp-gauge-fill.mpp-color-red {\n background: var(--mj-status-danger, #dc2626);\n}\n.mpp-gauge-fill.mpp-color-amber {\n background: var(--mj-status-warning, #d97706);\n}\n.mpp-gauge-fill.mpp-color-blue {\n background: var(--mj-status-info, #2563eb);\n}\n.mpp-gauge-fill.mpp-color-gray {\n background: var(--mj-text-muted);\n}\n\n.mpp-gauge-scale {\n display: flex;\n justify-content: space-between;\n margin-top: 4px;\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n/* ---- Drivers ---- */\n.mpp-drivers {\n margin-top: 12px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n}\n\n.mpp-drivers-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.mpp-driver {\n display: grid;\n grid-template-columns: minmax(80px, 38%) 1fr;\n align-items: center;\n gap: 10px;\n margin-bottom: 6px;\n}\n\n.mpp-driver-name {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mpp-driver-bar-track {\n display: block;\n height: 7px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n}\n\n.mpp-driver-bar-fill {\n display: block;\n height: 100%;\n border-radius: var(--mj-radius-full, 9999px);\n background: color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n transition: width 0.3s ease;\n}\n\n/* ---- Card History Action Button ---- */\n.mpp-head-left {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mpp-card-history-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 4px);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mpp-card-history-btn:hover {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n/* ---- Prediction History Section ---- */\n.mpp-history-section {\n margin-top: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.mpp-history-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.mpp-history-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mpp-history-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-history-title i {\n color: var(--mj-brand-primary);\n}\n\n.mpp-history-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 6px;\n font-size: 0.7rem;\n font-weight: 600;\n border-radius: 999px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n}\n\n.mpp-history-chevron {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.mpp-history-body {\n padding: 12px 14px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.mpp-history-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n padding: 8px 0;\n}\n\n.mpp-history-empty {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n padding: 8px 0;\n}\n\n/* ---- Multi-Model Filter Tabs ---- */\n.mpp-model-filters {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.mpp-filter-pill {\n padding: 3px 10px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mpp-filter-pill:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-hover, var(--mj-brand-primary));\n}\n\n.mpp-filter-pill.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-color: var(--mj-brand-primary);\n}\n\n/* ---- History Table ---- */\n.mpp-history-table-wrap {\n overflow-x: auto;\n}\n\n.mpp-history-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8rem;\n}\n\n.mpp-history-table th {\n text-align: left;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n padding: 6px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mpp-history-table th.actions-th {\n text-align: right;\n}\n\n.mpp-history-table td {\n padding: 8px;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n vertical-align: middle;\n}\n\n.mpp-history-row:hover td {\n background: var(--mj-bg-surface-hover);\n}\n\n.mpp-history-row.expanded td {\n background: var(--mj-bg-surface-sunken);\n}\n\n.mpp-col-date {\n white-space: nowrap;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.mpp-col-model {\n min-width: 140px;\n}\n\n.mpp-history-model-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-history-model-prov {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.mpp-col-pred {\n white-space: nowrap;\n}\n\n.mpp-history-pred-val {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mpp-history-pred-sub {\n margin-left: 4px;\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n/* Status Pill */\n.mpp-status-pill {\n display: inline-block;\n padding: 1px 7px;\n font-size: 0.7rem;\n font-weight: 600;\n border-radius: 999px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n.mpp-status-succeeded {\n background: color-mix(in srgb, var(--mj-status-success, #16a34a) 15%, transparent);\n color: var(--mj-status-success, #16a34a);\n}\n\n.mpp-status-failed {\n background: color-mix(in srgb, var(--mj-status-danger, #dc2626) 15%, transparent);\n color: var(--mj-status-danger, #dc2626);\n}\n\n.mpp-status-pending,\n.mpp-status-skipped {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n/* Actions in History Row */\n.mpp-col-actions {\n text-align: right;\n white-space: nowrap;\n}\n\n.mpp-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 7px;\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 4px);\n cursor: pointer;\n margin-left: 4px;\n transition: all 0.15s ease;\n}\n\n.mpp-action-btn:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-hover, var(--mj-brand-primary));\n}\n\n.mpp-action-drilldown {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.mpp-action-drilldown:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n}\n\n/* Inspection Drawer */\n.mpp-history-detail-row td {\n padding: 0;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mpp-history-detail-pane {\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.mpp-detail-subtitle {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.mpp-detail-error {\n font-size: 0.78rem;\n color: var(--mj-status-danger, #dc2626);\n background: color-mix(in srgb, var(--mj-status-danger, #dc2626) 8%, transparent);\n padding: 6px 10px;\n border-radius: var(--mj-radius-sm, 4px);\n}\n\n.mpp-detail-driver-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-width: 380px;\n}\n\n.mpp-detail-driver-item {\n display: grid;\n grid-template-columns: minmax(80px, 45%) 1fr;\n align-items: center;\n gap: 8px;\n}\n\n.mpp-detail-payload {\n margin-top: 2px;\n}\n\n.mpp-payload-pre {\n margin: 0;\n padding: 8px 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.72rem;\n line-height: 1.4;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 4px);\n overflow-x: auto;\n max-height: 200px;\n color: var(--mj-text-primary);\n}\n"] }]
|
|
780
788
|
}], null, null); })();
|
|
781
789
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelPredictionPanel, { className: "ModelPredictionPanel", filePath: "src/lib/panels/model-predictions/model-prediction.panel.ts", lineNumber: 101 }); })();
|
|
782
790
|
/** Tree-shake guard — call this from the consuming module's loader. */
|