@memberjunction/ng-core-entity-forms 5.21.0 → 5.22.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.
@@ -1 +1 @@
1
- {"version":3,"file":"test-suite-run-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-suite-run-form.component.ts","../../../../src/lib/custom/Tests/test-suite-run-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, ViewContainerRef, inject } from '@angular/core';\nimport { Subject, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestSuiteRunEntity, MJTestSuiteEntity, MJTestRunEntity, MJTestRunFeedbackEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestSuiteRunFormComponent } from '../../generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n EvaluationPreferencesService,\n EvaluationPreferences,\n EvaluationMetrics,\n TestRunWithFeedback,\n calculateEvaluationMetrics,\n normalizeExecutionStatus,\n getNeedsReviewItems,\n NeedsReviewItem\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 Suite Runs')\n@Component({\n standalone: false,\n selector: 'mj-test-suite-run-form',\n templateUrl: './test-suite-run-form.component.html',\n styleUrls: ['./test-suite-run-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestSuiteRunFormComponentExtended extends MJTestSuiteRunFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestSuiteRunEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingTestRuns = false;\n loadingFeedbacks = false;\n error: string | null = null;\n testRunsLoaded = false;\n feedbacksLoaded = false;\n isRefreshing = false;\n autoRefreshEnabled = false;\n\n // Related entities\n testSuite: MJTestSuiteEntity | null = null;\n testRuns: MJTestRunEntity[] = [];\n feedbacks: Map<string, MJTestRunFeedbackEntity> = new Map();\n\n // Tags\n tags: string[] = [];\n newTag = '';\n editingTags = false;\n savingTags = false;\n\n // Inline feedback\n expandedRunId: string | null = null;\n inlineRating: number = 0;\n inlineHoverRating: number = 0;\n inlineIsCorrect: boolean | null = null;\n inlineComments: string = '';\n savingInlineFeedback = false;\n\n // Filter for test runs\n runStatusFilter: string | null = null;\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 system\n evalPreferences: EvaluationPreferences = {\n showExecution: true,\n showHuman: true,\n showAuto: false\n };\n testRunsWithFeedback: TestRunWithFeedback[] = [];\n evaluationMetrics: EvaluationMetrics | null = null;\n needsReviewItems: NeedsReviewItem[] = [];\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 });\n\n if (this.record && this.record.ID) {\n await this.loadRelatedData();\n this.parseTags();\n\n // Auto-refresh for running suite executions\n if (this.record.Status === 'Running' || this.record.Status === 'Pending') {\n this.startAutoRefresh();\n }\n }\n }\n\n private parseTags(): void {\n this.tags = TagsHelper.parseTags(this.record.Tags);\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 + Shift + R: Re-run suite\n if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === 'r') {\n event.preventDefault();\n this.reRunSuite();\n return;\n }\n\n // Number keys for tabs (1-4)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('runs'); break;\n case '3': this.changeTab('details'); break;\n case '4': this.changeTab('analytics'); break;\n }\n }\n }\n\n private startAutoRefresh() {\n this.autoRefreshEnabled = true;\n interval(5000)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.autoRefreshEnabled && (this.record.Status === 'Running' || this.record.Status === 'Pending')) {\n this.silentRefresh();\n } else {\n this.autoRefreshEnabled = false;\n }\n });\n }\n\n private async silentRefresh() {\n try {\n await this.record.Load(this.record.ID);\n this.cdr.markForCheck();\n } catch {\n // Silently fail on auto-refresh\n }\n }\n\n private async loadRelatedData() {\n this.loading = true;\n this.error = null;\n\n try {\n // Load test suite\n if (this.record.SuiteID) {\n const md = new Metadata();\n const suite = await md.GetEntityObject<MJTestSuiteEntity>('MJ: Test Suites');\n if (suite && await suite.Load(this.record.SuiteID)) {\n this.testSuite = suite;\n }\n }\n\n this.cdr.markForCheck();\n } catch (error) {\n console.error('Error loading related data:', error);\n this.error = 'Failed to load related data. Click to retry.';\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n async retryLoad() {\n this.error = null;\n await this.loadRelatedData();\n }\n\n private async loadTestRuns() {\n if (this.testRunsLoaded) return;\n\n this.loadingTestRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.record.ID}'`,\n OrderBy: 'Sequence ASC, StartedAt ASC',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.testRuns = result.Results || [];\n }\n\n this.testRunsLoaded = true;\n\n // Also load feedbacks for these runs\n if (this.testRuns.length > 0) {\n await this.loadFeedbacks();\n }\n } catch (error) {\n console.error('Error loading test runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test runs', 'error', 3000);\n } finally {\n this.loadingTestRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if ((tab === 'runs' || tab === 'analytics') && !this.testRunsLoaded) {\n this.loadTestRuns();\n }\n\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.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 getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Completed': return 'fa-check-circle';\n case 'Failed': return 'fa-times-circle';\n case 'Running': return 'fa-circle-notch fa-spin';\n case 'Pending': return 'fa-hourglass-half';\n case 'Cancelled': return 'fa-ban';\n default: return 'fa-question-circle';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n calculateDuration(): string {\n if (!this.record.TotalDurationSeconds) return 'N/A';\n\n const seconds = this.record.TotalDurationSeconds;\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${mins}m`;\n }\n\n formatCost(cost: number | null): string {\n if (cost === null || cost === undefined) return 'N/A';\n return `$${cost.toFixed(6)}`;\n }\n\n getPassRate(): number {\n const total = this.record.TotalTests || 0;\n const passed = this.record.PassedTests || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\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 navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n openTestSuite() {\n if (this.testSuite) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(this.testSuite.ID));\n }\n }\n\n openTestRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(runId));\n }\n\n async reRunSuite() {\n if (!this.record.SuiteID) {\n SharedService.Instance.CreateSimpleNotification('Cannot re-run: Suite ID not available', 'error', 3000);\n return;\n }\n\n this.testingDialogService.OpenSuiteDialog(this.record.SuiteID, this.viewContainerRef);\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 await this.loadRelatedData();\n\n // Reset lazy-loaded data\n if (this.testRunsLoaded) {\n this.testRunsLoaded = false;\n this.testRuns = [];\n await this.loadTestRuns();\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 getRunStatusColor(status: string): string {\n switch (status) {\n case 'Passed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Error': return '#f59e0b';\n case 'Timeout': return '#f97316';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n case 'Skipped': return '#6b7280';\n default: return '#9ca3af';\n }\n }\n\n getRunStatusIcon(status: string): string {\n switch (status) {\n case 'Passed': return 'fa-check';\n case 'Failed': return 'fa-times';\n case 'Error': return 'fa-exclamation';\n case 'Timeout': return 'fa-clock';\n case 'Running': return 'fa-circle-notch fa-spin';\n case 'Pending': return 'fa-hourglass-half';\n case 'Skipped': return 'fa-forward';\n default: return 'fa-question';\n }\n }\n\n // ===========================\n // Tag Management\n // ===========================\n\n startEditingTags(): void {\n this.editingTags = true;\n this.cdr.markForCheck();\n }\n\n cancelEditingTags(): void {\n this.editingTags = false;\n this.newTag = '';\n this.parseTags(); // Reset to original\n this.cdr.markForCheck();\n }\n\n addTag(): void {\n const tag = this.newTag.trim();\n if (tag && !this.tags.includes(tag)) {\n this.tags = [...this.tags, tag];\n this.newTag = '';\n this.cdr.markForCheck();\n }\n }\n\n removeTag(tag: string): void {\n this.tags = this.tags.filter(t => t !== tag);\n this.cdr.markForCheck();\n }\n\n async saveTags(): Promise<void> {\n // Auto-add any pending tag in the input before saving\n const pendingTag = this.newTag.trim();\n if (pendingTag && !this.tags.includes(pendingTag)) {\n this.tags = [...this.tags, pendingTag];\n this.newTag = '';\n }\n\n this.savingTags = true;\n this.cdr.markForCheck();\n\n try {\n this.record.Tags = TagsHelper.toJson(this.tags);\n const result = await this.record.Save();\n\n if (result) {\n this.editingTags = false;\n SharedService.Instance.CreateSimpleNotification('Tags saved successfully', 'success', 2000);\n } else {\n SharedService.Instance.CreateSimpleNotification(\n this.record.LatestResult?.Message || 'Failed to save tags',\n 'error',\n 3000\n );\n }\n } catch (error) {\n SharedService.Instance.CreateSimpleNotification('Failed to save tags', 'error', 3000);\n } finally {\n this.savingTags = false;\n this.cdr.markForCheck();\n }\n }\n\n // ===========================\n // Test Run Filtering\n // ===========================\n\n setRunStatusFilter(status: string | null): void {\n this.runStatusFilter = status;\n this.cdr.markForCheck();\n }\n\n getFilteredTestRuns(): MJTestRunEntity[] {\n if (!this.runStatusFilter) return this.testRuns;\n return this.testRuns.filter(run => run.Status === this.runStatusFilter);\n }\n\n getRunCountByStatus(status: string): number {\n return this.testRuns.filter(run => run.Status === status).length;\n }\n\n // ===========================\n // Inline Feedback\n // ===========================\n\n private async loadFeedbacks(): Promise<void> {\n if (this.feedbacksLoaded) return;\n\n this.loadingFeedbacks = true;\n this.cdr.markForCheck();\n\n try {\n const testRunIds = this.testRuns.map(r => `'${r.ID}'`).join(',');\n if (!testRunIds) return;\n\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${testRunIds})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n this.feedbacks.clear();\n for (const feedback of result.Results) {\n this.feedbacks.set(feedback.TestRunID, feedback);\n }\n }\n\n // Build TestRunWithFeedback array and calculate metrics\n this.buildTestRunsWithFeedback();\n\n this.feedbacksLoaded = true;\n } catch (error) {\n console.error('Error loading feedbacks:', error);\n } finally {\n this.loadingFeedbacks = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Build TestRunWithFeedback array from testRuns and feedbacks\n */\n private buildTestRunsWithFeedback(): void {\n this.testRunsWithFeedback = this.testRuns.map(run => {\n const feedback = this.feedbacks.get(run.ID);\n return {\n id: run.ID,\n testId: run.TestID,\n testName: run.Test || 'Unknown Test',\n executionStatus: normalizeExecutionStatus(run.Status || 'Completed'),\n originalStatus: run.Status || 'Completed',\n duration: (run.DurationSeconds || 0) * 1000, // Convert to ms\n cost: run.CostUSD || 0,\n runDateTime: run.StartedAt ? new Date(run.StartedAt) : new Date(),\n autoScore: run.Score,\n passedChecks: null,\n failedChecks: null,\n totalChecks: null,\n humanRating: feedback?.Rating || null,\n humanIsCorrect: feedback?.IsCorrect ?? null,\n humanComments: feedback?.CorrectionSummary || null,\n hasHumanFeedback: !!feedback,\n feedbackId: feedback?.ID || null,\n tags: TagsHelper.parseTags(run.Tags),\n targetType: null,\n targetLogID: null\n };\n });\n\n // Calculate metrics\n this.evaluationMetrics = calculateEvaluationMetrics(this.testRunsWithFeedback);\n\n // Get items needing review\n this.needsReviewItems = getNeedsReviewItems(this.testRunsWithFeedback);\n }\n\n toggleRunExpanded(runId: string): void {\n if (this.expandedRunId === runId) {\n this.expandedRunId = null;\n } else {\n this.expandedRunId = runId;\n this.initializeInlineFeedback(runId);\n }\n this.cdr.markForCheck();\n }\n\n private initializeInlineFeedback(runId: string): void {\n const existingFeedback = this.feedbacks.get(runId);\n if (existingFeedback) {\n this.inlineRating = existingFeedback.Rating || 0;\n this.inlineIsCorrect = existingFeedback.IsCorrect;\n this.inlineComments = existingFeedback.CorrectionSummary || '';\n } else {\n this.inlineRating = 0;\n this.inlineIsCorrect = null;\n this.inlineComments = '';\n }\n this.inlineHoverRating = 0;\n }\n\n setInlineRating(value: number): void {\n this.inlineRating = value;\n this.cdr.markForCheck();\n }\n\n getInlineRatingLabel(): string {\n if (this.inlineRating <= 3) return 'Poor';\n if (this.inlineRating <= 5) return 'Below Average';\n if (this.inlineRating <= 6) return 'Average';\n if (this.inlineRating <= 7) return 'Good';\n if (this.inlineRating <= 8) return 'Very Good';\n if (this.inlineRating <= 9) return 'Excellent';\n return 'Outstanding';\n }\n\n canSubmitInlineFeedback(): boolean {\n return this.inlineRating > 0 && this.inlineComments.trim().length > 0;\n }\n\n async saveInlineFeedback(): Promise<void> {\n if (!this.expandedRunId || !this.canSubmitInlineFeedback()) return;\n\n this.savingInlineFeedback = true;\n this.cdr.markForCheck();\n\n try {\n const md = new Metadata();\n const currentUser = md.CurrentUser;\n\n let feedback = this.feedbacks.get(this.expandedRunId);\n\n if (!feedback) {\n feedback = await md.GetEntityObject<MJTestRunFeedbackEntity>('MJ: Test Run Feedbacks', currentUser);\n feedback.TestRunID = this.expandedRunId;\n feedback.ReviewerUserID = currentUser.ID;\n }\n\n feedback.Rating = this.inlineRating;\n feedback.IsCorrect = this.inlineIsCorrect;\n feedback.CorrectionSummary = this.inlineComments.trim() || null;\n\n const result = await feedback.Save();\n\n if (result) {\n this.feedbacks.set(this.expandedRunId, feedback);\n // Rebuild the metrics after feedback update\n this.buildTestRunsWithFeedback();\n SharedService.Instance.CreateSimpleNotification('Feedback saved', 'success', 2000);\n this.expandedRunId = null;\n } else {\n SharedService.Instance.CreateSimpleNotification(\n feedback.LatestResult?.Message || 'Failed to save feedback',\n 'error',\n 3000\n );\n }\n } catch (error) {\n SharedService.Instance.CreateSimpleNotification('Failed to save feedback', 'error', 3000);\n } finally {\n this.savingInlineFeedback = false;\n this.cdr.markForCheck();\n }\n }\n\n hasFeedback(runId: string): boolean {\n return this.feedbacks.has(runId);\n }\n\n getFeedbackRating(runId: string): number {\n return this.feedbacks.get(runId)?.Rating || 0;\n }\n\n /**\n * Get TestRunWithFeedback by run ID for template binding\n */\n getRunWithFeedback(runId: string): TestRunWithFeedback | undefined {\n return this.testRunsWithFeedback.find(r => r.id === runId);\n }\n\n /**\n * Get the human correctness status for a run\n */\n getHumanIsCorrect(runId: string): boolean | null {\n return this.feedbacks.get(runId)?.IsCorrect ?? null;\n }\n\n // ===========================\n // Run Tags\n // ===========================\n\n getRunTags(run: MJTestRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n // ===========================\n // Keyboard Shortcuts Settings\n // ===========================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n\n // ===========================\n // Analytics Calculations\n // ===========================\n\n getPassedCount(): number {\n return this.testRuns.filter(r => r.Status === 'Passed').length;\n }\n\n getFailedCount(): number {\n return this.testRuns.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n }\n\n getPassedPercent(): number {\n if (this.testRuns.length === 0) return 0;\n return (this.getPassedCount() / this.testRuns.length) * 100;\n }\n\n getFailedPercent(): number {\n if (this.testRuns.length === 0) return 0;\n return (this.getFailedCount() / this.testRuns.length) * 100;\n }\n\n getAverageScore(): number {\n const runsWithScore = this.testRuns.filter(r => r.Score != null);\n if (runsWithScore.length === 0) return 0;\n const sum = runsWithScore.reduce((acc, r) => acc + (r.Score || 0), 0);\n return sum / runsWithScore.length;\n }\n\n getAverageDuration(): number {\n const runsWithDuration = this.testRuns.filter(r => r.DurationSeconds != null);\n if (runsWithDuration.length === 0) return 0;\n const sum = runsWithDuration.reduce((acc, r) => acc + (r.DurationSeconds || 0), 0);\n return sum / runsWithDuration.length;\n }\n\n getTotalCost(): number {\n return this.testRuns.reduce((acc, r) => acc + (r.CostUSD || 0), 0);\n }\n\n // ===========================\n // Export\n // ===========================\n\n exportToCSV(): void {\n const headers = ['Test Name', 'Status', 'Score', 'Duration (s)', 'Cost (USD)', 'Started At', 'Tags'];\n const rows = this.testRuns.map(run => [\n run.Test || '',\n run.Status || '',\n run.Score?.toFixed(4) || '',\n run.DurationSeconds?.toFixed(2) || '',\n run.CostUSD?.toFixed(6) || '',\n run.StartedAt ? new Date(run.StartedAt).toISOString() : '',\n this.getRunTags(run).join('; ')\n ]);\n\n const csvContent = [headers, ...rows]\n .map(row => row.map(cell => `\"${cell}\"`).join(','))\n .join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `test-suite-run-${this.record.ID.substring(0, 8)}-results.csv`;\n link.click();\n URL.revokeObjectURL(link.href);\n\n SharedService.Instance.CreateSimpleNotification('Export complete', 'success', 2000);\n }\n}\n","<div class=\"test-suite-run-form\" kendoDialogContainer>\n <!-- Header Section -->\n <div class=\"suite-run-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 @if (testSuite) {\n <li>\n <i class=\"fas fa-chevron-right separator\"></i>\n <a href=\"javascript:void(0)\" (click)=\"openTestSuite()\">\n <i class=\"fas fa-layer-group\"></i>\n <span class=\"breadcrumb-text\">{{ testSuite.Name }}</span>\n </a>\n </li>\n }\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <span>Run #{{ record.ID.substring(0, 8) }}</span>\n </li>\n </ol>\n </nav>\n\n <!-- Header Content -->\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"suite-run-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n <div class=\"suite-run-info\">\n <h1>Suite Run</h1>\n <div class=\"suite-run-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n {{ record.Status }}\n </span>\n @if (record.Environment) {\n <span class=\"meta-tag environment\">\n <i class=\"fas fa-server\"></i>\n {{ record.Environment }}\n </span>\n }\n @if (record.TriggerType) {\n <span class=\"meta-tag trigger\">\n <i class=\"fas fa-bolt\"></i>\n {{ record.TriggerType }}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <!-- Evaluation Mode Toggle -->\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n @if (record.SuiteID) {\n <button kendoButton (click)=\"reRunSuite()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Re-run Suite\n </button>\n }\n <button kendoButton (click)=\"refresh()\" [disabled]=\"isRefreshing\">\n <i class=\"fas\" [ngClass]=\"isRefreshing ? 'fa-sync fa-spin' : 'fa-sync'\"></i>\n {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n </div>\n\n <!-- Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ calculateDuration() }}</div>\n <div class=\"metric-label\">Duration</div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-percentage\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getPassRate().toFixed(1) }}%</div>\n <div class=\"metric-label\">Pass Rate</div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ formatCost(record.TotalCostUSD) }}</div>\n <div class=\"metric-label\">Total Cost</div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-calendar\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getRelativeTime(record.StartedAt) }}</div>\n <div class=\"metric-label\">Started</div>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <div class=\"result-item passed\">\n <div class=\"result-icon\">\n <i class=\"fas fa-check-circle\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.PassedTests || 0 }}</span>\n <span class=\"result-label\">Passed</span>\n </div>\n </div>\n <div class=\"result-item failed\">\n <div class=\"result-icon\">\n <i class=\"fas fa-times-circle\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.FailedTests || 0 }}</span>\n <span class=\"result-label\">Failed</span>\n </div>\n </div>\n <div class=\"result-item error\">\n <div class=\"result-icon\">\n <i class=\"fas fa-exclamation-circle\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.ErrorTests || 0 }}</span>\n <span class=\"result-label\">Errors</span>\n </div>\n </div>\n <div class=\"result-item skipped\">\n <div class=\"result-icon\">\n <i class=\"fas fa-forward\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.SkippedTests || 0 }}</span>\n <span class=\"result-label\">Skipped</span>\n </div>\n </div>\n <div class=\"result-item total\">\n <div class=\"result-icon\">\n <i class=\"fas fa-list\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.TotalTests || 0 }}</span>\n <span class=\"result-label\">Total</span>\n </div>\n </div>\n </div>\n\n <!-- Tags Section - Sleek inline design -->\n @if (!editingTags) {\n <div class=\"tags-bar\">\n <div class=\"tags-bar-content\">\n <span class=\"tags-bar-label\"><i class=\"fas fa-tags\"></i></span>\n @if (tags.length > 0) {\n <div class=\"tags-bar-chips\">\n @for (tag of tags; track tag) {\n <span class=\"tag-inline\">{{ tag }}</span>\n }\n </div>\n }\n @if (tags.length === 0) {\n <span class=\"tags-bar-empty\">No tags</span>\n }\n <button class=\"tags-bar-edit\" (click)=\"startEditingTags()\" title=\"Edit tags\">\n <i class=\"fas fa-plus\"></i> Add\n </button>\n </div>\n </div>\n }\n\n <!-- Tags Editor - Expanded when editing -->\n @if (editingTags) {\n <div class=\"tags-editor-panel\">\n <div class=\"tags-editor-header\">\n <span class=\"tags-editor-title\"><i class=\"fas fa-tags\"></i> Edit Tags</span>\n </div>\n <div class=\"tags-editor-body\">\n <div class=\"tags-editor-chips\">\n @for (tag of tags; track tag) {\n <span class=\"tag-editable\">\n {{ tag }}\n <button class=\"tag-remove-btn\" (click)=\"removeTag(tag)\" title=\"Remove tag\">\n <i class=\"fas fa-times\"></i>\n </button>\n </span>\n }\n @if (tags.length === 0) {\n <span class=\"tags-empty-hint\">No tags yet</span>\n }\n </div>\n <div class=\"tags-editor-input\">\n <input type=\"text\"\n [(ngModel)]=\"newTag\"\n placeholder=\"Type a tag and press Enter...\"\n (keyup.enter)=\"addTag()\"\n class=\"tag-text-input\" />\n <button kendoButton (click)=\"addTag()\" [disabled]=\"!newTag.trim()\" fillMode=\"flat\">\n <i class=\"fas fa-plus\"></i>\n </button>\n </div>\n </div>\n <div class=\"tags-editor-footer\">\n <button kendoButton (click)=\"saveTags()\" themeColor=\"primary\" [disabled]=\"savingTags\">\n @if (savingTags) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n {{ savingTags ? 'Saving...' : 'Save' }}\n </button>\n <button kendoButton (click)=\"cancelEditingTags()\" fillMode=\"flat\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i> Overview\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-list\"></i> Test Runs\n @if (testRunsLoaded) {\n <span class=\"tab-badge\">{{ testRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'details'\"\n (click)=\"changeTab('details')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'details'\">\n <i class=\"fas fa-info-circle\"></i> Details\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 title=\"Press 4\">\n <i class=\"fas fa-chart-bar\"></i> Analytics\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'execution'\"\n (click)=\"changeTab('execution')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'execution'\"\n title=\"Press 5\">\n <i class=\"fas fa-microchip\"></i>\n <span>Execution</span>\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Result Hero -->\n <div class=\"result-hero\"\n [class.passed]=\"record.Status === 'Completed' && getPassRate() >= 90\"\n [class.failed]=\"record.Status === 'Failed' || getPassRate() < 50\"\n [class.running]=\"record.Status === 'Running'\"\n [class.pending]=\"record.Status === 'Pending'\">\n <div class=\"result-hero-icon\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n <div class=\"result-hero-text\">\n <h2>SUITE {{ record.Status.toUpperCase() || 'UNKNOWN' }}</h2>\n <div class=\"result-hero-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{ getPassRate().toFixed(1) }}%</span>\n <span class=\"stat-label\">Pass Rate</span>\n </div>\n <div class=\"stat-divider\"></div>\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{ record.PassedTests || 0 }} / {{ record.TotalTests || 0 }}</span>\n <span class=\"stat-label\">Tests Passed</span>\n </div>\n </div>\n </div>\n </div>\n <!-- Evaluation Metrics Summary -->\n @if (evaluationMetrics && feedbacksLoaded) {\n <div class=\"evaluation-summary\">\n <div class=\"eval-summary-grid\">\n <!-- Human Feedback Card -->\n @if (evalPreferences.showHuman) {\n <div class=\"eval-summary-card\">\n <div class=\"eval-card-header\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Human Feedback</span>\n </div>\n <div class=\"eval-card-body\">\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Reviewed</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.humanReviewedCount }} / {{ evaluationMetrics.totalRuns }}</span>\n </div>\n @if (evaluationMetrics.humanReviewedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Avg Rating</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.humanAvgRating.toFixed(1) }}/10</span>\n </div>\n }\n @if (evaluationMetrics.humanReviewedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Correct</span>\n <span class=\"eval-stat-value correct\">{{ evaluationMetrics.humanCorrectCount }}</span>\n @if (evaluationMetrics.humanIncorrectCount > 0) {\n <span class=\"eval-stat-value incorrect\">{{ evaluationMetrics.humanIncorrectCount }} incorrect</span>\n }\n </div>\n }\n </div>\n @if (evaluationMetrics.humanPendingCount > 0) {\n <div class=\"eval-card-footer\">\n <span class=\"pending-badge\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ evaluationMetrics.humanPendingCount }} need review\n </span>\n </div>\n }\n </div>\n }\n <!-- Auto Score Card -->\n @if (evalPreferences.showAuto) {\n <div class=\"eval-summary-card\">\n <div class=\"eval-card-header\">\n <i class=\"fa-solid fa-robot\"></i>\n <span>Auto Evaluation</span>\n </div>\n <div class=\"eval-card-body\">\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Evaluated</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.autoEvaluatedCount }} / {{ evaluationMetrics.totalRuns }}</span>\n </div>\n @if (evaluationMetrics.autoEvaluatedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Avg Score</span>\n <span class=\"eval-stat-value\">{{ (evaluationMetrics.autoAvgScore * 100).toFixed(0) }}%</span>\n </div>\n }\n @if (evaluationMetrics.autoEvaluatedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Pass Rate</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.autoPassRate.toFixed(0) }}%</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Execution Card -->\n @if (evalPreferences.showExecution) {\n <div class=\"eval-summary-card\">\n <div class=\"eval-card-header\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Execution</span>\n </div>\n <div class=\"eval-card-body\">\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Completed</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.execCompletedCount }} / {{ evaluationMetrics.totalRuns }}</span>\n </div>\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Success Rate</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.execSuccessRate.toFixed(0) }}%</span>\n </div>\n @if (evaluationMetrics.execErrorCount > 0 || evaluationMetrics.execTimeoutCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Issues</span>\n @if (evaluationMetrics.execErrorCount > 0) {\n <span class=\"eval-stat-value error\">{{ evaluationMetrics.execErrorCount }} errors</span>\n }\n @if (evaluationMetrics.execTimeoutCount > 0) {\n <span class=\"eval-stat-value timeout\">{{ evaluationMetrics.execTimeoutCount }} timeouts</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Needs Review Section -->\n @if (evalPreferences.showHuman && needsReviewItems.length > 0 && feedbacksLoaded) {\n <div class=\"needs-review-section\">\n <div class=\"needs-review-header\">\n <h3><i class=\"fa-solid fa-user-clock\"></i> Needs Review</h3>\n <span class=\"review-count\">{{ needsReviewItems.length }} items</span>\n </div>\n <div class=\"needs-review-list\">\n @for (item of needsReviewItems.slice(0, 5); track item) {\n <div class=\"review-item\"\n [class.high-priority]=\"item.priority === 'high'\"\n [class.medium-priority]=\"item.priority === 'medium'\"\n (click)=\"toggleRunExpanded(item.run.id)\">\n <div class=\"review-item-icon\">\n @if (item.priority === 'high') {\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n }\n @if (item.priority === 'medium') {\n <i class=\"fa-solid fa-circle-dot\"></i>\n }\n @if (item.priority === 'low') {\n <i class=\"fa-solid fa-clock\"></i>\n }\n </div>\n <div class=\"review-item-content\">\n <span class=\"review-item-name\">{{ item.run.testName }}</span>\n <span class=\"review-item-reason\">{{ item.reason }}</span>\n </div>\n <div class=\"review-item-action\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div>\n </div>\n }\n @if (needsReviewItems.length > 5) {\n <div class=\"review-more\">\n <button kendoButton fillMode=\"flat\" (click)=\"changeTab('runs')\">\n View all {{ needsReviewItems.length }} items\n </button>\n </div>\n }\n </div>\n </div>\n }\n <!-- Progress Ring (when running) -->\n @if (record.Status === 'Running' || record.Status === 'Pending') {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n <span>Suite execution in progress...</span>\n </div>\n <div class=\"auto-refresh-notice\">\n <i class=\"fas fa-sync\"></i>\n Auto-refreshing every 5 seconds\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Test Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Toolbar -->\n @if (testRunsLoaded && testRuns.length > 0) {\n <div class=\"runs-toolbar\">\n <div class=\"run-filters\">\n <button class=\"filter-btn\"\n [class.active]=\"runStatusFilter === null\"\n (click)=\"setRunStatusFilter(null)\">\n All ({{ testRuns.length }})\n </button>\n @if (getRunCountByStatus('Passed') > 0) {\n <button class=\"filter-btn passed\"\n [class.active]=\"runStatusFilter === 'Passed'\"\n (click)=\"setRunStatusFilter('Passed')\"\n >\n <i class=\"fas fa-check\"></i> Passed ({{ getRunCountByStatus('Passed') }})\n </button>\n }\n @if (getRunCountByStatus('Failed') > 0) {\n <button class=\"filter-btn failed\"\n [class.active]=\"runStatusFilter === 'Failed'\"\n (click)=\"setRunStatusFilter('Failed')\"\n >\n <i class=\"fas fa-times\"></i> Failed ({{ getRunCountByStatus('Failed') }})\n </button>\n }\n @if (getRunCountByStatus('Error') > 0) {\n <button class=\"filter-btn error\"\n [class.active]=\"runStatusFilter === 'Error'\"\n (click)=\"setRunStatusFilter('Error')\"\n >\n <i class=\"fas fa-exclamation\"></i> Error ({{ getRunCountByStatus('Error') }})\n </button>\n }\n </div>\n <div class=\"runs-actions\">\n <button kendoButton (click)=\"exportToCSV()\">\n <i class=\"fas fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n }\n <!-- Loading State -->\n @if (loadingTestRuns) {\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 <!-- Test Runs List -->\n @if (!loadingTestRuns && testRuns.length > 0) {\n <div class=\"test-runs-list\">\n @for (run of getFilteredTestRuns(); track run) {\n <div class=\"test-run-card\">\n <div class=\"test-run-item\" (click)=\"toggleRunExpanded(run.ID)\">\n <div class=\"run-sequence\">{{ run.Sequence || '-' }}</div>\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\" [ngClass]=\"getRunStatusIcon(run.Status)\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header-row\">\n <div class=\"run-name\">{{ run.Test }}</div>\n <!-- Evaluation Badge -->\n <app-evaluation-badge\n [executionStatus]=\"run.Status\"\n [originalStatus]=\"run.Status\"\n [autoScore]=\"run.Score\"\n [humanRating]=\"getFeedbackRating(run.ID) || null\"\n [humanIsCorrect]=\"getHumanIsCorrect(run.ID)\"\n [hasHumanFeedback]=\"hasFeedback(run.ID)\"\n [preferences]=\"evalPreferences\"\n [mode]=\"'compact'\">\n </app-evaluation-badge>\n </div>\n <div class=\"run-meta\">\n @if (run.DurationSeconds) {\n <span class=\"run-duration\">\n <i class=\"fas fa-clock\"></i> {{ run.DurationSeconds.toFixed(1) }}s\n </span>\n }\n @if (run.CostUSD) {\n <span class=\"run-cost\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.CostUSD.toFixed(6) }}\n </span>\n }\n @if (run.TargetLogEntityID && run.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"run.TargetLogEntity\"\n [recordId]=\"run.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n @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 <div class=\"run-expand\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedRunId !== run.ID\" [class.fa-chevron-up]=\"expandedRunId === run.ID\"></i>\n </div>\n </div>\n <!-- Expanded Inline Feedback -->\n @if (expandedRunId === run.ID) {\n <div class=\"inline-feedback\">\n <div class=\"feedback-divider\"></div>\n <div class=\"feedback-section\">\n <div class=\"feedback-label\">Quick Feedback</div>\n <div class=\"inline-rating\">\n <div class=\"rating-numbers\">\n @for (num of [1,2,3,4,5,6,7,8,9,10]; track num) {\n <button\n type=\"button\"\n class=\"rating-btn\"\n [class.selected]=\"num === inlineRating\"\n [class.hover]=\"num === inlineHoverRating\"\n [class.low]=\"num <= 3\"\n [class.mid]=\"num >= 4 && num <= 6\"\n [class.high]=\"num >= 7\"\n (click)=\"setInlineRating(num); $event.stopPropagation()\"\n (mouseenter)=\"inlineHoverRating = num\"\n (mouseleave)=\"inlineHoverRating = 0\">\n {{ num }}\n </button>\n }\n </div>\n @if (inlineRating > 0) {\n <div class=\"rating-info\">\n <span class=\"rating-value\">{{ inlineRating }}/10</span>\n <span class=\"rating-label-text\">{{ getInlineRatingLabel() }}</span>\n </div>\n }\n </div>\n <div class=\"correctness-row\">\n <span class=\"correctness-label\">Was it correct?</span>\n <div class=\"correctness-options\">\n <label class=\"radio-opt\" (click)=\"$event.stopPropagation()\">\n <input type=\"radio\" name=\"correct-{{run.ID}}\" [value]=\"true\" [(ngModel)]=\"inlineIsCorrect\">\n <span>Yes</span>\n </label>\n <label class=\"radio-opt\" (click)=\"$event.stopPropagation()\">\n <input type=\"radio\" name=\"correct-{{run.ID}}\" [value]=\"false\" [(ngModel)]=\"inlineIsCorrect\">\n <span>No</span>\n </label>\n <label class=\"radio-opt\" (click)=\"$event.stopPropagation()\">\n <input type=\"radio\" name=\"correct-{{run.ID}}\" [value]=\"null\" [(ngModel)]=\"inlineIsCorrect\">\n <span>Not Sure</span>\n </label>\n </div>\n </div>\n <div class=\"comments-row\" (click)=\"$event.stopPropagation()\">\n <textarea\n class=\"feedback-textarea\"\n [(ngModel)]=\"inlineComments\"\n placeholder=\"Add comments or corrections...\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"feedback-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton (click)=\"openTestRun(run.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Full Details\n </button>\n <button kendoButton\n themeColor=\"primary\"\n (click)=\"saveInlineFeedback()\"\n [disabled]=\"!canSubmitInlineFeedback() || savingInlineFeedback\">\n <i class=\"fas\" [ngClass]=\"savingInlineFeedback ? 'fa-spinner fa-spin' : 'fa-save'\"></i>\n {{ savingInlineFeedback ? 'Saving...' : (hasFeedback(run.ID) ? 'Update' : 'Save') }}\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testRunsLoaded && !loadingTestRuns && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-inbox\"></i>\n </div>\n <h4>No Test Runs Found</h4>\n <p>No test runs have been recorded for this suite execution.</p>\n </div>\n }\n <!-- Filtered Empty -->\n @if (testRunsLoaded && !loadingTestRuns && testRuns.length > 0 && getFilteredTestRuns().length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-filter\"></i>\n </div>\n <h4>No Matching Runs</h4>\n <p>No test runs match the current filter.</p>\n <button kendoButton (click)=\"setRunStatusFilter(null)\">Clear Filter</button>\n </div>\n }\n </div>\n }\n\n <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"details-tab\">\n <div class=\"details-card\">\n <h3><i class=\"fas fa-info-circle\"></i> Run Information</h3>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <div class=\"detail-label\">Run ID</div>\n <div class=\"detail-value monospace\">{{ record.ID }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Test Suite</div>\n <div class=\"detail-value\">\n @if (testSuite) {\n <a href=\"javascript:void(0)\" (click)=\"openTestSuite()\">{{ testSuite.Name }}</a>\n }\n @if (!testSuite) {\n <span>Loading...</span>\n }\n </div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Status</div>\n <div class=\"detail-value\">\n <span class=\"status-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Run By</div>\n <div class=\"detail-value\">{{ record.RunByUser || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Started At</div>\n <div class=\"detail-value\">{{ record.StartedAt | date:'medium' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Completed At</div>\n <div class=\"detail-value\">{{ record.CompletedAt | date:'medium' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Environment</div>\n <div class=\"detail-value\">{{ record.Environment || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Trigger Type</div>\n <div class=\"detail-value\">{{ record.TriggerType || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Git Commit</div>\n <div class=\"detail-value monospace\">{{ record.GitCommit || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Agent Version</div>\n <div class=\"detail-value\">{{ record.AgentVersion || 'N/A' }}</div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"analytics-tab\">\n <!-- Loading State -->\n @if (loadingTestRuns) {\n <div class=\"analytics-loading\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading test results...</span>\n </div>\n }\n <!-- Summary Statistics - Moved to top for better overview -->\n @if (!loadingTestRuns && testRuns.length > 0) {\n <div class=\"analytics-section\">\n <h3><i class=\"fas fa-chart-pie\"></i> Summary Statistics</h3>\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-icon passed\"><i class=\"fas fa-check-circle\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ getPassedCount() }}</div>\n <div class=\"stat-label\">Passed</div>\n <div class=\"stat-percent\">{{ getPassedPercent().toFixed(1) }}%</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon failed\"><i class=\"fas fa-times-circle\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ getFailedCount() }}</div>\n <div class=\"stat-label\">Failed</div>\n <div class=\"stat-percent\">{{ getFailedPercent().toFixed(1) }}%</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon score\"><i class=\"fas fa-star\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ (getAverageScore() * 100).toFixed(1) }}%</div>\n <div class=\"stat-label\">Avg Score</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon duration\"><i class=\"fas fa-clock\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ getAverageDuration().toFixed(1) }}s</div>\n <div class=\"stat-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon cost\"><i class=\"fas fa-dollar-sign\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">${{ getTotalCost().toFixed(4) }}</div>\n <div class=\"stat-label\">Total Cost</div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Test Results Table -->\n @if (!loadingTestRuns && testRuns.length > 0) {\n <div class=\"analytics-section\">\n <div class=\"analytics-header\">\n <h3><i class=\"fas fa-table\"></i> Test Results</h3>\n <div class=\"analytics-legend\">\n <span class=\"legend-item passed\"><i class=\"fas fa-check-circle\"></i> Passed</span>\n <span class=\"legend-item failed\"><i class=\"fas fa-times-circle\"></i> Failed</span>\n <span class=\"legend-item error\"><i class=\"fas fa-exclamation-circle\"></i> Error</span>\n <span class=\"legend-item skipped\"><i class=\"fas fa-forward\"></i> Skipped</span>\n </div>\n </div>\n <!-- Results Table -->\n <div class=\"results-table-wrapper\">\n <table class=\"results-table\">\n <thead>\n <tr>\n <th class=\"seq-col\">#</th>\n <th class=\"name-col\">Test Name</th>\n @if (evalPreferences.showExecution) {\n <th class=\"status-col\">Status</th>\n }\n @if (evalPreferences.showAuto) {\n <th class=\"score-col\">Auto Score</th>\n }\n @if (evalPreferences.showHuman) {\n <th class=\"feedback-col\">Human Score</th>\n }\n <th class=\"duration-col\">Duration</th>\n <th class=\"cost-col\">Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (run of testRuns; track run; let i = $index) {\n <tr\n class=\"result-row\"\n [class.row-passed]=\"run.Status === 'Passed'\"\n [class.row-failed]=\"run.Status === 'Failed'\"\n [class.row-error]=\"run.Status === 'Error'\"\n [class.row-skipped]=\"run.Status === 'Skipped'\"\n (click)=\"openTestRun(run.ID)\">\n <td class=\"seq-col\">{{ i + 1 }}</td>\n <td class=\"name-col\">\n <div class=\"test-name-wrapper\">\n <span class=\"test-name\">{{ run.Test || 'Unknown Test' }}</span>\n @if (getRunTags(run).length > 0) {\n <div class=\"test-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 </td>\n @if (evalPreferences.showExecution) {\n <td class=\"status-col\">\n <span class=\"status-badge\" [ngClass]=\"'status-' + run.Status.toLowerCase()\">\n <i class=\"fas\"\n [class.fa-check-circle]=\"run.Status === 'Passed'\"\n [class.fa-times-circle]=\"run.Status === 'Failed'\"\n [class.fa-exclamation-circle]=\"run.Status === 'Error'\"\n [class.fa-forward]=\"run.Status === 'Skipped'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-spin]=\"run.Status === 'Running'\"></i>\n {{ run.Status }}\n </span>\n </td>\n }\n @if (evalPreferences.showAuto) {\n <td class=\"score-col\">\n @if (run.Score != null) {\n <div class=\"score-display\">\n <div class=\"score-bar-mini\">\n <div class=\"score-fill\"\n [style.width.%]=\"run.Score * 100\"\n [class.high]=\"run.Score >= 0.8\"\n [class.medium]=\"run.Score >= 0.5 && run.Score < 0.8\"\n [class.low]=\"run.Score < 0.5\"></div>\n </div>\n <span class=\"score-text\">{{ (run.Score * 100).toFixed(0) }}%</span>\n </div>\n }\n @if (run.Score == null) {\n <span class=\"na-value\">—</span>\n }\n </td>\n }\n @if (evalPreferences.showHuman) {\n <td class=\"feedback-col\">\n @if (hasFeedback(run.ID)) {\n <div class=\"feedback-display\">\n <span class=\"feedback-rating\" [class.low]=\"getFeedbackRating(run.ID) <= 3\" [class.mid]=\"getFeedbackRating(run.ID) >= 4 && getFeedbackRating(run.ID) <= 6\" [class.high]=\"getFeedbackRating(run.ID) >= 7\">\n {{ getFeedbackRating(run.ID) }}/10\n </span>\n @if (getHumanIsCorrect(run.ID) !== null) {\n <span class=\"feedback-correctness\">\n <i class=\"fas\" [class.fa-check]=\"getHumanIsCorrect(run.ID) === true\" [class.fa-times]=\"getHumanIsCorrect(run.ID) === false\" [class.correct]=\"getHumanIsCorrect(run.ID) === true\" [class.incorrect]=\"getHumanIsCorrect(run.ID) === false\"></i>\n </span>\n }\n </div>\n }\n @if (!hasFeedback(run.ID)) {\n <span class=\"na-value needs-review\">\n <i class=\"fas fa-user-clock\"></i>\n </span>\n }\n </td>\n }\n <td class=\"duration-col\">\n @if (run.DurationSeconds) {\n <span>{{ run.DurationSeconds.toFixed(1) }}s</span>\n }\n @if (!run.DurationSeconds) {\n <span class=\"na-value\">—</span>\n }\n </td>\n <td class=\"cost-col\">\n @if (run.CostUSD) {\n <span>${{ run.CostUSD.toFixed(4) }}</span>\n }\n @if (!run.CostUSD) {\n <span class=\"na-value\">—</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (!loadingTestRuns && testRunsLoaded && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-bar\"></i>\n </div>\n <h4>No Test Results Yet</h4>\n <p>Test runs will appear here once the suite execution completes.</p>\n </div>\n }\n </div>\n }\n\n <!-- Execution Tab -->\n @if (activeTab === 'execution') {\n <div class=\"execution-tab\">\n <mj-execution-context\n [machineName]=\"record.MachineName\"\n [machineId]=\"record.MachineID\"\n [runByUserName]=\"record.RunByUserName\"\n [runByUserEmail]=\"record.RunByUserEmail\"\n [runContextDetailsJson]=\"record.RunContextDetails\">\n </mj-execution-context>\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>Re-run Suite</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Shift</kbd><kbd>R</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-run-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-suite-run-form.component.ts","../../../../src/lib/custom/Tests/test-suite-run-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, ViewContainerRef, inject } from '@angular/core';\nimport { Subject, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestSuiteRunEntity, MJTestSuiteEntity, MJTestRunEntity, MJTestRunFeedbackEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestSuiteRunFormComponent } from '../../generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n EvaluationPreferencesService,\n EvaluationPreferences,\n EvaluationMetrics,\n TestRunWithFeedback,\n calculateEvaluationMetrics,\n normalizeExecutionStatus,\n getNeedsReviewItems,\n NeedsReviewItem\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 Suite Runs')\n@Component({\n standalone: false,\n selector: 'mj-test-suite-run-form',\n templateUrl: './test-suite-run-form.component.html',\n styleUrls: ['./test-suite-run-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestSuiteRunFormComponentExtended extends MJTestSuiteRunFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestSuiteRunEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingTestRuns = false;\n loadingFeedbacks = false;\n error: string | null = null;\n testRunsLoaded = false;\n feedbacksLoaded = false;\n isRefreshing = false;\n autoRefreshEnabled = false;\n\n // Related entities\n testSuite: MJTestSuiteEntity | null = null;\n testRuns: MJTestRunEntity[] = [];\n feedbacks: Map<string, MJTestRunFeedbackEntity> = new Map();\n\n // Tags\n tags: string[] = [];\n newTag = '';\n editingTags = false;\n savingTags = false;\n\n // Inline feedback\n expandedRunId: string | null = null;\n inlineRating: number = 0;\n inlineHoverRating: number = 0;\n inlineIsCorrect: boolean | null = null;\n inlineComments: string = '';\n savingInlineFeedback = false;\n\n // Filter for test runs\n runStatusFilter: string | null = null;\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 system\n evalPreferences: EvaluationPreferences = {\n showExecution: true,\n showHuman: true,\n showAuto: false\n };\n testRunsWithFeedback: TestRunWithFeedback[] = [];\n evaluationMetrics: EvaluationMetrics | null = null;\n needsReviewItems: NeedsReviewItem[] = [];\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 });\n\n if (this.record && this.record.ID) {\n await this.loadRelatedData();\n this.parseTags();\n\n // Auto-refresh for running suite executions\n if (this.record.Status === 'Running' || this.record.Status === 'Pending') {\n this.startAutoRefresh();\n }\n }\n }\n\n private parseTags(): void {\n this.tags = TagsHelper.parseTags(this.record.Tags);\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 + Shift + R: Re-run suite\n if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === 'r') {\n event.preventDefault();\n this.reRunSuite();\n return;\n }\n\n // Number keys for tabs (1-4)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('runs'); break;\n case '3': this.changeTab('details'); break;\n case '4': this.changeTab('analytics'); break;\n }\n }\n }\n\n private startAutoRefresh() {\n this.autoRefreshEnabled = true;\n interval(5000)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.autoRefreshEnabled && (this.record.Status === 'Running' || this.record.Status === 'Pending')) {\n this.silentRefresh();\n } else {\n this.autoRefreshEnabled = false;\n }\n });\n }\n\n private async silentRefresh() {\n try {\n await this.record.Load(this.record.ID);\n this.cdr.markForCheck();\n } catch {\n // Silently fail on auto-refresh\n }\n }\n\n private async loadRelatedData() {\n this.loading = true;\n this.error = null;\n\n try {\n // Load test suite\n if (this.record.SuiteID) {\n const md = new Metadata();\n const suite = await md.GetEntityObject<MJTestSuiteEntity>('MJ: Test Suites');\n if (suite && await suite.Load(this.record.SuiteID)) {\n this.testSuite = suite;\n }\n }\n\n this.cdr.markForCheck();\n } catch (error) {\n console.error('Error loading related data:', error);\n this.error = 'Failed to load related data. Click to retry.';\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n async retryLoad() {\n this.error = null;\n await this.loadRelatedData();\n }\n\n private async loadTestRuns() {\n if (this.testRunsLoaded) return;\n\n this.loadingTestRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestSuiteRunID='${this.record.ID}'`,\n OrderBy: 'Sequence ASC, StartedAt ASC',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.testRuns = result.Results || [];\n }\n\n this.testRunsLoaded = true;\n\n // Also load feedbacks for these runs\n if (this.testRuns.length > 0) {\n await this.loadFeedbacks();\n }\n } catch (error) {\n console.error('Error loading test runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test runs', 'error', 3000);\n } finally {\n this.loadingTestRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if ((tab === 'runs' || tab === 'analytics') && !this.testRunsLoaded) {\n this.loadTestRuns();\n }\n\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.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 getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Completed': return 'fa-check-circle';\n case 'Failed': return 'fa-times-circle';\n case 'Running': return 'fa-circle-notch fa-spin';\n case 'Pending': return 'fa-hourglass-half';\n case 'Cancelled': return 'fa-ban';\n default: return 'fa-question-circle';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n calculateDuration(): string {\n if (!this.record.TotalDurationSeconds) return 'N/A';\n\n const seconds = this.record.TotalDurationSeconds;\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${mins}m`;\n }\n\n formatCost(cost: number | null): string {\n if (cost === null || cost === undefined) return 'N/A';\n return `$${cost.toFixed(6)}`;\n }\n\n getPassRate(): number {\n const total = this.record.TotalTests || 0;\n const passed = this.record.PassedTests || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\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 navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n openTestSuite() {\n if (this.testSuite) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(this.testSuite.ID));\n }\n }\n\n openTestRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(runId));\n }\n\n async reRunSuite() {\n if (!this.record.SuiteID) {\n SharedService.Instance.CreateSimpleNotification('Cannot re-run: Suite ID not available', 'error', 3000);\n return;\n }\n\n this.testingDialogService.OpenSuitePanel(this.record.SuiteID);\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 await this.loadRelatedData();\n\n // Reset lazy-loaded data\n if (this.testRunsLoaded) {\n this.testRunsLoaded = false;\n this.testRuns = [];\n await this.loadTestRuns();\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 getRunStatusColor(status: string): string {\n switch (status) {\n case 'Passed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Error': return '#f59e0b';\n case 'Timeout': return '#f97316';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n case 'Skipped': return '#6b7280';\n default: return '#9ca3af';\n }\n }\n\n getRunStatusIcon(status: string): string {\n switch (status) {\n case 'Passed': return 'fa-check';\n case 'Failed': return 'fa-times';\n case 'Error': return 'fa-exclamation';\n case 'Timeout': return 'fa-clock';\n case 'Running': return 'fa-circle-notch fa-spin';\n case 'Pending': return 'fa-hourglass-half';\n case 'Skipped': return 'fa-forward';\n default: return 'fa-question';\n }\n }\n\n // ===========================\n // Tag Management\n // ===========================\n\n startEditingTags(): void {\n this.editingTags = true;\n this.cdr.markForCheck();\n }\n\n cancelEditingTags(): void {\n this.editingTags = false;\n this.newTag = '';\n this.parseTags(); // Reset to original\n this.cdr.markForCheck();\n }\n\n addTag(): void {\n const tag = this.newTag.trim();\n if (tag && !this.tags.includes(tag)) {\n this.tags = [...this.tags, tag];\n this.newTag = '';\n this.cdr.markForCheck();\n }\n }\n\n removeTag(tag: string): void {\n this.tags = this.tags.filter(t => t !== tag);\n this.cdr.markForCheck();\n }\n\n async saveTags(): Promise<void> {\n // Auto-add any pending tag in the input before saving\n const pendingTag = this.newTag.trim();\n if (pendingTag && !this.tags.includes(pendingTag)) {\n this.tags = [...this.tags, pendingTag];\n this.newTag = '';\n }\n\n this.savingTags = true;\n this.cdr.markForCheck();\n\n try {\n this.record.Tags = TagsHelper.toJson(this.tags);\n const result = await this.record.Save();\n\n if (result) {\n this.editingTags = false;\n SharedService.Instance.CreateSimpleNotification('Tags saved successfully', 'success', 2000);\n } else {\n SharedService.Instance.CreateSimpleNotification(\n this.record.LatestResult?.Message || 'Failed to save tags',\n 'error',\n 3000\n );\n }\n } catch (error) {\n SharedService.Instance.CreateSimpleNotification('Failed to save tags', 'error', 3000);\n } finally {\n this.savingTags = false;\n this.cdr.markForCheck();\n }\n }\n\n // ===========================\n // Test Run Filtering\n // ===========================\n\n setRunStatusFilter(status: string | null): void {\n this.runStatusFilter = status;\n this.cdr.markForCheck();\n }\n\n getFilteredTestRuns(): MJTestRunEntity[] {\n if (!this.runStatusFilter) return this.testRuns;\n return this.testRuns.filter(run => run.Status === this.runStatusFilter);\n }\n\n getRunCountByStatus(status: string): number {\n return this.testRuns.filter(run => run.Status === status).length;\n }\n\n // ===========================\n // Inline Feedback\n // ===========================\n\n private async loadFeedbacks(): Promise<void> {\n if (this.feedbacksLoaded) return;\n\n this.loadingFeedbacks = true;\n this.cdr.markForCheck();\n\n try {\n const testRunIds = this.testRuns.map(r => `'${r.ID}'`).join(',');\n if (!testRunIds) return;\n\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${testRunIds})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n this.feedbacks.clear();\n for (const feedback of result.Results) {\n this.feedbacks.set(feedback.TestRunID, feedback);\n }\n }\n\n // Build TestRunWithFeedback array and calculate metrics\n this.buildTestRunsWithFeedback();\n\n this.feedbacksLoaded = true;\n } catch (error) {\n console.error('Error loading feedbacks:', error);\n } finally {\n this.loadingFeedbacks = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Build TestRunWithFeedback array from testRuns and feedbacks\n */\n private buildTestRunsWithFeedback(): void {\n this.testRunsWithFeedback = this.testRuns.map(run => {\n const feedback = this.feedbacks.get(run.ID);\n return {\n id: run.ID,\n testId: run.TestID,\n testName: run.Test || 'Unknown Test',\n executionStatus: normalizeExecutionStatus(run.Status || 'Completed'),\n originalStatus: run.Status || 'Completed',\n duration: (run.DurationSeconds || 0) * 1000, // Convert to ms\n cost: run.CostUSD || 0,\n runDateTime: run.StartedAt ? new Date(run.StartedAt) : new Date(),\n autoScore: run.Score,\n passedChecks: null,\n failedChecks: null,\n totalChecks: null,\n humanRating: feedback?.Rating || null,\n humanIsCorrect: feedback?.IsCorrect ?? null,\n humanComments: feedback?.CorrectionSummary || null,\n hasHumanFeedback: !!feedback,\n feedbackId: feedback?.ID || null,\n tags: TagsHelper.parseTags(run.Tags),\n targetType: null,\n targetLogID: null\n };\n });\n\n // Calculate metrics\n this.evaluationMetrics = calculateEvaluationMetrics(this.testRunsWithFeedback);\n\n // Get items needing review\n this.needsReviewItems = getNeedsReviewItems(this.testRunsWithFeedback);\n }\n\n toggleRunExpanded(runId: string): void {\n if (this.expandedRunId === runId) {\n this.expandedRunId = null;\n } else {\n this.expandedRunId = runId;\n this.initializeInlineFeedback(runId);\n }\n this.cdr.markForCheck();\n }\n\n private initializeInlineFeedback(runId: string): void {\n const existingFeedback = this.feedbacks.get(runId);\n if (existingFeedback) {\n this.inlineRating = existingFeedback.Rating || 0;\n this.inlineIsCorrect = existingFeedback.IsCorrect;\n this.inlineComments = existingFeedback.CorrectionSummary || '';\n } else {\n this.inlineRating = 0;\n this.inlineIsCorrect = null;\n this.inlineComments = '';\n }\n this.inlineHoverRating = 0;\n }\n\n setInlineRating(value: number): void {\n this.inlineRating = value;\n this.cdr.markForCheck();\n }\n\n getInlineRatingLabel(): string {\n if (this.inlineRating <= 3) return 'Poor';\n if (this.inlineRating <= 5) return 'Below Average';\n if (this.inlineRating <= 6) return 'Average';\n if (this.inlineRating <= 7) return 'Good';\n if (this.inlineRating <= 8) return 'Very Good';\n if (this.inlineRating <= 9) return 'Excellent';\n return 'Outstanding';\n }\n\n canSubmitInlineFeedback(): boolean {\n return this.inlineRating > 0 && this.inlineComments.trim().length > 0;\n }\n\n async saveInlineFeedback(): Promise<void> {\n if (!this.expandedRunId || !this.canSubmitInlineFeedback()) return;\n\n this.savingInlineFeedback = true;\n this.cdr.markForCheck();\n\n try {\n const md = new Metadata();\n const currentUser = md.CurrentUser;\n\n let feedback = this.feedbacks.get(this.expandedRunId);\n\n if (!feedback) {\n feedback = await md.GetEntityObject<MJTestRunFeedbackEntity>('MJ: Test Run Feedbacks', currentUser);\n feedback.TestRunID = this.expandedRunId;\n feedback.ReviewerUserID = currentUser.ID;\n }\n\n feedback.Rating = this.inlineRating;\n feedback.IsCorrect = this.inlineIsCorrect;\n feedback.CorrectionSummary = this.inlineComments.trim() || null;\n\n const result = await feedback.Save();\n\n if (result) {\n this.feedbacks.set(this.expandedRunId, feedback);\n // Rebuild the metrics after feedback update\n this.buildTestRunsWithFeedback();\n SharedService.Instance.CreateSimpleNotification('Feedback saved', 'success', 2000);\n this.expandedRunId = null;\n } else {\n SharedService.Instance.CreateSimpleNotification(\n feedback.LatestResult?.Message || 'Failed to save feedback',\n 'error',\n 3000\n );\n }\n } catch (error) {\n SharedService.Instance.CreateSimpleNotification('Failed to save feedback', 'error', 3000);\n } finally {\n this.savingInlineFeedback = false;\n this.cdr.markForCheck();\n }\n }\n\n hasFeedback(runId: string): boolean {\n return this.feedbacks.has(runId);\n }\n\n getFeedbackRating(runId: string): number {\n return this.feedbacks.get(runId)?.Rating || 0;\n }\n\n /**\n * Get TestRunWithFeedback by run ID for template binding\n */\n getRunWithFeedback(runId: string): TestRunWithFeedback | undefined {\n return this.testRunsWithFeedback.find(r => r.id === runId);\n }\n\n /**\n * Get the human correctness status for a run\n */\n getHumanIsCorrect(runId: string): boolean | null {\n return this.feedbacks.get(runId)?.IsCorrect ?? null;\n }\n\n // ===========================\n // Run Tags\n // ===========================\n\n getRunTags(run: MJTestRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n // ===========================\n // Keyboard Shortcuts Settings\n // ===========================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n\n // ===========================\n // Analytics Calculations\n // ===========================\n\n getPassedCount(): number {\n return this.testRuns.filter(r => r.Status === 'Passed').length;\n }\n\n getFailedCount(): number {\n return this.testRuns.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n }\n\n getPassedPercent(): number {\n if (this.testRuns.length === 0) return 0;\n return (this.getPassedCount() / this.testRuns.length) * 100;\n }\n\n getFailedPercent(): number {\n if (this.testRuns.length === 0) return 0;\n return (this.getFailedCount() / this.testRuns.length) * 100;\n }\n\n getAverageScore(): number {\n const runsWithScore = this.testRuns.filter(r => r.Score != null);\n if (runsWithScore.length === 0) return 0;\n const sum = runsWithScore.reduce((acc, r) => acc + (r.Score || 0), 0);\n return sum / runsWithScore.length;\n }\n\n getAverageDuration(): number {\n const runsWithDuration = this.testRuns.filter(r => r.DurationSeconds != null);\n if (runsWithDuration.length === 0) return 0;\n const sum = runsWithDuration.reduce((acc, r) => acc + (r.DurationSeconds || 0), 0);\n return sum / runsWithDuration.length;\n }\n\n getTotalCost(): number {\n return this.testRuns.reduce((acc, r) => acc + (r.CostUSD || 0), 0);\n }\n\n // ===========================\n // Export\n // ===========================\n\n exportToCSV(): void {\n const headers = ['Test Name', 'Status', 'Score', 'Duration (s)', 'Cost (USD)', 'Started At', 'Tags'];\n const rows = this.testRuns.map(run => [\n run.Test || '',\n run.Status || '',\n run.Score?.toFixed(4) || '',\n run.DurationSeconds?.toFixed(2) || '',\n run.CostUSD?.toFixed(6) || '',\n run.StartedAt ? new Date(run.StartedAt).toISOString() : '',\n this.getRunTags(run).join('; ')\n ]);\n\n const csvContent = [headers, ...rows]\n .map(row => row.map(cell => `\"${cell}\"`).join(','))\n .join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `test-suite-run-${this.record.ID.substring(0, 8)}-results.csv`;\n link.click();\n URL.revokeObjectURL(link.href);\n\n SharedService.Instance.CreateSimpleNotification('Export complete', 'success', 2000);\n }\n}\n","<div class=\"test-suite-run-form\" kendoDialogContainer>\n <!-- Header Section -->\n <div class=\"suite-run-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 @if (testSuite) {\n <li>\n <i class=\"fas fa-chevron-right separator\"></i>\n <a href=\"javascript:void(0)\" (click)=\"openTestSuite()\">\n <i class=\"fas fa-layer-group\"></i>\n <span class=\"breadcrumb-text\">{{ testSuite.Name }}</span>\n </a>\n </li>\n }\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <span>Run #{{ record.ID.substring(0, 8) }}</span>\n </li>\n </ol>\n </nav>\n\n <!-- Header Content -->\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"suite-run-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n <div class=\"suite-run-info\">\n <h1>Suite Run</h1>\n <div class=\"suite-run-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n {{ record.Status }}\n </span>\n @if (record.Environment) {\n <span class=\"meta-tag environment\">\n <i class=\"fas fa-server\"></i>\n {{ record.Environment }}\n </span>\n }\n @if (record.TriggerType) {\n <span class=\"meta-tag trigger\">\n <i class=\"fas fa-bolt\"></i>\n {{ record.TriggerType }}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <!-- Evaluation Mode Toggle -->\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n @if (record.SuiteID) {\n <button kendoButton (click)=\"reRunSuite()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Re-run Suite\n </button>\n }\n <button kendoButton (click)=\"refresh()\" [disabled]=\"isRefreshing\">\n <i class=\"fas\" [ngClass]=\"isRefreshing ? 'fa-sync fa-spin' : 'fa-sync'\"></i>\n {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n </button>\n </div>\n </div>\n\n <!-- Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ calculateDuration() }}</div>\n <div class=\"metric-label\">Duration</div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-percentage\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getPassRate().toFixed(1) }}%</div>\n <div class=\"metric-label\">Pass Rate</div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ formatCost(record.TotalCostUSD) }}</div>\n <div class=\"metric-label\">Total Cost</div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-calendar\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getRelativeTime(record.StartedAt) }}</div>\n <div class=\"metric-label\">Started</div>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <div class=\"result-item passed\">\n <div class=\"result-icon\">\n <i class=\"fas fa-check-circle\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.PassedTests || 0 }}</span>\n <span class=\"result-label\">Passed</span>\n </div>\n </div>\n <div class=\"result-item failed\">\n <div class=\"result-icon\">\n <i class=\"fas fa-times-circle\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.FailedTests || 0 }}</span>\n <span class=\"result-label\">Failed</span>\n </div>\n </div>\n <div class=\"result-item error\">\n <div class=\"result-icon\">\n <i class=\"fas fa-exclamation-circle\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.ErrorTests || 0 }}</span>\n <span class=\"result-label\">Errors</span>\n </div>\n </div>\n <div class=\"result-item skipped\">\n <div class=\"result-icon\">\n <i class=\"fas fa-forward\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.SkippedTests || 0 }}</span>\n <span class=\"result-label\">Skipped</span>\n </div>\n </div>\n <div class=\"result-item total\">\n <div class=\"result-icon\">\n <i class=\"fas fa-list\"></i>\n </div>\n <div class=\"result-content\">\n <span class=\"result-count\">{{ record.TotalTests || 0 }}</span>\n <span class=\"result-label\">Total</span>\n </div>\n </div>\n </div>\n\n <!-- Tags Section - Sleek inline design -->\n @if (!editingTags) {\n <div class=\"tags-bar\">\n <div class=\"tags-bar-content\">\n <span class=\"tags-bar-label\"><i class=\"fas fa-tags\"></i></span>\n @if (tags.length > 0) {\n <div class=\"tags-bar-chips\">\n @for (tag of tags; track tag) {\n <span class=\"tag-inline\">{{ tag }}</span>\n }\n </div>\n }\n @if (tags.length === 0) {\n <span class=\"tags-bar-empty\">No tags</span>\n }\n <button class=\"tags-bar-edit\" (click)=\"startEditingTags()\" title=\"Edit tags\">\n <i class=\"fas fa-plus\"></i> Add\n </button>\n </div>\n </div>\n }\n\n <!-- Tags Editor - Expanded when editing -->\n @if (editingTags) {\n <div class=\"tags-editor-panel\">\n <div class=\"tags-editor-header\">\n <span class=\"tags-editor-title\"><i class=\"fas fa-tags\"></i> Edit Tags</span>\n </div>\n <div class=\"tags-editor-body\">\n <div class=\"tags-editor-chips\">\n @for (tag of tags; track tag) {\n <span class=\"tag-editable\">\n {{ tag }}\n <button class=\"tag-remove-btn\" (click)=\"removeTag(tag)\" title=\"Remove tag\">\n <i class=\"fas fa-times\"></i>\n </button>\n </span>\n }\n @if (tags.length === 0) {\n <span class=\"tags-empty-hint\">No tags yet</span>\n }\n </div>\n <div class=\"tags-editor-input\">\n <input type=\"text\"\n [(ngModel)]=\"newTag\"\n placeholder=\"Type a tag and press Enter...\"\n (keyup.enter)=\"addTag()\"\n class=\"tag-text-input\" />\n <button kendoButton (click)=\"addTag()\" [disabled]=\"!newTag.trim()\" fillMode=\"flat\">\n <i class=\"fas fa-plus\"></i>\n </button>\n </div>\n </div>\n <div class=\"tags-editor-footer\">\n <button kendoButton (click)=\"saveTags()\" themeColor=\"primary\" [disabled]=\"savingTags\">\n @if (savingTags) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n {{ savingTags ? 'Saving...' : 'Save' }}\n </button>\n <button kendoButton (click)=\"cancelEditingTags()\" fillMode=\"flat\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i> Overview\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-list\"></i> Test Runs\n @if (testRunsLoaded) {\n <span class=\"tab-badge\">{{ testRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'details'\"\n (click)=\"changeTab('details')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'details'\">\n <i class=\"fas fa-info-circle\"></i> Details\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 title=\"Press 4\">\n <i class=\"fas fa-chart-bar\"></i> Analytics\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'execution'\"\n (click)=\"changeTab('execution')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'execution'\"\n title=\"Press 5\">\n <i class=\"fas fa-microchip\"></i>\n <span>Execution</span>\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Result Hero -->\n <div class=\"result-hero\"\n [class.passed]=\"record.Status === 'Completed' && getPassRate() >= 90\"\n [class.failed]=\"record.Status === 'Failed' || getPassRate() < 50\"\n [class.running]=\"record.Status === 'Running'\"\n [class.pending]=\"record.Status === 'Pending'\">\n <div class=\"result-hero-icon\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n <div class=\"result-hero-text\">\n <h2>SUITE {{ record.Status.toUpperCase() || 'UNKNOWN' }}</h2>\n <div class=\"result-hero-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{ getPassRate().toFixed(1) }}%</span>\n <span class=\"stat-label\">Pass Rate</span>\n </div>\n <div class=\"stat-divider\"></div>\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{ record.PassedTests || 0 }} / {{ record.TotalTests || 0 }}</span>\n <span class=\"stat-label\">Tests Passed</span>\n </div>\n </div>\n </div>\n </div>\n <!-- Evaluation Metrics Summary -->\n @if (evaluationMetrics && feedbacksLoaded) {\n <div class=\"evaluation-summary\">\n <div class=\"eval-summary-grid\">\n <!-- Human Feedback Card -->\n @if (evalPreferences.showHuman) {\n <div class=\"eval-summary-card\">\n <div class=\"eval-card-header\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Human Feedback</span>\n </div>\n <div class=\"eval-card-body\">\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Reviewed</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.humanReviewedCount }} / {{ evaluationMetrics.totalRuns }}</span>\n </div>\n @if (evaluationMetrics.humanReviewedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Avg Rating</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.humanAvgRating.toFixed(1) }}/10</span>\n </div>\n }\n @if (evaluationMetrics.humanReviewedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Correct</span>\n <span class=\"eval-stat-value correct\">{{ evaluationMetrics.humanCorrectCount }}</span>\n @if (evaluationMetrics.humanIncorrectCount > 0) {\n <span class=\"eval-stat-value incorrect\">{{ evaluationMetrics.humanIncorrectCount }} incorrect</span>\n }\n </div>\n }\n </div>\n @if (evaluationMetrics.humanPendingCount > 0) {\n <div class=\"eval-card-footer\">\n <span class=\"pending-badge\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ evaluationMetrics.humanPendingCount }} need review\n </span>\n </div>\n }\n </div>\n }\n <!-- Auto Score Card -->\n @if (evalPreferences.showAuto) {\n <div class=\"eval-summary-card\">\n <div class=\"eval-card-header\">\n <i class=\"fa-solid fa-robot\"></i>\n <span>Auto Evaluation</span>\n </div>\n <div class=\"eval-card-body\">\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Evaluated</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.autoEvaluatedCount }} / {{ evaluationMetrics.totalRuns }}</span>\n </div>\n @if (evaluationMetrics.autoEvaluatedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Avg Score</span>\n <span class=\"eval-stat-value\">{{ (evaluationMetrics.autoAvgScore * 100).toFixed(0) }}%</span>\n </div>\n }\n @if (evaluationMetrics.autoEvaluatedCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Pass Rate</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.autoPassRate.toFixed(0) }}%</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Execution Card -->\n @if (evalPreferences.showExecution) {\n <div class=\"eval-summary-card\">\n <div class=\"eval-card-header\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Execution</span>\n </div>\n <div class=\"eval-card-body\">\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Completed</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.execCompletedCount }} / {{ evaluationMetrics.totalRuns }}</span>\n </div>\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Success Rate</span>\n <span class=\"eval-stat-value\">{{ evaluationMetrics.execSuccessRate.toFixed(0) }}%</span>\n </div>\n @if (evaluationMetrics.execErrorCount > 0 || evaluationMetrics.execTimeoutCount > 0) {\n <div class=\"eval-stat-row\">\n <span class=\"eval-stat-label\">Issues</span>\n @if (evaluationMetrics.execErrorCount > 0) {\n <span class=\"eval-stat-value error\">{{ evaluationMetrics.execErrorCount }} errors</span>\n }\n @if (evaluationMetrics.execTimeoutCount > 0) {\n <span class=\"eval-stat-value timeout\">{{ evaluationMetrics.execTimeoutCount }} timeouts</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Needs Review Section -->\n @if (evalPreferences.showHuman && needsReviewItems.length > 0 && feedbacksLoaded) {\n <div class=\"needs-review-section\">\n <div class=\"needs-review-header\">\n <h3><i class=\"fa-solid fa-user-clock\"></i> Needs Review</h3>\n <span class=\"review-count\">{{ needsReviewItems.length }} items</span>\n </div>\n <div class=\"needs-review-list\">\n @for (item of needsReviewItems.slice(0, 5); track item) {\n <div class=\"review-item\"\n [class.high-priority]=\"item.priority === 'high'\"\n [class.medium-priority]=\"item.priority === 'medium'\"\n (click)=\"toggleRunExpanded(item.run.id)\">\n <div class=\"review-item-icon\">\n @if (item.priority === 'high') {\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n }\n @if (item.priority === 'medium') {\n <i class=\"fa-solid fa-circle-dot\"></i>\n }\n @if (item.priority === 'low') {\n <i class=\"fa-solid fa-clock\"></i>\n }\n </div>\n <div class=\"review-item-content\">\n <span class=\"review-item-name\">{{ item.run.testName }}</span>\n <span class=\"review-item-reason\">{{ item.reason }}</span>\n </div>\n <div class=\"review-item-action\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div>\n </div>\n }\n @if (needsReviewItems.length > 5) {\n <div class=\"review-more\">\n <button kendoButton fillMode=\"flat\" (click)=\"changeTab('runs')\">\n View all {{ needsReviewItems.length }} items\n </button>\n </div>\n }\n </div>\n </div>\n }\n <!-- Progress Ring (when running) -->\n @if (record.Status === 'Running' || record.Status === 'Pending') {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n <span>Suite execution in progress...</span>\n </div>\n <div class=\"auto-refresh-notice\">\n <i class=\"fas fa-sync\"></i>\n Auto-refreshing every 5 seconds\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Test Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Toolbar -->\n @if (testRunsLoaded && testRuns.length > 0) {\n <div class=\"runs-toolbar\">\n <div class=\"run-filters\">\n <button class=\"filter-btn\"\n [class.active]=\"runStatusFilter === null\"\n (click)=\"setRunStatusFilter(null)\">\n All ({{ testRuns.length }})\n </button>\n @if (getRunCountByStatus('Passed') > 0) {\n <button class=\"filter-btn passed\"\n [class.active]=\"runStatusFilter === 'Passed'\"\n (click)=\"setRunStatusFilter('Passed')\"\n >\n <i class=\"fas fa-check\"></i> Passed ({{ getRunCountByStatus('Passed') }})\n </button>\n }\n @if (getRunCountByStatus('Failed') > 0) {\n <button class=\"filter-btn failed\"\n [class.active]=\"runStatusFilter === 'Failed'\"\n (click)=\"setRunStatusFilter('Failed')\"\n >\n <i class=\"fas fa-times\"></i> Failed ({{ getRunCountByStatus('Failed') }})\n </button>\n }\n @if (getRunCountByStatus('Error') > 0) {\n <button class=\"filter-btn error\"\n [class.active]=\"runStatusFilter === 'Error'\"\n (click)=\"setRunStatusFilter('Error')\"\n >\n <i class=\"fas fa-exclamation\"></i> Error ({{ getRunCountByStatus('Error') }})\n </button>\n }\n </div>\n <div class=\"runs-actions\">\n <button kendoButton (click)=\"exportToCSV()\">\n <i class=\"fas fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n }\n <!-- Loading State -->\n @if (loadingTestRuns) {\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 <!-- Test Runs List -->\n @if (!loadingTestRuns && testRuns.length > 0) {\n <div class=\"test-runs-list\">\n @for (run of getFilteredTestRuns(); track run) {\n <div class=\"test-run-card\">\n <div class=\"test-run-item\" (click)=\"toggleRunExpanded(run.ID)\">\n <div class=\"run-sequence\">{{ run.Sequence || '-' }}</div>\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\" [ngClass]=\"getRunStatusIcon(run.Status)\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header-row\">\n <div class=\"run-name\">{{ run.Test }}</div>\n <!-- Evaluation Badge -->\n <app-evaluation-badge\n [executionStatus]=\"run.Status\"\n [originalStatus]=\"run.Status\"\n [autoScore]=\"run.Score\"\n [humanRating]=\"getFeedbackRating(run.ID) || null\"\n [humanIsCorrect]=\"getHumanIsCorrect(run.ID)\"\n [hasHumanFeedback]=\"hasFeedback(run.ID)\"\n [preferences]=\"evalPreferences\"\n [mode]=\"'compact'\">\n </app-evaluation-badge>\n </div>\n <div class=\"run-meta\">\n @if (run.DurationSeconds) {\n <span class=\"run-duration\">\n <i class=\"fas fa-clock\"></i> {{ run.DurationSeconds.toFixed(1) }}s\n </span>\n }\n @if (run.CostUSD) {\n <span class=\"run-cost\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.CostUSD.toFixed(6) }}\n </span>\n }\n @if (run.TargetLogEntityID && run.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"run.TargetLogEntity\"\n [recordId]=\"run.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n @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 <div class=\"run-expand\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedRunId !== run.ID\" [class.fa-chevron-up]=\"expandedRunId === run.ID\"></i>\n </div>\n </div>\n <!-- Expanded Inline Feedback -->\n @if (expandedRunId === run.ID) {\n <div class=\"inline-feedback\">\n <div class=\"feedback-divider\"></div>\n <div class=\"feedback-section\">\n <div class=\"feedback-label\">Quick Feedback</div>\n <div class=\"inline-rating\">\n <div class=\"rating-numbers\">\n @for (num of [1,2,3,4,5,6,7,8,9,10]; track num) {\n <button\n type=\"button\"\n class=\"rating-btn\"\n [class.selected]=\"num === inlineRating\"\n [class.hover]=\"num === inlineHoverRating\"\n [class.low]=\"num <= 3\"\n [class.mid]=\"num >= 4 && num <= 6\"\n [class.high]=\"num >= 7\"\n (click)=\"setInlineRating(num); $event.stopPropagation()\"\n (mouseenter)=\"inlineHoverRating = num\"\n (mouseleave)=\"inlineHoverRating = 0\">\n {{ num }}\n </button>\n }\n </div>\n @if (inlineRating > 0) {\n <div class=\"rating-info\">\n <span class=\"rating-value\">{{ inlineRating }}/10</span>\n <span class=\"rating-label-text\">{{ getInlineRatingLabel() }}</span>\n </div>\n }\n </div>\n <div class=\"correctness-row\">\n <span class=\"correctness-label\">Was it correct?</span>\n <div class=\"correctness-options\">\n <label class=\"radio-opt\" (click)=\"$event.stopPropagation()\">\n <input type=\"radio\" name=\"correct-{{run.ID}}\" [value]=\"true\" [(ngModel)]=\"inlineIsCorrect\">\n <span>Yes</span>\n </label>\n <label class=\"radio-opt\" (click)=\"$event.stopPropagation()\">\n <input type=\"radio\" name=\"correct-{{run.ID}}\" [value]=\"false\" [(ngModel)]=\"inlineIsCorrect\">\n <span>No</span>\n </label>\n <label class=\"radio-opt\" (click)=\"$event.stopPropagation()\">\n <input type=\"radio\" name=\"correct-{{run.ID}}\" [value]=\"null\" [(ngModel)]=\"inlineIsCorrect\">\n <span>Not Sure</span>\n </label>\n </div>\n </div>\n <div class=\"comments-row\" (click)=\"$event.stopPropagation()\">\n <textarea\n class=\"feedback-textarea\"\n [(ngModel)]=\"inlineComments\"\n placeholder=\"Add comments or corrections...\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"feedback-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton (click)=\"openTestRun(run.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Full Details\n </button>\n <button kendoButton\n themeColor=\"primary\"\n (click)=\"saveInlineFeedback()\"\n [disabled]=\"!canSubmitInlineFeedback() || savingInlineFeedback\">\n <i class=\"fas\" [ngClass]=\"savingInlineFeedback ? 'fa-spinner fa-spin' : 'fa-save'\"></i>\n {{ savingInlineFeedback ? 'Saving...' : (hasFeedback(run.ID) ? 'Update' : 'Save') }}\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testRunsLoaded && !loadingTestRuns && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-inbox\"></i>\n </div>\n <h4>No Test Runs Found</h4>\n <p>No test runs have been recorded for this suite execution.</p>\n </div>\n }\n <!-- Filtered Empty -->\n @if (testRunsLoaded && !loadingTestRuns && testRuns.length > 0 && getFilteredTestRuns().length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-filter\"></i>\n </div>\n <h4>No Matching Runs</h4>\n <p>No test runs match the current filter.</p>\n <button kendoButton (click)=\"setRunStatusFilter(null)\">Clear Filter</button>\n </div>\n }\n </div>\n }\n\n <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"details-tab\">\n <div class=\"details-card\">\n <h3><i class=\"fas fa-info-circle\"></i> Run Information</h3>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <div class=\"detail-label\">Run ID</div>\n <div class=\"detail-value monospace\">{{ record.ID }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Test Suite</div>\n <div class=\"detail-value\">\n @if (testSuite) {\n <a href=\"javascript:void(0)\" (click)=\"openTestSuite()\">{{ testSuite.Name }}</a>\n }\n @if (!testSuite) {\n <span>Loading...</span>\n }\n </div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Status</div>\n <div class=\"detail-value\">\n <span class=\"status-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Run By</div>\n <div class=\"detail-value\">{{ record.RunByUser || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Started At</div>\n <div class=\"detail-value\">{{ record.StartedAt | date:'medium' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Completed At</div>\n <div class=\"detail-value\">{{ record.CompletedAt | date:'medium' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Environment</div>\n <div class=\"detail-value\">{{ record.Environment || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Trigger Type</div>\n <div class=\"detail-value\">{{ record.TriggerType || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Git Commit</div>\n <div class=\"detail-value monospace\">{{ record.GitCommit || 'N/A' }}</div>\n </div>\n <div class=\"detail-item\">\n <div class=\"detail-label\">Agent Version</div>\n <div class=\"detail-value\">{{ record.AgentVersion || 'N/A' }}</div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"analytics-tab\">\n <!-- Loading State -->\n @if (loadingTestRuns) {\n <div class=\"analytics-loading\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading test results...</span>\n </div>\n }\n <!-- Summary Statistics - Moved to top for better overview -->\n @if (!loadingTestRuns && testRuns.length > 0) {\n <div class=\"analytics-section\">\n <h3><i class=\"fas fa-chart-pie\"></i> Summary Statistics</h3>\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-icon passed\"><i class=\"fas fa-check-circle\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ getPassedCount() }}</div>\n <div class=\"stat-label\">Passed</div>\n <div class=\"stat-percent\">{{ getPassedPercent().toFixed(1) }}%</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon failed\"><i class=\"fas fa-times-circle\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ getFailedCount() }}</div>\n <div class=\"stat-label\">Failed</div>\n <div class=\"stat-percent\">{{ getFailedPercent().toFixed(1) }}%</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon score\"><i class=\"fas fa-star\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ (getAverageScore() * 100).toFixed(1) }}%</div>\n <div class=\"stat-label\">Avg Score</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon duration\"><i class=\"fas fa-clock\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{ getAverageDuration().toFixed(1) }}s</div>\n <div class=\"stat-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon cost\"><i class=\"fas fa-dollar-sign\"></i></div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">${{ getTotalCost().toFixed(4) }}</div>\n <div class=\"stat-label\">Total Cost</div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Test Results Table -->\n @if (!loadingTestRuns && testRuns.length > 0) {\n <div class=\"analytics-section\">\n <div class=\"analytics-header\">\n <h3><i class=\"fas fa-table\"></i> Test Results</h3>\n <div class=\"analytics-legend\">\n <span class=\"legend-item passed\"><i class=\"fas fa-check-circle\"></i> Passed</span>\n <span class=\"legend-item failed\"><i class=\"fas fa-times-circle\"></i> Failed</span>\n <span class=\"legend-item error\"><i class=\"fas fa-exclamation-circle\"></i> Error</span>\n <span class=\"legend-item skipped\"><i class=\"fas fa-forward\"></i> Skipped</span>\n </div>\n </div>\n <!-- Results Table -->\n <div class=\"results-table-wrapper\">\n <table class=\"results-table\">\n <thead>\n <tr>\n <th class=\"seq-col\">#</th>\n <th class=\"name-col\">Test Name</th>\n @if (evalPreferences.showExecution) {\n <th class=\"status-col\">Status</th>\n }\n @if (evalPreferences.showAuto) {\n <th class=\"score-col\">Auto Score</th>\n }\n @if (evalPreferences.showHuman) {\n <th class=\"feedback-col\">Human Score</th>\n }\n <th class=\"duration-col\">Duration</th>\n <th class=\"cost-col\">Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (run of testRuns; track run; let i = $index) {\n <tr\n class=\"result-row\"\n [class.row-passed]=\"run.Status === 'Passed'\"\n [class.row-failed]=\"run.Status === 'Failed'\"\n [class.row-error]=\"run.Status === 'Error'\"\n [class.row-skipped]=\"run.Status === 'Skipped'\"\n (click)=\"openTestRun(run.ID)\">\n <td class=\"seq-col\">{{ i + 1 }}</td>\n <td class=\"name-col\">\n <div class=\"test-name-wrapper\">\n <span class=\"test-name\">{{ run.Test || 'Unknown Test' }}</span>\n @if (getRunTags(run).length > 0) {\n <div class=\"test-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 </td>\n @if (evalPreferences.showExecution) {\n <td class=\"status-col\">\n <span class=\"status-badge\" [ngClass]=\"'status-' + run.Status.toLowerCase()\">\n <i class=\"fas\"\n [class.fa-check-circle]=\"run.Status === 'Passed'\"\n [class.fa-times-circle]=\"run.Status === 'Failed'\"\n [class.fa-exclamation-circle]=\"run.Status === 'Error'\"\n [class.fa-forward]=\"run.Status === 'Skipped'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-spin]=\"run.Status === 'Running'\"></i>\n {{ run.Status }}\n </span>\n </td>\n }\n @if (evalPreferences.showAuto) {\n <td class=\"score-col\">\n @if (run.Score != null) {\n <div class=\"score-display\">\n <div class=\"score-bar-mini\">\n <div class=\"score-fill\"\n [style.width.%]=\"run.Score * 100\"\n [class.high]=\"run.Score >= 0.8\"\n [class.medium]=\"run.Score >= 0.5 && run.Score < 0.8\"\n [class.low]=\"run.Score < 0.5\"></div>\n </div>\n <span class=\"score-text\">{{ (run.Score * 100).toFixed(0) }}%</span>\n </div>\n }\n @if (run.Score == null) {\n <span class=\"na-value\">—</span>\n }\n </td>\n }\n @if (evalPreferences.showHuman) {\n <td class=\"feedback-col\">\n @if (hasFeedback(run.ID)) {\n <div class=\"feedback-display\">\n <span class=\"feedback-rating\" [class.low]=\"getFeedbackRating(run.ID) <= 3\" [class.mid]=\"getFeedbackRating(run.ID) >= 4 && getFeedbackRating(run.ID) <= 6\" [class.high]=\"getFeedbackRating(run.ID) >= 7\">\n {{ getFeedbackRating(run.ID) }}/10\n </span>\n @if (getHumanIsCorrect(run.ID) !== null) {\n <span class=\"feedback-correctness\">\n <i class=\"fas\" [class.fa-check]=\"getHumanIsCorrect(run.ID) === true\" [class.fa-times]=\"getHumanIsCorrect(run.ID) === false\" [class.correct]=\"getHumanIsCorrect(run.ID) === true\" [class.incorrect]=\"getHumanIsCorrect(run.ID) === false\"></i>\n </span>\n }\n </div>\n }\n @if (!hasFeedback(run.ID)) {\n <span class=\"na-value needs-review\">\n <i class=\"fas fa-user-clock\"></i>\n </span>\n }\n </td>\n }\n <td class=\"duration-col\">\n @if (run.DurationSeconds) {\n <span>{{ run.DurationSeconds.toFixed(1) }}s</span>\n }\n @if (!run.DurationSeconds) {\n <span class=\"na-value\">—</span>\n }\n </td>\n <td class=\"cost-col\">\n @if (run.CostUSD) {\n <span>${{ run.CostUSD.toFixed(4) }}</span>\n }\n @if (!run.CostUSD) {\n <span class=\"na-value\">—</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (!loadingTestRuns && testRunsLoaded && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-bar\"></i>\n </div>\n <h4>No Test Results Yet</h4>\n <p>Test runs will appear here once the suite execution completes.</p>\n </div>\n }\n </div>\n }\n\n <!-- Execution Tab -->\n @if (activeTab === 'execution') {\n <div class=\"execution-tab\">\n <mj-execution-context\n [machineName]=\"record.MachineName\"\n [machineId]=\"record.MachineID\"\n [runByUserName]=\"record.RunByUserName\"\n [runByUserEmail]=\"record.RunByUserEmail\"\n [runContextDetailsJson]=\"record.RunContextDetails\">\n </mj-execution-context>\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>Re-run Suite</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Shift</kbd><kbd>R</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"]}