@memberjunction/ng-core-entity-forms 5.34.1 → 5.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/lib/custom/Tests/test-form.component.d.ts +25 -1
  2. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/Tests/test-form.component.js +898 -547
  4. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  5. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +56 -1
  6. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  7. package/dist/lib/custom/Tests/test-suite-form.component.js +1647 -788
  8. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  9. package/dist/lib/custom/custom-forms.module.d.ts +25 -24
  10. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  11. package/dist/lib/custom/custom-forms.module.js +4 -0
  12. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  13. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +171 -169
  14. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  15. package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js +43 -37
  16. package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js.map +1 -1
  17. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.d.ts.map +1 -1
  18. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js +50 -30
  19. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js.map +1 -1
  20. package/dist/lib/generated/Entities/MJConversationDetailAttachment/mjconversationdetailattachment.form.component.js +7 -5
  21. package/dist/lib/generated/Entities/MJConversationDetailAttachment/mjconversationdetailattachment.form.component.js.map +1 -1
  22. package/package.json +37 -36
@@ -1 +1 @@
1
- {"version":3,"file":"test-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-form.component.ts","../../../../src/lib/custom/Tests/test-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, ViewContainerRef, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestEntity, MJTestRunEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJUserSettingEntity, UserInfoEngine, MJTestRunFeedbackEntity } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestFormComponent } from '../../generated/Entities/MJTest/mjtest.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\nimport { createCopyOnlyToolbar, ToolbarConfig } from '@memberjunction/ng-code-editor';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\ninterface HistoryDataPoint {\n date: Date;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n runCount: number;\n passCount: number;\n failCount: number;\n}\n\ninterface SuitePerformance {\n suiteId: string;\n suiteName: string;\n totalRuns: number;\n passedRuns: number;\n failedRuns: number;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n lastRun: Date | null;\n tags: string[];\n}\n\ninterface ParsedJSON {\n inputDefinition?: Record<string, unknown>;\n expectedOutcomes?: Record<string, unknown>;\n configuration?: Record<string, unknown>;\n tags?: string[];\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Tests')\n@Component({\n standalone: false,\n selector: 'mj-test-form',\n templateUrl: './test-form.component.html',\n styleUrls: ['./test-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestFormComponentExtended extends MJTestFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingRuns = false;\n loadingSuites = false;\n error: string | null = null;\n testRunsLoaded = false;\n suiteTestsLoaded = false;\n isRefreshing = false;\n\n // Related data\n testRuns: MJTestRunEntity[] = [];\n suiteTests: MJTestSuiteTestEntity[] = [];\n\n // Human feedback map: testRunId -> feedback entity\n feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n // History tab data\n historyLoaded = false;\n loadingHistory = false;\n historyTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n historyData: HistoryDataPoint[] = [];\n suitePerformance: SuitePerformance[] = [];\n uniqueTags: string[] = [];\n selectedTagFilter: string | null = null;\n\n // Parsed JSON fields\n parsedData: ParsedJSON = {};\n\n // Active JSON view\n activeJsonView: 'input' | 'expected' | 'config' | 'tags' = 'input';\n\n // Code editor configuration\n jsonToolbar: ToolbarConfig = createCopyOnlyToolbar();\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private get metadata() { return this.ProviderToUse; }\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\n\n // Service injections\n private navigationService = inject(NavigationService);\n public testingDialogService = inject(TestingDialogService);\n private evalPrefsService = inject(EvaluationPreferencesService);\n private viewContainerRef = inject(ViewContainerRef);\n private appManager = inject(ApplicationManager);\n\n async ngOnInit() {\n await super.ngOnInit();\n this.loadShortcutsSetting();\n\n // Subscribe to evaluation preferences\n this.evalPrefsService.preferences$\n .pipe(takeUntil(this.destroy$))\n .subscribe(prefs => {\n this.evalPreferences = prefs;\n this.cdr.markForCheck();\n });\n\n // Subscribe to panel state changes so the slide panel renders in this form\n this.testingDialogService.PanelStateChanged$\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.cdr.detectChanges();\n });\n\n if (this.record && this.record.ID) {\n this.parseJsonFields();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Enter: Run test\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runTest();\n return;\n }\n\n // Number keys for tabs (1-5)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('config'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('suites'); break;\n case '5': this.changeTab('analytics'); break;\n }\n }\n }\n\n private async loadTestRuns() {\n if (this.testRunsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.testRuns = result.Results || [];\n\n // Load feedbacks for all test runs\n if (this.testRuns.length > 0) {\n await this.loadFeedbacksForTestRuns(this.testRuns.map(r => r.ID));\n }\n }\n\n this.testRunsLoaded = true;\n } catch (error) {\n console.error('Error loading test runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<void> {\n if (testRunIds.length === 0) return;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const chunkSize = 50;\n for (let i = 0; i < testRunIds.length; i += chunkSize) {\n const chunk = testRunIds.slice(i, i + chunkSize);\n const inClause = chunk.map(id => `'${id}'`).join(',');\n\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${inClause})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n for (const feedback of result.Results) {\n this.feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n }\n\n /**\n * Get feedback for a specific test run\n */\n getFeedbackForRun(testRunId: string): MJTestRunFeedbackEntity | undefined {\n return this.feedbackMap.get(testRunId);\n }\n\n /**\n * Get tooltip for status indicator\n */\n getStatusTooltip(status: string): string {\n switch (status) {\n case 'Passed': return 'Status: Passed - Test completed without error';\n case 'Failed': return 'Status: Failed - Test assertions did not pass';\n case 'Error': return 'Status: Error - Test encountered an exception';\n case 'Timeout': return 'Status: Timeout - Test exceeded time limit';\n case 'Skipped': return 'Status: Skipped - Test was not executed';\n case 'Running': return 'Status: Running - Test is currently executing';\n case 'Pending': return 'Status: Pending - Test waiting to run';\n default: return `Status: ${status}`;\n }\n }\n\n /**\n * Get tooltip for human review with rating and optional comments\n */\n getHumanTooltip(rating: number, comments: string | null): string {\n let tooltip = `Human Review: ${rating}/10 rating`;\n if (comments) {\n const truncated = comments.length > 200 ? comments.substring(0, 200) + '...' : comments;\n tooltip += `\\n\\n\"${truncated}\"`;\n }\n return tooltip;\n }\n\n private async loadSuiteTests() {\n if (this.suiteTestsLoaded) return;\n\n this.loadingSuites = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.suiteTests = result.Results || [];\n }\n\n this.suiteTestsLoaded = true;\n } catch (error) {\n console.error('Error loading suite tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test suites', 'error', 3000);\n } finally {\n this.loadingSuites = false;\n this.cdr.markForCheck();\n }\n }\n\n private parseJsonFields() {\n try {\n if (this.record.InputDefinition) {\n this.parsedData.inputDefinition = JSON.parse(this.record.InputDefinition);\n }\n if (this.record.ExpectedOutcomes) {\n this.parsedData.expectedOutcomes = JSON.parse(this.record.ExpectedOutcomes);\n }\n if (this.record.Configuration) {\n this.parsedData.configuration = JSON.parse(this.record.Configuration);\n }\n if (this.record.Tags) {\n this.parsedData.tags = JSON.parse(this.record.Tags);\n }\n } catch (error) {\n console.error('Error parsing JSON fields:', error);\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if (tab === 'runs' && !this.testRunsLoaded) {\n this.loadTestRuns();\n }\n\n if (tab === 'suites' && !this.suiteTestsLoaded) {\n this.loadSuiteTests();\n }\n\n if (tab === 'analytics' && !this.historyLoaded) {\n this.loadHistory();\n }\n\n this.cdr.markForCheck();\n }\n\n setJsonView(view: 'input' | 'expected' | 'config' | 'tags') {\n this.activeJsonView = view;\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return '#10b981';\n case 'Disabled': return '#6b7280';\n case 'Pending': return '#f59e0b';\n default: return '#9ca3af';\n }\n }\n\n getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Active': return 'fa-circle-check';\n case 'Disabled': return 'fa-circle-stop';\n case 'Pending': return 'fa-circle-pause';\n default: return 'fa-circle-question';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Passed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Error': return '#f59e0b';\n case 'Timeout': return '#f97316';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n default: return '#6b7280';\n }\n }\n\n getPassRate(): number {\n if (this.testRuns.length === 0) return 0;\n const passed = this.testRuns.filter(r => r.Status === 'Passed').length;\n return (passed / this.testRuns.length) * 100;\n }\n\n getAverageCost(): number {\n if (this.testRuns.length === 0) return 0;\n const totalCost = this.testRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n return totalCost / this.testRuns.length;\n }\n\n getAverageDuration(): number {\n if (this.testRuns.length === 0) return 0;\n const totalDuration = this.testRuns.reduce((sum, r) => sum + (r.DurationSeconds || 0), 0);\n return totalDuration / this.testRuns.length;\n }\n\n formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${mins}m`;\n }\n\n formatCost(cost: number): string {\n return `$${cost.toFixed(6)}`;\n }\n\n formatTimeout(ms: number | null): string {\n if (ms === null || ms === undefined) return 'Default (5 min)';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n openTestRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(runId));\n }\n\n getRunTags(run: MJTestRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n openTestSuite(suiteId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n async runTest() {\n if (this.record?.ID) {\n this.testingDialogService.OpenTestPanel(this.record.ID);\n }\n }\n\n OnPanelClosed(): void {\n this.testingDialogService.ClosePanel();\n this.cdr.markForCheck();\n }\n\n async refresh() {\n this.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n await this.record.Load(this.record.ID);\n this.parseJsonFields();\n\n // Reset lazy-loaded data to force reload\n if (this.testRunsLoaded) {\n this.testRunsLoaded = false;\n this.testRuns = [];\n await this.loadTestRuns();\n }\n if (this.suiteTestsLoaded) {\n this.suiteTestsLoaded = false;\n this.suiteTests = [];\n await this.loadSuiteTests();\n }\n\n SharedService.Instance.CreateSimpleNotification('Refreshed successfully', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to refresh', 'error', 3000);\n } finally {\n this.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n getJsonData(): string {\n let data: Record<string, unknown> | string[] | undefined;\n switch (this.activeJsonView) {\n case 'input': data = this.parsedData.inputDefinition; break;\n case 'expected': data = this.parsedData.expectedOutcomes; break;\n case 'config': data = this.parsedData.configuration; break;\n case 'tags': data = this.parsedData.tags; break;\n }\n return data ? JSON.stringify(data, null, 2) : '// No data available';\n }\n\n getRelativeTime(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n // ===========================\n // History Tab Methods\n // ===========================\n\n async loadHistory(): Promise<void> {\n if (this.historyLoaded) return;\n\n this.loadingHistory = true;\n this.cdr.markForCheck();\n\n try {\n // Load all test runs for this test\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const runsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n ResultType: 'entity_object'\n });\n\n if (runsResult.Success && runsResult.Results) {\n const allRuns = runsResult.Results;\n\n // Extract unique tags from all runs\n this.uniqueTags = TagsHelper.getUniqueTags(allRuns.map(r => r.Tags));\n\n // Build history data (aggregated by date)\n this.historyData = this.buildHistoryData(allRuns);\n\n // Build suite performance data\n await this.buildSuitePerformance(allRuns);\n }\n\n this.historyLoaded = true;\n } catch (error) {\n console.error('Error loading history:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load history', 'error', 3000);\n } finally {\n this.loadingHistory = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildHistoryData(runs: MJTestRunEntity[]): HistoryDataPoint[] {\n // Filter by time range\n const filteredRuns = this.filterRunsByTimeRange(runs);\n\n // Group by date\n const dateMap = new Map<string, MJTestRunEntity[]>();\n for (const run of filteredRuns) {\n if (run.StartedAt) {\n const dateKey = new Date(run.StartedAt).toISOString().split('T')[0];\n if (!dateMap.has(dateKey)) {\n dateMap.set(dateKey, []);\n }\n dateMap.get(dateKey)!.push(run);\n }\n }\n\n // Convert to data points\n const dataPoints: HistoryDataPoint[] = [];\n for (const [dateKey, dateRuns] of dateMap) {\n const passCount = dateRuns.filter(r => r.Status === 'Passed').length;\n const failCount = dateRuns.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = dateRuns.filter(r => r.Score != null).map(r => r.Score!);\n const durations = dateRuns.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = dateRuns.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n dataPoints.push({\n date: new Date(dateKey),\n passRate: dateRuns.length > 0 ? (passCount / dateRuns.length) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n runCount: dateRuns.length,\n passCount,\n failCount\n });\n }\n\n // Sort by date descending\n return dataPoints.sort((a, b) => b.date.getTime() - a.date.getTime());\n }\n\n private filterRunsByTimeRange(runs: MJTestRunEntity[]): MJTestRunEntity[] {\n if (this.historyTimeRange === 'all') return runs;\n\n const now = new Date();\n let cutoff: Date;\n\n switch (this.historyTimeRange) {\n case '7d':\n cutoff = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoff = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n default:\n return runs;\n }\n\n return runs.filter(r => r.StartedAt && new Date(r.StartedAt) >= cutoff);\n }\n\n private async buildSuitePerformance(runs: MJTestRunEntity[]): Promise<void> {\n // Group runs by suite\n const suiteMap = new Map<string, MJTestRunEntity[]>();\n\n for (const run of runs) {\n if (run.TestSuiteRunID) {\n if (!suiteMap.has(run.TestSuiteRunID)) {\n suiteMap.set(run.TestSuiteRunID, []);\n }\n suiteMap.get(run.TestSuiteRunID)!.push(run);\n }\n }\n\n // Load suite run info for each unique suite run\n if (suiteMap.size > 0) {\n const suiteRunIds = Array.from(suiteMap.keys()).map(id => `'${id}'`).join(',');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const suiteRunsResult = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `ID IN (${suiteRunIds})`,\n ResultType: 'entity_object'\n });\n\n if (suiteRunsResult.Success && suiteRunsResult.Results) {\n // Group by suite ID\n const suiteIdMap = new Map<string, { runs: MJTestRunEntity[], suiteRuns: MJTestSuiteRunEntity[] }>();\n\n for (const suiteRun of suiteRunsResult.Results) {\n const suiteId = suiteRun.SuiteID;\n if (!suiteIdMap.has(suiteId)) {\n suiteIdMap.set(suiteId, { runs: [], suiteRuns: [] });\n }\n suiteIdMap.get(suiteId)!.suiteRuns.push(suiteRun);\n\n const testRuns = suiteMap.get(suiteRun.ID) || [];\n suiteIdMap.get(suiteId)!.runs.push(...testRuns);\n }\n\n // Build performance data for each suite\n this.suitePerformance = [];\n for (const [suiteId, data] of suiteIdMap) {\n const suiteName = data.suiteRuns[0]?.Suite || 'Unknown Suite';\n const totalRuns = data.runs.length;\n const passedRuns = data.runs.filter(r => r.Status === 'Passed').length;\n const failedRuns = data.runs.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = data.runs.filter(r => r.Score != null).map(r => r.Score!);\n const durations = data.runs.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = data.runs.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n // Collect all tags from suite runs\n const allTags = TagsHelper.getUniqueTags(data.suiteRuns.map(sr => sr.Tags));\n\n // Find most recent run\n const lastRun = data.runs\n .filter(r => r.StartedAt)\n .sort((a, b) => new Date(b.StartedAt!).getTime() - new Date(a.StartedAt!).getTime())[0];\n\n this.suitePerformance.push({\n suiteId,\n suiteName,\n totalRuns,\n passedRuns,\n failedRuns,\n passRate: totalRuns > 0 ? (passedRuns / totalRuns) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n lastRun: lastRun?.StartedAt ? new Date(lastRun.StartedAt) : null,\n tags: allTags\n });\n }\n\n // Sort by total runs descending\n this.suitePerformance.sort((a, b) => b.totalRuns - a.totalRuns);\n }\n }\n }\n\n setHistoryTimeRange(range: '7d' | '30d' | '90d' | 'all'): void {\n this.historyTimeRange = range;\n this.historyLoaded = false;\n this.loadHistory();\n }\n\n setTagFilter(tag: string | null): void {\n this.selectedTagFilter = tag;\n this.cdr.markForCheck();\n }\n\n getFilteredHistoryData(): HistoryDataPoint[] {\n return this.historyData;\n }\n\n getOverallPassRate(): number {\n if (this.historyData.length === 0) return 0;\n const totalRuns = this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n const totalPassed = this.historyData.reduce((sum, d) => sum + d.passCount, 0);\n return totalRuns > 0 ? (totalPassed / totalRuns) * 100 : 0;\n }\n\n getOverallAvgScore(): number {\n if (this.historyData.length === 0) return 0;\n const scores = this.historyData.filter(d => d.avgScore > 0).map(d => d.avgScore);\n return scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;\n }\n\n getOverallAvgDuration(): number {\n if (this.historyData.length === 0) return 0;\n const durations = this.historyData.filter(d => d.avgDuration > 0).map(d => d.avgDuration);\n return durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;\n }\n\n getOverallAvgCost(): number {\n if (this.historyData.length === 0) return 0;\n const costs = this.historyData.filter(d => d.avgCost > 0).map(d => d.avgCost);\n return costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0;\n }\n\n getTotalRuns(): number {\n return this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n }\n\n getPassRateTrend(): 'up' | 'down' | 'stable' {\n if (this.historyData.length < 2) return 'stable';\n\n // Compare recent half to older half\n const mid = Math.floor(this.historyData.length / 2);\n const recentData = this.historyData.slice(0, mid);\n const olderData = this.historyData.slice(mid);\n\n const recentRate = recentData.reduce((sum, d) => sum + d.passRate, 0) / recentData.length;\n const olderRate = olderData.reduce((sum, d) => sum + d.passRate, 0) / olderData.length;\n\n const diff = recentRate - olderRate;\n if (diff > 5) return 'up';\n if (diff < -5) return 'down';\n return 'stable';\n }\n\n exportHistoryToCSV(): void {\n const headers = ['Date', 'Run Count', 'Passed', 'Failed', 'Pass Rate (%)', 'Avg Score', 'Avg Duration (s)', 'Avg Cost (USD)'];\n const rows = this.historyData.map(d => [\n d.date.toISOString().split('T')[0],\n d.runCount.toString(),\n d.passCount.toString(),\n d.failCount.toString(),\n d.passRate.toFixed(1),\n d.avgScore.toFixed(4),\n d.avgDuration.toFixed(2),\n d.avgCost.toFixed(6)\n ]);\n\n const csvContent = [headers, ...rows]\n .map(row => row.map(cell => `\"${cell}\"`).join(','))\n .join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `test-${this.record.ID.substring(0, 8)}-history.csv`;\n link.click();\n URL.revokeObjectURL(link.href);\n\n SharedService.Instance.CreateSimpleNotification('Export complete', 'success', 2000);\n }\n\n openSuiteFromHistory(suiteId: string): void {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n // ===========================\n // Keyboard Shortcuts Settings\n // ===========================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n}\n","<div class=\"test-form\">\n <!-- Header Section -->\n <div class=\"test-header\">\n <!-- Breadcrumb Navigation -->\n <nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"javascript:void(0)\" (click)=\"navigateToTestingDashboard()\">\n <i class=\"fas fa-vial\"></i>\n <span class=\"breadcrumb-text\">Testing</span>\n </a>\n </li>\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <i class=\"fas fa-flask\"></i>\n <span>{{ record.Name }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"test-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <div class=\"test-info\">\n <h1>{{ record.Name }}</h1>\n <div class=\"test-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n {{ record.Status }}\n </span>\n @if (record.Type) {\n <span class=\"test-type\">\n <i class=\"fas fa-tag\"></i>\n {{ record.Type }}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n <button mjButton (click)=\"runTest()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test\n </button>\n <button mjButton (click)=\"refresh()\" [disabled]=\"isRefreshing\">\n <i class=\"fas\" [ngClass]=\"isRefreshing ? 'fa-sync fa-spin' : 'fa-sync'\"></i>\n {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n </div>\n\n <!-- Test Description -->\n @if (record.Description) {\n <div class=\"test-description\">\n <p>{{ record.Description }}</p>\n </div>\n }\n\n <!-- Metrics Bar -->\n @if (testRunsLoaded && testRuns.length > 0) {\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Runs</div>\n <div class=\"metric-value\">{{ testRuns.length }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Pass Rate</div>\n <div class=\"metric-value\">{{ getPassRate().toFixed(1) }}%</div>\n <div class=\"metric-progress\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"getPassRate()\"></div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Cost</div>\n <div class=\"metric-value\">{{ formatCost(getAverageCost()) }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Duration</div>\n <div class=\"metric-value\">{{ formatDuration(getAverageDuration()) }}</div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'config'\"\n (click)=\"changeTab('config')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'config'\">\n <i class=\"fas fa-sliders-h\"></i>\n <span>Configuration</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'runs'\"\n (click)=\"changeTab('runs')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'runs'\">\n <i class=\"fas fa-history\"></i>\n <span>Runs</span>\n @if (testRunsLoaded) {\n <span class=\"tab-badge\">{{ testRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'suites'\"\n (click)=\"changeTab('suites')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'suites'\">\n <i class=\"fas fa-layer-group\"></i>\n <span>Test Suites</span>\n @if (suiteTestsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'analytics'\"\n (click)=\"changeTab('analytics')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'analytics'\">\n <i class=\"fas fa-chart-line\"></i>\n <span>Analytics</span>\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Basic Information -->\n <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Test Information</h3>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <div class=\"info-label\">Name</div>\n <div class=\"info-value\">{{ record.Name }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Type</div>\n <div class=\"info-value\">{{ record.Type || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Status</div>\n <div class=\"info-value\">\n <span class=\"status-badge-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Priority</div>\n <div class=\"info-value\">{{ record.Priority || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Duration</div>\n <div class=\"info-value\">{{ record.EstimatedDurationSeconds ? formatDuration(record.EstimatedDurationSeconds) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Cost</div>\n <div class=\"info-value\">{{ record.EstimatedCostUSD ? formatCost(record.EstimatedCostUSD) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Repeat Count</div>\n <div class=\"info-value\">{{ record.RepeatCount || 1 }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Max Execution Time</div>\n <div class=\"info-value\">{{ formatTimeout(record.MaxExecutionTimeMS) }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Created</div>\n <div class=\"info-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Updated</div>\n <div class=\"info-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n </div>\n </div>\n <!-- JSON Data Views -->\n <div class=\"json-section\">\n <h3><i class=\"fas fa-code\"></i> Test Definition</h3>\n <div class=\"json-tabs\">\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'input'\"\n (click)=\"setJsonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i>\n Input Definition\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'expected'\"\n (click)=\"setJsonView('expected')\">\n <i class=\"fas fa-check-double\"></i>\n Expected Outcomes\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'config'\"\n (click)=\"setJsonView('config')\">\n <i class=\"fas fa-cog\"></i>\n Configuration\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'tags'\"\n (click)=\"setJsonView('tags')\">\n <i class=\"fas fa-tags\"></i>\n Tags\n </button>\n </div>\n <div class=\"code-editor-container\">\n <mj-code-editor\n [value]=\"getJsonData()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Configuration Tab -->\n @if (activeTab === 'config') {\n <div class=\"config-tab\">\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cogs\"></i> Execution Settings</h3>\n <div class=\"config-grid\">\n <div class=\"config-item\">\n <label>Priority</label>\n <input type=\"number\" [(ngModel)]=\"record.Priority\" class=\"config-input\" placeholder=\"Lower = Higher Priority\" />\n </div>\n <div class=\"config-item\">\n <label>Repeat Count</label>\n <input type=\"number\" [(ngModel)]=\"record.RepeatCount\" class=\"config-input\" min=\"1\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Duration (seconds)</label>\n <input type=\"number\" [(ngModel)]=\"record.EstimatedDurationSeconds\" class=\"config-input\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Cost (USD)</label>\n <input type=\"number\" step=\"0.000001\" [(ngModel)]=\"record.EstimatedCostUSD\" class=\"config-input\" />\n </div>\n <div class=\"config-item full-width\">\n <label>Max Execution Time (ms)</label>\n <input type=\"number\" [(ngModel)]=\"record.MaxExecutionTimeMS\" class=\"config-input\" placeholder=\"Default: 300000 (5 min)\" />\n <span class=\"config-hint\">Leave empty for default 5 minute timeout</span>\n </div>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-sign-in-alt\"></i> Input Definition (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.InputDefinition || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.InputDefinition = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-check-double\"></i> Expected Outcomes (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.ExpectedOutcomes || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.ExpectedOutcomes = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cog\"></i> Configuration (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.Configuration || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Configuration = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-tags\"></i> Tags (JSON Array)</h3>\n <div class=\"config-editor-container small\">\n <mj-code-editor\n [value]=\"record.Tags || '[]'\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Tags = $event\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Test Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Loading State -->\n @if (loadingRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3,4,5]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Runs List -->\n @if (!loadingRuns && testRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of testRuns; track run) {\n <div class=\"run-item\" (click)=\"openTestRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-stopwatch]=\"run.Status === 'Timeout'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header\">\n <span class=\"run-id\">Run #{{ run.ID.substring(0, 8) }}</span>\n <span class=\"run-status\" [style.color]=\"getRunStatusColor(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-meta\">\n <span><i class=\"fas fa-calendar\"></i> {{ getRelativeTime(run.StartedAt) }}</span>\n @if (run.DurationSeconds) {\n <span><i class=\"fas fa-clock\"></i> {{ formatDuration(run.DurationSeconds) }}</span>\n }\n @if (run.CostUSD) {\n <span><i class=\"fas fa-dollar-sign\"></i> {{ formatCost(run.CostUSD) }}</span>\n }\n @if (run.TargetLogEntityID && run.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"run.TargetLogEntity\"\n [recordId]=\"run.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n <!-- Evaluation indicators -->\n <div class=\"run-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-pill status-pill\"\n [ngClass]=\"'status-' + run.Status.toLowerCase()\"\n [title]=\"getStatusTooltip(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-hourglass-end]=\"run.Status === 'Timeout'\"\n [class.fa-forward]=\"run.Status === 'Skipped'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n <span>{{ run.Status }}</span>\n </span>\n }\n <!-- Human feedback indicator -->\n @if (evalPreferences.showHuman) {\n @if (!getFeedbackForRun(run.ID)?.Rating) {\n <span class=\"eval-pill human-pill no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (getFeedbackForRun(run.ID)?.Rating; as rating) {\n <span class=\"eval-pill human-pill has-feedback\"\n [class.rating-low]=\"rating <= 4\"\n [class.rating-medium]=\"rating >= 5 && rating <= 6\"\n [class.rating-good]=\"rating >= 7 && rating <= 8\"\n [class.rating-excellent]=\"rating >= 9\"\n [title]=\"getHumanTooltip(rating, getFeedbackForRun(run.ID)?.CorrectionSummary || getFeedbackForRun(run.ID)?.Comments || null)\">\n <i class=\"fas fa-user\"></i>\n <span>{{ rating }}</span>\n </span>\n }\n }\n <!-- Auto score indicator -->\n @if (evalPreferences.showAuto) {\n @if (run.Score == null) {\n <span class=\"eval-pill auto-pill no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n @if (run.Score != null) {\n <span class=\"eval-pill auto-pill has-score\"\n [class.score-low]=\"run.Score < 0.5\"\n [class.score-medium]=\"run.Score >= 0.5 && run.Score < 0.7\"\n [class.score-good]=\"run.Score >= 0.7 && run.Score < 0.85\"\n [class.score-excellent]=\"run.Score >= 0.85\"\n [title]=\"'Auto Score: ' + (run.Score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ (run.Score * 100).toFixed(0) }}%</span>\n </span>\n }\n }\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run).slice(0, 3); track tag) {\n <span class=\"run-tag\">{{ tag }}</span>\n }\n @if (getRunTags(run).length > 3) {\n <span class=\"run-tag-more\">+{{ getRunTags(run).length - 3 }}</span>\n }\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testRunsLoaded && !loadingRuns && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <h4>No Test Runs Yet</h4>\n <p>Run this test to see execution history and results here.</p>\n <button mjButton (click)=\"runTest()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Test Suites Tab -->\n @if (activeTab === 'suites') {\n <div class=\"suites-tab\">\n <!-- Loading State -->\n @if (loadingSuites) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Suites List -->\n @if (!loadingSuites && suiteTests.length > 0) {\n <div class=\"suites-list\">\n @for (suiteTest of suiteTests; track suiteTest) {\n <div class=\"suite-item\" (click)=\"openTestSuite(suiteTest.SuiteID)\">\n <div class=\"suite-icon\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-content\">\n <div class=\"suite-name\">{{ suiteTest.Suite }}</div>\n <div class=\"suite-meta\">\n <span><i class=\"fas fa-sort-numeric-up\"></i> Sequence: {{ suiteTest.Sequence }}</span>\n @if (suiteTest.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ suiteTest.Status }}</span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (suiteTestsLoaded && !loadingSuites && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-folder-open\"></i>\n </div>\n <h4>Not Part of Any Suite</h4>\n <p>This test is not included in any test suites. Add it to a suite to run it with other tests.</p>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"history-tab\">\n <!-- Loading State -->\n @if (loadingHistory) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading history...\"></mj-loading>\n </div>\n }\n <!-- History Content -->\n @if (!loadingHistory && historyLoaded) {\n <div class=\"history-content\">\n <!-- Filters -->\n <div class=\"history-filters\">\n <div class=\"time-range-filters\">\n <span class=\"filter-label\">Time Range:</span>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '7d'\"\n (click)=\"setHistoryTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '30d'\"\n (click)=\"setHistoryTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '90d'\"\n (click)=\"setHistoryTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === 'all'\"\n (click)=\"setHistoryTimeRange('all')\">All Time</button>\n </div>\n <div class=\"history-actions\">\n <button mjButton (click)=\"exportHistoryToCSV()\" [disabled]=\"historyData.length === 0\">\n <i class=\"fas fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- KPI Cards -->\n @if (historyData.length > 0) {\n <div class=\"history-kpi-cards\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getTotalRuns() }}</div>\n <div class=\"kpi-label\">Total Runs</div>\n </div>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon pass-rate\">\n <i class=\"fas fa-percentage\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">\n {{ getOverallPassRate().toFixed(1) }}%\n <i class=\"fas trend-icon\"\n [class.fa-arrow-up]=\"getPassRateTrend() === 'up'\"\n [class.fa-arrow-down]=\"getPassRateTrend() === 'down'\"\n [class.fa-minus]=\"getPassRateTrend() === 'stable'\"\n [class.trend-up]=\"getPassRateTrend() === 'up'\"\n [class.trend-down]=\"getPassRateTrend() === 'down'\"></i>\n </div>\n <div class=\"kpi-label\">Pass Rate</div>\n </div>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ (getOverallAvgScore() * 100).toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Score</div>\n </div>\n </div>\n }\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getOverallAvgDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getOverallAvgCost()) }}</div>\n <div class=\"kpi-label\">Avg Cost</div>\n </div>\n </div>\n </div>\n }\n <!-- Daily History Table -->\n @if (historyData.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-calendar-alt\"></i> Daily Performance</h3>\n <div class=\"history-table-container\">\n <table class=\"history-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Runs</th>\n @if (evalPreferences.showExecution) {\n <th>Passed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Failed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Pass Rate</th>\n }\n @if (evalPreferences.showAuto) {\n <th>Avg Score</th>\n }\n <th>Avg Duration</th>\n <th>Avg Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (day of historyData; track day) {\n <tr>\n <td class=\"date-cell\">{{ day.date | date:'mediumDate' }}</td>\n <td class=\"runs-cell\">{{ day.runCount }}</td>\n @if (evalPreferences.showExecution) {\n <td class=\"passed-cell\">{{ day.passCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"failed-cell\">{{ day.failCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\">\n <div class=\"pass-rate-fill\" [style.width.%]=\"day.passRate\"></div>\n <span class=\"pass-rate-text\">{{ day.passRate.toFixed(1) }}%</span>\n </div>\n </td>\n }\n @if (evalPreferences.showAuto) {\n <td class=\"score-cell\">{{ (day.avgScore * 100).toFixed(1) }}%</td>\n }\n <td class=\"duration-cell\">{{ formatDuration(day.avgDuration) }}</td>\n <td class=\"cost-cell\">{{ formatCost(day.avgCost) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n <!-- Suite Performance -->\n @if (suitePerformance.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-layer-group\"></i> Performance by Suite</h3>\n <div class=\"suite-performance-list\">\n @for (suite of suitePerformance; track suite) {\n <div class=\"suite-perf-card\" (click)=\"openSuiteFromHistory(suite.suiteId)\">\n <div class=\"suite-perf-header\">\n <div class=\"suite-perf-name\">{{ suite.suiteName }}</div>\n @if (suite.tags.length > 0) {\n <div class=\"suite-perf-tags\">\n @for (tag of suite.tags.slice(0, 3); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n @if (suite.tags.length > 3) {\n <span class=\"tag-more\">+{{ suite.tags.length - 3 }}</span>\n }\n </div>\n }\n </div>\n <div class=\"suite-perf-stats\">\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ suite.totalRuns }}</span>\n <span class=\"stat-label\">Runs</span>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"suite-stat\">\n <span class=\"stat-value pass-rate\" [class.high]=\"suite.passRate >= 80\" [class.low]=\"suite.passRate < 50\">\n {{ suite.passRate.toFixed(1) }}%\n </span>\n <span class=\"stat-label\">Pass Rate</span>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ (suite.avgScore * 100).toFixed(1) }}%</span>\n <span class=\"stat-label\">Avg Score</span>\n </div>\n }\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatDuration(suite.avgDuration) }}</span>\n <span class=\"stat-label\">Avg Duration</span>\n </div>\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatCost(suite.avgCost) }}</span>\n <span class=\"stat-label\">Avg Cost</span>\n </div>\n @if (suite.lastRun) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ getRelativeTime(suite.lastRun) }}</span>\n <span class=\"stat-label\">Last Run</span>\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right suite-perf-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (historyData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-line\"></i>\n </div>\n <h4>No History Available</h4>\n <p>Run this test to start building history and analytics data.</p>\n <button mjButton (click)=\"runTest()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Toggle Button -->\n <button class=\"shortcuts-toggle\" (click)=\"toggleShortcuts()\" [title]=\"showShortcuts ? 'Hide keyboard shortcuts' : 'Show keyboard shortcuts'\">\n <i class=\"fas fa-keyboard\"></i>\n </button>\n\n <!-- Keyboard Shortcuts Hint (Desktop Only) -->\n @if (showShortcuts) {\n <div class=\"keyboard-shortcuts\">\n <div class=\"shortcuts-header\">\n <i class=\"fas fa-keyboard\"></i>\n Shortcuts\n <button class=\"shortcuts-close\" (click)=\"toggleShortcuts()\" title=\"Hide shortcuts\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcut-list\">\n <div class=\"shortcut-item\">\n <span>Refresh</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>R</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Run Test</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Enter</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Switch Tabs</span>\n <span class=\"shortcut-keys\"><kbd>1</kbd>-<kbd>5</kbd></span>\n </div>\n </div>\n </div>\n }\n\n <!-- Slide Panel for Test Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.testId ? 'Test Execution' : 'Run Test'\"\n [Resizable]=\"true\"\n (Closed)=\"OnPanelClosed()\">\n <app-test-run-dialog\n [PanelMode]=\"true\"\n [selectedTestId]=\"testingDialogService.PanelOptions?.testId ?? null\"\n [selectedSuiteId]=\"testingDialogService.PanelOptions?.suiteId ?? null\"\n [runMode]=\"testingDialogService.PanelOptions?.mode ?? 'test'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n</div>\n"]}
1
+ {"version":3,"file":"test-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-form.component.ts","../../../../src/lib/custom/Tests/test-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, ViewContainerRef, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestEntity, MJTestRunEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJUserSettingEntity, UserInfoEngine, MJTestRunFeedbackEntity, MJTestTypeEntity } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestFormComponent } from '../../generated/Entities/MJTest/mjtest.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\nimport { createCopyOnlyToolbar, ToolbarConfig } from '@memberjunction/ng-code-editor';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\ninterface HistoryDataPoint {\n date: Date;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n runCount: number;\n passCount: number;\n failCount: number;\n}\n\ninterface SuitePerformance {\n suiteId: string;\n suiteName: string;\n totalRuns: number;\n passedRuns: number;\n failedRuns: number;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n lastRun: Date | null;\n tags: string[];\n}\n\ninterface ParsedJSON {\n inputDefinition?: Record<string, unknown>;\n expectedOutcomes?: Record<string, unknown>;\n configuration?: Record<string, unknown>;\n tags?: string[];\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Tests')\n@Component({\n standalone: false,\n selector: 'mj-test-form',\n templateUrl: './test-form.component.html',\n styleUrls: ['./test-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestFormComponentExtended extends MJTestFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingRuns = false;\n loadingSuites = false;\n error: string | null = null;\n testRunsLoaded = false;\n suiteTestsLoaded = false;\n isRefreshing = false;\n\n // Related data\n testRuns: MJTestRunEntity[] = [];\n suiteTests: MJTestSuiteTestEntity[] = [];\n\n // Human feedback map: testRunId -> feedback entity\n feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n // History tab data\n historyLoaded = false;\n loadingHistory = false;\n historyTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n historyData: HistoryDataPoint[] = [];\n suitePerformance: SuitePerformance[] = [];\n uniqueTags: string[] = [];\n selectedTagFilter: string | null = null;\n\n // Parsed JSON fields\n parsedData: ParsedJSON = {};\n\n // Active JSON view\n activeJsonView: 'input' | 'expected' | 'config' | 'tags' = 'input';\n\n // Code editor configuration\n jsonToolbar: ToolbarConfig = createCopyOnlyToolbar();\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private get metadata() { return this.ProviderToUse; }\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\n\n // Service injections\n private navigationService = inject(NavigationService);\n public testingDialogService = inject(TestingDialogService);\n private evalPrefsService = inject(EvaluationPreferencesService);\n private viewContainerRef = inject(ViewContainerRef);\n private appManager = inject(ApplicationManager);\n\n // Edit state\n isSaving = false;\n testTypeOptions: MJTestTypeEntity[] = [];\n tagDraft = '';\n readonly statusOptions: readonly string[] = ['Active', 'Pending', 'Disabled'];\n\n async ngOnInit() {\n await super.ngOnInit();\n this.loadShortcutsSetting();\n // Fire-and-forget: test type list for the edit form\n this.loadTestTypeOptions();\n\n // Subscribe to evaluation preferences\n this.evalPrefsService.preferences$\n .pipe(takeUntil(this.destroy$))\n .subscribe(prefs => {\n this.evalPreferences = prefs;\n this.cdr.markForCheck();\n });\n\n // Subscribe to panel state changes so the slide panel renders in this form\n this.testingDialogService.PanelStateChanged$\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.cdr.detectChanges();\n });\n\n if (this.record && this.record.ID) {\n this.parseJsonFields();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + S: Save (if dirty)\n if ((event.metaKey || event.ctrlKey) && event.key === 's' && !event.shiftKey) {\n if (this.isDirty) {\n event.preventDefault();\n this.saveChanges();\n }\n return;\n }\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Enter: Run test\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runTest();\n return;\n }\n\n // Number keys for tabs (1-5) — skip when typing into form inputs\n if (!event.metaKey && !event.ctrlKey && !event.altKey && !this.isTextInputFocused()) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('config'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('suites'); break;\n case '5': this.changeTab('analytics'); break;\n }\n }\n }\n\n // Warn before tab close / hard navigation when there are unsaved changes\n @HostListener('window:beforeunload', ['$event'])\n handleBeforeUnload(event: BeforeUnloadEvent) {\n if (this.isDirty) {\n event.preventDefault();\n event.returnValue = '';\n }\n }\n\n private isTextInputFocused(): boolean {\n const el = document.activeElement;\n if (!el) return false;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || (el as HTMLElement).isContentEditable;\n }\n\n private async loadTestRuns() {\n if (this.testRunsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.testRuns = result.Results || [];\n\n // Load feedbacks for all test runs\n if (this.testRuns.length > 0) {\n await this.loadFeedbacksForTestRuns(this.testRuns.map(r => r.ID));\n }\n }\n\n this.testRunsLoaded = true;\n } catch (error) {\n console.error('Error loading test runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<void> {\n if (testRunIds.length === 0) return;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const chunkSize = 50;\n for (let i = 0; i < testRunIds.length; i += chunkSize) {\n const chunk = testRunIds.slice(i, i + chunkSize);\n const inClause = chunk.map(id => `'${id}'`).join(',');\n\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${inClause})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n for (const feedback of result.Results) {\n this.feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n }\n\n /**\n * Get feedback for a specific test run\n */\n getFeedbackForRun(testRunId: string): MJTestRunFeedbackEntity | undefined {\n return this.feedbackMap.get(testRunId);\n }\n\n /**\n * Get tooltip for status indicator\n */\n getStatusTooltip(status: string): string {\n switch (status) {\n case 'Passed': return 'Status: Passed - Test completed without error';\n case 'Failed': return 'Status: Failed - Test assertions did not pass';\n case 'Error': return 'Status: Error - Test encountered an exception';\n case 'Timeout': return 'Status: Timeout - Test exceeded time limit';\n case 'Skipped': return 'Status: Skipped - Test was not executed';\n case 'Running': return 'Status: Running - Test is currently executing';\n case 'Pending': return 'Status: Pending - Test waiting to run';\n default: return `Status: ${status}`;\n }\n }\n\n /**\n * Get tooltip for human review with rating and optional comments\n */\n getHumanTooltip(rating: number, comments: string | null): string {\n let tooltip = `Human Review: ${rating}/10 rating`;\n if (comments) {\n const truncated = comments.length > 200 ? comments.substring(0, 200) + '...' : comments;\n tooltip += `\\n\\n\"${truncated}\"`;\n }\n return tooltip;\n }\n\n private async loadSuiteTests() {\n if (this.suiteTestsLoaded) return;\n\n this.loadingSuites = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.suiteTests = result.Results || [];\n }\n\n this.suiteTestsLoaded = true;\n } catch (error) {\n console.error('Error loading suite tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test suites', 'error', 3000);\n } finally {\n this.loadingSuites = false;\n this.cdr.markForCheck();\n }\n }\n\n private parseJsonFields() {\n try {\n if (this.record.InputDefinition) {\n this.parsedData.inputDefinition = JSON.parse(this.record.InputDefinition);\n }\n if (this.record.ExpectedOutcomes) {\n this.parsedData.expectedOutcomes = JSON.parse(this.record.ExpectedOutcomes);\n }\n if (this.record.Configuration) {\n this.parsedData.configuration = JSON.parse(this.record.Configuration);\n }\n if (this.record.Tags) {\n this.parsedData.tags = JSON.parse(this.record.Tags);\n }\n } catch (error) {\n console.error('Error parsing JSON fields:', error);\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if (tab === 'runs' && !this.testRunsLoaded) {\n this.loadTestRuns();\n }\n\n if (tab === 'suites' && !this.suiteTestsLoaded) {\n this.loadSuiteTests();\n }\n\n if (tab === 'analytics' && !this.historyLoaded) {\n this.loadHistory();\n }\n\n this.cdr.markForCheck();\n }\n\n setJsonView(view: 'input' | 'expected' | 'config' | 'tags') {\n this.activeJsonView = view;\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return '#10b981';\n case 'Disabled': return '#6b7280';\n case 'Pending': return '#f59e0b';\n default: return '#9ca3af';\n }\n }\n\n getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Active': return 'fa-circle-check';\n case 'Disabled': return 'fa-circle-stop';\n case 'Pending': return 'fa-circle-pause';\n default: return 'fa-circle-question';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Passed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Error': return '#f59e0b';\n case 'Timeout': return '#f97316';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n default: return '#6b7280';\n }\n }\n\n getPassRate(): number {\n if (this.testRuns.length === 0) return 0;\n const passed = this.testRuns.filter(r => r.Status === 'Passed').length;\n return (passed / this.testRuns.length) * 100;\n }\n\n getAverageCost(): number {\n if (this.testRuns.length === 0) return 0;\n const totalCost = this.testRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n return totalCost / this.testRuns.length;\n }\n\n getAverageDuration(): number {\n if (this.testRuns.length === 0) return 0;\n const totalDuration = this.testRuns.reduce((sum, r) => sum + (r.DurationSeconds || 0), 0);\n return totalDuration / this.testRuns.length;\n }\n\n formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${mins}m`;\n }\n\n formatCost(cost: number): string {\n return `$${cost.toFixed(6)}`;\n }\n\n formatTimeout(ms: number | null): string {\n if (ms === null || ms === undefined) return 'Default (5 min)';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n openTestRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(runId));\n }\n\n getRunTags(run: MJTestRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n openTestSuite(suiteId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n async runTest() {\n if (this.record?.ID) {\n this.testingDialogService.OpenTestPanel(this.record.ID);\n }\n }\n\n OnPanelClosed(): void {\n this.testingDialogService.ClosePanel();\n this.cdr.markForCheck();\n }\n\n async refresh() {\n this.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n await this.record.Load(this.record.ID);\n this.parseJsonFields();\n\n // Reset lazy-loaded data to force reload\n if (this.testRunsLoaded) {\n this.testRunsLoaded = false;\n this.testRuns = [];\n await this.loadTestRuns();\n }\n if (this.suiteTestsLoaded) {\n this.suiteTestsLoaded = false;\n this.suiteTests = [];\n await this.loadSuiteTests();\n }\n\n SharedService.Instance.CreateSimpleNotification('Refreshed successfully', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to refresh', 'error', 3000);\n } finally {\n this.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n getJsonData(): string {\n let data: Record<string, unknown> | string[] | undefined;\n switch (this.activeJsonView) {\n case 'input': data = this.parsedData.inputDefinition; break;\n case 'expected': data = this.parsedData.expectedOutcomes; break;\n case 'config': data = this.parsedData.configuration; break;\n case 'tags': data = this.parsedData.tags; break;\n }\n return data ? JSON.stringify(data, null, 2) : '// No data available';\n }\n\n getRelativeTime(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n // ===========================\n // History Tab Methods\n // ===========================\n\n async loadHistory(): Promise<void> {\n if (this.historyLoaded) return;\n\n this.loadingHistory = true;\n this.cdr.markForCheck();\n\n try {\n // Load all test runs for this test\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const runsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n ResultType: 'entity_object'\n });\n\n if (runsResult.Success && runsResult.Results) {\n const allRuns = runsResult.Results;\n\n // Extract unique tags from all runs\n this.uniqueTags = TagsHelper.getUniqueTags(allRuns.map(r => r.Tags));\n\n // Build history data (aggregated by date)\n this.historyData = this.buildHistoryData(allRuns);\n\n // Build suite performance data\n await this.buildSuitePerformance(allRuns);\n }\n\n this.historyLoaded = true;\n } catch (error) {\n console.error('Error loading history:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load history', 'error', 3000);\n } finally {\n this.loadingHistory = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildHistoryData(runs: MJTestRunEntity[]): HistoryDataPoint[] {\n // Filter by time range\n const filteredRuns = this.filterRunsByTimeRange(runs);\n\n // Group by date\n const dateMap = new Map<string, MJTestRunEntity[]>();\n for (const run of filteredRuns) {\n if (run.StartedAt) {\n const dateKey = new Date(run.StartedAt).toISOString().split('T')[0];\n if (!dateMap.has(dateKey)) {\n dateMap.set(dateKey, []);\n }\n dateMap.get(dateKey)!.push(run);\n }\n }\n\n // Convert to data points\n const dataPoints: HistoryDataPoint[] = [];\n for (const [dateKey, dateRuns] of dateMap) {\n const passCount = dateRuns.filter(r => r.Status === 'Passed').length;\n const failCount = dateRuns.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = dateRuns.filter(r => r.Score != null).map(r => r.Score!);\n const durations = dateRuns.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = dateRuns.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n dataPoints.push({\n date: new Date(dateKey),\n passRate: dateRuns.length > 0 ? (passCount / dateRuns.length) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n runCount: dateRuns.length,\n passCount,\n failCount\n });\n }\n\n // Sort by date descending\n return dataPoints.sort((a, b) => b.date.getTime() - a.date.getTime());\n }\n\n private filterRunsByTimeRange(runs: MJTestRunEntity[]): MJTestRunEntity[] {\n if (this.historyTimeRange === 'all') return runs;\n\n const now = new Date();\n let cutoff: Date;\n\n switch (this.historyTimeRange) {\n case '7d':\n cutoff = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoff = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n default:\n return runs;\n }\n\n return runs.filter(r => r.StartedAt && new Date(r.StartedAt) >= cutoff);\n }\n\n private async buildSuitePerformance(runs: MJTestRunEntity[]): Promise<void> {\n // Group runs by suite\n const suiteMap = new Map<string, MJTestRunEntity[]>();\n\n for (const run of runs) {\n if (run.TestSuiteRunID) {\n if (!suiteMap.has(run.TestSuiteRunID)) {\n suiteMap.set(run.TestSuiteRunID, []);\n }\n suiteMap.get(run.TestSuiteRunID)!.push(run);\n }\n }\n\n // Load suite run info for each unique suite run\n if (suiteMap.size > 0) {\n const suiteRunIds = Array.from(suiteMap.keys()).map(id => `'${id}'`).join(',');\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const suiteRunsResult = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `ID IN (${suiteRunIds})`,\n ResultType: 'entity_object'\n });\n\n if (suiteRunsResult.Success && suiteRunsResult.Results) {\n // Group by suite ID\n const suiteIdMap = new Map<string, { runs: MJTestRunEntity[], suiteRuns: MJTestSuiteRunEntity[] }>();\n\n for (const suiteRun of suiteRunsResult.Results) {\n const suiteId = suiteRun.SuiteID;\n if (!suiteIdMap.has(suiteId)) {\n suiteIdMap.set(suiteId, { runs: [], suiteRuns: [] });\n }\n suiteIdMap.get(suiteId)!.suiteRuns.push(suiteRun);\n\n const testRuns = suiteMap.get(suiteRun.ID) || [];\n suiteIdMap.get(suiteId)!.runs.push(...testRuns);\n }\n\n // Build performance data for each suite\n this.suitePerformance = [];\n for (const [suiteId, data] of suiteIdMap) {\n const suiteName = data.suiteRuns[0]?.Suite || 'Unknown Suite';\n const totalRuns = data.runs.length;\n const passedRuns = data.runs.filter(r => r.Status === 'Passed').length;\n const failedRuns = data.runs.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = data.runs.filter(r => r.Score != null).map(r => r.Score!);\n const durations = data.runs.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = data.runs.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n // Collect all tags from suite runs\n const allTags = TagsHelper.getUniqueTags(data.suiteRuns.map(sr => sr.Tags));\n\n // Find most recent run\n const lastRun = data.runs\n .filter(r => r.StartedAt)\n .sort((a, b) => new Date(b.StartedAt!).getTime() - new Date(a.StartedAt!).getTime())[0];\n\n this.suitePerformance.push({\n suiteId,\n suiteName,\n totalRuns,\n passedRuns,\n failedRuns,\n passRate: totalRuns > 0 ? (passedRuns / totalRuns) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n lastRun: lastRun?.StartedAt ? new Date(lastRun.StartedAt) : null,\n tags: allTags\n });\n }\n\n // Sort by total runs descending\n this.suitePerformance.sort((a, b) => b.totalRuns - a.totalRuns);\n }\n }\n }\n\n setHistoryTimeRange(range: '7d' | '30d' | '90d' | 'all'): void {\n this.historyTimeRange = range;\n this.historyLoaded = false;\n this.loadHistory();\n }\n\n setTagFilter(tag: string | null): void {\n this.selectedTagFilter = tag;\n this.cdr.markForCheck();\n }\n\n getFilteredHistoryData(): HistoryDataPoint[] {\n return this.historyData;\n }\n\n getOverallPassRate(): number {\n if (this.historyData.length === 0) return 0;\n const totalRuns = this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n const totalPassed = this.historyData.reduce((sum, d) => sum + d.passCount, 0);\n return totalRuns > 0 ? (totalPassed / totalRuns) * 100 : 0;\n }\n\n getOverallAvgScore(): number {\n if (this.historyData.length === 0) return 0;\n const scores = this.historyData.filter(d => d.avgScore > 0).map(d => d.avgScore);\n return scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;\n }\n\n getOverallAvgDuration(): number {\n if (this.historyData.length === 0) return 0;\n const durations = this.historyData.filter(d => d.avgDuration > 0).map(d => d.avgDuration);\n return durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;\n }\n\n getOverallAvgCost(): number {\n if (this.historyData.length === 0) return 0;\n const costs = this.historyData.filter(d => d.avgCost > 0).map(d => d.avgCost);\n return costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0;\n }\n\n getTotalRuns(): number {\n return this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n }\n\n getPassRateTrend(): 'up' | 'down' | 'stable' {\n if (this.historyData.length < 2) return 'stable';\n\n // Compare recent half to older half\n const mid = Math.floor(this.historyData.length / 2);\n const recentData = this.historyData.slice(0, mid);\n const olderData = this.historyData.slice(mid);\n\n const recentRate = recentData.reduce((sum, d) => sum + d.passRate, 0) / recentData.length;\n const olderRate = olderData.reduce((sum, d) => sum + d.passRate, 0) / olderData.length;\n\n const diff = recentRate - olderRate;\n if (diff > 5) return 'up';\n if (diff < -5) return 'down';\n return 'stable';\n }\n\n exportHistoryToCSV(): void {\n const headers = ['Date', 'Run Count', 'Passed', 'Failed', 'Pass Rate (%)', 'Avg Score', 'Avg Duration (s)', 'Avg Cost (USD)'];\n const rows = this.historyData.map(d => [\n d.date.toISOString().split('T')[0],\n d.runCount.toString(),\n d.passCount.toString(),\n d.failCount.toString(),\n d.passRate.toFixed(1),\n d.avgScore.toFixed(4),\n d.avgDuration.toFixed(2),\n d.avgCost.toFixed(6)\n ]);\n\n const csvContent = [headers, ...rows]\n .map(row => row.map(cell => `\"${cell}\"`).join(','))\n .join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `test-${this.record.ID.substring(0, 8)}-history.csv`;\n link.click();\n URL.revokeObjectURL(link.href);\n\n SharedService.Instance.CreateSimpleNotification('Export complete', 'success', 2000);\n }\n\n openSuiteFromHistory(suiteId: string): void {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n // ===========================\n // Keyboard Shortcuts Settings\n // ===========================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n\n // ==========================================\n // Edit / Save Methods\n // ==========================================\n\n /** True if the test record has any unsaved field changes. */\n get isDirty(): boolean {\n return this.record?.Dirty === true;\n }\n\n /** Names of fields with pending edits, used by the save bar. */\n get dirtyFieldNames(): string[] {\n if (!this.record?.Fields) return [];\n return this.record.Fields.filter(f => f.Dirty).map(f => f.Name);\n }\n\n /** Parsed tags as a plain array — derived from record.Tags JSON. */\n get tags(): string[] {\n return TagsHelper.parseTags(this.record?.Tags);\n }\n\n /** Load test types for the Type dropdown. */\n private async loadTestTypeOptions() {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTestTypeEntity>({\n EntityName: 'MJ: Test Types',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n if (result.Success) {\n this.testTypeOptions = result.Results || [];\n this.cdr.markForCheck();\n }\n } catch (error) {\n console.warn('Failed to load test type options:', error);\n }\n }\n\n /** Save all pending changes on the test record. */\n async saveChanges(): Promise<void> {\n if (!this.isDirty || this.isSaving) return;\n\n this.isSaving = true;\n this.cdr.markForCheck();\n try {\n const ok = await this.SaveRecord(false);\n if (ok) {\n SharedService.Instance.CreateSimpleNotification('Test saved', 'success', 2000);\n // Re-parse JSON fields since editor content may have changed\n this.parseJsonFields();\n } else {\n const detail = this.record?.LatestResult?.CompleteMessage || this.record?.LatestResult?.Message || 'Save failed';\n SharedService.Instance.CreateSimpleNotification(detail, 'error', 4000);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Save failed';\n SharedService.Instance.CreateSimpleNotification(msg, 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Discard all pending field changes on the test. */\n discardChanges(): void {\n if (!this.isDirty) return;\n if (!confirm('Discard your unsaved changes?')) return;\n this.record.Revert();\n this.tagDraft = '';\n this.parseJsonFields();\n this.cdr.markForCheck();\n }\n\n /** Add a tag from tagDraft (called on Enter / comma / blur). */\n addTagFromDraft(): void {\n const raw = this.tagDraft.trim();\n if (!raw) return;\n const incoming = raw.split(',').map(t => t.trim()).filter(t => t.length > 0);\n const existing = this.tags;\n const merged = [...existing];\n for (const t of incoming) {\n if (!merged.includes(t)) merged.push(t);\n }\n this.record.Tags = TagsHelper.toJson(merged);\n this.tagDraft = '';\n this.cdr.markForCheck();\n }\n\n /** Remove a single tag. */\n removeTag(tag: string): void {\n this.record.Tags = TagsHelper.removeTag(this.record.Tags, tag);\n this.cdr.markForCheck();\n }\n\n /** Handle Enter / comma in the tag input to commit the draft tag. */\n onTagInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n this.addTagFromDraft();\n return;\n }\n if (event.key === 'Backspace' && !this.tagDraft) {\n const all = this.tags;\n if (all.length > 0) {\n event.preventDefault();\n this.removeTag(all[all.length - 1]);\n }\n }\n }\n}\n","<div class=\"test-form\">\n <!-- Header Section -->\n <div class=\"test-header\">\n <!-- Breadcrumb Navigation -->\n <nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"javascript:void(0)\" (click)=\"navigateToTestingDashboard()\">\n <i class=\"fas fa-vial\"></i>\n <span class=\"breadcrumb-text\">Testing</span>\n </a>\n </li>\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <i class=\"fas fa-flask\"></i>\n <span>{{ record.Name }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"test-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <div class=\"test-info\">\n <h1>\n {{ record.Name }}\n @if (isDirty) {\n <span class=\"dirty-indicator\" title=\"You have unsaved changes\" aria-label=\"Unsaved changes\">●</span>\n }\n </h1>\n <div class=\"test-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n {{ record.Status }}\n </span>\n @if (record.Type) {\n <span class=\"test-type\">\n <i class=\"fas fa-tag\"></i>\n {{ record.Type }}\n </span>\n }\n @if (isDirty) {\n <span class=\"unsaved-pill\" title=\"You have unsaved changes\">\n <i class=\"fas fa-circle\"></i> Unsaved\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n <button mjButton (click)=\"runTest()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test\n </button>\n <button mjButton (click)=\"refresh()\" [disabled]=\"isRefreshing\">\n <i class=\"fas\" [ngClass]=\"isRefreshing ? 'fa-sync fa-spin' : 'fa-sync'\"></i>\n {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n </div>\n\n <!-- Test Description -->\n @if (record.Description) {\n <div class=\"test-description\">\n <p>{{ record.Description }}</p>\n </div>\n }\n\n <!-- Metrics Bar -->\n @if (testRunsLoaded && testRuns.length > 0) {\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Runs</div>\n <div class=\"metric-value\">{{ testRuns.length }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Pass Rate</div>\n <div class=\"metric-value\">{{ getPassRate().toFixed(1) }}%</div>\n <div class=\"metric-progress\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"getPassRate()\"></div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Cost</div>\n <div class=\"metric-value\">{{ formatCost(getAverageCost()) }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Duration</div>\n <div class=\"metric-value\">{{ formatDuration(getAverageDuration()) }}</div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'config'\"\n (click)=\"changeTab('config')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'config'\">\n <i class=\"fas fa-sliders-h\"></i>\n <span>Configuration</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'runs'\"\n (click)=\"changeTab('runs')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'runs'\">\n <i class=\"fas fa-history\"></i>\n <span>Runs</span>\n @if (testRunsLoaded) {\n <span class=\"tab-badge\">{{ testRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'suites'\"\n (click)=\"changeTab('suites')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'suites'\">\n <i class=\"fas fa-layer-group\"></i>\n <span>Test Suites</span>\n @if (suiteTestsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'analytics'\"\n (click)=\"changeTab('analytics')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'analytics'\">\n <i class=\"fas fa-chart-line\"></i>\n <span>Analytics</span>\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\" [class.has-savebar]=\"isDirty\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Basic Information -->\n <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Test Information</h3>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <div class=\"info-label\">Name</div>\n <div class=\"info-value\">{{ record.Name }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Type</div>\n <div class=\"info-value\">{{ record.Type || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Status</div>\n <div class=\"info-value\">\n <span class=\"status-badge-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Priority</div>\n <div class=\"info-value\">{{ record.Priority || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Duration</div>\n <div class=\"info-value\">{{ record.EstimatedDurationSeconds ? formatDuration(record.EstimatedDurationSeconds) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Cost</div>\n <div class=\"info-value\">{{ record.EstimatedCostUSD ? formatCost(record.EstimatedCostUSD) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Repeat Count</div>\n <div class=\"info-value\">{{ record.RepeatCount || 1 }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Max Execution Time</div>\n <div class=\"info-value\">{{ formatTimeout(record.MaxExecutionTimeMS) }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Created</div>\n <div class=\"info-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Updated</div>\n <div class=\"info-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n </div>\n </div>\n <!-- JSON Data Views -->\n <div class=\"json-section\">\n <h3><i class=\"fas fa-code\"></i> Test Definition</h3>\n <div class=\"json-tabs\">\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'input'\"\n (click)=\"setJsonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i>\n Input Definition\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'expected'\"\n (click)=\"setJsonView('expected')\">\n <i class=\"fas fa-check-double\"></i>\n Expected Outcomes\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'config'\"\n (click)=\"setJsonView('config')\">\n <i class=\"fas fa-cog\"></i>\n Configuration\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'tags'\"\n (click)=\"setJsonView('tags')\">\n <i class=\"fas fa-tags\"></i>\n Tags\n </button>\n </div>\n <div class=\"code-editor-container\">\n <mj-code-editor\n [value]=\"getJsonData()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Configuration Tab -->\n @if (activeTab === 'config') {\n <div class=\"config-tab\">\n <!-- Details -->\n <section class=\"edit-section\">\n <header class=\"edit-section-header\">\n <h3><i class=\"fas fa-pen-to-square\"></i> Details</h3>\n <p class=\"edit-section-sub\">Edit any field — changes are saved with the bar at the bottom.</p>\n </header>\n <div class=\"edit-grid\">\n <div class=\"edit-field edit-field--full\">\n <label for=\"test-name\">Name <span class=\"required\">*</span></label>\n <input\n id=\"test-name\"\n type=\"text\"\n class=\"config-input\"\n placeholder=\"e.g., Agent Response Quality Test\"\n [(ngModel)]=\"record.Name\"\n />\n </div>\n\n <div class=\"edit-field edit-field--full\">\n <label for=\"test-description\">Description</label>\n <textarea\n id=\"test-description\"\n class=\"config-input config-textarea\"\n rows=\"3\"\n placeholder=\"What does this test evaluate?\"\n [ngModel]=\"record.Description\"\n (ngModelChange)=\"record.Description = $event || null\"\n ></textarea>\n </div>\n\n <div class=\"edit-field\">\n <label for=\"test-status\">Status</label>\n <div class=\"select-wrapper\">\n <select\n id=\"test-status\"\n class=\"config-input\"\n [(ngModel)]=\"record.Status\"\n >\n @for (opt of statusOptions; track opt) {\n <option [ngValue]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"edit-field\">\n <label for=\"test-type\">Test Type</label>\n <select\n id=\"test-type\"\n class=\"config-input\"\n [(ngModel)]=\"record.TypeID\"\n >\n @for (t of testTypeOptions; track t.ID) {\n <option [ngValue]=\"t.ID\">{{ t.Name }}</option>\n }\n </select>\n </div>\n\n <div class=\"edit-field edit-field--full\">\n <label for=\"test-tags\">Tags</label>\n <div class=\"tag-editor\" (click)=\"tagInput.focus()\">\n @for (tag of tags; track tag) {\n <span class=\"tag-chip-editable\">\n {{ tag }}\n <button type=\"button\" class=\"tag-remove\" (click)=\"removeTag(tag); $event.stopPropagation()\" [attr.aria-label]=\"'Remove tag ' + tag\">\n <i class=\"fas fa-times\"></i>\n </button>\n </span>\n }\n <input\n #tagInput\n id=\"test-tags\"\n type=\"text\"\n class=\"tag-input-inline\"\n [placeholder]=\"tags.length === 0 ? 'Add tags, press Enter or comma...' : ''\"\n [(ngModel)]=\"tagDraft\"\n (keydown)=\"onTagInputKeydown($event)\"\n (blur)=\"addTagFromDraft()\"\n />\n </div>\n <span class=\"config-hint\">Press Enter or comma to add a tag. Backspace on empty input removes the last tag.</span>\n </div>\n </div>\n </section>\n\n <!-- Execution Settings -->\n <section class=\"edit-section\">\n <header class=\"edit-section-header\">\n <h3><i class=\"fas fa-cogs\"></i> Execution Settings</h3>\n </header>\n <div class=\"edit-grid\">\n <div class=\"edit-field\">\n <label for=\"test-priority\">Priority</label>\n <input\n id=\"test-priority\"\n type=\"number\"\n class=\"config-input\"\n placeholder=\"0 (lower runs first)\"\n [ngModel]=\"record.Priority\"\n (ngModelChange)=\"record.Priority = $event === '' || $event === null ? null : +$event\"\n />\n <span class=\"config-hint\">Lower numbers run first.</span>\n </div>\n <div class=\"edit-field\">\n <label for=\"test-repeat\">Repeat Count</label>\n <input\n id=\"test-repeat\"\n type=\"number\"\n class=\"config-input\"\n min=\"1\"\n placeholder=\"1\"\n [ngModel]=\"record.RepeatCount\"\n (ngModelChange)=\"record.RepeatCount = $event === '' || $event === null ? null : +$event\"\n />\n <span class=\"config-hint\">Number of times to repeat for statistical analysis.</span>\n </div>\n <div class=\"edit-field\">\n <label for=\"test-duration\">Estimated Duration (seconds)</label>\n <input\n id=\"test-duration\"\n type=\"number\"\n class=\"config-input\"\n placeholder=\"0\"\n [ngModel]=\"record.EstimatedDurationSeconds\"\n (ngModelChange)=\"record.EstimatedDurationSeconds = $event === '' || $event === null ? null : +$event\"\n />\n </div>\n <div class=\"edit-field\">\n <label for=\"test-cost\">Estimated Cost (USD)</label>\n <input\n id=\"test-cost\"\n type=\"number\"\n step=\"0.000001\"\n class=\"config-input\"\n placeholder=\"0.00\"\n [ngModel]=\"record.EstimatedCostUSD\"\n (ngModelChange)=\"record.EstimatedCostUSD = $event === '' || $event === null ? null : +$event\"\n />\n </div>\n <div class=\"edit-field edit-field--full\">\n <label for=\"test-timeout\">Max Execution Time (ms)</label>\n <input\n id=\"test-timeout\"\n type=\"number\"\n class=\"config-input\"\n placeholder=\"Default: 300000 (5 min)\"\n [ngModel]=\"record.MaxExecutionTimeMS\"\n (ngModelChange)=\"record.MaxExecutionTimeMS = $event === '' || $event === null ? null : +$event\"\n />\n <span class=\"config-hint\">Leave empty for the default 5 minute timeout. Currently: {{ formatTimeout(record.MaxExecutionTimeMS) }}</span>\n </div>\n </div>\n </section>\n\n <!-- JSON editors (preserved from original layout) -->\n <div class=\"config-section\">\n <h3><i class=\"fas fa-sign-in-alt\"></i> Input Definition (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.InputDefinition || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.InputDefinition = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-check-double\"></i> Expected Outcomes (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.ExpectedOutcomes || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.ExpectedOutcomes = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cog\"></i> Configuration (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.Configuration || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Configuration = $event\">\n </mj-code-editor>\n </div>\n </div>\n\n <!-- Metadata (read-only) -->\n <section class=\"meta-section\">\n <div class=\"meta-grid\">\n <div class=\"meta-item\">\n <div class=\"meta-label\">Created</div>\n <div class=\"meta-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"meta-item\">\n <div class=\"meta-label\">Last updated</div>\n <div class=\"meta-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n <div class=\"meta-item\">\n <div class=\"meta-label\">Test ID</div>\n <div class=\"meta-value meta-mono\">{{ record.ID }}</div>\n </div>\n </div>\n </section>\n </div>\n }\n\n <!-- Test Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Loading State -->\n @if (loadingRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3,4,5]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Runs List -->\n @if (!loadingRuns && testRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of testRuns; track run) {\n <div class=\"run-item\" (click)=\"openTestRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-stopwatch]=\"run.Status === 'Timeout'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header\">\n <span class=\"run-id\">Run #{{ run.ID.substring(0, 8) }}</span>\n <span class=\"run-status\" [style.color]=\"getRunStatusColor(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-meta\">\n <span><i class=\"fas fa-calendar\"></i> {{ getRelativeTime(run.StartedAt) }}</span>\n @if (run.DurationSeconds) {\n <span><i class=\"fas fa-clock\"></i> {{ formatDuration(run.DurationSeconds) }}</span>\n }\n @if (run.CostUSD) {\n <span><i class=\"fas fa-dollar-sign\"></i> {{ formatCost(run.CostUSD) }}</span>\n }\n @if (run.TargetLogEntityID && run.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"run.TargetLogEntity\"\n [recordId]=\"run.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n <!-- Evaluation indicators -->\n <div class=\"run-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-pill status-pill\"\n [ngClass]=\"'status-' + run.Status.toLowerCase()\"\n [title]=\"getStatusTooltip(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-hourglass-end]=\"run.Status === 'Timeout'\"\n [class.fa-forward]=\"run.Status === 'Skipped'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n <span>{{ run.Status }}</span>\n </span>\n }\n <!-- Human feedback indicator -->\n @if (evalPreferences.showHuman) {\n @if (!getFeedbackForRun(run.ID)?.Rating) {\n <span class=\"eval-pill human-pill no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (getFeedbackForRun(run.ID)?.Rating; as rating) {\n <span class=\"eval-pill human-pill has-feedback\"\n [class.rating-low]=\"rating <= 4\"\n [class.rating-medium]=\"rating >= 5 && rating <= 6\"\n [class.rating-good]=\"rating >= 7 && rating <= 8\"\n [class.rating-excellent]=\"rating >= 9\"\n [title]=\"getHumanTooltip(rating, getFeedbackForRun(run.ID)?.CorrectionSummary || getFeedbackForRun(run.ID)?.Comments || null)\">\n <i class=\"fas fa-user\"></i>\n <span>{{ rating }}</span>\n </span>\n }\n }\n <!-- Auto score indicator -->\n @if (evalPreferences.showAuto) {\n @if (run.Score == null) {\n <span class=\"eval-pill auto-pill no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n @if (run.Score != null) {\n <span class=\"eval-pill auto-pill has-score\"\n [class.score-low]=\"run.Score < 0.5\"\n [class.score-medium]=\"run.Score >= 0.5 && run.Score < 0.7\"\n [class.score-good]=\"run.Score >= 0.7 && run.Score < 0.85\"\n [class.score-excellent]=\"run.Score >= 0.85\"\n [title]=\"'Auto Score: ' + (run.Score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ (run.Score * 100).toFixed(0) }}%</span>\n </span>\n }\n }\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run).slice(0, 3); track tag) {\n <span class=\"run-tag\">{{ tag }}</span>\n }\n @if (getRunTags(run).length > 3) {\n <span class=\"run-tag-more\">+{{ getRunTags(run).length - 3 }}</span>\n }\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testRunsLoaded && !loadingRuns && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <h4>No Test Runs Yet</h4>\n <p>Run this test to see execution history and results here.</p>\n <button mjButton (click)=\"runTest()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Test Suites Tab -->\n @if (activeTab === 'suites') {\n <div class=\"suites-tab\">\n <!-- Loading State -->\n @if (loadingSuites) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Suites List -->\n @if (!loadingSuites && suiteTests.length > 0) {\n <div class=\"suites-list\">\n @for (suiteTest of suiteTests; track suiteTest) {\n <div class=\"suite-item\" (click)=\"openTestSuite(suiteTest.SuiteID)\">\n <div class=\"suite-icon\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-content\">\n <div class=\"suite-name\">{{ suiteTest.Suite }}</div>\n <div class=\"suite-meta\">\n <span><i class=\"fas fa-sort-numeric-up\"></i> Sequence: {{ suiteTest.Sequence }}</span>\n @if (suiteTest.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ suiteTest.Status }}</span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (suiteTestsLoaded && !loadingSuites && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-folder-open\"></i>\n </div>\n <h4>Not Part of Any Suite</h4>\n <p>This test is not included in any test suites. Add it to a suite to run it with other tests.</p>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"history-tab\">\n <!-- Loading State -->\n @if (loadingHistory) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading history...\"></mj-loading>\n </div>\n }\n <!-- History Content -->\n @if (!loadingHistory && historyLoaded) {\n <div class=\"history-content\">\n <!-- Filters -->\n <div class=\"history-filters\">\n <div class=\"time-range-filters\">\n <span class=\"filter-label\">Time Range:</span>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '7d'\"\n (click)=\"setHistoryTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '30d'\"\n (click)=\"setHistoryTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '90d'\"\n (click)=\"setHistoryTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === 'all'\"\n (click)=\"setHistoryTimeRange('all')\">All Time</button>\n </div>\n <div class=\"history-actions\">\n <button mjButton (click)=\"exportHistoryToCSV()\" [disabled]=\"historyData.length === 0\">\n <i class=\"fas fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- KPI Cards -->\n @if (historyData.length > 0) {\n <div class=\"history-kpi-cards\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getTotalRuns() }}</div>\n <div class=\"kpi-label\">Total Runs</div>\n </div>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon pass-rate\">\n <i class=\"fas fa-percentage\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">\n {{ getOverallPassRate().toFixed(1) }}%\n <i class=\"fas trend-icon\"\n [class.fa-arrow-up]=\"getPassRateTrend() === 'up'\"\n [class.fa-arrow-down]=\"getPassRateTrend() === 'down'\"\n [class.fa-minus]=\"getPassRateTrend() === 'stable'\"\n [class.trend-up]=\"getPassRateTrend() === 'up'\"\n [class.trend-down]=\"getPassRateTrend() === 'down'\"></i>\n </div>\n <div class=\"kpi-label\">Pass Rate</div>\n </div>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ (getOverallAvgScore() * 100).toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Score</div>\n </div>\n </div>\n }\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getOverallAvgDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getOverallAvgCost()) }}</div>\n <div class=\"kpi-label\">Avg Cost</div>\n </div>\n </div>\n </div>\n }\n <!-- Daily History Table -->\n @if (historyData.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-calendar-alt\"></i> Daily Performance</h3>\n <div class=\"history-table-container\">\n <table class=\"history-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Runs</th>\n @if (evalPreferences.showExecution) {\n <th>Passed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Failed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Pass Rate</th>\n }\n @if (evalPreferences.showAuto) {\n <th>Avg Score</th>\n }\n <th>Avg Duration</th>\n <th>Avg Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (day of historyData; track day) {\n <tr>\n <td class=\"date-cell\">{{ day.date | date:'mediumDate' }}</td>\n <td class=\"runs-cell\">{{ day.runCount }}</td>\n @if (evalPreferences.showExecution) {\n <td class=\"passed-cell\">{{ day.passCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"failed-cell\">{{ day.failCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\">\n <div class=\"pass-rate-fill\" [style.width.%]=\"day.passRate\"></div>\n <span class=\"pass-rate-text\">{{ day.passRate.toFixed(1) }}%</span>\n </div>\n </td>\n }\n @if (evalPreferences.showAuto) {\n <td class=\"score-cell\">{{ (day.avgScore * 100).toFixed(1) }}%</td>\n }\n <td class=\"duration-cell\">{{ formatDuration(day.avgDuration) }}</td>\n <td class=\"cost-cell\">{{ formatCost(day.avgCost) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n <!-- Suite Performance -->\n @if (suitePerformance.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-layer-group\"></i> Performance by Suite</h3>\n <div class=\"suite-performance-list\">\n @for (suite of suitePerformance; track suite) {\n <div class=\"suite-perf-card\" (click)=\"openSuiteFromHistory(suite.suiteId)\">\n <div class=\"suite-perf-header\">\n <div class=\"suite-perf-name\">{{ suite.suiteName }}</div>\n @if (suite.tags.length > 0) {\n <div class=\"suite-perf-tags\">\n @for (tag of suite.tags.slice(0, 3); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n @if (suite.tags.length > 3) {\n <span class=\"tag-more\">+{{ suite.tags.length - 3 }}</span>\n }\n </div>\n }\n </div>\n <div class=\"suite-perf-stats\">\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ suite.totalRuns }}</span>\n <span class=\"stat-label\">Runs</span>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"suite-stat\">\n <span class=\"stat-value pass-rate\" [class.high]=\"suite.passRate >= 80\" [class.low]=\"suite.passRate < 50\">\n {{ suite.passRate.toFixed(1) }}%\n </span>\n <span class=\"stat-label\">Pass Rate</span>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ (suite.avgScore * 100).toFixed(1) }}%</span>\n <span class=\"stat-label\">Avg Score</span>\n </div>\n }\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatDuration(suite.avgDuration) }}</span>\n <span class=\"stat-label\">Avg Duration</span>\n </div>\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatCost(suite.avgCost) }}</span>\n <span class=\"stat-label\">Avg Cost</span>\n </div>\n @if (suite.lastRun) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ getRelativeTime(suite.lastRun) }}</span>\n <span class=\"stat-label\">Last Run</span>\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right suite-perf-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (historyData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-line\"></i>\n </div>\n <h4>No History Available</h4>\n <p>Run this test to start building history and analytics data.</p>\n <button mjButton (click)=\"runTest()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Toggle Button -->\n <button class=\"shortcuts-toggle\" (click)=\"toggleShortcuts()\" [title]=\"showShortcuts ? 'Hide keyboard shortcuts' : 'Show keyboard shortcuts'\">\n <i class=\"fas fa-keyboard\"></i>\n </button>\n\n <!-- Keyboard Shortcuts Hint (Desktop Only) -->\n @if (showShortcuts) {\n <div class=\"keyboard-shortcuts\">\n <div class=\"shortcuts-header\">\n <i class=\"fas fa-keyboard\"></i>\n Shortcuts\n <button class=\"shortcuts-close\" (click)=\"toggleShortcuts()\" title=\"Hide shortcuts\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcut-list\">\n <div class=\"shortcut-item\">\n <span>Save changes</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>S</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Refresh</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>R</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Run Test</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Enter</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Switch Tabs</span>\n <span class=\"shortcut-keys\"><kbd>1</kbd>-<kbd>5</kbd></span>\n </div>\n </div>\n </div>\n }\n\n <!-- Slide Panel for Test Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.testId ? 'Test Execution' : 'Run Test'\"\n [Resizable]=\"true\"\n (Closed)=\"OnPanelClosed()\">\n <app-test-run-dialog\n [PanelMode]=\"true\"\n [selectedTestId]=\"testingDialogService.PanelOptions?.testId ?? null\"\n [selectedSuiteId]=\"testingDialogService.PanelOptions?.suiteId ?? null\"\n [runMode]=\"testingDialogService.PanelOptions?.mode ?? 'test'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n\n <!-- Sticky Save Bar — always in the DOM so CSS transitions can fire reliably.\n Visibility is controlled by the .save-bar--visible class, driven by isDirty. -->\n <div\n class=\"save-bar\"\n [class.save-bar--visible]=\"isDirty\"\n [attr.aria-hidden]=\"!isDirty\"\n role=\"region\"\n aria-label=\"Unsaved changes\"\n >\n <div class=\"save-bar-message\">\n <span class=\"save-bar-dot\" aria-hidden=\"true\">●</span>\n <span class=\"save-bar-text\">\n <strong>Unsaved changes</strong>\n <span class=\"save-bar-fields\">\n @if (dirtyFieldNames.length === 1) {\n {{ dirtyFieldNames[0] }} edited\n } @else if (dirtyFieldNames.length > 1) {\n {{ dirtyFieldNames.length }} fields edited\n }\n </span>\n </span>\n </div>\n <div class=\"save-bar-actions\">\n <button\n type=\"button\"\n class=\"save-bar-btn save-bar-btn--primary\"\n (click)=\"saveChanges()\"\n [disabled]=\"isSaving || !isDirty\"\n [attr.tabindex]=\"isDirty ? 0 : -1\"\n title=\"Save changes (⌘S)\"\n >\n @if (isSaving) {\n <i class=\"fas fa-spinner fa-spin\"></i> Saving…\n } @else {\n <i class=\"fas fa-check\"></i> Save changes\n <span class=\"save-bar-kbd\"><kbd>⌘</kbd><kbd>S</kbd></span>\n }\n </button>\n <button\n type=\"button\"\n class=\"save-bar-btn save-bar-btn--ghost\"\n (click)=\"discardChanges()\"\n [disabled]=\"isSaving || !isDirty\"\n [attr.tabindex]=\"isDirty ? 0 : -1\"\n title=\"Discard changes\"\n >\n <i class=\"fas fa-undo\"></i> Discard\n </button>\n </div>\n </div>\n</div>\n"]}