@memberjunction/ng-core-entity-forms 5.21.0 → 5.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"test-run-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-run-form.component.ts","../../../../src/lib/custom/Tests/test-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 { MJTestRunEntity, MJTestEntity, MJTestSuiteRunEntity, MJAIAgentRunEntity, MJAIPromptRunEntity, MJTestRunFeedbackEntity } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestRunFormComponent } from '../../generated/Entities/MJTestRun/mjtestrun.form.component';\nimport { TestingDialogService, TagsHelper } from '@memberjunction/ng-testing';\nimport { createCopyOnlyToolbar, ToolbarConfig } from '@memberjunction/ng-code-editor';\n\ninterface ParsedData {\n input?: Record<string, unknown>;\n expected?: Record<string, unknown>;\n actual?: Record<string, unknown>;\n resultDetails?: Record<string, unknown>;\n}\n\ninterface CheckResult {\n name: string;\n passed: boolean;\n message?: string;\n weight?: number;\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Test Runs')\n@Component({\n standalone: false,\n selector: 'mj-test-run-form',\n templateUrl: './test-run-form.component.html',\n styleUrls: ['./test-run-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestRunFormComponentExtended extends MJTestRunFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestRunEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingAIRuns = false;\n loadingFeedback = false;\n error: string | null = null;\n aiRunsLoaded = false;\n feedbackLoaded = false;\n isRefreshing = false;\n autoRefreshEnabled = false;\n\n // Related entities\n test: MJTestEntity | null = null;\n testSuiteRun: MJTestSuiteRunEntity | null = null;\n aiAgentRuns: MJAIAgentRunEntity[] = [];\n aiPromptRuns: MJAIPromptRunEntity[] = [];\n feedbacks: MJTestRunFeedbackEntity[] = [];\n\n // Parsed JSON data\n parsedData: ParsedData = {};\n\n // Active comparison view\n comparisonView: 'input' | 'expected' | 'actual' = 'input';\n\n // Code editor configuration\n jsonToolbar: ToolbarConfig = createCopyOnlyToolbar();\n\n // Keyboard shortcuts active\n keyboardShortcutsEnabled = true;\n\n // Tags management\n tags: string[] = [];\n newTag = '';\n editingTags = false;\n savingTags = false;\n private originalTags: string[] = [];\n\n // Service injections\n private navigationService = inject(NavigationService);\n private testingDialogService = inject(TestingDialogService);\n private appManager = inject(ApplicationManager);\n private viewContainerRef = inject(ViewContainerRef);\n\n async ngOnInit() {\n await super.ngOnInit();\n\n if (this.record && this.record.ID) {\n await this.loadRelatedData();\n this.parseJsonFields();\n this.loadTags();\n\n // Auto-refresh for running tests\n if (this.record.Status === 'Running' || this.record.Status === 'Pending') {\n this.startAutoRefresh();\n }\n }\n }\n\n private loadTags(): void {\n this.tags = TagsHelper.parseTags(this.record.Tags);\n this.originalTags = [...this.tags];\n }\n\n startEditingTags(): void {\n this.originalTags = [...this.tags];\n this.editingTags = true;\n this.cdr.markForCheck();\n }\n\n cancelEditingTags(): void {\n this.tags = [...this.originalTags];\n this.newTag = '';\n this.editingTags = false;\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.originalTags = [...this.tags];\n this.editingTags = false;\n SharedService.Instance.CreateSimpleNotification('Tags saved', 'success', 2000);\n } else {\n SharedService.Instance.CreateSimpleNotification('Failed to save tags', 'error', 3000);\n }\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to save tags', 'error', 3000);\n } finally {\n this.savingTags = false;\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Shift + R: Re-run test\n if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === 'r') {\n event.preventDefault();\n this.reRunTest();\n return;\n }\n\n // Number keys for tabs (1-5)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('details'); break;\n case '3': this.changeTab('ai-runs'); break;\n case '4': this.changeTab('feedback'); break;\n case '5': if (this.record.Log) this.changeTab('log'); 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.parseJsonFields();\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\n if (this.record.TestID) {\n const md = new Metadata();\n const test = await md.GetEntityObject<MJTestEntity>('MJ: Tests');\n if (test && await test.Load(this.record.TestID)) {\n this.test = test;\n }\n }\n\n // Load test suite run if part of a suite\n if (this.record.TestSuiteRunID) {\n const md = new Metadata();\n const suiteRun = await md.GetEntityObject<MJTestSuiteRunEntity>('MJ: Test Suite Runs');\n if (suiteRun && await suiteRun.Load(this.record.TestSuiteRunID)) {\n this.testSuiteRun = suiteRun;\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 loadAIRuns() {\n if (this.aiRunsLoaded) return;\n\n this.loadingAIRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const [agentRuns, promptRuns] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `TestRunID='${this.record.ID}'`,\n OrderBy: 'StartedAt',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `TestRunID='${this.record.ID}'`,\n OrderBy: 'RunAt',\n ResultType: 'entity_object'\n }\n ]);\n\n if (agentRuns.Success) {\n this.aiAgentRuns = agentRuns.Results || [];\n }\n\n if (promptRuns.Success) {\n this.aiPromptRuns = promptRuns.Results || [];\n }\n\n this.aiRunsLoaded = true;\n } catch (error) {\n console.error('Error loading AI runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load AI runs', 'error', 3000);\n } finally {\n this.loadingAIRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadFeedback() {\n if (this.feedbackLoaded) return;\n\n this.loadingFeedback = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID='${this.record.ID}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.feedbacks = result.Results || [];\n }\n\n this.feedbackLoaded = true;\n } catch (error) {\n console.error('Error loading feedback:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load feedback', 'error', 3000);\n } finally {\n this.loadingFeedback = false;\n this.cdr.markForCheck();\n }\n }\n\n private parseJsonFields() {\n try {\n if (this.record.InputData) {\n this.parsedData.input = JSON.parse(this.record.InputData);\n }\n if (this.record.ExpectedOutputData) {\n this.parsedData.expected = JSON.parse(this.record.ExpectedOutputData);\n }\n if (this.record.ActualOutputData) {\n this.parsedData.actual = JSON.parse(this.record.ActualOutputData);\n }\n if (this.record.ResultDetails) {\n this.parsedData.resultDetails = JSON.parse(this.record.ResultDetails);\n }\n } catch (error) {\n console.error('Error parsing JSON fields:', error);\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if (tab === 'ai-runs' && !this.aiRunsLoaded) {\n this.loadAIRuns();\n }\n\n if (tab === 'feedback' && !this.feedbackLoaded) {\n this.loadFeedback();\n }\n\n this.cdr.markForCheck();\n }\n\n setComparisonView(view: 'input' | 'expected' | 'actual') {\n this.comparisonView = view;\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.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 getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Passed': return 'fa-check-circle';\n case 'Failed': return 'fa-times-circle';\n case 'Error': return 'fa-exclamation-triangle';\n case 'Timeout': return 'fa-stopwatch';\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-circle';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n calculateDuration(): string {\n if (!this.record.DurationSeconds) return 'N/A';\n\n const seconds = this.record.DurationSeconds;\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 formatScore(score: number | null): string {\n if (score === null || score === undefined) return 'N/A';\n return score.toFixed(4);\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 getScorePercentage(): number {\n if (this.record.Score === null || this.record.Score === undefined) return 0;\n return Math.round(this.record.Score * 100);\n }\n\n getPassRatePercentage(): number {\n const total = this.record.TotalChecks || 0;\n const passed = this.record.PassedChecks || 0;\n if (total === 0) return 0;\n return Math.round((passed / total) * 100);\n }\n\n openTest() {\n if (this.test) {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(this.test.ID));\n }\n }\n\n navigateToTestingDashboard() {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n openTestSuiteRun() {\n if (this.testSuiteRun) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suite Runs', CompositeKey.FromID(this.testSuiteRun.ID));\n }\n }\n\n openAIAgentRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: AI Agent Runs', CompositeKey.FromID(runId));\n }\n\n openAIPromptRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: AI Prompt Runs', CompositeKey.FromID(runId));\n }\n\n async reRunTest() {\n if (!this.record.TestID) {\n SharedService.Instance.CreateSimpleNotification('Cannot re-run: Test ID not available', 'error', 3000);\n return;\n }\n\n this.testingDialogService.OpenTestDialog(this.record.TestID, 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 this.parseJsonFields();\n\n // Reset lazy-loaded data to force reload\n this.aiRunsLoaded = false;\n this.feedbackLoaded = false;\n this.aiAgentRuns = [];\n this.aiPromptRuns = [];\n this.feedbacks = [];\n\n // Reload current tab data if needed\n if (this.activeTab === 'ai-runs') {\n await this.loadAIRuns();\n } else if (this.activeTab === 'feedback') {\n await this.loadFeedback();\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 getComparisonData(): string {\n let data: Record<string, unknown> | undefined;\n switch (this.comparisonView) {\n case 'input': data = this.parsedData.input; break;\n case 'expected': data = this.parsedData.expected; break;\n case 'actual': data = this.parsedData.actual; break;\n }\n return data ? JSON.stringify(data, null, 2) : '// No data available';\n }\n\n getCheckResults(): CheckResult[] {\n const details = this.parsedData.resultDetails as Record<string, unknown> | undefined;\n if (!details?.checkResults) return [];\n return details.checkResults as CheckResult[];\n }\n\n getPassRate(): number {\n const total = this.record.TotalChecks || 0;\n const passed = this.record.PassedChecks || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\n }\n\n async copyLogToClipboard(): Promise<void> {\n if (this.record.Log) {\n try {\n await navigator.clipboard.writeText(this.record.Log);\n SharedService.Instance.CreateSimpleNotification('Log copied to clipboard', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to copy log', 'error', 2000);\n }\n }\n }\n\n getFormattedResultDetails(): string {\n return this.parsedData.resultDetails\n ? JSON.stringify(this.parsedData.resultDetails, null, 2)\n : '// No result details available';\n }\n\n // Helper for relative time display\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","<div class=\"test-run-form\" [class.is-mobile]=\"false\">\n <!-- Error State -->\n @if (error) {\n <div class=\"error-banner\" (click)=\"retryLoad()\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ error }}</span>\n <button class=\"retry-btn\">\n <i class=\"fas fa-redo\"></i> Retry\n </button>\n </div>\n }\n\n <!-- Header Section -->\n <div class=\"test-run-header\" [class]=\"getStatusClass()\">\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 (test) {\n <li>\n <i class=\"fas fa-chevron-right separator\"></i>\n <a href=\"javascript:void(0)\" (click)=\"openTest()\">\n <i class=\"fas fa-flask\"></i>\n <span class=\"breadcrumb-text\">{{ test.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 <div class=\"header-content\">\n <div class=\"header-left\">\n <!-- Status Indicator -->\n <div class=\"status-indicator\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n\n <div class=\"test-run-info\">\n <h1>\n Test Run\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n </h1>\n <div class=\"test-run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n {{ record.Status }}\n </span>\n @if (test) {\n <span class=\"meta-item\">\n <i class=\"fas fa-flask\"></i>\n {{ test.Type }}\n </span>\n }\n @if (autoRefreshEnabled) {\n <span class=\"meta-item\">\n <i class=\"fas fa-sync-alt fa-spin\"></i>\n Auto-refreshing\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"header-actions\">\n <button kendoButton (click)=\"reRunTest()\" [disabled]=\"!record.TestID\" title=\"Re-run this test (Cmd+Shift+R)\">\n <i class=\"fas fa-redo\"></i>\n <span class=\"btn-text\">Re-run</span>\n </button>\n <button kendoButton (click)=\"refresh()\" [disabled]=\"isRefreshing\" title=\"Refresh (Cmd+R)\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"isRefreshing\"></i>\n <span class=\"btn-text\">Refresh</span>\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-label\">Started</div>\n <div class=\"metric-value\">{{ getRelativeTime(record.StartedAt) }}</div>\n <div class=\"metric-detail\">{{ record.StartedAt | date:'short' }}</div>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-stopwatch\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ calculateDuration() }}</div>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Score</div>\n <div class=\"metric-value\">{{ formatScore(record.Score) }}</div>\n @if (record.Score != null) {\n <div class=\"metric-progress\">\n <div class=\"progress-bar\" [style.width.%]=\"getScorePercentage()\" [style.background-color]=\"getStatusColor()\"></div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-check-double\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Checks</div>\n <div class=\"metric-value\">{{ record.PassedChecks }}/{{ record.TotalChecks }}</div>\n @if (record.TotalChecks) {\n <div class=\"metric-progress\">\n <div class=\"progress-bar\" [style.width.%]=\"getPassRatePercentage()\" [style.background-color]=\"getStatusColor()\"></div>\n </div>\n }\n </div>\n </div>\n\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-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.CostUSD) }}</div>\n </div>\n </div>\n </div>\n\n <!-- Secondary Info -->\n @if (record.RunByUser || testSuiteRun || record.TargetLogEntityID) {\n <div class=\"secondary-info\">\n @if (record.RunByUser) {\n <span class=\"info-chip\">\n <i class=\"fas fa-user\"></i>\n {{ record.RunByUser }}\n </span>\n }\n @if (testSuiteRun) {\n <span class=\"info-chip clickable\" (click)=\"openTestSuiteRun()\">\n <i class=\"fas fa-layer-group\"></i>\n Part of Suite Run (Seq: {{ record.Sequence }})\n </span>\n }\n <!-- Target Entity Link Pill -->\n @if (record.TargetLogEntityID && record.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"record.TargetLogEntity\"\n [recordId]=\"record.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n }\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\" [class.active]=\"activeTab === 'overview'\" (click)=\"changeTab('overview')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'overview'\" title=\"Press 1\">\n <i class=\"fas fa-chart-pie\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'details'\" title=\"Press 2\">\n <i class=\"fas fa-info-circle\"></i>\n <span>Details</span>\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'ai-runs'\" (click)=\"changeTab('ai-runs')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'ai-runs'\" title=\"Press 3\">\n <i class=\"fas fa-robot\"></i>\n <span>AI Runs</span>\n @if (aiRunsLoaded) {\n <span class=\"tab-badge\">{{ aiAgentRuns.length + aiPromptRuns.length }}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'feedback'\" (click)=\"changeTab('feedback')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'feedback'\" title=\"Press 4\">\n <i class=\"fas fa-comments\"></i>\n <span>Feedback</span>\n @if (feedbackLoaded) {\n <span class=\"tab-badge\">{{ feedbacks.length }}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'execution'\" (click)=\"changeTab('execution')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'execution'\" title=\"Press 5\">\n <i class=\"fas fa-microchip\"></i>\n <span>Execution</span>\n </button>\n @if (record.Log) {\n <button class=\"tab\" [class.active]=\"activeTab === 'log'\" (click)=\"changeTab('log')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'log'\" title=\"Press 6\">\n <i class=\"fas fa-terminal\"></i>\n <span>Log</span>\n </button>\n }\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\" [@fadeIn]>\n <!-- Result Hero -->\n <div class=\"result-hero\" [class]=\"getStatusClass()\">\n <div class=\"result-icon-wrapper\">\n <div class=\"result-icon\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n @if (record.Status === 'Running') {\n <div class=\"result-pulse\"></div>\n }\n </div>\n <div class=\"result-text\">\n <h2>TEST {{ record.Status.toUpperCase() }}</h2>\n <div class=\"result-details\">\n <span class=\"result-score\">Score: {{ formatScore(record.Score) }}</span>\n <span class=\"result-divider\">|</span>\n <span class=\"result-checks\">{{ record.PassedChecks }} of {{ record.TotalChecks }} checks passed</span>\n </div>\n </div>\n </div>\n <!-- Check Results -->\n @if (getCheckResults().length > 0) {\n <div class=\"check-results\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-tasks\"></i> Check Results</h3>\n <span class=\"check-summary\">{{ record.PassedChecks }} passed, {{ record.FailedChecks }} failed</span>\n </div>\n <div class=\"check-list\">\n @for (check of getCheckResults(); track check; let i = $index) {\n <div class=\"check-item\"\n [class.passed]=\"check.passed\" [class.failed]=\"!check.passed\"\n [style.animation-delay.ms]=\"i * 50\">\n <div class=\"check-status\">\n <i class=\"fas\" [class.fa-check-circle]=\"check.passed\" [class.fa-times-circle]=\"!check.passed\"></i>\n </div>\n <div class=\"check-content\">\n <div class=\"check-name\">{{ check.name }}</div>\n @if (check.message) {\n <div class=\"check-message\">{{ check.message }}</div>\n }\n </div>\n @if (check.weight) {\n <div class=\"check-weight\">\n <span class=\"weight-label\">Weight:</span> {{ check.weight }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Data Comparison -->\n <div class=\"comparison-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-exchange-alt\"></i> Data Comparison</h3>\n </div>\n <div class=\"comparison-tabs\">\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'input'\" (click)=\"setComparisonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i> Input\n </button>\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'expected'\" (click)=\"setComparisonView('expected')\">\n <i class=\"fas fa-bullseye\"></i> Expected\n </button>\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'actual'\" (click)=\"setComparisonView('actual')\">\n <i class=\"fas fa-check-square\"></i> Actual\n </button>\n </div>\n <div class=\"comparison-content\">\n <mj-code-editor\n [value]=\"getComparisonData()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"details-tab\" [@fadeIn]>\n <div class=\"details-grid\">\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-fingerprint\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Test Run ID</div>\n <div class=\"detail-value monospace\">{{ record.ID }}</div>\n </div>\n </div>\n @if (test) {\n <div class=\"detail-card clickable\" (click)=\"openTest()\">\n <div class=\"detail-icon\"><i class=\"fas fa-flask\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Test</div>\n <div class=\"detail-value link\">{{ test.Name }}</div>\n </div>\n <i class=\"fas fa-external-link-alt detail-action\"></i>\n </div>\n }\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-tag\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Target Type</div>\n <div class=\"detail-value\">{{ record.TargetType || 'N/A' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-play-circle\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Started At</div>\n <div class=\"detail-value\">{{ record.StartedAt | date:'medium' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-stop-circle\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Completed At</div>\n <div class=\"detail-value\">{{ record.CompletedAt | date:'medium' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-hourglass-half\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Duration</div>\n <div class=\"detail-value\">{{ calculateDuration() }}</div>\n </div>\n </div>\n </div>\n <!-- Error Message -->\n @if (record.ErrorMessage) {\n <div class=\"error-section\">\n <div class=\"section-header error\">\n <h3><i class=\"fas fa-exclamation-triangle\"></i> Error Message</h3>\n </div>\n <div class=\"error-content\">\n <mj-code-editor\n [value]=\"record.ErrorMessage\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n <!-- Result Details -->\n @if (parsedData.resultDetails) {\n <div class=\"result-details-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-file-code\"></i> Result Details</h3>\n </div>\n <div class=\"result-details-content\">\n <mj-code-editor\n [value]=\"getFormattedResultDetails()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- AI Runs Tab -->\n @if (activeTab === 'ai-runs') {\n <div class=\"ai-runs-tab\" [@fadeIn]>\n <!-- Loading State -->\n @if (loadingAIRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- AI Agent Runs -->\n @if (!loadingAIRuns && aiAgentRuns.length > 0) {\n <div class=\"ai-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-robot\"></i> AI Agent Runs</h3>\n <span class=\"count-badge\">{{ aiAgentRuns.length }}</span>\n </div>\n <div class=\"ai-run-list\">\n @for (run of aiAgentRuns; track run) {\n <div class=\"ai-run-card\" (click)=\"openAIAgentRun(run.ID)\">\n <div class=\"ai-run-icon agent\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <div class=\"ai-run-content\">\n <div class=\"ai-run-name\">{{ run.Agent }}</div>\n <div class=\"ai-run-meta\">\n <span class=\"status-chip\" [class]=\"run.Status.toLowerCase()\">{{ run.Status }}</span>\n @if (run.TotalCost) {\n <span class=\"cost-chip\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.TotalCost | number:'1.4-4' }}\n </span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right ai-run-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- AI Prompt Runs -->\n @if (!loadingAIRuns && aiPromptRuns.length > 0) {\n <div class=\"ai-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-comment-dots\"></i> AI Prompt Runs</h3>\n <span class=\"count-badge\">{{ aiPromptRuns.length }}</span>\n </div>\n <div class=\"ai-run-list\">\n @for (run of aiPromptRuns; track run) {\n <div class=\"ai-run-card\" (click)=\"openAIPromptRun(run.ID)\">\n <div class=\"ai-run-icon prompt\">\n <i class=\"fas fa-comment-dots\"></i>\n </div>\n <div class=\"ai-run-content\">\n <div class=\"ai-run-name\">{{ run.Prompt || run.Model }}</div>\n <div class=\"ai-run-meta\">\n @if (run.TotalCost) {\n <span class=\"cost-chip\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.TotalCost | number:'1.4-4' }}\n </span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right ai-run-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (aiRunsLoaded && aiAgentRuns.length === 0 && aiPromptRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <h3>No AI Runs</h3>\n <p>This test execution didn't involve any AI agent or prompt runs.</p>\n </div>\n }\n </div>\n }\n\n <!-- Feedback Tab -->\n @if (activeTab === 'feedback') {\n <div class=\"feedback-tab\" [@fadeIn]>\n <!-- Loading State -->\n @if (loadingFeedback) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-avatar\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n <div class=\"skeleton-line medium\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Feedback List -->\n @if (!loadingFeedback && feedbacks.length > 0) {\n <div class=\"feedback-list\">\n @for (feedback of feedbacks; track feedback) {\n <div class=\"feedback-item\">\n <div class=\"feedback-header\">\n <div class=\"feedback-user\">\n <div class=\"user-avatar\">\n <i class=\"fas fa-user\"></i>\n </div>\n <span class=\"user-name\">{{ feedback.ReviewerUser }}</span>\n </div>\n <div class=\"feedback-date\">\n {{ getRelativeTime(feedback.__mj_CreatedAt) }}\n </div>\n </div>\n <div class=\"feedback-body\">\n <div class=\"feedback-rating\">\n <div class=\"rating-stars\">\n @for (s of [1,2,3,4,5,6,7,8,9,10]; track s) {\n <i class=\"fas fa-star\"\n [class.filled]=\"s <= (feedback.Rating || 0)\"></i>\n }\n </div>\n <span class=\"rating-value\">{{ feedback.Rating }}/10</span>\n </div>\n @if (feedback.IsCorrect !== null) {\n <div class=\"feedback-verdict\">\n <span class=\"verdict-badge\" [class.correct]=\"feedback.IsCorrect\" [class.incorrect]=\"!feedback.IsCorrect\">\n <i class=\"fas\" [class.fa-check]=\"feedback.IsCorrect\" [class.fa-times]=\"!feedback.IsCorrect\"></i>\n {{ feedback.IsCorrect ? 'Marked Correct' : 'Marked Incorrect' }}\n </span>\n </div>\n }\n @if (feedback.CorrectionSummary) {\n <div class=\"feedback-comments\">\n <p>{{ feedback.CorrectionSummary }}</p>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (feedbackLoaded && feedbacks.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-comments\"></i>\n </div>\n <h3>No Feedback Yet</h3>\n <p>No one has reviewed this test run yet. Be the first to provide feedback!</p>\n </div>\n }\n </div>\n }\n\n <!-- Execution Context Tab -->\n @if (activeTab === 'execution') {\n <div class=\"execution-tab\" [@fadeIn]>\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\n <!-- Execution Log Tab -->\n @if (activeTab === 'log') {\n <div class=\"log-tab\" [@fadeIn]>\n <div class=\"log-header\">\n <div class=\"log-title\">\n <i class=\"fas fa-terminal\"></i>\n <h3>Execution Log</h3>\n </div>\n <div class=\"log-actions\">\n <button kendoButton (click)=\"copyLogToClipboard()\" look=\"flat\">\n <i class=\"fas fa-copy\"></i>\n <span class=\"btn-text\">Copy</span>\n </button>\n </div>\n </div>\n <div class=\"log-container\">\n <mj-code-editor\n [value]=\"record.Log || ''\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Help (shown on hover of ? icon) -->\n <div class=\"shortcuts-hint\" title=\"Keyboard Shortcuts\">\n <i class=\"fas fa-keyboard\"></i>\n <div class=\"shortcuts-popup\">\n <h4>Keyboard Shortcuts</h4>\n <ul>\n <li><kbd>1-6</kbd> Switch tabs</li>\n <li><kbd>Cmd+R</kbd> Refresh</li>\n <li><kbd>Cmd+Shift+R</kbd> Re-run test</li>\n </ul>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"test-run-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-run-form.component.ts","../../../../src/lib/custom/Tests/test-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 { MJTestRunEntity, MJTestEntity, MJTestSuiteRunEntity, MJAIAgentRunEntity, MJAIPromptRunEntity, MJTestRunFeedbackEntity } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestRunFormComponent } from '../../generated/Entities/MJTestRun/mjtestrun.form.component';\nimport { TestingDialogService, TagsHelper } from '@memberjunction/ng-testing';\nimport { createCopyOnlyToolbar, ToolbarConfig } from '@memberjunction/ng-code-editor';\n\ninterface ParsedData {\n input?: Record<string, unknown>;\n expected?: Record<string, unknown>;\n actual?: Record<string, unknown>;\n resultDetails?: Record<string, unknown>;\n}\n\ninterface CheckResult {\n name: string;\n passed: boolean;\n message?: string;\n weight?: number;\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Test Runs')\n@Component({\n standalone: false,\n selector: 'mj-test-run-form',\n templateUrl: './test-run-form.component.html',\n styleUrls: ['./test-run-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestRunFormComponentExtended extends MJTestRunFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestRunEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingAIRuns = false;\n loadingFeedback = false;\n error: string | null = null;\n aiRunsLoaded = false;\n feedbackLoaded = false;\n isRefreshing = false;\n autoRefreshEnabled = false;\n\n // Related entities\n test: MJTestEntity | null = null;\n testSuiteRun: MJTestSuiteRunEntity | null = null;\n aiAgentRuns: MJAIAgentRunEntity[] = [];\n aiPromptRuns: MJAIPromptRunEntity[] = [];\n feedbacks: MJTestRunFeedbackEntity[] = [];\n\n // Parsed JSON data\n parsedData: ParsedData = {};\n\n // Active comparison view\n comparisonView: 'input' | 'expected' | 'actual' = 'input';\n\n // Code editor configuration\n jsonToolbar: ToolbarConfig = createCopyOnlyToolbar();\n\n // Keyboard shortcuts active\n keyboardShortcutsEnabled = true;\n\n // Tags management\n tags: string[] = [];\n newTag = '';\n editingTags = false;\n savingTags = false;\n private originalTags: string[] = [];\n\n // Service injections\n private navigationService = inject(NavigationService);\n private testingDialogService = inject(TestingDialogService);\n private appManager = inject(ApplicationManager);\n private viewContainerRef = inject(ViewContainerRef);\n\n async ngOnInit() {\n await super.ngOnInit();\n\n if (this.record && this.record.ID) {\n await this.loadRelatedData();\n this.parseJsonFields();\n this.loadTags();\n\n // Auto-refresh for running tests\n if (this.record.Status === 'Running' || this.record.Status === 'Pending') {\n this.startAutoRefresh();\n }\n }\n }\n\n private loadTags(): void {\n this.tags = TagsHelper.parseTags(this.record.Tags);\n this.originalTags = [...this.tags];\n }\n\n startEditingTags(): void {\n this.originalTags = [...this.tags];\n this.editingTags = true;\n this.cdr.markForCheck();\n }\n\n cancelEditingTags(): void {\n this.tags = [...this.originalTags];\n this.newTag = '';\n this.editingTags = false;\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.originalTags = [...this.tags];\n this.editingTags = false;\n SharedService.Instance.CreateSimpleNotification('Tags saved', 'success', 2000);\n } else {\n SharedService.Instance.CreateSimpleNotification('Failed to save tags', 'error', 3000);\n }\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to save tags', 'error', 3000);\n } finally {\n this.savingTags = false;\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Shift + R: Re-run test\n if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === 'r') {\n event.preventDefault();\n this.reRunTest();\n return;\n }\n\n // Number keys for tabs (1-5)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('details'); break;\n case '3': this.changeTab('ai-runs'); break;\n case '4': this.changeTab('feedback'); break;\n case '5': if (this.record.Log) this.changeTab('log'); 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.parseJsonFields();\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\n if (this.record.TestID) {\n const md = new Metadata();\n const test = await md.GetEntityObject<MJTestEntity>('MJ: Tests');\n if (test && await test.Load(this.record.TestID)) {\n this.test = test;\n }\n }\n\n // Load test suite run if part of a suite\n if (this.record.TestSuiteRunID) {\n const md = new Metadata();\n const suiteRun = await md.GetEntityObject<MJTestSuiteRunEntity>('MJ: Test Suite Runs');\n if (suiteRun && await suiteRun.Load(this.record.TestSuiteRunID)) {\n this.testSuiteRun = suiteRun;\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 loadAIRuns() {\n if (this.aiRunsLoaded) return;\n\n this.loadingAIRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const [agentRuns, promptRuns] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `TestRunID='${this.record.ID}'`,\n OrderBy: 'StartedAt',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `TestRunID='${this.record.ID}'`,\n OrderBy: 'RunAt',\n ResultType: 'entity_object'\n }\n ]);\n\n if (agentRuns.Success) {\n this.aiAgentRuns = agentRuns.Results || [];\n }\n\n if (promptRuns.Success) {\n this.aiPromptRuns = promptRuns.Results || [];\n }\n\n this.aiRunsLoaded = true;\n } catch (error) {\n console.error('Error loading AI runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load AI runs', 'error', 3000);\n } finally {\n this.loadingAIRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n private async loadFeedback() {\n if (this.feedbackLoaded) return;\n\n this.loadingFeedback = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID='${this.record.ID}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.feedbacks = result.Results || [];\n }\n\n this.feedbackLoaded = true;\n } catch (error) {\n console.error('Error loading feedback:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load feedback', 'error', 3000);\n } finally {\n this.loadingFeedback = false;\n this.cdr.markForCheck();\n }\n }\n\n private parseJsonFields() {\n try {\n if (this.record.InputData) {\n this.parsedData.input = JSON.parse(this.record.InputData);\n }\n if (this.record.ExpectedOutputData) {\n this.parsedData.expected = JSON.parse(this.record.ExpectedOutputData);\n }\n if (this.record.ActualOutputData) {\n this.parsedData.actual = JSON.parse(this.record.ActualOutputData);\n }\n if (this.record.ResultDetails) {\n this.parsedData.resultDetails = JSON.parse(this.record.ResultDetails);\n }\n } catch (error) {\n console.error('Error parsing JSON fields:', error);\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if (tab === 'ai-runs' && !this.aiRunsLoaded) {\n this.loadAIRuns();\n }\n\n if (tab === 'feedback' && !this.feedbackLoaded) {\n this.loadFeedback();\n }\n\n this.cdr.markForCheck();\n }\n\n setComparisonView(view: 'input' | 'expected' | 'actual') {\n this.comparisonView = view;\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.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 getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Passed': return 'fa-check-circle';\n case 'Failed': return 'fa-times-circle';\n case 'Error': return 'fa-exclamation-triangle';\n case 'Timeout': return 'fa-stopwatch';\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-circle';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n calculateDuration(): string {\n if (!this.record.DurationSeconds) return 'N/A';\n\n const seconds = this.record.DurationSeconds;\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 formatScore(score: number | null): string {\n if (score === null || score === undefined) return 'N/A';\n return score.toFixed(4);\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 getScorePercentage(): number {\n if (this.record.Score === null || this.record.Score === undefined) return 0;\n return Math.round(this.record.Score * 100);\n }\n\n getPassRatePercentage(): number {\n const total = this.record.TotalChecks || 0;\n const passed = this.record.PassedChecks || 0;\n if (total === 0) return 0;\n return Math.round((passed / total) * 100);\n }\n\n openTest() {\n if (this.test) {\n SharedService.Instance.OpenEntityRecord('MJ: Tests', CompositeKey.FromID(this.test.ID));\n }\n }\n\n navigateToTestingDashboard() {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n openTestSuiteRun() {\n if (this.testSuiteRun) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suite Runs', CompositeKey.FromID(this.testSuiteRun.ID));\n }\n }\n\n openAIAgentRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: AI Agent Runs', CompositeKey.FromID(runId));\n }\n\n openAIPromptRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: AI Prompt Runs', CompositeKey.FromID(runId));\n }\n\n async reRunTest() {\n if (!this.record.TestID) {\n SharedService.Instance.CreateSimpleNotification('Cannot re-run: Test ID not available', 'error', 3000);\n return;\n }\n\n this.testingDialogService.OpenTestPanel(this.record.TestID);\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 this.parseJsonFields();\n\n // Reset lazy-loaded data to force reload\n this.aiRunsLoaded = false;\n this.feedbackLoaded = false;\n this.aiAgentRuns = [];\n this.aiPromptRuns = [];\n this.feedbacks = [];\n\n // Reload current tab data if needed\n if (this.activeTab === 'ai-runs') {\n await this.loadAIRuns();\n } else if (this.activeTab === 'feedback') {\n await this.loadFeedback();\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 getComparisonData(): string {\n let data: Record<string, unknown> | undefined;\n switch (this.comparisonView) {\n case 'input': data = this.parsedData.input; break;\n case 'expected': data = this.parsedData.expected; break;\n case 'actual': data = this.parsedData.actual; break;\n }\n return data ? JSON.stringify(data, null, 2) : '// No data available';\n }\n\n getCheckResults(): CheckResult[] {\n const details = this.parsedData.resultDetails as Record<string, unknown> | undefined;\n if (!details?.checkResults) return [];\n return details.checkResults as CheckResult[];\n }\n\n getPassRate(): number {\n const total = this.record.TotalChecks || 0;\n const passed = this.record.PassedChecks || 0;\n if (total === 0) return 0;\n return (passed / total) * 100;\n }\n\n async copyLogToClipboard(): Promise<void> {\n if (this.record.Log) {\n try {\n await navigator.clipboard.writeText(this.record.Log);\n SharedService.Instance.CreateSimpleNotification('Log copied to clipboard', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to copy log', 'error', 2000);\n }\n }\n }\n\n getFormattedResultDetails(): string {\n return this.parsedData.resultDetails\n ? JSON.stringify(this.parsedData.resultDetails, null, 2)\n : '// No result details available';\n }\n\n // Helper for relative time display\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","<div class=\"test-run-form\" [class.is-mobile]=\"false\">\n <!-- Error State -->\n @if (error) {\n <div class=\"error-banner\" (click)=\"retryLoad()\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ error }}</span>\n <button class=\"retry-btn\">\n <i class=\"fas fa-redo\"></i> Retry\n </button>\n </div>\n }\n\n <!-- Header Section -->\n <div class=\"test-run-header\" [class]=\"getStatusClass()\">\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 (test) {\n <li>\n <i class=\"fas fa-chevron-right separator\"></i>\n <a href=\"javascript:void(0)\" (click)=\"openTest()\">\n <i class=\"fas fa-flask\"></i>\n <span class=\"breadcrumb-text\">{{ test.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 <div class=\"header-content\">\n <div class=\"header-left\">\n <!-- Status Indicator -->\n <div class=\"status-indicator\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n\n <div class=\"test-run-info\">\n <h1>\n Test Run\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n </h1>\n <div class=\"test-run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n {{ record.Status }}\n </span>\n @if (test) {\n <span class=\"meta-item\">\n <i class=\"fas fa-flask\"></i>\n {{ test.Type }}\n </span>\n }\n @if (autoRefreshEnabled) {\n <span class=\"meta-item\">\n <i class=\"fas fa-sync-alt fa-spin\"></i>\n Auto-refreshing\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"header-actions\">\n <button kendoButton (click)=\"reRunTest()\" [disabled]=\"!record.TestID\" title=\"Re-run this test (Cmd+Shift+R)\">\n <i class=\"fas fa-redo\"></i>\n <span class=\"btn-text\">Re-run</span>\n </button>\n <button kendoButton (click)=\"refresh()\" [disabled]=\"isRefreshing\" title=\"Refresh (Cmd+R)\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"isRefreshing\"></i>\n <span class=\"btn-text\">Refresh</span>\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-label\">Started</div>\n <div class=\"metric-value\">{{ getRelativeTime(record.StartedAt) }}</div>\n <div class=\"metric-detail\">{{ record.StartedAt | date:'short' }}</div>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-stopwatch\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ calculateDuration() }}</div>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Score</div>\n <div class=\"metric-value\">{{ formatScore(record.Score) }}</div>\n @if (record.Score != null) {\n <div class=\"metric-progress\">\n <div class=\"progress-bar\" [style.width.%]=\"getScorePercentage()\" [style.background-color]=\"getStatusColor()\"></div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fas fa-check-double\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Checks</div>\n <div class=\"metric-value\">{{ record.PassedChecks }}/{{ record.TotalChecks }}</div>\n @if (record.TotalChecks) {\n <div class=\"metric-progress\">\n <div class=\"progress-bar\" [style.width.%]=\"getPassRatePercentage()\" [style.background-color]=\"getStatusColor()\"></div>\n </div>\n }\n </div>\n </div>\n\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-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.CostUSD) }}</div>\n </div>\n </div>\n </div>\n\n <!-- Secondary Info -->\n @if (record.RunByUser || testSuiteRun || record.TargetLogEntityID) {\n <div class=\"secondary-info\">\n @if (record.RunByUser) {\n <span class=\"info-chip\">\n <i class=\"fas fa-user\"></i>\n {{ record.RunByUser }}\n </span>\n }\n @if (testSuiteRun) {\n <span class=\"info-chip clickable\" (click)=\"openTestSuiteRun()\">\n <i class=\"fas fa-layer-group\"></i>\n Part of Suite Run (Seq: {{ record.Sequence }})\n </span>\n }\n <!-- Target Entity Link Pill -->\n @if (record.TargetLogEntityID && record.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"record.TargetLogEntity\"\n [recordId]=\"record.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n }\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\" [class.active]=\"activeTab === 'overview'\" (click)=\"changeTab('overview')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'overview'\" title=\"Press 1\">\n <i class=\"fas fa-chart-pie\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'details'\" title=\"Press 2\">\n <i class=\"fas fa-info-circle\"></i>\n <span>Details</span>\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'ai-runs'\" (click)=\"changeTab('ai-runs')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'ai-runs'\" title=\"Press 3\">\n <i class=\"fas fa-robot\"></i>\n <span>AI Runs</span>\n @if (aiRunsLoaded) {\n <span class=\"tab-badge\">{{ aiAgentRuns.length + aiPromptRuns.length }}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'feedback'\" (click)=\"changeTab('feedback')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'feedback'\" title=\"Press 4\">\n <i class=\"fas fa-comments\"></i>\n <span>Feedback</span>\n @if (feedbackLoaded) {\n <span class=\"tab-badge\">{{ feedbacks.length }}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'execution'\" (click)=\"changeTab('execution')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'execution'\" title=\"Press 5\">\n <i class=\"fas fa-microchip\"></i>\n <span>Execution</span>\n </button>\n @if (record.Log) {\n <button class=\"tab\" [class.active]=\"activeTab === 'log'\" (click)=\"changeTab('log')\"\n role=\"tab\" [attr.aria-selected]=\"activeTab === 'log'\" title=\"Press 6\">\n <i class=\"fas fa-terminal\"></i>\n <span>Log</span>\n </button>\n }\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\" [@fadeIn]>\n <!-- Result Hero -->\n <div class=\"result-hero\" [class]=\"getStatusClass()\">\n <div class=\"result-icon-wrapper\">\n <div class=\"result-icon\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n </div>\n @if (record.Status === 'Running') {\n <div class=\"result-pulse\"></div>\n }\n </div>\n <div class=\"result-text\">\n <h2>TEST {{ record.Status.toUpperCase() }}</h2>\n <div class=\"result-details\">\n <span class=\"result-score\">Score: {{ formatScore(record.Score) }}</span>\n <span class=\"result-divider\">|</span>\n <span class=\"result-checks\">{{ record.PassedChecks }} of {{ record.TotalChecks }} checks passed</span>\n </div>\n </div>\n </div>\n <!-- Check Results -->\n @if (getCheckResults().length > 0) {\n <div class=\"check-results\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-tasks\"></i> Check Results</h3>\n <span class=\"check-summary\">{{ record.PassedChecks }} passed, {{ record.FailedChecks }} failed</span>\n </div>\n <div class=\"check-list\">\n @for (check of getCheckResults(); track check; let i = $index) {\n <div class=\"check-item\"\n [class.passed]=\"check.passed\" [class.failed]=\"!check.passed\"\n [style.animation-delay.ms]=\"i * 50\">\n <div class=\"check-status\">\n <i class=\"fas\" [class.fa-check-circle]=\"check.passed\" [class.fa-times-circle]=\"!check.passed\"></i>\n </div>\n <div class=\"check-content\">\n <div class=\"check-name\">{{ check.name }}</div>\n @if (check.message) {\n <div class=\"check-message\">{{ check.message }}</div>\n }\n </div>\n @if (check.weight) {\n <div class=\"check-weight\">\n <span class=\"weight-label\">Weight:</span> {{ check.weight }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Data Comparison -->\n <div class=\"comparison-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-exchange-alt\"></i> Data Comparison</h3>\n </div>\n <div class=\"comparison-tabs\">\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'input'\" (click)=\"setComparisonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i> Input\n </button>\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'expected'\" (click)=\"setComparisonView('expected')\">\n <i class=\"fas fa-bullseye\"></i> Expected\n </button>\n <button class=\"comparison-tab\" [class.active]=\"comparisonView === 'actual'\" (click)=\"setComparisonView('actual')\">\n <i class=\"fas fa-check-square\"></i> Actual\n </button>\n </div>\n <div class=\"comparison-content\">\n <mj-code-editor\n [value]=\"getComparisonData()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"details-tab\" [@fadeIn]>\n <div class=\"details-grid\">\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-fingerprint\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Test Run ID</div>\n <div class=\"detail-value monospace\">{{ record.ID }}</div>\n </div>\n </div>\n @if (test) {\n <div class=\"detail-card clickable\" (click)=\"openTest()\">\n <div class=\"detail-icon\"><i class=\"fas fa-flask\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Test</div>\n <div class=\"detail-value link\">{{ test.Name }}</div>\n </div>\n <i class=\"fas fa-external-link-alt detail-action\"></i>\n </div>\n }\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-tag\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Target Type</div>\n <div class=\"detail-value\">{{ record.TargetType || 'N/A' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-play-circle\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Started At</div>\n <div class=\"detail-value\">{{ record.StartedAt | date:'medium' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-stop-circle\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Completed At</div>\n <div class=\"detail-value\">{{ record.CompletedAt | date:'medium' }}</div>\n </div>\n </div>\n <div class=\"detail-card\">\n <div class=\"detail-icon\"><i class=\"fas fa-hourglass-half\"></i></div>\n <div class=\"detail-content\">\n <div class=\"detail-label\">Duration</div>\n <div class=\"detail-value\">{{ calculateDuration() }}</div>\n </div>\n </div>\n </div>\n <!-- Error Message -->\n @if (record.ErrorMessage) {\n <div class=\"error-section\">\n <div class=\"section-header error\">\n <h3><i class=\"fas fa-exclamation-triangle\"></i> Error Message</h3>\n </div>\n <div class=\"error-content\">\n <mj-code-editor\n [value]=\"record.ErrorMessage\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n <!-- Result Details -->\n @if (parsedData.resultDetails) {\n <div class=\"result-details-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-file-code\"></i> Result Details</h3>\n </div>\n <div class=\"result-details-content\">\n <mj-code-editor\n [value]=\"getFormattedResultDetails()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- AI Runs Tab -->\n @if (activeTab === 'ai-runs') {\n <div class=\"ai-runs-tab\" [@fadeIn]>\n <!-- Loading State -->\n @if (loadingAIRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- AI Agent Runs -->\n @if (!loadingAIRuns && aiAgentRuns.length > 0) {\n <div class=\"ai-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-robot\"></i> AI Agent Runs</h3>\n <span class=\"count-badge\">{{ aiAgentRuns.length }}</span>\n </div>\n <div class=\"ai-run-list\">\n @for (run of aiAgentRuns; track run) {\n <div class=\"ai-run-card\" (click)=\"openAIAgentRun(run.ID)\">\n <div class=\"ai-run-icon agent\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <div class=\"ai-run-content\">\n <div class=\"ai-run-name\">{{ run.Agent }}</div>\n <div class=\"ai-run-meta\">\n <span class=\"status-chip\" [class]=\"run.Status.toLowerCase()\">{{ run.Status }}</span>\n @if (run.TotalCost) {\n <span class=\"cost-chip\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.TotalCost | number:'1.4-4' }}\n </span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right ai-run-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- AI Prompt Runs -->\n @if (!loadingAIRuns && aiPromptRuns.length > 0) {\n <div class=\"ai-section\">\n <div class=\"section-header\">\n <h3><i class=\"fas fa-comment-dots\"></i> AI Prompt Runs</h3>\n <span class=\"count-badge\">{{ aiPromptRuns.length }}</span>\n </div>\n <div class=\"ai-run-list\">\n @for (run of aiPromptRuns; track run) {\n <div class=\"ai-run-card\" (click)=\"openAIPromptRun(run.ID)\">\n <div class=\"ai-run-icon prompt\">\n <i class=\"fas fa-comment-dots\"></i>\n </div>\n <div class=\"ai-run-content\">\n <div class=\"ai-run-name\">{{ run.Prompt || run.Model }}</div>\n <div class=\"ai-run-meta\">\n @if (run.TotalCost) {\n <span class=\"cost-chip\">\n <i class=\"fas fa-dollar-sign\"></i> {{ run.TotalCost | number:'1.4-4' }}\n </span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right ai-run-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (aiRunsLoaded && aiAgentRuns.length === 0 && aiPromptRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <h3>No AI Runs</h3>\n <p>This test execution didn't involve any AI agent or prompt runs.</p>\n </div>\n }\n </div>\n }\n\n <!-- Feedback Tab -->\n @if (activeTab === 'feedback') {\n <div class=\"feedback-tab\" [@fadeIn]>\n <!-- Loading State -->\n @if (loadingFeedback) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-avatar\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n <div class=\"skeleton-line medium\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Feedback List -->\n @if (!loadingFeedback && feedbacks.length > 0) {\n <div class=\"feedback-list\">\n @for (feedback of feedbacks; track feedback) {\n <div class=\"feedback-item\">\n <div class=\"feedback-header\">\n <div class=\"feedback-user\">\n <div class=\"user-avatar\">\n <i class=\"fas fa-user\"></i>\n </div>\n <span class=\"user-name\">{{ feedback.ReviewerUser }}</span>\n </div>\n <div class=\"feedback-date\">\n {{ getRelativeTime(feedback.__mj_CreatedAt) }}\n </div>\n </div>\n <div class=\"feedback-body\">\n <div class=\"feedback-rating\">\n <div class=\"rating-stars\">\n @for (s of [1,2,3,4,5,6,7,8,9,10]; track s) {\n <i class=\"fas fa-star\"\n [class.filled]=\"s <= (feedback.Rating || 0)\"></i>\n }\n </div>\n <span class=\"rating-value\">{{ feedback.Rating }}/10</span>\n </div>\n @if (feedback.IsCorrect !== null) {\n <div class=\"feedback-verdict\">\n <span class=\"verdict-badge\" [class.correct]=\"feedback.IsCorrect\" [class.incorrect]=\"!feedback.IsCorrect\">\n <i class=\"fas\" [class.fa-check]=\"feedback.IsCorrect\" [class.fa-times]=\"!feedback.IsCorrect\"></i>\n {{ feedback.IsCorrect ? 'Marked Correct' : 'Marked Incorrect' }}\n </span>\n </div>\n }\n @if (feedback.CorrectionSummary) {\n <div class=\"feedback-comments\">\n <p>{{ feedback.CorrectionSummary }}</p>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (feedbackLoaded && feedbacks.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-comments\"></i>\n </div>\n <h3>No Feedback Yet</h3>\n <p>No one has reviewed this test run yet. Be the first to provide feedback!</p>\n </div>\n }\n </div>\n }\n\n <!-- Execution Context Tab -->\n @if (activeTab === 'execution') {\n <div class=\"execution-tab\" [@fadeIn]>\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\n <!-- Execution Log Tab -->\n @if (activeTab === 'log') {\n <div class=\"log-tab\" [@fadeIn]>\n <div class=\"log-header\">\n <div class=\"log-title\">\n <i class=\"fas fa-terminal\"></i>\n <h3>Execution Log</h3>\n </div>\n <div class=\"log-actions\">\n <button kendoButton (click)=\"copyLogToClipboard()\" look=\"flat\">\n <i class=\"fas fa-copy\"></i>\n <span class=\"btn-text\">Copy</span>\n </button>\n </div>\n </div>\n <div class=\"log-container\">\n <mj-code-editor\n [value]=\"record.Log || ''\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Help (shown on hover of ? icon) -->\n <div class=\"shortcuts-hint\" title=\"Keyboard Shortcuts\">\n <i class=\"fas fa-keyboard\"></i>\n <div class=\"shortcuts-popup\">\n <h4>Keyboard Shortcuts</h4>\n <ul>\n <li><kbd>1-6</kbd> Switch tabs</li>\n <li><kbd>Cmd+R</kbd> Refresh</li>\n <li><kbd>Cmd+Shift+R</kbd> Re-run test</li>\n </ul>\n </div>\n </div>\n</div>\n"]}
@@ -1916,7 +1916,7 @@ let MJTestSuiteFormComponentExtended = class MJTestSuiteFormComponentExtended ex
1916
1916
  }
1917
1917
  async runSuite() {
1918
1918
  if (this.record?.ID) {
1919
- this.testingDialogService.OpenSuiteDialog(this.record.ID, this.viewContainerRef);
1919
+ this.testingDialogService.OpenSuitePanel(this.record.ID);
1920
1920
  }
1921
1921
  }
1922
1922
  async refresh() {