@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.
- package/README.md +83 -0
- package/dist/components/bundles/AddToBundleButton.d.ts +8 -0
- package/dist/components/bundles/AddToBundleButton.d.ts.map +1 -0
- package/dist/components/bundles/AddToBundleButton.js +64 -0
- package/dist/components/bundles/AddToBundleButton.js.map +1 -0
- package/dist/components/cells/BundleCell.d.ts +10 -0
- package/dist/components/cells/BundleCell.d.ts.map +1 -0
- package/dist/components/cells/BundleCell.js +8 -0
- package/dist/components/cells/BundleCell.js.map +1 -0
- package/dist/components/cells/InteractionCell.d.ts +17 -0
- package/dist/components/cells/InteractionCell.d.ts.map +1 -0
- package/dist/components/cells/InteractionCell.js +13 -0
- package/dist/components/cells/InteractionCell.js.map +1 -0
- package/dist/components/cells/ListCell.d.ts +29 -0
- package/dist/components/cells/ListCell.d.ts.map +1 -0
- package/dist/components/cells/ListCell.js +19 -0
- package/dist/components/cells/ListCell.js.map +1 -0
- package/dist/components/cells/PersonaCell.d.ts +10 -0
- package/dist/components/cells/PersonaCell.d.ts.map +1 -0
- package/dist/components/cells/PersonaCell.js +7 -0
- package/dist/components/cells/PersonaCell.js.map +1 -0
- package/dist/components/cells/ScaffoldCell.d.ts +12 -0
- package/dist/components/cells/ScaffoldCell.d.ts.map +1 -0
- package/dist/components/cells/ScaffoldCell.js +10 -0
- package/dist/components/cells/ScaffoldCell.js.map +1 -0
- package/dist/components/cells/ScenarioCell.d.ts +12 -0
- package/dist/components/cells/ScenarioCell.d.ts.map +1 -0
- package/dist/components/cells/ScenarioCell.js +8 -0
- package/dist/components/cells/ScenarioCell.js.map +1 -0
- package/dist/components/cells/SurfaceCell.d.ts +14 -0
- package/dist/components/cells/SurfaceCell.d.ts.map +1 -0
- package/dist/components/cells/SurfaceCell.js +23 -0
- package/dist/components/cells/SurfaceCell.js.map +1 -0
- package/dist/components/cells/index.d.ts +9 -0
- package/dist/components/cells/index.d.ts.map +1 -0
- package/dist/components/cells/index.js +9 -0
- package/dist/components/cells/index.js.map +1 -0
- package/dist/components/cells/scaffoldMeta.d.ts +6 -0
- package/dist/components/cells/scaffoldMeta.d.ts.map +1 -0
- package/dist/components/cells/scaffoldMeta.js +47 -0
- package/dist/components/cells/scaffoldMeta.js.map +1 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts +6 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardSidebar.js +163 -0
- package/dist/components/dashboard/DashboardSidebar.js.map +1 -0
- package/dist/components/data/DataTable.d.ts +16 -0
- package/dist/components/data/DataTable.d.ts.map +1 -0
- package/dist/components/data/DataTable.js +54 -0
- package/dist/components/data/DataTable.js.map +1 -0
- package/dist/components/data/JsonViewer.d.ts +6 -0
- package/dist/components/data/JsonViewer.d.ts.map +1 -0
- package/dist/components/data/JsonViewer.js +5 -0
- package/dist/components/data/JsonViewer.js.map +1 -0
- package/dist/components/data/index.d.ts +3 -0
- package/dist/components/data/index.d.ts.map +1 -0
- package/dist/components/data/index.js +3 -0
- package/dist/components/data/index.js.map +1 -0
- package/dist/components/forms/SelectField.d.ts +22 -0
- package/dist/components/forms/SelectField.d.ts.map +1 -0
- package/dist/components/forms/SelectField.js +14 -0
- package/dist/components/forms/SelectField.js.map +1 -0
- package/dist/components/navigation/BackLink.d.ts +7 -0
- package/dist/components/navigation/BackLink.d.ts.map +1 -0
- package/dist/components/navigation/BackLink.js +6 -0
- package/dist/components/navigation/BackLink.js.map +1 -0
- package/dist/components/pages/PagesListView.d.ts +12 -0
- package/dist/components/pages/PagesListView.d.ts.map +1 -0
- package/dist/components/pages/PagesListView.js +19 -0
- package/dist/components/pages/PagesListView.js.map +1 -0
- package/dist/components/pages/PagesMapView.d.ts +15 -0
- package/dist/components/pages/PagesMapView.d.ts.map +1 -0
- package/dist/components/pages/PagesMapView.js +232 -0
- package/dist/components/pages/PagesMapView.js.map +1 -0
- package/dist/components/scanner/EventLog.d.ts +8 -0
- package/dist/components/scanner/EventLog.d.ts.map +1 -0
- package/dist/components/scanner/EventLog.js +18 -0
- package/dist/components/scanner/EventLog.js.map +1 -0
- package/dist/components/scanner/LiveCounters.d.ts +9 -0
- package/dist/components/scanner/LiveCounters.d.ts.map +1 -0
- package/dist/components/scanner/LiveCounters.js +33 -0
- package/dist/components/scanner/LiveCounters.js.map +1 -0
- package/dist/components/scanner/PhaseIndicator.d.ts +6 -0
- package/dist/components/scanner/PhaseIndicator.d.ts.map +1 -0
- package/dist/components/scanner/PhaseIndicator.js +31 -0
- package/dist/components/scanner/PhaseIndicator.js.map +1 -0
- package/dist/components/scanner/RunSummaryCard.d.ts +12 -0
- package/dist/components/scanner/RunSummaryCard.d.ts.map +1 -0
- package/dist/components/scanner/RunSummaryCard.js +7 -0
- package/dist/components/scanner/RunSummaryCard.js.map +1 -0
- package/dist/components/scanner/ScanForm.d.ts +9 -0
- package/dist/components/scanner/ScanForm.d.ts.map +1 -0
- package/dist/components/scanner/ScanForm.js +31 -0
- package/dist/components/scanner/ScanForm.js.map +1 -0
- package/dist/components/scanner/ScanProgressPanel.d.ts +16 -0
- package/dist/components/scanner/ScanProgressPanel.d.ts.map +1 -0
- package/dist/components/scanner/ScanProgressPanel.js +8 -0
- package/dist/components/scanner/ScanProgressPanel.js.map +1 -0
- package/dist/components/scanner/StatusBadge.d.ts +7 -0
- package/dist/components/scanner/StatusBadge.d.ts.map +1 -0
- package/dist/components/scanner/StatusBadge.js +65 -0
- package/dist/components/scanner/StatusBadge.js.map +1 -0
- package/dist/components/scanner/index.d.ts +8 -0
- package/dist/components/scanner/index.d.ts.map +1 -0
- package/dist/components/scanner/index.js +8 -0
- package/dist/components/scanner/index.js.map +1 -0
- package/dist/components/scenarios/AddScenarioForm.d.ts +14 -0
- package/dist/components/scenarios/AddScenarioForm.d.ts.map +1 -0
- package/dist/components/scenarios/AddScenarioForm.js +43 -0
- package/dist/components/scenarios/AddScenarioForm.js.map +1 -0
- package/dist/components/scripts/ScriptPanel.d.ts +17 -0
- package/dist/components/scripts/ScriptPanel.d.ts.map +1 -0
- package/dist/components/scripts/ScriptPanel.js +32 -0
- package/dist/components/scripts/ScriptPanel.js.map +1 -0
- package/dist/components/states/index.d.ts +19 -0
- package/dist/components/states/index.d.ts.map +1 -0
- package/dist/components/states/index.js +16 -0
- package/dist/components/states/index.js.map +1 -0
- package/dist/config/priorityConfig.d.ts +12 -0
- package/dist/config/priorityConfig.d.ts.map +1 -0
- package/dist/config/priorityConfig.js +39 -0
- package/dist/config/priorityConfig.js.map +1 -0
- package/dist/context/config.d.ts +53 -0
- package/dist/context/config.d.ts.map +1 -0
- package/dist/context/config.js +32 -0
- package/dist/context/config.js.map +1 -0
- package/dist/context/routing.d.ts +42 -0
- package/dist/context/routing.d.ts.map +1 -0
- package/dist/context/routing.js +33 -0
- package/dist/context/routing.js.map +1 -0
- package/dist/hooks/useDashboardEnvironmentContext.d.ts +15 -0
- package/dist/hooks/useDashboardEnvironmentContext.d.ts.map +1 -0
- package/dist/hooks/useDashboardEnvironmentContext.js +89 -0
- package/dist/hooks/useDashboardEnvironmentContext.js.map +1 -0
- package/dist/hooks/useEnvBasePath.d.ts +8 -0
- package/dist/hooks/useEnvBasePath.d.ts.map +1 -0
- package/dist/hooks/useEnvBasePath.js +12 -0
- package/dist/hooks/useEnvBasePath.js.map +1 -0
- package/dist/hooks/useLocalizedNavigate.d.ts +12 -0
- package/dist/hooks/useLocalizedNavigate.d.ts.map +1 -0
- package/dist/hooks/useLocalizedNavigate.js +14 -0
- package/dist/hooks/useLocalizedNavigate.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/BundleDetailPage.d.ts +2 -0
- package/dist/pages/BundleDetailPage.d.ts.map +1 -0
- package/dist/pages/BundleDetailPage.js +155 -0
- package/dist/pages/BundleDetailPage.js.map +1 -0
- package/dist/pages/BundlesPage.d.ts +2 -0
- package/dist/pages/BundlesPage.d.ts.map +1 -0
- package/dist/pages/BundlesPage.js +61 -0
- package/dist/pages/BundlesPage.js.map +1 -0
- package/dist/pages/DashboardOverview.d.ts +2 -0
- package/dist/pages/DashboardOverview.d.ts.map +1 -0
- package/dist/pages/DashboardOverview.js +179 -0
- package/dist/pages/DashboardOverview.js.map +1 -0
- package/dist/pages/FindingsListPage.d.ts +2 -0
- package/dist/pages/FindingsListPage.d.ts.map +1 -0
- package/dist/pages/FindingsListPage.js +160 -0
- package/dist/pages/FindingsListPage.js.map +1 -0
- package/dist/pages/PageDetailPage.d.ts +2 -0
- package/dist/pages/PageDetailPage.d.ts.map +1 -0
- package/dist/pages/PageDetailPage.js +120 -0
- package/dist/pages/PageDetailPage.js.map +1 -0
- package/dist/pages/PageGraphPage.d.ts +3 -0
- package/dist/pages/PageGraphPage.d.ts.map +1 -0
- package/dist/pages/PageGraphPage.js +72 -0
- package/dist/pages/PageGraphPage.js.map +1 -0
- package/dist/pages/PageStateDetailPage.d.ts +2 -0
- package/dist/pages/PageStateDetailPage.d.ts.map +1 -0
- package/dist/pages/PageStateDetailPage.js +69 -0
- package/dist/pages/PageStateDetailPage.js.map +1 -0
- package/dist/pages/PagesPage.d.ts +2 -0
- package/dist/pages/PagesPage.d.ts.map +1 -0
- package/dist/pages/PagesPage.js +83 -0
- package/dist/pages/PagesPage.js.map +1 -0
- package/dist/pages/PatternsPage.d.ts +2 -0
- package/dist/pages/PatternsPage.d.ts.map +1 -0
- package/dist/pages/PatternsPage.js +102 -0
- package/dist/pages/PatternsPage.js.map +1 -0
- package/dist/pages/PersonasPage.d.ts +2 -0
- package/dist/pages/PersonasPage.d.ts.map +1 -0
- package/dist/pages/PersonasPage.js +151 -0
- package/dist/pages/PersonasPage.js.map +1 -0
- package/dist/pages/RunRedirect.d.ts +2 -0
- package/dist/pages/RunRedirect.d.ts.map +1 -0
- package/dist/pages/RunRedirect.js +25 -0
- package/dist/pages/RunRedirect.js.map +1 -0
- package/dist/pages/RunSurfaceRunDetailPage.d.ts +2 -0
- package/dist/pages/RunSurfaceRunDetailPage.d.ts.map +1 -0
- package/dist/pages/RunSurfaceRunDetailPage.js +38 -0
- package/dist/pages/RunSurfaceRunDetailPage.js.map +1 -0
- package/dist/pages/RunSurfaceRunsPage.d.ts +2 -0
- package/dist/pages/RunSurfaceRunsPage.d.ts.map +1 -0
- package/dist/pages/RunSurfaceRunsPage.js +35 -0
- package/dist/pages/RunSurfaceRunsPage.js.map +1 -0
- package/dist/pages/RunTestInteractionRunDetailPage.d.ts +2 -0
- package/dist/pages/RunTestInteractionRunDetailPage.d.ts.map +1 -0
- package/dist/pages/RunTestInteractionRunDetailPage.js +55 -0
- package/dist/pages/RunTestInteractionRunDetailPage.js.map +1 -0
- package/dist/pages/RunTestInteractionRunsPage.d.ts +2 -0
- package/dist/pages/RunTestInteractionRunsPage.d.ts.map +1 -0
- package/dist/pages/RunTestInteractionRunsPage.js +38 -0
- package/dist/pages/RunTestInteractionRunsPage.js.map +1 -0
- package/dist/pages/RunnerGraphPage.d.ts +3 -0
- package/dist/pages/RunnerGraphPage.d.ts.map +1 -0
- package/dist/pages/RunnerGraphPage.js +86 -0
- package/dist/pages/RunnerGraphPage.js.map +1 -0
- package/dist/pages/ScaffoldDetailPage.d.ts +2 -0
- package/dist/pages/ScaffoldDetailPage.d.ts.map +1 -0
- package/dist/pages/ScaffoldDetailPage.js +56 -0
- package/dist/pages/ScaffoldDetailPage.js.map +1 -0
- package/dist/pages/ScaffoldsPage.d.ts +2 -0
- package/dist/pages/ScaffoldsPage.d.ts.map +1 -0
- package/dist/pages/ScaffoldsPage.js +35 -0
- package/dist/pages/ScaffoldsPage.js.map +1 -0
- package/dist/pages/ScanProgressPage.d.ts +2 -0
- package/dist/pages/ScanProgressPage.d.ts.map +1 -0
- package/dist/pages/ScanProgressPage.js +30 -0
- package/dist/pages/ScanProgressPage.js.map +1 -0
- package/dist/pages/SchedulesPage.d.ts +2 -0
- package/dist/pages/SchedulesPage.d.ts.map +1 -0
- package/dist/pages/SchedulesPage.js +165 -0
- package/dist/pages/SchedulesPage.js.map +1 -0
- package/dist/pages/StartScanPage.d.ts +2 -0
- package/dist/pages/StartScanPage.d.ts.map +1 -0
- package/dist/pages/StartScanPage.js +97 -0
- package/dist/pages/StartScanPage.js.map +1 -0
- package/dist/pages/TestInteractionDetailPage.d.ts +2 -0
- package/dist/pages/TestInteractionDetailPage.d.ts.map +1 -0
- package/dist/pages/TestInteractionDetailPage.js +60 -0
- package/dist/pages/TestInteractionDetailPage.js.map +1 -0
- package/dist/pages/TestInteractionsPage.d.ts +2 -0
- package/dist/pages/TestInteractionsPage.d.ts.map +1 -0
- package/dist/pages/TestInteractionsPage.js +96 -0
- package/dist/pages/TestInteractionsPage.js.map +1 -0
- package/dist/pages/TestRunDetailPage.d.ts +2 -0
- package/dist/pages/TestRunDetailPage.d.ts.map +1 -0
- package/dist/pages/TestRunDetailPage.js +81 -0
- package/dist/pages/TestRunDetailPage.js.map +1 -0
- package/dist/pages/TestRunsListPage.d.ts +2 -0
- package/dist/pages/TestRunsListPage.d.ts.map +1 -0
- package/dist/pages/TestRunsListPage.js +18 -0
- package/dist/pages/TestRunsListPage.js.map +1 -0
- package/dist/pages/TestScenarioDetailPage.d.ts +2 -0
- package/dist/pages/TestScenarioDetailPage.d.ts.map +1 -0
- package/dist/pages/TestScenarioDetailPage.js +101 -0
- package/dist/pages/TestScenarioDetailPage.js.map +1 -0
- package/dist/pages/TestScenariosPage.d.ts +2 -0
- package/dist/pages/TestScenariosPage.d.ts.map +1 -0
- package/dist/pages/TestScenariosPage.js +73 -0
- package/dist/pages/TestScenariosPage.js.map +1 -0
- package/dist/pages/TestSurfaceDetailPage.d.ts +2 -0
- package/dist/pages/TestSurfaceDetailPage.d.ts.map +1 -0
- package/dist/pages/TestSurfaceDetailPage.js +33 -0
- package/dist/pages/TestSurfaceDetailPage.js.map +1 -0
- package/dist/pages/TestSurfacesListPage.d.ts +2 -0
- package/dist/pages/TestSurfacesListPage.d.ts.map +1 -0
- package/dist/pages/TestSurfacesListPage.js +73 -0
- package/dist/pages/TestSurfacesListPage.js.map +1 -0
- package/dist/utils/formatDateTime.d.ts +13 -0
- package/dist/utils/formatDateTime.d.ts.map +1 -0
- package/dist/utils/formatDateTime.js +27 -0
- package/dist/utils/formatDateTime.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,QAAQ,MAAM,mCAAmC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE5E,SAAS,SAAS,CAAC,EAAE,MAAM,EAAkC;IAC3D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,OAAO,CACL,MAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,MAAM,EAAC,SAAS,EAAC,iBAAiB,aACjE,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EACrC,SAAS,EAAC,iHAAiH,aAE3H,gBAAM,SAAS,EAAC,iFAAiF,kBAC7F,MAAM,CAAC,SAAS,IACb,EACP,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,CAAC,UAAU,GAAI,EAC1C,eAAM,SAAS,EAAC,kEAAkE,YAC/E,MAAM,CAAC,WAAW,GACd,EACP,cACE,SAAS,EAAE,4DAA4D,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EACrG,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,GAAG,YAEhB,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,6BAA6B,GAAG,GACjF,IACC,EACR,QAAQ,IAAI,MAAM,CAAC,cAAc,IAAI,CACpC,eAAK,SAAS,EAAC,wFAAwF,aACrG,cAAK,SAAS,EAAC,sFAAsF,gCAE/F,EACN,cAAK,SAAS,EAAC,yKAAyK,YACrL,MAAM,CAAC,cAAc,GAClB,IACF,CACP,IACI,CACR,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,OAAO,EACP,OAAO,EACP,QAAQ,GAKT;IACC,OAAO,CACL,iBACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,0KAA0K,YAEpL,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,mEAAmE,YAC/E,QAAQ,GACL,EACN,cAAK,SAAS,EAAC,oEAAoE,YAChF,OAAO,CAAC,KAAK,GACV,EACN,eAAK,SAAS,EAAC,+CAA+C,mCACzC,OAAO,CAAC,EAAE,IACzB,IACF,EACN,eAAK,SAAS,EAAC,uCAAuC,aACpD,KAAC,WAAW,IAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,GAAI,EACzC,KAAC,WAAW,IAAC,MAAM,EAAE,OAAO,CAAC,SAAS,GAAI,IACtC,IACF,GACC,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,cAAc,EAGvC,CAAC;IACL,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC7D,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAE3C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,yBAAyB,CAAC;QAC9D,aAAa;QACb,OAAO;QACP,iBAAiB,EAAE,gBAAgB;QACnC,KAAK,EAAE,KAAK,IAAI,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK;KAChC,CAAC,CAAC;IACH,MAAM,EACJ,gBAAgB,EAChB,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,aAAa,GACrB,GAAG,8BAA8B,CAAC;QACjC,aAAa;QACb,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;QACpB,KAAK,EAAE,KAAK,IAAI,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;KAC5B,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,gBAAgB,CAAC,IAAI,IAAI,EAC/E,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CACrC,CAAC;IACF,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,cAAc,EAAE,2BAA2B;YAAE,OAAO,IAAI,CAAC;QAC9D,OAAO,CACL,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,cAAc,CAAC,2BAA2B,CAAC;YAC3F,IAAI,CACL,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACvC,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CACH,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,2BAA2B,KAAK,gBAAgB,CAAC,EAC9F,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CACrC,CAAC;IACF,MAAM,UAAU,GAAI,OAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/F,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,KAAK,IAAI,aAAa,CAAC;IAC3C,MAAM,aAAa,GAAG,SAAS,IAAI,eAAe,CAAC;IAEnD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAC,UAAU,IAAC,OAAO,EAAE,WAAW,GAAI,CAAC;IAC9C,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,KAAK,aAClB,KAAC,QAAQ,IACP,KAAK,EAAC,mBAAmB,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,oBAAoB,CAAC,GACxD,EAEF,eAAK,SAAS,EAAC,wCAAwC,aACrD,cAAI,SAAS,EAAC,qDAAqD,mCAC9C,SAAS,IACzB,EACL,KAAC,iBAAiB,IAAC,QAAQ,EAAC,aAAa,EAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,GAAI,IACnE,EAGN,eAAK,SAAS,EAAC,wCAAwC,aACrD,gBAAM,SAAS,EAAC,0CAA0C,qBAAM,SAAS,IAAQ,EAChF,cAAc,IAAI,KAAC,WAAW,IAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,GAAI,EAClE,cAAc,IAAI,KAAC,WAAW,IAAC,MAAM,EAAE,cAAc,CAAC,SAAS,GAAI,EACnE,cAAc,IAAI,KAAC,WAAW,IAAC,MAAM,EAAC,OAAO,GAAG,EAChD,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CACtC,KAAC,WAAW,IAAW,MAAM,EAAE,GAAG,IAAhB,GAAG,CAAiB,CACvC,CAAC,IACE,EAEL,cAAc,IAAI,CACjB,eAAK,SAAS,EAAC,gCAAgC,aAC7C,MAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,IAAI,aACnC,cAAK,SAAS,EAAC,mEAAmE,+BAE5E,EACN,eAAK,SAAS,EAAC,+CAA+C,uBACrD,cAAc,CAAC,YAAY,IAAI,MAAM,IACxC,EACN,eAAK,SAAS,EAAC,+CAA+C,6BAC/C,cAAc,CAAC,mBAAmB,IAAI,MAAM,IACrD,IACD,EAEP,MAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,IAAI,aACnC,cAAK,SAAS,EAAC,mEAAmE,kCAE5E,EACN,cAAK,SAAS,EAAC,+CAA+C,YAC3D,cAAc;oCACb,CAAC,CAAC,4CAA4C;oCAC9C,CAAC,CAAC,kDAAkD,GAClD,EACN,eAAK,SAAS,EAAC,+CAA+C,aAC3D,UAAU,CAAC,MAAM,aAAS,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,oBACzD,IACD,IACH,CACP,EAED,eAAK,SAAS,EAAC,gCAAgC,aAC7C,0BACE,aAAI,SAAS,EAAC,sFAAsF,2BAE/F,EACJ,iBAAiB,CAAC,CAAC,CAAC,CACnB,KAAC,cAAc,IACb,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAC,mBAAmB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,sBAAsB,iBAAiB,CAAC,EAAE,EAAE,CAAC,GAChF,CACH,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,WAAW,EAAC,0CAA0C,GAAG,CACtE,IACG,EAEN,0BACE,aAAI,SAAS,EAAC,sFAAsF,+BAE/F,EACJ,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAChC,KAAC,UAAU,IAAC,WAAW,EAAC,0DAA0D,GAAG,CACtF,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,WAAW,YACvB,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAChC,KAAC,cAAc,IAEb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,kBAAkB,EAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,sBAAsB,OAAO,CAAC,EAAE,EAAE,CAAC,IAHjE,OAAO,CAAC,EAAE,CAIf,CACH,CAAC,GACE,CACP,IACG,IACF,EAGN,aAAI,SAAS,EAAC,sFAAsF,6BAE/F,EAEJ,CAAC,aAAa,IAAI,CACjB,cAAK,SAAS,EAAC,MAAM,YACnB,KAAC,WAAW,IACV,IAAI,EAAC,aAAa,EAClB,EAAE,EAAE,gBAAgB,EACpB,QAAQ,EAAE,eAAe,gBAAgB,UAAU,GACnD,GACE,CACP,EAEA,aAAa,IAAI,KAAC,YAAY,IAAC,OAAO,EAAC,qCAAqC,GAAG,EAE/E,CAAC,aAAa,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAC5C,KAAC,UAAU,IAAC,WAAW,EAAC,+CAA+C,GAAG,CAC3E,EAEA,CAAC,aAAa,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1C,cAAK,SAAS,EAAC,WAAW,YACvB,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CACxB,KAAC,SAAS,IAAiB,MAAM,EAAE,MAAM,IAAzB,MAAM,CAAC,EAAE,CAAoB,CAC9C,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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":";AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAYrE,MAAM,YAAY,GAAG,kBAAkB,EAAsB,CAAC;AAE9D,MAAM,OAAO,GAAG;IACd,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC7B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CACZ,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,8CAA8C,YAAE,IAAI,CAAC,QAAQ,EAAE,GAAO,EACrF,cAAK,SAAS,EAAC,mDAAmD,YAC/D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,GAAG,GAClC,IACF,CACP;KACF,CAAC;IACF,YAAY,CAAC,QAAQ,CAAC,UAAU,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAC,WAAW,IAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAI;KACvD,CAAC;IACF,YAAY,CAAC,QAAQ,CAAC,UAAU,EAAE;QAChC,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,KAAK,GACT,CAAC,IAAI,CAAC;gBACJ,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,CAAC,KAAK,CAAC;oBACP,CAAC,CAAC,6BAA6B;oBAC/B,CAAC,CAAC,kCAAkC,CAAC;YAC3C,OAAO,eAAM,SAAS,EAAE,KAAK,YAAG,KAAK,GAAQ,CAAC;QAChD,CAAC;KACF,CAAC;IACF,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE;QACnC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CACZ,cAAK,SAAS,EAAC,sBAAsB,YAClC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAClC,eAEE,SAAS,EAAC,6FAA6F,YAEtG,GAAG,IAHC,GAAG,CAIH,CACR,CAAC,GACE,CACP;KACF,CAAC;IACF,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE;QACjC,MAAM,EAAE,QAAQ;KACjB,CAAC;CACH,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACtC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE;IAClC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE;IACrC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE;IAClC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE;IAClC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,gBAAgB,EAAE;CACxC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAE7D,MAAM,UAAU,oBAAoB;IAClC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,cAAc,EAAyC,CAAC;IACtF,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC7D,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAE5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,CAAC;IAEhE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,8BAA8B,CAAC;QAC5E,aAAa;QACb,OAAO;QACP,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;QACpB,KAAK,EAAE,KAAK,IAAI,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;KAC5B,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,gBAAgB;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,gBAAgB;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAuB,EAAE,EAAE;YACzD,IAAI,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAC5D,IAAI,cAAc,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,cAAc,CAAC;gBAAE,OAAO,KAAK,CAAC;YACnF,IAAI,YAAY,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,YAAY,CAAC,WAAW,EAAE;gBAAE,OAAO,KAAK,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAC,UAAU,IAAC,OAAO,EAAE,KAAK,GAAI,CAAC;IACxC,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,KAAK,aAClB,KAAC,OAAO,IAAC,KAAK,EAAC,mBAAmB,EAAC,WAAW,EAAC,EAAE,EAAC,OAAO,SAAG,EAC5D,aAAI,SAAS,EAAC,0DAA0D,kCAEnE,EAEL,eAAK,SAAS,EAAC,2BAA2B,aACxC,KAAC,WAAW,IACV,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE;4BACP,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;4BACjC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;yBAC3D,GACD,EAEF,KAAC,WAAW,IACV,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,gBAAgB,GACzB,EAEF,cAAK,SAAS,EAAC,6EAA6E,YACzF,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAC5B,iBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,EACtC,SAAS,EAAE,uBACT,YAAY,KAAK,MAAM;gCACrB,CAAC,CAAC,wBAAwB;gCAC1B,CAAC,CAAC,oGACN,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,EAAE,EAAE,YAE5E,MAAM,IATF,MAAM,CAUJ,CACV,CAAC,GACE,IACF,EAEN,KAAC,SAAS,IACR,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,OAAgB,EACzB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,CAAC,GAAuB,EAAE,EAAE,CACtC,QAAQ,CAAC,cAAc,UAAU,iBAAiB,KAAK,sBAAsB,GAAG,CAAC,EAAE,EAAE,CAAC,GAExF,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestRunDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/TestRunDetailPage.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,iBAAiB,gCAuVhC"}
|