@memberjunction/ng-dashboards 5.20.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.
Files changed (99) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +102 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +583 -0
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
  5. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +148 -0
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +773 -0
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
  9. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +241 -0
  10. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
  11. package/dist/AI/components/vectors/vector-management-resource.component.js +1782 -0
  12. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
  13. package/dist/AI/index.d.ts +3 -0
  14. package/dist/AI/index.d.ts.map +1 -1
  15. package/dist/AI/index.js +6 -0
  16. package/dist/AI/index.js.map +1 -1
  17. package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
  18. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  19. package/dist/AI/services/ai-instrumentation.service.js +161 -193
  20. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  21. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
  22. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  23. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
  24. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  25. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
  26. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
  27. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  28. package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
  29. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  30. package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
  31. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  32. package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
  33. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  34. package/dist/Home/home-dashboard.component.d.ts +181 -1
  35. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  36. package/dist/Home/home-dashboard.component.js +1704 -182
  37. package/dist/Home/home-dashboard.component.js.map +1 -1
  38. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +121 -0
  39. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
  40. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1058 -0
  41. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
  42. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
  43. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
  44. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
  45. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
  46. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
  47. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
  48. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
  49. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
  50. package/dist/KnowledgeHub/index.d.ts +4 -0
  51. package/dist/KnowledgeHub/index.d.ts.map +1 -0
  52. package/dist/KnowledgeHub/index.js +5 -0
  53. package/dist/KnowledgeHub/index.js.map +1 -0
  54. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  55. package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
  56. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  57. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  58. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
  59. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  60. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
  61. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  62. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
  63. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  64. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
  65. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  66. package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
  67. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  68. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  69. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  70. package/dist/Testing/components/testing-explorer.component.js +241 -200
  71. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  72. package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
  73. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  74. package/dist/Testing/components/testing-runs-resource.component.js +63 -8
  75. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  76. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  77. package/dist/Testing/components/testing-runs.component.js +7 -5
  78. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  79. package/dist/Testing/testing-dashboard.component.d.ts +9 -1
  80. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  81. package/dist/Testing/testing-dashboard.component.js +128 -59
  82. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  83. package/dist/ai-dashboards.module.d.ts +26 -19
  84. package/dist/ai-dashboards.module.d.ts.map +1 -1
  85. package/dist/ai-dashboards.module.js +40 -5
  86. package/dist/ai-dashboards.module.js.map +1 -1
  87. package/dist/core-dashboards.module.d.ts +1 -0
  88. package/dist/core-dashboards.module.d.ts.map +1 -1
  89. package/dist/core-dashboards.module.js +3 -0
  90. package/dist/core-dashboards.module.js.map +1 -1
  91. package/dist/public-api.d.ts +4 -1
  92. package/dist/public-api.d.ts.map +1 -1
  93. package/dist/public-api.js +5 -1
  94. package/dist/public-api.js.map +1 -1
  95. package/dist/testing-dashboards.module.d.ts +5 -4
  96. package/dist/testing-dashboards.module.d.ts.map +1 -1
  97. package/dist/testing-dashboards.module.js +4 -0
  98. package/dist/testing-dashboards.module.js.map +1 -1
  99. package/package.json +44 -42
@@ -1 +1 @@
1
- {"version":3,"file":"testing-dashboard-tab.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, OnInit, OnDestroy, Input, Output, EventEmitter,\n ChangeDetectorRef, ChangeDetectionStrategy\n} from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { takeUntil, map } from 'rxjs/operators';\nimport { CompositeKey } from '@memberjunction/core';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport {\n TestingInstrumentationService,\n TestingDashboardKPIs,\n TestRunSummary,\n SuiteHierarchyNode\n} from '../services/testing-instrumentation.service';\nimport { KPICardData } from '../../AI/components/widgets/kpi-card.component';\nimport { TestEngineBase } from '@memberjunction/testing-engine-base';\n\n/** Status type union matching TestRunSummary */\ntype TestRunStatus = 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running' | 'Timeout';\n\n/** Alert item for the alerts section */\ninterface TestAlert {\n id: string;\n testName: string;\n reason: 'regression' | 'low-score';\n score: number;\n status: TestRunStatus;\n runDateTime: Date;\n}\n\n@Component({\n standalone: false,\n selector: 'app-testing-dashboard-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Full-page loading state -->\n @if (IsLoading) {\n <div class=\"full-page-loading\">\n <mj-loading text=\"Loading Testing Dashboard...\"></mj-loading>\n </div>\n } @else {\n <div class=\"dashboard-container\">\n\n <!-- Page Header -->\n <div class=\"page-header\">\n <h2 class=\"page-title\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n Testing Dashboard\n </h2>\n <button class=\"refresh-btn\" (click)=\"OnRefresh()\" [disabled]=\"IsLoading\">\n <i class=\"fa-solid fa-refresh\" [class.spinning]=\"IsLoading\"></i>\n Refresh\n </button>\n </div>\n\n <!-- KPI Row -->\n <div class=\"kpi-row\">\n @for (kpi of KpiCards; track kpi.title) {\n <app-kpi-card [data]=\"kpi\"></app-kpi-card>\n }\n </div>\n\n <!-- Live Activity Section -->\n <div class=\"live-activity-card\">\n <div class=\"section-header\">\n @if (RunningTests.length > 0) {\n <span class=\"live-dot\"></span>\n <h3>{{ RunningTests.length }} test{{ RunningTests.length === 1 ? '' : 's' }} running</h3>\n } @else {\n <i class=\"fa-solid fa-circle-pause live-idle-icon\"></i>\n <h3>No tests currently running</h3>\n }\n </div>\n @if (RunningTests.length > 0) {\n <div class=\"running-tests-list\">\n @for (run of RunningTests; track run.id) {\n <div class=\"running-test-item\">\n <div class=\"running-test-name\">{{ run.testName }}</div>\n <div class=\"running-test-meta\">\n <span class=\"running-elapsed\">{{ FormatDuration(run.duration) }}</span>\n <span class=\"running-progress-bar\">\n <span class=\"running-progress-fill\"></span>\n </span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Lower Content: 2-column layout -->\n <div class=\"lower-grid\">\n\n <!-- Left Column: Recent Runs -->\n <div class=\"card recent-runs-card\">\n <div class=\"section-header\">\n <h3><i class=\"fa-solid fa-history\"></i> Recent Runs</h3>\n </div>\n <div class=\"runs-list\">\n @for (run of RecentRuns; track run.id) {\n <div class=\"run-row\" (click)=\"OnOpenRun(run)\">\n <div class=\"run-row-left\">\n <span class=\"run-row-name\">{{ run.testName }}</span>\n <span class=\"run-row-time\">{{ FormatTimestamp(run.runDateTime) }}</span>\n </div>\n <div class=\"run-row-right\">\n <app-test-status-badge [status]=\"run.status\"></app-test-status-badge>\n <app-score-indicator [score]=\"run.score\" [showBar]=\"true\"></app-score-indicator>\n <span class=\"run-row-duration\">{{ FormatDuration(run.duration) }}</span>\n <app-cost-display [cost]=\"run.cost\"></app-cost-display>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">No completed test runs found</div>\n }\n </div>\n </div>\n\n <!-- Right Column: Suite Health + Alerts -->\n <div class=\"right-column\">\n\n <!-- Suite Health -->\n <div class=\"card suite-health-card\">\n <div class=\"section-header\">\n <h3><i class=\"fa-solid fa-heartbeat\"></i> Suite Health</h3>\n </div>\n <div class=\"suite-health-list\">\n @for (suite of SortedSuites; track suite.id) {\n <div class=\"suite-health-row\">\n <div class=\"suite-health-info\">\n <span class=\"suite-health-name\">{{ suite.name }}</span>\n <span class=\"suite-health-count\">{{ suite.testCount }} tests</span>\n </div>\n <div class=\"suite-health-bar-wrapper\">\n <div class=\"suite-health-bar\">\n <div\n class=\"suite-health-bar-fill\"\n [style.width.%]=\"suite.passRate\"\n [style.background]=\"GetPassRateColor(suite.passRate)\">\n </div>\n </div>\n <span class=\"suite-health-pct\" [style.color]=\"GetPassRateColor(suite.passRate)\">\n {{ suite.passRate | number:'1.0-0' }}%\n </span>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">No test suites found</div>\n }\n </div>\n </div>\n\n <!-- Alerts -->\n <div class=\"card alerts-card\">\n <div class=\"section-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> Alerts</h3>\n </div>\n <div class=\"alerts-list\">\n @for (alert of Alerts; track alert.id) {\n <div class=\"alert-row\" (click)=\"OnOpenAlert(alert)\">\n <i class=\"fa-solid\"\n [class.fa-arrow-trend-down]=\"alert.reason === 'regression'\"\n [class.fa-circle-exclamation]=\"alert.reason === 'low-score'\"\n [style.color]=\"alert.reason === 'regression' ? '#ef4444' : '#f59e0b'\">\n </i>\n <div class=\"alert-info\">\n <span class=\"alert-name\">{{ alert.testName }}</span>\n <span class=\"alert-reason\">\n @if (alert.reason === 'regression') {\n Regression detected\n } @else {\n Score below 0.5 ({{ alert.score | number:'1.2-2' }})\n }\n </span>\n </div>\n <app-test-status-badge [status]=\"alert.status\"></app-test-status-badge>\n </div>\n } @empty {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle\" style=\"color: var(--mj-status-success); margin-right: 6px;\"></i>\n No alerts - all tests healthy\n </div>\n }\n </div>\n </div>\n\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n /* ===== Layout ===== */\n .full-page-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: 400px;\n background: var(--mj-bg-surface-card);\n }\n\n .dashboard-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n /* ===== Page Header ===== */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n }\n\n .page-title {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .page-title i { color: var(--mj-brand-primary); }\n\n .refresh-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 18px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .refresh-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n .refresh-btn i.spinning { animation: spin 1s linear infinite; }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* ===== KPI Row ===== */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n /* ===== Card Base ===== */\n .card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .section-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h3 i { color: var(--mj-brand-primary); font-size: 13px; }\n\n /* ===== Live Activity ===== */\n .live-activity-card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n overflow: hidden;\n }\n\n .live-dot {\n width: 10px;\n height: 10px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: inline-block;\n animation: pulse-dot 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 50%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 0%, transparent); }\n }\n\n .live-idle-icon { color: var(--mj-text-disabled); font-size: 14px; }\n\n .running-tests-list {\n padding: 0 20px 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .running-test-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n }\n\n .running-test-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-success);\n }\n\n .running-test-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .running-elapsed {\n font-size: 12px;\n color: var(--mj-status-success);\n font-weight: 500;\n }\n\n .running-progress-bar {\n width: 60px;\n height: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 2px;\n overflow: hidden;\n }\n\n .running-progress-fill {\n display: block;\n width: 100%;\n height: 100%;\n background: var(--mj-status-success);\n animation: progress-slide 1.2s ease-in-out infinite;\n border-radius: 2px;\n }\n\n @keyframes progress-slide {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n }\n\n /* ===== Lower Grid ===== */\n .lower-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n\n .right-column {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* ===== Recent Runs ===== */\n .runs-list {\n max-height: 520px;\n overflow-y: auto;\n }\n\n .run-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .run-row:hover { background: var(--mj-bg-surface-card); }\n\n .run-row-left {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .run-row-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .run-row-time {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .run-row-right {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .run-row-duration {\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 44px;\n text-align: right;\n }\n\n /* ===== Suite Health ===== */\n .suite-health-list {\n padding: 8px 0;\n max-height: 260px;\n overflow-y: auto;\n }\n\n .suite-health-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n }\n\n .suite-health-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .suite-health-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .suite-health-count {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .suite-health-bar-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .suite-health-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n }\n\n .suite-health-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .suite-health-pct {\n font-size: 12px;\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n }\n\n /* ===== Alerts ===== */\n .alerts-list {\n max-height: 220px;\n overflow-y: auto;\n }\n\n .alert-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .alert-row:hover { background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface)); }\n\n .alert-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .alert-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .alert-reason {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n /* ===== Empty State ===== */\n .empty-state {\n padding: 32px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* ===== Responsive ===== */\n @media (max-width: 900px) {\n .lower-grid {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 640px) {\n .dashboard-container { padding: 16px; }\n .kpi-row { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class TestingDashboardTabComponent implements OnInit, OnDestroy {\n\n @Input() initialState: Record<string, unknown> | null = null;\n @Output() stateChange = new EventEmitter<Record<string, unknown>>();\n\n private destroy$ = new Subject<void>();\n\n /** Resolved data for the template */\n IsLoading = false;\n KpiCards: KPICardData[] = [];\n RunningTests: TestRunSummary[] = [];\n RecentRuns: TestRunSummary[] = [];\n SortedSuites: SuiteHierarchyNode[] = [];\n Alerts: TestAlert[] = [];\n\n constructor(\n private instrumentationService: TestingInstrumentationService,\n private cdr: ChangeDetectorRef\n ) {}\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async ngOnInit(): Promise<void> {\n await TestEngineBase.Instance.Config(false);\n this.subscribeToStreams();\n this.instrumentationService.refresh();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ---------------------------------------------------------------------------\n // Public methods (PascalCase)\n // ---------------------------------------------------------------------------\n\n OnRefresh(): void {\n this.instrumentationService.refresh();\n }\n\n OnOpenRun(run: TestRunSummary): void {\n SharedService.Instance.OpenEntityRecord(\n 'MJ: Test Runs',\n CompositeKey.FromID(run.id)\n );\n }\n\n OnOpenAlert(alert: TestAlert): void {\n SharedService.Instance.OpenEntityRecord(\n 'MJ: Test Runs',\n CompositeKey.FromID(alert.id)\n );\n }\n\n FormatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes > 0) return `${minutes}m ${seconds}s`;\n return `${seconds}s`;\n }\n\n FormatTimestamp(date: Date): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n FormatCost(cost: number): string {\n return `$${cost.toFixed(4)}`;\n }\n\n GetPassRateColor(rate: number): string {\n if (rate >= 90) return '#22c55e';\n if (rate >= 70) return '#f59e0b';\n return '#ef4444';\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers (camelCase)\n // ---------------------------------------------------------------------------\n\n private subscribeToStreams(): void {\n this.subscribeLoading();\n this.subscribeKpis();\n this.subscribeTestRuns();\n this.subscribeSuites();\n }\n\n private subscribeLoading(): void {\n this.instrumentationService.isLoading$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(loading => {\n this.IsLoading = loading;\n this.cdr.markForCheck();\n });\n }\n\n private subscribeKpis(): void {\n this.instrumentationService.kpis$.pipe(\n takeUntil(this.destroy$),\n map(kpis => this.buildKpiCards(kpis))\n ).subscribe(cards => {\n this.KpiCards = cards;\n this.cdr.markForCheck();\n });\n }\n\n private subscribeTestRuns(): void {\n this.instrumentationService.testRuns$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(runs => {\n this.RunningTests = runs.filter(r => r.status === 'Running');\n this.RecentRuns = runs\n .filter(r => r.status !== 'Running')\n .slice(0, 15);\n this.Alerts = this.buildAlerts(runs);\n this.cdr.markForCheck();\n });\n }\n\n private subscribeSuites(): void {\n this.instrumentationService.suiteHierarchy$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(suites => {\n this.SortedSuites = this.flattenAndSort(suites);\n this.cdr.markForCheck();\n });\n }\n\n private buildKpiCards(kpis: TestingDashboardKPIs): KPICardData[] {\n const trendDir = kpis.passRateTrend > 0\n ? 'up' as const\n : kpis.passRateTrend < 0\n ? 'down' as const\n : 'stable' as const;\n\n return [\n {\n title: 'Active Tests',\n value: kpis.totalTestsActive,\n icon: 'fa-vial',\n color: 'primary',\n subtitle: `${kpis.totalTestRuns} runs this period`\n },\n {\n title: 'Pass Rate',\n value: `${kpis.passRateThisMonth.toFixed(1)}%`,\n icon: 'fa-check-circle',\n color: kpis.passRateThisMonth >= 90 ? 'success' : kpis.passRateThisMonth >= 75 ? 'warning' : 'danger',\n trend: kpis.passRateTrend !== 0 ? {\n direction: trendDir,\n percentage: Math.abs(Math.round(kpis.passRateTrend * 10) / 10),\n period: 'vs previous period'\n } : undefined\n },\n {\n title: 'Total Cost',\n value: `$${kpis.totalCostThisMonth.toFixed(2)}`,\n icon: 'fa-dollar-sign',\n color: 'warning',\n subtitle: 'This period'\n },\n {\n title: 'Avg Duration',\n value: this.FormatDuration(kpis.averageDuration),\n icon: 'fa-clock',\n color: 'info',\n subtitle: 'Per test run'\n },\n {\n title: 'Pending Review',\n value: kpis.testsPendingReview,\n icon: 'fa-clipboard-check',\n color: kpis.testsPendingReview > 10 ? 'warning' : 'success',\n subtitle: 'Tests need feedback'\n }\n ];\n }\n\n private buildAlerts(runs: TestRunSummary[]): TestAlert[] {\n const alerts: TestAlert[] = [];\n\n // Group runs by test name to detect regressions\n const byTest = new Map<string, TestRunSummary[]>();\n for (const run of runs) {\n const existing = byTest.get(run.testName);\n if (existing) {\n existing.push(run);\n } else {\n byTest.set(run.testName, [run]);\n }\n }\n\n this.detectRegressions(byTest, alerts);\n this.detectLowScores(runs, alerts);\n\n return alerts.slice(0, 20);\n }\n\n /** Find tests that previously passed but now fail */\n private detectRegressions(\n byTest: Map<string, TestRunSummary[]>,\n alerts: TestAlert[]\n ): void {\n const seenIds = new Set<string>();\n\n byTest.forEach((testRuns, testName) => {\n if (testRuns.length < 2) return;\n\n // Sort by date descending\n const sorted = [...testRuns].sort(\n (a, b) => b.runDateTime.getTime() - a.runDateTime.getTime()\n );\n\n const latest = sorted[0];\n const previous = sorted[1];\n\n if (\n (latest.status === 'Failed' || latest.status === 'Error') &&\n previous.status === 'Passed' &&\n !seenIds.has(latest.id)\n ) {\n seenIds.add(latest.id);\n alerts.push({\n id: latest.id,\n testName,\n reason: 'regression',\n score: latest.score,\n status: latest.status,\n runDateTime: latest.runDateTime\n });\n }\n });\n }\n\n /** Flag tests with scores below 0.5 */\n private detectLowScores(runs: TestRunSummary[], alerts: TestAlert[]): void {\n const alertIds = new Set(alerts.map(a => a.id));\n\n for (const run of runs) {\n if (run.score < 0.5 && run.status !== 'Running' && !alertIds.has(run.id)) {\n alerts.push({\n id: run.id,\n testName: run.testName,\n reason: 'low-score',\n score: run.score,\n status: run.status,\n runDateTime: run.runDateTime\n });\n }\n }\n }\n\n /** Flatten suite hierarchy and sort by worst health first */\n private flattenAndSort(nodes: SuiteHierarchyNode[]): SuiteHierarchyNode[] {\n const flat: SuiteHierarchyNode[] = [];\n this.collectNodes(nodes, flat);\n return flat.sort((a, b) => a.passRate - b.passRate);\n }\n\n private collectNodes(nodes: SuiteHierarchyNode[], out: SuiteHierarchyNode[]): void {\n for (const node of nodes) {\n out.push(node);\n if (node.children.length > 0) {\n this.collectNodes(node.children, out);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"testing-dashboard-tab.component.js","sourceRoot":"","sources":["../../../src/Testing/components/testing-dashboard-tab.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, OnInit, OnDestroy, Input, Output, EventEmitter,\n ChangeDetectorRef, ChangeDetectionStrategy\n} from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { takeUntil, map } from 'rxjs/operators';\nimport { CompositeKey } from '@memberjunction/core';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport {\n TestingInstrumentationService,\n TestingDashboardKPIs,\n TestRunSummary,\n SuiteHierarchyNode\n} from '../services/testing-instrumentation.service';\nimport { KPICardData } from '../../AI/components/widgets/kpi-card.component';\nimport { TestEngineBase } from '@memberjunction/testing-engine-base';\nimport { TestingExecutionService, ActiveRun, TestingDialogService } from '@memberjunction/ng-testing';\n\n/** Status type union matching TestRunSummary */\ntype TestRunStatus = 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running' | 'Timeout';\n\n/** Alert item for the alerts section */\ninterface TestAlert {\n id: string;\n testName: string;\n reason: 'regression' | 'low-score';\n score: number;\n status: TestRunStatus;\n runDateTime: Date;\n}\n\n@Component({\n standalone: false,\n selector: 'app-testing-dashboard-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Full-page loading state -->\n @if (IsLoading) {\n <div class=\"full-page-loading\">\n <mj-loading text=\"Loading Testing Dashboard...\"></mj-loading>\n </div>\n } @else {\n <div class=\"dashboard-container\">\n\n <!-- Page Header -->\n <div class=\"page-header\">\n <h2 class=\"page-title\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n Testing Dashboard\n </h2>\n <button class=\"refresh-btn\" (click)=\"OnRefresh()\" [disabled]=\"IsLoading\">\n <i class=\"fa-solid fa-refresh\" [class.spinning]=\"IsLoading\"></i>\n Refresh\n </button>\n </div>\n\n <!-- KPI Row -->\n <div class=\"kpi-row\">\n @for (kpi of KpiCards; track kpi.title) {\n <app-kpi-card [data]=\"kpi\"></app-kpi-card>\n }\n </div>\n\n <!-- Live Activity Section -->\n <div class=\"live-activity-card\">\n <div class=\"section-header\">\n @if (RunningTests.length > 0) {\n <span class=\"live-dot\"></span>\n <h3>{{ RunningTests.length }} test{{ RunningTests.length === 1 ? '' : 's' }} running</h3>\n } @else {\n <i class=\"fa-solid fa-circle-pause live-idle-icon\"></i>\n <h3>No tests currently running</h3>\n }\n </div>\n @if (RunningTests.length > 0) {\n <div class=\"running-tests-list\">\n @for (run of RunningTests; track run.id) {\n <div class=\"running-test-item\" (click)=\"OnViewRunningTest(run)\">\n <div class=\"running-test-info\">\n <div class=\"running-test-name\">{{ run.testName }}</div>\n <div class=\"running-test-step\">{{ GetActiveRunStep(run.testId) }}</div>\n </div>\n <div class=\"running-test-meta\">\n <span class=\"running-elapsed\">{{ FormatDuration(run.duration) }}</span>\n <span class=\"running-progress-bar\">\n <span class=\"running-progress-fill\" [style.width.%]=\"GetActiveRunProgress(run.testId)\"></span>\n </span>\n <span class=\"running-progress-pct\">{{ GetActiveRunProgress(run.testId) }}%</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Lower Content: 2-column layout -->\n <div class=\"lower-grid\">\n\n <!-- Left Column: Recent Runs -->\n <div class=\"card recent-runs-card\">\n <div class=\"section-header\">\n <h3><i class=\"fa-solid fa-history\"></i> Recent Runs</h3>\n </div>\n <div class=\"runs-list\">\n @for (run of RecentRuns; track run.id) {\n <div class=\"run-row\" (click)=\"OnOpenRun(run)\">\n <div class=\"run-row-left\">\n <span class=\"run-row-name\">{{ run.testName }}</span>\n <span class=\"run-row-time\">{{ FormatTimestamp(run.runDateTime) }}</span>\n </div>\n <div class=\"run-row-right\">\n <app-test-status-badge [status]=\"run.status\"></app-test-status-badge>\n <app-score-indicator [score]=\"run.score\" [showBar]=\"true\"></app-score-indicator>\n <span class=\"run-row-duration\">{{ FormatDuration(run.duration) }}</span>\n <app-cost-display [cost]=\"run.cost\"></app-cost-display>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">No completed test runs found</div>\n }\n </div>\n </div>\n\n <!-- Right Column: Suite Health + Alerts -->\n <div class=\"right-column\">\n\n <!-- Suite Health -->\n <div class=\"card suite-health-card\">\n <div class=\"section-header\">\n <h3><i class=\"fa-solid fa-heartbeat\"></i> Suite Health</h3>\n </div>\n <div class=\"suite-health-list\">\n @for (suite of SortedSuites; track suite.id) {\n <div class=\"suite-health-row\">\n <div class=\"suite-health-info\">\n <span class=\"suite-health-name\">{{ suite.name }}</span>\n <span class=\"suite-health-count\">{{ suite.testCount }} tests</span>\n </div>\n <div class=\"suite-health-bar-wrapper\">\n <div class=\"suite-health-bar\">\n <div\n class=\"suite-health-bar-fill\"\n [style.width.%]=\"suite.passRate\"\n [style.background]=\"GetPassRateColor(suite.passRate)\">\n </div>\n </div>\n <span class=\"suite-health-pct\" [style.color]=\"GetPassRateColor(suite.passRate)\">\n {{ suite.passRate | number:'1.0-0' }}%\n </span>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">No test suites found</div>\n }\n </div>\n </div>\n\n <!-- Alerts -->\n <div class=\"card alerts-card\">\n <div class=\"section-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> Alerts</h3>\n </div>\n <div class=\"alerts-list\">\n @for (alert of Alerts; track alert.id) {\n <div class=\"alert-row\" (click)=\"OnOpenAlert(alert)\">\n <i class=\"fa-solid\"\n [class.fa-arrow-trend-down]=\"alert.reason === 'regression'\"\n [class.fa-circle-exclamation]=\"alert.reason === 'low-score'\"\n [style.color]=\"alert.reason === 'regression' ? '#ef4444' : '#f59e0b'\">\n </i>\n <div class=\"alert-info\">\n <span class=\"alert-name\">{{ alert.testName }}</span>\n <span class=\"alert-reason\">\n @if (alert.reason === 'regression') {\n Regression detected\n } @else {\n Score below 0.5 ({{ alert.score | number:'1.2-2' }})\n }\n </span>\n </div>\n <app-test-status-badge [status]=\"alert.status\"></app-test-status-badge>\n </div>\n } @empty {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle\" style=\"color: var(--mj-status-success); margin-right: 6px;\"></i>\n No alerts - all tests healthy\n </div>\n }\n </div>\n </div>\n\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n /* ===== Layout ===== */\n .full-page-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: 400px;\n background: var(--mj-bg-surface-card);\n }\n\n .dashboard-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n }\n\n /* ===== Page Header ===== */\n .page-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n }\n\n .page-title {\n margin: 0;\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .page-title i { color: var(--mj-brand-primary); }\n\n .refresh-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 8px 18px;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s ease;\n }\n\n .refresh-btn:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .refresh-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n .refresh-btn i.spinning { animation: spin 1s linear infinite; }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* ===== KPI Row ===== */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n margin-bottom: 24px;\n }\n\n /* ===== Card Base ===== */\n .card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .section-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-header h3 i { color: var(--mj-brand-primary); font-size: 13px; }\n\n /* ===== Live Activity ===== */\n .live-activity-card {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 24px;\n overflow: hidden;\n }\n\n .live-dot {\n width: 10px;\n height: 10px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: inline-block;\n animation: pulse-dot 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 50%, transparent); }\n 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 0%, transparent); }\n }\n\n .live-idle-icon { color: var(--mj-text-disabled); font-size: 14px; }\n\n .running-tests-list {\n padding: 0 20px 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .running-test-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .running-test-item:hover {\n background: color-mix(in srgb, var(--mj-status-success) 16%, var(--mj-bg-surface));\n }\n\n .running-test-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .running-test-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-success);\n }\n\n .running-test-step {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .running-test-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .running-elapsed {\n font-size: 12px;\n color: var(--mj-status-success);\n font-weight: 500;\n }\n\n .running-progress-bar {\n width: 80px;\n height: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 2px;\n overflow: hidden;\n }\n\n .running-progress-fill {\n display: block;\n height: 100%;\n background: var(--mj-status-success);\n border-radius: 2px;\n transition: width 0.5s ease;\n }\n\n .running-progress-pct {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-status-success);\n min-width: 30px;\n text-align: right;\n }\n\n /* ===== Lower Grid ===== */\n .lower-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n }\n\n .right-column {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* ===== Recent Runs ===== */\n .runs-list {\n max-height: 520px;\n overflow-y: auto;\n }\n\n .run-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .run-row:hover { background: var(--mj-bg-surface-card); }\n\n .run-row-left {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .run-row-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .run-row-time {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .run-row-right {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n }\n\n .run-row-duration {\n font-size: 11px;\n color: var(--mj-text-muted);\n min-width: 44px;\n text-align: right;\n }\n\n /* ===== Suite Health ===== */\n .suite-health-list {\n padding: 8px 0;\n max-height: 260px;\n overflow-y: auto;\n }\n\n .suite-health-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n }\n\n .suite-health-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .suite-health-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .suite-health-count {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n .suite-health-bar-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .suite-health-bar {\n width: 80px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n }\n\n .suite-health-bar-fill {\n height: 100%;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .suite-health-pct {\n font-size: 12px;\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n }\n\n /* ===== Alerts ===== */\n .alerts-list {\n max-height: 220px;\n overflow-y: auto;\n }\n\n .alert-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .alert-row:hover { background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface)); }\n\n .alert-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .alert-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .alert-reason {\n font-size: 11px;\n color: var(--mj-text-disabled);\n }\n\n /* ===== Empty State ===== */\n .empty-state {\n padding: 32px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* ===== Responsive ===== */\n @media (max-width: 900px) {\n .lower-grid {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 640px) {\n .dashboard-container { padding: 16px; }\n .kpi-row { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class TestingDashboardTabComponent implements OnInit, OnDestroy {\n\n @Input() initialState: Record<string, unknown> | null = null;\n @Output() stateChange = new EventEmitter<Record<string, unknown>>();\n\n private destroy$ = new Subject<void>();\n\n /** Resolved data for the template */\n IsLoading = false;\n KpiCards: KPICardData[] = [];\n RunningTests: TestRunSummary[] = [];\n RecentRuns: TestRunSummary[] = [];\n SortedSuites: SuiteHierarchyNode[] = [];\n Alerts: TestAlert[] = [];\n\n private activeRunsMap = new Map<string, ActiveRun>();\n\n constructor(\n private instrumentationService: TestingInstrumentationService,\n private executionService: TestingExecutionService,\n private testingDialogService: TestingDialogService,\n private cdr: ChangeDetectorRef\n ) {}\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async ngOnInit(): Promise<void> {\n await TestEngineBase.Instance.Config(false);\n this.subscribeToStreams();\n this.instrumentationService.refresh();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ---------------------------------------------------------------------------\n // Public methods (PascalCase)\n // ---------------------------------------------------------------------------\n\n OnRefresh(): void {\n this.instrumentationService.refresh();\n }\n\n OnViewRunningTest(run: TestRunSummary): void {\n this.testingDialogService.OpenTestMonitor(run.testId);\n }\n\n GetActiveRunProgress(testId: string): number {\n return this.activeRunsMap.get(testId)?.Progress ?? 0;\n }\n\n GetActiveRunStep(testId: string): string {\n const step = this.activeRunsMap.get(testId)?.CurrentStep ?? '';\n // Hide raw internal step identifiers (e.g. \"driver_log\", \"loading_test\")\n if (step.includes('_')) return '';\n return step;\n }\n\n OnOpenRun(run: TestRunSummary): void {\n SharedService.Instance.OpenEntityRecord(\n 'MJ: Test Runs',\n CompositeKey.FromID(run.id)\n );\n }\n\n OnOpenAlert(alert: TestAlert): void {\n SharedService.Instance.OpenEntityRecord(\n 'MJ: Test Runs',\n CompositeKey.FromID(alert.id)\n );\n }\n\n FormatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes > 0) return `${minutes}m ${seconds}s`;\n return `${seconds}s`;\n }\n\n FormatTimestamp(date: Date): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 7) return `${diffDays}d ago`;\n return d.toLocaleDateString();\n }\n\n FormatCost(cost: number): string {\n return `$${cost.toFixed(4)}`;\n }\n\n GetPassRateColor(rate: number): string {\n if (rate >= 90) return '#22c55e';\n if (rate >= 70) return '#f59e0b';\n return '#ef4444';\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers (camelCase)\n // ---------------------------------------------------------------------------\n\n private subscribeToStreams(): void {\n this.subscribeLoading();\n this.subscribeKpis();\n this.subscribeTestRuns();\n this.subscribeSuites();\n this.subscribeActiveRuns();\n }\n\n private subscribeActiveRuns(): void {\n this.executionService.ActiveRuns$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(runs => {\n this.activeRunsMap.clear();\n for (const run of runs) {\n this.activeRunsMap.set(run.TestId, run);\n }\n this.cdr.markForCheck();\n });\n }\n\n private subscribeLoading(): void {\n this.instrumentationService.isLoading$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(loading => {\n this.IsLoading = loading;\n this.cdr.markForCheck();\n });\n }\n\n private subscribeKpis(): void {\n this.instrumentationService.kpis$.pipe(\n takeUntil(this.destroy$),\n map(kpis => this.buildKpiCards(kpis))\n ).subscribe(cards => {\n this.KpiCards = cards;\n this.cdr.markForCheck();\n });\n }\n\n private subscribeTestRuns(): void {\n this.instrumentationService.testRuns$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(runs => {\n this.RunningTests = runs.filter(r => r.status === 'Running');\n this.RecentRuns = runs\n .filter(r => r.status !== 'Running')\n .slice(0, 15);\n this.Alerts = this.buildAlerts(runs);\n this.cdr.markForCheck();\n });\n }\n\n private subscribeSuites(): void {\n this.instrumentationService.suiteHierarchy$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(suites => {\n this.SortedSuites = this.flattenAndSort(suites);\n this.cdr.markForCheck();\n });\n }\n\n private buildKpiCards(kpis: TestingDashboardKPIs): KPICardData[] {\n const trendDir = kpis.passRateTrend > 0\n ? 'up' as const\n : kpis.passRateTrend < 0\n ? 'down' as const\n : 'stable' as const;\n\n return [\n {\n title: 'Active Tests',\n value: kpis.totalTestsActive,\n icon: 'fa-vial',\n color: 'primary',\n subtitle: `${kpis.totalTestRuns} runs this period`\n },\n {\n title: 'Pass Rate',\n value: `${kpis.passRateThisMonth.toFixed(1)}%`,\n icon: 'fa-check-circle',\n color: kpis.passRateThisMonth >= 90 ? 'success' : kpis.passRateThisMonth >= 75 ? 'warning' : 'danger',\n trend: kpis.passRateTrend !== 0 ? {\n direction: trendDir,\n percentage: Math.abs(Math.round(kpis.passRateTrend * 10) / 10),\n period: 'vs previous period'\n } : undefined\n },\n {\n title: 'Total Cost',\n value: `$${kpis.totalCostThisMonth.toFixed(2)}`,\n icon: 'fa-dollar-sign',\n color: 'warning',\n subtitle: 'This period'\n },\n {\n title: 'Avg Duration',\n value: this.FormatDuration(kpis.averageDuration),\n icon: 'fa-clock',\n color: 'info',\n subtitle: 'Per test run'\n },\n {\n title: 'Pending Review',\n value: kpis.testsPendingReview,\n icon: 'fa-clipboard-check',\n color: kpis.testsPendingReview > 10 ? 'warning' : 'success',\n subtitle: 'Tests need feedback'\n }\n ];\n }\n\n private buildAlerts(runs: TestRunSummary[]): TestAlert[] {\n const alerts: TestAlert[] = [];\n\n // Group runs by test name to detect regressions\n const byTest = new Map<string, TestRunSummary[]>();\n for (const run of runs) {\n const existing = byTest.get(run.testName);\n if (existing) {\n existing.push(run);\n } else {\n byTest.set(run.testName, [run]);\n }\n }\n\n this.detectRegressions(byTest, alerts);\n this.detectLowScores(runs, alerts);\n\n return alerts.slice(0, 20);\n }\n\n /** Find tests that previously passed but now fail */\n private detectRegressions(\n byTest: Map<string, TestRunSummary[]>,\n alerts: TestAlert[]\n ): void {\n const seenIds = new Set<string>();\n\n byTest.forEach((testRuns, testName) => {\n if (testRuns.length < 2) return;\n\n // Sort by date descending\n const sorted = [...testRuns].sort(\n (a, b) => b.runDateTime.getTime() - a.runDateTime.getTime()\n );\n\n const latest = sorted[0];\n const previous = sorted[1];\n\n if (\n (latest.status === 'Failed' || latest.status === 'Error') &&\n previous.status === 'Passed' &&\n !seenIds.has(latest.id)\n ) {\n seenIds.add(latest.id);\n alerts.push({\n id: latest.id,\n testName,\n reason: 'regression',\n score: latest.score,\n status: latest.status,\n runDateTime: latest.runDateTime\n });\n }\n });\n }\n\n /** Flag tests with scores below 0.5 */\n private detectLowScores(runs: TestRunSummary[], alerts: TestAlert[]): void {\n const alertIds = new Set(alerts.map(a => a.id));\n\n for (const run of runs) {\n if (run.score < 0.5 && run.status !== 'Running' && !alertIds.has(run.id)) {\n alerts.push({\n id: run.id,\n testName: run.testName,\n reason: 'low-score',\n score: run.score,\n status: run.status,\n runDateTime: run.runDateTime\n });\n }\n }\n }\n\n /** Flatten suite hierarchy and sort by worst health first */\n private flattenAndSort(nodes: SuiteHierarchyNode[]): SuiteHierarchyNode[] {\n const flat: SuiteHierarchyNode[] = [];\n this.collectNodes(nodes, flat);\n return flat.sort((a, b) => a.passRate - b.passRate);\n }\n\n private collectNodes(nodes: SuiteHierarchyNode[], out: SuiteHierarchyNode[]): void {\n for (const node of nodes) {\n out.push(node);\n if (node.children.length > 0) {\n this.collectNodes(node.children, out);\n }\n }\n }\n}\n"]}
@@ -59,7 +59,7 @@ type SortDirection = 'asc' | 'desc';
59
59
  export declare class TestingExplorerComponent implements OnInit, OnDestroy {
60
60
  private cdr;
61
61
  private viewContainerRef;
62
- private testingDialogService;
62
+ testingDialogService: TestingDialogService;
63
63
  instrumentationService: TestingInstrumentationService;
64
64
  private destroy$;
65
65
  private allTests;
@@ -132,6 +132,7 @@ export declare class TestingExplorerComponent implements OnInit, OnDestroy {
132
132
  ToggleSortDirection(): void;
133
133
  RunTest(testId: string): void;
134
134
  RunSuite(suiteId: string): void;
135
+ OnPanelClosed(): void;
135
136
  EditItem(entityName: string, id: string): void;
136
137
  ViewTestHistory(testId: string): void;
137
138
  ViewSuiteResults(suiteId: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"testing-explorer.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-explorer.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testing-explorer.component.d.ts","sourceRoot":"","sources":["../../../src/Testing/components/testing-explorer.component.ts"],"names":[],"mappings":"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"}