@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
|
@@ -1293,53 +1293,265 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1293
1293
|
super(...arguments);
|
|
1294
1294
|
this.destroy$ = new Subject();
|
|
1295
1295
|
// UI state
|
|
1296
|
-
this.
|
|
1297
|
-
this.
|
|
1298
|
-
this.
|
|
1299
|
-
this.
|
|
1296
|
+
this.ActiveTab = 'overview';
|
|
1297
|
+
this.Loading = false;
|
|
1298
|
+
this.LoadingRuns = false;
|
|
1299
|
+
this.LoadingSuites = false;
|
|
1300
1300
|
this.error = null;
|
|
1301
|
-
this.
|
|
1302
|
-
this.
|
|
1303
|
-
this.isRefreshing = false;
|
|
1301
|
+
this.TestRunsLoaded = false;
|
|
1302
|
+
this.SuiteTestsLoaded = false;
|
|
1303
|
+
this.isRefreshing = false; // case-violation-ok-legacy-back-compat: an ancestor class already declares the PascalCase name
|
|
1304
1304
|
// Related data
|
|
1305
|
-
this.
|
|
1306
|
-
this.
|
|
1305
|
+
this.TestRuns = [];
|
|
1306
|
+
this.SuiteTests = [];
|
|
1307
1307
|
// Human feedback map: testRunId -> feedback entity
|
|
1308
|
-
this.
|
|
1308
|
+
this.FeedbackMap = new Map();
|
|
1309
1309
|
// History tab data
|
|
1310
|
-
this.
|
|
1311
|
-
this.
|
|
1312
|
-
this.
|
|
1313
|
-
this.
|
|
1314
|
-
this.
|
|
1315
|
-
this.
|
|
1316
|
-
this.
|
|
1310
|
+
this.HistoryLoaded = false;
|
|
1311
|
+
this.LoadingHistory = false;
|
|
1312
|
+
this.HistoryTimeRange = '30d';
|
|
1313
|
+
this.HistoryData = [];
|
|
1314
|
+
this.SuitePerformance = [];
|
|
1315
|
+
this.UniqueTags = [];
|
|
1316
|
+
this.SelectedTagFilter = null;
|
|
1317
1317
|
// Parsed JSON fields
|
|
1318
|
-
this.
|
|
1318
|
+
this.ParsedData = {};
|
|
1319
1319
|
// Active JSON view
|
|
1320
|
-
this.
|
|
1320
|
+
this.ActiveJsonView = 'input';
|
|
1321
1321
|
// Code editor configuration
|
|
1322
|
-
this.
|
|
1322
|
+
this.JsonToolbar = createCopyOnlyToolbar();
|
|
1323
1323
|
// Keyboard shortcuts
|
|
1324
|
-
this.
|
|
1325
|
-
this.
|
|
1324
|
+
this.KeyboardShortcutsEnabled = true;
|
|
1325
|
+
this.ShowShortcuts = false;
|
|
1326
1326
|
this.shortcutsSettingEntity = null;
|
|
1327
1327
|
// Evaluation preferences
|
|
1328
|
-
this.
|
|
1328
|
+
this.EvalPreferences = { showExecution: true, showHuman: true, showAuto: false };
|
|
1329
1329
|
// Service injections
|
|
1330
1330
|
this.navigationService = inject(NavigationService);
|
|
1331
|
-
this.
|
|
1331
|
+
this.TestingDialogService = inject(TestingDialogService);
|
|
1332
1332
|
this.evalPrefsService = inject(EvaluationPreferencesService);
|
|
1333
1333
|
this.viewContainerRef = inject(ViewContainerRef);
|
|
1334
1334
|
this.appManager = inject(ApplicationManager);
|
|
1335
1335
|
this.confirmService = inject(MJConfirmService);
|
|
1336
1336
|
// Edit state
|
|
1337
|
-
this.
|
|
1338
|
-
this.
|
|
1339
|
-
this.
|
|
1340
|
-
this.
|
|
1337
|
+
this.IsSaving = false;
|
|
1338
|
+
this.TestTypeOptions = [];
|
|
1339
|
+
this.TagDraft = '';
|
|
1340
|
+
this.StatusOptions = ['Active', 'Pending', 'Disabled'];
|
|
1341
1341
|
}
|
|
1342
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
1343
|
+
get activeTab() {
|
|
1344
|
+
return this.ActiveTab;
|
|
1345
|
+
}
|
|
1346
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
1347
|
+
set activeTab(value) {
|
|
1348
|
+
this.ActiveTab = value;
|
|
1349
|
+
}
|
|
1350
|
+
/** @deprecated Use {@link Loading}. */
|
|
1351
|
+
get loading() {
|
|
1352
|
+
return this.Loading;
|
|
1353
|
+
}
|
|
1354
|
+
/** @deprecated Use {@link Loading}. */
|
|
1355
|
+
set loading(value) {
|
|
1356
|
+
this.Loading = value;
|
|
1357
|
+
}
|
|
1358
|
+
/** @deprecated Use {@link LoadingRuns}. */
|
|
1359
|
+
get loadingRuns() {
|
|
1360
|
+
return this.LoadingRuns;
|
|
1361
|
+
}
|
|
1362
|
+
/** @deprecated Use {@link LoadingRuns}. */
|
|
1363
|
+
set loadingRuns(value) {
|
|
1364
|
+
this.LoadingRuns = value;
|
|
1365
|
+
}
|
|
1366
|
+
/** @deprecated Use {@link LoadingSuites}. */
|
|
1367
|
+
get loadingSuites() {
|
|
1368
|
+
return this.LoadingSuites;
|
|
1369
|
+
}
|
|
1370
|
+
/** @deprecated Use {@link LoadingSuites}. */
|
|
1371
|
+
set loadingSuites(value) {
|
|
1372
|
+
this.LoadingSuites = value;
|
|
1373
|
+
}
|
|
1374
|
+
/** @deprecated Use {@link TestRunsLoaded}. */
|
|
1375
|
+
get testRunsLoaded() {
|
|
1376
|
+
return this.TestRunsLoaded;
|
|
1377
|
+
}
|
|
1378
|
+
/** @deprecated Use {@link TestRunsLoaded}. */
|
|
1379
|
+
set testRunsLoaded(value) {
|
|
1380
|
+
this.TestRunsLoaded = value;
|
|
1381
|
+
}
|
|
1382
|
+
/** @deprecated Use {@link SuiteTestsLoaded}. */
|
|
1383
|
+
get suiteTestsLoaded() {
|
|
1384
|
+
return this.SuiteTestsLoaded;
|
|
1385
|
+
}
|
|
1386
|
+
/** @deprecated Use {@link SuiteTestsLoaded}. */
|
|
1387
|
+
set suiteTestsLoaded(value) {
|
|
1388
|
+
this.SuiteTestsLoaded = value;
|
|
1389
|
+
}
|
|
1390
|
+
/** @deprecated Use {@link TestRuns}. */
|
|
1391
|
+
get testRuns() {
|
|
1392
|
+
return this.TestRuns;
|
|
1393
|
+
}
|
|
1394
|
+
/** @deprecated Use {@link TestRuns}. */
|
|
1395
|
+
set testRuns(value) {
|
|
1396
|
+
this.TestRuns = value;
|
|
1397
|
+
}
|
|
1398
|
+
/** @deprecated Use {@link SuiteTests}. */
|
|
1399
|
+
get suiteTests() {
|
|
1400
|
+
return this.SuiteTests;
|
|
1401
|
+
}
|
|
1402
|
+
/** @deprecated Use {@link SuiteTests}. */
|
|
1403
|
+
set suiteTests(value) {
|
|
1404
|
+
this.SuiteTests = value;
|
|
1405
|
+
}
|
|
1406
|
+
/** @deprecated Use {@link FeedbackMap}. */
|
|
1407
|
+
get feedbackMap() {
|
|
1408
|
+
return this.FeedbackMap;
|
|
1409
|
+
}
|
|
1410
|
+
/** @deprecated Use {@link FeedbackMap}. */
|
|
1411
|
+
set feedbackMap(value) {
|
|
1412
|
+
this.FeedbackMap = value;
|
|
1413
|
+
}
|
|
1414
|
+
/** @deprecated Use {@link HistoryLoaded}. */
|
|
1415
|
+
get historyLoaded() {
|
|
1416
|
+
return this.HistoryLoaded;
|
|
1417
|
+
}
|
|
1418
|
+
/** @deprecated Use {@link HistoryLoaded}. */
|
|
1419
|
+
set historyLoaded(value) {
|
|
1420
|
+
this.HistoryLoaded = value;
|
|
1421
|
+
}
|
|
1422
|
+
/** @deprecated Use {@link LoadingHistory}. */
|
|
1423
|
+
get loadingHistory() {
|
|
1424
|
+
return this.LoadingHistory;
|
|
1425
|
+
}
|
|
1426
|
+
/** @deprecated Use {@link LoadingHistory}. */
|
|
1427
|
+
set loadingHistory(value) {
|
|
1428
|
+
this.LoadingHistory = value;
|
|
1429
|
+
}
|
|
1430
|
+
/** @deprecated Use {@link HistoryTimeRange}. */
|
|
1431
|
+
get historyTimeRange() {
|
|
1432
|
+
return this.HistoryTimeRange;
|
|
1433
|
+
}
|
|
1434
|
+
/** @deprecated Use {@link HistoryTimeRange}. */
|
|
1435
|
+
set historyTimeRange(value) {
|
|
1436
|
+
this.HistoryTimeRange = value;
|
|
1437
|
+
}
|
|
1438
|
+
/** @deprecated Use {@link HistoryData}. */
|
|
1439
|
+
get historyData() {
|
|
1440
|
+
return this.HistoryData;
|
|
1441
|
+
}
|
|
1442
|
+
/** @deprecated Use {@link HistoryData}. */
|
|
1443
|
+
set historyData(value) {
|
|
1444
|
+
this.HistoryData = value;
|
|
1445
|
+
}
|
|
1446
|
+
/** @deprecated Use {@link SuitePerformance}. */
|
|
1447
|
+
get suitePerformance() {
|
|
1448
|
+
return this.SuitePerformance;
|
|
1449
|
+
}
|
|
1450
|
+
/** @deprecated Use {@link SuitePerformance}. */
|
|
1451
|
+
set suitePerformance(value) {
|
|
1452
|
+
this.SuitePerformance = value;
|
|
1453
|
+
}
|
|
1454
|
+
/** @deprecated Use {@link UniqueTags}. */
|
|
1455
|
+
get uniqueTags() {
|
|
1456
|
+
return this.UniqueTags;
|
|
1457
|
+
}
|
|
1458
|
+
/** @deprecated Use {@link UniqueTags}. */
|
|
1459
|
+
set uniqueTags(value) {
|
|
1460
|
+
this.UniqueTags = value;
|
|
1461
|
+
}
|
|
1462
|
+
/** @deprecated Use {@link SelectedTagFilter}. */
|
|
1463
|
+
get selectedTagFilter() {
|
|
1464
|
+
return this.SelectedTagFilter;
|
|
1465
|
+
}
|
|
1466
|
+
/** @deprecated Use {@link SelectedTagFilter}. */
|
|
1467
|
+
set selectedTagFilter(value) {
|
|
1468
|
+
this.SelectedTagFilter = value;
|
|
1469
|
+
}
|
|
1470
|
+
/** @deprecated Use {@link ParsedData}. */
|
|
1471
|
+
get parsedData() {
|
|
1472
|
+
return this.ParsedData;
|
|
1473
|
+
}
|
|
1474
|
+
/** @deprecated Use {@link ParsedData}. */
|
|
1475
|
+
set parsedData(value) {
|
|
1476
|
+
this.ParsedData = value;
|
|
1477
|
+
}
|
|
1478
|
+
/** @deprecated Use {@link ActiveJsonView}. */
|
|
1479
|
+
get activeJsonView() {
|
|
1480
|
+
return this.ActiveJsonView;
|
|
1481
|
+
}
|
|
1482
|
+
/** @deprecated Use {@link ActiveJsonView}. */
|
|
1483
|
+
set activeJsonView(value) {
|
|
1484
|
+
this.ActiveJsonView = value;
|
|
1485
|
+
}
|
|
1486
|
+
/** @deprecated Use {@link JsonToolbar}. */
|
|
1487
|
+
get jsonToolbar() {
|
|
1488
|
+
return this.JsonToolbar;
|
|
1489
|
+
}
|
|
1490
|
+
/** @deprecated Use {@link JsonToolbar}. */
|
|
1491
|
+
set jsonToolbar(value) {
|
|
1492
|
+
this.JsonToolbar = value;
|
|
1493
|
+
}
|
|
1494
|
+
/** @deprecated Use {@link KeyboardShortcutsEnabled}. */
|
|
1495
|
+
get keyboardShortcutsEnabled() {
|
|
1496
|
+
return this.KeyboardShortcutsEnabled;
|
|
1497
|
+
}
|
|
1498
|
+
/** @deprecated Use {@link KeyboardShortcutsEnabled}. */
|
|
1499
|
+
set keyboardShortcutsEnabled(value) {
|
|
1500
|
+
this.KeyboardShortcutsEnabled = value;
|
|
1501
|
+
}
|
|
1502
|
+
/** @deprecated Use {@link ShowShortcuts}. */
|
|
1503
|
+
get showShortcuts() {
|
|
1504
|
+
return this.ShowShortcuts;
|
|
1505
|
+
}
|
|
1506
|
+
/** @deprecated Use {@link ShowShortcuts}. */
|
|
1507
|
+
set showShortcuts(value) {
|
|
1508
|
+
this.ShowShortcuts = value;
|
|
1509
|
+
} // Hidden by default
|
|
1342
1510
|
get metadata() { return this.ProviderToUse; }
|
|
1511
|
+
/** @deprecated Use {@link EvalPreferences}. */
|
|
1512
|
+
get evalPreferences() {
|
|
1513
|
+
return this.EvalPreferences;
|
|
1514
|
+
}
|
|
1515
|
+
/** @deprecated Use {@link EvalPreferences}. */
|
|
1516
|
+
set evalPreferences(value) {
|
|
1517
|
+
this.EvalPreferences = value;
|
|
1518
|
+
}
|
|
1519
|
+
/** @deprecated Use {@link TestingDialogService}. */
|
|
1520
|
+
get testingDialogService() {
|
|
1521
|
+
return this.TestingDialogService;
|
|
1522
|
+
}
|
|
1523
|
+
/** @deprecated Use {@link TestingDialogService}. */
|
|
1524
|
+
set testingDialogService(value) {
|
|
1525
|
+
this.TestingDialogService = value;
|
|
1526
|
+
}
|
|
1527
|
+
/** @deprecated Use {@link IsSaving}. */
|
|
1528
|
+
get isSaving() {
|
|
1529
|
+
return this.IsSaving;
|
|
1530
|
+
}
|
|
1531
|
+
/** @deprecated Use {@link IsSaving}. */
|
|
1532
|
+
set isSaving(value) {
|
|
1533
|
+
this.IsSaving = value;
|
|
1534
|
+
}
|
|
1535
|
+
/** @deprecated Use {@link TestTypeOptions}. */
|
|
1536
|
+
get testTypeOptions() {
|
|
1537
|
+
return this.TestTypeOptions;
|
|
1538
|
+
}
|
|
1539
|
+
/** @deprecated Use {@link TestTypeOptions}. */
|
|
1540
|
+
set testTypeOptions(value) {
|
|
1541
|
+
this.TestTypeOptions = value;
|
|
1542
|
+
}
|
|
1543
|
+
/** @deprecated Use {@link TagDraft}. */
|
|
1544
|
+
get tagDraft() {
|
|
1545
|
+
return this.TagDraft;
|
|
1546
|
+
}
|
|
1547
|
+
/** @deprecated Use {@link TagDraft}. */
|
|
1548
|
+
set tagDraft(value) {
|
|
1549
|
+
this.TagDraft = value;
|
|
1550
|
+
}
|
|
1551
|
+
/** @deprecated Use {@link StatusOptions}. */
|
|
1552
|
+
get statusOptions() {
|
|
1553
|
+
return this.StatusOptions;
|
|
1554
|
+
}
|
|
1343
1555
|
async ngOnInit() {
|
|
1344
1556
|
await super.ngOnInit();
|
|
1345
1557
|
this.loadShortcutsSetting();
|
|
@@ -1349,11 +1561,11 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1349
1561
|
this.evalPrefsService.preferences$
|
|
1350
1562
|
.pipe(takeUntil(this.destroy$))
|
|
1351
1563
|
.subscribe(prefs => {
|
|
1352
|
-
this.
|
|
1564
|
+
this.EvalPreferences = prefs;
|
|
1353
1565
|
this.cdr.markForCheck();
|
|
1354
1566
|
});
|
|
1355
1567
|
// Subscribe to panel state changes so the slide panel renders in this form
|
|
1356
|
-
this.
|
|
1568
|
+
this.TestingDialogService.PanelStateChanged$
|
|
1357
1569
|
.pipe(takeUntil(this.destroy$))
|
|
1358
1570
|
.subscribe(() => {
|
|
1359
1571
|
this.cdr.detectChanges();
|
|
@@ -1368,52 +1580,52 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1368
1580
|
}
|
|
1369
1581
|
// Keyboard shortcuts
|
|
1370
1582
|
handleKeyboardShortcut(event) {
|
|
1371
|
-
if (!this.
|
|
1583
|
+
if (!this.KeyboardShortcutsEnabled)
|
|
1372
1584
|
return;
|
|
1373
1585
|
// Cmd/Ctrl + S: Save (if dirty)
|
|
1374
1586
|
if ((event.metaKey || event.ctrlKey) && event.key === 's' && !event.shiftKey) {
|
|
1375
|
-
if (this.
|
|
1587
|
+
if (this.IsDirty) {
|
|
1376
1588
|
event.preventDefault();
|
|
1377
|
-
this.
|
|
1589
|
+
this.SaveChanges();
|
|
1378
1590
|
}
|
|
1379
1591
|
return;
|
|
1380
1592
|
}
|
|
1381
1593
|
// Cmd/Ctrl + R: Refresh
|
|
1382
1594
|
if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {
|
|
1383
1595
|
event.preventDefault();
|
|
1384
|
-
this.
|
|
1596
|
+
this.Refresh();
|
|
1385
1597
|
return;
|
|
1386
1598
|
}
|
|
1387
1599
|
// Cmd/Ctrl + Enter: Run test
|
|
1388
1600
|
if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {
|
|
1389
1601
|
event.preventDefault();
|
|
1390
|
-
this.
|
|
1602
|
+
this.RunTest();
|
|
1391
1603
|
return;
|
|
1392
1604
|
}
|
|
1393
1605
|
// Number keys for tabs (1-5) — skip when typing into form inputs
|
|
1394
1606
|
if (!event.metaKey && !event.ctrlKey && !event.altKey && !this.isTextInputFocused()) {
|
|
1395
1607
|
switch (event.key) {
|
|
1396
1608
|
case '1':
|
|
1397
|
-
this.
|
|
1609
|
+
this.ChangeTab('overview');
|
|
1398
1610
|
break;
|
|
1399
1611
|
case '2':
|
|
1400
|
-
this.
|
|
1612
|
+
this.ChangeTab('config');
|
|
1401
1613
|
break;
|
|
1402
1614
|
case '3':
|
|
1403
|
-
this.
|
|
1615
|
+
this.ChangeTab('runs');
|
|
1404
1616
|
break;
|
|
1405
1617
|
case '4':
|
|
1406
|
-
this.
|
|
1618
|
+
this.ChangeTab('suites');
|
|
1407
1619
|
break;
|
|
1408
1620
|
case '5':
|
|
1409
|
-
this.
|
|
1621
|
+
this.ChangeTab('analytics');
|
|
1410
1622
|
break;
|
|
1411
1623
|
}
|
|
1412
1624
|
}
|
|
1413
1625
|
}
|
|
1414
1626
|
// Warn before tab close / hard navigation when there are unsaved changes
|
|
1415
1627
|
handleBeforeUnload(event) {
|
|
1416
|
-
if (this.
|
|
1628
|
+
if (this.IsDirty) {
|
|
1417
1629
|
event.preventDefault();
|
|
1418
1630
|
event.returnValue = '';
|
|
1419
1631
|
}
|
|
@@ -1426,9 +1638,9 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1426
1638
|
return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el.isContentEditable;
|
|
1427
1639
|
}
|
|
1428
1640
|
async loadTestRuns() {
|
|
1429
|
-
if (this.
|
|
1641
|
+
if (this.TestRunsLoaded)
|
|
1430
1642
|
return;
|
|
1431
|
-
this.
|
|
1643
|
+
this.LoadingRuns = true;
|
|
1432
1644
|
this.cdr.markForCheck();
|
|
1433
1645
|
try {
|
|
1434
1646
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
@@ -1440,20 +1652,20 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1440
1652
|
ResultType: 'entity_object'
|
|
1441
1653
|
});
|
|
1442
1654
|
if (result.Success) {
|
|
1443
|
-
this.
|
|
1655
|
+
this.TestRuns = result.Results || [];
|
|
1444
1656
|
// Load feedbacks for all test runs
|
|
1445
|
-
if (this.
|
|
1446
|
-
await this.loadFeedbacksForTestRuns(this.
|
|
1657
|
+
if (this.TestRuns.length > 0) {
|
|
1658
|
+
await this.loadFeedbacksForTestRuns(this.TestRuns.map(r => r.ID));
|
|
1447
1659
|
}
|
|
1448
1660
|
}
|
|
1449
|
-
this.
|
|
1661
|
+
this.TestRunsLoaded = true;
|
|
1450
1662
|
}
|
|
1451
1663
|
catch (error) {
|
|
1452
1664
|
console.error('Error loading test runs:', error);
|
|
1453
1665
|
SharedService.Instance.CreateSimpleNotification('Failed to load test runs', 'error', 3000);
|
|
1454
1666
|
}
|
|
1455
1667
|
finally {
|
|
1456
|
-
this.
|
|
1668
|
+
this.LoadingRuns = false;
|
|
1457
1669
|
this.cdr.markForCheck();
|
|
1458
1670
|
}
|
|
1459
1671
|
}
|
|
@@ -1476,7 +1688,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1476
1688
|
});
|
|
1477
1689
|
if (result.Success && result.Results) {
|
|
1478
1690
|
for (const feedback of result.Results) {
|
|
1479
|
-
this.
|
|
1691
|
+
this.FeedbackMap.set(feedback.TestRunID, feedback);
|
|
1480
1692
|
}
|
|
1481
1693
|
}
|
|
1482
1694
|
}
|
|
@@ -1488,13 +1700,17 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1488
1700
|
/**
|
|
1489
1701
|
* Get feedback for a specific test run
|
|
1490
1702
|
*/
|
|
1703
|
+
GetFeedbackForRun(testRunId) {
|
|
1704
|
+
return this.FeedbackMap.get(testRunId);
|
|
1705
|
+
}
|
|
1706
|
+
/** @deprecated Use {@link GetFeedbackForRun}. */
|
|
1491
1707
|
getFeedbackForRun(testRunId) {
|
|
1492
|
-
return this.
|
|
1708
|
+
return this.GetFeedbackForRun(testRunId);
|
|
1493
1709
|
}
|
|
1494
1710
|
/**
|
|
1495
1711
|
* Get tooltip for status indicator
|
|
1496
1712
|
*/
|
|
1497
|
-
|
|
1713
|
+
GetStatusTooltip(status) {
|
|
1498
1714
|
switch (status) {
|
|
1499
1715
|
case 'Passed': return 'Status: Passed - Test completed without error';
|
|
1500
1716
|
case 'Failed': return 'Status: Failed - Test assertions did not pass';
|
|
@@ -1506,10 +1722,14 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1506
1722
|
default: return `Status: ${status}`;
|
|
1507
1723
|
}
|
|
1508
1724
|
}
|
|
1725
|
+
/** @deprecated Use {@link GetStatusTooltip}. */
|
|
1726
|
+
getStatusTooltip(status) {
|
|
1727
|
+
return this.GetStatusTooltip(status);
|
|
1728
|
+
}
|
|
1509
1729
|
/**
|
|
1510
1730
|
* Get tooltip for human review with rating and optional comments
|
|
1511
1731
|
*/
|
|
1512
|
-
|
|
1732
|
+
GetHumanTooltip(rating, comments) {
|
|
1513
1733
|
let tooltip = `Human Review: ${rating}/10 rating`;
|
|
1514
1734
|
if (comments) {
|
|
1515
1735
|
const truncated = comments.length > 200 ? comments.substring(0, 200) + '...' : comments;
|
|
@@ -1517,10 +1737,14 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1517
1737
|
}
|
|
1518
1738
|
return tooltip;
|
|
1519
1739
|
}
|
|
1740
|
+
/** @deprecated Use {@link GetHumanTooltip}. */
|
|
1741
|
+
getHumanTooltip(rating, comments) {
|
|
1742
|
+
return this.GetHumanTooltip(rating, comments);
|
|
1743
|
+
}
|
|
1520
1744
|
async loadSuiteTests() {
|
|
1521
|
-
if (this.
|
|
1745
|
+
if (this.SuiteTestsLoaded)
|
|
1522
1746
|
return;
|
|
1523
|
-
this.
|
|
1747
|
+
this.LoadingSuites = true;
|
|
1524
1748
|
this.cdr.markForCheck();
|
|
1525
1749
|
try {
|
|
1526
1750
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
@@ -1531,57 +1755,65 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1531
1755
|
ResultType: 'entity_object'
|
|
1532
1756
|
});
|
|
1533
1757
|
if (result.Success) {
|
|
1534
|
-
this.
|
|
1758
|
+
this.SuiteTests = result.Results || [];
|
|
1535
1759
|
}
|
|
1536
|
-
this.
|
|
1760
|
+
this.SuiteTestsLoaded = true;
|
|
1537
1761
|
}
|
|
1538
1762
|
catch (error) {
|
|
1539
1763
|
console.error('Error loading suite tests:', error);
|
|
1540
1764
|
SharedService.Instance.CreateSimpleNotification('Failed to load test suites', 'error', 3000);
|
|
1541
1765
|
}
|
|
1542
1766
|
finally {
|
|
1543
|
-
this.
|
|
1767
|
+
this.LoadingSuites = false;
|
|
1544
1768
|
this.cdr.markForCheck();
|
|
1545
1769
|
}
|
|
1546
1770
|
}
|
|
1547
1771
|
parseJsonFields() {
|
|
1548
1772
|
try {
|
|
1549
1773
|
if (this.record.InputDefinition) {
|
|
1550
|
-
this.
|
|
1774
|
+
this.ParsedData.inputDefinition = JSON.parse(this.record.InputDefinition);
|
|
1551
1775
|
}
|
|
1552
1776
|
if (this.record.ExpectedOutcomes) {
|
|
1553
|
-
this.
|
|
1777
|
+
this.ParsedData.expectedOutcomes = JSON.parse(this.record.ExpectedOutcomes);
|
|
1554
1778
|
}
|
|
1555
1779
|
if (this.record.Configuration) {
|
|
1556
|
-
this.
|
|
1780
|
+
this.ParsedData.configuration = JSON.parse(this.record.Configuration);
|
|
1557
1781
|
}
|
|
1558
1782
|
if (this.record.Tags) {
|
|
1559
|
-
this.
|
|
1783
|
+
this.ParsedData.tags = JSON.parse(this.record.Tags);
|
|
1560
1784
|
}
|
|
1561
1785
|
}
|
|
1562
1786
|
catch (error) {
|
|
1563
1787
|
console.error('Error parsing JSON fields:', error);
|
|
1564
1788
|
}
|
|
1565
1789
|
}
|
|
1566
|
-
|
|
1567
|
-
this.
|
|
1790
|
+
ChangeTab(tab) {
|
|
1791
|
+
this.ActiveTab = tab;
|
|
1568
1792
|
// Lazy load tabs
|
|
1569
|
-
if (tab === 'runs' && !this.
|
|
1793
|
+
if (tab === 'runs' && !this.TestRunsLoaded) {
|
|
1570
1794
|
this.loadTestRuns();
|
|
1571
1795
|
}
|
|
1572
|
-
if (tab === 'suites' && !this.
|
|
1796
|
+
if (tab === 'suites' && !this.SuiteTestsLoaded) {
|
|
1573
1797
|
this.loadSuiteTests();
|
|
1574
1798
|
}
|
|
1575
|
-
if (tab === 'analytics' && !this.
|
|
1576
|
-
this.
|
|
1799
|
+
if (tab === 'analytics' && !this.HistoryLoaded) {
|
|
1800
|
+
this.LoadHistory();
|
|
1577
1801
|
}
|
|
1578
1802
|
this.cdr.markForCheck();
|
|
1579
1803
|
}
|
|
1580
|
-
|
|
1581
|
-
|
|
1804
|
+
/** @deprecated Use {@link ChangeTab}. */
|
|
1805
|
+
changeTab(tab) {
|
|
1806
|
+
return this.ChangeTab(tab);
|
|
1807
|
+
}
|
|
1808
|
+
SetJsonView(view) {
|
|
1809
|
+
this.ActiveJsonView = view;
|
|
1582
1810
|
this.cdr.markForCheck();
|
|
1583
1811
|
}
|
|
1584
|
-
|
|
1812
|
+
/** @deprecated Use {@link SetJsonView}. */
|
|
1813
|
+
setJsonView(view) {
|
|
1814
|
+
return this.SetJsonView(view);
|
|
1815
|
+
}
|
|
1816
|
+
GetStatusColor() {
|
|
1585
1817
|
switch (this.record.Status) {
|
|
1586
1818
|
case 'Active': return '#10b981';
|
|
1587
1819
|
case 'Disabled': return '#6b7280';
|
|
@@ -1589,7 +1821,11 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1589
1821
|
default: return '#9ca3af';
|
|
1590
1822
|
}
|
|
1591
1823
|
}
|
|
1592
|
-
|
|
1824
|
+
/** @deprecated Use {@link GetStatusColor}. */
|
|
1825
|
+
getStatusColor() {
|
|
1826
|
+
return this.GetStatusColor();
|
|
1827
|
+
}
|
|
1828
|
+
GetStatusIcon() {
|
|
1593
1829
|
switch (this.record.Status) {
|
|
1594
1830
|
case 'Active': return 'fa-circle-check';
|
|
1595
1831
|
case 'Disabled': return 'fa-circle-stop';
|
|
@@ -1597,10 +1833,18 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1597
1833
|
default: return 'fa-circle-question';
|
|
1598
1834
|
}
|
|
1599
1835
|
}
|
|
1600
|
-
|
|
1836
|
+
/** @deprecated Use {@link GetStatusIcon}. */
|
|
1837
|
+
getStatusIcon() {
|
|
1838
|
+
return this.GetStatusIcon();
|
|
1839
|
+
}
|
|
1840
|
+
GetStatusClass() {
|
|
1601
1841
|
return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;
|
|
1602
1842
|
}
|
|
1603
|
-
|
|
1843
|
+
/** @deprecated Use {@link GetStatusClass}. */
|
|
1844
|
+
getStatusClass() {
|
|
1845
|
+
return this.GetStatusClass();
|
|
1846
|
+
}
|
|
1847
|
+
GetRunStatusColor(status) {
|
|
1604
1848
|
switch (status) {
|
|
1605
1849
|
case 'Passed': return '#10b981';
|
|
1606
1850
|
case 'Failed': return '#ef4444';
|
|
@@ -1611,23 +1855,39 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1611
1855
|
default: return '#6b7280';
|
|
1612
1856
|
}
|
|
1613
1857
|
}
|
|
1858
|
+
/** @deprecated Use {@link GetRunStatusColor}. */
|
|
1859
|
+
getRunStatusColor(status) {
|
|
1860
|
+
return this.GetRunStatusColor(status);
|
|
1861
|
+
}
|
|
1862
|
+
GetPassRate() {
|
|
1863
|
+
if (this.TestRuns.length === 0)
|
|
1864
|
+
return 0;
|
|
1865
|
+
const passed = this.TestRuns.filter(r => r.Status === 'Passed').length;
|
|
1866
|
+
return (passed / this.TestRuns.length) * 100;
|
|
1867
|
+
}
|
|
1868
|
+
/** @deprecated Use {@link GetPassRate}. */
|
|
1614
1869
|
getPassRate() {
|
|
1615
|
-
|
|
1870
|
+
return this.GetPassRate();
|
|
1871
|
+
}
|
|
1872
|
+
GetAverageCost() {
|
|
1873
|
+
if (this.TestRuns.length === 0)
|
|
1616
1874
|
return 0;
|
|
1617
|
-
const
|
|
1618
|
-
return
|
|
1875
|
+
const totalCost = this.TestRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);
|
|
1876
|
+
return totalCost / this.TestRuns.length;
|
|
1619
1877
|
}
|
|
1878
|
+
/** @deprecated Use {@link GetAverageCost}. */
|
|
1620
1879
|
getAverageCost() {
|
|
1621
|
-
|
|
1880
|
+
return this.GetAverageCost();
|
|
1881
|
+
}
|
|
1882
|
+
GetAverageDuration() {
|
|
1883
|
+
if (this.TestRuns.length === 0)
|
|
1622
1884
|
return 0;
|
|
1623
|
-
const
|
|
1624
|
-
return
|
|
1885
|
+
const totalDuration = this.TestRuns.reduce((sum, r) => sum + (r.DurationSeconds || 0), 0);
|
|
1886
|
+
return totalDuration / this.TestRuns.length;
|
|
1625
1887
|
}
|
|
1888
|
+
/** @deprecated Use {@link GetAverageDuration}. */
|
|
1626
1889
|
getAverageDuration() {
|
|
1627
|
-
|
|
1628
|
-
return 0;
|
|
1629
|
-
const totalDuration = this.testRuns.reduce((sum, r) => sum + (r.DurationSeconds || 0), 0);
|
|
1630
|
-
return totalDuration / this.testRuns.length;
|
|
1890
|
+
return this.GetAverageDuration();
|
|
1631
1891
|
}
|
|
1632
1892
|
formatDuration(seconds) {
|
|
1633
1893
|
if (seconds < 60)
|
|
@@ -1641,10 +1901,14 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1641
1901
|
const mins = Math.floor((seconds % 3600) / 60);
|
|
1642
1902
|
return `${hours}h ${mins}m`;
|
|
1643
1903
|
}
|
|
1644
|
-
|
|
1904
|
+
FormatCost(cost) {
|
|
1645
1905
|
return `$${cost.toFixed(6)}`;
|
|
1646
1906
|
}
|
|
1647
|
-
|
|
1907
|
+
/** @deprecated Use {@link FormatCost}. */
|
|
1908
|
+
formatCost(cost) {
|
|
1909
|
+
return this.FormatCost(cost);
|
|
1910
|
+
}
|
|
1911
|
+
FormatTimeout(ms) {
|
|
1648
1912
|
if (ms === null || ms === undefined)
|
|
1649
1913
|
return 'Default (5 min)';
|
|
1650
1914
|
if (ms < 1000)
|
|
@@ -1660,45 +1924,69 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1660
1924
|
const mins = Math.floor((ms % 3600000) / 60000);
|
|
1661
1925
|
return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;
|
|
1662
1926
|
}
|
|
1663
|
-
|
|
1927
|
+
/** @deprecated Use {@link FormatTimeout}. */
|
|
1928
|
+
formatTimeout(ms) {
|
|
1929
|
+
return this.FormatTimeout(ms);
|
|
1930
|
+
}
|
|
1931
|
+
OpenTestRun(runId) {
|
|
1664
1932
|
SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(runId));
|
|
1665
1933
|
}
|
|
1666
|
-
|
|
1934
|
+
/** @deprecated Use {@link OpenTestRun}. */
|
|
1935
|
+
openTestRun(runId) {
|
|
1936
|
+
return this.OpenTestRun(runId);
|
|
1937
|
+
}
|
|
1938
|
+
GetRunTags(run) {
|
|
1667
1939
|
return TagsHelper.parseTags(run.Tags);
|
|
1668
1940
|
}
|
|
1669
|
-
|
|
1941
|
+
/** @deprecated Use {@link GetRunTags}. */
|
|
1942
|
+
getRunTags(run) {
|
|
1943
|
+
return this.GetRunTags(run);
|
|
1944
|
+
}
|
|
1945
|
+
OpenTestSuite(suiteId) {
|
|
1670
1946
|
SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));
|
|
1671
1947
|
}
|
|
1672
|
-
|
|
1948
|
+
/** @deprecated Use {@link OpenTestSuite}. */
|
|
1949
|
+
openTestSuite(suiteId) {
|
|
1950
|
+
return this.OpenTestSuite(suiteId);
|
|
1951
|
+
}
|
|
1952
|
+
NavigateToTestingDashboard() {
|
|
1673
1953
|
const testingApp = this.appManager.GetAppByName('Testing');
|
|
1674
1954
|
if (testingApp) {
|
|
1675
1955
|
this.navigationService.SwitchToApp(testingApp.ID);
|
|
1676
1956
|
}
|
|
1677
1957
|
}
|
|
1678
|
-
|
|
1958
|
+
/** @deprecated Use {@link NavigateToTestingDashboard}. */
|
|
1959
|
+
navigateToTestingDashboard() {
|
|
1960
|
+
return this.NavigateToTestingDashboard();
|
|
1961
|
+
}
|
|
1962
|
+
async RunTest() {
|
|
1679
1963
|
if (this.record?.ID) {
|
|
1680
|
-
this.
|
|
1964
|
+
this.TestingDialogService.OpenTestPanel(this.record.ID);
|
|
1681
1965
|
}
|
|
1682
1966
|
}
|
|
1967
|
+
/** @deprecated Use {@link RunTest}. */
|
|
1968
|
+
async runTest() {
|
|
1969
|
+
return this.RunTest();
|
|
1970
|
+
}
|
|
1683
1971
|
OnPanelClosed() {
|
|
1684
|
-
this.
|
|
1972
|
+
this.TestingDialogService.ClosePanel();
|
|
1685
1973
|
this.cdr.markForCheck();
|
|
1686
1974
|
}
|
|
1687
|
-
async
|
|
1975
|
+
async Refresh() {
|
|
1688
1976
|
this.isRefreshing = true;
|
|
1689
1977
|
this.cdr.markForCheck();
|
|
1690
1978
|
try {
|
|
1691
1979
|
await this.record.Load(this.record.ID);
|
|
1692
1980
|
this.parseJsonFields();
|
|
1693
1981
|
// Reset lazy-loaded data to force reload
|
|
1694
|
-
if (this.
|
|
1695
|
-
this.
|
|
1696
|
-
this.
|
|
1982
|
+
if (this.TestRunsLoaded) {
|
|
1983
|
+
this.TestRunsLoaded = false;
|
|
1984
|
+
this.TestRuns = [];
|
|
1697
1985
|
await this.loadTestRuns();
|
|
1698
1986
|
}
|
|
1699
|
-
if (this.
|
|
1700
|
-
this.
|
|
1701
|
-
this.
|
|
1987
|
+
if (this.SuiteTestsLoaded) {
|
|
1988
|
+
this.SuiteTestsLoaded = false;
|
|
1989
|
+
this.SuiteTests = [];
|
|
1702
1990
|
await this.loadSuiteTests();
|
|
1703
1991
|
}
|
|
1704
1992
|
SharedService.Instance.CreateSimpleNotification('Refreshed successfully', 'success', 2000);
|
|
@@ -1711,25 +1999,33 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1711
1999
|
this.cdr.markForCheck();
|
|
1712
2000
|
}
|
|
1713
2001
|
}
|
|
1714
|
-
|
|
2002
|
+
/** @deprecated Use {@link Refresh}. */
|
|
2003
|
+
async refresh() {
|
|
2004
|
+
return this.Refresh();
|
|
2005
|
+
}
|
|
2006
|
+
GetJsonData() {
|
|
1715
2007
|
let data;
|
|
1716
|
-
switch (this.
|
|
2008
|
+
switch (this.ActiveJsonView) {
|
|
1717
2009
|
case 'input':
|
|
1718
|
-
data = this.
|
|
2010
|
+
data = this.ParsedData.inputDefinition;
|
|
1719
2011
|
break;
|
|
1720
2012
|
case 'expected':
|
|
1721
|
-
data = this.
|
|
2013
|
+
data = this.ParsedData.expectedOutcomes;
|
|
1722
2014
|
break;
|
|
1723
2015
|
case 'config':
|
|
1724
|
-
data = this.
|
|
2016
|
+
data = this.ParsedData.configuration;
|
|
1725
2017
|
break;
|
|
1726
2018
|
case 'tags':
|
|
1727
|
-
data = this.
|
|
2019
|
+
data = this.ParsedData.tags;
|
|
1728
2020
|
break;
|
|
1729
2021
|
}
|
|
1730
2022
|
return data ? JSON.stringify(data, null, 2) : '// No data available';
|
|
1731
2023
|
}
|
|
1732
|
-
|
|
2024
|
+
/** @deprecated Use {@link GetJsonData}. */
|
|
2025
|
+
getJsonData() {
|
|
2026
|
+
return this.GetJsonData();
|
|
2027
|
+
}
|
|
2028
|
+
GetRelativeTime(date) {
|
|
1733
2029
|
if (!date)
|
|
1734
2030
|
return 'N/A';
|
|
1735
2031
|
const d = new Date(date);
|
|
@@ -1748,13 +2044,17 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1748
2044
|
return `${diffDays}d ago`;
|
|
1749
2045
|
return d.toLocaleDateString();
|
|
1750
2046
|
}
|
|
2047
|
+
/** @deprecated Use {@link GetRelativeTime}. */
|
|
2048
|
+
getRelativeTime(date) {
|
|
2049
|
+
return this.GetRelativeTime(date);
|
|
2050
|
+
}
|
|
1751
2051
|
// ===========================
|
|
1752
2052
|
// History Tab Methods
|
|
1753
2053
|
// ===========================
|
|
1754
|
-
async
|
|
1755
|
-
if (this.
|
|
2054
|
+
async LoadHistory() {
|
|
2055
|
+
if (this.HistoryLoaded)
|
|
1756
2056
|
return;
|
|
1757
|
-
this.
|
|
2057
|
+
this.LoadingHistory = true;
|
|
1758
2058
|
this.cdr.markForCheck();
|
|
1759
2059
|
try {
|
|
1760
2060
|
// Load all test runs for this test
|
|
@@ -1768,23 +2068,27 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1768
2068
|
if (runsResult.Success && runsResult.Results) {
|
|
1769
2069
|
const allRuns = runsResult.Results;
|
|
1770
2070
|
// Extract unique tags from all runs
|
|
1771
|
-
this.
|
|
2071
|
+
this.UniqueTags = TagsHelper.getUniqueTags(allRuns.map(r => r.Tags));
|
|
1772
2072
|
// Build history data (aggregated by date)
|
|
1773
|
-
this.
|
|
2073
|
+
this.HistoryData = this.buildHistoryData(allRuns);
|
|
1774
2074
|
// Build suite performance data
|
|
1775
2075
|
await this.buildSuitePerformance(allRuns);
|
|
1776
2076
|
}
|
|
1777
|
-
this.
|
|
2077
|
+
this.HistoryLoaded = true;
|
|
1778
2078
|
}
|
|
1779
2079
|
catch (error) {
|
|
1780
2080
|
console.error('Error loading history:', error);
|
|
1781
2081
|
SharedService.Instance.CreateSimpleNotification('Failed to load history', 'error', 3000);
|
|
1782
2082
|
}
|
|
1783
2083
|
finally {
|
|
1784
|
-
this.
|
|
2084
|
+
this.LoadingHistory = false;
|
|
1785
2085
|
this.cdr.markForCheck();
|
|
1786
2086
|
}
|
|
1787
2087
|
}
|
|
2088
|
+
/** @deprecated Use {@link LoadHistory}. */
|
|
2089
|
+
async loadHistory() {
|
|
2090
|
+
return this.LoadHistory();
|
|
2091
|
+
}
|
|
1788
2092
|
buildHistoryData(runs) {
|
|
1789
2093
|
// Filter by time range
|
|
1790
2094
|
const filteredRuns = this.filterRunsByTimeRange(runs);
|
|
@@ -1822,11 +2126,11 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1822
2126
|
return dataPoints.sort((a, b) => b.date.getTime() - a.date.getTime());
|
|
1823
2127
|
}
|
|
1824
2128
|
filterRunsByTimeRange(runs) {
|
|
1825
|
-
if (this.
|
|
2129
|
+
if (this.HistoryTimeRange === 'all')
|
|
1826
2130
|
return runs;
|
|
1827
2131
|
const now = new Date();
|
|
1828
2132
|
let cutoff;
|
|
1829
|
-
switch (this.
|
|
2133
|
+
switch (this.HistoryTimeRange) {
|
|
1830
2134
|
case '7d':
|
|
1831
2135
|
cutoff = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
1832
2136
|
break;
|
|
@@ -1874,7 +2178,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1874
2178
|
suiteIdMap.get(suiteId).runs.push(...testRuns);
|
|
1875
2179
|
}
|
|
1876
2180
|
// Build performance data for each suite
|
|
1877
|
-
this.
|
|
2181
|
+
this.SuitePerformance = [];
|
|
1878
2182
|
for (const [suiteId, data] of suiteIdMap) {
|
|
1879
2183
|
const suiteName = data.suiteRuns[0]?.Suite || 'Unknown Suite';
|
|
1880
2184
|
const totalRuns = data.runs.length;
|
|
@@ -1889,7 +2193,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1889
2193
|
const lastRun = data.runs
|
|
1890
2194
|
.filter(r => r.StartedAt)
|
|
1891
2195
|
.sort((a, b) => new Date(b.StartedAt).getTime() - new Date(a.StartedAt).getTime())[0];
|
|
1892
|
-
this.
|
|
2196
|
+
this.SuitePerformance.push({
|
|
1893
2197
|
suiteId,
|
|
1894
2198
|
suiteName,
|
|
1895
2199
|
totalRuns,
|
|
@@ -1904,57 +2208,89 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1904
2208
|
});
|
|
1905
2209
|
}
|
|
1906
2210
|
// Sort by total runs descending
|
|
1907
|
-
this.
|
|
2211
|
+
this.SuitePerformance.sort((a, b) => b.totalRuns - a.totalRuns);
|
|
1908
2212
|
}
|
|
1909
2213
|
}
|
|
1910
2214
|
}
|
|
2215
|
+
SetHistoryTimeRange(range) {
|
|
2216
|
+
this.HistoryTimeRange = range;
|
|
2217
|
+
this.HistoryLoaded = false;
|
|
2218
|
+
this.LoadHistory();
|
|
2219
|
+
}
|
|
2220
|
+
/** @deprecated Use {@link SetHistoryTimeRange}. */
|
|
1911
2221
|
setHistoryTimeRange(range) {
|
|
1912
|
-
this.
|
|
1913
|
-
this.historyLoaded = false;
|
|
1914
|
-
this.loadHistory();
|
|
2222
|
+
return this.SetHistoryTimeRange(range);
|
|
1915
2223
|
}
|
|
1916
|
-
|
|
1917
|
-
this.
|
|
2224
|
+
SetTagFilter(tag) {
|
|
2225
|
+
this.SelectedTagFilter = tag;
|
|
1918
2226
|
this.cdr.markForCheck();
|
|
1919
2227
|
}
|
|
2228
|
+
/** @deprecated Use {@link SetTagFilter}. */
|
|
2229
|
+
setTagFilter(tag) {
|
|
2230
|
+
return this.SetTagFilter(tag);
|
|
2231
|
+
}
|
|
2232
|
+
GetFilteredHistoryData() {
|
|
2233
|
+
return this.HistoryData;
|
|
2234
|
+
}
|
|
2235
|
+
/** @deprecated Use {@link GetFilteredHistoryData}. */
|
|
1920
2236
|
getFilteredHistoryData() {
|
|
1921
|
-
return this.
|
|
2237
|
+
return this.GetFilteredHistoryData();
|
|
1922
2238
|
}
|
|
1923
|
-
|
|
1924
|
-
if (this.
|
|
2239
|
+
GetOverallPassRate() {
|
|
2240
|
+
if (this.HistoryData.length === 0)
|
|
1925
2241
|
return 0;
|
|
1926
|
-
const totalRuns = this.
|
|
1927
|
-
const totalPassed = this.
|
|
2242
|
+
const totalRuns = this.HistoryData.reduce((sum, d) => sum + d.runCount, 0);
|
|
2243
|
+
const totalPassed = this.HistoryData.reduce((sum, d) => sum + d.passCount, 0);
|
|
1928
2244
|
return totalRuns > 0 ? (totalPassed / totalRuns) * 100 : 0;
|
|
1929
2245
|
}
|
|
1930
|
-
|
|
1931
|
-
|
|
2246
|
+
/** @deprecated Use {@link GetOverallPassRate}. */
|
|
2247
|
+
getOverallPassRate() {
|
|
2248
|
+
return this.GetOverallPassRate();
|
|
2249
|
+
}
|
|
2250
|
+
GetOverallAvgScore() {
|
|
2251
|
+
if (this.HistoryData.length === 0)
|
|
1932
2252
|
return 0;
|
|
1933
|
-
const scores = this.
|
|
2253
|
+
const scores = this.HistoryData.filter(d => d.avgScore > 0).map(d => d.avgScore);
|
|
1934
2254
|
return scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;
|
|
1935
2255
|
}
|
|
1936
|
-
|
|
1937
|
-
|
|
2256
|
+
/** @deprecated Use {@link GetOverallAvgScore}. */
|
|
2257
|
+
getOverallAvgScore() {
|
|
2258
|
+
return this.GetOverallAvgScore();
|
|
2259
|
+
}
|
|
2260
|
+
GetOverallAvgDuration() {
|
|
2261
|
+
if (this.HistoryData.length === 0)
|
|
1938
2262
|
return 0;
|
|
1939
|
-
const durations = this.
|
|
2263
|
+
const durations = this.HistoryData.filter(d => d.avgDuration > 0).map(d => d.avgDuration);
|
|
1940
2264
|
return durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;
|
|
1941
2265
|
}
|
|
1942
|
-
|
|
1943
|
-
|
|
2266
|
+
/** @deprecated Use {@link GetOverallAvgDuration}. */
|
|
2267
|
+
getOverallAvgDuration() {
|
|
2268
|
+
return this.GetOverallAvgDuration();
|
|
2269
|
+
}
|
|
2270
|
+
GetOverallAvgCost() {
|
|
2271
|
+
if (this.HistoryData.length === 0)
|
|
1944
2272
|
return 0;
|
|
1945
|
-
const costs = this.
|
|
2273
|
+
const costs = this.HistoryData.filter(d => d.avgCost > 0).map(d => d.avgCost);
|
|
1946
2274
|
return costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0;
|
|
1947
2275
|
}
|
|
2276
|
+
/** @deprecated Use {@link GetOverallAvgCost}. */
|
|
2277
|
+
getOverallAvgCost() {
|
|
2278
|
+
return this.GetOverallAvgCost();
|
|
2279
|
+
}
|
|
2280
|
+
GetTotalRuns() {
|
|
2281
|
+
return this.HistoryData.reduce((sum, d) => sum + d.runCount, 0);
|
|
2282
|
+
}
|
|
2283
|
+
/** @deprecated Use {@link GetTotalRuns}. */
|
|
1948
2284
|
getTotalRuns() {
|
|
1949
|
-
return this.
|
|
2285
|
+
return this.GetTotalRuns();
|
|
1950
2286
|
}
|
|
1951
|
-
|
|
1952
|
-
if (this.
|
|
2287
|
+
GetPassRateTrend() {
|
|
2288
|
+
if (this.HistoryData.length < 2)
|
|
1953
2289
|
return 'stable';
|
|
1954
2290
|
// Compare recent half to older half
|
|
1955
|
-
const mid = Math.floor(this.
|
|
1956
|
-
const recentData = this.
|
|
1957
|
-
const olderData = this.
|
|
2291
|
+
const mid = Math.floor(this.HistoryData.length / 2);
|
|
2292
|
+
const recentData = this.HistoryData.slice(0, mid);
|
|
2293
|
+
const olderData = this.HistoryData.slice(mid);
|
|
1958
2294
|
const recentRate = recentData.reduce((sum, d) => sum + d.passRate, 0) / recentData.length;
|
|
1959
2295
|
const olderRate = olderData.reduce((sum, d) => sum + d.passRate, 0) / olderData.length;
|
|
1960
2296
|
const diff = recentRate - olderRate;
|
|
@@ -1964,9 +2300,13 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1964
2300
|
return 'down';
|
|
1965
2301
|
return 'stable';
|
|
1966
2302
|
}
|
|
1967
|
-
|
|
2303
|
+
/** @deprecated Use {@link GetPassRateTrend}. */
|
|
2304
|
+
getPassRateTrend() {
|
|
2305
|
+
return this.GetPassRateTrend();
|
|
2306
|
+
}
|
|
2307
|
+
ExportHistoryToCSV() {
|
|
1968
2308
|
const headers = ['Date', 'Run Count', 'Passed', 'Failed', 'Pass Rate (%)', 'Avg Score', 'Avg Duration (s)', 'Avg Cost (USD)'];
|
|
1969
|
-
const rows = this.
|
|
2309
|
+
const rows = this.HistoryData.map(d => [
|
|
1970
2310
|
d.date.toISOString().split('T')[0],
|
|
1971
2311
|
d.runCount.toString(),
|
|
1972
2312
|
d.passCount.toString(),
|
|
@@ -1987,9 +2327,17 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1987
2327
|
URL.revokeObjectURL(link.href);
|
|
1988
2328
|
SharedService.Instance.CreateSimpleNotification('Export complete', 'success', 2000);
|
|
1989
2329
|
}
|
|
1990
|
-
|
|
2330
|
+
/** @deprecated Use {@link ExportHistoryToCSV}. */
|
|
2331
|
+
exportHistoryToCSV() {
|
|
2332
|
+
return this.ExportHistoryToCSV();
|
|
2333
|
+
}
|
|
2334
|
+
OpenSuiteFromHistory(suiteId) {
|
|
1991
2335
|
SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));
|
|
1992
2336
|
}
|
|
2337
|
+
/** @deprecated Use {@link OpenSuiteFromHistory}. */
|
|
2338
|
+
openSuiteFromHistory(suiteId) {
|
|
2339
|
+
return this.OpenSuiteFromHistory(suiteId);
|
|
2340
|
+
}
|
|
1993
2341
|
// ===========================
|
|
1994
2342
|
// Keyboard Shortcuts Settings
|
|
1995
2343
|
// ===========================
|
|
@@ -2002,11 +2350,11 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
2002
2350
|
const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);
|
|
2003
2351
|
if (setting) {
|
|
2004
2352
|
this.shortcutsSettingEntity = setting;
|
|
2005
|
-
this.
|
|
2353
|
+
this.ShowShortcuts = setting.Value === 'true';
|
|
2006
2354
|
}
|
|
2007
2355
|
else {
|
|
2008
2356
|
// Default to hidden
|
|
2009
|
-
this.
|
|
2357
|
+
this.ShowShortcuts = false;
|
|
2010
2358
|
}
|
|
2011
2359
|
this.cdr.markForCheck();
|
|
2012
2360
|
}
|
|
@@ -2017,8 +2365,8 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
2017
2365
|
/**
|
|
2018
2366
|
* Toggle keyboard shortcuts visibility and save preference
|
|
2019
2367
|
*/
|
|
2020
|
-
async
|
|
2021
|
-
this.
|
|
2368
|
+
async ToggleShortcuts() {
|
|
2369
|
+
this.ShowShortcuts = !this.ShowShortcuts;
|
|
2022
2370
|
this.cdr.markForCheck();
|
|
2023
2371
|
try {
|
|
2024
2372
|
const userId = this.metadata.CurrentUser?.ID;
|
|
@@ -2036,26 +2384,38 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
2036
2384
|
this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;
|
|
2037
2385
|
}
|
|
2038
2386
|
}
|
|
2039
|
-
this.shortcutsSettingEntity.Value = this.
|
|
2387
|
+
this.shortcutsSettingEntity.Value = this.ShowShortcuts ? 'true' : 'false';
|
|
2040
2388
|
await this.shortcutsSettingEntity.Save();
|
|
2041
2389
|
}
|
|
2042
2390
|
catch (error) {
|
|
2043
2391
|
console.warn('Failed to save shortcuts setting:', error);
|
|
2044
2392
|
}
|
|
2045
2393
|
}
|
|
2394
|
+
/** @deprecated Use {@link ToggleShortcuts}. */
|
|
2395
|
+
async toggleShortcuts() {
|
|
2396
|
+
return this.ToggleShortcuts();
|
|
2397
|
+
}
|
|
2046
2398
|
// ==========================================
|
|
2047
2399
|
// Edit / Save Methods
|
|
2048
2400
|
// ==========================================
|
|
2049
2401
|
/** True if the test record has any unsaved field changes. */
|
|
2050
|
-
get
|
|
2402
|
+
get IsDirty() {
|
|
2051
2403
|
return this.record?.Dirty === true;
|
|
2052
2404
|
}
|
|
2405
|
+
/** @deprecated Use {@link IsDirty}. */
|
|
2406
|
+
get isDirty() {
|
|
2407
|
+
return this.IsDirty;
|
|
2408
|
+
}
|
|
2053
2409
|
/** Names of fields with pending edits, used by the save bar. */
|
|
2054
|
-
get
|
|
2410
|
+
get DirtyFieldNames() {
|
|
2055
2411
|
if (!this.record?.Fields)
|
|
2056
2412
|
return [];
|
|
2057
2413
|
return this.record.Fields.filter(f => f.Dirty).map(f => f.Name);
|
|
2058
2414
|
}
|
|
2415
|
+
/** @deprecated Use {@link DirtyFieldNames}. */
|
|
2416
|
+
get dirtyFieldNames() {
|
|
2417
|
+
return this.DirtyFieldNames;
|
|
2418
|
+
}
|
|
2059
2419
|
/** Parsed tags as a plain array — derived from record.Tags JSON. */
|
|
2060
2420
|
get tags() {
|
|
2061
2421
|
return TagsHelper.parseTags(this.record?.Tags);
|
|
@@ -2070,7 +2430,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
2070
2430
|
ResultType: 'entity_object'
|
|
2071
2431
|
});
|
|
2072
2432
|
if (result.Success) {
|
|
2073
|
-
this.
|
|
2433
|
+
this.TestTypeOptions = result.Results || [];
|
|
2074
2434
|
this.cdr.markForCheck();
|
|
2075
2435
|
}
|
|
2076
2436
|
}
|
|
@@ -2079,10 +2439,10 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
2079
2439
|
}
|
|
2080
2440
|
}
|
|
2081
2441
|
/** Save all pending changes on the test record. */
|
|
2082
|
-
async
|
|
2083
|
-
if (!this.
|
|
2442
|
+
async SaveChanges() {
|
|
2443
|
+
if (!this.IsDirty || this.IsSaving)
|
|
2084
2444
|
return;
|
|
2085
|
-
this.
|
|
2445
|
+
this.IsSaving = true;
|
|
2086
2446
|
this.cdr.markForCheck();
|
|
2087
2447
|
try {
|
|
2088
2448
|
const ok = await this.SaveRecord(false);
|
|
@@ -2101,24 +2461,32 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
2101
2461
|
SharedService.Instance.CreateSimpleNotification(msg, 'error', 4000);
|
|
2102
2462
|
}
|
|
2103
2463
|
finally {
|
|
2104
|
-
this.
|
|
2464
|
+
this.IsSaving = false;
|
|
2105
2465
|
this.cdr.markForCheck();
|
|
2106
2466
|
}
|
|
2107
2467
|
}
|
|
2468
|
+
/** @deprecated Use {@link SaveChanges}. */
|
|
2469
|
+
async saveChanges() {
|
|
2470
|
+
return this.SaveChanges();
|
|
2471
|
+
}
|
|
2108
2472
|
/** Discard all pending field changes on the test. */
|
|
2109
|
-
async
|
|
2110
|
-
if (!this.
|
|
2473
|
+
async DiscardChanges() {
|
|
2474
|
+
if (!this.IsDirty)
|
|
2111
2475
|
return;
|
|
2112
2476
|
if (!(await this.confirmService.Confirm('Discard your unsaved changes?')))
|
|
2113
2477
|
return;
|
|
2114
2478
|
this.record.Revert();
|
|
2115
|
-
this.
|
|
2479
|
+
this.TagDraft = '';
|
|
2116
2480
|
this.parseJsonFields();
|
|
2117
2481
|
this.cdr.markForCheck();
|
|
2118
2482
|
}
|
|
2483
|
+
/** @deprecated Use {@link DiscardChanges}. */
|
|
2484
|
+
async discardChanges() {
|
|
2485
|
+
return this.DiscardChanges();
|
|
2486
|
+
}
|
|
2119
2487
|
/** Add a tag from tagDraft (called on Enter / comma / blur). */
|
|
2120
|
-
|
|
2121
|
-
const raw = this.
|
|
2488
|
+
AddTagFromDraft() {
|
|
2489
|
+
const raw = this.TagDraft.trim();
|
|
2122
2490
|
if (!raw)
|
|
2123
2491
|
return;
|
|
2124
2492
|
const incoming = raw.split(',').map(t => t.trim()).filter(t => t.length > 0);
|
|
@@ -2129,29 +2497,41 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
2129
2497
|
merged.push(t);
|
|
2130
2498
|
}
|
|
2131
2499
|
this.record.Tags = TagsHelper.toJson(merged);
|
|
2132
|
-
this.
|
|
2500
|
+
this.TagDraft = '';
|
|
2133
2501
|
this.cdr.markForCheck();
|
|
2134
2502
|
}
|
|
2503
|
+
/** @deprecated Use {@link AddTagFromDraft}. */
|
|
2504
|
+
addTagFromDraft() {
|
|
2505
|
+
return this.AddTagFromDraft();
|
|
2506
|
+
}
|
|
2135
2507
|
/** Remove a single tag. */
|
|
2136
|
-
|
|
2508
|
+
RemoveTag(tag) {
|
|
2137
2509
|
this.record.Tags = TagsHelper.removeTag(this.record.Tags, tag);
|
|
2138
2510
|
this.cdr.markForCheck();
|
|
2139
2511
|
}
|
|
2512
|
+
/** @deprecated Use {@link RemoveTag}. */
|
|
2513
|
+
removeTag(tag) {
|
|
2514
|
+
return this.RemoveTag(tag);
|
|
2515
|
+
}
|
|
2140
2516
|
/** Handle Enter / comma in the tag input to commit the draft tag. */
|
|
2141
|
-
|
|
2517
|
+
OnTagInputKeydown(event) {
|
|
2142
2518
|
if (event.key === 'Enter' || event.key === ',') {
|
|
2143
2519
|
event.preventDefault();
|
|
2144
|
-
this.
|
|
2520
|
+
this.AddTagFromDraft();
|
|
2145
2521
|
return;
|
|
2146
2522
|
}
|
|
2147
|
-
if (event.key === 'Backspace' && !this.
|
|
2523
|
+
if (event.key === 'Backspace' && !this.TagDraft) {
|
|
2148
2524
|
const all = this.tags;
|
|
2149
2525
|
if (all.length > 0) {
|
|
2150
2526
|
event.preventDefault();
|
|
2151
|
-
this.
|
|
2527
|
+
this.RemoveTag(all[all.length - 1]);
|
|
2152
2528
|
}
|
|
2153
2529
|
}
|
|
2154
2530
|
}
|
|
2531
|
+
/** @deprecated Use {@link OnTagInputKeydown}. */
|
|
2532
|
+
onTagInputKeydown(event) {
|
|
2533
|
+
return this.OnTagInputKeydown(event);
|
|
2534
|
+
}
|
|
2155
2535
|
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMJTestFormComponentExtended_BaseFactory; return function MJTestFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMJTestFormComponentExtended_BaseFactory || (ɵMJTestFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MJTestFormComponentExtended)))(__ngFactoryType__ || MJTestFormComponentExtended); }; })(); }
|
|
2156
2536
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJTestFormComponentExtended, selectors: [["mj-test-form"]], hostBindings: function MJTestFormComponentExtended_HostBindings(rf, ctx) { if (rf & 1) {
|
|
2157
2537
|
i0.ɵɵlistener("keydown", function MJTestFormComponentExtended_keydown_HostBindingHandler($event) { return ctx.handleKeyboardShortcut($event); }, i0.ɵɵresolveDocument)("beforeunload", function MJTestFormComponentExtended_beforeunload_HostBindingHandler($event) { return ctx.handleBeforeUnload($event); }, i0.ɵɵresolveWindow);
|