@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.
- package/dist/lib/custom/Tests/test-form.component.js +1 -1
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +28 -24
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.form.component.js +19 -17
- package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js +46 -14
- package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js.map +1 -1
- package/package.json +31 -31
|
@@ -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"]}
|