@memberjunction/ng-core-entity-forms 5.24.0 → 5.26.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 (88) hide show
  1. package/dist/lib/custom/Entities/entity-form.component.js +177 -152
  2. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  3. package/dist/lib/custom/Tests/test-form.component.d.ts +3 -2
  4. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  5. package/dist/lib/custom/Tests/test-form.component.js +260 -233
  6. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  7. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +3 -2
  8. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  9. package/dist/lib/custom/Tests/test-suite-form.component.js +358 -331
  10. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  11. package/dist/lib/custom/custom-forms.module.d.ts +2 -1
  12. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  13. package/dist/lib/custom/custom-forms.module.js +7 -3
  14. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  15. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  16. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +127 -119
  17. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  18. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts.map +1 -1
  19. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js +22 -14
  20. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js.map +1 -1
  21. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.d.ts.map +1 -1
  22. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js +17 -9
  23. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js.map +1 -1
  24. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.d.ts.map +1 -1
  25. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js +26 -8
  26. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js.map +1 -1
  27. package/dist/lib/generated/Entities/MJApplicationRole/mjapplicationrole.form.component.d.ts +10 -0
  28. package/dist/lib/generated/Entities/MJApplicationRole/mjapplicationrole.form.component.d.ts.map +1 -0
  29. package/dist/lib/generated/Entities/MJApplicationRole/mjapplicationrole.form.component.js +65 -0
  30. package/dist/lib/generated/Entities/MJApplicationRole/mjapplicationrole.form.component.js.map +1 -0
  31. package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js +39 -37
  32. package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js.map +1 -1
  33. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.d.ts.map +1 -1
  34. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js +43 -27
  35. package/dist/lib/generated/Entities/MJArtifactVersion/mjartifactversion.form.component.js.map +1 -1
  36. package/dist/lib/generated/Entities/MJCountry/mjcountry.form.component.d.ts +10 -0
  37. package/dist/lib/generated/Entities/MJCountry/mjcountry.form.component.d.ts.map +1 -0
  38. package/dist/lib/generated/Entities/MJCountry/mjcountry.form.component.js +109 -0
  39. package/dist/lib/generated/Entities/MJCountry/mjcountry.form.component.js.map +1 -0
  40. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  41. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +54 -18
  42. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  43. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  44. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +335 -297
  45. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  46. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
  47. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +26 -24
  48. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
  49. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
  50. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +25 -7
  51. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
  52. package/dist/lib/generated/Entities/MJFileStorageAccount/mjfilestorageaccount.form.component.d.ts.map +1 -1
  53. package/dist/lib/generated/Entities/MJFileStorageAccount/mjfilestorageaccount.form.component.js +84 -10
  54. package/dist/lib/generated/Entities/MJFileStorageAccount/mjfilestorageaccount.form.component.js.map +1 -1
  55. package/dist/lib/generated/Entities/MJFileStorageAccountPermission/mjfilestorageaccountpermission.form.component.d.ts +10 -0
  56. package/dist/lib/generated/Entities/MJFileStorageAccountPermission/mjfilestorageaccountpermission.form.component.d.ts.map +1 -0
  57. package/dist/lib/generated/Entities/MJFileStorageAccountPermission/mjfilestorageaccountpermission.form.component.js +69 -0
  58. package/dist/lib/generated/Entities/MJFileStorageAccountPermission/mjfilestorageaccountpermission.form.component.js.map +1 -0
  59. package/dist/lib/generated/Entities/MJInstanceConfiguration/mjinstanceconfiguration.form.component.d.ts +10 -0
  60. package/dist/lib/generated/Entities/MJInstanceConfiguration/mjinstanceconfiguration.form.component.d.ts.map +1 -0
  61. package/dist/lib/generated/Entities/MJInstanceConfiguration/mjinstanceconfiguration.form.component.js +71 -0
  62. package/dist/lib/generated/Entities/MJInstanceConfiguration/mjinstanceconfiguration.form.component.js.map +1 -0
  63. package/dist/lib/generated/Entities/MJRecordGeoCode/mjrecordgeocode.form.component.d.ts +10 -0
  64. package/dist/lib/generated/Entities/MJRecordGeoCode/mjrecordgeocode.form.component.d.ts.map +1 -0
  65. package/dist/lib/generated/Entities/MJRecordGeoCode/mjrecordgeocode.form.component.js +91 -0
  66. package/dist/lib/generated/Entities/MJRecordGeoCode/mjrecordgeocode.form.component.js.map +1 -0
  67. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
  68. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +48 -12
  69. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
  70. package/dist/lib/generated/Entities/MJSearchProvider/mjsearchprovider.form.component.d.ts +10 -0
  71. package/dist/lib/generated/Entities/MJSearchProvider/mjsearchprovider.form.component.d.ts.map +1 -0
  72. package/dist/lib/generated/Entities/MJSearchProvider/mjsearchprovider.form.component.js +87 -0
  73. package/dist/lib/generated/Entities/MJSearchProvider/mjsearchprovider.form.component.js.map +1 -0
  74. package/dist/lib/generated/Entities/MJStateProvince/mjstateprovince.form.component.d.ts +10 -0
  75. package/dist/lib/generated/Entities/MJStateProvince/mjstateprovince.form.component.d.ts.map +1 -0
  76. package/dist/lib/generated/Entities/MJStateProvince/mjstateprovince.form.component.js +91 -0
  77. package/dist/lib/generated/Entities/MJStateProvince/mjstateprovince.form.component.js.map +1 -0
  78. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  79. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +130 -112
  80. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  81. package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.form.component.d.ts.map +1 -1
  82. package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.form.component.js +22 -14
  83. package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.form.component.js.map +1 -1
  84. package/dist/lib/generated/generated-forms.module.d.ts +254 -242
  85. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  86. package/dist/lib/generated/generated-forms.module.js +167 -116
  87. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  88. package/package.json +36 -33
@@ -1 +1 @@
1
- {"version":3,"file":"test-suite-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-suite-form.component.ts","../../../../src/lib/custom/Tests/test-suite-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, AfterViewInit, ViewChild, ViewContainerRef, ElementRef, inject } from '@angular/core';\nimport * as d3 from 'd3';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestSuiteEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJTestRunEntity, MJTestRunFeedbackEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestSuiteFormComponent } from '../../generated/Entities/MJTestSuite/mjtestsuite.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n TestRunComparison,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\n@RegisterClass(BaseFormComponent, 'MJ: Test Suites')\n@Component({\n standalone: false,\n selector: 'mj-test-suite-form',\n templateUrl: './test-suite-form.component.html',\n styleUrls: ['./test-suite-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestSuiteFormComponentExtended extends MJTestSuiteFormComponent implements OnInit, OnDestroy, AfterViewInit {\n public override record!: MJTestSuiteEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingTests = false;\n loadingRuns = false;\n loadingAnalytics = false;\n loadingCompare = false;\n testsLoaded = false;\n runsLoaded = false;\n analyticsLoaded = false;\n isRefreshing = false;\n error: string | null = null;\n\n // Related data\n suiteTests: MJTestSuiteTestEntity[] = [];\n suiteRuns: MJTestSuiteRunEntity[] = [];\n\n // Analytics data\n analyticsData: AnalyticsDataPoint[] = [];\n uniqueTags: string[] = [];\n selectedTags: string[] = []; // Multi-select: empty array means \"All Tags\"\n analyticsTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n analyticsView: 'summary' | 'matrix' | 'chart' = 'summary';\n matrixData: MatrixDataPoint[] = [];\n loadingMatrix = false;\n matrixLoaded = false;\n\n // Chart\n @ViewChild('chartContainer') chartContainer!: ElementRef<HTMLDivElement>;\n private chartRendered = false;\n\n // Compare data\n compareRunA: MJTestSuiteRunEntity | null = null;\n compareRunB: MJTestSuiteRunEntity | null = null;\n compareResults: TestRunComparison[] = [];\n compareRunATests: MJTestRunEntity[] = [];\n compareRunBTests: MJTestRunEntity[] = [];\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private metadata = new Metadata();\n\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\n\n // Filter collapse state\n filtersCollapsed = false;\n\n // Matrix sorting\n matrixSortBy: 'sequence' | 'name' = 'sequence';\n matrixSortAsc = true;\n\n // Matrix row selection\n selectedMatrixTestId: string | null = null;\n\n // Matrix test name filter\n matrixTestFilter = '';\n private matrixFilterSubject$ = new Subject<string>();\n\n // Service injections\n private navigationService = inject(NavigationService);\n private 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 // Re-render chart when preferences change (D3 chart needs manual update)\n if (this.chartRendered && this.analyticsView === 'chart') {\n this.renderChart();\n }\n });\n\n // Subscribe to matrix filter with debounce\n this.matrixFilterSubject$\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(value => {\n this.matrixTestFilter = value;\n this.cdr.markForCheck();\n });\n }\n\n ngAfterViewInit() {\n // Initialize any view-dependent logic\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 suite\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runSuite();\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('tests'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('analytics'); break;\n case '5': this.changeTab('compare'); break;\n }\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n if (tab === 'tests' && !this.testsLoaded) this.loadTests();\n if (tab === 'runs' && !this.runsLoaded) this.loadRuns();\n if (tab === 'analytics' && !this.analyticsLoaded) this.loadAnalytics();\n this.cdr.markForCheck();\n }\n\n private async loadTests() {\n if (this.testsLoaded) return;\n\n this.loadingTests = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteTests = result.Results || [];\n this.testsLoaded = true;\n } catch (error) {\n console.error('Error loading tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load tests', 'error', 3000);\n } finally {\n this.loadingTests = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadRuns() {\n if (this.runsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteRuns = result.Results || [];\n this.runsLoaded = true;\n } catch (error) {\n console.error('Error loading runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\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 getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Completed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n case 'Cancelled': return '#6b7280';\n default: return '#9ca3af';\n }\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 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 getPassRate(run: MJTestSuiteRunEntity): number {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\n }\n\n openTest(testId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(testId));\n }\n\n openSuiteRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suite Runs', CompositeKey.FromID(runId));\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 runSuite() {\n if (this.record?.ID) {\n this.testingDialogService.OpenSuitePanel(this.record.ID);\n }\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\n // Reset lazy-loaded data\n if (this.testsLoaded) {\n this.testsLoaded = false;\n this.suiteTests = [];\n await this.loadTests();\n }\n if (this.runsLoaded) {\n this.runsLoaded = false;\n this.suiteRuns = [];\n await this.loadRuns();\n }\n if (this.analyticsLoaded) {\n this.analyticsLoaded = false;\n this.analyticsData = [];\n // Also reset matrix data so it reloads with fresh data\n this.matrixLoaded = false;\n this.matrixData = [];\n await this.loadAnalytics();\n // Reload matrix if currently viewing matrix or chart view\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n await this.loadMatrixData();\n }\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 // ==========================================\n // Analytics Tab Methods\n // ==========================================\n\n private async loadAnalytics() {\n if (this.analyticsLoaded) return;\n\n this.loadingAnalytics = true;\n this.cdr.markForCheck();\n\n try {\n // Load all runs for analytics (not just recent 50)\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 200,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n // Process runs into analytics data points\n this.analyticsData = result.Results.map(run => this.runToDataPoint(run));\n\n // Extract unique tags\n this.uniqueTags = TagsHelper.getUniqueTags(result.Results.map(r => r.Tags));\n\n // Also populate suiteRuns if not already loaded\n if (!this.runsLoaded) {\n this.suiteRuns = result.Results.slice(0, 50);\n this.runsLoaded = true;\n }\n }\n\n this.analyticsLoaded = true;\n } catch (error) {\n console.error('Error loading analytics:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load analytics data', 'error', 3000);\n } finally {\n this.loadingAnalytics = false;\n this.cdr.markForCheck();\n }\n }\n\n private runToDataPoint(run: MJTestSuiteRunEntity): AnalyticsDataPoint {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n return {\n runId: run.ID,\n date: run.StartedAt ? new Date(run.StartedAt) : new Date(),\n passRate: total > 0 ? (passed / total) * 100 : 0,\n totalTests: total,\n passedTests: passed,\n failedTests: run.FailedTests || 0,\n errorTests: run.ErrorTests || 0,\n skippedTests: run.SkippedTests || 0,\n duration: run.TotalDurationSeconds || 0,\n cost: run.TotalCostUSD || 0,\n tags: TagsHelper.parseTags(run.Tags),\n status: run.Status || 'Unknown'\n };\n }\n\n getFilteredAnalyticsData(): AnalyticsDataPoint[] {\n let data = this.analyticsData;\n\n // Apply time range filter\n const now = new Date();\n let cutoffDate: Date | null = null;\n\n switch (this.analyticsTimeRange) {\n case '7d':\n cutoffDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoffDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoffDate = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n }\n\n if (cutoffDate) {\n data = data.filter(d => d.date >= cutoffDate!);\n }\n\n // Apply tag filter (multi-select: empty array means all tags)\n if (this.selectedTags.length > 0) {\n data = data.filter(d => this.selectedTags.some(tag => d.tags.includes(tag)));\n }\n\n return data;\n }\n\n setTimeRange(range: '7d' | '30d' | '90d' | 'all') {\n this.analyticsTimeRange = range;\n // Reload matrix data when time range changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Toggle a tag in the multi-select filter.\n * If tag is null, clear all selections (show all tags).\n */\n toggleTagFilter(tag: string | null) {\n if (tag === null) {\n // Clear all - show all tags\n this.selectedTags = [];\n } else {\n // Toggle the tag\n const index = this.selectedTags.indexOf(tag);\n if (index >= 0) {\n this.selectedTags = this.selectedTags.filter(t => t !== tag);\n } else {\n this.selectedTags = [...this.selectedTags, tag];\n }\n }\n // Reload matrix data when tag filter changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Check if a tag is currently selected in the filter\n */\n isTagSelected(tag: string): boolean {\n return this.selectedTags.includes(tag);\n }\n\n setAnalyticsView(view: 'summary' | 'matrix' | 'chart') {\n this.analyticsView = view;\n if ((view === 'matrix' || view === 'chart') && !this.matrixLoaded) {\n this.loadMatrixData();\n }\n // Render chart when switching to chart view\n if (view === 'chart' && this.matrixLoaded) {\n setTimeout(() => this.renderChart(), 100);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Force reload of matrix data (used when filters change)\n */\n private reloadMatrixData() {\n this.matrixLoaded = false;\n this.loadMatrixData();\n }\n\n private async loadMatrixData() {\n if (this.loadingMatrix) return;\n this.loadingMatrix = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const filteredRuns = this.getFilteredAnalyticsData();\n\n // Load test runs for each suite run (limit to most recent 10 for performance)\n const runsToLoad = filteredRuns.slice(0, 10);\n\n const matrixData: MatrixDataPoint[] = [];\n\n // Collect all test run IDs to batch load feedbacks\n const allTestRunIds: string[] = [];\n\n for (const runData of runsToLoad) {\n const testRunsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${runData.runId}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (testRunsResult.Success && testRunsResult.Results) {\n const testResults = new Map<string, TestResultCell>();\n\n for (const testRun of testRunsResult.Results) {\n allTestRunIds.push(testRun.ID);\n testResults.set(testRun.TestID, {\n testRunId: testRun.ID,\n testId: testRun.TestID,\n testName: testRun.Test || 'Unknown',\n status: testRun.Status,\n score: testRun.Score,\n duration: testRun.DurationSeconds,\n humanRating: null, // Will be populated below\n humanComments: null, // Will be populated below\n sequence: testRun.Sequence ?? 0\n });\n }\n\n matrixData.push({\n runId: runData.runId,\n date: runData.date,\n tags: runData.tags,\n status: runData.status,\n passRate: runData.passRate,\n testResults\n });\n }\n }\n\n // Batch load feedbacks for all test runs\n if (allTestRunIds.length > 0) {\n const feedbackMap = await this.loadFeedbacksForTestRuns(allTestRunIds);\n\n // Apply feedbacks to matrix data\n for (const run of matrixData) {\n run.testResults.forEach((cell, _testId) => {\n const feedback = feedbackMap.get(cell.testRunId);\n if (feedback) {\n if (feedback.Rating != null) {\n cell.humanRating = feedback.Rating;\n }\n // Use CorrectionSummary if available (from inline feedback), fallback to Comments\n const commentText = feedback.CorrectionSummary || feedback.Comments;\n if (commentText) {\n cell.humanComments = commentText;\n }\n }\n });\n }\n }\n\n this.matrixData = matrixData;\n this.matrixLoaded = true;\n\n // Render chart if currently on chart view\n if (this.analyticsView === 'chart') {\n setTimeout(() => this.renderChart(), 100);\n }\n } catch (error) {\n console.error('Error loading matrix data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load matrix data', 'error', 3000);\n } finally {\n this.loadingMatrix = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n * Returns a map of testRunId -> MJTestRunFeedbackEntity\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<Map<string, MJTestRunFeedbackEntity>> {\n const feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n if (testRunIds.length === 0) return feedbackMap;\n\n try {\n const rv = new RunView();\n // Build IN clause for the IDs (batch in chunks to avoid query size limits)\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 // If multiple feedbacks exist for same test run, keep the most recent (last one)\n feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n\n return feedbackMap;\n }\n\n getUniqueTestsFromMatrix(): { testId: string; testName: string; sequence: number }[] {\n const testsMap = new Map<string, { testName: string; sequence: number }>();\n\n for (const runData of this.matrixData) {\n for (const [testId, testResult] of runData.testResults) {\n if (!testsMap.has(testId)) {\n testsMap.set(testId, { testName: testResult.testName, sequence: testResult.sequence });\n }\n }\n }\n\n let tests = Array.from(testsMap.entries()).map(([testId, data]) => ({\n testId,\n testName: data.testName,\n sequence: data.sequence\n }));\n\n // Apply test name filter if set\n if (this.matrixTestFilter.trim()) {\n const filterLower = this.matrixTestFilter.toLowerCase().trim();\n tests = tests.filter(t => t.testName.toLowerCase().includes(filterLower));\n }\n\n // Apply sorting\n if (this.matrixSortBy === 'sequence') {\n tests = tests.sort((a, b) => this.matrixSortAsc ? a.sequence - b.sequence : b.sequence - a.sequence);\n } else {\n tests = tests.sort((a, b) => {\n const cmp = a.testName.localeCompare(b.testName);\n return this.matrixSortAsc ? cmp : -cmp;\n });\n }\n\n return tests;\n }\n\n /**\n * Toggle matrix sort column\n */\n toggleMatrixSort(column: 'sequence' | 'name') {\n if (this.matrixSortBy === column) {\n this.matrixSortAsc = !this.matrixSortAsc;\n } else {\n this.matrixSortBy = column;\n this.matrixSortAsc = true;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Select/deselect a matrix row for highlighting\n */\n selectMatrixRow(testId: string): void {\n this.selectedMatrixTestId = this.selectedMatrixTestId === testId ? null : testId;\n this.cdr.markForCheck();\n }\n\n /**\n * Handle test name filter input - uses Subject for debounce\n */\n onMatrixFilterInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.matrixFilterSubject$.next(value);\n }\n\n /**\n * Clear the matrix test name filter\n */\n clearMatrixFilter(): void {\n this.matrixTestFilter = '';\n this.matrixFilterSubject$.next('');\n this.cdr.markForCheck();\n }\n\n getTestResultForRun(runId: string, testId: string): TestResultCell | null {\n const runData = this.matrixData.find(r => r.runId === runId);\n if (!runData) return null;\n return runData.testResults.get(testId) || null;\n }\n\n getMatrixCellClass(result: TestResultCell | null): string {\n if (!result) return 'cell-none cell-not-run';\n switch (result.status) {\n case 'Passed': return 'cell-passed';\n case 'Failed': return 'cell-failed';\n case 'Error': return 'cell-error';\n case 'Timeout': return 'cell-timeout';\n case 'Skipped': return 'cell-skipped cell-not-run';\n case 'Running': return 'cell-running';\n default: return 'cell-pending';\n }\n }\n\n /**\n * Get descriptive tooltip for execution status\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 /**\n * Get the count of enabled evaluation types for matrix cell layout\n */\n getEvalCount(): number {\n let count = 0;\n if (this.evalPreferences.showExecution) count++;\n if (this.evalPreferences.showHuman) count++;\n if (this.evalPreferences.showAuto) count++;\n return count;\n }\n\n // ===========================\n // Matrix Totals Row Methods\n // ===========================\n\n /**\n * Get count of passed tests for a run\n */\n getRunPassedCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.status === 'Passed') count++;\n });\n return count;\n }\n\n /**\n * Get total count of tests for a run\n */\n getRunTotalCount(run: MatrixDataPoint): number {\n return run.testResults.size;\n }\n\n /**\n * Get average human rating for a run (only from tests that have ratings)\n */\n getRunHumanAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) {\n sum += result.humanRating;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with human ratings for a run\n */\n getRunHumanCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) count++;\n });\n return count;\n }\n\n /**\n * Get average auto score for a run (only from tests that have scores)\n */\n getRunAutoAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) {\n sum += result.score;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with auto scores for a run\n */\n getRunAutoCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) count++;\n });\n return count;\n }\n\n /**\n * Navigate to a test run when clicking a matrix cell\n */\n openTestRun(testRunId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(testRunId));\n }\n\n /**\n * Handle matrix cell click - navigate to the test run\n */\n onMatrixCellClick(result: TestResultCell | null, event: Event): void {\n event.stopPropagation(); // Prevent row click from also firing\n if (result?.testRunId) {\n this.openTestRun(result.testRunId);\n }\n }\n\n // ===========================\n // D3 Chart Rendering\n // ===========================\n\n /**\n * Renders an interactive heatmap-style chart showing test results across runs\n * with trend lines and better visual hierarchy\n */\n private renderChart(): void {\n if (!this.chartContainer?.nativeElement || this.matrixData.length === 0) {\n return;\n }\n\n const container = this.chartContainer.nativeElement;\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Dynamic sizing based on content and evaluation preferences\n const width = container.clientWidth || 900;\n const evalCount = this.getEvalCount();\n // Adjust row height and column width based on how many eval types are shown\n const rowHeight = evalCount >= 3 ? 34 : evalCount === 2 ? 30 : 28;\n const minColWidth = evalCount >= 3 ? 65 : evalCount === 2 ? 55 : 50;\n const colWidth = Math.min(90, Math.max(minColWidth, (width - 250) / runs.length));\n const margin = { top: 80, right: 40, bottom: 20, left: 220 };\n const chartWidth = runs.length * colWidth;\n const chartHeight = tests.length * rowHeight;\n const height = chartHeight + margin.top + margin.bottom;\n\n // Update container height\n container.style.height = `${Math.max(400, height)}px`;\n\n // Clear previous chart\n d3.select(container).selectAll('*').remove();\n\n // Status colors with better contrast\n const statusColors: Record<string, string> = {\n 'Passed': '#22c55e',\n 'Failed': '#ef4444',\n 'Error': '#f97316',\n 'Skipped': '#a1a1aa',\n 'Running': '#3b82f6',\n 'Pending': '#d1d5db'\n };\n\n // Create SVG\n const svg = d3.select(container)\n .append('svg')\n .attr('width', width)\n .attr('height', height);\n\n // Create tooltip div\n const tooltip = d3.select(container)\n .append('div')\n .attr('class', 'chart-tooltip')\n .style('position', 'absolute')\n .style('opacity', 0)\n .style('background', 'rgba(15, 23, 42, 0.95)')\n .style('color', 'white')\n .style('padding', '10px 14px')\n .style('border-radius', '8px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('z-index', '1000')\n .style('box-shadow', '0 4px 20px rgba(0,0,0,0.3)')\n .style('max-width', '280px');\n\n // Create chart group\n const chart = svg.append('g')\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n // Add gradient definitions for cells\n const defs = svg.append('defs');\n\n // Create gradient for each status\n Object.entries(statusColors).forEach(([status, color]) => {\n const gradient = defs.append('linearGradient')\n .attr('id', `gradient-${status.toLowerCase()}`)\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n gradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', color)\n .attr('stop-opacity', 0.95);\n\n gradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', d3.color(color)?.darker(0.3)?.toString() || color)\n .attr('stop-opacity', 0.95);\n });\n\n // Draw evaluation legend at top-left corner\n this.renderChartLegend(chart, margin);\n\n // Draw column headers (run dates) at top\n runs.forEach((run, i) => {\n const x = i * colWidth + colWidth / 2;\n\n // Date text\n chart.append('text')\n .attr('x', x)\n .attr('y', -45)\n .attr('text-anchor', 'middle')\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text(this.getRelativeTime(run.date))\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Pass rate badge\n const passRateColor = run.passRate >= 80 ? '#22c55e' : run.passRate >= 50 ? '#f97316' : '#ef4444';\n const badgeWidth = 36;\n const badgeHeight = 18;\n\n chart.append('rect')\n .attr('x', x - badgeWidth / 2)\n .attr('y', -35)\n .attr('width', badgeWidth)\n .attr('height', badgeHeight)\n .attr('rx', 9)\n .attr('fill', passRateColor)\n .attr('opacity', 0.15);\n\n chart.append('text')\n .attr('x', x)\n .attr('y', -22)\n .attr('text-anchor', 'middle')\n .attr('fill', passRateColor)\n .attr('font-size', '11px')\n .attr('font-weight', '700')\n .text(`${run.passRate.toFixed(0)}%`);\n\n // Tags indicator - styled pills\n if (run.tags.length > 0) {\n const tagsToShow = run.tags.slice(0, 2);\n const tagPillWidth = 42;\n const tagPillHeight = 14;\n const tagGap = 4;\n const totalTagsWidth = tagsToShow.length * tagPillWidth + (tagsToShow.length - 1) * tagGap;\n const tagStartX = x - totalTagsWidth / 2;\n\n tagsToShow.forEach((tag, tagIndex) => {\n const tagX = tagStartX + tagIndex * (tagPillWidth + tagGap);\n const tagY = -68;\n\n // Pill background with gradient\n chart.append('rect')\n .attr('x', tagX)\n .attr('y', tagY)\n .attr('width', tagPillWidth)\n .attr('height', tagPillHeight)\n .attr('rx', 7)\n .attr('fill', '#dbeafe')\n .attr('stroke', '#93c5fd')\n .attr('stroke-width', 1)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Tag text\n chart.append('text')\n .attr('x', tagX + tagPillWidth / 2)\n .attr('y', tagY + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#1d4ed8')\n .attr('font-size', '8px')\n .attr('font-weight', '600')\n .text(tag.length > 8 ? tag.substring(0, 7) + '…' : tag)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n });\n\n // Show +N indicator if more tags\n if (run.tags.length > 2) {\n const moreX = tagStartX + tagsToShow.length * (tagPillWidth + tagGap);\n chart.append('text')\n .attr('x', moreX)\n .attr('y', -68 + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'start')\n .attr('fill', '#64748b')\n .attr('font-size', '8px')\n .attr('font-weight', '500')\n .text(`+${run.tags.length - 2}`);\n }\n }\n });\n\n // Draw row labels (test names) on left\n tests.forEach((test, i) => {\n const y = i * rowHeight + rowHeight / 2;\n\n chart.append('text')\n .attr('x', -12)\n .attr('y', y + 4)\n .attr('text-anchor', 'end')\n .attr('fill', '#334155')\n .attr('font-size', '11px')\n .text(test.testName.length > 28 ? test.testName.substring(0, 28) + '...' : test.testName)\n .style('cursor', 'pointer')\n .on('click', () => {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(test.testId));\n })\n .on('mouseover', function() {\n d3.select(this).attr('fill', '#3b82f6').attr('font-weight', '600');\n })\n .on('mouseout', function() {\n d3.select(this).attr('fill', '#334155').attr('font-weight', 'normal');\n });\n });\n\n // Draw grid lines\n tests.forEach((_, i) => {\n chart.append('line')\n .attr('x1', 0)\n .attr('y1', (i + 1) * rowHeight)\n .attr('x2', chartWidth)\n .attr('y2', (i + 1) * rowHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n runs.forEach((_, i) => {\n chart.append('line')\n .attr('x1', (i + 1) * colWidth)\n .attr('y1', 0)\n .attr('x2', (i + 1) * colWidth)\n .attr('y2', chartHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n // Draw cells with evaluation toggle support\n const cellPadding = 3;\n\n runs.forEach((run, runIndex) => {\n tests.forEach((test, testIndex) => {\n const result = run.testResults.get(test.testId);\n const x = runIndex * colWidth + cellPadding;\n const y = testIndex * rowHeight + cellPadding;\n const cellWidth = colWidth - cellPadding * 2;\n const cellHeight = rowHeight - cellPadding * 2;\n\n if (!result) {\n // Empty cell indicator\n chart.append('rect')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', '#f8fafc')\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n\n chart.append('text')\n .attr('x', x + cellWidth / 2)\n .attr('y', y + cellHeight / 2 + 4)\n .attr('text-anchor', 'middle')\n .attr('fill', '#cbd5e1')\n .attr('font-size', '12px')\n .text('—');\n return;\n }\n\n // Build tooltip content based on evaluation preferences\n const tooltipParts: string[] = [];\n if (this.evalPreferences.showExecution) {\n tooltipParts.push(`<div style=\"display:inline-block; padding:2px 8px; border-radius:4px; background:${statusColors[result.status]}; color:white; font-size:11px; font-weight:600\">${result.status}</div>`);\n }\n if (this.evalPreferences.showHuman) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:#f59e0b\">👤</span> <strong>Human:</strong> <span style=\"color:#94a3b8\">Needs review</span></div>`);\n }\n if (this.evalPreferences.showAuto && result.score != null) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:#3b82f6\">🤖</span> <strong>Auto:</strong> ${(result.score * 100).toFixed(1)}%</div>`);\n }\n const durationText = result.duration != null ? `<div><strong>Duration:</strong> ${result.duration.toFixed(2)}s</div>` : '';\n\n const cellGroup = chart.append('g')\n .attr('class', 'result-cell')\n .style('cursor', 'pointer')\n .on('click', () => this.openTestRun(result.testRunId))\n .on('mouseover', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', '#1e40af')\n .attr('stroke-width', 2);\n\n tooltip\n .style('opacity', 1)\n .html(`\n <div style=\"font-weight:600; margin-bottom:6px; color:#f1f5f9\">${result.testName}</div>\n ${tooltipParts.join('')}\n ${durationText}\n <div style=\"margin-top:6px; color:#94a3b8; font-size:10px\">${this.getRelativeTime(run.date)} • Click to view</div>\n `)\n .style('left', `${event.offsetX + 15}px`)\n .style('top', `${event.offsetY - 10}px`);\n })\n .on('mouseout', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', 'none')\n .attr('stroke-width', 0);\n tooltip.style('opacity', 0);\n });\n\n // Determine cell background color based on eval preferences\n let cellBgColor = '#f1f5f9';\n let cellBgGradient = '';\n\n if (this.evalPreferences.showExecution) {\n // Use status-based gradient\n cellBgGradient = `url(#gradient-${result.status.toLowerCase()})`;\n } else if (this.evalPreferences.showAuto && result.score != null) {\n // Use score-based color\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n cellBgColor = scoreColor;\n } else {\n // Neutral background when only Human is selected\n cellBgColor = '#fef3c7';\n }\n\n // Cell background\n cellGroup.append('rect')\n .attr('class', 'cell-bg')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', cellBgGradient || cellBgColor)\n .attr('stroke', 'none')\n .attr('stroke-width', 0)\n .style('transition', 'all 0.15s ease');\n\n // Calculate icon positions based on how many eval types are shown\n // With wider cells, we can use larger icons and better spacing\n const iconSize = evalCount === 1 ? 14 : evalCount === 2 ? 12 : 10;\n const iconSpacing = evalCount === 1 ? 0 : evalCount === 2 ? 16 : 14;\n const startX = x + cellWidth / 2 - ((evalCount - 1) * iconSpacing) / 2;\n\n let iconIndex = 0;\n\n // Status icon (execution)\n if (this.evalPreferences.showExecution) {\n const iconText: Record<string, string> = {\n 'Passed': '✓',\n 'Failed': '✕',\n 'Error': '!',\n 'Skipped': '»',\n 'Running': '●',\n 'Pending': '○'\n };\n\n const iconX = startX + iconIndex * iconSpacing;\n\n // If status is NOT the only thing shown, add a small circular bg\n if (evalCount > 1) {\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', statusColors[result.status])\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', `${iconSize}px`)\n .attr('font-weight', 'bold')\n .attr('font-family', 'system-ui, -apple-system, sans-serif')\n .text(iconText[result.status] || '?');\n\n iconIndex++;\n }\n\n // Human icon\n if (this.evalPreferences.showHuman) {\n const iconX = startX + iconIndex * iconSpacing;\n\n // Human evaluation indicator (clock icon for pending)\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', `${iconSize - 2}px`)\n .attr('font-weight', '500')\n .text('⏱');\n\n iconIndex++;\n }\n\n // Auto score icon/indicator\n if (this.evalPreferences.showAuto) {\n const iconX = startX + iconIndex * iconSpacing;\n\n if (result.score != null) {\n const scorePercent = Math.round(result.score * 100);\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n\n // Score pill background\n if (evalCount > 1) {\n cellGroup.append('rect')\n .attr('x', iconX - 10)\n .attr('y', y + cellHeight / 2 - iconSize / 2 - 1)\n .attr('width', 20)\n .attr('height', iconSize + 2)\n .attr('rx', (iconSize + 2) / 2)\n .attr('fill', scoreColor)\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', evalCount > 1 ? 'white' : 'white')\n .attr('font-size', `${iconSize - 1}px`)\n .attr('font-weight', '700')\n .text(`${scorePercent}`);\n } else {\n // No auto score available\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 2)\n .attr('fill', '#e2e8f0')\n .attr('stroke', '#94a3b8')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#94a3b8')\n .attr('font-size', `${iconSize - 2}px`)\n .text('—');\n }\n }\n });\n });\n\n // Draw trend line for pass rate across runs\n if (runs.length > 1) {\n const trendLineY = chartHeight + 50;\n const trendHeight = 40;\n\n // Trend line label\n chart.append('text')\n .attr('x', -12)\n .attr('y', trendLineY + trendHeight / 2)\n .attr('text-anchor', 'end')\n .attr('fill', '#64748b')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Pass Rate Trend');\n\n // Create trend line path\n const lineGenerator = d3.line<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n // Draw area under line\n const areaGenerator = d3.area<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y0(trendLineY + trendHeight)\n .y1(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n chart.append('path')\n .datum(runs)\n .attr('d', areaGenerator)\n .attr('fill', 'url(#trendGradient)')\n .attr('opacity', 0.3);\n\n // Create gradient for trend area\n const trendGradient = defs.append('linearGradient')\n .attr('id', 'trendGradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n trendGradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0.4);\n\n trendGradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0);\n\n chart.append('path')\n .datum(runs)\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2.5)\n .attr('stroke-linecap', 'round');\n\n // Draw dots on trend line\n runs.forEach((run, i) => {\n const cx = i * colWidth + colWidth / 2;\n const cy = trendLineY + trendHeight - (run.passRate / 100) * trendHeight;\n\n chart.append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', 4)\n .attr('fill', 'white')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2);\n });\n\n // Update container height for trend line\n container.style.height = `${Math.max(400, height + 80)}px`;\n svg.attr('height', height + 80);\n }\n\n this.chartRendered = true;\n }\n\n /**\n * Renders a legend showing which evaluation types are currently displayed\n */\n private renderChartLegend(chart: d3.Selection<SVGGElement, unknown, null, undefined>, margin: { top: number; right: number; bottom: number; left: number }): void {\n const legendGroup = chart.append('g')\n .attr('class', 'eval-legend')\n .attr('transform', `translate(${-margin.left + 10}, ${-margin.top + 15})`);\n\n // Legend title\n legendGroup.append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', '#64748b')\n .attr('font-size', '9px')\n .attr('font-weight', '600')\n .attr('text-transform', 'uppercase')\n .text('SHOWING:');\n\n let xOffset = 55;\n\n // Status indicator\n if (this.evalPreferences.showExecution) {\n const statusGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n statusGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#22c55e');\n\n statusGroup.append('text')\n .attr('x', 6)\n .attr('y', 4)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '8px')\n .attr('font-weight', 'bold')\n .text('✓');\n\n statusGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Status');\n\n xOffset += 60;\n }\n\n // Human indicator\n if (this.evalPreferences.showHuman) {\n const humanGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n humanGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n humanGroup.append('text')\n .attr('x', 6)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', '7px')\n .text('⏱');\n\n humanGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Human');\n\n xOffset += 60;\n }\n\n // Auto indicator\n if (this.evalPreferences.showAuto) {\n const autoGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n autoGroup.append('rect')\n .attr('x', 0)\n .attr('y', -6)\n .attr('width', 18)\n .attr('height', 12)\n .attr('rx', 6)\n .attr('fill', '#3b82f6');\n\n autoGroup.append('text')\n .attr('x', 9)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '7px')\n .attr('font-weight', '700')\n .text('%');\n\n autoGroup.append('text')\n .attr('x', 24)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Auto');\n }\n }\n\n getAveragePassRate(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.passRate, 0) / data.length;\n }\n\n getTotalRuns(): number {\n return this.getFilteredAnalyticsData().length;\n }\n\n getAverageDuration(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.duration, 0) / data.length;\n }\n\n getTotalCost(): number {\n return this.getFilteredAnalyticsData().reduce((sum, d) => sum + d.cost, 0);\n }\n\n getPassRateTrend(): { direction: 'up' | 'down' | 'stable'; value: number } {\n const data = this.getFilteredAnalyticsData();\n if (data.length < 2) return { direction: 'stable', value: 0 };\n\n // Compare recent half to older half\n const midpoint = Math.floor(data.length / 2);\n const recentData = data.slice(0, midpoint);\n const olderData = data.slice(midpoint);\n\n const recentAvg = recentData.reduce((s, d) => s + d.passRate, 0) / recentData.length;\n const olderAvg = olderData.reduce((s, d) => s + d.passRate, 0) / olderData.length;\n\n const diff = recentAvg - olderAvg;\n if (Math.abs(diff) < 1) return { direction: 'stable', value: diff };\n return { direction: diff > 0 ? 'up' : 'down', value: Math.abs(diff) };\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 secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(6)}`;\n if (cost < 1) return `$${cost.toFixed(4)}`;\n return `$${cost.toFixed(2)}`;\n }\n\n // ==========================================\n // Compare Tab Methods\n // ==========================================\n\n async selectCompareRunA(run: MJTestSuiteRunEntity) {\n this.compareRunA = run;\n await this.loadCompareData();\n }\n\n async selectCompareRunB(run: MJTestSuiteRunEntity) {\n this.compareRunB = run;\n await this.loadCompareData();\n }\n\n clearCompareSelection() {\n this.compareRunA = null;\n this.compareRunB = null;\n this.compareResults = [];\n this.compareRunATests = [];\n this.compareRunBTests = [];\n this.cdr.markForCheck();\n }\n\n private async loadCompareData() {\n if (!this.compareRunA || !this.compareRunB) {\n this.compareResults = [];\n this.cdr.markForCheck();\n return;\n }\n\n this.loadingCompare = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n\n // Load test runs for both suite runs in parallel\n const [resultA, resultB] = await Promise.all([\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunA.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunB.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n this.compareRunATests = resultA.Success ? resultA.Results || [] : [];\n this.compareRunBTests = resultB.Success ? resultB.Results || [] : [];\n\n // Build comparison results\n this.compareResults = this.buildComparisonResults(this.compareRunATests, this.compareRunBTests);\n } catch (error) {\n console.error('Error loading comparison data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load comparison data', 'error', 3000);\n } finally {\n this.loadingCompare = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildComparisonResults(testsA: MJTestRunEntity[], testsB: MJTestRunEntity[]): TestRunComparison[] {\n const results: TestRunComparison[] = [];\n const testMap = new Map<string, { a?: MJTestRunEntity; b?: MJTestRunEntity; name: string }>();\n\n // Map all tests from run A\n for (const test of testsA) {\n testMap.set(test.TestID, { a: test, name: test.Test || 'Unknown Test' });\n }\n\n // Map all tests from run B\n for (const test of testsB) {\n const existing = testMap.get(test.TestID);\n if (existing) {\n existing.b = test;\n } else {\n testMap.set(test.TestID, { b: test, name: test.Test || 'Unknown Test' });\n }\n }\n\n // Build comparison array\n for (const [testId, { a, b, name }] of testMap) {\n const comparison: TestRunComparison = {\n testId,\n testName: name,\n runA: a ? {\n status: a.Status || 'Unknown',\n score: a.Score,\n duration: a.DurationSeconds,\n cost: a.CostUSD\n } : null,\n runB: b ? {\n status: b.Status || 'Unknown',\n score: b.Score,\n duration: b.DurationSeconds,\n cost: b.CostUSD\n } : null,\n scoreDiff: (a?.Score != null && b?.Score != null) ? b.Score - a.Score : null,\n durationDiff: (a?.DurationSeconds != null && b?.DurationSeconds != null) ? b.DurationSeconds - a.DurationSeconds : null,\n statusChanged: (a?.Status || 'none') !== (b?.Status || 'none')\n };\n results.push(comparison);\n }\n\n return results;\n }\n\n getComparePassRateDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const rateA = this.getPassRate(this.compareRunA);\n const rateB = this.getPassRate(this.compareRunB);\n return rateB - rateA;\n }\n\n getCompareDurationDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const durA = this.compareRunA.TotalDurationSeconds || 0;\n const durB = this.compareRunB.TotalDurationSeconds || 0;\n return durB - durA;\n }\n\n getAbsCompareDurationDiff(): number {\n const diff = this.getCompareDurationDiff();\n return diff != null ? Math.abs(diff) : 0;\n }\n\n getCompareCostDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const costA = this.compareRunA.TotalCostUSD || 0;\n const costB = this.compareRunB.TotalCostUSD || 0;\n return costB - costA;\n }\n\n getCompareImprovedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status !== 'Passed' && r.runB.status === 'Passed'\n ).length;\n }\n\n getCompareRegressedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status === 'Passed' && r.runB.status !== 'Passed'\n ).length;\n }\n\n // ==========================================\n // Excel Export Methods\n // ==========================================\n\n async exportToExcel() {\n try {\n // Ensure runs are loaded\n if (!this.runsLoaded) await this.loadRuns();\n\n const data = this.suiteRuns.map(run => ({\n 'Run ID': run.ID,\n 'Status': run.Status,\n 'Started At': run.StartedAt ? new Date(run.StartedAt).toLocaleString() : 'N/A',\n 'Completed At': run.CompletedAt ? new Date(run.CompletedAt).toLocaleString() : 'N/A',\n 'Duration (s)': run.TotalDurationSeconds?.toFixed(2) || 'N/A',\n 'Total Tests': run.TotalTests || 0,\n 'Passed': run.PassedTests || 0,\n 'Failed': run.FailedTests || 0,\n 'Errors': run.ErrorTests || 0,\n 'Skipped': run.SkippedTests || 0,\n 'Pass Rate (%)': run.TotalTests ? ((run.PassedTests || 0) / run.TotalTests * 100).toFixed(1) : 'N/A',\n 'Total Cost ($)': run.TotalCostUSD?.toFixed(6) || 'N/A',\n 'Tags': TagsHelper.parseTags(run.Tags).join(', ') || 'None',\n 'Environment': run.Environment || 'N/A',\n 'Trigger Type': run.TriggerType || 'N/A',\n 'Run By': run.RunByUser || 'N/A'\n }));\n\n this.downloadAsCSV(data, `${this.record.Name}_runs_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Export successful', 'success', 2000);\n } catch (error) {\n console.error('Export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\n }\n\n private downloadAsCSV(data: Record<string, string | number>[], filename: string) {\n if (data.length === 0) return;\n\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(','),\n ...data.map(row =>\n headers.map(h => {\n const val = row[h];\n // Escape quotes and wrap in quotes if contains comma\n const strVal = String(val);\n if (strVal.includes(',') || strVal.includes('\"') || strVal.includes('\\n')) {\n return `\"${strVal.replace(/\"/g, '\"\"')}\"`;\n }\n return strVal;\n }).join(',')\n )\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 = filename;\n link.click();\n URL.revokeObjectURL(link.href);\n }\n\n getRunTags(run: MJTestSuiteRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n /**\n * Export matrix view data to CSV\n */\n exportMatrixToCSV() {\n if (this.matrixData.length === 0) {\n SharedService.Instance.CreateSimpleNotification('No data to export', 'warning', 2000);\n return;\n }\n\n try {\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Build CSV rows\n const rows: Record<string, string | number>[] = [];\n\n for (const test of tests) {\n const row: Record<string, string | number> = {\n 'Seq': test.sequence,\n 'Test Name': test.testName\n };\n\n // Add column for each run\n for (const run of runs) {\n const result = run.testResults.get(test.testId);\n const runLabel = run.tags.length > 0\n ? `${run.tags.slice(0, 2).join('/')} (${this.getRelativeTime(run.date)})`\n : this.getRelativeTime(run.date);\n\n if (result) {\n // Build cell value based on what's shown\n const parts: string[] = [];\n if (this.evalPreferences.showExecution) parts.push(result.status);\n if (this.evalPreferences.showHuman) parts.push(result.humanRating != null ? `H:${result.humanRating}` : 'H:-');\n if (this.evalPreferences.showAuto) parts.push(result.score != null ? `A:${Math.round(result.score * 100)}%` : 'A:-');\n row[runLabel] = parts.join(' | ');\n } else {\n row[runLabel] = 'Not Run';\n }\n }\n\n rows.push(row);\n }\n\n this.downloadAsCSV(rows, `${this.record.Name}_matrix_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Matrix exported successfully', 'success', 2000);\n } catch (error) {\n console.error('Matrix export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\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 analytics filters visibility\n */\n toggleFilters(): void {\n this.filtersCollapsed = !this.filtersCollapsed;\n this.cdr.markForCheck();\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 /** Case-insensitive UUID check whether a run is the currently selected Run A (baseline). */\n public IsCompareRunA(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunA?.ID, run.ID);\n }\n\n /** Case-insensitive UUID check whether a run is the currently selected Run B (compare). */\n public IsCompareRunB(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunB?.ID, run.ID);\n }\n}\n\n/**\n * Analytics data point for charting\n */\ninterface AnalyticsDataPoint {\n runId: string;\n date: Date;\n passRate: number;\n totalTests: number;\n passedTests: number;\n failedTests: number;\n errorTests: number;\n skippedTests: number;\n duration: number;\n cost: number;\n tags: string[];\n status: string;\n}\n\n/**\n * Matrix data point for the matrix view - shows test results across suite runs\n */\ninterface MatrixDataPoint {\n runId: string;\n date: Date;\n tags: string[];\n status: string;\n passRate: number;\n testResults: Map<string, TestResultCell>;\n}\n\ninterface TestResultCell {\n testRunId: string;\n testId: string;\n testName: string;\n status: string;\n score: number | null;\n duration: number | null;\n humanRating: number | null;\n humanComments: string | null;\n sequence: number;\n}\n","<div class=\"test-suite-form\">\n <!-- Header Section -->\n <div class=\"suite-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-layer-group\"></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=\"suite-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-info\">\n <h1>{{ record.Name }}</h1>\n <div class=\"suite-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"record.Status === 'Active' ? 'fa-circle-check' : 'fa-circle-pause'\"></i>\n {{ record.Status }}\n </span>\n @if (testsLoaded) {\n <span class=\"test-count\">\n <i class=\"fas fa-flask\"></i>\n {{ suiteTests.length }} tests\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)=\"exportToExcel()\" title=\"Export to CSV\">\n <i class=\"fas fa-file-excel\"></i> Export\n </button>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite\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 @if (record.Description) {\n <div class=\"suite-description\">\n <p>{{ record.Description }}</p>\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> Overview\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'tests'\"\n (click)=\"changeTab('tests')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tests'\">\n <i class=\"fas fa-flask\"></i> Tests\n @if (testsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\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> Runs\n @if (runsLoaded) {\n <span class=\"tab-badge\">{{ suiteRuns.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> Analytics\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'compare'\"\n (click)=\"changeTab('compare')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'compare'\">\n <i class=\"fas fa-balance-scale\"></i> Compare\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 <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Suite 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\">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\">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 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>\n </div>\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>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\">Default timeout for tests in this suite</span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Tests Tab -->\n @if (activeTab === 'tests') {\n <div class=\"tests-tab\">\n <!-- Loading State -->\n @if (loadingTests) {\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-sequence\"></div>\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 <!-- Tests List -->\n @if (!loadingTests && suiteTests.length > 0) {\n <div class=\"tests-list\">\n @for (test of suiteTests; track test) {\n <div class=\"test-item\" (click)=\"openTest(test.TestID)\">\n <div class=\"test-sequence\">{{ test.Sequence }}</div>\n <div class=\"test-icon\"><i class=\"fas fa-flask\"></i></div>\n <div class=\"test-content\">\n <div class=\"test-name\">{{ test.Test }}</div>\n <div class=\"test-status\">\n @if (test.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ test.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 (testsLoaded && !loadingTests && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <h4>No Tests in Suite</h4>\n <p>Add tests to this suite to start running them together.</p>\n </div>\n }\n </div>\n }\n\n <!-- 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]; 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 && suiteRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-item\" (click)=\"openSuiteRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Completed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></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.TotalTests) {\n <span>\n <i class=\"fas fa-check-circle\"></i> {{ run.PassedTests }}/{{ run.TotalTests }}\n ({{ getPassRate(run).toFixed(0) }}%)\n </span>\n }\n </div>\n <!-- Evaluation metrics row -->\n <div class=\"run-eval-metrics\">\n <!-- Status badge -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-metric status\" [class]=\"'status-' + run.Status.toLowerCase()\">\n <i class=\"fas\"\n [class.fa-circle-check]=\"run.Status === 'Completed'\"\n [class.fa-circle-xmark]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></i>\n </span>\n }\n <!-- Human score (placeholder - need avg from suite run) -->\n @if (evalPreferences.showHuman) {\n <span class=\"eval-metric human\" title=\"Human evaluation\">\n <i class=\"fas fa-user\"></i>\n <span class=\"eval-pending\"><i class=\"fas fa-clock\"></i></span>\n </span>\n }\n <!-- Auto score (pass rate as proxy) -->\n @if (evalPreferences.showAuto && run.TotalTests) {\n <span class=\"eval-metric auto\"\n [class.high]=\"getPassRate(run) >= 80\"\n [class.medium]=\"getPassRate(run) >= 50 && getPassRate(run) < 80\"\n [class.low]=\"getPassRate(run) < 50\"\n title=\"Auto score (pass rate)\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ getPassRate(run).toFixed(0) }}%</span>\n </span>\n }\n </div>\n <!-- Tags display -->\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run); track tag) {\n <span class=\"tag-chip\">{{ tag }}</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 (runsLoaded && !loadingRuns && suiteRuns.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 Suite Runs Yet</h4>\n <p>Run this suite to see execution history and results here.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"analytics-tab\">\n <!-- Loading State -->\n @if (loadingAnalytics) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading analytics data...\"></mj-loading>\n </div>\n }\n @if (!loadingAnalytics && analyticsLoaded) {\n <!-- View Toggle Sub-nav -->\n <div class=\"analytics-subnav\">\n <div class=\"subnav-tabs\">\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'summary'\"\n (click)=\"setAnalyticsView('summary')\">\n <i class=\"fas fa-chart-bar\"></i>\n <span>Summary</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'matrix'\"\n (click)=\"setAnalyticsView('matrix')\">\n <i class=\"fas fa-th\"></i>\n <span>Matrix</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'chart'\"\n (click)=\"setAnalyticsView('chart')\">\n <i class=\"fas fa-project-diagram\"></i>\n <span>Chart</span>\n </button>\n </div>\n </div>\n <!-- Collapsible Filters (shared by both views) -->\n <div class=\"analytics-filters\" [class.collapsed]=\"filtersCollapsed\">\n <div class=\"filters-header\" (click)=\"toggleFilters()\">\n <span class=\"filters-title\">\n <i class=\"fas fa-filter\"></i>\n Filters\n @if (filtersCollapsed) {\n <span class=\"filter-summary\">\n {{ analyticsTimeRange === 'all' ? 'All Time' : analyticsTimeRange }}\n @if (selectedTags.length > 0) {\n <span> · {{ selectedTags.length }} tags</span>\n }\n </span>\n }\n </span>\n <i class=\"fas\" [ngClass]=\"filtersCollapsed ? 'fa-chevron-down' : 'fa-chevron-up'\"></i>\n </div>\n @if (!filtersCollapsed) {\n <div class=\"filters-content\">\n <div class=\"filter-group\">\n <label>Time Range</label>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '7d'\" (click)=\"setTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '30d'\" (click)=\"setTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '90d'\" (click)=\"setTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === 'all'\" (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n @if (uniqueTags.length > 0) {\n <div class=\"filter-group\">\n <label>Filter by Tag @if (selectedTags.length > 0) {\n <span class=\"filter-hint\">({{ selectedTags.length }} selected)</span>\n }</label>\n <div class=\"filter-buttons tag-filters\">\n <button class=\"filter-btn tag-btn all-tags-btn\"\n [class.active]=\"selectedTags.length === 0\"\n (click)=\"toggleTagFilter(null)\">\n <i class=\"fas fa-layer-group\"></i> All Tags\n </button>\n @for (tag of uniqueTags; track tag) {\n <button class=\"filter-btn tag-btn\"\n [class.active]=\"isTagSelected(tag)\"\n (click)=\"toggleTagFilter(tag)\">\n @if (isTagSelected(tag)) {\n <i class=\"fas fa-check\"></i>\n }\n {{ tag }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n <!-- Summary View -->\n @if (analyticsView === 'summary') {\n <!-- KPI Cards -->\n <div class=\"analytics-kpis\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\"><i class=\"fas fa-play-circle\"></i></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 <div class=\"kpi-card\">\n <div class=\"kpi-icon success\"><i class=\"fas fa-check-circle\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getAveragePassRate().toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Pass Rate</div>\n <div class=\"kpi-trend\" [ngClass]=\"{'trend-up': getPassRateTrend().direction === 'up', 'trend-down': getPassRateTrend().direction === 'down'}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getPassRateTrend().direction === 'up', 'fa-arrow-down': getPassRateTrend().direction === 'down', 'fa-minus': getPassRateTrend().direction === 'stable'}\"></i>\n {{ getPassRateTrend().value.toFixed(1) }}%\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon info\"><i class=\"fas fa-clock\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getAverageDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon warning\"><i class=\"fas fa-dollar-sign\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getTotalCost()) }}</div>\n <div class=\"kpi-label\">Total Cost</div>\n </div>\n </div>\n </div>\n <!-- Runs Table -->\n <div class=\"analytics-table-section\">\n <h3><i class=\"fas fa-table\"></i> Run History</h3>\n <div class=\"analytics-table-wrapper\">\n <table class=\"analytics-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Status</th>\n <th>Pass Rate</th>\n <th>Tests</th>\n <th>Duration</th>\n <th>Cost</th>\n <th>Tags</th>\n </tr>\n </thead>\n <tbody>\n @for (dp of getFilteredAnalyticsData(); track dp) {\n <tr (click)=\"openSuiteRun(dp.runId)\" class=\"clickable-row\">\n <td>{{ dp.date | date:'short' }}</td>\n <td>\n <span class=\"status-chip\" [ngClass]=\"'status-' + dp.status.toLowerCase()\">{{ dp.status }}</span>\n </td>\n <td>\n <div class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\" [style.width.%]=\"dp.passRate\" [ngClass]=\"{'high': dp.passRate >= 80, 'medium': dp.passRate >= 50 && dp.passRate < 80, 'low': dp.passRate < 50}\"></div>\n <span>{{ dp.passRate.toFixed(0) }}%</span>\n </div>\n </td>\n <td>{{ dp.passedTests }}/{{ dp.totalTests }}</td>\n <td>{{ formatDuration(dp.duration) }}</td>\n <td>{{ formatCost(dp.cost) }}</td>\n <td>\n <div class=\"tag-cell\">\n @for (tag of dp.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-table\">{{ tag }}</span>\n }\n @if (dp.tags.length > 2) {\n <span class=\"tag-more\">+{{ dp.tags.length - 2 }}</span>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (getFilteredAnalyticsData().length === 0) {\n <div class=\"empty-state small\">\n <p>No runs match the current filters.</p>\n </div>\n }\n </div>\n }\n <!-- Matrix View -->\n @if (analyticsView === 'matrix') {\n <!-- Loading Matrix -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading test matrix...\"></mj-loading>\n </div>\n }\n <!-- Matrix Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"matrix-section\">\n <div class=\"matrix-header\">\n <h3><i class=\"fas fa-th\"></i> Test Results Matrix</h3>\n <div class=\"matrix-header-right\">\n <div class=\"matrix-filter-input\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Filter tests...\"\n [value]=\"matrixTestFilter\"\n (input)=\"onMatrixFilterInput($event)\"\n class=\"filter-input\">\n @if (matrixTestFilter) {\n <button class=\"clear-filter-btn\" (click)=\"clearMatrixFilter()\" title=\"Clear filter\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n <span class=\"matrix-run-count\">{{ matrixData.length }} runs · {{ getUniqueTestsFromMatrix().length }} tests</span>\n <button mjButton (click)=\"exportMatrixToCSV()\" [disabled]=\"matrixData.length === 0\" title=\"Export matrix to CSV\">\n <i class=\"fas fa-download\"></i> Export\n </button>\n </div>\n </div>\n <div class=\"matrix-scroll-container\">\n <table class=\"test-matrix\">\n <thead>\n <tr>\n <th class=\"seq-header\" (click)=\"toggleMatrixSort('sequence')\" title=\"Sort by sequence\">\n #\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'sequence' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n <th class=\"test-name-header\" (click)=\"toggleMatrixSort('name')\" title=\"Sort by name\">\n Test\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'name' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n @for (run of matrixData; track run) {\n <th class=\"run-header\" (click)=\"openSuiteRun(run.runId)\" [title]=\"'Click to view suite run - ' + (run.date | date:'medium')\">\n <div class=\"run-header-content\">\n @if (run.tags.length > 0) {\n <div class=\"run-tags-header\">\n @for (tag of run.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-header\">{{ tag }}</span>\n }\n @if (run.tags.length > 2) {\n <span class=\"tag-more-header\">+{{ run.tags.length - 2 }}</span>\n }\n </div>\n }\n <div class=\"run-date\">{{ getRelativeTime(run.date) }}</div>\n <div class=\"run-pass-rate\" [ngClass]=\"{'high': run.passRate >= 80, 'medium': run.passRate >= 50 && run.passRate < 80, 'low': run.passRate < 50}\">\n {{ run.passRate.toFixed(0) }}%\n </div>\n </div>\n </th>\n }\n <th class=\"spacer-header\"></th>\n </tr>\n </thead>\n <tbody>\n @for (test of getUniqueTestsFromMatrix(); track test) {\n <tr\n [class.row-selected]=\"selectedMatrixTestId === test.testId\"\n (click)=\"selectMatrixRow(test.testId)\">\n <td class=\"seq-cell\">{{ test.sequence }}</td>\n <td class=\"test-name-cell\">\n <span class=\"test-name\" [title]=\"test.testName\">{{ test.testName }}</span>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell\"\n [ngClass]=\"getMatrixCellClass(getTestResultForRun(run.runId, test.testId))\"\n [class.clickable]=\"getTestResultForRun(run.runId, test.testId)\"\n [class.cell-not-run]=\"!getTestResultForRun(run.runId, test.testId)\"\n [title]=\"getTestResultForRun(run.runId, test.testId)?.status + ' - Click to view test run' || 'Not Run'\"\n (click)=\"onMatrixCellClick(getTestResultForRun(run.runId, test.testId), $event)\">\n @if (getTestResultForRun(run.runId, test.testId); as result) {\n <div class=\"cell-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"cell-status\"\n [ngClass]=\"'status-' + result.status.toLowerCase()\"\n [class.cell-skipped-status]=\"result.status === 'Skipped' || result.status === 'Pending'\"\n [title]=\"getStatusTooltip(result.status)\">\n <i class=\"fas\"\n [class.fa-check]=\"result.status === 'Passed'\"\n [class.fa-times]=\"result.status === 'Failed'\"\n [class.fa-exclamation]=\"result.status === 'Error'\"\n [class.fa-hourglass-end]=\"result.status === 'Timeout'\"\n [class.fa-forward]=\"result.status === 'Skipped'\"\n [class.fa-spinner]=\"result.status === 'Running'\"\n [class.fa-clock]=\"result.status === 'Pending'\"></i>\n </span>\n }\n <!-- Human score - slashed icon if no feedback, colored by rating if has feedback -->\n @if (evalPreferences.showHuman && !result.humanRating) {\n <span class=\"cell-human no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (evalPreferences.showHuman && result.humanRating) {\n <span class=\"cell-human has-feedback\"\n [class.rating-low]=\"result.humanRating <= 4\"\n [class.rating-medium]=\"result.humanRating >= 5 && result.humanRating <= 6\"\n [class.rating-good]=\"result.humanRating >= 7 && result.humanRating <= 8\"\n [class.rating-excellent]=\"result.humanRating >= 9\"\n [title]=\"getHumanTooltip(result.humanRating, result.humanComments)\">\n <i class=\"fas fa-user\"></i>\n <span class=\"rating-value\">{{ result.humanRating }}</span>\n </span>\n }\n <!-- Auto score - colored by percentage -->\n @if (evalPreferences.showAuto && result.score != null) {\n <span class=\"cell-auto has-score\"\n [class.score-low]=\"result.score < 0.5\"\n [class.score-medium]=\"result.score >= 0.5 && result.score < 0.7\"\n [class.score-good]=\"result.score >= 0.7 && result.score < 0.85\"\n [class.score-excellent]=\"result.score >= 0.85\"\n [title]=\"'Auto Score: ' + (result.score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span class=\"score-value\">{{ (result.score * 100).toFixed(0) }}</span>\n </span>\n }\n @if (evalPreferences.showAuto && result.score == null) {\n <span class=\"cell-auto no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n </div>\n }\n @if (!getTestResultForRun(run.runId, test.testId)) {\n <span class=\"cell-not-run-indicator\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n }\n </tbody>\n <!-- Footer row with totals -->\n <tfoot>\n <tr class=\"totals-row\">\n <td class=\"seq-cell totals-label\"></td>\n <td class=\"test-name-cell totals-label\">\n <strong>Totals</strong>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell totals-cell\">\n <div class=\"cell-eval-stack totals-stack\">\n <!-- Status totals -->\n @if (evalPreferences.showExecution) {\n <span class=\"totals-status\">\n <span class=\"pass-count\">{{ getRunPassedCount(run) }}/{{ getRunTotalCount(run) }}</span>\n </span>\n }\n <!-- Human totals -->\n @if (evalPreferences.showHuman) {\n <span class=\"totals-human\">\n @if (getRunHumanAvg(run) != null) {\n <span class=\"avg-label\">{{ getRunHumanAvg(run)?.toFixed(1) }}</span>\n }\n <span class=\"count-label\">({{ getRunHumanCount(run) }})</span>\n </span>\n }\n <!-- Auto totals -->\n @if (evalPreferences.showAuto) {\n <span class=\"totals-auto\">\n @if (getRunAutoAvg(run) != null) {\n <span class=\"avg-label\">{{ (getRunAutoAvg(run)! * 100).toFixed(0) }}%</span>\n }\n <span class=\"count-label\">({{ getRunAutoCount(run) }})</span>\n </span>\n }\n </div>\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n }\n <!-- Empty Matrix State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-th\"></i>\n </div>\n <h4>No Matrix Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n <!-- Chart View -->\n @if (analyticsView === 'chart') {\n <!-- Loading Chart -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading chart data...\"></mj-loading>\n </div>\n }\n <!-- Chart Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h3><i class=\"fas fa-project-diagram\"></i> Test Results Flow</h3>\n <div class=\"chart-legend\">\n <span class=\"legend-item chart-passed\"><i class=\"fas fa-check\"></i> Passed</span>\n <span class=\"legend-item chart-failed\"><i class=\"fas fa-times\"></i> Failed</span>\n <span class=\"legend-item chart-error\"><i class=\"fas fa-exclamation\"></i> Error</span>\n <span class=\"legend-item chart-skipped\"><i class=\"fas fa-forward\"></i> Skipped</span>\n </div>\n </div>\n <div class=\"chart-container\">\n <div #chartContainer class=\"d3-chart\"></div>\n </div>\n <div class=\"chart-info\">\n <i class=\"fas fa-info-circle\"></i>\n Interactive visualization showing test results across {{ matrixData.length }} runs.\n Hover over elements for details, click nodes to navigate.\n </div>\n </div>\n }\n <!-- Empty Chart State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-project-diagram\"></i>\n </div>\n <h4>No Chart Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n }\n <!-- Empty State -->\n @if (!loadingAnalytics && analyticsLoaded && analyticsData.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 Analytics Data</h4>\n <p>Run this suite to start collecting analytics data.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Compare Tab -->\n @if (activeTab === 'compare') {\n <div class=\"compare-tab\">\n <!-- Run Selection -->\n <div class=\"compare-selection\">\n <div class=\"compare-run-selector\">\n <h4>Run A (Baseline)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunA(run)\"\n (click)=\"selectCompareRunA(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunA) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunA = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunA.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunA).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n <div class=\"compare-vs\"><i class=\"fas fa-exchange-alt\"></i></div>\n <div class=\"compare-run-selector\">\n <h4>Run B (Compare)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunB(run)\"\n [class.disabled]=\"IsCompareRunA(run)\"\n (click)=\"!IsCompareRunA(run) && selectCompareRunB(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunB) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunB = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunB.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunB).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Comparison Results -->\n @if (compareRunA && compareRunB && !loadingCompare) {\n <div class=\"compare-results\">\n <!-- Summary Cards -->\n <div class=\"compare-summary\">\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Pass Rate Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getComparePassRateDiff()! > 0, 'negative': getComparePassRateDiff()! < 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getComparePassRateDiff()! > 0, 'fa-arrow-down': getComparePassRateDiff()! < 0, 'fa-minus': getComparePassRateDiff() === 0}\"></i>\n {{ getComparePassRateDiff()! > 0 ? '+' : '' }}{{ getComparePassRateDiff()?.toFixed(1) }}%\n </div>\n </div>\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Duration Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getCompareDurationDiff()! < 0, 'negative': getCompareDurationDiff()! > 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-down': getCompareDurationDiff()! < 0, 'fa-arrow-up': getCompareDurationDiff()! > 0, 'fa-minus': getCompareDurationDiff() === 0}\"></i>\n {{ formatDuration(getAbsCompareDurationDiff()) }}\n </div>\n </div>\n <div class=\"compare-summary-card improved\">\n <div class=\"summary-label\">Improved</div>\n <div class=\"summary-value\">{{ getCompareImprovedCount() }}</div>\n </div>\n <div class=\"compare-summary-card regressed\">\n <div class=\"summary-label\">Regressed</div>\n <div class=\"summary-value\">{{ getCompareRegressedCount() }}</div>\n </div>\n </div>\n <!-- Detailed Comparison Table -->\n <div class=\"compare-table-section\">\n <h3><i class=\"fas fa-list\"></i> Test-by-Test Comparison</h3>\n <div class=\"compare-table-wrapper\">\n <table class=\"compare-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Run A Status</th>\n <th>Run B Status</th>\n <th>Score Diff</th>\n <th>Duration Diff</th>\n <th>Change</th>\n </tr>\n </thead>\n <tbody>\n @for (result of compareResults; track result) {\n <tr [ngClass]=\"{'improved': result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed', 'regressed': result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed'}\">\n <td class=\"test-name-cell\">{{ result.testName }}</td>\n <td>\n @if (result.runA) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runA.status.toLowerCase()\">{{ result.runA.status }}</span>\n }\n @if (!result.runA) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.runB) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runB.status.toLowerCase()\">{{ result.runB.status }}</span>\n }\n @if (!result.runB) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.scoreDiff != null) {\n <span [ngClass]=\"{'positive': result.scoreDiff > 0, 'negative': result.scoreDiff < 0}\">\n {{ result.scoreDiff > 0 ? '+' : '' }}{{ (result.scoreDiff * 100).toFixed(1) }}%\n </span>\n }\n @if (result.scoreDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.durationDiff != null) {\n <span [ngClass]=\"{'positive': result.durationDiff < 0, 'negative': result.durationDiff > 0}\">\n {{ result.durationDiff > 0 ? '+' : '' }}{{ result.durationDiff.toFixed(1) }}s\n </span>\n }\n @if (result.durationDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed') {\n <span class=\"change-indicator improved\">\n <i class=\"fas fa-arrow-up\"></i> Fixed\n </span>\n }\n @if (result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed') {\n <span class=\"change-indicator regressed\">\n <i class=\"fas fa-arrow-down\"></i> Broke\n </span>\n }\n @if (!result.statusChanged) {\n <span class=\"change-indicator unchanged\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n }\n <!-- Loading State for Compare -->\n @if (loadingCompare) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading comparison data...\"></mj-loading>\n </div>\n }\n <!-- Empty State -->\n @if (!compareRunA || !compareRunB) {\n <div class=\"compare-empty\">\n <div class=\"compare-empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Select Two Runs to Compare</h4>\n <p>Choose a baseline run (A) and a comparison run (B) from the lists above to see a detailed side-by-side comparison.</p>\n </div>\n }\n <!-- No Runs State -->\n @if (runsLoaded && suiteRuns.length < 2) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Not Enough Runs to Compare</h4>\n <p>You need at least 2 suite runs to use the comparison feature.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\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 Suite</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</div>\n"]}
1
+ {"version":3,"file":"test-suite-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-suite-form.component.ts","../../../../src/lib/custom/Tests/test-suite-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, AfterViewInit, ViewChild, ViewContainerRef, ElementRef, inject } from '@angular/core';\nimport * as d3 from 'd3';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestSuiteEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJTestRunEntity, MJTestRunFeedbackEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestSuiteFormComponent } from '../../generated/Entities/MJTestSuite/mjtestsuite.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n TestRunComparison,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\n@RegisterClass(BaseFormComponent, 'MJ: Test Suites')\n@Component({\n standalone: false,\n selector: 'mj-test-suite-form',\n templateUrl: './test-suite-form.component.html',\n styleUrls: ['./test-suite-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestSuiteFormComponentExtended extends MJTestSuiteFormComponent implements OnInit, OnDestroy, AfterViewInit {\n public override record!: MJTestSuiteEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingTests = false;\n loadingRuns = false;\n loadingAnalytics = false;\n loadingCompare = false;\n testsLoaded = false;\n runsLoaded = false;\n analyticsLoaded = false;\n isRefreshing = false;\n error: string | null = null;\n\n // Related data\n suiteTests: MJTestSuiteTestEntity[] = [];\n suiteRuns: MJTestSuiteRunEntity[] = [];\n\n // Analytics data\n analyticsData: AnalyticsDataPoint[] = [];\n uniqueTags: string[] = [];\n selectedTags: string[] = []; // Multi-select: empty array means \"All Tags\"\n analyticsTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n analyticsView: 'summary' | 'matrix' | 'chart' = 'summary';\n matrixData: MatrixDataPoint[] = [];\n loadingMatrix = false;\n matrixLoaded = false;\n\n // Chart\n @ViewChild('chartContainer') chartContainer!: ElementRef<HTMLDivElement>;\n private chartRendered = false;\n\n // Compare data\n compareRunA: MJTestSuiteRunEntity | null = null;\n compareRunB: MJTestSuiteRunEntity | null = null;\n compareResults: TestRunComparison[] = [];\n compareRunATests: MJTestRunEntity[] = [];\n compareRunBTests: MJTestRunEntity[] = [];\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private metadata = new Metadata();\n\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\n\n // Filter collapse state\n filtersCollapsed = false;\n\n // Matrix sorting\n matrixSortBy: 'sequence' | 'name' = 'sequence';\n matrixSortAsc = true;\n\n // Matrix row selection\n selectedMatrixTestId: string | null = null;\n\n // Matrix test name filter\n matrixTestFilter = '';\n private matrixFilterSubject$ = new Subject<string>();\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 // Re-render chart when preferences change (D3 chart needs manual update)\n if (this.chartRendered && this.analyticsView === 'chart') {\n this.renderChart();\n }\n });\n\n // Subscribe to matrix filter with debounce\n this.matrixFilterSubject$\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(value => {\n this.matrixTestFilter = value;\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\n ngAfterViewInit() {\n // Initialize any view-dependent logic\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 suite\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runSuite();\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('tests'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('analytics'); break;\n case '5': this.changeTab('compare'); break;\n }\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n if (tab === 'tests' && !this.testsLoaded) this.loadTests();\n if (tab === 'runs' && !this.runsLoaded) this.loadRuns();\n if (tab === 'analytics' && !this.analyticsLoaded) this.loadAnalytics();\n this.cdr.markForCheck();\n }\n\n private async loadTests() {\n if (this.testsLoaded) return;\n\n this.loadingTests = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteTests = result.Results || [];\n this.testsLoaded = true;\n } catch (error) {\n console.error('Error loading tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load tests', 'error', 3000);\n } finally {\n this.loadingTests = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadRuns() {\n if (this.runsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n });\n if (result.Success) this.suiteRuns = result.Results || [];\n this.runsLoaded = true;\n } catch (error) {\n console.error('Error loading runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\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 getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Completed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n case 'Cancelled': return '#6b7280';\n default: return '#9ca3af';\n }\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 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 getPassRate(run: MJTestSuiteRunEntity): number {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\n }\n\n openTest(testId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(testId));\n }\n\n openSuiteRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suite Runs', CompositeKey.FromID(runId));\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 runSuite() {\n if (this.record?.ID) {\n this.testingDialogService.OpenSuitePanel(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\n // Reset lazy-loaded data\n if (this.testsLoaded) {\n this.testsLoaded = false;\n this.suiteTests = [];\n await this.loadTests();\n }\n if (this.runsLoaded) {\n this.runsLoaded = false;\n this.suiteRuns = [];\n await this.loadRuns();\n }\n if (this.analyticsLoaded) {\n this.analyticsLoaded = false;\n this.analyticsData = [];\n // Also reset matrix data so it reloads with fresh data\n this.matrixLoaded = false;\n this.matrixData = [];\n await this.loadAnalytics();\n // Reload matrix if currently viewing matrix or chart view\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n await this.loadMatrixData();\n }\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 // ==========================================\n // Analytics Tab Methods\n // ==========================================\n\n private async loadAnalytics() {\n if (this.analyticsLoaded) return;\n\n this.loadingAnalytics = true;\n this.cdr.markForCheck();\n\n try {\n // Load all runs for analytics (not just recent 50)\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `SuiteID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 200,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n // Process runs into analytics data points\n this.analyticsData = result.Results.map(run => this.runToDataPoint(run));\n\n // Extract unique tags\n this.uniqueTags = TagsHelper.getUniqueTags(result.Results.map(r => r.Tags));\n\n // Also populate suiteRuns if not already loaded\n if (!this.runsLoaded) {\n this.suiteRuns = result.Results.slice(0, 50);\n this.runsLoaded = true;\n }\n }\n\n this.analyticsLoaded = true;\n } catch (error) {\n console.error('Error loading analytics:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load analytics data', 'error', 3000);\n } finally {\n this.loadingAnalytics = false;\n this.cdr.markForCheck();\n }\n }\n\n private runToDataPoint(run: MJTestSuiteRunEntity): AnalyticsDataPoint {\n const total = run.TotalTests || 0;\n const passed = run.PassedTests || 0;\n return {\n runId: run.ID,\n date: run.StartedAt ? new Date(run.StartedAt) : new Date(),\n passRate: total > 0 ? (passed / total) * 100 : 0,\n totalTests: total,\n passedTests: passed,\n failedTests: run.FailedTests || 0,\n errorTests: run.ErrorTests || 0,\n skippedTests: run.SkippedTests || 0,\n duration: run.TotalDurationSeconds || 0,\n cost: run.TotalCostUSD || 0,\n tags: TagsHelper.parseTags(run.Tags),\n status: run.Status || 'Unknown'\n };\n }\n\n getFilteredAnalyticsData(): AnalyticsDataPoint[] {\n let data = this.analyticsData;\n\n // Apply time range filter\n const now = new Date();\n let cutoffDate: Date | null = null;\n\n switch (this.analyticsTimeRange) {\n case '7d':\n cutoffDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoffDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoffDate = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n }\n\n if (cutoffDate) {\n data = data.filter(d => d.date >= cutoffDate!);\n }\n\n // Apply tag filter (multi-select: empty array means all tags)\n if (this.selectedTags.length > 0) {\n data = data.filter(d => this.selectedTags.some(tag => d.tags.includes(tag)));\n }\n\n return data;\n }\n\n setTimeRange(range: '7d' | '30d' | '90d' | 'all') {\n this.analyticsTimeRange = range;\n // Reload matrix data when time range changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Toggle a tag in the multi-select filter.\n * If tag is null, clear all selections (show all tags).\n */\n toggleTagFilter(tag: string | null) {\n if (tag === null) {\n // Clear all - show all tags\n this.selectedTags = [];\n } else {\n // Toggle the tag\n const index = this.selectedTags.indexOf(tag);\n if (index >= 0) {\n this.selectedTags = this.selectedTags.filter(t => t !== tag);\n } else {\n this.selectedTags = [...this.selectedTags, tag];\n }\n }\n // Reload matrix data when tag filter changes (if currently viewing matrix or chart)\n if (this.analyticsView === 'matrix' || this.analyticsView === 'chart') {\n this.reloadMatrixData();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Check if a tag is currently selected in the filter\n */\n isTagSelected(tag: string): boolean {\n return this.selectedTags.includes(tag);\n }\n\n setAnalyticsView(view: 'summary' | 'matrix' | 'chart') {\n this.analyticsView = view;\n if ((view === 'matrix' || view === 'chart') && !this.matrixLoaded) {\n this.loadMatrixData();\n }\n // Render chart when switching to chart view\n if (view === 'chart' && this.matrixLoaded) {\n setTimeout(() => this.renderChart(), 100);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Force reload of matrix data (used when filters change)\n */\n private reloadMatrixData() {\n this.matrixLoaded = false;\n this.loadMatrixData();\n }\n\n private async loadMatrixData() {\n if (this.loadingMatrix) return;\n this.loadingMatrix = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const filteredRuns = this.getFilteredAnalyticsData();\n\n // Load test runs for each suite run (limit to most recent 10 for performance)\n const runsToLoad = filteredRuns.slice(0, 10);\n\n const matrixData: MatrixDataPoint[] = [];\n\n // Collect all test run IDs to batch load feedbacks\n const allTestRunIds: string[] = [];\n\n for (const runData of runsToLoad) {\n const testRunsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${runData.runId}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (testRunsResult.Success && testRunsResult.Results) {\n const testResults = new Map<string, TestResultCell>();\n\n for (const testRun of testRunsResult.Results) {\n allTestRunIds.push(testRun.ID);\n testResults.set(testRun.TestID, {\n testRunId: testRun.ID,\n testId: testRun.TestID,\n testName: testRun.Test || 'Unknown',\n status: testRun.Status,\n score: testRun.Score,\n duration: testRun.DurationSeconds,\n humanRating: null, // Will be populated below\n humanComments: null, // Will be populated below\n sequence: testRun.Sequence ?? 0\n });\n }\n\n matrixData.push({\n runId: runData.runId,\n date: runData.date,\n tags: runData.tags,\n status: runData.status,\n passRate: runData.passRate,\n testResults\n });\n }\n }\n\n // Batch load feedbacks for all test runs\n if (allTestRunIds.length > 0) {\n const feedbackMap = await this.loadFeedbacksForTestRuns(allTestRunIds);\n\n // Apply feedbacks to matrix data\n for (const run of matrixData) {\n run.testResults.forEach((cell, _testId) => {\n const feedback = feedbackMap.get(cell.testRunId);\n if (feedback) {\n if (feedback.Rating != null) {\n cell.humanRating = feedback.Rating;\n }\n // Use CorrectionSummary if available (from inline feedback), fallback to Comments\n const commentText = feedback.CorrectionSummary || feedback.Comments;\n if (commentText) {\n cell.humanComments = commentText;\n }\n }\n });\n }\n }\n\n this.matrixData = matrixData;\n this.matrixLoaded = true;\n\n // Render chart if currently on chart view\n if (this.analyticsView === 'chart') {\n setTimeout(() => this.renderChart(), 100);\n }\n } catch (error) {\n console.error('Error loading matrix data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load matrix data', 'error', 3000);\n } finally {\n this.loadingMatrix = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n * Returns a map of testRunId -> MJTestRunFeedbackEntity\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<Map<string, MJTestRunFeedbackEntity>> {\n const feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n if (testRunIds.length === 0) return feedbackMap;\n\n try {\n const rv = new RunView();\n // Build IN clause for the IDs (batch in chunks to avoid query size limits)\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 // If multiple feedbacks exist for same test run, keep the most recent (last one)\n feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n\n return feedbackMap;\n }\n\n getUniqueTestsFromMatrix(): { testId: string; testName: string; sequence: number }[] {\n const testsMap = new Map<string, { testName: string; sequence: number }>();\n\n for (const runData of this.matrixData) {\n for (const [testId, testResult] of runData.testResults) {\n if (!testsMap.has(testId)) {\n testsMap.set(testId, { testName: testResult.testName, sequence: testResult.sequence });\n }\n }\n }\n\n let tests = Array.from(testsMap.entries()).map(([testId, data]) => ({\n testId,\n testName: data.testName,\n sequence: data.sequence\n }));\n\n // Apply test name filter if set\n if (this.matrixTestFilter.trim()) {\n const filterLower = this.matrixTestFilter.toLowerCase().trim();\n tests = tests.filter(t => t.testName.toLowerCase().includes(filterLower));\n }\n\n // Apply sorting\n if (this.matrixSortBy === 'sequence') {\n tests = tests.sort((a, b) => this.matrixSortAsc ? a.sequence - b.sequence : b.sequence - a.sequence);\n } else {\n tests = tests.sort((a, b) => {\n const cmp = a.testName.localeCompare(b.testName);\n return this.matrixSortAsc ? cmp : -cmp;\n });\n }\n\n return tests;\n }\n\n /**\n * Toggle matrix sort column\n */\n toggleMatrixSort(column: 'sequence' | 'name') {\n if (this.matrixSortBy === column) {\n this.matrixSortAsc = !this.matrixSortAsc;\n } else {\n this.matrixSortBy = column;\n this.matrixSortAsc = true;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Select/deselect a matrix row for highlighting\n */\n selectMatrixRow(testId: string): void {\n this.selectedMatrixTestId = this.selectedMatrixTestId === testId ? null : testId;\n this.cdr.markForCheck();\n }\n\n /**\n * Handle test name filter input - uses Subject for debounce\n */\n onMatrixFilterInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.matrixFilterSubject$.next(value);\n }\n\n /**\n * Clear the matrix test name filter\n */\n clearMatrixFilter(): void {\n this.matrixTestFilter = '';\n this.matrixFilterSubject$.next('');\n this.cdr.markForCheck();\n }\n\n getTestResultForRun(runId: string, testId: string): TestResultCell | null {\n const runData = this.matrixData.find(r => r.runId === runId);\n if (!runData) return null;\n return runData.testResults.get(testId) || null;\n }\n\n getMatrixCellClass(result: TestResultCell | null): string {\n if (!result) return 'cell-none cell-not-run';\n switch (result.status) {\n case 'Passed': return 'cell-passed';\n case 'Failed': return 'cell-failed';\n case 'Error': return 'cell-error';\n case 'Timeout': return 'cell-timeout';\n case 'Skipped': return 'cell-skipped cell-not-run';\n case 'Running': return 'cell-running';\n default: return 'cell-pending';\n }\n }\n\n /**\n * Get descriptive tooltip for execution status\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 /**\n * Get the count of enabled evaluation types for matrix cell layout\n */\n getEvalCount(): number {\n let count = 0;\n if (this.evalPreferences.showExecution) count++;\n if (this.evalPreferences.showHuman) count++;\n if (this.evalPreferences.showAuto) count++;\n return count;\n }\n\n // ===========================\n // Matrix Totals Row Methods\n // ===========================\n\n /**\n * Get count of passed tests for a run\n */\n getRunPassedCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.status === 'Passed') count++;\n });\n return count;\n }\n\n /**\n * Get total count of tests for a run\n */\n getRunTotalCount(run: MatrixDataPoint): number {\n return run.testResults.size;\n }\n\n /**\n * Get average human rating for a run (only from tests that have ratings)\n */\n getRunHumanAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) {\n sum += result.humanRating;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with human ratings for a run\n */\n getRunHumanCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.humanRating != null) count++;\n });\n return count;\n }\n\n /**\n * Get average auto score for a run (only from tests that have scores)\n */\n getRunAutoAvg(run: MatrixDataPoint): number | null {\n let sum = 0;\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) {\n sum += result.score;\n count++;\n }\n });\n return count > 0 ? sum / count : null;\n }\n\n /**\n * Get count of tests with auto scores for a run\n */\n getRunAutoCount(run: MatrixDataPoint): number {\n let count = 0;\n run.testResults.forEach(result => {\n if (result.score != null) count++;\n });\n return count;\n }\n\n /**\n * Navigate to a test run when clicking a matrix cell\n */\n openTestRun(testRunId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(testRunId));\n }\n\n /**\n * Handle matrix cell click - navigate to the test run\n */\n onMatrixCellClick(result: TestResultCell | null, event: Event): void {\n event.stopPropagation(); // Prevent row click from also firing\n if (result?.testRunId) {\n this.openTestRun(result.testRunId);\n }\n }\n\n // ===========================\n // D3 Chart Rendering\n // ===========================\n\n /**\n * Renders an interactive heatmap-style chart showing test results across runs\n * with trend lines and better visual hierarchy\n */\n private renderChart(): void {\n if (!this.chartContainer?.nativeElement || this.matrixData.length === 0) {\n return;\n }\n\n const container = this.chartContainer.nativeElement;\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Dynamic sizing based on content and evaluation preferences\n const width = container.clientWidth || 900;\n const evalCount = this.getEvalCount();\n // Adjust row height and column width based on how many eval types are shown\n const rowHeight = evalCount >= 3 ? 34 : evalCount === 2 ? 30 : 28;\n const minColWidth = evalCount >= 3 ? 65 : evalCount === 2 ? 55 : 50;\n const colWidth = Math.min(90, Math.max(minColWidth, (width - 250) / runs.length));\n const margin = { top: 80, right: 40, bottom: 20, left: 220 };\n const chartWidth = runs.length * colWidth;\n const chartHeight = tests.length * rowHeight;\n const height = chartHeight + margin.top + margin.bottom;\n\n // Update container height\n container.style.height = `${Math.max(400, height)}px`;\n\n // Clear previous chart\n d3.select(container).selectAll('*').remove();\n\n // Status colors with better contrast\n const statusColors: Record<string, string> = {\n 'Passed': '#22c55e',\n 'Failed': '#ef4444',\n 'Error': '#f97316',\n 'Skipped': '#a1a1aa',\n 'Running': '#3b82f6',\n 'Pending': '#d1d5db'\n };\n\n // Create SVG\n const svg = d3.select(container)\n .append('svg')\n .attr('width', width)\n .attr('height', height);\n\n // Create tooltip div\n const tooltip = d3.select(container)\n .append('div')\n .attr('class', 'chart-tooltip')\n .style('position', 'absolute')\n .style('opacity', 0)\n .style('background', 'rgba(15, 23, 42, 0.95)')\n .style('color', 'white')\n .style('padding', '10px 14px')\n .style('border-radius', '8px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('z-index', '1000')\n .style('box-shadow', '0 4px 20px rgba(0,0,0,0.3)')\n .style('max-width', '280px');\n\n // Create chart group\n const chart = svg.append('g')\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n // Add gradient definitions for cells\n const defs = svg.append('defs');\n\n // Create gradient for each status\n Object.entries(statusColors).forEach(([status, color]) => {\n const gradient = defs.append('linearGradient')\n .attr('id', `gradient-${status.toLowerCase()}`)\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n gradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', color)\n .attr('stop-opacity', 0.95);\n\n gradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', d3.color(color)?.darker(0.3)?.toString() || color)\n .attr('stop-opacity', 0.95);\n });\n\n // Draw evaluation legend at top-left corner\n this.renderChartLegend(chart, margin);\n\n // Draw column headers (run dates) at top\n runs.forEach((run, i) => {\n const x = i * colWidth + colWidth / 2;\n\n // Date text\n chart.append('text')\n .attr('x', x)\n .attr('y', -45)\n .attr('text-anchor', 'middle')\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text(this.getRelativeTime(run.date))\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Pass rate badge\n const passRateColor = run.passRate >= 80 ? '#22c55e' : run.passRate >= 50 ? '#f97316' : '#ef4444';\n const badgeWidth = 36;\n const badgeHeight = 18;\n\n chart.append('rect')\n .attr('x', x - badgeWidth / 2)\n .attr('y', -35)\n .attr('width', badgeWidth)\n .attr('height', badgeHeight)\n .attr('rx', 9)\n .attr('fill', passRateColor)\n .attr('opacity', 0.15);\n\n chart.append('text')\n .attr('x', x)\n .attr('y', -22)\n .attr('text-anchor', 'middle')\n .attr('fill', passRateColor)\n .attr('font-size', '11px')\n .attr('font-weight', '700')\n .text(`${run.passRate.toFixed(0)}%`);\n\n // Tags indicator - styled pills\n if (run.tags.length > 0) {\n const tagsToShow = run.tags.slice(0, 2);\n const tagPillWidth = 42;\n const tagPillHeight = 14;\n const tagGap = 4;\n const totalTagsWidth = tagsToShow.length * tagPillWidth + (tagsToShow.length - 1) * tagGap;\n const tagStartX = x - totalTagsWidth / 2;\n\n tagsToShow.forEach((tag, tagIndex) => {\n const tagX = tagStartX + tagIndex * (tagPillWidth + tagGap);\n const tagY = -68;\n\n // Pill background with gradient\n chart.append('rect')\n .attr('x', tagX)\n .attr('y', tagY)\n .attr('width', tagPillWidth)\n .attr('height', tagPillHeight)\n .attr('rx', 7)\n .attr('fill', '#dbeafe')\n .attr('stroke', '#93c5fd')\n .attr('stroke-width', 1)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n\n // Tag text\n chart.append('text')\n .attr('x', tagX + tagPillWidth / 2)\n .attr('y', tagY + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#1d4ed8')\n .attr('font-size', '8px')\n .attr('font-weight', '600')\n .text(tag.length > 8 ? tag.substring(0, 7) + '…' : tag)\n .style('cursor', 'pointer')\n .on('click', () => this.openSuiteRun(run.runId));\n });\n\n // Show +N indicator if more tags\n if (run.tags.length > 2) {\n const moreX = tagStartX + tagsToShow.length * (tagPillWidth + tagGap);\n chart.append('text')\n .attr('x', moreX)\n .attr('y', -68 + tagPillHeight / 2 + 3)\n .attr('text-anchor', 'start')\n .attr('fill', '#64748b')\n .attr('font-size', '8px')\n .attr('font-weight', '500')\n .text(`+${run.tags.length - 2}`);\n }\n }\n });\n\n // Draw row labels (test names) on left\n tests.forEach((test, i) => {\n const y = i * rowHeight + rowHeight / 2;\n\n chart.append('text')\n .attr('x', -12)\n .attr('y', y + 4)\n .attr('text-anchor', 'end')\n .attr('fill', '#334155')\n .attr('font-size', '11px')\n .text(test.testName.length > 28 ? test.testName.substring(0, 28) + '...' : test.testName)\n .style('cursor', 'pointer')\n .on('click', () => {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(test.testId));\n })\n .on('mouseover', function() {\n d3.select(this).attr('fill', '#3b82f6').attr('font-weight', '600');\n })\n .on('mouseout', function() {\n d3.select(this).attr('fill', '#334155').attr('font-weight', 'normal');\n });\n });\n\n // Draw grid lines\n tests.forEach((_, i) => {\n chart.append('line')\n .attr('x1', 0)\n .attr('y1', (i + 1) * rowHeight)\n .attr('x2', chartWidth)\n .attr('y2', (i + 1) * rowHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n runs.forEach((_, i) => {\n chart.append('line')\n .attr('x1', (i + 1) * colWidth)\n .attr('y1', 0)\n .attr('x2', (i + 1) * colWidth)\n .attr('y2', chartHeight)\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n });\n\n // Draw cells with evaluation toggle support\n const cellPadding = 3;\n\n runs.forEach((run, runIndex) => {\n tests.forEach((test, testIndex) => {\n const result = run.testResults.get(test.testId);\n const x = runIndex * colWidth + cellPadding;\n const y = testIndex * rowHeight + cellPadding;\n const cellWidth = colWidth - cellPadding * 2;\n const cellHeight = rowHeight - cellPadding * 2;\n\n if (!result) {\n // Empty cell indicator\n chart.append('rect')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', '#f8fafc')\n .attr('stroke', '#e2e8f0')\n .attr('stroke-width', 1);\n\n chart.append('text')\n .attr('x', x + cellWidth / 2)\n .attr('y', y + cellHeight / 2 + 4)\n .attr('text-anchor', 'middle')\n .attr('fill', '#cbd5e1')\n .attr('font-size', '12px')\n .text('—');\n return;\n }\n\n // Build tooltip content based on evaluation preferences\n const tooltipParts: string[] = [];\n if (this.evalPreferences.showExecution) {\n tooltipParts.push(`<div style=\"display:inline-block; padding:2px 8px; border-radius:4px; background:${statusColors[result.status]}; color:white; font-size:11px; font-weight:600\">${result.status}</div>`);\n }\n if (this.evalPreferences.showHuman) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:#f59e0b\">👤</span> <strong>Human:</strong> <span style=\"color:#94a3b8\">Needs review</span></div>`);\n }\n if (this.evalPreferences.showAuto && result.score != null) {\n tooltipParts.push(`<div style=\"margin-top:4px\"><span style=\"color:#3b82f6\">🤖</span> <strong>Auto:</strong> ${(result.score * 100).toFixed(1)}%</div>`);\n }\n const durationText = result.duration != null ? `<div><strong>Duration:</strong> ${result.duration.toFixed(2)}s</div>` : '';\n\n const cellGroup = chart.append('g')\n .attr('class', 'result-cell')\n .style('cursor', 'pointer')\n .on('click', () => this.openTestRun(result.testRunId))\n .on('mouseover', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', '#1e40af')\n .attr('stroke-width', 2);\n\n tooltip\n .style('opacity', 1)\n .html(`\n <div style=\"font-weight:600; margin-bottom:6px; color:#f1f5f9\">${result.testName}</div>\n ${tooltipParts.join('')}\n ${durationText}\n <div style=\"margin-top:6px; color:#94a3b8; font-size:10px\">${this.getRelativeTime(run.date)} • Click to view</div>\n `)\n .style('left', `${event.offsetX + 15}px`)\n .style('top', `${event.offsetY - 10}px`);\n })\n .on('mouseout', (event: MouseEvent) => {\n d3.select(event.currentTarget as Element).select('rect.cell-bg')\n .attr('stroke', 'none')\n .attr('stroke-width', 0);\n tooltip.style('opacity', 0);\n });\n\n // Determine cell background color based on eval preferences\n let cellBgColor = '#f1f5f9';\n let cellBgGradient = '';\n\n if (this.evalPreferences.showExecution) {\n // Use status-based gradient\n cellBgGradient = `url(#gradient-${result.status.toLowerCase()})`;\n } else if (this.evalPreferences.showAuto && result.score != null) {\n // Use score-based color\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n cellBgColor = scoreColor;\n } else {\n // Neutral background when only Human is selected\n cellBgColor = '#fef3c7';\n }\n\n // Cell background\n cellGroup.append('rect')\n .attr('class', 'cell-bg')\n .attr('x', x)\n .attr('y', y)\n .attr('width', cellWidth)\n .attr('height', cellHeight)\n .attr('rx', 4)\n .attr('fill', cellBgGradient || cellBgColor)\n .attr('stroke', 'none')\n .attr('stroke-width', 0)\n .style('transition', 'all 0.15s ease');\n\n // Calculate icon positions based on how many eval types are shown\n // With wider cells, we can use larger icons and better spacing\n const iconSize = evalCount === 1 ? 14 : evalCount === 2 ? 12 : 10;\n const iconSpacing = evalCount === 1 ? 0 : evalCount === 2 ? 16 : 14;\n const startX = x + cellWidth / 2 - ((evalCount - 1) * iconSpacing) / 2;\n\n let iconIndex = 0;\n\n // Status icon (execution)\n if (this.evalPreferences.showExecution) {\n const iconText: Record<string, string> = {\n 'Passed': '✓',\n 'Failed': '✕',\n 'Error': '!',\n 'Skipped': '»',\n 'Running': '●',\n 'Pending': '○'\n };\n\n const iconX = startX + iconIndex * iconSpacing;\n\n // If status is NOT the only thing shown, add a small circular bg\n if (evalCount > 1) {\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', statusColors[result.status])\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', `${iconSize}px`)\n .attr('font-weight', 'bold')\n .attr('font-family', 'system-ui, -apple-system, sans-serif')\n .text(iconText[result.status] || '?');\n\n iconIndex++;\n }\n\n // Human icon\n if (this.evalPreferences.showHuman) {\n const iconX = startX + iconIndex * iconSpacing;\n\n // Human evaluation indicator (clock icon for pending)\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 3)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', `${iconSize - 2}px`)\n .attr('font-weight', '500')\n .text('⏱');\n\n iconIndex++;\n }\n\n // Auto score icon/indicator\n if (this.evalPreferences.showAuto) {\n const iconX = startX + iconIndex * iconSpacing;\n\n if (result.score != null) {\n const scorePercent = Math.round(result.score * 100);\n const scoreColor = result.score >= 0.8 ? '#22c55e' : result.score >= 0.5 ? '#f97316' : '#ef4444';\n\n // Score pill background\n if (evalCount > 1) {\n cellGroup.append('rect')\n .attr('x', iconX - 10)\n .attr('y', y + cellHeight / 2 - iconSize / 2 - 1)\n .attr('width', 20)\n .attr('height', iconSize + 2)\n .attr('rx', (iconSize + 2) / 2)\n .attr('fill', scoreColor)\n .attr('opacity', 0.9);\n }\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', evalCount > 1 ? 'white' : 'white')\n .attr('font-size', `${iconSize - 1}px`)\n .attr('font-weight', '700')\n .text(`${scorePercent}`);\n } else {\n // No auto score available\n cellGroup.append('circle')\n .attr('cx', iconX)\n .attr('cy', y + cellHeight / 2)\n .attr('r', iconSize / 2 + 2)\n .attr('fill', '#e2e8f0')\n .attr('stroke', '#94a3b8')\n .attr('stroke-width', 1);\n\n cellGroup.append('text')\n .attr('x', iconX)\n .attr('y', y + cellHeight / 2 + iconSize / 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#94a3b8')\n .attr('font-size', `${iconSize - 2}px`)\n .text('—');\n }\n }\n });\n });\n\n // Draw trend line for pass rate across runs\n if (runs.length > 1) {\n const trendLineY = chartHeight + 50;\n const trendHeight = 40;\n\n // Trend line label\n chart.append('text')\n .attr('x', -12)\n .attr('y', trendLineY + trendHeight / 2)\n .attr('text-anchor', 'end')\n .attr('fill', '#64748b')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Pass Rate Trend');\n\n // Create trend line path\n const lineGenerator = d3.line<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n // Draw area under line\n const areaGenerator = d3.area<MatrixDataPoint>()\n .x((_, i) => i * colWidth + colWidth / 2)\n .y0(trendLineY + trendHeight)\n .y1(d => trendLineY + trendHeight - (d.passRate / 100) * trendHeight)\n .curve(d3.curveMonotoneX);\n\n chart.append('path')\n .datum(runs)\n .attr('d', areaGenerator)\n .attr('fill', 'url(#trendGradient)')\n .attr('opacity', 0.3);\n\n // Create gradient for trend area\n const trendGradient = defs.append('linearGradient')\n .attr('id', 'trendGradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '0%')\n .attr('y2', '100%');\n\n trendGradient.append('stop')\n .attr('offset', '0%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0.4);\n\n trendGradient.append('stop')\n .attr('offset', '100%')\n .attr('stop-color', '#3b82f6')\n .attr('stop-opacity', 0);\n\n chart.append('path')\n .datum(runs)\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2.5)\n .attr('stroke-linecap', 'round');\n\n // Draw dots on trend line\n runs.forEach((run, i) => {\n const cx = i * colWidth + colWidth / 2;\n const cy = trendLineY + trendHeight - (run.passRate / 100) * trendHeight;\n\n chart.append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', 4)\n .attr('fill', 'white')\n .attr('stroke', '#3b82f6')\n .attr('stroke-width', 2);\n });\n\n // Update container height for trend line\n container.style.height = `${Math.max(400, height + 80)}px`;\n svg.attr('height', height + 80);\n }\n\n this.chartRendered = true;\n }\n\n /**\n * Renders a legend showing which evaluation types are currently displayed\n */\n private renderChartLegend(chart: d3.Selection<SVGGElement, unknown, null, undefined>, margin: { top: number; right: number; bottom: number; left: number }): void {\n const legendGroup = chart.append('g')\n .attr('class', 'eval-legend')\n .attr('transform', `translate(${-margin.left + 10}, ${-margin.top + 15})`);\n\n // Legend title\n legendGroup.append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', '#64748b')\n .attr('font-size', '9px')\n .attr('font-weight', '600')\n .attr('text-transform', 'uppercase')\n .text('SHOWING:');\n\n let xOffset = 55;\n\n // Status indicator\n if (this.evalPreferences.showExecution) {\n const statusGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n statusGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#22c55e');\n\n statusGroup.append('text')\n .attr('x', 6)\n .attr('y', 4)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '8px')\n .attr('font-weight', 'bold')\n .text('✓');\n\n statusGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Status');\n\n xOffset += 60;\n }\n\n // Human indicator\n if (this.evalPreferences.showHuman) {\n const humanGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n humanGroup.append('circle')\n .attr('cx', 6)\n .attr('cy', 0)\n .attr('r', 6)\n .attr('fill', '#fef3c7')\n .attr('stroke', '#f59e0b')\n .attr('stroke-width', 1);\n\n humanGroup.append('text')\n .attr('x', 6)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', '#d97706')\n .attr('font-size', '7px')\n .text('⏱');\n\n humanGroup.append('text')\n .attr('x', 16)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Human');\n\n xOffset += 60;\n }\n\n // Auto indicator\n if (this.evalPreferences.showAuto) {\n const autoGroup = legendGroup.append('g')\n .attr('transform', `translate(${xOffset}, -4)`);\n\n autoGroup.append('rect')\n .attr('x', 0)\n .attr('y', -6)\n .attr('width', 18)\n .attr('height', 12)\n .attr('rx', 6)\n .attr('fill', '#3b82f6');\n\n autoGroup.append('text')\n .attr('x', 9)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('fill', 'white')\n .attr('font-size', '7px')\n .attr('font-weight', '700')\n .text('%');\n\n autoGroup.append('text')\n .attr('x', 24)\n .attr('y', 3)\n .attr('fill', '#475569')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text('Auto');\n }\n }\n\n getAveragePassRate(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.passRate, 0) / data.length;\n }\n\n getTotalRuns(): number {\n return this.getFilteredAnalyticsData().length;\n }\n\n getAverageDuration(): number {\n const data = this.getFilteredAnalyticsData();\n if (data.length === 0) return 0;\n return data.reduce((sum, d) => sum + d.duration, 0) / data.length;\n }\n\n getTotalCost(): number {\n return this.getFilteredAnalyticsData().reduce((sum, d) => sum + d.cost, 0);\n }\n\n getPassRateTrend(): { direction: 'up' | 'down' | 'stable'; value: number } {\n const data = this.getFilteredAnalyticsData();\n if (data.length < 2) return { direction: 'stable', value: 0 };\n\n // Compare recent half to older half\n const midpoint = Math.floor(data.length / 2);\n const recentData = data.slice(0, midpoint);\n const olderData = data.slice(midpoint);\n\n const recentAvg = recentData.reduce((s, d) => s + d.passRate, 0) / recentData.length;\n const olderAvg = olderData.reduce((s, d) => s + d.passRate, 0) / olderData.length;\n\n const diff = recentAvg - olderAvg;\n if (Math.abs(diff) < 1) return { direction: 'stable', value: diff };\n return { direction: diff > 0 ? 'up' : 'down', value: Math.abs(diff) };\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 secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(6)}`;\n if (cost < 1) return `$${cost.toFixed(4)}`;\n return `$${cost.toFixed(2)}`;\n }\n\n // ==========================================\n // Compare Tab Methods\n // ==========================================\n\n async selectCompareRunA(run: MJTestSuiteRunEntity) {\n this.compareRunA = run;\n await this.loadCompareData();\n }\n\n async selectCompareRunB(run: MJTestSuiteRunEntity) {\n this.compareRunB = run;\n await this.loadCompareData();\n }\n\n clearCompareSelection() {\n this.compareRunA = null;\n this.compareRunB = null;\n this.compareResults = [];\n this.compareRunATests = [];\n this.compareRunBTests = [];\n this.cdr.markForCheck();\n }\n\n private async loadCompareData() {\n if (!this.compareRunA || !this.compareRunB) {\n this.compareResults = [];\n this.cdr.markForCheck();\n return;\n }\n\n this.loadingCompare = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n\n // Load test runs for both suite runs in parallel\n const [resultA, resultB] = await Promise.all([\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunA.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.compareRunB.ID}'`,\n OrderBy: 'Sequence ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n this.compareRunATests = resultA.Success ? resultA.Results || [] : [];\n this.compareRunBTests = resultB.Success ? resultB.Results || [] : [];\n\n // Build comparison results\n this.compareResults = this.buildComparisonResults(this.compareRunATests, this.compareRunBTests);\n } catch (error) {\n console.error('Error loading comparison data:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load comparison data', 'error', 3000);\n } finally {\n this.loadingCompare = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildComparisonResults(testsA: MJTestRunEntity[], testsB: MJTestRunEntity[]): TestRunComparison[] {\n const results: TestRunComparison[] = [];\n const testMap = new Map<string, { a?: MJTestRunEntity; b?: MJTestRunEntity; name: string }>();\n\n // Map all tests from run A\n for (const test of testsA) {\n testMap.set(test.TestID, { a: test, name: test.Test || 'Unknown Test' });\n }\n\n // Map all tests from run B\n for (const test of testsB) {\n const existing = testMap.get(test.TestID);\n if (existing) {\n existing.b = test;\n } else {\n testMap.set(test.TestID, { b: test, name: test.Test || 'Unknown Test' });\n }\n }\n\n // Build comparison array\n for (const [testId, { a, b, name }] of testMap) {\n const comparison: TestRunComparison = {\n testId,\n testName: name,\n runA: a ? {\n status: a.Status || 'Unknown',\n score: a.Score,\n duration: a.DurationSeconds,\n cost: a.CostUSD\n } : null,\n runB: b ? {\n status: b.Status || 'Unknown',\n score: b.Score,\n duration: b.DurationSeconds,\n cost: b.CostUSD\n } : null,\n scoreDiff: (a?.Score != null && b?.Score != null) ? b.Score - a.Score : null,\n durationDiff: (a?.DurationSeconds != null && b?.DurationSeconds != null) ? b.DurationSeconds - a.DurationSeconds : null,\n statusChanged: (a?.Status || 'none') !== (b?.Status || 'none')\n };\n results.push(comparison);\n }\n\n return results;\n }\n\n getComparePassRateDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const rateA = this.getPassRate(this.compareRunA);\n const rateB = this.getPassRate(this.compareRunB);\n return rateB - rateA;\n }\n\n getCompareDurationDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const durA = this.compareRunA.TotalDurationSeconds || 0;\n const durB = this.compareRunB.TotalDurationSeconds || 0;\n return durB - durA;\n }\n\n getAbsCompareDurationDiff(): number {\n const diff = this.getCompareDurationDiff();\n return diff != null ? Math.abs(diff) : 0;\n }\n\n getCompareCostDiff(): number | null {\n if (!this.compareRunA || !this.compareRunB) return null;\n const costA = this.compareRunA.TotalCostUSD || 0;\n const costB = this.compareRunB.TotalCostUSD || 0;\n return costB - costA;\n }\n\n getCompareImprovedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status !== 'Passed' && r.runB.status === 'Passed'\n ).length;\n }\n\n getCompareRegressedCount(): number {\n return this.compareResults.filter(r =>\n r.runA && r.runB &&\n r.runA.status === 'Passed' && r.runB.status !== 'Passed'\n ).length;\n }\n\n // ==========================================\n // Excel Export Methods\n // ==========================================\n\n async exportToExcel() {\n try {\n // Ensure runs are loaded\n if (!this.runsLoaded) await this.loadRuns();\n\n const data = this.suiteRuns.map(run => ({\n 'Run ID': run.ID,\n 'Status': run.Status,\n 'Started At': run.StartedAt ? new Date(run.StartedAt).toLocaleString() : 'N/A',\n 'Completed At': run.CompletedAt ? new Date(run.CompletedAt).toLocaleString() : 'N/A',\n 'Duration (s)': run.TotalDurationSeconds?.toFixed(2) || 'N/A',\n 'Total Tests': run.TotalTests || 0,\n 'Passed': run.PassedTests || 0,\n 'Failed': run.FailedTests || 0,\n 'Errors': run.ErrorTests || 0,\n 'Skipped': run.SkippedTests || 0,\n 'Pass Rate (%)': run.TotalTests ? ((run.PassedTests || 0) / run.TotalTests * 100).toFixed(1) : 'N/A',\n 'Total Cost ($)': run.TotalCostUSD?.toFixed(6) || 'N/A',\n 'Tags': TagsHelper.parseTags(run.Tags).join(', ') || 'None',\n 'Environment': run.Environment || 'N/A',\n 'Trigger Type': run.TriggerType || 'N/A',\n 'Run By': run.RunByUser || 'N/A'\n }));\n\n this.downloadAsCSV(data, `${this.record.Name}_runs_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Export successful', 'success', 2000);\n } catch (error) {\n console.error('Export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\n }\n\n private downloadAsCSV(data: Record<string, string | number>[], filename: string) {\n if (data.length === 0) return;\n\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(','),\n ...data.map(row =>\n headers.map(h => {\n const val = row[h];\n // Escape quotes and wrap in quotes if contains comma\n const strVal = String(val);\n if (strVal.includes(',') || strVal.includes('\"') || strVal.includes('\\n')) {\n return `\"${strVal.replace(/\"/g, '\"\"')}\"`;\n }\n return strVal;\n }).join(',')\n )\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 = filename;\n link.click();\n URL.revokeObjectURL(link.href);\n }\n\n getRunTags(run: MJTestSuiteRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n /**\n * Export matrix view data to CSV\n */\n exportMatrixToCSV() {\n if (this.matrixData.length === 0) {\n SharedService.Instance.CreateSimpleNotification('No data to export', 'warning', 2000);\n return;\n }\n\n try {\n const tests = this.getUniqueTestsFromMatrix();\n const runs = this.matrixData;\n\n // Build CSV rows\n const rows: Record<string, string | number>[] = [];\n\n for (const test of tests) {\n const row: Record<string, string | number> = {\n 'Seq': test.sequence,\n 'Test Name': test.testName\n };\n\n // Add column for each run\n for (const run of runs) {\n const result = run.testResults.get(test.testId);\n const runLabel = run.tags.length > 0\n ? `${run.tags.slice(0, 2).join('/')} (${this.getRelativeTime(run.date)})`\n : this.getRelativeTime(run.date);\n\n if (result) {\n // Build cell value based on what's shown\n const parts: string[] = [];\n if (this.evalPreferences.showExecution) parts.push(result.status);\n if (this.evalPreferences.showHuman) parts.push(result.humanRating != null ? `H:${result.humanRating}` : 'H:-');\n if (this.evalPreferences.showAuto) parts.push(result.score != null ? `A:${Math.round(result.score * 100)}%` : 'A:-');\n row[runLabel] = parts.join(' | ');\n } else {\n row[runLabel] = 'Not Run';\n }\n }\n\n rows.push(row);\n }\n\n this.downloadAsCSV(rows, `${this.record.Name}_matrix_export.csv`);\n SharedService.Instance.CreateSimpleNotification('Matrix exported successfully', 'success', 2000);\n } catch (error) {\n console.error('Matrix export failed:', error);\n SharedService.Instance.CreateSimpleNotification('Export failed', 'error', 3000);\n }\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 analytics filters visibility\n */\n toggleFilters(): void {\n this.filtersCollapsed = !this.filtersCollapsed;\n this.cdr.markForCheck();\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 /** Case-insensitive UUID check whether a run is the currently selected Run A (baseline). */\n public IsCompareRunA(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunA?.ID, run.ID);\n }\n\n /** Case-insensitive UUID check whether a run is the currently selected Run B (compare). */\n public IsCompareRunB(run: MJTestSuiteRunEntity): boolean {\n return UUIDsEqual(this.compareRunB?.ID, run.ID);\n }\n}\n\n/**\n * Analytics data point for charting\n */\ninterface AnalyticsDataPoint {\n runId: string;\n date: Date;\n passRate: number;\n totalTests: number;\n passedTests: number;\n failedTests: number;\n errorTests: number;\n skippedTests: number;\n duration: number;\n cost: number;\n tags: string[];\n status: string;\n}\n\n/**\n * Matrix data point for the matrix view - shows test results across suite runs\n */\ninterface MatrixDataPoint {\n runId: string;\n date: Date;\n tags: string[];\n status: string;\n passRate: number;\n testResults: Map<string, TestResultCell>;\n}\n\ninterface TestResultCell {\n testRunId: string;\n testId: string;\n testName: string;\n status: string;\n score: number | null;\n duration: number | null;\n humanRating: number | null;\n humanComments: string | null;\n sequence: number;\n}\n","<div class=\"test-suite-form\">\n <!-- Header Section -->\n <div class=\"suite-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-layer-group\"></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=\"suite-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-info\">\n <h1>{{ record.Name }}</h1>\n <div class=\"suite-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"record.Status === 'Active' ? 'fa-circle-check' : 'fa-circle-pause'\"></i>\n {{ record.Status }}\n </span>\n @if (testsLoaded) {\n <span class=\"test-count\">\n <i class=\"fas fa-flask\"></i>\n {{ suiteTests.length }} tests\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)=\"exportToExcel()\" title=\"Export to CSV\">\n <i class=\"fas fa-file-excel\"></i> Export\n </button>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite\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 @if (record.Description) {\n <div class=\"suite-description\">\n <p>{{ record.Description }}</p>\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> Overview\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'tests'\"\n (click)=\"changeTab('tests')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tests'\">\n <i class=\"fas fa-flask\"></i> Tests\n @if (testsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\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> Runs\n @if (runsLoaded) {\n <span class=\"tab-badge\">{{ suiteRuns.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> Analytics\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'compare'\"\n (click)=\"changeTab('compare')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'compare'\">\n <i class=\"fas fa-balance-scale\"></i> Compare\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 <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Suite 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\">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\">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 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>\n </div>\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>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\">Default timeout for tests in this suite</span>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Tests Tab -->\n @if (activeTab === 'tests') {\n <div class=\"tests-tab\">\n <!-- Loading State -->\n @if (loadingTests) {\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-sequence\"></div>\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 <!-- Tests List -->\n @if (!loadingTests && suiteTests.length > 0) {\n <div class=\"tests-list\">\n @for (test of suiteTests; track test) {\n <div class=\"test-item\" (click)=\"openTest(test.TestID)\">\n <div class=\"test-sequence\">{{ test.Sequence }}</div>\n <div class=\"test-icon\"><i class=\"fas fa-flask\"></i></div>\n <div class=\"test-content\">\n <div class=\"test-name\">{{ test.Test }}</div>\n <div class=\"test-status\">\n @if (test.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ test.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 (testsLoaded && !loadingTests && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <h4>No Tests in Suite</h4>\n <p>Add tests to this suite to start running them together.</p>\n </div>\n }\n </div>\n }\n\n <!-- 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]; 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 && suiteRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-item\" (click)=\"openSuiteRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Completed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></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.TotalTests) {\n <span>\n <i class=\"fas fa-check-circle\"></i> {{ run.PassedTests }}/{{ run.TotalTests }}\n ({{ getPassRate(run).toFixed(0) }}%)\n </span>\n }\n </div>\n <!-- Evaluation metrics row -->\n <div class=\"run-eval-metrics\">\n <!-- Status badge -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-metric status\" [class]=\"'status-' + run.Status.toLowerCase()\">\n <i class=\"fas\"\n [class.fa-circle-check]=\"run.Status === 'Completed'\"\n [class.fa-circle-xmark]=\"run.Status === 'Failed'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-ban]=\"run.Status === 'Cancelled'\"></i>\n </span>\n }\n <!-- Human score (placeholder - need avg from suite run) -->\n @if (evalPreferences.showHuman) {\n <span class=\"eval-metric human\" title=\"Human evaluation\">\n <i class=\"fas fa-user\"></i>\n <span class=\"eval-pending\"><i class=\"fas fa-clock\"></i></span>\n </span>\n }\n <!-- Auto score (pass rate as proxy) -->\n @if (evalPreferences.showAuto && run.TotalTests) {\n <span class=\"eval-metric auto\"\n [class.high]=\"getPassRate(run) >= 80\"\n [class.medium]=\"getPassRate(run) >= 50 && getPassRate(run) < 80\"\n [class.low]=\"getPassRate(run) < 50\"\n title=\"Auto score (pass rate)\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ getPassRate(run).toFixed(0) }}%</span>\n </span>\n }\n </div>\n <!-- Tags display -->\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run); track tag) {\n <span class=\"tag-chip\">{{ tag }}</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 (runsLoaded && !loadingRuns && suiteRuns.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 Suite Runs Yet</h4>\n <p>Run this suite to see execution history and results here.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"analytics-tab\">\n <!-- Loading State -->\n @if (loadingAnalytics) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading analytics data...\"></mj-loading>\n </div>\n }\n @if (!loadingAnalytics && analyticsLoaded) {\n <!-- View Toggle Sub-nav -->\n <div class=\"analytics-subnav\">\n <div class=\"subnav-tabs\">\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'summary'\"\n (click)=\"setAnalyticsView('summary')\">\n <i class=\"fas fa-chart-bar\"></i>\n <span>Summary</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'matrix'\"\n (click)=\"setAnalyticsView('matrix')\">\n <i class=\"fas fa-th\"></i>\n <span>Matrix</span>\n </button>\n <button class=\"subnav-tab\"\n [class.active]=\"analyticsView === 'chart'\"\n (click)=\"setAnalyticsView('chart')\">\n <i class=\"fas fa-project-diagram\"></i>\n <span>Chart</span>\n </button>\n </div>\n </div>\n <!-- Collapsible Filters (shared by both views) -->\n <div class=\"analytics-filters\" [class.collapsed]=\"filtersCollapsed\">\n <div class=\"filters-header\" (click)=\"toggleFilters()\">\n <span class=\"filters-title\">\n <i class=\"fas fa-filter\"></i>\n Filters\n @if (filtersCollapsed) {\n <span class=\"filter-summary\">\n {{ analyticsTimeRange === 'all' ? 'All Time' : analyticsTimeRange }}\n @if (selectedTags.length > 0) {\n <span> · {{ selectedTags.length }} tags</span>\n }\n </span>\n }\n </span>\n <i class=\"fas\" [ngClass]=\"filtersCollapsed ? 'fa-chevron-down' : 'fa-chevron-up'\"></i>\n </div>\n @if (!filtersCollapsed) {\n <div class=\"filters-content\">\n <div class=\"filter-group\">\n <label>Time Range</label>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '7d'\" (click)=\"setTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '30d'\" (click)=\"setTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === '90d'\" (click)=\"setTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\" [class.active]=\"analyticsTimeRange === 'all'\" (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n @if (uniqueTags.length > 0) {\n <div class=\"filter-group\">\n <label>Filter by Tag @if (selectedTags.length > 0) {\n <span class=\"filter-hint\">({{ selectedTags.length }} selected)</span>\n }</label>\n <div class=\"filter-buttons tag-filters\">\n <button class=\"filter-btn tag-btn all-tags-btn\"\n [class.active]=\"selectedTags.length === 0\"\n (click)=\"toggleTagFilter(null)\">\n <i class=\"fas fa-layer-group\"></i> All Tags\n </button>\n @for (tag of uniqueTags; track tag) {\n <button class=\"filter-btn tag-btn\"\n [class.active]=\"isTagSelected(tag)\"\n (click)=\"toggleTagFilter(tag)\">\n @if (isTagSelected(tag)) {\n <i class=\"fas fa-check\"></i>\n }\n {{ tag }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n <!-- Summary View -->\n @if (analyticsView === 'summary') {\n <!-- KPI Cards -->\n <div class=\"analytics-kpis\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\"><i class=\"fas fa-play-circle\"></i></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 <div class=\"kpi-card\">\n <div class=\"kpi-icon success\"><i class=\"fas fa-check-circle\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getAveragePassRate().toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Pass Rate</div>\n <div class=\"kpi-trend\" [ngClass]=\"{'trend-up': getPassRateTrend().direction === 'up', 'trend-down': getPassRateTrend().direction === 'down'}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getPassRateTrend().direction === 'up', 'fa-arrow-down': getPassRateTrend().direction === 'down', 'fa-minus': getPassRateTrend().direction === 'stable'}\"></i>\n {{ getPassRateTrend().value.toFixed(1) }}%\n </div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon info\"><i class=\"fas fa-clock\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getAverageDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon warning\"><i class=\"fas fa-dollar-sign\"></i></div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getTotalCost()) }}</div>\n <div class=\"kpi-label\">Total Cost</div>\n </div>\n </div>\n </div>\n <!-- Runs Table -->\n <div class=\"analytics-table-section\">\n <h3><i class=\"fas fa-table\"></i> Run History</h3>\n <div class=\"analytics-table-wrapper\">\n <table class=\"analytics-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Status</th>\n <th>Pass Rate</th>\n <th>Tests</th>\n <th>Duration</th>\n <th>Cost</th>\n <th>Tags</th>\n </tr>\n </thead>\n <tbody>\n @for (dp of getFilteredAnalyticsData(); track dp) {\n <tr (click)=\"openSuiteRun(dp.runId)\" class=\"clickable-row\">\n <td>{{ dp.date | date:'short' }}</td>\n <td>\n <span class=\"status-chip\" [ngClass]=\"'status-' + dp.status.toLowerCase()\">{{ dp.status }}</span>\n </td>\n <td>\n <div class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\" [style.width.%]=\"dp.passRate\" [ngClass]=\"{'high': dp.passRate >= 80, 'medium': dp.passRate >= 50 && dp.passRate < 80, 'low': dp.passRate < 50}\"></div>\n <span>{{ dp.passRate.toFixed(0) }}%</span>\n </div>\n </td>\n <td>{{ dp.passedTests }}/{{ dp.totalTests }}</td>\n <td>{{ formatDuration(dp.duration) }}</td>\n <td>{{ formatCost(dp.cost) }}</td>\n <td>\n <div class=\"tag-cell\">\n @for (tag of dp.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-table\">{{ tag }}</span>\n }\n @if (dp.tags.length > 2) {\n <span class=\"tag-more\">+{{ dp.tags.length - 2 }}</span>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (getFilteredAnalyticsData().length === 0) {\n <div class=\"empty-state small\">\n <p>No runs match the current filters.</p>\n </div>\n }\n </div>\n }\n <!-- Matrix View -->\n @if (analyticsView === 'matrix') {\n <!-- Loading Matrix -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading test matrix...\"></mj-loading>\n </div>\n }\n <!-- Matrix Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"matrix-section\">\n <div class=\"matrix-header\">\n <h3><i class=\"fas fa-th\"></i> Test Results Matrix</h3>\n <div class=\"matrix-header-right\">\n <div class=\"matrix-filter-input\">\n <i class=\"fas fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Filter tests...\"\n [value]=\"matrixTestFilter\"\n (input)=\"onMatrixFilterInput($event)\"\n class=\"filter-input\">\n @if (matrixTestFilter) {\n <button class=\"clear-filter-btn\" (click)=\"clearMatrixFilter()\" title=\"Clear filter\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n <span class=\"matrix-run-count\">{{ matrixData.length }} runs · {{ getUniqueTestsFromMatrix().length }} tests</span>\n <button mjButton (click)=\"exportMatrixToCSV()\" [disabled]=\"matrixData.length === 0\" title=\"Export matrix to CSV\">\n <i class=\"fas fa-download\"></i> Export\n </button>\n </div>\n </div>\n <div class=\"matrix-scroll-container\">\n <table class=\"test-matrix\">\n <thead>\n <tr>\n <th class=\"seq-header\" (click)=\"toggleMatrixSort('sequence')\" title=\"Sort by sequence\">\n #\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'sequence' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n <th class=\"test-name-header\" (click)=\"toggleMatrixSort('name')\" title=\"Sort by name\">\n Test\n <i class=\"fas\" [ngClass]=\"matrixSortBy === 'name' ? (matrixSortAsc ? 'fa-sort-up' : 'fa-sort-down') : 'fa-sort'\"></i>\n </th>\n @for (run of matrixData; track run) {\n <th class=\"run-header\" (click)=\"openSuiteRun(run.runId)\" [title]=\"'Click to view suite run - ' + (run.date | date:'medium')\">\n <div class=\"run-header-content\">\n @if (run.tags.length > 0) {\n <div class=\"run-tags-header\">\n @for (tag of run.tags.slice(0, 2); track tag) {\n <span class=\"tag-chip-header\">{{ tag }}</span>\n }\n @if (run.tags.length > 2) {\n <span class=\"tag-more-header\">+{{ run.tags.length - 2 }}</span>\n }\n </div>\n }\n <div class=\"run-date\">{{ getRelativeTime(run.date) }}</div>\n <div class=\"run-pass-rate\" [ngClass]=\"{'high': run.passRate >= 80, 'medium': run.passRate >= 50 && run.passRate < 80, 'low': run.passRate < 50}\">\n {{ run.passRate.toFixed(0) }}%\n </div>\n </div>\n </th>\n }\n <th class=\"spacer-header\"></th>\n </tr>\n </thead>\n <tbody>\n @for (test of getUniqueTestsFromMatrix(); track test) {\n <tr\n [class.row-selected]=\"selectedMatrixTestId === test.testId\"\n (click)=\"selectMatrixRow(test.testId)\">\n <td class=\"seq-cell\">{{ test.sequence }}</td>\n <td class=\"test-name-cell\">\n <span class=\"test-name\" [title]=\"test.testName\">{{ test.testName }}</span>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell\"\n [ngClass]=\"getMatrixCellClass(getTestResultForRun(run.runId, test.testId))\"\n [class.clickable]=\"getTestResultForRun(run.runId, test.testId)\"\n [class.cell-not-run]=\"!getTestResultForRun(run.runId, test.testId)\"\n [title]=\"getTestResultForRun(run.runId, test.testId)?.status + ' - Click to view test run' || 'Not Run'\"\n (click)=\"onMatrixCellClick(getTestResultForRun(run.runId, test.testId), $event)\">\n @if (getTestResultForRun(run.runId, test.testId); as result) {\n <div class=\"cell-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"cell-status\"\n [ngClass]=\"'status-' + result.status.toLowerCase()\"\n [class.cell-skipped-status]=\"result.status === 'Skipped' || result.status === 'Pending'\"\n [title]=\"getStatusTooltip(result.status)\">\n <i class=\"fas\"\n [class.fa-check]=\"result.status === 'Passed'\"\n [class.fa-times]=\"result.status === 'Failed'\"\n [class.fa-exclamation]=\"result.status === 'Error'\"\n [class.fa-hourglass-end]=\"result.status === 'Timeout'\"\n [class.fa-forward]=\"result.status === 'Skipped'\"\n [class.fa-spinner]=\"result.status === 'Running'\"\n [class.fa-clock]=\"result.status === 'Pending'\"></i>\n </span>\n }\n <!-- Human score - slashed icon if no feedback, colored by rating if has feedback -->\n @if (evalPreferences.showHuman && !result.humanRating) {\n <span class=\"cell-human no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (evalPreferences.showHuman && result.humanRating) {\n <span class=\"cell-human has-feedback\"\n [class.rating-low]=\"result.humanRating <= 4\"\n [class.rating-medium]=\"result.humanRating >= 5 && result.humanRating <= 6\"\n [class.rating-good]=\"result.humanRating >= 7 && result.humanRating <= 8\"\n [class.rating-excellent]=\"result.humanRating >= 9\"\n [title]=\"getHumanTooltip(result.humanRating, result.humanComments)\">\n <i class=\"fas fa-user\"></i>\n <span class=\"rating-value\">{{ result.humanRating }}</span>\n </span>\n }\n <!-- Auto score - colored by percentage -->\n @if (evalPreferences.showAuto && result.score != null) {\n <span class=\"cell-auto has-score\"\n [class.score-low]=\"result.score < 0.5\"\n [class.score-medium]=\"result.score >= 0.5 && result.score < 0.7\"\n [class.score-good]=\"result.score >= 0.7 && result.score < 0.85\"\n [class.score-excellent]=\"result.score >= 0.85\"\n [title]=\"'Auto Score: ' + (result.score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span class=\"score-value\">{{ (result.score * 100).toFixed(0) }}</span>\n </span>\n }\n @if (evalPreferences.showAuto && result.score == null) {\n <span class=\"cell-auto no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n </div>\n }\n @if (!getTestResultForRun(run.runId, test.testId)) {\n <span class=\"cell-not-run-indicator\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n }\n </tbody>\n <!-- Footer row with totals -->\n <tfoot>\n <tr class=\"totals-row\">\n <td class=\"seq-cell totals-label\"></td>\n <td class=\"test-name-cell totals-label\">\n <strong>Totals</strong>\n </td>\n @for (run of matrixData; track run) {\n <td class=\"result-cell totals-cell\">\n <div class=\"cell-eval-stack totals-stack\">\n <!-- Status totals -->\n @if (evalPreferences.showExecution) {\n <span class=\"totals-status\">\n <span class=\"pass-count\">{{ getRunPassedCount(run) }}/{{ getRunTotalCount(run) }}</span>\n </span>\n }\n <!-- Human totals -->\n @if (evalPreferences.showHuman) {\n <span class=\"totals-human\">\n @if (getRunHumanAvg(run) != null) {\n <span class=\"avg-label\">{{ getRunHumanAvg(run)?.toFixed(1) }}</span>\n }\n <span class=\"count-label\">({{ getRunHumanCount(run) }})</span>\n </span>\n }\n <!-- Auto totals -->\n @if (evalPreferences.showAuto) {\n <span class=\"totals-auto\">\n @if (getRunAutoAvg(run) != null) {\n <span class=\"avg-label\">{{ (getRunAutoAvg(run)! * 100).toFixed(0) }}%</span>\n }\n <span class=\"count-label\">({{ getRunAutoCount(run) }})</span>\n </span>\n }\n </div>\n </td>\n }\n <td class=\"spacer-cell\"></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n }\n <!-- Empty Matrix State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-th\"></i>\n </div>\n <h4>No Matrix Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n <!-- Chart View -->\n @if (analyticsView === 'chart') {\n <!-- Loading Chart -->\n @if (loadingMatrix) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading chart data...\"></mj-loading>\n </div>\n }\n <!-- Chart Content -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length > 0) {\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h3><i class=\"fas fa-project-diagram\"></i> Test Results Flow</h3>\n <div class=\"chart-legend\">\n <span class=\"legend-item chart-passed\"><i class=\"fas fa-check\"></i> Passed</span>\n <span class=\"legend-item chart-failed\"><i class=\"fas fa-times\"></i> Failed</span>\n <span class=\"legend-item chart-error\"><i class=\"fas fa-exclamation\"></i> Error</span>\n <span class=\"legend-item chart-skipped\"><i class=\"fas fa-forward\"></i> Skipped</span>\n </div>\n </div>\n <div class=\"chart-container\">\n <div #chartContainer class=\"d3-chart\"></div>\n </div>\n <div class=\"chart-info\">\n <i class=\"fas fa-info-circle\"></i>\n Interactive visualization showing test results across {{ matrixData.length }} runs.\n Hover over elements for details, click nodes to navigate.\n </div>\n </div>\n }\n <!-- Empty Chart State -->\n @if (!loadingMatrix && matrixLoaded && matrixData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-project-diagram\"></i>\n </div>\n <h4>No Chart Data</h4>\n <p>No suite runs match the current filters.</p>\n </div>\n }\n }\n }\n <!-- Empty State -->\n @if (!loadingAnalytics && analyticsLoaded && analyticsData.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 Analytics Data</h4>\n <p>Run this suite to start collecting analytics data.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Compare Tab -->\n @if (activeTab === 'compare') {\n <div class=\"compare-tab\">\n <!-- Run Selection -->\n <div class=\"compare-selection\">\n <div class=\"compare-run-selector\">\n <h4>Run A (Baseline)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunA(run)\"\n (click)=\"selectCompareRunA(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunA) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunA = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunA.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunA).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n <div class=\"compare-vs\"><i class=\"fas fa-exchange-alt\"></i></div>\n <div class=\"compare-run-selector\">\n <h4>Run B (Compare)</h4>\n @if (!loadingRuns && suiteRuns.length > 0) {\n <div class=\"run-selector-list\">\n @for (run of suiteRuns; track run) {\n <div class=\"run-selector-item\"\n [class.selected]=\"IsCompareRunB(run)\"\n [class.disabled]=\"IsCompareRunA(run)\"\n (click)=\"!IsCompareRunA(run) && selectCompareRunB(run)\">\n <div class=\"selector-status\" [style.background-color]=\"getRunStatusColor(run.Status)\"></div>\n <div class=\"selector-content\">\n <div class=\"selector-date\">{{ run.StartedAt | date:'short' }}</div>\n <div class=\"selector-rate\">{{ getPassRate(run).toFixed(0) }}% pass</div>\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"selector-tags\">\n @for (tag of getRunTags(run).slice(0, 2); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n @if (compareRunB) {\n <div class=\"selected-run-preview\">\n <div class=\"preview-header\">\n <span class=\"preview-label\">Selected:</span>\n <button class=\"clear-btn\" (click)=\"compareRunB = null; compareResults = []\">Clear</button>\n </div>\n <div class=\"preview-details\">\n <span>{{ compareRunB.StartedAt | date:'medium' }}</span>\n <span class=\"preview-rate\">{{ getPassRate(compareRunB).toFixed(1) }}%</span>\n </div>\n </div>\n }\n </div>\n </div>\n <!-- Comparison Results -->\n @if (compareRunA && compareRunB && !loadingCompare) {\n <div class=\"compare-results\">\n <!-- Summary Cards -->\n <div class=\"compare-summary\">\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Pass Rate Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getComparePassRateDiff()! > 0, 'negative': getComparePassRateDiff()! < 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-up': getComparePassRateDiff()! > 0, 'fa-arrow-down': getComparePassRateDiff()! < 0, 'fa-minus': getComparePassRateDiff() === 0}\"></i>\n {{ getComparePassRateDiff()! > 0 ? '+' : '' }}{{ getComparePassRateDiff()?.toFixed(1) }}%\n </div>\n </div>\n <div class=\"compare-summary-card\">\n <div class=\"summary-label\">Duration Change</div>\n <div class=\"summary-value\" [ngClass]=\"{'positive': getCompareDurationDiff()! < 0, 'negative': getCompareDurationDiff()! > 0}\">\n <i class=\"fas\" [ngClass]=\"{'fa-arrow-down': getCompareDurationDiff()! < 0, 'fa-arrow-up': getCompareDurationDiff()! > 0, 'fa-minus': getCompareDurationDiff() === 0}\"></i>\n {{ formatDuration(getAbsCompareDurationDiff()) }}\n </div>\n </div>\n <div class=\"compare-summary-card improved\">\n <div class=\"summary-label\">Improved</div>\n <div class=\"summary-value\">{{ getCompareImprovedCount() }}</div>\n </div>\n <div class=\"compare-summary-card regressed\">\n <div class=\"summary-label\">Regressed</div>\n <div class=\"summary-value\">{{ getCompareRegressedCount() }}</div>\n </div>\n </div>\n <!-- Detailed Comparison Table -->\n <div class=\"compare-table-section\">\n <h3><i class=\"fas fa-list\"></i> Test-by-Test Comparison</h3>\n <div class=\"compare-table-wrapper\">\n <table class=\"compare-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Run A Status</th>\n <th>Run B Status</th>\n <th>Score Diff</th>\n <th>Duration Diff</th>\n <th>Change</th>\n </tr>\n </thead>\n <tbody>\n @for (result of compareResults; track result) {\n <tr [ngClass]=\"{'improved': result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed', 'regressed': result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed'}\">\n <td class=\"test-name-cell\">{{ result.testName }}</td>\n <td>\n @if (result.runA) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runA.status.toLowerCase()\">{{ result.runA.status }}</span>\n }\n @if (!result.runA) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.runB) {\n <span class=\"status-chip\" [ngClass]=\"'status-' + result.runB.status.toLowerCase()\">{{ result.runB.status }}</span>\n }\n @if (!result.runB) {\n <span class=\"status-chip status-missing\">N/A</span>\n }\n </td>\n <td>\n @if (result.scoreDiff != null) {\n <span [ngClass]=\"{'positive': result.scoreDiff > 0, 'negative': result.scoreDiff < 0}\">\n {{ result.scoreDiff > 0 ? '+' : '' }}{{ (result.scoreDiff * 100).toFixed(1) }}%\n </span>\n }\n @if (result.scoreDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.durationDiff != null) {\n <span [ngClass]=\"{'positive': result.durationDiff < 0, 'negative': result.durationDiff > 0}\">\n {{ result.durationDiff > 0 ? '+' : '' }}{{ result.durationDiff.toFixed(1) }}s\n </span>\n }\n @if (result.durationDiff == null) {\n <span class=\"muted\">-</span>\n }\n </td>\n <td>\n @if (result.runA && result.runB && result.runA.status !== 'Passed' && result.runB.status === 'Passed') {\n <span class=\"change-indicator improved\">\n <i class=\"fas fa-arrow-up\"></i> Fixed\n </span>\n }\n @if (result.runA && result.runB && result.runA.status === 'Passed' && result.runB.status !== 'Passed') {\n <span class=\"change-indicator regressed\">\n <i class=\"fas fa-arrow-down\"></i> Broke\n </span>\n }\n @if (!result.statusChanged) {\n <span class=\"change-indicator unchanged\">\n <i class=\"fas fa-minus\"></i>\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n }\n <!-- Loading State for Compare -->\n @if (loadingCompare) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading comparison data...\"></mj-loading>\n </div>\n }\n <!-- Empty State -->\n @if (!compareRunA || !compareRunB) {\n <div class=\"compare-empty\">\n <div class=\"compare-empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Select Two Runs to Compare</h4>\n <p>Choose a baseline run (A) and a comparison run (B) from the lists above to see a detailed side-by-side comparison.</p>\n </div>\n }\n <!-- No Runs State -->\n @if (runsLoaded && suiteRuns.length < 2) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-balance-scale\"></i>\n </div>\n <h4>Not Enough Runs to Compare</h4>\n <p>You need at least 2 suite runs to use the comparison feature.</p>\n <button mjButton (click)=\"runSuite()\" variant=\"primary\">\n <i class=\"fas fa-play\"></i> Run Suite Now\n </button>\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 Suite</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 Suite Execution -->\n @if (testingDialogService.IsPanelOpen) {\n <mj-slide-panel\n Mode=\"slide\"\n [Title]=\"testingDialogService.PanelOptions?.suiteId ? 'Suite Execution' : 'Run Suite'\"\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 ?? 'suite'\"\n (PanelClose)=\"OnPanelClosed()\">\n </app-test-run-dialog>\n </mj-slide-panel>\n }\n</div>\n"]}