@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,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from 'react';
3
+ import { useScanProgressStore } from '@sudobility/testomniac_lib';
4
+ import { useEventSource, buildRunStreamUrl } from '@sudobility/testomniac_client';
5
+ import { Button } from '@sudobility/components';
6
+ import { SEOHead, useTestomniacApi } from '../context/config';
7
+ import { useRouteParams } from '../context/routing';
8
+ import { ScanProgressPanel } from '../components/scanner/ScanProgressPanel';
9
+ import { useLocalizedNavigate } from '../hooks/useLocalizedNavigate';
10
+ export function ScanProgressPage() {
11
+ const { entitySlug, runId } = useRouteParams();
12
+ const { baseUrl } = useTestomniacApi();
13
+ const store = useScanProgressStore();
14
+ const prevRunId = useRef(undefined);
15
+ // Reset store when viewing a different run (or on first mount)
16
+ useEffect(() => {
17
+ if (runId !== prevRunId.current) {
18
+ store.reset();
19
+ prevRunId.current = runId;
20
+ }
21
+ }, [runId, store]);
22
+ const { navigate } = useLocalizedNavigate();
23
+ const sseUrl = runId && !store.isComplete ? buildRunStreamUrl(baseUrl, runId) : null;
24
+ const { isConnected } = useEventSource({
25
+ url: sseUrl,
26
+ onEvent: store.handleEvent,
27
+ });
28
+ return (_jsxs("div", { className: "p-6", children: [_jsx(SEOHead, { title: "Discovery Run Progress", description: "", noIndex: true }), _jsxs("div", { className: "flex items-center justify-between mb-6", children: [_jsx("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: "Discovery Run Progress" }), store.isComplete && (_jsx(Button, { variant: "primary", onClick: () => navigate(`/dashboard/${entitySlug}/runs/${runId}`), children: "View Results" }))] }), _jsx(ScanProgressPanel, { pagesFound: store.pagesFound, pageStatesFound: store.pageStatesFound, testRunsCompleted: store.testRunsCompleted, findingsFound: store.findingsFound, error: store.error, events: store.events, isConnected: isConnected, isComplete: store.isComplete, latestScreenshotUrl: store.latestScreenshotUrl, currentPageUrl: store.currentPageUrl })] }));
29
+ }
30
+ //# sourceMappingURL=ScanProgressPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanProgressPage.js","sourceRoot":"","sources":["../../src/pages/ScanProgressPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,cAAc,EAAyC,CAAC;IACtF,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IAExD,+DAA+D;IAC/D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YAChC,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACnB,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAE5C,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErF,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QACrC,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,KAAK,CAAC,WAAW;KAC3B,CAAC,CAAC;IAEH,OAAO,CACL,eAAK,SAAS,EAAC,KAAK,aAClB,KAAC,OAAO,IAAC,KAAK,EAAC,wBAAwB,EAAC,WAAW,EAAC,EAAE,EAAC,OAAO,SAAG,EACjE,eAAK,SAAS,EAAC,wCAAwC,aACrD,aAAI,SAAS,EAAC,qDAAqD,uCAE9D,EACJ,KAAK,CAAC,UAAU,IAAI,CACnB,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,UAAU,SAAS,KAAK,EAAE,CAAC,6BAG1D,CACV,IACG,EAEN,KAAC,iBAAiB,IAChB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAC1C,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAC9C,cAAc,EAAE,KAAK,CAAC,cAAc,GACpC,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function SchedulesPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=SchedulesPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchedulesPage.d.ts","sourceRoot":"","sources":["../../src/pages/SchedulesPage.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,aAAa,gCAgX5B"}
@@ -0,0 +1,165 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { useCreateTestSchedule, useRunnerSchedules, useRunnerTestSurfaceBundles, useEnvironmentTestInteractions, useEnvironmentTestSurfaces, } from '@sudobility/testomniac_client';
4
+ import { RECURRENCE_OPTIONS, DAY_OPTIONS, describeScheduleTarget, describeRecurrence, } from '@sudobility/testomniac_lib';
5
+ import { ActionButton, Button, Card, Label } from '@sudobility/components';
6
+ import { SEOHead, useTestomniacApi } from '../context/config';
7
+ import { useRouteParams } from '../context/routing';
8
+ import { SelectField } from '../components/forms/SelectField';
9
+ import { StatusBadge } from '../components/scanner/StatusBadge';
10
+ import { useDashboardEnvironmentContext } from '../hooks/useDashboardEnvironmentContext';
11
+ import { EmptyState } from '../components/states';
12
+ export function SchedulesPage() {
13
+ const { envId } = useRouteParams();
14
+ const { baseUrl } = useTestomniacApi();
15
+ const { networkClient, token, primaryRunner, envId: numericEnvId, isLoading: contextLoading, error: contextError, } = useDashboardEnvironmentContext();
16
+ const [showForm, setShowForm] = useState(false);
17
+ const [title, setTitle] = useState('');
18
+ const [targetKind, setTargetKind] = useState('bundle');
19
+ const [selectedBundleId, setSelectedBundleId] = useState('');
20
+ const [selectedSurfaceId, setSelectedSurfaceId] = useState('');
21
+ const [selectedElementId, setSelectedElementId] = useState('');
22
+ const [recurrenceType, setRecurrenceType] = useState('daily');
23
+ const [timeOfDay, setTimeOfDay] = useState('09:00');
24
+ const [dayOfWeek, setDayOfWeek] = useState('1');
25
+ const [timezone, setTimezone] = useState(Intl.DateTimeFormat().resolvedOptions().timeZone);
26
+ const [sizeClass, setSizeClass] = useState('desktop');
27
+ const [discovery, setDiscovery] = useState(true);
28
+ const { schedules, isLoading: schedulesLoading, error: schedulesError, refetch, } = useRunnerSchedules({
29
+ networkClient,
30
+ baseUrl,
31
+ runnerId: primaryRunner?.id ?? 0,
32
+ token,
33
+ enabled: !!envId && !!token && !!primaryRunner,
34
+ });
35
+ // Bundles / surfaces / interactions are only needed to populate the
36
+ // "New Schedule" form selects, so they are fetched lazily once the form is
37
+ // opened. This keeps the initial schedules list fast to load.
38
+ const { bundles, error: bundlesError } = useRunnerTestSurfaceBundles({
39
+ networkClient,
40
+ baseUrl,
41
+ runnerId: primaryRunner?.id ?? 0,
42
+ token,
43
+ enabled: !!envId && !!token && !!primaryRunner && showForm,
44
+ });
45
+ const { testSurfaces, error: surfacesError } = useEnvironmentTestSurfaces({
46
+ networkClient,
47
+ baseUrl,
48
+ envId: numericEnvId,
49
+ token,
50
+ enabled: !!envId && !!token && showForm,
51
+ });
52
+ const { testInteractions, error: elementsError } = useEnvironmentTestInteractions({
53
+ networkClient,
54
+ baseUrl,
55
+ envId: numericEnvId,
56
+ token,
57
+ enabled: !!envId && !!token && showForm,
58
+ });
59
+ const { createTestSchedule, isCreating, error: createError, reset, } = useCreateTestSchedule({
60
+ networkClient,
61
+ baseUrl,
62
+ runnerId: primaryRunner?.id ?? 0,
63
+ token,
64
+ });
65
+ const pageError = contextError ||
66
+ schedulesError ||
67
+ bundlesError ||
68
+ surfacesError ||
69
+ elementsError ||
70
+ createError ||
71
+ null;
72
+ const isLoading = contextLoading || schedulesLoading;
73
+ const selectedTargetId = useMemo(() => {
74
+ if (targetKind === 'bundle')
75
+ return selectedBundleId;
76
+ if (targetKind === 'surface')
77
+ return selectedSurfaceId;
78
+ return selectedElementId;
79
+ }, [selectedBundleId, selectedElementId, selectedSurfaceId, targetKind]);
80
+ const canCreate = useMemo(() => {
81
+ if (!title.trim())
82
+ return false;
83
+ if (!selectedTargetId)
84
+ return false;
85
+ if (!timeOfDay.trim() || !timezone.trim())
86
+ return false;
87
+ if (recurrenceType === 'weekly' && !dayOfWeek)
88
+ return false;
89
+ return true;
90
+ }, [dayOfWeek, recurrenceType, selectedTargetId, timeOfDay, timezone, title]);
91
+ const resetForm = () => {
92
+ setTitle('');
93
+ setTargetKind('bundle');
94
+ setSelectedBundleId('');
95
+ setSelectedSurfaceId('');
96
+ setSelectedElementId('');
97
+ setRecurrenceType('daily');
98
+ setTimeOfDay('09:00');
99
+ setDayOfWeek('1');
100
+ setTimezone(Intl.DateTimeFormat().resolvedOptions().timeZone);
101
+ setSizeClass('desktop');
102
+ setDiscovery(true);
103
+ reset();
104
+ };
105
+ const closeForm = () => {
106
+ setShowForm(false);
107
+ resetForm();
108
+ };
109
+ const handleCreate = async () => {
110
+ if (!canCreate || !primaryRunner)
111
+ return;
112
+ const payload = {
113
+ runnerId: primaryRunner.id,
114
+ title: title.trim(),
115
+ recurrenceType,
116
+ timeOfDay,
117
+ timezone: timezone.trim(),
118
+ sizeClass,
119
+ discovery,
120
+ ...(targetKind === 'bundle' ? { testSurfaceBundleId: Number(selectedBundleId) } : {}),
121
+ ...(targetKind === 'surface' ? { testSurfaceId: Number(selectedSurfaceId) } : {}),
122
+ ...(targetKind === 'element' ? { testInteractionId: Number(selectedElementId) } : {}),
123
+ ...(recurrenceType === 'weekly' ? { dayOfWeek: Number(dayOfWeek) } : {}),
124
+ };
125
+ await createTestSchedule(payload);
126
+ await refetch();
127
+ closeForm();
128
+ };
129
+ if (pageError) {
130
+ return (_jsx("div", { className: "p-6", children: _jsxs("div", { className: "text-center text-red-600 dark:text-red-400 py-8", children: ["Error: ", pageError] }) }));
131
+ }
132
+ return (_jsxs("div", { className: "p-6", children: [_jsx(SEOHead, { title: "Schedules", description: "", noIndex: true }), _jsxs("div", { className: "flex items-center justify-between mb-6", children: [_jsx("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: "Schedules" }), _jsx(Button, { variant: "primary", onClick: () => (showForm ? closeForm() : setShowForm(true)), children: showForm ? 'Cancel' : '+ New Schedule' })] }), showForm && (_jsxs(Card, { variant: "bordered", padding: "lg", className: "mb-6 space-y-4", children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Title" }), _jsx("input", { type: "text", value: title, onChange: e => setTitle(e.target.value), placeholder: "Production navigation smoke", className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 text-sm" })] }), _jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Target type" }), _jsx(SelectField, { value: targetKind, onChange: v => setTargetKind(v), options: [
133
+ { value: 'bundle', label: 'Bundle' },
134
+ { value: 'surface', label: 'Surface' },
135
+ { value: 'element', label: 'Element' },
136
+ ] })] })] }), targetKind === 'bundle' && (_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Bundle" }), _jsx(SelectField, { value: selectedBundleId, onChange: setSelectedBundleId, options: [
137
+ { value: '', label: 'Select a bundle' },
138
+ ...bundles.map(bundle => ({
139
+ value: String(bundle.id),
140
+ label: `#${bundle.id} ${bundle.title}`,
141
+ })),
142
+ ] })] })), targetKind === 'surface' && (_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Surface" }), _jsx(SelectField, { value: selectedSurfaceId, onChange: setSelectedSurfaceId, options: [
143
+ { value: '', label: 'Select a surface' },
144
+ ...testSurfaces.map(surface => ({
145
+ value: String(surface.id),
146
+ label: `#${surface.id} ${surface.title}`,
147
+ })),
148
+ ] })] })), targetKind === 'element' && (_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Element" }), _jsx(SelectField, { value: selectedElementId, onChange: setSelectedElementId, options: [
149
+ { value: '', label: 'Select a test interaction' },
150
+ ...testInteractions.map(element => ({
151
+ value: String(element.id),
152
+ label: `#${element.id} ${element.title}`,
153
+ })),
154
+ ] })] })), _jsxs("div", { className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4", children: [_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Recurrence" }), _jsx(SelectField, { value: recurrenceType, onChange: v => setRecurrenceType(v), options: RECURRENCE_OPTIONS.map(option => ({
155
+ value: String(option.value),
156
+ label: option.label,
157
+ })) })] }), _jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Time" }), _jsx("input", { type: "time", value: timeOfDay, onChange: e => setTimeOfDay(e.target.value), className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 text-sm" })] }), recurrenceType === 'weekly' && (_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Day" }), _jsx(SelectField, { value: dayOfWeek, onChange: setDayOfWeek, options: DAY_OPTIONS.map(option => ({
158
+ value: String(option.value),
159
+ label: option.label,
160
+ })) })] })), _jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Device" }), _jsx(SelectField, { value: sizeClass, onChange: v => setSizeClass(v), options: [
161
+ { value: 'desktop', label: 'Desktop' },
162
+ { value: 'mobile', label: 'Mobile' },
163
+ ] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Timezone" }), _jsx("input", { type: "text", value: timezone, onChange: e => setTimezone(e.target.value), className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 text-sm" })] }), _jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-700 dark:text-gray-300", children: [_jsx("input", { type: "checkbox", checked: discovery, onChange: e => setDiscovery(e.target.checked), className: "rounded border-gray-300 dark:border-gray-600" }), "Run in discovery mode"] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(ActionButton, { variant: "primary", isLoading: isCreating, loadingText: "Creating...", onClick: handleCreate, disabled: !canCreate, children: "Create Schedule" }), _jsx("span", { className: "text-xs text-gray-500 dark:text-gray-400", children: "This only creates the schedule object. Worker launch is not wired here." })] })] })), isLoading && (_jsx("div", { className: "text-sm text-gray-500 dark:text-gray-400 py-8 text-center", children: "Loading schedules..." })), !isLoading && schedules.length === 0 && !showForm && (_jsx(EmptyState, { title: "No schedules yet", description: "Create a schedule to store a recurring run definition for a bundle, surface, or test element." })), !isLoading && schedules.length > 0 && (_jsx("div", { className: "space-y-3", children: schedules.map(schedule => (_jsx(Card, { variant: "bordered", padding: "md", children: _jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100", children: schedule.title }), _jsx("div", { className: "mt-1 text-sm text-gray-600 dark:text-gray-300", children: describeScheduleTarget(schedule) }), _jsxs("div", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: [describeRecurrence(schedule), " \u00B7 ", schedule.timezone] })] }), _jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2 flex-shrink-0", children: [_jsx(StatusBadge, { status: schedule.enabled ? 'enabled' : 'disabled' }), _jsx(StatusBadge, { status: schedule.sizeClass }), schedule.discovery && _jsx(StatusBadge, { status: "discovery" })] })] }) }, schedule.id))) }))] }));
164
+ }
165
+ //# sourceMappingURL=SchedulesPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchedulesPage.js","sourceRoot":"","sources":["../../src/pages/SchedulesPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function StartScanPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=StartScanPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StartScanPage.d.ts","sourceRoot":"","sources":["../../src/pages/StartScanPage.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,aAAa,gCAmN5B"}
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useEntityCredentials, useSubmitScan } from '@sudobility/testomniac_client';
4
+ import { Label } from '@sudobility/components';
5
+ import { SEOHead, useTestomniacApi } from '../context/config';
6
+ import { useRouteParams } from '../context/routing';
7
+ import { SelectField } from '../components/forms/SelectField';
8
+ import { useLocalizedNavigate } from '../hooks/useLocalizedNavigate';
9
+ import { ScanForm } from '../components/scanner/ScanForm';
10
+ const AUTH_PROVIDER_LABELS = {
11
+ email_password: 'Email / Password',
12
+ google: 'Google',
13
+ apple: 'Apple',
14
+ microsoft: 'Microsoft',
15
+ twitter: 'Twitter / X',
16
+ facebook: 'Facebook',
17
+ github: 'GitHub',
18
+ linkedin: 'LinkedIn',
19
+ okta: 'Okta',
20
+ saml: 'SAML',
21
+ };
22
+ export function StartScanPage() {
23
+ const { entitySlug } = useRouteParams();
24
+ const { networkClient, token, baseUrl } = useTestomniacApi();
25
+ const { navigate } = useLocalizedNavigate();
26
+ const [error, setError] = useState(null);
27
+ const [sizeClass, setSizeClass] = useState('desktop');
28
+ // Scan scope
29
+ const [scanScopePath, setScanScopePath] = useState('');
30
+ const [quickScan, setQuickScan] = useState(false);
31
+ // Login credential state
32
+ const [continueWithLogin, setContinueWithLogin] = useState(false);
33
+ const [entityCredentialId, setEntityCredentialId] = useState('');
34
+ const [loginUrl, setLoginUrl] = useState('');
35
+ // Credentials hook
36
+ const { credentials: storedCredentials, isLoading: loadingCredentials } = useEntityCredentials({
37
+ networkClient,
38
+ baseUrl,
39
+ entitySlug: entitySlug ?? '',
40
+ token: token ?? '',
41
+ enabled: !!entitySlug && !!token,
42
+ });
43
+ // Scan submission hook
44
+ const { submitScan, isSubmitting } = useSubmitScan({
45
+ networkClient,
46
+ baseUrl,
47
+ });
48
+ async function handleSubmit(url, email) {
49
+ setError(null);
50
+ try {
51
+ const response = await submitScan({
52
+ url,
53
+ sizeClass,
54
+ ...(email ? { reportEmail: email } : {}),
55
+ ...(scanScopePath.trim() ? { scanScopePath: scanScopePath.trim() } : {}),
56
+ ...(quickScan ? { quickScan: true } : {}),
57
+ ...(continueWithLogin
58
+ ? {
59
+ continueWithLogin: true,
60
+ ...(entityCredentialId ? { entityCredentialId: Number(entityCredentialId) } : {}),
61
+ ...(loginUrl.trim() ? { loginUrl: loginUrl.trim() } : {}),
62
+ }
63
+ : {}),
64
+ });
65
+ if (response.success && response.data?.testRunId && response.data?.testEnvironmentId) {
66
+ navigate(`/dashboard/${entitySlug}/environments/${response.data.testEnvironmentId}/runs/${response.data.testRunId}/progress`);
67
+ }
68
+ else {
69
+ setError(response.error || response.data?.message || 'Failed to start scan');
70
+ }
71
+ }
72
+ catch (err) {
73
+ setError(err instanceof Error ? err.message : 'Failed to connect to server');
74
+ }
75
+ }
76
+ return (_jsxs("div", { className: "p-6 max-w-lg", children: [_jsx(SEOHead, { title: "Start Discovery Run", description: "", noIndex: true }), _jsx("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100 mb-6", children: "Start Discovery Run" }), _jsxs("div", { className: "space-y-6", children: [_jsx(ScanForm, { onSubmit: handleSubmit, isSubmitting: isSubmitting, error: error, showEmail: false }), _jsxs("div", { className: "border-t border-gray-200 dark:border-gray-700 pt-4", children: [_jsx("h3", { className: "text-sm font-medium text-gray-700 dark:text-gray-300 mb-3", children: "Options" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Device" }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { type: "button", onClick: () => setSizeClass('desktop'), className: `px-3 py-1.5 text-sm rounded-md border ${sizeClass === 'desktop'
77
+ ? 'border-blue-500 bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300'
78
+ : 'border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300'}`, children: "Desktop" }), _jsx("button", { type: "button", onClick: () => setSizeClass('mobile'), className: `px-3 py-1.5 text-sm rounded-md border ${sizeClass === 'mobile'
79
+ ? 'border-blue-500 bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300'
80
+ : 'border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300'}`, children: "Mobile" })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Scope Path (optional)" }), _jsx("input", { type: "text", value: scanScopePath, onChange: e => setScanScopePath(e.target.value), placeholder: "/store/", className: "w-full px-3 py-1.5 text-sm rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100", disabled: isSubmitting }), _jsx("p", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: "Restrict scanning to URLs under this path prefix" })] }), _jsxs("div", { children: [_jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: quickScan, onChange: e => setQuickScan(e.target.checked), className: "rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500" }), _jsx("span", { className: "text-sm text-gray-600 dark:text-gray-400", children: "Quick scan" })] }), _jsx("p", { className: "mt-1 ml-6 text-xs text-gray-500 dark:text-gray-400", children: "Skip hover interactions on linked elements for faster discovery" })] }), _jsxs("div", { children: [_jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: continueWithLogin, onChange: e => {
81
+ setContinueWithLogin(e.target.checked);
82
+ if (!e.target.checked) {
83
+ setEntityCredentialId('');
84
+ setLoginUrl('');
85
+ }
86
+ }, className: "rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500" }), _jsx("span", { className: "text-sm text-gray-600 dark:text-gray-400", children: "Continue with login" })] }), continueWithLogin && (_jsxs("div", { className: "mt-3 ml-6 space-y-3", children: [_jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Stored Credential" }), _jsx(SelectField, { value: entityCredentialId, onChange: setEntityCredentialId, disabled: loadingCredentials, options: [
87
+ {
88
+ value: '',
89
+ label: loadingCredentials ? 'Loading...' : 'Select a credential',
90
+ },
91
+ ...storedCredentials.map(cred => ({
92
+ value: String(cred.id),
93
+ label: `${cred.label} (${AUTH_PROVIDER_LABELS[cred.authProvider] || cred.authProvider}${cred.email ? ` - ${cred.email}` : ''})`,
94
+ })),
95
+ ] }), !loadingCredentials && storedCredentials.length === 0 && (_jsx("p", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: "No stored credentials. Add them in Settings." }))] }), _jsxs("div", { children: [_jsx(Label, { className: "mb-1 block", children: "Login URL (optional)" }), _jsx("input", { type: "text", value: loginUrl, onChange: e => setLoginUrl(e.target.value), placeholder: "https://example.com/login", className: "w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 text-sm focus:ring-2 focus:ring-blue-500 focus:border-transparent" })] })] }))] }), _jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: "Discovery creates a root test run and captures page states for the selected device size." })] })] })] })] }));
96
+ }
97
+ //# sourceMappingURL=StartScanPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StartScanPage.js","sourceRoot":"","sources":["../../src/pages/StartScanPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function TestInteractionDetailPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=TestInteractionDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestInteractionDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/TestInteractionDetailPage.tsx"],"names":[],"mappings":"AA4FA,wBAAgB,yBAAyB,gCAiLxC"}
@@ -0,0 +1,60 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { useEnvironmentTestInteractions, useTestInteractionActions, } from '@sudobility/testomniac_client';
4
+ import { useTestomniacApi } from '../context/config';
5
+ import { useRouteParams } from '../context/routing';
6
+ import BackLink from '../components/navigation/BackLink';
7
+ import { useEnvBasePath } from '../hooks/useEnvBasePath';
8
+ import { useLocalizedNavigate } from '../hooks/useLocalizedNavigate';
9
+ import { Card } from '@sudobility/components';
10
+ import { StatusBadge } from '../components/scanner/StatusBadge';
11
+ import { AddToBundleButton } from '../components/bundles/AddToBundleButton';
12
+ import { ScriptPanel } from '../components/scripts/ScriptPanel';
13
+ import { ErrorState, LoadingState, EmptyState } from '../components/states';
14
+ function ActionRow({ action }) {
15
+ const [expanded, setExpanded] = useState(false);
16
+ return (_jsxs(Card, { variant: "bordered", padding: "none", className: "overflow-hidden", children: [_jsxs("button", { onClick: () => setExpanded(!expanded), className: "w-full text-left px-4 py-3 flex items-center gap-3 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors", children: [_jsxs("span", { className: "text-xs font-mono text-gray-400 dark:text-gray-500 w-8 flex-shrink-0 text-right", children: ["#", action.stepOrder] }), _jsx(StatusBadge, { status: action.actionType }), _jsx("span", { className: "flex-1 min-w-0 text-sm text-gray-900 dark:text-gray-100 truncate", children: action.description }), _jsx("svg", { className: `w-4 h-4 flex-shrink-0 text-gray-400 transition-transform ${expanded ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19.5 8.25l-7.5 7.5-7.5-7.5" }) })] }), expanded && action.playwrightCode && (_jsxs("div", { className: "px-4 py-3 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50", children: [_jsx("div", { className: "text-xs font-semibold text-gray-500 dark:text-gray-400 mb-2 uppercase tracking-wider", children: "Playwright Code" }), _jsx("pre", { className: "text-xs font-mono text-gray-800 dark:text-gray-200 whitespace-pre-wrap break-words bg-white dark:bg-gray-900 rounded-md p-3 border border-gray-200 dark:border-gray-700", children: action.playwrightCode })] }))] }));
17
+ }
18
+ function ElementLinkRow({ element, onClick, relation, }) {
19
+ return (_jsx("button", { onClick: onClick, className: "w-full text-left rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs uppercase tracking-wider text-gray-500 dark:text-gray-400", children: relation }), _jsx("div", { className: "mt-1 text-sm font-medium text-gray-900 dark:text-gray-100 truncate", children: element.title }), _jsxs("div", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: ["Test Interaction #", element.id] })] }), _jsxs("div", { className: "flex items-center gap-2 flex-shrink-0", children: [_jsx(StatusBadge, { status: element.testType }), _jsx(StatusBadge, { status: element.sizeClass })] })] }) }));
20
+ }
21
+ export function TestInteractionDetailPage() {
22
+ const { envId, elementId } = useRouteParams();
23
+ const { networkClient, token, baseUrl } = useTestomniacApi();
24
+ const { navigate } = useLocalizedNavigate();
25
+ const basePath = useEnvBasePath();
26
+ const numericElementId = Number(elementId);
27
+ const { actions, isLoading, error } = useTestInteractionActions({
28
+ networkClient,
29
+ baseUrl,
30
+ testInteractionId: numericElementId,
31
+ token: token ?? '',
32
+ enabled: !!elementId && !!token,
33
+ });
34
+ const { testInteractions, isLoading: elementsLoading, error: elementsError, } = useEnvironmentTestInteractions({
35
+ networkClient,
36
+ baseUrl,
37
+ envId: Number(envId),
38
+ token: token ?? '',
39
+ enabled: !!envId && !!token,
40
+ });
41
+ const currentElement = useMemo(() => testInteractions.find(element => element.id === numericElementId) ?? null, [numericElementId, testInteractions]);
42
+ const dependencyElement = useMemo(() => {
43
+ if (!currentElement?.dependencyTestInteractionId)
44
+ return null;
45
+ return (testInteractions.find(element => element.id === currentElement.dependencyTestInteractionId) ??
46
+ null);
47
+ }, [currentElement, testInteractions]);
48
+ const dependentElements = useMemo(() => testInteractions.filter(element => element.dependencyTestInteractionId === numericElementId), [numericElementId, testInteractions]);
49
+ const actionList = actions.sort((a, b) => a.stepOrder - b.stepOrder);
50
+ const hasHoverAction = actionList.some(action => action.actionType === 'hover');
51
+ const actionError = error || elementsError;
52
+ const isPageLoading = isLoading || elementsLoading;
53
+ if (actionError) {
54
+ return _jsx(ErrorState, { message: actionError });
55
+ }
56
+ return (_jsxs("div", { className: "p-6", children: [_jsx(BackLink, { label: "Test Interactions", onClick: () => navigate(`${basePath}/test-interactions`) }), _jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsxs("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100", children: ["Test Interaction #", elementId] }), _jsx(AddToBundleButton, { itemType: "interaction", itemId: Number(elementId) })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 mb-6", children: [_jsxs("span", { className: "text-xs text-gray-500 dark:text-gray-400", children: ["ID: ", elementId] }), currentElement && _jsx(StatusBadge, { status: currentElement.testType }), currentElement && _jsx(StatusBadge, { status: currentElement.sizeClass }), hasHoverAction && _jsx(StatusBadge, { status: "hover" }), currentElement?.surfaceTags.map(tag => (_jsx(StatusBadge, { status: tag }, tag)))] }), currentElement && (_jsxs("div", { className: "grid gap-4 md:grid-cols-2 mb-8", children: [_jsxs(Card, { variant: "bordered", padding: "md", children: [_jsx("div", { className: "text-xs uppercase tracking-wider text-gray-500 dark:text-gray-400", children: "Starting State" }), _jsxs("div", { className: "mt-2 text-sm text-gray-900 dark:text-gray-100", children: ["Path: ", currentElement.startingPath || 'None'] }), _jsxs("div", { className: "mt-1 text-sm text-gray-600 dark:text-gray-300", children: ["Page state #", currentElement.startingPageStateId ?? 'none'] })] }), _jsxs(Card, { variant: "bordered", padding: "md", children: [_jsx("div", { className: "text-xs uppercase tracking-wider text-gray-500 dark:text-gray-400", children: "Interaction Shape" }), _jsx("div", { className: "mt-2 text-sm text-gray-900 dark:text-gray-100", children: hasHoverAction
57
+ ? 'This element includes a hover interaction.'
58
+ : 'No hover interaction is defined on this element.' }), _jsxs("div", { className: "mt-1 text-sm text-gray-600 dark:text-gray-300", children: [actionList.length, " action", actionList.length === 1 ? '' : 's', " in sequence"] })] })] })), _jsxs("div", { className: "grid gap-4 lg:grid-cols-2 mb-8", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-sm font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3", children: "Depends On" }), dependencyElement ? (_jsx(ElementLinkRow, { element: dependencyElement, relation: "Parent dependency", onClick: () => navigate(`${basePath}/test-interactions/${dependencyElement.id}`) })) : (_jsx(EmptyState, { description: "This test interaction has no dependency." }))] }), _jsxs("div", { children: [_jsx("h2", { className: "text-sm font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3", children: "Depended On By" }), dependentElements.length === 0 ? (_jsx(EmptyState, { description: "No other test interactions currently depend on this one." })) : (_jsx("div", { className: "space-y-2", children: dependentElements.map(element => (_jsx(ElementLinkRow, { element: element, relation: "Child dependency", onClick: () => navigate(`${basePath}/test-interactions/${element.id}`) }, element.id))) }))] })] }), _jsx("h2", { className: "text-sm font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-3", children: "Test Actions" }), !isPageLoading && (_jsx("div", { className: "mb-6", children: _jsx(ScriptPanel, { kind: "interaction", id: numericElementId, filename: `interaction-${numericElementId}.spec.ts` }) })), isPageLoading && _jsx(LoadingState, { message: "Loading test interaction details..." }), !isPageLoading && actionList.length === 0 && (_jsx(EmptyState, { description: "No actions defined for this test interaction." })), !isPageLoading && actionList.length > 0 && (_jsx("div", { className: "space-y-2", children: actionList.map(action => (_jsx(ActionRow, { action: action }, action.id))) }))] }));
59
+ }
60
+ //# sourceMappingURL=TestInteractionDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestInteractionDetailPage.js","sourceRoot":"","sources":["../../src/pages/TestInteractionDetailPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function TestInteractionsPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=TestInteractionsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestInteractionsPage.d.ts","sourceRoot":"","sources":["../../src/pages/TestInteractionsPage.tsx"],"names":[],"mappings":"AAqFA,wBAAgB,oBAAoB,gCAwFnC"}
@@ -0,0 +1,96 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useMemo } from 'react';
3
+ import { createColumnHelper } from '@tanstack/react-table';
4
+ import { useEnvironmentTestInteractions } from '@sudobility/testomniac_client';
5
+ import { PRIORITY_NAMES } from '@sudobility/testomniac_lib';
6
+ import { SEOHead, useTestomniacApi } from '../context/config';
7
+ import { useRouteParams } from '../context/routing';
8
+ import { SelectField } from '../components/forms/SelectField';
9
+ import { DataTable } from '../components/data/DataTable';
10
+ import { StatusBadge } from '../components/scanner/StatusBadge';
11
+ import { ErrorState } from '../components/states';
12
+ import { useLocalizedNavigate } from '../hooks/useLocalizedNavigate';
13
+ const columnHelper = createColumnHelper();
14
+ const columns = [
15
+ columnHelper.accessor('title', {
16
+ header: 'Name',
17
+ cell: info => (_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium text-gray-900 dark:text-gray-100", children: info.getValue() }), _jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400 truncate", children: info.row.original.startingPath || '/' })] })),
18
+ }),
19
+ columnHelper.accessor('testType', {
20
+ header: 'Type',
21
+ cell: info => _jsx(StatusBadge, { status: info.getValue() }),
22
+ }),
23
+ columnHelper.accessor('priority', {
24
+ header: 'Priority',
25
+ cell: info => {
26
+ const p = info.getValue();
27
+ const label = PRIORITY_NAMES[p] ?? `P${p}`;
28
+ const color = p <= 1
29
+ ? 'text-red-600 font-medium'
30
+ : p === 2
31
+ ? 'text-orange-600 font-medium'
32
+ : 'text-gray-600 dark:text-gray-400';
33
+ return _jsx("span", { className: color, children: label });
34
+ },
35
+ }),
36
+ columnHelper.accessor('surfaceTags', {
37
+ header: 'Tags',
38
+ cell: info => (_jsx("div", { className: "flex gap-1 flex-wrap", children: (info.getValue() ?? []).map(tag => (_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: tag }, tag))) })),
39
+ }),
40
+ columnHelper.accessor('sizeClass', {
41
+ header: 'Device',
42
+ }),
43
+ ];
44
+ const PRIORITY_OPTIONS = [
45
+ { value: '', label: 'All Priorities' },
46
+ { value: '0', label: 'Crash (0)' },
47
+ { value: '1', label: 'Critical (1)' },
48
+ { value: '2', label: 'Major (2)' },
49
+ { value: '3', label: 'Minor (3)' },
50
+ { value: '4', label: 'Suggestion (4)' },
51
+ ];
52
+ const DEVICE_OPTIONS = ['All', 'Desktop', 'Mobile'];
53
+ export function TestInteractionsPage() {
54
+ const { entitySlug, envId } = useRouteParams();
55
+ const { networkClient, token, baseUrl } = useTestomniacApi();
56
+ const { navigate } = useLocalizedNavigate();
57
+ const [typeFilter, setTypeFilter] = useState('');
58
+ const [priorityFilter, setPriorityFilter] = useState('');
59
+ const [deviceFilter, setDeviceFilter] = useState('All');
60
+ const { testInteractions, isLoading, error } = useEnvironmentTestInteractions({
61
+ networkClient,
62
+ baseUrl,
63
+ envId: Number(envId),
64
+ token: token ?? '',
65
+ enabled: !!envId && !!token,
66
+ });
67
+ const uniqueTypes = useMemo(() => {
68
+ if (!testInteractions)
69
+ return [];
70
+ const types = new Set(testInteractions.map((t) => t.testType));
71
+ return Array.from(types).sort();
72
+ }, [testInteractions]);
73
+ const filteredData = useMemo(() => {
74
+ if (!testInteractions)
75
+ return [];
76
+ return testInteractions.filter((row) => {
77
+ if (typeFilter && row.testType !== typeFilter)
78
+ return false;
79
+ if (priorityFilter !== '' && row.priority !== Number(priorityFilter))
80
+ return false;
81
+ if (deviceFilter !== 'All' && row.sizeClass !== deviceFilter.toLowerCase())
82
+ return false;
83
+ return true;
84
+ });
85
+ }, [testInteractions, typeFilter, priorityFilter, deviceFilter]);
86
+ if (error) {
87
+ return _jsx(ErrorState, { message: error });
88
+ }
89
+ return (_jsxs("div", { className: "p-6", children: [_jsx(SEOHead, { title: "Test Interactions", description: "", noIndex: true }), _jsx("h1", { className: "text-2xl font-bold text-gray-900 dark:text-gray-100 mb-6", children: "Test Interactions" }), _jsxs("div", { className: "flex flex-wrap gap-3 mb-4", children: [_jsx(SelectField, { value: typeFilter, onChange: setTypeFilter, options: [
90
+ { value: '', label: 'All Types' },
91
+ ...uniqueTypes.map(type => ({ value: type, label: type })),
92
+ ] }), _jsx(SelectField, { value: priorityFilter, onChange: setPriorityFilter, options: PRIORITY_OPTIONS }), _jsx("div", { className: "flex rounded-lg border border-gray-300 dark:border-gray-600 overflow-hidden", children: DEVICE_OPTIONS.map(option => (_jsx("button", { type: "button", onClick: () => setDeviceFilter(option), className: `px-3 py-1.5 text-sm ${deviceFilter === option
93
+ ? 'bg-blue-600 text-white'
94
+ : 'bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700'} ${option !== 'All' ? 'border-l border-gray-300 dark:border-gray-600' : ''}`, children: option }, option))) })] }), _jsx(DataTable, { data: filteredData, columns: columns, isLoading: isLoading, onRowClick: (row) => navigate(`/dashboard/${entitySlug}/environments/${envId}/test-interactions/${row.id}`) })] }));
95
+ }
96
+ //# sourceMappingURL=TestInteractionsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestInteractionsPage.js","sourceRoot":"","sources":["../../src/pages/TestInteractionsPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function TestRunDetailPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=TestRunDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestRunDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/TestRunDetailPage.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,iBAAiB,gCAuVhC"}