@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
|
@@ -1486,7 +1486,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
|
|
|
1486
1486
|
}
|
|
1487
1487
|
async runTest() {
|
|
1488
1488
|
if (this.record?.ID) {
|
|
1489
|
-
this.testingDialogService.
|
|
1489
|
+
this.testingDialogService.OpenTestPanel(this.record.ID);
|
|
1490
1490
|
}
|
|
1491
1491
|
}
|
|
1492
1492
|
async refresh() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-form.component.ts","../../../../src/lib/custom/Tests/test-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, ViewContainerRef, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestEntity, MJTestRunEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJUserSettingEntity, UserInfoEngine, MJTestRunFeedbackEntity } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestFormComponent } from '../../generated/Entities/MJTest/mjtest.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\nimport { createCopyOnlyToolbar, ToolbarConfig } from '@memberjunction/ng-code-editor';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\ninterface HistoryDataPoint {\n date: Date;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n runCount: number;\n passCount: number;\n failCount: number;\n}\n\ninterface SuitePerformance {\n suiteId: string;\n suiteName: string;\n totalRuns: number;\n passedRuns: number;\n failedRuns: number;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n lastRun: Date | null;\n tags: string[];\n}\n\ninterface ParsedJSON {\n inputDefinition?: Record<string, unknown>;\n expectedOutcomes?: Record<string, unknown>;\n configuration?: Record<string, unknown>;\n tags?: string[];\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Tests')\n@Component({\n standalone: false,\n selector: 'mj-test-form',\n templateUrl: './test-form.component.html',\n styleUrls: ['./test-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestFormComponentExtended extends MJTestFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingRuns = false;\n loadingSuites = false;\n error: string | null = null;\n testRunsLoaded = false;\n suiteTestsLoaded = false;\n isRefreshing = false;\n\n // Related data\n testRuns: MJTestRunEntity[] = [];\n suiteTests: MJTestSuiteTestEntity[] = [];\n\n // Human feedback map: testRunId -> feedback entity\n feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n // History tab data\n historyLoaded = false;\n loadingHistory = false;\n historyTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n historyData: HistoryDataPoint[] = [];\n suitePerformance: SuitePerformance[] = [];\n uniqueTags: string[] = [];\n selectedTagFilter: string | null = null;\n\n // Parsed JSON fields\n parsedData: ParsedJSON = {};\n\n // Active JSON view\n activeJsonView: 'input' | 'expected' | 'config' | 'tags' = 'input';\n\n // Code editor configuration\n jsonToolbar: ToolbarConfig = createCopyOnlyToolbar();\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private metadata = new Metadata();\n\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\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 this.parseJsonFields();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Enter: Run test\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runTest();\n return;\n }\n\n // Number keys for tabs (1-5)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('config'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('suites'); break;\n case '5': this.changeTab('analytics'); break;\n }\n }\n }\n\n private async loadTestRuns() {\n if (this.testRunsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.testRuns = result.Results || [];\n\n // Load feedbacks for all test runs\n if (this.testRuns.length > 0) {\n await this.loadFeedbacksForTestRuns(this.testRuns.map(r => r.ID));\n }\n }\n\n this.testRunsLoaded = true;\n } catch (error) {\n console.error('Error loading test runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<void> {\n if (testRunIds.length === 0) return;\n\n try {\n const rv = new RunView();\n const chunkSize = 50;\n for (let i = 0; i < testRunIds.length; i += chunkSize) {\n const chunk = testRunIds.slice(i, i + chunkSize);\n const inClause = chunk.map(id => `'${id}'`).join(',');\n\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${inClause})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n for (const feedback of result.Results) {\n this.feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n }\n\n /**\n * Get feedback for a specific test run\n */\n getFeedbackForRun(testRunId: string): MJTestRunFeedbackEntity | undefined {\n return this.feedbackMap.get(testRunId);\n }\n\n /**\n * Get tooltip for status indicator\n */\n getStatusTooltip(status: string): string {\n switch (status) {\n case 'Passed': return 'Status: Passed - Test completed without error';\n case 'Failed': return 'Status: Failed - Test assertions did not pass';\n case 'Error': return 'Status: Error - Test encountered an exception';\n case 'Timeout': return 'Status: Timeout - Test exceeded time limit';\n case 'Skipped': return 'Status: Skipped - Test was not executed';\n case 'Running': return 'Status: Running - Test is currently executing';\n case 'Pending': return 'Status: Pending - Test waiting to run';\n default: return `Status: ${status}`;\n }\n }\n\n /**\n * Get tooltip for human review with rating and optional comments\n */\n getHumanTooltip(rating: number, comments: string | null): string {\n let tooltip = `Human Review: ${rating}/10 rating`;\n if (comments) {\n const truncated = comments.length > 200 ? comments.substring(0, 200) + '...' : comments;\n tooltip += `\\n\\n\"${truncated}\"`;\n }\n return tooltip;\n }\n\n private async loadSuiteTests() {\n if (this.suiteTestsLoaded) return;\n\n this.loadingSuites = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.suiteTests = result.Results || [];\n }\n\n this.suiteTestsLoaded = true;\n } catch (error) {\n console.error('Error loading suite tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test suites', 'error', 3000);\n } finally {\n this.loadingSuites = false;\n this.cdr.markForCheck();\n }\n }\n\n private parseJsonFields() {\n try {\n if (this.record.InputDefinition) {\n this.parsedData.inputDefinition = JSON.parse(this.record.InputDefinition);\n }\n if (this.record.ExpectedOutcomes) {\n this.parsedData.expectedOutcomes = JSON.parse(this.record.ExpectedOutcomes);\n }\n if (this.record.Configuration) {\n this.parsedData.configuration = JSON.parse(this.record.Configuration);\n }\n if (this.record.Tags) {\n this.parsedData.tags = JSON.parse(this.record.Tags);\n }\n } catch (error) {\n console.error('Error parsing JSON fields:', error);\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if (tab === 'runs' && !this.testRunsLoaded) {\n this.loadTestRuns();\n }\n\n if (tab === 'suites' && !this.suiteTestsLoaded) {\n this.loadSuiteTests();\n }\n\n if (tab === 'analytics' && !this.historyLoaded) {\n this.loadHistory();\n }\n\n this.cdr.markForCheck();\n }\n\n setJsonView(view: 'input' | 'expected' | 'config' | 'tags') {\n this.activeJsonView = view;\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return '#10b981';\n case 'Disabled': return '#6b7280';\n case 'Pending': return '#f59e0b';\n default: return '#9ca3af';\n }\n }\n\n getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Active': return 'fa-circle-check';\n case 'Disabled': return 'fa-circle-stop';\n case 'Pending': return 'fa-circle-pause';\n default: return 'fa-circle-question';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Passed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Error': return '#f59e0b';\n case 'Timeout': return '#f97316';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n default: return '#6b7280';\n }\n }\n\n getPassRate(): number {\n if (this.testRuns.length === 0) return 0;\n const passed = this.testRuns.filter(r => r.Status === 'Passed').length;\n return (passed / this.testRuns.length) * 100;\n }\n\n getAverageCost(): number {\n if (this.testRuns.length === 0) return 0;\n const totalCost = this.testRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n return totalCost / this.testRuns.length;\n }\n\n getAverageDuration(): number {\n if (this.testRuns.length === 0) return 0;\n const totalDuration = this.testRuns.reduce((sum, r) => sum + (r.DurationSeconds || 0), 0);\n return totalDuration / this.testRuns.length;\n }\n\n formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${mins}m`;\n }\n\n formatCost(cost: number): string {\n return `$${cost.toFixed(6)}`;\n }\n\n formatTimeout(ms: number | null): string {\n if (ms === null || ms === undefined) return 'Default (5 min)';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n openTestRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(runId));\n }\n\n getRunTags(run: MJTestRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n openTestSuite(suiteId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n async runTest() {\n if (this.record?.ID) {\n this.testingDialogService.OpenTestDialog(this.record.ID, this.viewContainerRef);\n }\n }\n\n async refresh() {\n this.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n await this.record.Load(this.record.ID);\n this.parseJsonFields();\n\n // Reset lazy-loaded data to force reload\n if (this.testRunsLoaded) {\n this.testRunsLoaded = false;\n this.testRuns = [];\n await this.loadTestRuns();\n }\n if (this.suiteTestsLoaded) {\n this.suiteTestsLoaded = false;\n this.suiteTests = [];\n await this.loadSuiteTests();\n }\n\n SharedService.Instance.CreateSimpleNotification('Refreshed successfully', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to refresh', 'error', 3000);\n } finally {\n this.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n getJsonData(): string {\n let data: Record<string, unknown> | string[] | undefined;\n switch (this.activeJsonView) {\n case 'input': data = this.parsedData.inputDefinition; break;\n case 'expected': data = this.parsedData.expectedOutcomes; break;\n case 'config': data = this.parsedData.configuration; break;\n case 'tags': data = this.parsedData.tags; break;\n }\n return data ? JSON.stringify(data, null, 2) : '// No data available';\n }\n\n getRelativeTime(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n // ===========================\n // History Tab Methods\n // ===========================\n\n async loadHistory(): Promise<void> {\n if (this.historyLoaded) return;\n\n this.loadingHistory = true;\n this.cdr.markForCheck();\n\n try {\n // Load all test runs for this test\n const rv = new RunView();\n const runsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n ResultType: 'entity_object'\n });\n\n if (runsResult.Success && runsResult.Results) {\n const allRuns = runsResult.Results;\n\n // Extract unique tags from all runs\n this.uniqueTags = TagsHelper.getUniqueTags(allRuns.map(r => r.Tags));\n\n // Build history data (aggregated by date)\n this.historyData = this.buildHistoryData(allRuns);\n\n // Build suite performance data\n await this.buildSuitePerformance(allRuns);\n }\n\n this.historyLoaded = true;\n } catch (error) {\n console.error('Error loading history:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load history', 'error', 3000);\n } finally {\n this.loadingHistory = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildHistoryData(runs: MJTestRunEntity[]): HistoryDataPoint[] {\n // Filter by time range\n const filteredRuns = this.filterRunsByTimeRange(runs);\n\n // Group by date\n const dateMap = new Map<string, MJTestRunEntity[]>();\n for (const run of filteredRuns) {\n if (run.StartedAt) {\n const dateKey = new Date(run.StartedAt).toISOString().split('T')[0];\n if (!dateMap.has(dateKey)) {\n dateMap.set(dateKey, []);\n }\n dateMap.get(dateKey)!.push(run);\n }\n }\n\n // Convert to data points\n const dataPoints: HistoryDataPoint[] = [];\n for (const [dateKey, dateRuns] of dateMap) {\n const passCount = dateRuns.filter(r => r.Status === 'Passed').length;\n const failCount = dateRuns.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = dateRuns.filter(r => r.Score != null).map(r => r.Score!);\n const durations = dateRuns.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = dateRuns.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n dataPoints.push({\n date: new Date(dateKey),\n passRate: dateRuns.length > 0 ? (passCount / dateRuns.length) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n runCount: dateRuns.length,\n passCount,\n failCount\n });\n }\n\n // Sort by date descending\n return dataPoints.sort((a, b) => b.date.getTime() - a.date.getTime());\n }\n\n private filterRunsByTimeRange(runs: MJTestRunEntity[]): MJTestRunEntity[] {\n if (this.historyTimeRange === 'all') return runs;\n\n const now = new Date();\n let cutoff: Date;\n\n switch (this.historyTimeRange) {\n case '7d':\n cutoff = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoff = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n default:\n return runs;\n }\n\n return runs.filter(r => r.StartedAt && new Date(r.StartedAt) >= cutoff);\n }\n\n private async buildSuitePerformance(runs: MJTestRunEntity[]): Promise<void> {\n // Group runs by suite\n const suiteMap = new Map<string, MJTestRunEntity[]>();\n\n for (const run of runs) {\n if (run.TestSuiteRunID) {\n if (!suiteMap.has(run.TestSuiteRunID)) {\n suiteMap.set(run.TestSuiteRunID, []);\n }\n suiteMap.get(run.TestSuiteRunID)!.push(run);\n }\n }\n\n // Load suite run info for each unique suite run\n if (suiteMap.size > 0) {\n const suiteRunIds = Array.from(suiteMap.keys()).map(id => `'${id}'`).join(',');\n const rv = new RunView();\n const suiteRunsResult = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `ID IN (${suiteRunIds})`,\n ResultType: 'entity_object'\n });\n\n if (suiteRunsResult.Success && suiteRunsResult.Results) {\n // Group by suite ID\n const suiteIdMap = new Map<string, { runs: MJTestRunEntity[], suiteRuns: MJTestSuiteRunEntity[] }>();\n\n for (const suiteRun of suiteRunsResult.Results) {\n const suiteId = suiteRun.SuiteID;\n if (!suiteIdMap.has(suiteId)) {\n suiteIdMap.set(suiteId, { runs: [], suiteRuns: [] });\n }\n suiteIdMap.get(suiteId)!.suiteRuns.push(suiteRun);\n\n const testRuns = suiteMap.get(suiteRun.ID) || [];\n suiteIdMap.get(suiteId)!.runs.push(...testRuns);\n }\n\n // Build performance data for each suite\n this.suitePerformance = [];\n for (const [suiteId, data] of suiteIdMap) {\n const suiteName = data.suiteRuns[0]?.Suite || 'Unknown Suite';\n const totalRuns = data.runs.length;\n const passedRuns = data.runs.filter(r => r.Status === 'Passed').length;\n const failedRuns = data.runs.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = data.runs.filter(r => r.Score != null).map(r => r.Score!);\n const durations = data.runs.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = data.runs.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n // Collect all tags from suite runs\n const allTags = TagsHelper.getUniqueTags(data.suiteRuns.map(sr => sr.Tags));\n\n // Find most recent run\n const lastRun = data.runs\n .filter(r => r.StartedAt)\n .sort((a, b) => new Date(b.StartedAt!).getTime() - new Date(a.StartedAt!).getTime())[0];\n\n this.suitePerformance.push({\n suiteId,\n suiteName,\n totalRuns,\n passedRuns,\n failedRuns,\n passRate: totalRuns > 0 ? (passedRuns / totalRuns) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n lastRun: lastRun?.StartedAt ? new Date(lastRun.StartedAt) : null,\n tags: allTags\n });\n }\n\n // Sort by total runs descending\n this.suitePerformance.sort((a, b) => b.totalRuns - a.totalRuns);\n }\n }\n }\n\n setHistoryTimeRange(range: '7d' | '30d' | '90d' | 'all'): void {\n this.historyTimeRange = range;\n this.historyLoaded = false;\n this.loadHistory();\n }\n\n setTagFilter(tag: string | null): void {\n this.selectedTagFilter = tag;\n this.cdr.markForCheck();\n }\n\n getFilteredHistoryData(): HistoryDataPoint[] {\n return this.historyData;\n }\n\n getOverallPassRate(): number {\n if (this.historyData.length === 0) return 0;\n const totalRuns = this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n const totalPassed = this.historyData.reduce((sum, d) => sum + d.passCount, 0);\n return totalRuns > 0 ? (totalPassed / totalRuns) * 100 : 0;\n }\n\n getOverallAvgScore(): number {\n if (this.historyData.length === 0) return 0;\n const scores = this.historyData.filter(d => d.avgScore > 0).map(d => d.avgScore);\n return scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;\n }\n\n getOverallAvgDuration(): number {\n if (this.historyData.length === 0) return 0;\n const durations = this.historyData.filter(d => d.avgDuration > 0).map(d => d.avgDuration);\n return durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;\n }\n\n getOverallAvgCost(): number {\n if (this.historyData.length === 0) return 0;\n const costs = this.historyData.filter(d => d.avgCost > 0).map(d => d.avgCost);\n return costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0;\n }\n\n getTotalRuns(): number {\n return this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n }\n\n getPassRateTrend(): 'up' | 'down' | 'stable' {\n if (this.historyData.length < 2) return 'stable';\n\n // Compare recent half to older half\n const mid = Math.floor(this.historyData.length / 2);\n const recentData = this.historyData.slice(0, mid);\n const olderData = this.historyData.slice(mid);\n\n const recentRate = recentData.reduce((sum, d) => sum + d.passRate, 0) / recentData.length;\n const olderRate = olderData.reduce((sum, d) => sum + d.passRate, 0) / olderData.length;\n\n const diff = recentRate - olderRate;\n if (diff > 5) return 'up';\n if (diff < -5) return 'down';\n return 'stable';\n }\n\n exportHistoryToCSV(): void {\n const headers = ['Date', 'Run Count', 'Passed', 'Failed', 'Pass Rate (%)', 'Avg Score', 'Avg Duration (s)', 'Avg Cost (USD)'];\n const rows = this.historyData.map(d => [\n d.date.toISOString().split('T')[0],\n d.runCount.toString(),\n d.passCount.toString(),\n d.failCount.toString(),\n d.passRate.toFixed(1),\n d.avgScore.toFixed(4),\n d.avgDuration.toFixed(2),\n d.avgCost.toFixed(6)\n ]);\n\n const csvContent = [headers, ...rows]\n .map(row => row.map(cell => `\"${cell}\"`).join(','))\n .join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `test-${this.record.ID.substring(0, 8)}-history.csv`;\n link.click();\n URL.revokeObjectURL(link.href);\n\n SharedService.Instance.CreateSimpleNotification('Export complete', 'success', 2000);\n }\n\n openSuiteFromHistory(suiteId: string): void {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n // ===========================\n // Keyboard Shortcuts Settings\n // ===========================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n}\n","<div class=\"test-form\" kendoDialogContainer>\n <!-- Header Section -->\n <div class=\"test-header\">\n <!-- Breadcrumb Navigation -->\n <nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"javascript:void(0)\" (click)=\"navigateToTestingDashboard()\">\n <i class=\"fas fa-vial\"></i>\n <span class=\"breadcrumb-text\">Testing</span>\n </a>\n </li>\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <i class=\"fas fa-flask\"></i>\n <span>{{ record.Name }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"test-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <div class=\"test-info\">\n <h1>{{ record.Name }}</h1>\n <div class=\"test-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n {{ record.Status }}\n </span>\n @if (record.Type) {\n <span class=\"test-type\">\n <i class=\"fas fa-tag\"></i>\n {{ record.Type }}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test\n </button>\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 <!-- Test Description -->\n @if (record.Description) {\n <div class=\"test-description\">\n <p>{{ record.Description }}</p>\n </div>\n }\n\n <!-- Metrics Bar -->\n @if (testRunsLoaded && testRuns.length > 0) {\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Runs</div>\n <div class=\"metric-value\">{{ testRuns.length }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Pass Rate</div>\n <div class=\"metric-value\">{{ getPassRate().toFixed(1) }}%</div>\n <div class=\"metric-progress\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"getPassRate()\"></div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Cost</div>\n <div class=\"metric-value\">{{ formatCost(getAverageCost()) }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Duration</div>\n <div class=\"metric-value\">{{ formatDuration(getAverageDuration()) }}</div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'config'\"\n (click)=\"changeTab('config')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'config'\">\n <i class=\"fas fa-sliders-h\"></i>\n <span>Configuration</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'runs'\"\n (click)=\"changeTab('runs')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'runs'\">\n <i class=\"fas fa-history\"></i>\n <span>Runs</span>\n @if (testRunsLoaded) {\n <span class=\"tab-badge\">{{ testRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'suites'\"\n (click)=\"changeTab('suites')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'suites'\">\n <i class=\"fas fa-layer-group\"></i>\n <span>Test Suites</span>\n @if (suiteTestsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'analytics'\"\n (click)=\"changeTab('analytics')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'analytics'\">\n <i class=\"fas fa-chart-line\"></i>\n <span>Analytics</span>\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Basic Information -->\n <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Test Information</h3>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <div class=\"info-label\">Name</div>\n <div class=\"info-value\">{{ record.Name }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Type</div>\n <div class=\"info-value\">{{ record.Type || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Status</div>\n <div class=\"info-value\">\n <span class=\"status-badge-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Priority</div>\n <div class=\"info-value\">{{ record.Priority || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Duration</div>\n <div class=\"info-value\">{{ record.EstimatedDurationSeconds ? formatDuration(record.EstimatedDurationSeconds) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Cost</div>\n <div class=\"info-value\">{{ record.EstimatedCostUSD ? formatCost(record.EstimatedCostUSD) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Repeat Count</div>\n <div class=\"info-value\">{{ record.RepeatCount || 1 }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Max Execution Time</div>\n <div class=\"info-value\">{{ formatTimeout(record.MaxExecutionTimeMS) }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Created</div>\n <div class=\"info-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Updated</div>\n <div class=\"info-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n </div>\n </div>\n <!-- JSON Data Views -->\n <div class=\"json-section\">\n <h3><i class=\"fas fa-code\"></i> Test Definition</h3>\n <div class=\"json-tabs\">\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'input'\"\n (click)=\"setJsonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i>\n Input Definition\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'expected'\"\n (click)=\"setJsonView('expected')\">\n <i class=\"fas fa-check-double\"></i>\n Expected Outcomes\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'config'\"\n (click)=\"setJsonView('config')\">\n <i class=\"fas fa-cog\"></i>\n Configuration\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'tags'\"\n (click)=\"setJsonView('tags')\">\n <i class=\"fas fa-tags\"></i>\n Tags\n </button>\n </div>\n <div class=\"code-editor-container\">\n <mj-code-editor\n [value]=\"getJsonData()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Configuration Tab -->\n @if (activeTab === 'config') {\n <div class=\"config-tab\">\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cogs\"></i> Execution Settings</h3>\n <div class=\"config-grid\">\n <div class=\"config-item\">\n <label>Priority</label>\n <input type=\"number\" [(ngModel)]=\"record.Priority\" class=\"config-input\" placeholder=\"Lower = Higher Priority\" />\n </div>\n <div class=\"config-item\">\n <label>Repeat Count</label>\n <input type=\"number\" [(ngModel)]=\"record.RepeatCount\" class=\"config-input\" min=\"1\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Duration (seconds)</label>\n <input type=\"number\" [(ngModel)]=\"record.EstimatedDurationSeconds\" class=\"config-input\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Cost (USD)</label>\n <input type=\"number\" step=\"0.000001\" [(ngModel)]=\"record.EstimatedCostUSD\" class=\"config-input\" />\n </div>\n <div class=\"config-item full-width\">\n <label>Max Execution Time (ms)</label>\n <input type=\"number\" [(ngModel)]=\"record.MaxExecutionTimeMS\" class=\"config-input\" placeholder=\"Default: 300000 (5 min)\" />\n <span class=\"config-hint\">Leave empty for default 5 minute timeout</span>\n </div>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-sign-in-alt\"></i> Input Definition (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.InputDefinition || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.InputDefinition = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-check-double\"></i> Expected Outcomes (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.ExpectedOutcomes || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.ExpectedOutcomes = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cog\"></i> Configuration (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.Configuration || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Configuration = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-tags\"></i> Tags (JSON Array)</h3>\n <div class=\"config-editor-container small\">\n <mj-code-editor\n [value]=\"record.Tags || '[]'\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Tags = $event\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Test Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Loading State -->\n @if (loadingRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3,4,5]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Runs List -->\n @if (!loadingRuns && testRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of testRuns; track run) {\n <div class=\"run-item\" (click)=\"openTestRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-stopwatch]=\"run.Status === 'Timeout'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header\">\n <span class=\"run-id\">Run #{{ run.ID.substring(0, 8) }}</span>\n <span class=\"run-status\" [style.color]=\"getRunStatusColor(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-meta\">\n <span><i class=\"fas fa-calendar\"></i> {{ getRelativeTime(run.StartedAt) }}</span>\n @if (run.DurationSeconds) {\n <span><i class=\"fas fa-clock\"></i> {{ formatDuration(run.DurationSeconds) }}</span>\n }\n @if (run.CostUSD) {\n <span><i class=\"fas fa-dollar-sign\"></i> {{ formatCost(run.CostUSD) }}</span>\n }\n @if (run.TargetLogEntityID && run.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"run.TargetLogEntity\"\n [recordId]=\"run.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n <!-- Evaluation indicators -->\n <div class=\"run-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-pill status-pill\"\n [ngClass]=\"'status-' + run.Status.toLowerCase()\"\n [title]=\"getStatusTooltip(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-hourglass-end]=\"run.Status === 'Timeout'\"\n [class.fa-forward]=\"run.Status === 'Skipped'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n <span>{{ run.Status }}</span>\n </span>\n }\n <!-- Human feedback indicator -->\n @if (evalPreferences.showHuman) {\n @if (!getFeedbackForRun(run.ID)?.Rating) {\n <span class=\"eval-pill human-pill no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (getFeedbackForRun(run.ID)?.Rating; as rating) {\n <span class=\"eval-pill human-pill has-feedback\"\n [class.rating-low]=\"rating <= 4\"\n [class.rating-medium]=\"rating >= 5 && rating <= 6\"\n [class.rating-good]=\"rating >= 7 && rating <= 8\"\n [class.rating-excellent]=\"rating >= 9\"\n [title]=\"getHumanTooltip(rating, getFeedbackForRun(run.ID)?.CorrectionSummary || getFeedbackForRun(run.ID)?.Comments || null)\">\n <i class=\"fas fa-user\"></i>\n <span>{{ rating }}</span>\n </span>\n }\n }\n <!-- Auto score indicator -->\n @if (evalPreferences.showAuto) {\n @if (run.Score == null) {\n <span class=\"eval-pill auto-pill no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n @if (run.Score != null) {\n <span class=\"eval-pill auto-pill has-score\"\n [class.score-low]=\"run.Score < 0.5\"\n [class.score-medium]=\"run.Score >= 0.5 && run.Score < 0.7\"\n [class.score-good]=\"run.Score >= 0.7 && run.Score < 0.85\"\n [class.score-excellent]=\"run.Score >= 0.85\"\n [title]=\"'Auto Score: ' + (run.Score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ (run.Score * 100).toFixed(0) }}%</span>\n </span>\n }\n }\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run).slice(0, 3); track tag) {\n <span class=\"run-tag\">{{ tag }}</span>\n }\n @if (getRunTags(run).length > 3) {\n <span class=\"run-tag-more\">+{{ getRunTags(run).length - 3 }}</span>\n }\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testRunsLoaded && !loadingRuns && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <h4>No Test Runs Yet</h4>\n <p>Run this test to see execution history and results here.</p>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Test Suites Tab -->\n @if (activeTab === 'suites') {\n <div class=\"suites-tab\">\n <!-- Loading State -->\n @if (loadingSuites) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Suites List -->\n @if (!loadingSuites && suiteTests.length > 0) {\n <div class=\"suites-list\">\n @for (suiteTest of suiteTests; track suiteTest) {\n <div class=\"suite-item\" (click)=\"openTestSuite(suiteTest.SuiteID)\">\n <div class=\"suite-icon\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-content\">\n <div class=\"suite-name\">{{ suiteTest.Suite }}</div>\n <div class=\"suite-meta\">\n <span><i class=\"fas fa-sort-numeric-up\"></i> Sequence: {{ suiteTest.Sequence }}</span>\n @if (suiteTest.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ suiteTest.Status }}</span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (suiteTestsLoaded && !loadingSuites && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-folder-open\"></i>\n </div>\n <h4>Not Part of Any Suite</h4>\n <p>This test is not included in any test suites. Add it to a suite to run it with other tests.</p>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"history-tab\">\n <!-- Loading State -->\n @if (loadingHistory) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading history...\"></mj-loading>\n </div>\n }\n <!-- History Content -->\n @if (!loadingHistory && historyLoaded) {\n <div class=\"history-content\">\n <!-- Filters -->\n <div class=\"history-filters\">\n <div class=\"time-range-filters\">\n <span class=\"filter-label\">Time Range:</span>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '7d'\"\n (click)=\"setHistoryTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '30d'\"\n (click)=\"setHistoryTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '90d'\"\n (click)=\"setHistoryTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === 'all'\"\n (click)=\"setHistoryTimeRange('all')\">All Time</button>\n </div>\n <div class=\"history-actions\">\n <button kendoButton (click)=\"exportHistoryToCSV()\" [disabled]=\"historyData.length === 0\">\n <i class=\"fas fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- KPI Cards -->\n @if (historyData.length > 0) {\n <div class=\"history-kpi-cards\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getTotalRuns() }}</div>\n <div class=\"kpi-label\">Total Runs</div>\n </div>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon pass-rate\">\n <i class=\"fas fa-percentage\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">\n {{ getOverallPassRate().toFixed(1) }}%\n <i class=\"fas trend-icon\"\n [class.fa-arrow-up]=\"getPassRateTrend() === 'up'\"\n [class.fa-arrow-down]=\"getPassRateTrend() === 'down'\"\n [class.fa-minus]=\"getPassRateTrend() === 'stable'\"\n [class.trend-up]=\"getPassRateTrend() === 'up'\"\n [class.trend-down]=\"getPassRateTrend() === 'down'\"></i>\n </div>\n <div class=\"kpi-label\">Pass Rate</div>\n </div>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ (getOverallAvgScore() * 100).toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Score</div>\n </div>\n </div>\n }\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getOverallAvgDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getOverallAvgCost()) }}</div>\n <div class=\"kpi-label\">Avg Cost</div>\n </div>\n </div>\n </div>\n }\n <!-- Daily History Table -->\n @if (historyData.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-calendar-alt\"></i> Daily Performance</h3>\n <div class=\"history-table-container\">\n <table class=\"history-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Runs</th>\n @if (evalPreferences.showExecution) {\n <th>Passed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Failed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Pass Rate</th>\n }\n @if (evalPreferences.showAuto) {\n <th>Avg Score</th>\n }\n <th>Avg Duration</th>\n <th>Avg Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (day of historyData; track day) {\n <tr>\n <td class=\"date-cell\">{{ day.date | date:'mediumDate' }}</td>\n <td class=\"runs-cell\">{{ day.runCount }}</td>\n @if (evalPreferences.showExecution) {\n <td class=\"passed-cell\">{{ day.passCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"failed-cell\">{{ day.failCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\">\n <div class=\"pass-rate-fill\" [style.width.%]=\"day.passRate\"></div>\n <span class=\"pass-rate-text\">{{ day.passRate.toFixed(1) }}%</span>\n </div>\n </td>\n }\n @if (evalPreferences.showAuto) {\n <td class=\"score-cell\">{{ (day.avgScore * 100).toFixed(1) }}%</td>\n }\n <td class=\"duration-cell\">{{ formatDuration(day.avgDuration) }}</td>\n <td class=\"cost-cell\">{{ formatCost(day.avgCost) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n <!-- Suite Performance -->\n @if (suitePerformance.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-layer-group\"></i> Performance by Suite</h3>\n <div class=\"suite-performance-list\">\n @for (suite of suitePerformance; track suite) {\n <div class=\"suite-perf-card\" (click)=\"openSuiteFromHistory(suite.suiteId)\">\n <div class=\"suite-perf-header\">\n <div class=\"suite-perf-name\">{{ suite.suiteName }}</div>\n @if (suite.tags.length > 0) {\n <div class=\"suite-perf-tags\">\n @for (tag of suite.tags.slice(0, 3); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n @if (suite.tags.length > 3) {\n <span class=\"tag-more\">+{{ suite.tags.length - 3 }}</span>\n }\n </div>\n }\n </div>\n <div class=\"suite-perf-stats\">\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ suite.totalRuns }}</span>\n <span class=\"stat-label\">Runs</span>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"suite-stat\">\n <span class=\"stat-value pass-rate\" [class.high]=\"suite.passRate >= 80\" [class.low]=\"suite.passRate < 50\">\n {{ suite.passRate.toFixed(1) }}%\n </span>\n <span class=\"stat-label\">Pass Rate</span>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ (suite.avgScore * 100).toFixed(1) }}%</span>\n <span class=\"stat-label\">Avg Score</span>\n </div>\n }\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatDuration(suite.avgDuration) }}</span>\n <span class=\"stat-label\">Avg Duration</span>\n </div>\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatCost(suite.avgCost) }}</span>\n <span class=\"stat-label\">Avg Cost</span>\n </div>\n @if (suite.lastRun) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ getRelativeTime(suite.lastRun) }}</span>\n <span class=\"stat-label\">Last Run</span>\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right suite-perf-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (historyData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-line\"></i>\n </div>\n <h4>No History Available</h4>\n <p>Run this test to start building history and analytics data.</p>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Toggle Button -->\n <button class=\"shortcuts-toggle\" (click)=\"toggleShortcuts()\" [title]=\"showShortcuts ? 'Hide keyboard shortcuts' : 'Show keyboard shortcuts'\">\n <i class=\"fas fa-keyboard\"></i>\n </button>\n\n <!-- Keyboard Shortcuts Hint (Desktop Only) -->\n @if (showShortcuts) {\n <div class=\"keyboard-shortcuts\">\n <div class=\"shortcuts-header\">\n <i class=\"fas fa-keyboard\"></i>\n Shortcuts\n <button class=\"shortcuts-close\" (click)=\"toggleShortcuts()\" title=\"Hide shortcuts\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcut-list\">\n <div class=\"shortcut-item\">\n <span>Refresh</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>R</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Run Test</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Enter</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Switch Tabs</span>\n <span class=\"shortcut-keys\"><kbd>1</kbd>-<kbd>5</kbd></span>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"test-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-form.component.ts","../../../../src/lib/custom/Tests/test-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, HostListener, ViewContainerRef, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { MJTestEntity, MJTestRunEntity, MJTestSuiteTestEntity, MJTestSuiteRunEntity, MJUserSettingEntity, UserInfoEngine, MJTestRunFeedbackEntity } from '@memberjunction/core-entities';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { RegisterClass } from '@memberjunction/global';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJTestFormComponent } from '../../generated/Entities/MJTest/mjtest.form.component';\nimport {\n TestingDialogService,\n TagsHelper,\n EvaluationPreferencesService,\n EvaluationPreferences\n} from '@memberjunction/ng-testing';\nimport { createCopyOnlyToolbar, ToolbarConfig } from '@memberjunction/ng-code-editor';\n\n/** Settings key for keyboard shortcuts visibility */\nconst SHORTCUTS_SETTINGS_KEY = '__mj.Testing.ShowKeyboardShortcuts';\n\ninterface HistoryDataPoint {\n date: Date;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n runCount: number;\n passCount: number;\n failCount: number;\n}\n\ninterface SuitePerformance {\n suiteId: string;\n suiteName: string;\n totalRuns: number;\n passedRuns: number;\n failedRuns: number;\n passRate: number;\n avgScore: number;\n avgDuration: number;\n avgCost: number;\n lastRun: Date | null;\n tags: string[];\n}\n\ninterface ParsedJSON {\n inputDefinition?: Record<string, unknown>;\n expectedOutcomes?: Record<string, unknown>;\n configuration?: Record<string, unknown>;\n tags?: string[];\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Tests')\n@Component({\n standalone: false,\n selector: 'mj-test-form',\n templateUrl: './test-form.component.html',\n styleUrls: ['./test-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJTestFormComponentExtended extends MJTestFormComponent implements OnInit, OnDestroy {\n public override record!: MJTestEntity;\n\n private destroy$ = new Subject<void>();\n\n // UI state\n activeTab = 'overview';\n loading = false;\n loadingRuns = false;\n loadingSuites = false;\n error: string | null = null;\n testRunsLoaded = false;\n suiteTestsLoaded = false;\n isRefreshing = false;\n\n // Related data\n testRuns: MJTestRunEntity[] = [];\n suiteTests: MJTestSuiteTestEntity[] = [];\n\n // Human feedback map: testRunId -> feedback entity\n feedbackMap = new Map<string, MJTestRunFeedbackEntity>();\n\n // History tab data\n historyLoaded = false;\n loadingHistory = false;\n historyTimeRange: '7d' | '30d' | '90d' | 'all' = '30d';\n historyData: HistoryDataPoint[] = [];\n suitePerformance: SuitePerformance[] = [];\n uniqueTags: string[] = [];\n selectedTagFilter: string | null = null;\n\n // Parsed JSON fields\n parsedData: ParsedJSON = {};\n\n // Active JSON view\n activeJsonView: 'input' | 'expected' | 'config' | 'tags' = 'input';\n\n // Code editor configuration\n jsonToolbar: ToolbarConfig = createCopyOnlyToolbar();\n\n // Keyboard shortcuts\n keyboardShortcutsEnabled = true;\n showShortcuts = false; // Hidden by default\n private shortcutsSettingEntity: MJUserSettingEntity | null = null;\n private metadata = new Metadata();\n\n // Evaluation preferences\n evalPreferences: EvaluationPreferences = { showExecution: true, showHuman: true, showAuto: false };\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 this.parseJsonFields();\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Keyboard shortcuts\n @HostListener('document:keydown', ['$event'])\n handleKeyboardShortcut(event: KeyboardEvent) {\n if (!this.keyboardShortcutsEnabled) return;\n\n // Cmd/Ctrl + R: Refresh\n if ((event.metaKey || event.ctrlKey) && event.key === 'r' && !event.shiftKey) {\n event.preventDefault();\n this.refresh();\n return;\n }\n\n // Cmd/Ctrl + Enter: Run test\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n this.runTest();\n return;\n }\n\n // Number keys for tabs (1-5)\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n switch (event.key) {\n case '1': this.changeTab('overview'); break;\n case '2': this.changeTab('config'); break;\n case '3': this.changeTab('runs'); break;\n case '4': this.changeTab('suites'); break;\n case '5': this.changeTab('analytics'); break;\n }\n }\n }\n\n private async loadTestRuns() {\n if (this.testRunsLoaded) return;\n\n this.loadingRuns = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.testRuns = result.Results || [];\n\n // Load feedbacks for all test runs\n if (this.testRuns.length > 0) {\n await this.loadFeedbacksForTestRuns(this.testRuns.map(r => r.ID));\n }\n }\n\n this.testRunsLoaded = true;\n } catch (error) {\n console.error('Error loading test runs:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test runs', 'error', 3000);\n } finally {\n this.loadingRuns = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load feedbacks for a batch of test run IDs\n */\n private async loadFeedbacksForTestRuns(testRunIds: string[]): Promise<void> {\n if (testRunIds.length === 0) return;\n\n try {\n const rv = new RunView();\n const chunkSize = 50;\n for (let i = 0; i < testRunIds.length; i += chunkSize) {\n const chunk = testRunIds.slice(i, i + chunkSize);\n const inClause = chunk.map(id => `'${id}'`).join(',');\n\n const result = await rv.RunView<MJTestRunFeedbackEntity>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN (${inClause})`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n for (const feedback of result.Results) {\n this.feedbackMap.set(feedback.TestRunID, feedback);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load feedbacks:', error);\n }\n }\n\n /**\n * Get feedback for a specific test run\n */\n getFeedbackForRun(testRunId: string): MJTestRunFeedbackEntity | undefined {\n return this.feedbackMap.get(testRunId);\n }\n\n /**\n * Get tooltip for status indicator\n */\n getStatusTooltip(status: string): string {\n switch (status) {\n case 'Passed': return 'Status: Passed - Test completed without error';\n case 'Failed': return 'Status: Failed - Test assertions did not pass';\n case 'Error': return 'Status: Error - Test encountered an exception';\n case 'Timeout': return 'Status: Timeout - Test exceeded time limit';\n case 'Skipped': return 'Status: Skipped - Test was not executed';\n case 'Running': return 'Status: Running - Test is currently executing';\n case 'Pending': return 'Status: Pending - Test waiting to run';\n default: return `Status: ${status}`;\n }\n }\n\n /**\n * Get tooltip for human review with rating and optional comments\n */\n getHumanTooltip(rating: number, comments: string | null): string {\n let tooltip = `Human Review: ${rating}/10 rating`;\n if (comments) {\n const truncated = comments.length > 200 ? comments.substring(0, 200) + '...' : comments;\n tooltip += `\\n\\n\"${truncated}\"`;\n }\n return tooltip;\n }\n\n private async loadSuiteTests() {\n if (this.suiteTestsLoaded) return;\n\n this.loadingSuites = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTestSuiteTestEntity>({\n EntityName: 'MJ: Test Suite Tests',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'Sequence',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.suiteTests = result.Results || [];\n }\n\n this.suiteTestsLoaded = true;\n } catch (error) {\n console.error('Error loading suite tests:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load test suites', 'error', 3000);\n } finally {\n this.loadingSuites = false;\n this.cdr.markForCheck();\n }\n }\n\n private parseJsonFields() {\n try {\n if (this.record.InputDefinition) {\n this.parsedData.inputDefinition = JSON.parse(this.record.InputDefinition);\n }\n if (this.record.ExpectedOutcomes) {\n this.parsedData.expectedOutcomes = JSON.parse(this.record.ExpectedOutcomes);\n }\n if (this.record.Configuration) {\n this.parsedData.configuration = JSON.parse(this.record.Configuration);\n }\n if (this.record.Tags) {\n this.parsedData.tags = JSON.parse(this.record.Tags);\n }\n } catch (error) {\n console.error('Error parsing JSON fields:', error);\n }\n }\n\n changeTab(tab: string) {\n this.activeTab = tab;\n\n // Lazy load tabs\n if (tab === 'runs' && !this.testRunsLoaded) {\n this.loadTestRuns();\n }\n\n if (tab === 'suites' && !this.suiteTestsLoaded) {\n this.loadSuiteTests();\n }\n\n if (tab === 'analytics' && !this.historyLoaded) {\n this.loadHistory();\n }\n\n this.cdr.markForCheck();\n }\n\n setJsonView(view: 'input' | 'expected' | 'config' | 'tags') {\n this.activeJsonView = view;\n this.cdr.markForCheck();\n }\n\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return '#10b981';\n case 'Disabled': return '#6b7280';\n case 'Pending': return '#f59e0b';\n default: return '#9ca3af';\n }\n }\n\n getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Active': return 'fa-circle-check';\n case 'Disabled': return 'fa-circle-stop';\n case 'Pending': return 'fa-circle-pause';\n default: return 'fa-circle-question';\n }\n }\n\n getStatusClass(): string {\n return `status-${this.record.Status?.toLowerCase() || 'unknown'}`;\n }\n\n getRunStatusColor(status: string): string {\n switch (status) {\n case 'Passed': return '#10b981';\n case 'Failed': return '#ef4444';\n case 'Error': return '#f59e0b';\n case 'Timeout': return '#f97316';\n case 'Running': return '#3b82f6';\n case 'Pending': return '#8b5cf6';\n default: return '#6b7280';\n }\n }\n\n getPassRate(): number {\n if (this.testRuns.length === 0) return 0;\n const passed = this.testRuns.filter(r => r.Status === 'Passed').length;\n return (passed / this.testRuns.length) * 100;\n }\n\n getAverageCost(): number {\n if (this.testRuns.length === 0) return 0;\n const totalCost = this.testRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n return totalCost / this.testRuns.length;\n }\n\n getAverageDuration(): number {\n if (this.testRuns.length === 0) return 0;\n const totalDuration = this.testRuns.reduce((sum, r) => sum + (r.DurationSeconds || 0), 0);\n return totalDuration / this.testRuns.length;\n }\n\n formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n if (seconds < 3600) {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n\n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${mins}m`;\n }\n\n formatCost(cost: number): string {\n return `$${cost.toFixed(6)}`;\n }\n\n formatTimeout(ms: number | null): string {\n if (ms === null || ms === undefined) return 'Default (5 min)';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;\n }\n\n openTestRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Runs', CompositeKey.FromID(runId));\n }\n\n getRunTags(run: MJTestRunEntity): string[] {\n return TagsHelper.parseTags(run.Tags);\n }\n\n openTestSuite(suiteId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n navigateToTestingDashboard(): void {\n const testingApp = this.appManager.GetAppByName('Testing');\n if (testingApp) {\n this.navigationService.SwitchToApp(testingApp.ID);\n }\n }\n\n async runTest() {\n if (this.record?.ID) {\n this.testingDialogService.OpenTestPanel(this.record.ID);\n }\n }\n\n async refresh() {\n this.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n await this.record.Load(this.record.ID);\n this.parseJsonFields();\n\n // Reset lazy-loaded data to force reload\n if (this.testRunsLoaded) {\n this.testRunsLoaded = false;\n this.testRuns = [];\n await this.loadTestRuns();\n }\n if (this.suiteTestsLoaded) {\n this.suiteTestsLoaded = false;\n this.suiteTests = [];\n await this.loadSuiteTests();\n }\n\n SharedService.Instance.CreateSimpleNotification('Refreshed successfully', 'success', 2000);\n } catch {\n SharedService.Instance.CreateSimpleNotification('Failed to refresh', 'error', 3000);\n } finally {\n this.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n getJsonData(): string {\n let data: Record<string, unknown> | string[] | undefined;\n switch (this.activeJsonView) {\n case 'input': data = this.parsedData.inputDefinition; break;\n case 'expected': data = this.parsedData.expectedOutcomes; break;\n case 'config': data = this.parsedData.configuration; break;\n case 'tags': data = this.parsedData.tags; break;\n }\n return data ? JSON.stringify(data, null, 2) : '// No data available';\n }\n\n getRelativeTime(date: Date | string | null): string {\n if (!date) return 'N/A';\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n // ===========================\n // History Tab Methods\n // ===========================\n\n async loadHistory(): Promise<void> {\n if (this.historyLoaded) return;\n\n this.loadingHistory = true;\n this.cdr.markForCheck();\n\n try {\n // Load all test runs for this test\n const rv = new RunView();\n const runsResult = await rv.RunView<MJTestRunEntity>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `TestID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n ResultType: 'entity_object'\n });\n\n if (runsResult.Success && runsResult.Results) {\n const allRuns = runsResult.Results;\n\n // Extract unique tags from all runs\n this.uniqueTags = TagsHelper.getUniqueTags(allRuns.map(r => r.Tags));\n\n // Build history data (aggregated by date)\n this.historyData = this.buildHistoryData(allRuns);\n\n // Build suite performance data\n await this.buildSuitePerformance(allRuns);\n }\n\n this.historyLoaded = true;\n } catch (error) {\n console.error('Error loading history:', error);\n SharedService.Instance.CreateSimpleNotification('Failed to load history', 'error', 3000);\n } finally {\n this.loadingHistory = false;\n this.cdr.markForCheck();\n }\n }\n\n private buildHistoryData(runs: MJTestRunEntity[]): HistoryDataPoint[] {\n // Filter by time range\n const filteredRuns = this.filterRunsByTimeRange(runs);\n\n // Group by date\n const dateMap = new Map<string, MJTestRunEntity[]>();\n for (const run of filteredRuns) {\n if (run.StartedAt) {\n const dateKey = new Date(run.StartedAt).toISOString().split('T')[0];\n if (!dateMap.has(dateKey)) {\n dateMap.set(dateKey, []);\n }\n dateMap.get(dateKey)!.push(run);\n }\n }\n\n // Convert to data points\n const dataPoints: HistoryDataPoint[] = [];\n for (const [dateKey, dateRuns] of dateMap) {\n const passCount = dateRuns.filter(r => r.Status === 'Passed').length;\n const failCount = dateRuns.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = dateRuns.filter(r => r.Score != null).map(r => r.Score!);\n const durations = dateRuns.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = dateRuns.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n dataPoints.push({\n date: new Date(dateKey),\n passRate: dateRuns.length > 0 ? (passCount / dateRuns.length) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n runCount: dateRuns.length,\n passCount,\n failCount\n });\n }\n\n // Sort by date descending\n return dataPoints.sort((a, b) => b.date.getTime() - a.date.getTime());\n }\n\n private filterRunsByTimeRange(runs: MJTestRunEntity[]): MJTestRunEntity[] {\n if (this.historyTimeRange === 'all') return runs;\n\n const now = new Date();\n let cutoff: Date;\n\n switch (this.historyTimeRange) {\n case '7d':\n cutoff = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case '30d':\n cutoff = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case '90d':\n cutoff = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n break;\n default:\n return runs;\n }\n\n return runs.filter(r => r.StartedAt && new Date(r.StartedAt) >= cutoff);\n }\n\n private async buildSuitePerformance(runs: MJTestRunEntity[]): Promise<void> {\n // Group runs by suite\n const suiteMap = new Map<string, MJTestRunEntity[]>();\n\n for (const run of runs) {\n if (run.TestSuiteRunID) {\n if (!suiteMap.has(run.TestSuiteRunID)) {\n suiteMap.set(run.TestSuiteRunID, []);\n }\n suiteMap.get(run.TestSuiteRunID)!.push(run);\n }\n }\n\n // Load suite run info for each unique suite run\n if (suiteMap.size > 0) {\n const suiteRunIds = Array.from(suiteMap.keys()).map(id => `'${id}'`).join(',');\n const rv = new RunView();\n const suiteRunsResult = await rv.RunView<MJTestSuiteRunEntity>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: `ID IN (${suiteRunIds})`,\n ResultType: 'entity_object'\n });\n\n if (suiteRunsResult.Success && suiteRunsResult.Results) {\n // Group by suite ID\n const suiteIdMap = new Map<string, { runs: MJTestRunEntity[], suiteRuns: MJTestSuiteRunEntity[] }>();\n\n for (const suiteRun of suiteRunsResult.Results) {\n const suiteId = suiteRun.SuiteID;\n if (!suiteIdMap.has(suiteId)) {\n suiteIdMap.set(suiteId, { runs: [], suiteRuns: [] });\n }\n suiteIdMap.get(suiteId)!.suiteRuns.push(suiteRun);\n\n const testRuns = suiteMap.get(suiteRun.ID) || [];\n suiteIdMap.get(suiteId)!.runs.push(...testRuns);\n }\n\n // Build performance data for each suite\n this.suitePerformance = [];\n for (const [suiteId, data] of suiteIdMap) {\n const suiteName = data.suiteRuns[0]?.Suite || 'Unknown Suite';\n const totalRuns = data.runs.length;\n const passedRuns = data.runs.filter(r => r.Status === 'Passed').length;\n const failedRuns = data.runs.filter(r => r.Status === 'Failed' || r.Status === 'Error').length;\n const scores = data.runs.filter(r => r.Score != null).map(r => r.Score!);\n const durations = data.runs.filter(r => r.DurationSeconds != null).map(r => r.DurationSeconds!);\n const costs = data.runs.filter(r => r.CostUSD != null).map(r => r.CostUSD!);\n\n // Collect all tags from suite runs\n const allTags = TagsHelper.getUniqueTags(data.suiteRuns.map(sr => sr.Tags));\n\n // Find most recent run\n const lastRun = data.runs\n .filter(r => r.StartedAt)\n .sort((a, b) => new Date(b.StartedAt!).getTime() - new Date(a.StartedAt!).getTime())[0];\n\n this.suitePerformance.push({\n suiteId,\n suiteName,\n totalRuns,\n passedRuns,\n failedRuns,\n passRate: totalRuns > 0 ? (passedRuns / totalRuns) * 100 : 0,\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0,\n avgDuration: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,\n avgCost: costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0,\n lastRun: lastRun?.StartedAt ? new Date(lastRun.StartedAt) : null,\n tags: allTags\n });\n }\n\n // Sort by total runs descending\n this.suitePerformance.sort((a, b) => b.totalRuns - a.totalRuns);\n }\n }\n }\n\n setHistoryTimeRange(range: '7d' | '30d' | '90d' | 'all'): void {\n this.historyTimeRange = range;\n this.historyLoaded = false;\n this.loadHistory();\n }\n\n setTagFilter(tag: string | null): void {\n this.selectedTagFilter = tag;\n this.cdr.markForCheck();\n }\n\n getFilteredHistoryData(): HistoryDataPoint[] {\n return this.historyData;\n }\n\n getOverallPassRate(): number {\n if (this.historyData.length === 0) return 0;\n const totalRuns = this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n const totalPassed = this.historyData.reduce((sum, d) => sum + d.passCount, 0);\n return totalRuns > 0 ? (totalPassed / totalRuns) * 100 : 0;\n }\n\n getOverallAvgScore(): number {\n if (this.historyData.length === 0) return 0;\n const scores = this.historyData.filter(d => d.avgScore > 0).map(d => d.avgScore);\n return scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;\n }\n\n getOverallAvgDuration(): number {\n if (this.historyData.length === 0) return 0;\n const durations = this.historyData.filter(d => d.avgDuration > 0).map(d => d.avgDuration);\n return durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;\n }\n\n getOverallAvgCost(): number {\n if (this.historyData.length === 0) return 0;\n const costs = this.historyData.filter(d => d.avgCost > 0).map(d => d.avgCost);\n return costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : 0;\n }\n\n getTotalRuns(): number {\n return this.historyData.reduce((sum, d) => sum + d.runCount, 0);\n }\n\n getPassRateTrend(): 'up' | 'down' | 'stable' {\n if (this.historyData.length < 2) return 'stable';\n\n // Compare recent half to older half\n const mid = Math.floor(this.historyData.length / 2);\n const recentData = this.historyData.slice(0, mid);\n const olderData = this.historyData.slice(mid);\n\n const recentRate = recentData.reduce((sum, d) => sum + d.passRate, 0) / recentData.length;\n const olderRate = olderData.reduce((sum, d) => sum + d.passRate, 0) / olderData.length;\n\n const diff = recentRate - olderRate;\n if (diff > 5) return 'up';\n if (diff < -5) return 'down';\n return 'stable';\n }\n\n exportHistoryToCSV(): void {\n const headers = ['Date', 'Run Count', 'Passed', 'Failed', 'Pass Rate (%)', 'Avg Score', 'Avg Duration (s)', 'Avg Cost (USD)'];\n const rows = this.historyData.map(d => [\n d.date.toISOString().split('T')[0],\n d.runCount.toString(),\n d.passCount.toString(),\n d.failCount.toString(),\n d.passRate.toFixed(1),\n d.avgScore.toFixed(4),\n d.avgDuration.toFixed(2),\n d.avgCost.toFixed(6)\n ]);\n\n const csvContent = [headers, ...rows]\n .map(row => row.map(cell => `\"${cell}\"`).join(','))\n .join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = `test-${this.record.ID.substring(0, 8)}-history.csv`;\n link.click();\n URL.revokeObjectURL(link.href);\n\n SharedService.Instance.CreateSimpleNotification('Export complete', 'success', 2000);\n }\n\n openSuiteFromHistory(suiteId: string): void {\n SharedService.Instance.OpenEntityRecord('MJ: Test Suites', CompositeKey.FromID(suiteId));\n }\n\n // ===========================\n // Keyboard Shortcuts Settings\n // ===========================\n\n /**\n * Load keyboard shortcuts visibility setting from user settings\n */\n private loadShortcutsSetting(): void {\n try {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n this.showShortcuts = setting.Value === 'true';\n } else {\n // Default to hidden\n this.showShortcuts = false;\n }\n this.cdr.markForCheck();\n } catch (error) {\n console.warn('Failed to load shortcuts setting:', error);\n }\n }\n\n /**\n * Toggle keyboard shortcuts visibility and save preference\n */\n async toggleShortcuts(): Promise<void> {\n this.showShortcuts = !this.showShortcuts;\n this.cdr.markForCheck();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n if (!this.shortcutsSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SHORTCUTS_SETTINGS_KEY);\n\n if (setting) {\n this.shortcutsSettingEntity = setting;\n } else {\n this.shortcutsSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.shortcutsSettingEntity.UserID = userId;\n this.shortcutsSettingEntity.Setting = SHORTCUTS_SETTINGS_KEY;\n }\n }\n\n this.shortcutsSettingEntity.Value = this.showShortcuts ? 'true' : 'false';\n await this.shortcutsSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save shortcuts setting:', error);\n }\n }\n}\n","<div class=\"test-form\" kendoDialogContainer>\n <!-- Header Section -->\n <div class=\"test-header\">\n <!-- Breadcrumb Navigation -->\n <nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"javascript:void(0)\" (click)=\"navigateToTestingDashboard()\">\n <i class=\"fas fa-vial\"></i>\n <span class=\"breadcrumb-text\">Testing</span>\n </a>\n </li>\n <li class=\"current\">\n <i class=\"fas fa-chevron-right separator\"></i>\n <i class=\"fas fa-flask\"></i>\n <span>{{ record.Name }}</span>\n </li>\n </ol>\n </nav>\n\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"test-icon\" [style.background-color]=\"getStatusColor()\">\n <i class=\"fas fa-flask\"></i>\n </div>\n <div class=\"test-info\">\n <h1>{{ record.Name }}</h1>\n <div class=\"test-meta\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon()\"></i>\n {{ record.Status }}\n </span>\n @if (record.Type) {\n <span class=\"test-type\">\n <i class=\"fas fa-tag\"></i>\n {{ record.Type }}\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-actions\">\n <app-evaluation-mode-toggle></app-evaluation-mode-toggle>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test\n </button>\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 <!-- Test Description -->\n @if (record.Description) {\n <div class=\"test-description\">\n <p>{{ record.Description }}</p>\n </div>\n }\n\n <!-- Metrics Bar -->\n @if (testRunsLoaded && testRuns.length > 0) {\n <div class=\"metrics-bar\">\n <div class=\"metric-card\">\n <div class=\"metric-label\">Total Runs</div>\n <div class=\"metric-value\">{{ testRuns.length }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Pass Rate</div>\n <div class=\"metric-value\">{{ getPassRate().toFixed(1) }}%</div>\n <div class=\"metric-progress\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"getPassRate()\"></div>\n </div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Cost</div>\n <div class=\"metric-value\">{{ formatCost(getAverageCost()) }}</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-label\">Avg Duration</div>\n <div class=\"metric-value\">{{ formatDuration(getAverageDuration()) }}</div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs-container\">\n <div class=\"tabs\" role=\"tablist\">\n <button class=\"tab\"\n [class.active]=\"activeTab === 'overview'\"\n (click)=\"changeTab('overview')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'overview'\">\n <i class=\"fas fa-th-large\"></i>\n <span>Overview</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'config'\"\n (click)=\"changeTab('config')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'config'\">\n <i class=\"fas fa-sliders-h\"></i>\n <span>Configuration</span>\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'runs'\"\n (click)=\"changeTab('runs')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'runs'\">\n <i class=\"fas fa-history\"></i>\n <span>Runs</span>\n @if (testRunsLoaded) {\n <span class=\"tab-badge\">{{ testRuns.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'suites'\"\n (click)=\"changeTab('suites')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'suites'\">\n <i class=\"fas fa-layer-group\"></i>\n <span>Test Suites</span>\n @if (suiteTestsLoaded) {\n <span class=\"tab-badge\">{{ suiteTests.length }}</span>\n }\n </button>\n <button class=\"tab\"\n [class.active]=\"activeTab === 'analytics'\"\n (click)=\"changeTab('analytics')\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'analytics'\">\n <i class=\"fas fa-chart-line\"></i>\n <span>Analytics</span>\n </button>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\">\n <!-- Overview Tab -->\n @if (activeTab === 'overview') {\n <div class=\"overview-tab\">\n <!-- Basic Information -->\n <div class=\"info-section\">\n <h3><i class=\"fas fa-info-circle\"></i> Test Information</h3>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <div class=\"info-label\">Name</div>\n <div class=\"info-value\">{{ record.Name }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Type</div>\n <div class=\"info-value\">{{ record.Type || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Status</div>\n <div class=\"info-value\">\n <span class=\"status-badge-inline\" [ngClass]=\"getStatusClass()\">{{ record.Status }}</span>\n </div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Priority</div>\n <div class=\"info-value\">{{ record.Priority || 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Duration</div>\n <div class=\"info-value\">{{ record.EstimatedDurationSeconds ? formatDuration(record.EstimatedDurationSeconds) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Estimated Cost</div>\n <div class=\"info-value\">{{ record.EstimatedCostUSD ? formatCost(record.EstimatedCostUSD) : 'N/A' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Repeat Count</div>\n <div class=\"info-value\">{{ record.RepeatCount || 1 }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Max Execution Time</div>\n <div class=\"info-value\">{{ formatTimeout(record.MaxExecutionTimeMS) }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Created</div>\n <div class=\"info-value\">{{ record.__mj_CreatedAt | date:'medium' }}</div>\n </div>\n <div class=\"info-item\">\n <div class=\"info-label\">Updated</div>\n <div class=\"info-value\">{{ record.__mj_UpdatedAt | date:'medium' }}</div>\n </div>\n </div>\n </div>\n <!-- JSON Data Views -->\n <div class=\"json-section\">\n <h3><i class=\"fas fa-code\"></i> Test Definition</h3>\n <div class=\"json-tabs\">\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'input'\"\n (click)=\"setJsonView('input')\">\n <i class=\"fas fa-sign-in-alt\"></i>\n Input Definition\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'expected'\"\n (click)=\"setJsonView('expected')\">\n <i class=\"fas fa-check-double\"></i>\n Expected Outcomes\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'config'\"\n (click)=\"setJsonView('config')\">\n <i class=\"fas fa-cog\"></i>\n Configuration\n </button>\n <button class=\"json-tab\"\n [class.active]=\"activeJsonView === 'tags'\"\n (click)=\"setJsonView('tags')\">\n <i class=\"fas fa-tags\"></i>\n Tags\n </button>\n </div>\n <div class=\"code-editor-container\">\n <mj-code-editor\n [value]=\"getJsonData()\"\n language=\"json\"\n [readonly]=\"true\"\n [toolbar]=\"jsonToolbar\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Configuration Tab -->\n @if (activeTab === 'config') {\n <div class=\"config-tab\">\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cogs\"></i> Execution Settings</h3>\n <div class=\"config-grid\">\n <div class=\"config-item\">\n <label>Priority</label>\n <input type=\"number\" [(ngModel)]=\"record.Priority\" class=\"config-input\" placeholder=\"Lower = Higher Priority\" />\n </div>\n <div class=\"config-item\">\n <label>Repeat Count</label>\n <input type=\"number\" [(ngModel)]=\"record.RepeatCount\" class=\"config-input\" min=\"1\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Duration (seconds)</label>\n <input type=\"number\" [(ngModel)]=\"record.EstimatedDurationSeconds\" class=\"config-input\" />\n </div>\n <div class=\"config-item\">\n <label>Estimated Cost (USD)</label>\n <input type=\"number\" step=\"0.000001\" [(ngModel)]=\"record.EstimatedCostUSD\" class=\"config-input\" />\n </div>\n <div class=\"config-item full-width\">\n <label>Max Execution Time (ms)</label>\n <input type=\"number\" [(ngModel)]=\"record.MaxExecutionTimeMS\" class=\"config-input\" placeholder=\"Default: 300000 (5 min)\" />\n <span class=\"config-hint\">Leave empty for default 5 minute timeout</span>\n </div>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-sign-in-alt\"></i> Input Definition (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.InputDefinition || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.InputDefinition = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-check-double\"></i> Expected Outcomes (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.ExpectedOutcomes || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.ExpectedOutcomes = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-cog\"></i> Configuration (JSON)</h3>\n <div class=\"config-editor-container\">\n <mj-code-editor\n [value]=\"record.Configuration || ''\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Configuration = $event\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"config-section\">\n <h3><i class=\"fas fa-tags\"></i> Tags (JSON Array)</h3>\n <div class=\"config-editor-container small\">\n <mj-code-editor\n [value]=\"record.Tags || '[]'\"\n language=\"json\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"record.Tags = $event\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n }\n\n <!-- Test Runs Tab -->\n @if (activeTab === 'runs') {\n <div class=\"runs-tab\">\n <!-- Loading State -->\n @if (loadingRuns) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3,4,5]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Runs List -->\n @if (!loadingRuns && testRuns.length > 0) {\n <div class=\"runs-list\">\n @for (run of testRuns; track run) {\n <div class=\"run-item\" (click)=\"openTestRun(run.ID)\">\n <div class=\"run-icon\" [style.background-color]=\"getRunStatusColor(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-stopwatch]=\"run.Status === 'Timeout'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n </div>\n <div class=\"run-content\">\n <div class=\"run-header\">\n <span class=\"run-id\">Run #{{ run.ID.substring(0, 8) }}</span>\n <span class=\"run-status\" [style.color]=\"getRunStatusColor(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-meta\">\n <span><i class=\"fas fa-calendar\"></i> {{ getRelativeTime(run.StartedAt) }}</span>\n @if (run.DurationSeconds) {\n <span><i class=\"fas fa-clock\"></i> {{ formatDuration(run.DurationSeconds) }}</span>\n }\n @if (run.CostUSD) {\n <span><i class=\"fas fa-dollar-sign\"></i> {{ formatCost(run.CostUSD) }}</span>\n }\n @if (run.TargetLogEntityID && run.TargetLogID) {\n <mj-entity-link-pill\n [entityName]=\"run.TargetLogEntity\"\n [recordId]=\"run.TargetLogID\">\n </mj-entity-link-pill>\n }\n </div>\n <!-- Evaluation indicators -->\n <div class=\"run-eval-stack\">\n <!-- Status indicator -->\n @if (evalPreferences.showExecution) {\n <span class=\"eval-pill status-pill\"\n [ngClass]=\"'status-' + run.Status.toLowerCase()\"\n [title]=\"getStatusTooltip(run.Status)\">\n <i class=\"fas\"\n [class.fa-check]=\"run.Status === 'Passed'\"\n [class.fa-times]=\"run.Status === 'Failed'\"\n [class.fa-exclamation]=\"run.Status === 'Error'\"\n [class.fa-hourglass-end]=\"run.Status === 'Timeout'\"\n [class.fa-forward]=\"run.Status === 'Skipped'\"\n [class.fa-spinner]=\"run.Status === 'Running'\"\n [class.fa-clock]=\"run.Status === 'Pending'\"></i>\n <span>{{ run.Status }}</span>\n </span>\n }\n <!-- Human feedback indicator -->\n @if (evalPreferences.showHuman) {\n @if (!getFeedbackForRun(run.ID)?.Rating) {\n <span class=\"eval-pill human-pill no-feedback\"\n title=\"Human Review: No rating submitted yet\">\n <i class=\"fas fa-user-slash\"></i>\n </span>\n }\n @if (getFeedbackForRun(run.ID)?.Rating; as rating) {\n <span class=\"eval-pill human-pill has-feedback\"\n [class.rating-low]=\"rating <= 4\"\n [class.rating-medium]=\"rating >= 5 && rating <= 6\"\n [class.rating-good]=\"rating >= 7 && rating <= 8\"\n [class.rating-excellent]=\"rating >= 9\"\n [title]=\"getHumanTooltip(rating, getFeedbackForRun(run.ID)?.CorrectionSummary || getFeedbackForRun(run.ID)?.Comments || null)\">\n <i class=\"fas fa-user\"></i>\n <span>{{ rating }}</span>\n </span>\n }\n }\n <!-- Auto score indicator -->\n @if (evalPreferences.showAuto) {\n @if (run.Score == null) {\n <span class=\"eval-pill auto-pill no-score\"\n title=\"Auto Score: No automated score available\">\n <i class=\"fas fa-robot\"></i>\n </span>\n }\n @if (run.Score != null) {\n <span class=\"eval-pill auto-pill has-score\"\n [class.score-low]=\"run.Score < 0.5\"\n [class.score-medium]=\"run.Score >= 0.5 && run.Score < 0.7\"\n [class.score-good]=\"run.Score >= 0.7 && run.Score < 0.85\"\n [class.score-excellent]=\"run.Score >= 0.85\"\n [title]=\"'Auto Score: ' + (run.Score * 100).toFixed(0) + '% automated evaluation'\">\n <i class=\"fas fa-robot\"></i>\n <span>{{ (run.Score * 100).toFixed(0) }}%</span>\n </span>\n }\n }\n </div>\n @if (getRunTags(run).length > 0) {\n <div class=\"run-tags\">\n @for (tag of getRunTags(run).slice(0, 3); track tag) {\n <span class=\"run-tag\">{{ tag }}</span>\n }\n @if (getRunTags(run).length > 3) {\n <span class=\"run-tag-more\">+{{ getRunTags(run).length - 3 }}</span>\n }\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (testRunsLoaded && !loadingRuns && testRuns.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <h4>No Test Runs Yet</h4>\n <p>Run this test to see execution history and results here.</p>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Test Suites Tab -->\n @if (activeTab === 'suites') {\n <div class=\"suites-tab\">\n <!-- Loading State -->\n @if (loadingSuites) {\n <div class=\"loading-state\">\n <div class=\"skeleton-list\">\n @for (i of [1,2,3]; track i) {\n <div class=\"skeleton-card\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line wide\"></div>\n <div class=\"skeleton-line narrow\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Suites List -->\n @if (!loadingSuites && suiteTests.length > 0) {\n <div class=\"suites-list\">\n @for (suiteTest of suiteTests; track suiteTest) {\n <div class=\"suite-item\" (click)=\"openTestSuite(suiteTest.SuiteID)\">\n <div class=\"suite-icon\">\n <i class=\"fas fa-layer-group\"></i>\n </div>\n <div class=\"suite-content\">\n <div class=\"suite-name\">{{ suiteTest.Suite }}</div>\n <div class=\"suite-meta\">\n <span><i class=\"fas fa-sort-numeric-up\"></i> Sequence: {{ suiteTest.Sequence }}</span>\n @if (suiteTest.Status) {\n <span><i class=\"fas fa-info-circle\"></i> {{ suiteTest.Status }}</span>\n }\n </div>\n </div>\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n </div>\n }\n <!-- Empty State -->\n @if (suiteTestsLoaded && !loadingSuites && suiteTests.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-folder-open\"></i>\n </div>\n <h4>Not Part of Any Suite</h4>\n <p>This test is not included in any test suites. Add it to a suite to run it with other tests.</p>\n </div>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"history-tab\">\n <!-- Loading State -->\n @if (loadingHistory) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading history...\"></mj-loading>\n </div>\n }\n <!-- History Content -->\n @if (!loadingHistory && historyLoaded) {\n <div class=\"history-content\">\n <!-- Filters -->\n <div class=\"history-filters\">\n <div class=\"time-range-filters\">\n <span class=\"filter-label\">Time Range:</span>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '7d'\"\n (click)=\"setHistoryTimeRange('7d')\">7 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '30d'\"\n (click)=\"setHistoryTimeRange('30d')\">30 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === '90d'\"\n (click)=\"setHistoryTimeRange('90d')\">90 Days</button>\n <button class=\"filter-btn\"\n [class.active]=\"historyTimeRange === 'all'\"\n (click)=\"setHistoryTimeRange('all')\">All Time</button>\n </div>\n <div class=\"history-actions\">\n <button kendoButton (click)=\"exportHistoryToCSV()\" [disabled]=\"historyData.length === 0\">\n <i class=\"fas fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- KPI Cards -->\n @if (historyData.length > 0) {\n <div class=\"history-kpi-cards\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-play-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ getTotalRuns() }}</div>\n <div class=\"kpi-label\">Total Runs</div>\n </div>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon pass-rate\">\n <i class=\"fas fa-percentage\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">\n {{ getOverallPassRate().toFixed(1) }}%\n <i class=\"fas trend-icon\"\n [class.fa-arrow-up]=\"getPassRateTrend() === 'up'\"\n [class.fa-arrow-down]=\"getPassRateTrend() === 'down'\"\n [class.fa-minus]=\"getPassRateTrend() === 'stable'\"\n [class.trend-up]=\"getPassRateTrend() === 'up'\"\n [class.trend-down]=\"getPassRateTrend() === 'down'\"></i>\n </div>\n <div class=\"kpi-label\">Pass Rate</div>\n </div>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-star\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ (getOverallAvgScore() * 100).toFixed(1) }}%</div>\n <div class=\"kpi-label\">Avg Score</div>\n </div>\n </div>\n }\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatDuration(getOverallAvgDuration()) }}</div>\n <div class=\"kpi-label\">Avg Duration</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon\">\n <i class=\"fas fa-dollar-sign\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ formatCost(getOverallAvgCost()) }}</div>\n <div class=\"kpi-label\">Avg Cost</div>\n </div>\n </div>\n </div>\n }\n <!-- Daily History Table -->\n @if (historyData.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-calendar-alt\"></i> Daily Performance</h3>\n <div class=\"history-table-container\">\n <table class=\"history-table\">\n <thead>\n <tr>\n <th>Date</th>\n <th>Runs</th>\n @if (evalPreferences.showExecution) {\n <th>Passed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Failed</th>\n }\n @if (evalPreferences.showExecution) {\n <th>Pass Rate</th>\n }\n @if (evalPreferences.showAuto) {\n <th>Avg Score</th>\n }\n <th>Avg Duration</th>\n <th>Avg Cost</th>\n </tr>\n </thead>\n <tbody>\n @for (day of historyData; track day) {\n <tr>\n <td class=\"date-cell\">{{ day.date | date:'mediumDate' }}</td>\n <td class=\"runs-cell\">{{ day.runCount }}</td>\n @if (evalPreferences.showExecution) {\n <td class=\"passed-cell\">{{ day.passCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"failed-cell\">{{ day.failCount }}</td>\n }\n @if (evalPreferences.showExecution) {\n <td class=\"pass-rate-cell\">\n <div class=\"pass-rate-bar\">\n <div class=\"pass-rate-fill\" [style.width.%]=\"day.passRate\"></div>\n <span class=\"pass-rate-text\">{{ day.passRate.toFixed(1) }}%</span>\n </div>\n </td>\n }\n @if (evalPreferences.showAuto) {\n <td class=\"score-cell\">{{ (day.avgScore * 100).toFixed(1) }}%</td>\n }\n <td class=\"duration-cell\">{{ formatDuration(day.avgDuration) }}</td>\n <td class=\"cost-cell\">{{ formatCost(day.avgCost) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n <!-- Suite Performance -->\n @if (suitePerformance.length > 0) {\n <div class=\"history-section\">\n <h3><i class=\"fas fa-layer-group\"></i> Performance by Suite</h3>\n <div class=\"suite-performance-list\">\n @for (suite of suitePerformance; track suite) {\n <div class=\"suite-perf-card\" (click)=\"openSuiteFromHistory(suite.suiteId)\">\n <div class=\"suite-perf-header\">\n <div class=\"suite-perf-name\">{{ suite.suiteName }}</div>\n @if (suite.tags.length > 0) {\n <div class=\"suite-perf-tags\">\n @for (tag of suite.tags.slice(0, 3); track tag) {\n <span class=\"tag-mini\">{{ tag }}</span>\n }\n @if (suite.tags.length > 3) {\n <span class=\"tag-more\">+{{ suite.tags.length - 3 }}</span>\n }\n </div>\n }\n </div>\n <div class=\"suite-perf-stats\">\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ suite.totalRuns }}</span>\n <span class=\"stat-label\">Runs</span>\n </div>\n @if (evalPreferences.showExecution) {\n <div class=\"suite-stat\">\n <span class=\"stat-value pass-rate\" [class.high]=\"suite.passRate >= 80\" [class.low]=\"suite.passRate < 50\">\n {{ suite.passRate.toFixed(1) }}%\n </span>\n <span class=\"stat-label\">Pass Rate</span>\n </div>\n }\n @if (evalPreferences.showAuto) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ (suite.avgScore * 100).toFixed(1) }}%</span>\n <span class=\"stat-label\">Avg Score</span>\n </div>\n }\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatDuration(suite.avgDuration) }}</span>\n <span class=\"stat-label\">Avg Duration</span>\n </div>\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ formatCost(suite.avgCost) }}</span>\n <span class=\"stat-label\">Avg Cost</span>\n </div>\n @if (suite.lastRun) {\n <div class=\"suite-stat\">\n <span class=\"stat-value\">{{ getRelativeTime(suite.lastRun) }}</span>\n <span class=\"stat-label\">Last Run</span>\n </div>\n }\n </div>\n <i class=\"fas fa-chevron-right suite-perf-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (historyData.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fas fa-chart-line\"></i>\n </div>\n <h4>No History Available</h4>\n <p>Run this test to start building history and analytics data.</p>\n <button kendoButton (click)=\"runTest()\" themeColor=\"primary\">\n <i class=\"fas fa-play\"></i> Run Test Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Keyboard Shortcuts Toggle Button -->\n <button class=\"shortcuts-toggle\" (click)=\"toggleShortcuts()\" [title]=\"showShortcuts ? 'Hide keyboard shortcuts' : 'Show keyboard shortcuts'\">\n <i class=\"fas fa-keyboard\"></i>\n </button>\n\n <!-- Keyboard Shortcuts Hint (Desktop Only) -->\n @if (showShortcuts) {\n <div class=\"keyboard-shortcuts\">\n <div class=\"shortcuts-header\">\n <i class=\"fas fa-keyboard\"></i>\n Shortcuts\n <button class=\"shortcuts-close\" (click)=\"toggleShortcuts()\" title=\"Hide shortcuts\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcut-list\">\n <div class=\"shortcut-item\">\n <span>Refresh</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>R</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Run Test</span>\n <span class=\"shortcut-keys\"><kbd>Cmd</kbd><kbd>Enter</kbd></span>\n </div>\n <div class=\"shortcut-item\">\n <span>Switch Tabs</span>\n <span class=\"shortcut-keys\"><kbd>1</kbd>-<kbd>5</kbd></span>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
@@ -1223,7 +1223,7 @@ let MJTestRunFormComponentExtended = class MJTestRunFormComponentExtended extend
|
|
|
1223
1223
|
SharedService.Instance.CreateSimpleNotification('Cannot re-run: Test ID not available', 'error', 3000);
|
|
1224
1224
|
return;
|
|
1225
1225
|
}
|
|
1226
|
-
this.testingDialogService.
|
|
1226
|
+
this.testingDialogService.OpenTestPanel(this.record.TestID);
|
|
1227
1227
|
}
|
|
1228
1228
|
async refresh() {
|
|
1229
1229
|
this.isRefreshing = true;
|