@sudobility/testomniac_ui 0.0.1

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 (266) hide show
  1. package/README.md +83 -0
  2. package/dist/components/bundles/AddToBundleButton.d.ts +8 -0
  3. package/dist/components/bundles/AddToBundleButton.d.ts.map +1 -0
  4. package/dist/components/bundles/AddToBundleButton.js +64 -0
  5. package/dist/components/bundles/AddToBundleButton.js.map +1 -0
  6. package/dist/components/cells/BundleCell.d.ts +10 -0
  7. package/dist/components/cells/BundleCell.d.ts.map +1 -0
  8. package/dist/components/cells/BundleCell.js +8 -0
  9. package/dist/components/cells/BundleCell.js.map +1 -0
  10. package/dist/components/cells/InteractionCell.d.ts +17 -0
  11. package/dist/components/cells/InteractionCell.d.ts.map +1 -0
  12. package/dist/components/cells/InteractionCell.js +13 -0
  13. package/dist/components/cells/InteractionCell.js.map +1 -0
  14. package/dist/components/cells/ListCell.d.ts +29 -0
  15. package/dist/components/cells/ListCell.d.ts.map +1 -0
  16. package/dist/components/cells/ListCell.js +19 -0
  17. package/dist/components/cells/ListCell.js.map +1 -0
  18. package/dist/components/cells/PersonaCell.d.ts +10 -0
  19. package/dist/components/cells/PersonaCell.d.ts.map +1 -0
  20. package/dist/components/cells/PersonaCell.js +7 -0
  21. package/dist/components/cells/PersonaCell.js.map +1 -0
  22. package/dist/components/cells/ScaffoldCell.d.ts +12 -0
  23. package/dist/components/cells/ScaffoldCell.d.ts.map +1 -0
  24. package/dist/components/cells/ScaffoldCell.js +10 -0
  25. package/dist/components/cells/ScaffoldCell.js.map +1 -0
  26. package/dist/components/cells/ScenarioCell.d.ts +12 -0
  27. package/dist/components/cells/ScenarioCell.d.ts.map +1 -0
  28. package/dist/components/cells/ScenarioCell.js +8 -0
  29. package/dist/components/cells/ScenarioCell.js.map +1 -0
  30. package/dist/components/cells/SurfaceCell.d.ts +14 -0
  31. package/dist/components/cells/SurfaceCell.d.ts.map +1 -0
  32. package/dist/components/cells/SurfaceCell.js +23 -0
  33. package/dist/components/cells/SurfaceCell.js.map +1 -0
  34. package/dist/components/cells/index.d.ts +9 -0
  35. package/dist/components/cells/index.d.ts.map +1 -0
  36. package/dist/components/cells/index.js +9 -0
  37. package/dist/components/cells/index.js.map +1 -0
  38. package/dist/components/cells/scaffoldMeta.d.ts +6 -0
  39. package/dist/components/cells/scaffoldMeta.d.ts.map +1 -0
  40. package/dist/components/cells/scaffoldMeta.js +47 -0
  41. package/dist/components/cells/scaffoldMeta.js.map +1 -0
  42. package/dist/components/dashboard/DashboardSidebar.d.ts +6 -0
  43. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
  44. package/dist/components/dashboard/DashboardSidebar.js +163 -0
  45. package/dist/components/dashboard/DashboardSidebar.js.map +1 -0
  46. package/dist/components/data/DataTable.d.ts +16 -0
  47. package/dist/components/data/DataTable.d.ts.map +1 -0
  48. package/dist/components/data/DataTable.js +54 -0
  49. package/dist/components/data/DataTable.js.map +1 -0
  50. package/dist/components/data/JsonViewer.d.ts +6 -0
  51. package/dist/components/data/JsonViewer.d.ts.map +1 -0
  52. package/dist/components/data/JsonViewer.js +5 -0
  53. package/dist/components/data/JsonViewer.js.map +1 -0
  54. package/dist/components/data/index.d.ts +3 -0
  55. package/dist/components/data/index.d.ts.map +1 -0
  56. package/dist/components/data/index.js +3 -0
  57. package/dist/components/data/index.js.map +1 -0
  58. package/dist/components/forms/SelectField.d.ts +22 -0
  59. package/dist/components/forms/SelectField.d.ts.map +1 -0
  60. package/dist/components/forms/SelectField.js +14 -0
  61. package/dist/components/forms/SelectField.js.map +1 -0
  62. package/dist/components/navigation/BackLink.d.ts +7 -0
  63. package/dist/components/navigation/BackLink.d.ts.map +1 -0
  64. package/dist/components/navigation/BackLink.js +6 -0
  65. package/dist/components/navigation/BackLink.js.map +1 -0
  66. package/dist/components/pages/PagesListView.d.ts +12 -0
  67. package/dist/components/pages/PagesListView.d.ts.map +1 -0
  68. package/dist/components/pages/PagesListView.js +19 -0
  69. package/dist/components/pages/PagesListView.js.map +1 -0
  70. package/dist/components/pages/PagesMapView.d.ts +15 -0
  71. package/dist/components/pages/PagesMapView.d.ts.map +1 -0
  72. package/dist/components/pages/PagesMapView.js +232 -0
  73. package/dist/components/pages/PagesMapView.js.map +1 -0
  74. package/dist/components/scanner/EventLog.d.ts +8 -0
  75. package/dist/components/scanner/EventLog.d.ts.map +1 -0
  76. package/dist/components/scanner/EventLog.js +18 -0
  77. package/dist/components/scanner/EventLog.js.map +1 -0
  78. package/dist/components/scanner/LiveCounters.d.ts +9 -0
  79. package/dist/components/scanner/LiveCounters.d.ts.map +1 -0
  80. package/dist/components/scanner/LiveCounters.js +33 -0
  81. package/dist/components/scanner/LiveCounters.js.map +1 -0
  82. package/dist/components/scanner/PhaseIndicator.d.ts +6 -0
  83. package/dist/components/scanner/PhaseIndicator.d.ts.map +1 -0
  84. package/dist/components/scanner/PhaseIndicator.js +31 -0
  85. package/dist/components/scanner/PhaseIndicator.js.map +1 -0
  86. package/dist/components/scanner/RunSummaryCard.d.ts +12 -0
  87. package/dist/components/scanner/RunSummaryCard.d.ts.map +1 -0
  88. package/dist/components/scanner/RunSummaryCard.js +7 -0
  89. package/dist/components/scanner/RunSummaryCard.js.map +1 -0
  90. package/dist/components/scanner/ScanForm.d.ts +9 -0
  91. package/dist/components/scanner/ScanForm.d.ts.map +1 -0
  92. package/dist/components/scanner/ScanForm.js +31 -0
  93. package/dist/components/scanner/ScanForm.js.map +1 -0
  94. package/dist/components/scanner/ScanProgressPanel.d.ts +16 -0
  95. package/dist/components/scanner/ScanProgressPanel.d.ts.map +1 -0
  96. package/dist/components/scanner/ScanProgressPanel.js +8 -0
  97. package/dist/components/scanner/ScanProgressPanel.js.map +1 -0
  98. package/dist/components/scanner/StatusBadge.d.ts +7 -0
  99. package/dist/components/scanner/StatusBadge.d.ts.map +1 -0
  100. package/dist/components/scanner/StatusBadge.js +65 -0
  101. package/dist/components/scanner/StatusBadge.js.map +1 -0
  102. package/dist/components/scanner/index.d.ts +8 -0
  103. package/dist/components/scanner/index.d.ts.map +1 -0
  104. package/dist/components/scanner/index.js +8 -0
  105. package/dist/components/scanner/index.js.map +1 -0
  106. package/dist/components/scenarios/AddScenarioForm.d.ts +14 -0
  107. package/dist/components/scenarios/AddScenarioForm.d.ts.map +1 -0
  108. package/dist/components/scenarios/AddScenarioForm.js +43 -0
  109. package/dist/components/scenarios/AddScenarioForm.js.map +1 -0
  110. package/dist/components/scripts/ScriptPanel.d.ts +17 -0
  111. package/dist/components/scripts/ScriptPanel.d.ts.map +1 -0
  112. package/dist/components/scripts/ScriptPanel.js +32 -0
  113. package/dist/components/scripts/ScriptPanel.js.map +1 -0
  114. package/dist/components/states/index.d.ts +19 -0
  115. package/dist/components/states/index.d.ts.map +1 -0
  116. package/dist/components/states/index.js +16 -0
  117. package/dist/components/states/index.js.map +1 -0
  118. package/dist/config/priorityConfig.d.ts +12 -0
  119. package/dist/config/priorityConfig.d.ts.map +1 -0
  120. package/dist/config/priorityConfig.js +39 -0
  121. package/dist/config/priorityConfig.js.map +1 -0
  122. package/dist/context/config.d.ts +53 -0
  123. package/dist/context/config.d.ts.map +1 -0
  124. package/dist/context/config.js +32 -0
  125. package/dist/context/config.js.map +1 -0
  126. package/dist/context/routing.d.ts +42 -0
  127. package/dist/context/routing.d.ts.map +1 -0
  128. package/dist/context/routing.js +33 -0
  129. package/dist/context/routing.js.map +1 -0
  130. package/dist/hooks/useDashboardEnvironmentContext.d.ts +15 -0
  131. package/dist/hooks/useDashboardEnvironmentContext.d.ts.map +1 -0
  132. package/dist/hooks/useDashboardEnvironmentContext.js +89 -0
  133. package/dist/hooks/useDashboardEnvironmentContext.js.map +1 -0
  134. package/dist/hooks/useEnvBasePath.d.ts +8 -0
  135. package/dist/hooks/useEnvBasePath.d.ts.map +1 -0
  136. package/dist/hooks/useEnvBasePath.js +12 -0
  137. package/dist/hooks/useEnvBasePath.js.map +1 -0
  138. package/dist/hooks/useLocalizedNavigate.d.ts +12 -0
  139. package/dist/hooks/useLocalizedNavigate.d.ts.map +1 -0
  140. package/dist/hooks/useLocalizedNavigate.js +14 -0
  141. package/dist/hooks/useLocalizedNavigate.js.map +1 -0
  142. package/dist/index.d.ts +49 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +66 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/pages/BundleDetailPage.d.ts +2 -0
  147. package/dist/pages/BundleDetailPage.d.ts.map +1 -0
  148. package/dist/pages/BundleDetailPage.js +155 -0
  149. package/dist/pages/BundleDetailPage.js.map +1 -0
  150. package/dist/pages/BundlesPage.d.ts +2 -0
  151. package/dist/pages/BundlesPage.d.ts.map +1 -0
  152. package/dist/pages/BundlesPage.js +61 -0
  153. package/dist/pages/BundlesPage.js.map +1 -0
  154. package/dist/pages/DashboardOverview.d.ts +2 -0
  155. package/dist/pages/DashboardOverview.d.ts.map +1 -0
  156. package/dist/pages/DashboardOverview.js +179 -0
  157. package/dist/pages/DashboardOverview.js.map +1 -0
  158. package/dist/pages/FindingsListPage.d.ts +2 -0
  159. package/dist/pages/FindingsListPage.d.ts.map +1 -0
  160. package/dist/pages/FindingsListPage.js +160 -0
  161. package/dist/pages/FindingsListPage.js.map +1 -0
  162. package/dist/pages/PageDetailPage.d.ts +2 -0
  163. package/dist/pages/PageDetailPage.d.ts.map +1 -0
  164. package/dist/pages/PageDetailPage.js +120 -0
  165. package/dist/pages/PageDetailPage.js.map +1 -0
  166. package/dist/pages/PageGraphPage.d.ts +3 -0
  167. package/dist/pages/PageGraphPage.d.ts.map +1 -0
  168. package/dist/pages/PageGraphPage.js +72 -0
  169. package/dist/pages/PageGraphPage.js.map +1 -0
  170. package/dist/pages/PageStateDetailPage.d.ts +2 -0
  171. package/dist/pages/PageStateDetailPage.d.ts.map +1 -0
  172. package/dist/pages/PageStateDetailPage.js +69 -0
  173. package/dist/pages/PageStateDetailPage.js.map +1 -0
  174. package/dist/pages/PagesPage.d.ts +2 -0
  175. package/dist/pages/PagesPage.d.ts.map +1 -0
  176. package/dist/pages/PagesPage.js +83 -0
  177. package/dist/pages/PagesPage.js.map +1 -0
  178. package/dist/pages/PatternsPage.d.ts +2 -0
  179. package/dist/pages/PatternsPage.d.ts.map +1 -0
  180. package/dist/pages/PatternsPage.js +102 -0
  181. package/dist/pages/PatternsPage.js.map +1 -0
  182. package/dist/pages/PersonasPage.d.ts +2 -0
  183. package/dist/pages/PersonasPage.d.ts.map +1 -0
  184. package/dist/pages/PersonasPage.js +151 -0
  185. package/dist/pages/PersonasPage.js.map +1 -0
  186. package/dist/pages/RunRedirect.d.ts +2 -0
  187. package/dist/pages/RunRedirect.d.ts.map +1 -0
  188. package/dist/pages/RunRedirect.js +25 -0
  189. package/dist/pages/RunRedirect.js.map +1 -0
  190. package/dist/pages/RunSurfaceRunDetailPage.d.ts +2 -0
  191. package/dist/pages/RunSurfaceRunDetailPage.d.ts.map +1 -0
  192. package/dist/pages/RunSurfaceRunDetailPage.js +38 -0
  193. package/dist/pages/RunSurfaceRunDetailPage.js.map +1 -0
  194. package/dist/pages/RunSurfaceRunsPage.d.ts +2 -0
  195. package/dist/pages/RunSurfaceRunsPage.d.ts.map +1 -0
  196. package/dist/pages/RunSurfaceRunsPage.js +35 -0
  197. package/dist/pages/RunSurfaceRunsPage.js.map +1 -0
  198. package/dist/pages/RunTestInteractionRunDetailPage.d.ts +2 -0
  199. package/dist/pages/RunTestInteractionRunDetailPage.d.ts.map +1 -0
  200. package/dist/pages/RunTestInteractionRunDetailPage.js +55 -0
  201. package/dist/pages/RunTestInteractionRunDetailPage.js.map +1 -0
  202. package/dist/pages/RunTestInteractionRunsPage.d.ts +2 -0
  203. package/dist/pages/RunTestInteractionRunsPage.d.ts.map +1 -0
  204. package/dist/pages/RunTestInteractionRunsPage.js +38 -0
  205. package/dist/pages/RunTestInteractionRunsPage.js.map +1 -0
  206. package/dist/pages/RunnerGraphPage.d.ts +3 -0
  207. package/dist/pages/RunnerGraphPage.d.ts.map +1 -0
  208. package/dist/pages/RunnerGraphPage.js +86 -0
  209. package/dist/pages/RunnerGraphPage.js.map +1 -0
  210. package/dist/pages/ScaffoldDetailPage.d.ts +2 -0
  211. package/dist/pages/ScaffoldDetailPage.d.ts.map +1 -0
  212. package/dist/pages/ScaffoldDetailPage.js +56 -0
  213. package/dist/pages/ScaffoldDetailPage.js.map +1 -0
  214. package/dist/pages/ScaffoldsPage.d.ts +2 -0
  215. package/dist/pages/ScaffoldsPage.d.ts.map +1 -0
  216. package/dist/pages/ScaffoldsPage.js +35 -0
  217. package/dist/pages/ScaffoldsPage.js.map +1 -0
  218. package/dist/pages/ScanProgressPage.d.ts +2 -0
  219. package/dist/pages/ScanProgressPage.d.ts.map +1 -0
  220. package/dist/pages/ScanProgressPage.js +30 -0
  221. package/dist/pages/ScanProgressPage.js.map +1 -0
  222. package/dist/pages/SchedulesPage.d.ts +2 -0
  223. package/dist/pages/SchedulesPage.d.ts.map +1 -0
  224. package/dist/pages/SchedulesPage.js +165 -0
  225. package/dist/pages/SchedulesPage.js.map +1 -0
  226. package/dist/pages/StartScanPage.d.ts +2 -0
  227. package/dist/pages/StartScanPage.d.ts.map +1 -0
  228. package/dist/pages/StartScanPage.js +97 -0
  229. package/dist/pages/StartScanPage.js.map +1 -0
  230. package/dist/pages/TestInteractionDetailPage.d.ts +2 -0
  231. package/dist/pages/TestInteractionDetailPage.d.ts.map +1 -0
  232. package/dist/pages/TestInteractionDetailPage.js +60 -0
  233. package/dist/pages/TestInteractionDetailPage.js.map +1 -0
  234. package/dist/pages/TestInteractionsPage.d.ts +2 -0
  235. package/dist/pages/TestInteractionsPage.d.ts.map +1 -0
  236. package/dist/pages/TestInteractionsPage.js +96 -0
  237. package/dist/pages/TestInteractionsPage.js.map +1 -0
  238. package/dist/pages/TestRunDetailPage.d.ts +2 -0
  239. package/dist/pages/TestRunDetailPage.d.ts.map +1 -0
  240. package/dist/pages/TestRunDetailPage.js +81 -0
  241. package/dist/pages/TestRunDetailPage.js.map +1 -0
  242. package/dist/pages/TestRunsListPage.d.ts +2 -0
  243. package/dist/pages/TestRunsListPage.d.ts.map +1 -0
  244. package/dist/pages/TestRunsListPage.js +18 -0
  245. package/dist/pages/TestRunsListPage.js.map +1 -0
  246. package/dist/pages/TestScenarioDetailPage.d.ts +2 -0
  247. package/dist/pages/TestScenarioDetailPage.d.ts.map +1 -0
  248. package/dist/pages/TestScenarioDetailPage.js +101 -0
  249. package/dist/pages/TestScenarioDetailPage.js.map +1 -0
  250. package/dist/pages/TestScenariosPage.d.ts +2 -0
  251. package/dist/pages/TestScenariosPage.d.ts.map +1 -0
  252. package/dist/pages/TestScenariosPage.js +73 -0
  253. package/dist/pages/TestScenariosPage.js.map +1 -0
  254. package/dist/pages/TestSurfaceDetailPage.d.ts +2 -0
  255. package/dist/pages/TestSurfaceDetailPage.d.ts.map +1 -0
  256. package/dist/pages/TestSurfaceDetailPage.js +33 -0
  257. package/dist/pages/TestSurfaceDetailPage.js.map +1 -0
  258. package/dist/pages/TestSurfacesListPage.d.ts +2 -0
  259. package/dist/pages/TestSurfacesListPage.d.ts.map +1 -0
  260. package/dist/pages/TestSurfacesListPage.js +73 -0
  261. package/dist/pages/TestSurfacesListPage.js.map +1 -0
  262. package/dist/utils/formatDateTime.d.ts +13 -0
  263. package/dist/utils/formatDateTime.d.ts.map +1 -0
  264. package/dist/utils/formatDateTime.js +27 -0
  265. package/dist/utils/formatDateTime.js.map +1 -0
  266. package/package.json +72 -0
@@ -0,0 +1,179 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { useEntityProducts, useProductEnvironments, useProductRuns, } from '@sudobility/testomniac_client';
4
+ import { formatDuration } from '@sudobility/testomniac_lib';
5
+ import { Alert, Card } from '@sudobility/components';
6
+ import { SEOHead, useTestomniacApi } from '../context/config';
7
+ import { useRouteParams } from '../context/routing';
8
+ import { StatusBadge } from '../components/scanner/StatusBadge';
9
+ import { useLocalizedNavigate } from '../hooks/useLocalizedNavigate';
10
+ import { formatDateTime } from '../utils/formatDateTime';
11
+ import { EmptyState } from '../components/states';
12
+ // ---------------------------------------------------------------------------
13
+ // Sub-components
14
+ // ---------------------------------------------------------------------------
15
+ /** Card linking to one of an app's data sections. */
16
+ function SectionLink({ label, count, onClick, }) {
17
+ return (_jsxs("button", { onClick: onClick, className: "text-left flex items-center justify-between px-3 py-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors group", children: [_jsx("span", { className: "text-sm text-gray-700 dark:text-gray-300 group-hover:text-blue-600 dark:group-hover:text-blue-400", children: label }), count && _jsx("span", { className: "text-xs text-gray-400 dark:text-gray-500 font-mono", children: count })] }));
18
+ }
19
+ /** A single environment card with links to its dashboard sections. */
20
+ function EnvironmentCard({ environment, basePath, }) {
21
+ const { navigate } = useLocalizedNavigate();
22
+ const envBasePath = `${basePath}/environments/${environment.id}`;
23
+ const sections = [
24
+ {
25
+ label: 'Test Surfaces',
26
+ description: 'Test surface hierarchy',
27
+ path: `${envBasePath}/test-surfaces`,
28
+ },
29
+ { label: 'Test Runs', description: 'Execution results', path: `${envBasePath}/test-runs` },
30
+ { label: 'Findings', description: 'Errors and warnings', path: `${envBasePath}/findings` },
31
+ { label: 'Settings', description: 'Environment settings', path: `${envBasePath}/settings` },
32
+ ];
33
+ const kindColor = environment.kind === 'shared'
34
+ ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400'
35
+ : 'bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-400';
36
+ return (_jsxs(Card, { variant: "bordered", padding: "none", className: "overflow-hidden hover:border-gray-300 dark:hover:border-gray-600 transition-colors", children: [_jsxs("div", { className: "px-5 py-4 border-b border-gray-100 dark:border-gray-700/50", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h3", { className: "text-base font-semibold text-gray-900 dark:text-gray-100 truncate", children: environment.title }), _jsx("span", { className: `text-[10px] font-medium px-1.5 py-0.5 rounded-full ${kindColor}`, children: environment.kind })] }), environment.baseUrl && (_jsx("p", { className: "text-xs text-gray-400 dark:text-gray-500 mt-1 truncate font-mono", children: environment.baseUrl }))] }), _jsx("div", { className: "p-2 grid grid-cols-2 gap-0.5", children: sections.map(section => (_jsx(SectionLink, { label: section.label, onClick: () => navigate(section.path) }, section.label))) })] }));
37
+ }
38
+ /** Lists environments for a single product, with lazy loading. */
39
+ function ProductSection({ product, basePath, }) {
40
+ const { networkClient, token, baseUrl } = useTestomniacApi();
41
+ const { environments, isLoading, error } = useProductEnvironments({
42
+ networkClient,
43
+ baseUrl,
44
+ productId: product.id,
45
+ token: token ?? '',
46
+ enabled: !!token,
47
+ });
48
+ return (_jsxs("section", { children: [_jsx("h2", { className: "text-lg font-semibold text-gray-900 dark:text-gray-100 mb-3", children: product.title }), isLoading && (_jsx("div", { className: "text-sm text-gray-500 dark:text-gray-400 py-4", children: "Loading environments..." })), error && (_jsxs("div", { className: "text-sm text-red-600 dark:text-red-400 py-2", children: ["Failed to load environments: ", error] })), !isLoading && !error && environments.length === 0 && (_jsx(EmptyState, { description: "No environments in this product yet." })), _jsx("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-4", children: environments.map((env) => (_jsx(EnvironmentCard, { environment: env, basePath: basePath }, env.id))) })] }));
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Stats tile
52
+ // ---------------------------------------------------------------------------
53
+ function StatTile({ label, value, icon, accent = 'gray', }) {
54
+ const accentMap = {
55
+ blue: 'bg-blue-50 text-blue-600 dark:bg-blue-900/20 dark:text-blue-400',
56
+ emerald: 'bg-emerald-50 text-emerald-600 dark:bg-emerald-900/20 dark:text-emerald-400',
57
+ amber: 'bg-amber-50 text-amber-600 dark:bg-amber-900/20 dark:text-amber-400',
58
+ gray: 'bg-gray-50 text-gray-600 dark:bg-gray-800 dark:text-gray-400',
59
+ red: 'bg-red-50 text-red-600 dark:bg-red-900/20 dark:text-red-400',
60
+ };
61
+ return (_jsxs(Card, { variant: "bordered", padding: "md", className: "flex items-center gap-4", children: [_jsx("div", { className: `w-10 h-10 rounded-lg flex items-center justify-center shrink-0 ${accentMap[accent]}`, children: icon }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100 tabular-nums", children: value }), _jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400 truncate", children: label })] })] }));
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Recent runs section
65
+ // ---------------------------------------------------------------------------
66
+ function RecentRunRow({ run, basePath }) {
67
+ const { navigate } = useLocalizedNavigate();
68
+ const url = run.scanUrl
69
+ ? run.scanUrl.replace(/^https?:\/\//, '').replace(/\/$/, '')
70
+ : 'Unknown URL';
71
+ const truncatedUrl = url.length > 50 ? `${url.slice(0, 47)}...` : url;
72
+ return (_jsxs("button", { onClick: () => navigate(`${basePath}/runs/${run.id}`), className: "w-full text-left flex items-center gap-4 px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-700/30 transition-colors group", children: [_jsx("div", { className: "shrink-0", children: _jsx(StatusBadge, { status: run.status, size: "sm" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-sm text-gray-900 dark:text-gray-100 truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 font-mono", children: truncatedUrl }), _jsxs("div", { className: "flex items-center gap-3 mt-0.5 text-xs text-gray-400 dark:text-gray-500", children: [_jsx("span", { children: run.sizeClass }), run.pagesFound != null && _jsxs("span", { children: [run.pagesFound, " pages"] }), run.testRunsCompleted != null && _jsxs("span", { children: [run.testRunsCompleted, " tests"] })] })] }), _jsxs("div", { className: "shrink-0 text-right", children: [run.totalDurationMs != null && (_jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400 font-mono", children: formatDuration(run.totalDurationMs) })), run.createdAt && (_jsx("div", { className: "text-[11px] text-gray-400 dark:text-gray-500 mt-0.5", children: formatDateTime(run.createdAt) }))] })] }));
73
+ }
74
+ function RecentRunsSection({ runs, basePath, isLoading, }) {
75
+ const recentRuns = useMemo(() => [...runs]
76
+ .sort((a, b) => {
77
+ const dateA = a.createdAt ? new Date(a.createdAt).getTime() : 0;
78
+ const dateB = b.createdAt ? new Date(b.createdAt).getTime() : 0;
79
+ return dateB - dateA;
80
+ })
81
+ .slice(0, 5), [runs]);
82
+ if (isLoading) {
83
+ return (_jsxs(Card, { variant: "bordered", padding: "none", className: "overflow-hidden", children: [_jsx("div", { className: "px-5 py-4 border-b border-gray-100 dark:border-gray-700/50", children: _jsx("h2", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100", children: "Recent Runs" }) }), _jsx("div", { className: "p-4 space-y-3", children: [1, 2, 3].map(i => (_jsxs("div", { className: "animate-pulse flex items-center gap-4", children: [_jsx("div", { className: "h-5 w-16 bg-gray-200 dark:bg-gray-700 rounded-full" }), _jsx("div", { className: "flex-1 h-4 bg-gray-100 dark:bg-gray-700/50 rounded" }), _jsx("div", { className: "h-3 w-12 bg-gray-100 dark:bg-gray-700/50 rounded" })] }, i))) })] }));
84
+ }
85
+ if (recentRuns.length === 0)
86
+ return null;
87
+ return (_jsxs(Card, { variant: "bordered", padding: "none", className: "overflow-hidden", children: [_jsx("div", { className: "px-5 py-4 border-b border-gray-100 dark:border-gray-700/50", children: _jsx("h2", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100", children: "Recent Runs" }) }), _jsx("div", { className: "divide-y divide-gray-100 dark:divide-gray-700/50", children: recentRuns.map(run => (_jsx(RecentRunRow, { run: run, basePath: basePath }, run.id))) })] }));
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Run status breakdown bar
91
+ // ---------------------------------------------------------------------------
92
+ function RunStatusBreakdown({ runs }) {
93
+ const breakdown = useMemo(() => {
94
+ const counts = {};
95
+ for (const run of runs) {
96
+ counts[run.status] = (counts[run.status] ?? 0) + 1;
97
+ }
98
+ return counts;
99
+ }, [runs]);
100
+ const total = runs.length;
101
+ if (total === 0)
102
+ return null;
103
+ const statusColors = {
104
+ completed: 'bg-green-500 dark:bg-green-400',
105
+ passed: 'bg-green-500 dark:bg-green-400',
106
+ running: 'bg-blue-500 dark:bg-blue-400',
107
+ pending: 'bg-yellow-500 dark:bg-yellow-400',
108
+ planned: 'bg-gray-400 dark:bg-gray-500',
109
+ failed: 'bg-red-500 dark:bg-red-400',
110
+ error: 'bg-red-500 dark:bg-red-400',
111
+ cancelled: 'bg-gray-400 dark:bg-gray-500',
112
+ skipped: 'bg-gray-300 dark:bg-gray-600',
113
+ };
114
+ const statusLabelColors = {
115
+ completed: 'text-green-600 dark:text-green-400',
116
+ passed: 'text-green-600 dark:text-green-400',
117
+ running: 'text-blue-600 dark:text-blue-400',
118
+ pending: 'text-yellow-600 dark:text-yellow-400',
119
+ planned: 'text-gray-500 dark:text-gray-400',
120
+ failed: 'text-red-600 dark:text-red-400',
121
+ error: 'text-red-600 dark:text-red-400',
122
+ cancelled: 'text-gray-500 dark:text-gray-400',
123
+ skipped: 'text-gray-400 dark:text-gray-500',
124
+ };
125
+ const entries = Object.entries(breakdown).sort(([, a], [, b]) => b - a);
126
+ return (_jsxs(Card, { variant: "bordered", padding: "none", className: "overflow-hidden", children: [_jsxs("div", { className: "px-5 py-4 border-b border-gray-100 dark:border-gray-700/50", children: [_jsx("h2", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100", children: "Run Status Overview" }), _jsxs("p", { className: "text-xs text-gray-400 dark:text-gray-500 mt-0.5", children: [total, " total run", total !== 1 ? 's' : ''] })] }), _jsxs("div", { className: "px-5 py-4", children: [_jsx("div", { className: "flex h-3 rounded-full overflow-hidden bg-gray-100 dark:bg-gray-700 mb-4", children: entries.map(([status, count]) => (_jsx("div", { className: `${statusColors[status] ?? 'bg-gray-400'} transition-all`, style: { width: `${(count / total) * 100}%` }, title: `${status}: ${count}` }, status))) }), _jsx("div", { className: "flex flex-wrap gap-x-4 gap-y-1.5", children: entries.map(([status, count]) => (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("div", { className: `w-2.5 h-2.5 rounded-full ${statusColors[status] ?? 'bg-gray-400'}` }), _jsx("span", { className: `text-xs font-medium ${statusLabelColors[status] ?? 'text-gray-500 dark:text-gray-400'}`, children: status }), _jsx("span", { className: "text-xs text-gray-400 dark:text-gray-500 tabular-nums font-mono", children: count })] }, status))) })] })] }));
127
+ }
128
+ // ---------------------------------------------------------------------------
129
+ // Aggregate stats for the first product
130
+ // ---------------------------------------------------------------------------
131
+ function useFirstProductRuns(products) {
132
+ const { networkClient, token, baseUrl } = useTestomniacApi();
133
+ const firstProduct = products[0];
134
+ const { runs, isLoading, error } = useProductRuns({
135
+ networkClient,
136
+ baseUrl,
137
+ productId: firstProduct?.id ?? 0,
138
+ token: token ?? '',
139
+ enabled: !!firstProduct && !!token,
140
+ });
141
+ return { runs, isLoading, error };
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Main page component
145
+ // ---------------------------------------------------------------------------
146
+ export function DashboardOverview() {
147
+ const { entitySlug } = useRouteParams();
148
+ const { navigate } = useLocalizedNavigate();
149
+ const { networkClient, token, baseUrl } = useTestomniacApi();
150
+ const basePath = `/dashboard/${entitySlug}`;
151
+ const { products, isLoading, error } = useEntityProducts({
152
+ networkClient,
153
+ baseUrl,
154
+ entitySlug: entitySlug ?? '',
155
+ token: token ?? '',
156
+ enabled: !!token && !!entitySlug,
157
+ });
158
+ // Fetch runs for the first product for the overview stats
159
+ const { runs: firstProductRuns, isLoading: runsLoading } = useFirstProductRuns(products);
160
+ // Count total environments across all products (approximation: rendered by ProductSection)
161
+ // We use a simple heuristic based on product count for the tile; exact counts are
162
+ // shown inside each ProductSection.
163
+ const totalProducts = products.length;
164
+ const runStats = useMemo(() => {
165
+ const completedRuns = firstProductRuns.filter(r => r.status === 'completed');
166
+ const totalPages = completedRuns.reduce((sum, r) => sum + (r.pagesFound ?? 0), 0);
167
+ const totalTests = completedRuns.reduce((sum, r) => sum + (r.testRunsCompleted ?? 0), 0);
168
+ return {
169
+ totalRuns: firstProductRuns.length,
170
+ completedRuns: completedRuns.length,
171
+ failedRuns: firstProductRuns.filter(r => r.status === 'failed' || r.status === 'error')
172
+ .length,
173
+ totalPages,
174
+ totalTests,
175
+ };
176
+ }, [firstProductRuns]);
177
+ return (_jsxs("div", { className: "p-6 max-w-5xl", children: [_jsx(SEOHead, { title: "Dashboard", description: "", noIndex: true }), _jsx("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100 mb-2", children: "Dashboard" }), _jsx("p", { className: "text-gray-500 dark:text-gray-400 mb-8", children: "Manage your web application tests and discovery run results." }), !isLoading && !error && totalProducts > 0 && (_jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4 mb-8", children: [_jsx(StatTile, { label: "Products", value: totalProducts, accent: "blue", icon: _jsxs("svg", { className: "w-5 h-5", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "3", width: "14", height: "14", rx: "2" }), _jsx("path", { d: "M3 8h14" }), _jsx("path", { d: "M8 8v9" })] }) }), _jsx(StatTile, { label: "Total Runs", value: runsLoading ? '--' : runStats.totalRuns, accent: "emerald", icon: _jsx("svg", { className: "w-5 h-5", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M6 3v14l8-7-8-7z" }) }) }), _jsx(StatTile, { label: "Pages Discovered", value: runsLoading ? '--' : runStats.totalPages, accent: "amber", icon: _jsxs("svg", { className: "w-5 h-5", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "2", width: "14", height: "16", rx: "2" }), _jsx("path", { d: "M7 6h6M7 10h6M7 14h4" })] }) }), _jsx(StatTile, { label: "Tests Completed", value: runsLoading ? '--' : runStats.totalTests, accent: runStats.failedRuns > 0 ? 'red' : 'gray', icon: _jsx("svg", { className: "w-5 h-5", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M4 10l4 4 8-8" }) }) })] })), _jsx("div", { className: "mb-8", children: _jsxs("button", { onClick: () => navigate(`${basePath}/scan/new`), className: "w-full sm:w-auto flex items-center gap-4 p-5 text-left rounded-xl border border-gray-200 dark:border-gray-700 bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-900/10 dark:to-indigo-900/10 hover:from-blue-100 hover:to-indigo-100 dark:hover:from-blue-900/20 dark:hover:to-indigo-900/20 transition-all group", children: [_jsx("div", { className: "flex-shrink-0 w-10 h-10 rounded-lg bg-blue-600 dark:bg-blue-500 flex items-center justify-center", children: _jsxs("svg", { className: "w-5 h-5 text-white", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: [_jsx("circle", { cx: "10", cy: "10", r: "7" }), _jsx("path", { d: "M10 7v6M7 10h6" })] }) }), _jsxs("div", { children: [_jsx("div", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100", children: "New Discovery Run" }), _jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-0.5", children: "Scan a URL to discover pages, generate tests, and find issues" })] })] }) }), !isLoading && !error && totalProducts > 0 && (_jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-4 mb-8", children: [_jsx(RecentRunsSection, { runs: firstProductRuns, basePath: basePath, isLoading: runsLoading }), !runsLoading && firstProductRuns.length > 0 && (_jsx(RunStatusBreakdown, { runs: firstProductRuns }))] })), isLoading && (_jsx("div", { className: "space-y-4", children: [1, 2].map(i => (_jsxs("div", { className: "animate-pulse", children: [_jsx("div", { className: "h-5 bg-gray-200 dark:bg-gray-700 rounded w-48 mb-3" }), _jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-4", children: [_jsx("div", { className: "h-40 bg-gray-100 dark:bg-gray-800 rounded-xl" }), _jsx("div", { className: "h-40 bg-gray-100 dark:bg-gray-800 rounded-xl" })] })] }, i))) })), error && _jsx(Alert, { variant: "error", description: `Failed to load products: ${error}` }), !isLoading && !error && products.length === 0 && (_jsx(EmptyState, { icon: _jsxs("svg", { className: "w-12 h-12 text-gray-300 dark:text-gray-600 mx-auto", viewBox: "0 0 48 48", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "6", y: "10", width: "36", height: "28", rx: "3" }), _jsx("path", { d: "M6 18h36" }), _jsx("circle", { cx: "12", cy: "14", r: "1.5", fill: "currentColor", stroke: "none" }), _jsx("circle", { cx: "18", cy: "14", r: "1.5", fill: "currentColor", stroke: "none" }), _jsx("path", { d: "M16 30h16M20 26h8" })] }), title: "No products yet", description: "Start a discovery run to scan your web application, generate tests, and track issues automatically." })), products.length > 0 && (_jsx("div", { className: "space-y-8", children: products.map((product) => (_jsx(ProductSection, { product: product, basePath: basePath }, product.id))) }))] }));
178
+ }
179
+ //# sourceMappingURL=DashboardOverview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardOverview.js","sourceRoot":"","sources":["../../src/pages/DashboardOverview.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function FindingsListPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=FindingsListPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindingsListPage.d.ts","sourceRoot":"","sources":["../../src/pages/FindingsListPage.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,gBAAgB,gCA8U/B"}
@@ -0,0 +1,160 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { useRunFindings, useRunPages } from '@sudobility/testomniac_client';
4
+ import { parseExpertiseTitle, PRIORITY_LEVELS } from '@sudobility/testomniac_lib';
5
+ import { Button } from '@sudobility/components';
6
+ import { SEOHead, useTestomniacApi } from '../context/config';
7
+ import { useRouteParams } from '../context/routing';
8
+ import { getPriorityConfig } from '../config/priorityConfig';
9
+ import { SelectField } from '../components/forms/SelectField';
10
+ import { useDashboardEnvironmentContext } from '../hooks/useDashboardEnvironmentContext';
11
+ import { useLocalizedNavigate } from '../hooks/useLocalizedNavigate';
12
+ import { ScriptPanel } from '../components/scripts/ScriptPanel';
13
+ import { ErrorState, LoadingState, EmptyState } from '../components/states';
14
+ /* ---------- Sub-components ---------- */
15
+ function FindingTypeBadge({ type }) {
16
+ const colors = type === 'error'
17
+ ? 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300'
18
+ : type === 'warning'
19
+ ? 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300'
20
+ : 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300';
21
+ return (_jsx("span", { className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${colors}`, children: type }));
22
+ }
23
+ function PriorityBadge({ priority }) {
24
+ const config = getPriorityConfig(priority);
25
+ return (_jsx("span", { className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-semibold ${config.className}`, children: config.shortLabel }));
26
+ }
27
+ /* ---------- Main component ---------- */
28
+ export function FindingsListPage() {
29
+ const { entitySlug, envId, runId } = useRouteParams();
30
+ const { networkClient, token, baseUrl } = useTestomniacApi();
31
+ const { navigate } = useLocalizedNavigate();
32
+ const [typeFilter, setTypeFilter] = useState('all');
33
+ const [priorityFilter, setPriorityFilter] = useState('');
34
+ const [pathFilter, setPathFilter] = useState('');
35
+ const [categoryFilter, setCategoryFilter] = useState('');
36
+ const [scriptFindingId, setScriptFindingId] = useState(null);
37
+ const { latestRun, isLoading: contextLoading, error: contextError, } = useDashboardEnvironmentContext();
38
+ const effectiveRunId = Number(runId ?? latestRun?.id ?? 0);
39
+ const runFindingsQuery = useRunFindings({
40
+ networkClient,
41
+ baseUrl,
42
+ runId: effectiveRunId,
43
+ token: token ?? '',
44
+ enabled: !!token && !!effectiveRunId,
45
+ });
46
+ const findings = runFindingsQuery.findings;
47
+ // Map page paths -> page id so a finding can deep-link to its page detail,
48
+ // which shows the finding in context (runtime signals, console/network logs).
49
+ const runPagesQuery = useRunPages({
50
+ networkClient,
51
+ baseUrl,
52
+ runId: effectiveRunId,
53
+ token: token ?? '',
54
+ enabled: !!token && !!effectiveRunId,
55
+ });
56
+ const pageIdByPath = useMemo(() => {
57
+ const map = new Map();
58
+ for (const page of runPagesQuery.pages) {
59
+ map.set(page.relativePath, page.id);
60
+ }
61
+ return map;
62
+ }, [runPagesQuery.pages]);
63
+ const openFinding = (finding) => {
64
+ const pageId = finding.path ? pageIdByPath.get(finding.path) : undefined;
65
+ if (pageId && effectiveRunId) {
66
+ navigate(`/dashboard/${entitySlug}/environments/${envId}/runs/${effectiveRunId}/pages/${pageId}`);
67
+ }
68
+ };
69
+ const isLoading = contextLoading || runFindingsQuery.isLoading;
70
+ const error = contextError || runFindingsQuery.error;
71
+ // Derive unique paths from findings
72
+ const uniquePaths = useMemo(() => {
73
+ const paths = new Set();
74
+ for (const f of findings) {
75
+ if (f.path)
76
+ paths.add(f.path);
77
+ }
78
+ return Array.from(paths).sort();
79
+ }, [findings]);
80
+ // Derive unique categories (tags) from finding titles using parseExpertiseTitle
81
+ const uniqueCategories = useMemo(() => {
82
+ const cats = new Set();
83
+ for (const f of findings) {
84
+ const { tag } = parseExpertiseTitle(f.title);
85
+ if (tag)
86
+ cats.add(tag);
87
+ }
88
+ return Array.from(cats).sort();
89
+ }, [findings]);
90
+ // Apply all filters
91
+ const filteredFindings = useMemo(() => {
92
+ let result = findings;
93
+ if (typeFilter === 'errors') {
94
+ result = result.filter(f => f.type === 'error');
95
+ }
96
+ if (priorityFilter !== '') {
97
+ const p = Number(priorityFilter);
98
+ result = result.filter(f => f.priority === p);
99
+ }
100
+ if (pathFilter !== '') {
101
+ result = result.filter(f => f.path === pathFilter);
102
+ }
103
+ if (categoryFilter !== '') {
104
+ result = result.filter(f => {
105
+ const { tag } = parseExpertiseTitle(f.title);
106
+ return tag === categoryFilter;
107
+ });
108
+ }
109
+ return result;
110
+ }, [findings, typeFilter, priorityFilter, pathFilter, categoryFilter]);
111
+ const hasActiveFilters = typeFilter !== 'all' || priorityFilter !== '' || pathFilter !== '' || categoryFilter !== '';
112
+ if (error) {
113
+ return _jsx(ErrorState, { message: error });
114
+ }
115
+ return (_jsxs("div", { className: "p-6", children: [_jsx(SEOHead, { title: "Findings", description: "", noIndex: true }), _jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: "Findings" }), runId && (_jsxs("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: ["Showing findings for run #", runId, "."] }))] }), _jsxs("div", { className: "flex items-center rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden", children: [_jsx("button", { onClick: () => setTypeFilter('all'), className: `px-3 py-1.5 text-sm font-medium transition-colors ${typeFilter === 'all'
116
+ ? 'bg-blue-600 text-white'
117
+ : 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700'}`, children: "All" }), _jsx("button", { onClick: () => setTypeFilter('errors'), className: `px-3 py-1.5 text-sm font-medium transition-colors ${typeFilter === 'errors'
118
+ ? 'bg-red-600 text-white'
119
+ : 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700'}`, children: "Errors only" })] })] }), !isLoading && findings.length > 0 && (_jsx("div", { className: "mb-4 flex flex-wrap gap-2", children: PRIORITY_LEVELS.map(p => {
120
+ const key = String(p);
121
+ const config = getPriorityConfig(p);
122
+ const count = findings.filter(f => f.priority === p).length;
123
+ const isActive = priorityFilter === key;
124
+ return (_jsxs("button", { onClick: () => setPriorityFilter(isActive ? '' : key), className: `inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium transition-all ${isActive
125
+ ? `${config.chipClassName} ring-2 ring-offset-1 ring-current`
126
+ : `${config.chipClassName} opacity-80 hover:opacity-100`}`, children: [_jsx("span", { children: config.shortLabel }), _jsx("span", { className: "font-bold", children: count })] }, key));
127
+ }) })), !isLoading && findings.length > 0 && (_jsxs("div", { className: "mb-4 flex flex-wrap items-center gap-3", children: [uniqueCategories.length > 0 && (_jsx(SelectField, { value: categoryFilter, onChange: setCategoryFilter, options: [
128
+ { value: '', label: 'All categories' },
129
+ ...uniqueCategories.map(cat => ({ value: cat, label: cat })),
130
+ ] })), uniquePaths.length > 0 && (_jsx(SelectField, { value: pathFilter, onChange: setPathFilter, options: [
131
+ { value: '', label: 'All pages' },
132
+ ...uniquePaths.map(p => ({ value: p, label: p })),
133
+ ] })), hasActiveFilters && (_jsx(Button, { variant: "link", size: "sm", onClick: () => {
134
+ setTypeFilter('all');
135
+ setPriorityFilter('');
136
+ setPathFilter('');
137
+ setCategoryFilter('');
138
+ }, children: "Clear filters" })), _jsxs("span", { className: "ml-auto text-xs text-gray-500 dark:text-gray-400", children: [filteredFindings.length, " of ", findings.length, " findings"] })] })), isLoading && _jsx(LoadingState, { message: "Loading findings..." }), !isLoading && filteredFindings.length === 0 && (_jsx(EmptyState, { title: hasActiveFilters ? 'No findings match the current filters' : 'No findings yet', description: hasActiveFilters
139
+ ? 'Try adjusting or clearing the filters above.'
140
+ : 'Findings will appear here after test runs complete.' })), !isLoading && filteredFindings.length > 0 && (_jsx("div", { className: "space-y-3", children: filteredFindings.map(finding => {
141
+ const { tag, title } = parseExpertiseTitle(finding.title);
142
+ const canOpen = !!(finding.path && pageIdByPath.has(finding.path) && effectiveRunId);
143
+ return (_jsxs("div", { children: [_jsx("div", { onClick: canOpen ? () => openFinding(finding) : undefined, role: canOpen ? 'button' : undefined, tabIndex: canOpen ? 0 : undefined, onKeyDown: canOpen
144
+ ? e => {
145
+ if (e.key === 'Enter' || e.key === ' ') {
146
+ e.preventDefault();
147
+ openFinding(finding);
148
+ }
149
+ }
150
+ : undefined, className: `px-4 py-3 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 ${canOpen
151
+ ? 'cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors'
152
+ : ''}`, children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(FindingTypeBadge, { type: finding.type }), _jsx(PriorityBadge, { priority: finding.priority })] }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [tag && (_jsx("span", { className: "inline-flex shrink-0 rounded bg-gray-100 px-1.5 py-0.5 text-[10px] font-medium text-gray-500 dark:bg-gray-700 dark:text-gray-400", children: tag })), _jsx("span", { className: "text-sm font-medium text-gray-900 dark:text-gray-100 truncate", children: title })] }), _jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: finding.description }), _jsxs("div", { className: "flex items-center gap-3 mt-2", children: [finding.path && (_jsx("span", { className: "text-xs font-mono text-gray-400 dark:text-gray-500", children: finding.path })), _jsx("span", { className: "text-xs text-gray-400 dark:text-gray-500", children: finding.interactionRunIds?.length
153
+ ? `Run #${finding.interactionRunIds.join(', #')}`
154
+ : '' }), finding.createdAt && (_jsx("span", { className: "text-xs text-gray-400 dark:text-gray-500", children: new Date(finding.createdAt).toLocaleString() }))] })] }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: e => {
155
+ e.stopPropagation();
156
+ setScriptFindingId(prev => (prev === finding.id ? null : finding.id));
157
+ }, className: "shrink-0 self-start", children: scriptFindingId === finding.id ? 'Hide' : 'Script' })] }) }), scriptFindingId === finding.id && (_jsx("div", { className: "mt-2", children: _jsx(ScriptPanel, { kind: "finding", id: finding.id, filename: `finding-${finding.id}.spec.ts` }) }))] }, finding.id));
158
+ }) }))] }));
159
+ }
160
+ //# sourceMappingURL=FindingsListPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindingsListPage.js","sourceRoot":"","sources":["../../src/pages/FindingsListPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function PageDetailPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=PageDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/PageDetailPage.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,cAAc,gCA+V7B"}
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect } from 'react';
3
+ import { usePageStates, useRunPageSummary, useEnvironmentTestInteractions, useEnvironmentPages, useCreateTestInteractionRun, useRunPages, useRunTestInteractions, useProductPersonas, buildArtifactUrl, } from '@sudobility/testomniac_client';
4
+ import { usePageInteractionGroups } from '@sudobility/testomniac_lib';
5
+ import { Button, Card } from '@sudobility/components';
6
+ import { SEOHead, useTestomniacApi } from '../context/config';
7
+ import { useRouteParams } from '../context/routing';
8
+ import { InteractionCell } from '../components/cells';
9
+ import BackLink from '../components/navigation/BackLink';
10
+ import { useLocalizedNavigate } from '../hooks/useLocalizedNavigate';
11
+ import { AddScenarioForm } from '../components/scenarios/AddScenarioForm';
12
+ import { useDashboardEnvironmentContext } from '../hooks/useDashboardEnvironmentContext';
13
+ export function PageDetailPage() {
14
+ const { pageId, envId, entitySlug, runId } = useRouteParams();
15
+ const { networkClient, token, baseUrl } = useTestomniacApi();
16
+ const { navigate } = useLocalizedNavigate();
17
+ const { primaryRunner, productId } = useDashboardEnvironmentContext();
18
+ const [showScenarioForm, setShowScenarioForm] = useState(false);
19
+ const { personas } = useProductPersonas({
20
+ networkClient,
21
+ baseUrl,
22
+ productId,
23
+ token: token ?? '',
24
+ enabled: !!productId && !!token,
25
+ });
26
+ const numericPageId = Number(pageId);
27
+ const runScoped = Boolean(runId);
28
+ const envPagesQuery = useEnvironmentPages({
29
+ networkClient,
30
+ baseUrl,
31
+ envId: Number(envId),
32
+ token: token ?? '',
33
+ enabled: !!envId && !!token && !runScoped,
34
+ });
35
+ const runPagesQuery = useRunPages({
36
+ networkClient,
37
+ baseUrl,
38
+ runId: Number(runId),
39
+ token: token ?? '',
40
+ enabled: !!runId && !!token,
41
+ });
42
+ const envElementsQuery = useEnvironmentTestInteractions({
43
+ networkClient,
44
+ baseUrl,
45
+ envId: Number(envId),
46
+ token: token ?? '',
47
+ enabled: !!envId && !!token && !runScoped,
48
+ });
49
+ const runElementsQuery = useRunTestInteractions({
50
+ networkClient,
51
+ baseUrl,
52
+ runId: Number(runId),
53
+ token: token ?? '',
54
+ enabled: !!runId && !!token,
55
+ });
56
+ const envPages = runScoped ? runPagesQuery.pages : envPagesQuery.pages;
57
+ const currentPage = envPages.find(p => p.id === numericPageId);
58
+ const testInteractions = runScoped
59
+ ? runElementsQuery.testInteractions
60
+ : envElementsQuery.testInteractions;
61
+ const { createRun } = useCreateTestInteractionRun({
62
+ networkClient,
63
+ baseUrl,
64
+ token: token ?? '',
65
+ });
66
+ const { startingElements, landingElements, onPageElements } = usePageInteractionGroups(testInteractions, numericPageId);
67
+ const { pageStates, isLoading } = usePageStates({
68
+ networkClient,
69
+ baseUrl,
70
+ pageId: Number(pageId),
71
+ token: token ?? '',
72
+ enabled: !!pageId && !!token,
73
+ });
74
+ const { summary, isLoading: summaryLoading } = useRunPageSummary({
75
+ networkClient,
76
+ baseUrl,
77
+ runId: Number(runId),
78
+ pageId: Number(pageId),
79
+ token: token ?? '',
80
+ enabled: !!runId && !!pageId && !!token,
81
+ });
82
+ if (isLoading || summaryLoading) {
83
+ return (_jsx("div", { className: "p-6", children: _jsx("div", { className: "text-center text-gray-500 dark:text-gray-400 py-8", children: "Loading..." }) }));
84
+ }
85
+ const pagesBasePath = runId
86
+ ? `/dashboard/${entitySlug}/environments/${envId}/runs/${runId}/pages`
87
+ : `/dashboard/${entitySlug}/environments/${envId}/pages`;
88
+ return (_jsxs("div", { className: "p-6", children: [_jsx(SEOHead, { title: "Page Detail", description: "", noIndex: true }), _jsx(BackLink, { label: "Pages", onClick: () => navigate(pagesBasePath) }), _jsxs("div", { className: "flex items-center justify-between mb-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: "Page Detail" }), _jsxs("p", { className: "text-sm text-gray-500 dark:text-gray-400 mt-1", children: [summary?.relativePath ?? `Page #${pageId}`, runId ? ` • Run #${runId}` : ` • Page #${pageId}`] })] }), _jsxs("div", { className: "flex gap-2", children: [primaryRunner && (_jsx(Button, { variant: "primary", onClick: () => setShowScenarioForm(prev => !prev), children: showScenarioForm ? 'Cancel' : 'Add Scenario' })), _jsx(Button, { variant: "outline", onClick: () => navigate(`/dashboard/${entitySlug}/environments/${envId}/pages/${pageId}/graph`), children: "View Page Graph" })] })] }), showScenarioForm && primaryRunner && (_jsx("div", { className: "mb-6", children: _jsx(AddScenarioForm, { networkClient: networkClient, token: token ?? '', runnerId: primaryRunner.id, personas: personas, defaultStartingPath: summary?.relativePath ?? currentPage?.relativePath ?? '/', onCreated: () => setShowScenarioForm(false), onCancel: () => setShowScenarioForm(false) }) })), summary && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mb-8 grid grid-cols-2 gap-4 md:grid-cols-4", children: [_jsxs(Card, { variant: "bordered", padding: "md", children: [_jsx("div", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: summary.pageStatesCount }), _jsx("div", { className: "text-xs text-gray-500", children: "Page States" })] }), _jsxs(Card, { variant: "bordered", padding: "md", children: [_jsx("div", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: summary.testInteractionsCount }), _jsx("div", { className: "text-xs text-gray-500", children: "Test Interactions" })] }), _jsxs(Card, { variant: "bordered", padding: "md", children: [_jsx("div", { className: "text-2xl font-bold text-red-600 dark:text-red-400", children: summary.findings }), _jsx("div", { className: "text-xs text-gray-500", children: "Findings" })] }), _jsxs(Card, { variant: "bordered", padding: "md", children: [_jsx("div", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: summary.testInteractionRunsCount }), _jsx("div", { className: "text-xs text-gray-500", children: "Case Runs" })] })] }), summary.latestScreenshotPath && (_jsx(Card, { variant: "bordered", padding: "none", className: "mb-8 overflow-hidden", children: _jsx("img", { src: buildArtifactUrl(baseUrl, summary.latestScreenshotPath), alt: `${summary.relativePath} latest screenshot`, className: "h-72 w-full object-cover object-top" }) })), summary.recentFindings.length > 0 && (_jsxs("div", { className: "mb-8", children: [_jsx("h2", { className: "mb-4 text-lg font-semibold text-gray-900 dark:text-gray-100", children: "Recent Findings" }), _jsx("div", { className: "space-y-3", children: summary.recentFindings.slice(0, 8).map(finding => (_jsx(Card, { variant: "bordered", padding: "md", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: finding.title }), _jsx("div", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: finding.description })] }), _jsx("div", { className: "shrink-0 text-[11px] capitalize text-gray-500 dark:text-gray-400", children: finding.expertise ?? finding.type })] }) }, finding.id))) })] })), summary.runtimeSignals.length > 0 && (_jsxs("div", { className: "mb-8", children: [_jsx("h2", { className: "mb-4 text-lg font-semibold text-gray-900 dark:text-gray-100", children: "Runtime Signals" }), _jsx("div", { className: "space-y-4", children: summary.runtimeSignals.map(signal => (_jsxs(Card, { variant: "bordered", padding: "md", children: [_jsxs("div", { className: "mb-3 flex items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: signal.testInteractionTitle ??
89
+ `Test Interaction #${signal.testInteractionId}` }), _jsxs("div", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: ["Case run #", signal.testInteractionRunId, signal.completedAt
90
+ ? ` • ${new Date(signal.completedAt).toLocaleString()}`
91
+ : ''] })] }), _jsx("span", { className: "text-xs text-gray-500 dark:text-gray-400", children: signal.status })] }), signal.consoleLog && (_jsx("pre", { className: "mb-3 max-h-48 overflow-auto rounded border border-gray-200 bg-gray-50 p-3 text-xs leading-5 text-gray-700 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-300", children: signal.consoleLog })), signal.networkLog && (_jsx("pre", { className: "max-h-48 overflow-auto rounded border border-gray-200 bg-gray-50 p-3 text-xs leading-5 text-gray-700 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-300", children: signal.networkLog }))] }, signal.testInteractionRunId))) })] }))] })), pageStates.length === 0 ? (_jsx("p", { className: "text-gray-500 dark:text-gray-400", children: "No page states found." })) : (_jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4", children: pageStates.map(state => (_jsxs("button", { onClick: () => navigate(runId
92
+ ? `/dashboard/${entitySlug}/environments/${envId}/runs/${runId}/pages/${pageId}/states/${state.id}`
93
+ : `/dashboard/${entitySlug}/environments/${envId}/pages/${pageId}/states/${state.id}`), className: "text-left rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden hover:border-blue-300 dark:hover:border-blue-600 transition-colors", children: [_jsx("div", { className: "h-40 bg-gray-100 dark:bg-gray-800 overflow-hidden", children: state.screenshotPath ? (_jsx("img", { src: buildArtifactUrl(baseUrl, state.screenshotPath), alt: `State ${state.id} screenshot`, className: "w-full h-full object-cover object-top" })) : (_jsx("div", { className: "w-full h-full flex items-center justify-center", children: _jsx("span", { className: "text-xs text-gray-400", children: "No screenshot" }) })) }), _jsxs("div", { className: "p-3", children: [_jsxs("div", { className: "flex items-center gap-2 mb-1", children: [_jsxs("span", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: ["State #", state.id] }), _jsx("span", { className: "px-1.5 py-0.5 text-xs rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400", children: state.sizeClass })] }), _jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: state.capturedAt
94
+ ? new Date(state.capturedAt).toLocaleString()
95
+ : 'No capture date' })] })] }, state.id))) })), (startingElements.length > 0 || landingElements.length > 0 || onPageElements.length > 0) && (_jsxs("div", { className: "mt-10", children: [_jsx("h2", { className: "mb-4 text-lg font-semibold text-gray-900 dark:text-gray-100", children: "Test Interactions" }), onPageElements.length > 0 && (_jsx(TestInteractionGroup, { label: "On this page", elements: onPageElements, onTest: el => createRun({ testInteractionId: el.id }), onOpen: el => navigate(`/dashboard/${entitySlug}/environments/${envId}/test-interactions/${el.id}`) })), startingElements.length > 0 && (_jsx(TestInteractionGroup, { label: "Starting from this page", elements: startingElements, onTest: el => createRun({ testInteractionId: el.id }), onOpen: el => navigate(`/dashboard/${entitySlug}/environments/${envId}/test-interactions/${el.id}`) })), landingElements.length > 0 && (_jsx(TestInteractionGroup, { label: "Landing on this page", elements: landingElements, onTest: el => createRun({ testInteractionId: el.id }), onOpen: el => navigate(`/dashboard/${entitySlug}/environments/${envId}/test-interactions/${el.id}`) }))] }))] }));
96
+ }
97
+ // --- Test Interactions Sub-components ---
98
+ function TestInteractionGroup({ label, elements, onTest, onOpen, }) {
99
+ return (_jsxs("div", { className: "mb-6", children: [_jsx("h3", { className: "mb-2 text-sm font-medium text-gray-500 dark:text-gray-400", children: label }), _jsx("div", { className: "space-y-2", children: elements.map(el => (_jsx(TestInteractionRow, { element: el, onTest: () => onTest(el), onOpen: () => onOpen(el) }, el.id))) })] }));
100
+ }
101
+ function TestInteractionRow({ element, onTest, onOpen, }) {
102
+ const [menuOpen, setMenuOpen] = useState(false);
103
+ const menuRef = useRef(null);
104
+ useEffect(() => {
105
+ if (!menuOpen)
106
+ return;
107
+ function handleClickOutside(e) {
108
+ if (menuRef.current && !menuRef.current.contains(e.target)) {
109
+ setMenuOpen(false);
110
+ }
111
+ }
112
+ document.addEventListener('mousedown', handleClickOutside);
113
+ return () => document.removeEventListener('mousedown', handleClickOutside);
114
+ }, [menuOpen]);
115
+ return (_jsx(InteractionCell, { interaction: element, onClick: onOpen, actions: _jsxs("div", { className: "relative", ref: menuRef, children: [_jsx("button", { onClick: () => setMenuOpen(prev => !prev), className: "rounded p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300", children: _jsxs("svg", { className: "h-4 w-4", fill: "currentColor", viewBox: "0 0 20 20", children: [_jsx("circle", { cx: "10", cy: "4", r: "1.5" }), _jsx("circle", { cx: "10", cy: "10", r: "1.5" }), _jsx("circle", { cx: "10", cy: "16", r: "1.5" })] }) }), menuOpen && (_jsx("div", { className: "absolute right-0 top-full z-10 mt-1 w-32 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800", children: _jsx("button", { onClick: () => {
116
+ setMenuOpen(false);
117
+ onTest();
118
+ }, className: "w-full px-3 py-1.5 text-left text-sm text-gray-700 hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700", children: "Test" }) }))] }) }));
119
+ }
120
+ //# sourceMappingURL=PageDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageDetailPage.js","sourceRoot":"","sources":["../../src/pages/PageDetailPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import '@xyflow/react/dist/style.css';
2
+ export declare function PageGraphPage(): import("react").JSX.Element;
3
+ //# sourceMappingURL=PageGraphPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageGraphPage.d.ts","sourceRoot":"","sources":["../../src/pages/PageGraphPage.tsx"],"names":[],"mappings":"AAWA,OAAO,8BAA8B,CAAC;AA4DtC,wBAAgB,aAAa,gCA2F5B"}