@xyne/workflow-ui 0.3.0 → 0.4.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/dist/components/analytics/AnalyticsDashboard.d.ts.map +1 -1
- package/dist/components/analytics/AnalyticsDashboard.js +30 -7
- package/dist/components/analytics/AnalyticsDashboard.js.map +1 -1
- package/dist/components/analytics/FilteredRunsPanel.d.ts +8 -0
- package/dist/components/analytics/FilteredRunsPanel.d.ts.map +1 -0
- package/dist/components/analytics/FilteredRunsPanel.js +64 -0
- package/dist/components/analytics/FilteredRunsPanel.js.map +1 -0
- package/dist/components/analytics/RecentFailuresPanel.d.ts +9 -0
- package/dist/components/analytics/RecentFailuresPanel.d.ts.map +1 -0
- package/dist/components/analytics/RecentFailuresPanel.js +27 -0
- package/dist/components/analytics/RecentFailuresPanel.js.map +1 -0
- package/dist/components/analytics/StatCard.d.ts +3 -1
- package/dist/components/analytics/StatCard.d.ts.map +1 -1
- package/dist/components/analytics/StatCard.js +2 -2
- package/dist/components/analytics/StatCard.js.map +1 -1
- package/dist/components/analytics/TopErrorsPanel.d.ts +4 -5
- package/dist/components/analytics/TopErrorsPanel.d.ts.map +1 -1
- package/dist/components/analytics/TopErrorsPanel.js +18 -45
- package/dist/components/analytics/TopErrorsPanel.js.map +1 -1
- package/dist/components/analytics/WorkflowsTable.d.ts.map +1 -1
- package/dist/components/analytics/WorkflowsTable.js +25 -8
- package/dist/components/analytics/WorkflowsTable.js.map +1 -1
- package/dist/components/builder/v3/AiBuilderPanel.d.ts +12 -0
- package/dist/components/builder/v3/AiBuilderPanel.d.ts.map +1 -0
- package/dist/components/builder/v3/AiBuilderPanel.js +119 -0
- package/dist/components/builder/v3/AiBuilderPanel.js.map +1 -0
- package/dist/components/builder/v3/BranchContainer.d.ts +3 -1
- package/dist/components/builder/v3/BranchContainer.d.ts.map +1 -1
- package/dist/components/builder/v3/BranchContainer.js +42 -44
- package/dist/components/builder/v3/BranchContainer.js.map +1 -1
- package/dist/components/builder/v3/BuilderToolbar.d.ts +3 -1
- package/dist/components/builder/v3/BuilderToolbar.d.ts.map +1 -1
- package/dist/components/builder/v3/BuilderToolbar.js +5 -3
- package/dist/components/builder/v3/BuilderToolbar.js.map +1 -1
- package/dist/components/builder/v3/DeleteStepDialog.d.ts +14 -0
- package/dist/components/builder/v3/DeleteStepDialog.d.ts.map +1 -0
- package/dist/components/builder/v3/DeleteStepDialog.js +10 -0
- package/dist/components/builder/v3/DeleteStepDialog.js.map +1 -0
- package/dist/components/builder/v3/EnhancedSchemaFormRenderer.d.ts.map +1 -1
- package/dist/components/builder/v3/EnhancedSchemaFormRenderer.js +27 -4
- package/dist/components/builder/v3/EnhancedSchemaFormRenderer.js.map +1 -1
- package/dist/components/builder/v3/IssueBar.d.ts +16 -0
- package/dist/components/builder/v3/IssueBar.d.ts.map +1 -0
- package/dist/components/builder/v3/IssueBar.js +10 -0
- package/dist/components/builder/v3/IssueBar.js.map +1 -0
- package/dist/components/builder/v3/KeyValueEditor.d.ts.map +1 -1
- package/dist/components/builder/v3/KeyValueEditor.js +1 -1
- package/dist/components/builder/v3/KeyValueEditor.js.map +1 -1
- package/dist/components/builder/v3/SaveValidationDialog.d.ts +17 -0
- package/dist/components/builder/v3/SaveValidationDialog.d.ts.map +1 -0
- package/dist/components/builder/v3/SaveValidationDialog.js +16 -0
- package/dist/components/builder/v3/SaveValidationDialog.js.map +1 -0
- package/dist/components/builder/v3/SidePanel.d.ts +6 -1
- package/dist/components/builder/v3/SidePanel.d.ts.map +1 -1
- package/dist/components/builder/v3/SidePanel.js +2 -2
- package/dist/components/builder/v3/SidePanel.js.map +1 -1
- package/dist/components/builder/v3/StepConfigPanel.d.ts +4 -1
- package/dist/components/builder/v3/StepConfigPanel.d.ts.map +1 -1
- package/dist/components/builder/v3/StepConfigPanel.js +6 -3
- package/dist/components/builder/v3/StepConfigPanel.js.map +1 -1
- package/dist/components/builder/v3/StepNode.d.ts +5 -1
- package/dist/components/builder/v3/StepNode.d.ts.map +1 -1
- package/dist/components/builder/v3/StepNode.js +4 -3
- package/dist/components/builder/v3/StepNode.js.map +1 -1
- package/dist/components/builder/v3/TriggerConfigPanel.d.ts +4 -1
- package/dist/components/builder/v3/TriggerConfigPanel.d.ts.map +1 -1
- package/dist/components/builder/v3/TriggerConfigPanel.js +5 -2
- package/dist/components/builder/v3/TriggerConfigPanel.js.map +1 -1
- package/dist/components/builder/v3/TriggerNode.d.ts +3 -1
- package/dist/components/builder/v3/TriggerNode.d.ts.map +1 -1
- package/dist/components/builder/v3/TriggerNode.js +3 -3
- package/dist/components/builder/v3/TriggerNode.js.map +1 -1
- package/dist/components/builder/v3/VariablePickerPopover.d.ts +3 -1
- package/dist/components/builder/v3/VariablePickerPopover.d.ts.map +1 -1
- package/dist/components/builder/v3/VariablePickerPopover.js +2 -1
- package/dist/components/builder/v3/VariablePickerPopover.js.map +1 -1
- package/dist/components/builder/v3/VariableRefInput.d.ts +3 -1
- package/dist/components/builder/v3/VariableRefInput.d.ts.map +1 -1
- package/dist/components/builder/v3/VariableRefInput.js +2 -2
- package/dist/components/builder/v3/VariableRefInput.js.map +1 -1
- package/dist/components/builder/v3/WorkflowBuilderV3.d.ts +4 -1
- package/dist/components/builder/v3/WorkflowBuilderV3.d.ts.map +1 -1
- package/dist/components/builder/v3/WorkflowBuilderV3.js +86 -6
- package/dist/components/builder/v3/WorkflowBuilderV3.js.map +1 -1
- package/dist/components/builder/v3/WorkflowCanvas.d.ts +6 -1
- package/dist/components/builder/v3/WorkflowCanvas.d.ts.map +1 -1
- package/dist/components/builder/v3/WorkflowCanvas.js +2 -2
- package/dist/components/builder/v3/WorkflowCanvas.js.map +1 -1
- package/dist/components/builder/v3/WorkflowTree.d.ts +4 -1
- package/dist/components/builder/v3/WorkflowTree.d.ts.map +1 -1
- package/dist/components/builder/v3/WorkflowTree.js +7 -6
- package/dist/components/builder/v3/WorkflowTree.js.map +1 -1
- package/dist/components/dashboard/WorkflowDashboard.d.ts +4 -1
- package/dist/components/dashboard/WorkflowDashboard.d.ts.map +1 -1
- package/dist/components/dashboard/WorkflowDashboard.js +2 -2
- package/dist/components/dashboard/WorkflowDashboard.js.map +1 -1
- package/dist/components/execution/ExecutionTree.js +1 -1
- package/dist/components/execution/ExecutionTree.js.map +1 -1
- package/dist/components/execution/StepAgentPanels.d.ts +9 -0
- package/dist/components/execution/StepAgentPanels.d.ts.map +1 -0
- package/dist/components/execution/StepAgentPanels.js +133 -0
- package/dist/components/execution/StepAgentPanels.js.map +1 -0
- package/dist/components/execution/StepDetailPanel.d.ts.map +1 -1
- package/dist/components/execution/StepDetailPanel.js +3 -3
- package/dist/components/execution/StepDetailPanel.js.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/runs/RunsTable.d.ts.map +1 -1
- package/dist/components/runs/RunsTable.js +23 -7
- package/dist/components/runs/RunsTable.js.map +1 -1
- package/dist/components/shared/JsonTreeViewer.d.ts +9 -0
- package/dist/components/shared/JsonTreeViewer.d.ts.map +1 -0
- package/dist/components/shared/JsonTreeViewer.js +46 -0
- package/dist/components/shared/JsonTreeViewer.js.map +1 -0
- package/dist/hooks/use-ai-builder.d.ts +13 -0
- package/dist/hooks/use-ai-builder.d.ts.map +1 -0
- package/dist/hooks/use-ai-builder.js +35 -0
- package/dist/hooks/use-ai-builder.js.map +1 -0
- package/dist/hooks/use-analytics.d.ts +0 -2
- package/dist/hooks/use-analytics.d.ts.map +1 -1
- package/dist/hooks/use-analytics.js +21 -118
- package/dist/hooks/use-analytics.js.map +1 -1
- package/dist/hooks/use-variable-picker.js +18 -1
- package/dist/hooks/use-variable-picker.js.map +1 -1
- package/dist/hooks/use-workflow-builder.d.ts +2 -0
- package/dist/hooks/use-workflow-builder.d.ts.map +1 -1
- package/dist/hooks/use-workflow-builder.js +8 -0
- package/dist/hooks/use-workflow-builder.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/issue-mapping.d.ts +26 -0
- package/dist/utils/issue-mapping.d.ts.map +1 -0
- package/dist/utils/issue-mapping.js +40 -0
- package/dist/utils/issue-mapping.js.map +1 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AnalyticsDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgFD,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,uBAAuB,+BAgNxE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from 'react';
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
3
|
import { useAnalytics } from '../../hooks/use-analytics.js';
|
|
4
4
|
import { LoadingSpinner } from '../shared/LoadingSpinner.js';
|
|
5
5
|
import { cn } from '../shared/cn.js';
|
|
@@ -8,8 +8,10 @@ import { TimeRangeSelector } from './TimeRangeSelector.js';
|
|
|
8
8
|
import { RunsTimeSeries } from './RunsTimeSeries.js';
|
|
9
9
|
import { StatusPieChart } from './StatusPieChart.js';
|
|
10
10
|
import { TopErrorsPanel } from './TopErrorsPanel.js';
|
|
11
|
+
import { RecentFailuresPanel } from './RecentFailuresPanel.js';
|
|
11
12
|
import { WorkflowsTable } from './WorkflowsTable.js';
|
|
12
13
|
import { WorkflowRunsPanel } from './WorkflowRunsPanel.js';
|
|
14
|
+
import { FilteredRunsPanel } from './FilteredRunsPanel.js';
|
|
13
15
|
import { ExecutionViewer } from '../execution/ExecutionViewer.js';
|
|
14
16
|
function SectionCard({ title, children, className, }) {
|
|
15
17
|
return (_jsxs("div", { className: cn('flex flex-col gap-3 rounded-lg border border-[var(--wui-border)] bg-[var(--wui-bg)] p-4', className), children: [_jsx("h3", { className: "text-xs font-semibold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: title }), children] }));
|
|
@@ -38,6 +40,20 @@ export function AnalyticsDashboard({ className }) {
|
|
|
38
40
|
const [range, setRange] = useState(7);
|
|
39
41
|
const [view, setView] = useState({ level: 'workflows' });
|
|
40
42
|
const [workflowSearch, setWorkflowSearch] = useState('');
|
|
43
|
+
const [activeFilter, setActiveFilter] = useState(null);
|
|
44
|
+
const [hasTopErrors, setHasTopErrors] = useState(true);
|
|
45
|
+
const topErrorsSince = useMemo(() => new Date(Date.now() - range * 24 * 60 * 60 * 1000).toISOString(), [range]);
|
|
46
|
+
function handleRangeChange(r) {
|
|
47
|
+
setRange(r);
|
|
48
|
+
setHasTopErrors(true); // re-show while loading the new range
|
|
49
|
+
}
|
|
50
|
+
function handleStatClick(label, status) {
|
|
51
|
+
setActiveFilter((prev) => {
|
|
52
|
+
if (prev?.label === label)
|
|
53
|
+
return null;
|
|
54
|
+
return status ? { label, status } : { label };
|
|
55
|
+
});
|
|
56
|
+
}
|
|
41
57
|
const { data, isLoading, error } = useAnalytics(range);
|
|
42
58
|
if (isLoading) {
|
|
43
59
|
return (_jsx("div", { className: "flex h-full items-center justify-center", "aria-label": "Loading", children: _jsx(LoadingSpinner, { size: "lg" }) }));
|
|
@@ -49,12 +65,19 @@ export function AnalyticsDashboard({ className }) {
|
|
|
49
65
|
if (view.level === 'steps') {
|
|
50
66
|
return (_jsxs("div", { className: cn('flex h-full flex-col', className), children: [_jsxs("div", { className: "flex shrink-0 items-center gap-3 border-b border-[var(--wui-border)] bg-[var(--wui-bg)] px-4 py-2.5", children: [_jsxs("button", { type: "button", onClick: () => setView({ level: 'runs', workflowId: view.workflowId, workflowName: view.workflowName }), className: "flex items-center gap-1.5 rounded-md border border-[var(--wui-border)] px-2.5 py-1.5 text-xs font-medium text-[var(--wui-fg-muted)] transition-colors hover:border-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]", children: [_jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "15 18 9 12 15 6" }) }), "Back to Analytics"] }), _jsxs("div", { className: "flex items-center gap-1.5 text-xs text-[var(--wui-fg-muted)]", children: [_jsx("span", { children: view.workflowName }), _jsx("span", { children: "/" }), _jsx("span", { className: "font-mono font-medium text-[var(--wui-fg)]", children: view.executionId.slice(0, 8) })] })] }), _jsx("div", { className: "flex-1 overflow-hidden", children: _jsx(ExecutionViewer, { executionId: view.executionId }) })] }));
|
|
51
67
|
}
|
|
52
|
-
return (_jsxs("div", { className: cn('flex flex-col gap-4 p-6', className), children: [_jsx("div", { className: "flex justify-end", children: _jsx(TimeRangeSelector, { value: range, onChange:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
68
|
+
return (_jsxs("div", { className: cn('flex flex-col gap-4 p-6', className), children: [_jsx("div", { className: "flex justify-end", children: _jsx(TimeRangeSelector, { value: range, onChange: handleRangeChange }) }), _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-7", children: [_jsx(StatCard, { label: "Total Runs", value: data.totalRuns, color: "var(--wui-primary)", active: activeFilter?.label === 'Total Runs', onClick: () => handleStatClick('Total Runs', undefined) }), _jsx(StatCard, { label: "Success Rate", value: data.successRate, percent: true, color: "var(--wui-status-completed)", active: activeFilter?.label === 'Success Rate', onClick: () => handleStatClick('Success Rate', 'COMPLETED') }), _jsx(StatCard, { label: "Failed", value: data.byStatus['FAILED'] ?? 0, color: "var(--wui-status-failed)", active: activeFilter?.label === 'Failed', onClick: () => handleStatClick('Failed', 'FAILED') }), _jsx(StatCard, { label: "Running", value: data.byStatus['RUNNING'] ?? 0, color: "var(--wui-status-running)", active: activeFilter?.label === 'Running', onClick: () => handleStatClick('Running', 'RUNNING') }), _jsx(StatCard, { label: "Waiting", value: data.byStatus['EXTERNAL_WAIT'] ?? 0, color: "var(--wui-status-paused)", active: activeFilter?.label === 'Waiting', onClick: () => handleStatClick('Waiting', 'EXTERNAL_WAIT') }), _jsx(StatCard, { label: "Cancelled", value: data.byStatus['CANCELLED'] ?? 0, color: "var(--wui-fg-muted)", active: activeFilter?.label === 'Cancelled', onClick: () => handleStatClick('Cancelled', 'CANCELLED') }), _jsx(StatCard, { label: "Active Workflows", value: data.activeWorkflows, total: data.totalWorkflows, color: "var(--wui-cat-integration)" })] }), activeFilter && (_jsx(FilteredRunsPanel, { label: activeFilter.label, ...('status' in activeFilter ? { status: activeFilter.status } : {}), onClose: () => setActiveFilter(null), onSelectExecution: (executionId, workflowId) => {
|
|
69
|
+
const wf = data.byWorkflow.find((w) => w.workflowId === workflowId);
|
|
70
|
+
setActiveFilter(null);
|
|
71
|
+
setView({ level: 'steps', workflowId, workflowName: wf?.name ?? workflowId, executionId });
|
|
72
|
+
} })), _jsxs("div", { className: "flex gap-4", children: [_jsx(SectionCard, { title: "Runs per day", className: "min-w-0 flex-1 overflow-hidden", children: _jsx(RunsTimeSeries, { data: data.runsByDay, height: 200 }) }), _jsx(SectionCard, { title: "Status breakdown", className: "w-[280px] shrink-0", children: _jsx(StatusPieChart, { byStatus: data.byStatus, height: 200 }) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [data.recentFailures.length > 0 && (_jsx(SectionCard, { title: "Recent Failures", children: _jsx(RecentFailuresPanel, { failures: data.recentFailures, onSelect: (f) => setView({
|
|
73
|
+
level: 'steps',
|
|
74
|
+
workflowId: f.workflowId,
|
|
75
|
+
workflowName: f.workflowName,
|
|
76
|
+
executionId: f.executionId,
|
|
77
|
+
}) }) })), _jsx(SectionCard, { title: "Top Errors", className: hasTopErrors ? '' : 'hidden', children: _jsx(TopErrorsPanel, { since: topErrorsSince, onLoad: setHasTopErrors, onSelectRun: (executionId, workflowId) => {
|
|
78
|
+
const wf = data.byWorkflow.find((w) => w.workflowId === workflowId);
|
|
79
|
+
setView({ level: 'steps', workflowId, workflowName: wf?.name ?? workflowId, executionId });
|
|
80
|
+
} }) })] }), _jsxs(SectionCard, { title: "Explore", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx(Breadcrumb, { view: view, onNavigate: setView }), view.level === 'workflows' && (_jsxs("div", { className: "relative w-full max-w-xs", children: [_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-[var(--wui-fg-muted)]", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }), _jsx("input", { type: "text", value: workflowSearch, onChange: (e) => setWorkflowSearch(e.target.value), placeholder: "Search workflows...", className: "w-full rounded-md border border-[var(--wui-border)] bg-[var(--wui-bg)] py-1.5 pl-8 pr-3 text-xs text-[var(--wui-fg)] outline-none transition-colors placeholder:text-[var(--wui-fg-muted)] focus:border-[var(--wui-primary)]" })] }))] }), view.level === 'workflows' && (_jsx(WorkflowsTable, { data: data.byWorkflow, search: workflowSearch, onSelectWorkflow: (workflowId) => {
|
|
58
81
|
const wf = data.byWorkflow.find((w) => w.workflowId === workflowId);
|
|
59
82
|
setView({ level: 'runs', workflowId, workflowName: wf?.name ?? workflowId });
|
|
60
83
|
} })), view.level === 'runs' && (_jsx(WorkflowRunsPanel, { workflowId: view.workflowId, onSelectExecution: (executionId) => setView({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsDashboard.js","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AnalyticsDashboard.js","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface FilteredRunsPanelProps {
|
|
2
|
+
label: string;
|
|
3
|
+
status?: string | undefined;
|
|
4
|
+
onSelectExecution: (executionId: string, workflowId: string) => void;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function FilteredRunsPanel({ label, status, onSelectExecution, onClose }: FilteredRunsPanelProps): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=FilteredRunsPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilteredRunsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/FilteredRunsPanel.tsx"],"names":[],"mappings":"AA+BA,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,iBAAiB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,sBAAsB,+BAuGtG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
4
|
+
import { useRunsList } from '../../hooks/use-runs-list.js';
|
|
5
|
+
import { StatusBadge } from '../shared/StatusBadge.js';
|
|
6
|
+
import { LoadingSpinner } from '../shared/LoadingSpinner.js';
|
|
7
|
+
const ROW_HEIGHT = 48;
|
|
8
|
+
const PANEL_HEIGHT = 380;
|
|
9
|
+
function mapStatus(status) {
|
|
10
|
+
switch (status) {
|
|
11
|
+
case 'COMPLETED': return 'completed';
|
|
12
|
+
case 'FAILED': return 'failed';
|
|
13
|
+
case 'RUNNING': return 'running';
|
|
14
|
+
case 'EXTERNAL_WAIT': return 'paused';
|
|
15
|
+
case 'CANCELLED': return 'cancelled';
|
|
16
|
+
default: return 'pending';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function timeAgo(date) {
|
|
20
|
+
const d = date instanceof Date ? date : new Date(date);
|
|
21
|
+
const sec = Math.floor((Date.now() - d.getTime()) / 1000);
|
|
22
|
+
if (sec < 60)
|
|
23
|
+
return `${sec}s ago`;
|
|
24
|
+
const min = Math.floor(sec / 60);
|
|
25
|
+
if (min < 60)
|
|
26
|
+
return `${min}m ago`;
|
|
27
|
+
const hr = Math.floor(min / 60);
|
|
28
|
+
if (hr < 24)
|
|
29
|
+
return `${hr}h ago`;
|
|
30
|
+
return `${Math.floor(hr / 24)}d ago`;
|
|
31
|
+
}
|
|
32
|
+
export function FilteredRunsPanel({ label, status, onSelectExecution, onClose }) {
|
|
33
|
+
const { executions, isLoading, error, hasMore, loadMore } = useRunsList(status ? { status } : {});
|
|
34
|
+
const scrollRef = useRef(null);
|
|
35
|
+
const rowVirtualizer = useVirtualizer({
|
|
36
|
+
count: executions.length,
|
|
37
|
+
getScrollElement: () => scrollRef.current,
|
|
38
|
+
estimateSize: () => ROW_HEIGHT,
|
|
39
|
+
overscan: 5,
|
|
40
|
+
});
|
|
41
|
+
// Load more when scrolled near the bottom
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
const el = scrollRef.current;
|
|
44
|
+
if (!el)
|
|
45
|
+
return;
|
|
46
|
+
const onScroll = () => {
|
|
47
|
+
if (hasMore && el.scrollTop + el.clientHeight >= el.scrollHeight - ROW_HEIGHT * 2) {
|
|
48
|
+
loadMore();
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
el.addEventListener('scroll', onScroll, { passive: true });
|
|
52
|
+
return () => el.removeEventListener('scroll', onScroll);
|
|
53
|
+
}, [hasMore, loadMore]);
|
|
54
|
+
const virtualRows = rowVirtualizer.getVirtualItems();
|
|
55
|
+
const totalSize = rowVirtualizer.getTotalSize();
|
|
56
|
+
const paddingTop = virtualRows[0]?.start ?? 0;
|
|
57
|
+
const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows[virtualRows.length - 1]?.end ?? 0) : 0;
|
|
58
|
+
return (_jsxs("div", { className: "flex flex-col gap-3 rounded-lg border border-[var(--wui-border)] bg-[var(--wui-bg)] p-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("h3", { className: "text-xs font-semibold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: [label, " \u2014 Latest Runs"] }), _jsx("button", { type: "button", onClick: onClose, className: "rounded p-1 text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)]", "aria-label": "Close", children: _jsxs("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), _jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] }), isLoading ? (_jsx("div", { className: "flex items-center justify-center", style: { height: PANEL_HEIGHT }, children: _jsx(LoadingSpinner, { size: "sm" }) })) : error ? (_jsx("div", { className: "flex items-center justify-center text-xs text-[var(--wui-status-failed)]", style: { height: PANEL_HEIGHT }, children: "Failed to load runs" })) : executions.length === 0 ? (_jsx("div", { className: "flex items-center justify-center text-xs text-[var(--wui-fg-muted)]", style: { height: PANEL_HEIGHT }, children: "No runs found" })) : (_jsxs("div", { ref: scrollRef, style: { height: PANEL_HEIGHT, overflowY: 'auto' }, className: "rounded-md border border-[var(--wui-border)]", children: [_jsx("div", { className: "sticky top-0 z-10 grid grid-cols-[2fr_1fr_1fr_1fr] border-b border-[var(--wui-border)] bg-[var(--wui-bg)] px-3 py-2", children: ['Status', 'Execution ID', 'Workflow', 'Started'].map((col) => (_jsx("span", { className: "text-[10px] font-semibold uppercase tracking-widest text-[var(--wui-fg-muted)]", children: col }, col))) }), _jsxs("div", { style: { height: totalSize, position: 'relative' }, children: [paddingTop > 0 && _jsx("div", { style: { height: paddingTop } }), virtualRows.map((vRow) => {
|
|
59
|
+
const exec = executions[vRow.index];
|
|
60
|
+
const variant = mapStatus(exec.status);
|
|
61
|
+
return (_jsxs("div", { onClick: () => onSelectExecution(exec.id, exec.workflowId), style: { position: 'absolute', top: 0, left: 0, width: '100%', height: ROW_HEIGHT, transform: `translateY(${vRow.start}px)` }, className: "grid cursor-pointer grid-cols-[2fr_1fr_1fr_1fr] items-center border-b border-[var(--wui-border)] px-3 transition-colors hover:bg-[var(--wui-bg-subtle)]", children: [_jsx(StatusBadge, { status: variant }), _jsx("code", { className: "font-mono text-[11px] text-[var(--wui-fg-muted)]", children: exec.id.slice(0, 8) }), _jsx("span", { className: "truncate text-[12px] text-[var(--wui-fg)]", children: exec.workflowId }), _jsx("span", { className: "text-[11px] text-[var(--wui-fg-muted)]", children: timeAgo(exec.createdAt) })] }, exec.id));
|
|
62
|
+
}), paddingBottom > 0 && _jsx("div", { style: { height: paddingBottom } })] }), hasMore && (_jsx("div", { className: "flex items-center justify-center py-2 text-[11px] text-[var(--wui-fg-muted)]", children: "Loading more\u2026" }))] }))] }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=FilteredRunsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilteredRunsPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/FilteredRunsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AnalyticsData } from '../../hooks/use-analytics.js';
|
|
2
|
+
type RecentFailure = AnalyticsData['recentFailures'][number];
|
|
3
|
+
export interface RecentFailuresPanelProps {
|
|
4
|
+
failures: RecentFailure[];
|
|
5
|
+
onSelect: (failure: RecentFailure) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function RecentFailuresPanel({ failures, onSelect }: RecentFailuresPanelProps): import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=RecentFailuresPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecentFailuresPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/RecentFailuresPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,KAAK,aAAa,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C;AAKD,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,wBAAwB,+BAiDnF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
4
|
+
const ROW_HEIGHT = 46;
|
|
5
|
+
const MAX_VISIBLE_ROWS = 6;
|
|
6
|
+
export function RecentFailuresPanel({ failures, onSelect }) {
|
|
7
|
+
const parentRef = useRef(null);
|
|
8
|
+
const virtualizer = useVirtualizer({
|
|
9
|
+
count: failures.length,
|
|
10
|
+
getScrollElement: () => parentRef.current,
|
|
11
|
+
estimateSize: () => ROW_HEIGHT,
|
|
12
|
+
overscan: 3,
|
|
13
|
+
});
|
|
14
|
+
const containerHeight = Math.min(failures.length, MAX_VISIBLE_ROWS) * ROW_HEIGHT;
|
|
15
|
+
return (_jsx("div", { ref: parentRef, style: { height: containerHeight, overflowY: 'auto' }, children: _jsx("div", { style: { height: virtualizer.getTotalSize(), position: 'relative' }, children: virtualizer.getVirtualItems().map((vItem) => {
|
|
16
|
+
const f = failures[vItem.index];
|
|
17
|
+
return (_jsxs("button", { type: "button", onClick: () => onSelect(f), style: {
|
|
18
|
+
position: 'absolute',
|
|
19
|
+
top: 0,
|
|
20
|
+
left: 0,
|
|
21
|
+
width: '100%',
|
|
22
|
+
height: ROW_HEIGHT,
|
|
23
|
+
transform: `translateY(${vItem.start}px)`,
|
|
24
|
+
}, className: "flex items-center gap-3 border-b border-[var(--wui-border)] px-1 text-left transition-colors hover:bg-[var(--wui-bg-subtle)]", children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-[var(--wui-status-failed)]" }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-xs font-medium text-[var(--wui-fg)]", children: f.workflowName }), _jsx("span", { className: "block font-mono text-[11px] text-[var(--wui-fg-muted)]", children: f.executionId.slice(0, 8) })] }), _jsx("span", { className: "shrink-0 text-[11px] text-[var(--wui-fg-muted)]", children: f.createdAt.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) }), _jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0 text-[var(--wui-fg-muted)]", children: _jsx("polyline", { points: "9 18 15 12 9 6" }) })] }, f.executionId));
|
|
25
|
+
}) }) }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=RecentFailuresPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecentFailuresPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/RecentFailuresPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAUzD,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAA4B;IAClF,MAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,cAAc,CAAC;QACjC,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO;QACzC,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU;QAC9B,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,UAAU,CAAC;IAEjF,OAAO,CACL,cAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,YACxE,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,YACrE,WAAW,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC;gBACjC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,KAAK,EAAE;wBACL,QAAQ,EAAE,UAAU;wBACpB,GAAG,EAAE,CAAC;wBACN,IAAI,EAAE,CAAC;wBACP,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,UAAU;wBAClB,SAAS,EAAE,cAAc,KAAK,CAAC,KAAK,KAAK;qBAC1C,EACD,SAAS,EAAC,8HAA8H,aAExI,eAAM,SAAS,EAAC,iEAAiE,GAAG,EACpF,gBAAM,SAAS,EAAC,gBAAgB,aAC9B,eAAM,SAAS,EAAC,yDAAyD,YAAE,CAAC,CAAC,YAAY,GAAQ,EACjG,eAAM,SAAS,EAAC,wDAAwD,YAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAQ,IACtG,EACP,eAAM,SAAS,EAAC,iDAAiD,YAC9D,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GACzG,EACP,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,SAAS,EAAC,qCAAqC,YAC5L,mBAAU,MAAM,EAAC,gBAAgB,GAAG,GAChC,KAvBD,CAAC,CAAC,WAAW,CAwBX,CACV,CAAC;YACJ,CAAC,CAAC,GACE,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -5,6 +5,8 @@ export interface StatCardProps {
|
|
|
5
5
|
total?: number;
|
|
6
6
|
color?: string;
|
|
7
7
|
className?: string;
|
|
8
|
+
active?: boolean;
|
|
9
|
+
onClick?: () => void;
|
|
8
10
|
}
|
|
9
|
-
export declare function StatCard({ label, value, percent, total, color, className }: StatCardProps): import("react").JSX.Element;
|
|
11
|
+
export declare function StatCard({ label, value, percent, total, color, className, active, onClick }: StatCardProps): import("react").JSX.Element;
|
|
10
12
|
//# sourceMappingURL=StatCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatCard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"StatCard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAA4B,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,aAAa,+BAsCjI"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from '../shared/cn.js';
|
|
3
|
-
export function StatCard({ label, value, percent, total, color = 'var(--wui-primary)', className }) {
|
|
3
|
+
export function StatCard({ label, value, percent, total, color = 'var(--wui-primary)', className, active, onClick }) {
|
|
4
4
|
const display = total !== undefined
|
|
5
5
|
? `${value}/${total}`
|
|
6
6
|
: percent
|
|
7
7
|
? `${value}%`
|
|
8
8
|
: String(value);
|
|
9
|
-
return (_jsxs("div", { className: cn('flex flex-col justify-center gap-1.5 rounded-lg border
|
|
9
|
+
return (_jsxs("div", { onClick: onClick, className: cn('relative flex flex-col justify-center gap-1.5 overflow-hidden rounded-lg border bg-[var(--wui-bg)] px-4 py-5 transition-all duration-150', onClick && 'cursor-pointer', active ? 'border-[var(--wui-border)] shadow-md' : 'border-[var(--wui-border)]', className), style: active ? { boxShadow: `0 0 0 2px ${color}40, 0 4px 12px ${color}20` } : undefined, children: [_jsx("div", { className: "absolute left-0 top-0 h-[3px] w-full rounded-t-lg opacity-70", style: { background: `linear-gradient(90deg, ${color}, transparent)` } }), _jsx("div", { className: "absolute -left-4 -top-4 h-16 w-16 rounded-full opacity-10 blur-2xl", style: { background: color } }), _jsx("span", { className: "relative text-3xl font-bold tabular-nums leading-none", style: { color }, children: display }), _jsx("span", { className: "relative text-xs text-[var(--wui-fg-muted)]", children: label })] }));
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=StatCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatCard.js","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"StatCard.js","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAarC,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,oBAAoB,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAiB;IAChI,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS;QACjC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE;QACrB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,GAAG,KAAK,GAAG;YACb,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAElB,OAAO,CACL,eACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,0IAA0I,EAC1I,OAAO,IAAI,gBAAgB,EAC3B,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,4BAA4B,EAC9E,SAAS,CACV,EACD,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,KAAK,kBAAkB,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,aAGxF,cACE,SAAS,EAAC,8DAA8D,EACxE,KAAK,EAAE,EAAE,UAAU,EAAE,0BAA0B,KAAK,gBAAgB,EAAE,GACtE,EAEF,cACE,SAAS,EAAC,oEAAoE,EAC9E,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAC5B,EAEF,eACE,SAAS,EAAC,uDAAuD,EACjE,KAAK,EAAE,EAAE,KAAK,EAAE,YAEf,OAAO,GACH,EACP,eAAM,SAAS,EAAC,6CAA6C,YAAE,KAAK,GAAQ,IACxE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { AnalyticsData } from '../../hooks/use-analytics.js';
|
|
2
|
-
type RecentFailure = AnalyticsData['recentFailures'][number];
|
|
3
1
|
export interface TopErrorsPanelProps {
|
|
4
|
-
|
|
2
|
+
since: string;
|
|
3
|
+
onSelectRun?: (executionId: string, workflowId: string) => void;
|
|
4
|
+
onLoad?: (hasErrors: boolean) => void;
|
|
5
5
|
}
|
|
6
|
-
export declare function TopErrorsPanel({
|
|
7
|
-
export {};
|
|
6
|
+
export declare function TopErrorsPanel({ since, onSelectRun, onLoad }: TopErrorsPanelProps): import("react").JSX.Element;
|
|
8
7
|
//# sourceMappingURL=TopErrorsPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopErrorsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/TopErrorsPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TopErrorsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/TopErrorsPanel.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,mBAAmB,+BA+FjF"}
|
|
@@ -2,62 +2,32 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
3
|
import { useWorkflowClient } from '../../hooks/use-workflow-client.js';
|
|
4
4
|
import { LoadingSpinner } from '../shared/LoadingSpinner.js';
|
|
5
|
-
function parseFailedStepError(data) {
|
|
6
|
-
if (!data)
|
|
7
|
-
return undefined;
|
|
8
|
-
try {
|
|
9
|
-
return JSON.parse(data).error;
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
return undefined;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
5
|
function truncate(str, max) {
|
|
16
6
|
return str.length > max ? str.slice(0, max) + '…' : str;
|
|
17
7
|
}
|
|
18
|
-
export function TopErrorsPanel({
|
|
8
|
+
export function TopErrorsPanel({ since, onSelectRun, onLoad }) {
|
|
19
9
|
const client = useWorkflowClient();
|
|
20
10
|
const [groups, setGroups] = useState([]);
|
|
21
11
|
const [isLoading, setIsLoading] = useState(true);
|
|
12
|
+
const [expandedIndex, setExpandedIndex] = useState(null);
|
|
22
13
|
useEffect(() => {
|
|
23
|
-
if (failures.length === 0) {
|
|
24
|
-
setGroups([]);
|
|
25
|
-
setIsLoading(false);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
14
|
let cancelled = false;
|
|
29
15
|
setIsLoading(true);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
existing.count++;
|
|
42
|
-
existing.workflows.add(workflowName);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
map.set(error, { count: 1, workflows: new Set([workflowName]) });
|
|
46
|
-
}
|
|
16
|
+
setExpandedIndex(null);
|
|
17
|
+
void client.analytics.topErrors({ since, limit: 5 }).then((res) => {
|
|
18
|
+
if (!cancelled) {
|
|
19
|
+
setGroups(res.topErrors);
|
|
20
|
+
setIsLoading(false);
|
|
21
|
+
onLoad?.(res.topErrors.length > 0);
|
|
22
|
+
}
|
|
23
|
+
}).catch(() => {
|
|
24
|
+
if (!cancelled) {
|
|
25
|
+
setIsLoading(false);
|
|
26
|
+
onLoad?.(false);
|
|
47
27
|
}
|
|
48
|
-
const sorted = Array.from(map.entries())
|
|
49
|
-
.map(([message, { count, workflows }]) => ({
|
|
50
|
-
message,
|
|
51
|
-
count,
|
|
52
|
-
workflows: Array.from(workflows),
|
|
53
|
-
}))
|
|
54
|
-
.sort((a, b) => b.count - a.count)
|
|
55
|
-
.slice(0, 5);
|
|
56
|
-
setGroups(sorted);
|
|
57
|
-
setIsLoading(false);
|
|
58
28
|
});
|
|
59
29
|
return () => { cancelled = true; };
|
|
60
|
-
}, [client,
|
|
30
|
+
}, [client, since]);
|
|
61
31
|
if (isLoading) {
|
|
62
32
|
return (_jsx("div", { className: "flex h-32 items-center justify-center", children: _jsx(LoadingSpinner, { size: "sm" }) }));
|
|
63
33
|
}
|
|
@@ -65,6 +35,9 @@ export function TopErrorsPanel({ failures }) {
|
|
|
65
35
|
return (_jsx("div", { className: "flex h-16 items-center justify-center text-xs text-[var(--wui-fg-muted)]", children: "No errors in this period" }));
|
|
66
36
|
}
|
|
67
37
|
const maxCount = groups[0]?.count ?? 1;
|
|
68
|
-
return (_jsx("div", { className: "flex flex-col gap-2
|
|
38
|
+
return (_jsx("div", { className: "flex flex-col gap-2", children: groups.map((g, i) => {
|
|
39
|
+
const isExpanded = expandedIndex === i;
|
|
40
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("button", { type: "button", onClick: () => setExpandedIndex(isExpanded ? null : i), className: "flex w-full items-center gap-2 text-left", children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-[12px] font-medium text-[var(--wui-fg)]", title: g.message, children: truncate(g.message, 60) }), _jsxs("span", { className: "shrink-0 rounded-full bg-[var(--wui-status-failed)]/15 px-2 py-0.5 text-[11px] font-semibold text-[var(--wui-status-failed)]", children: ["\u00D7", g.count] }), _jsx("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", className: `shrink-0 text-[var(--wui-fg-muted)] transition-transform ${isExpanded ? 'rotate-180' : ''}`, children: _jsx("polyline", { points: "6 9 12 15 18 9" }) })] }), _jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-[var(--wui-bg-subtle)]", children: _jsx("div", { className: "h-full rounded-full bg-[var(--wui-status-failed)]/60", style: { width: `${Math.round((g.count / maxCount) * 100)}%` } }) }), isExpanded && (_jsx("div", { className: "mt-1 flex max-h-[120px] flex-wrap gap-1 overflow-y-auto", children: g.runs.map((run) => (_jsx("button", { type: "button", onClick: () => onSelectRun?.(run.id, run.workflowId), className: "rounded-md border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--wui-fg-muted)] transition-colors hover:border-[var(--wui-primary)] hover:text-[var(--wui-primary)]", children: run.id.slice(0, 8) }, run.id))) }))] }, i));
|
|
41
|
+
}) }));
|
|
69
42
|
}
|
|
70
43
|
//# sourceMappingURL=TopErrorsPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopErrorsPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/TopErrorsPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"TopErrorsPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/TopErrorsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsTable.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowsTable.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WorkflowsTable.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowsTable.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,KAAK,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsCD,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAW,EAAE,SAAS,EAAE,EAAE,mBAAmB,+BAsIrG"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, useState } from 'react';
|
|
2
|
+
import { useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
3
4
|
import { StatusBadge } from '../shared/StatusBadge.js';
|
|
4
5
|
import { cn } from '../shared/cn.js';
|
|
5
6
|
const STATUS_VARIANTS = {
|
|
@@ -32,10 +33,23 @@ function formatLastRun(date) {
|
|
|
32
33
|
minute: '2-digit',
|
|
33
34
|
});
|
|
34
35
|
}
|
|
36
|
+
const ROW_HEIGHT = 36;
|
|
37
|
+
const VISIBLE_ROWS = 10;
|
|
35
38
|
export function WorkflowsTable({ data, onSelectWorkflow, search = '', className }) {
|
|
36
39
|
const statuses = useMemo(() => Array.from(new Set(data.map((r) => r.status))).sort(), [data]);
|
|
37
40
|
const [activeTab, setActiveTab] = useState('ALL');
|
|
38
41
|
const rows = (activeTab === 'ALL' ? data : data.filter((r) => r.status === activeTab)).filter((r) => r.name.toLowerCase().includes(search.trim().toLowerCase()));
|
|
42
|
+
const scrollRef = useRef(null);
|
|
43
|
+
const rowVirtualizer = useVirtualizer({
|
|
44
|
+
count: rows.length,
|
|
45
|
+
getScrollElement: () => scrollRef.current,
|
|
46
|
+
estimateSize: () => ROW_HEIGHT,
|
|
47
|
+
overscan: 5,
|
|
48
|
+
});
|
|
49
|
+
const virtualRows = rowVirtualizer.getVirtualItems();
|
|
50
|
+
const totalSize = rowVirtualizer.getTotalSize();
|
|
51
|
+
const paddingTop = virtualRows[0]?.start ?? 0;
|
|
52
|
+
const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows[virtualRows.length - 1]?.end ?? 0) : 0;
|
|
39
53
|
return (_jsxs("div", { className: cn('flex flex-col gap-3', className), children: [_jsxs("div", { className: "flex items-center gap-1 border-b border-[var(--wui-border)]", children: [_jsxs("button", { onClick: () => setActiveTab('ALL'), className: cn('px-3 py-1.5 text-xs font-medium transition-colors', activeTab === 'ALL'
|
|
40
54
|
? 'border-b-2 border-[var(--wui-primary)] text-[var(--wui-fg)]'
|
|
41
55
|
: 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: ["All (", data.length, ")"] }), statuses.map((status) => {
|
|
@@ -43,12 +57,15 @@ export function WorkflowsTable({ data, onSelectWorkflow, search = '', className
|
|
|
43
57
|
return (_jsxs("button", { onClick: () => setActiveTab(status), className: cn('px-3 py-1.5 text-xs font-medium transition-colors', activeTab === status
|
|
44
58
|
? 'border-b-2 border-[var(--wui-primary)] text-[var(--wui-fg)]'
|
|
45
59
|
: 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: [statusLabel(status), " (", count, ")"] }, status));
|
|
46
|
-
})] }), rows.length === 0 ? (_jsx("div", { className: "flex h-24 items-center justify-center text-xs text-[var(--wui-fg-muted)]", children: "No workflows" })) : (_jsxs("table", { className: "w-full text-left text-xs", children: [_jsx("thead", { children: _jsxs("tr", { className: "text-[10px] uppercase tracking-wider text-[var(--wui-fg-muted)]", children: [_jsx("th", { className: "py-1.5 font-medium", children: "Workflow" }), _jsx("th", { className: "py-1.5 font-medium", children: "Status" }), _jsx("th", { className: "py-1.5 font-medium", children: "Trigger" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Total Runs" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Failed" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Failure Rate" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Last Run" })] }) }),
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
60
|
+
})] }), rows.length === 0 ? (_jsx("div", { className: "flex h-24 items-center justify-center text-xs text-[var(--wui-fg-muted)]", children: "No workflows" })) : (_jsx("div", { ref: scrollRef, style: { height: VISIBLE_ROWS * ROW_HEIGHT, overflowY: 'auto' }, children: _jsxs("table", { className: "w-full text-left text-xs", style: { tableLayout: 'fixed', borderCollapse: 'collapse' }, children: [_jsxs("colgroup", { children: [_jsx("col", { style: { width: '30%' } }), _jsx("col", { style: { width: '14%' } }), _jsx("col", { style: { width: '14%' } }), _jsx("col", { style: { width: '10%' } }), _jsx("col", { style: { width: '9%' } }), _jsx("col", { style: { width: '12%' } }), _jsx("col", { style: { width: '11%' } })] }), _jsx("thead", { className: "sticky top-0 z-10 bg-[var(--wui-bg)]", children: _jsxs("tr", { className: "text-[10px] uppercase tracking-wider text-[var(--wui-fg-muted)]", children: [_jsx("th", { className: "py-1.5 font-medium", children: "Workflow" }), _jsx("th", { className: "py-1.5 font-medium", children: "Status" }), _jsx("th", { className: "py-1.5 font-medium", children: "Trigger" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Total Runs" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Failed" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Failure Rate" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Last Run" })] }) }), _jsxs("tbody", { children: [paddingTop > 0 && (_jsx("tr", { children: _jsx("td", { colSpan: 7, style: { height: paddingTop, padding: 0, border: 'none' } }) })), virtualRows.map((vRow) => {
|
|
61
|
+
const row = rows[vRow.index];
|
|
62
|
+
return (_jsxs("tr", { onClick: () => onSelectWorkflow?.(row.workflowId), style: { height: ROW_HEIGHT }, className: cn('border-t border-[var(--wui-border)]', onSelectWorkflow && 'cursor-pointer hover:bg-[var(--wui-bg-subtle)]'), children: [_jsx("td", { className: "overflow-hidden text-ellipsis whitespace-nowrap py-2 font-medium text-[var(--wui-fg)]", children: row.name }), _jsx("td", { className: "py-2", children: _jsx(StatusBadge, { status: statusVariant(row.status), label: statusLabel(row.status) }) }), _jsx("td", { className: "overflow-hidden text-ellipsis whitespace-nowrap py-2 text-[var(--wui-fg-muted)]", children: row.eventType }), _jsx("td", { className: "py-2 text-right tabular-nums text-[var(--wui-fg)]", children: row.totalRuns }), _jsx("td", { className: "py-2 text-right tabular-nums text-[var(--wui-fg)]", children: row.failedRuns }), _jsx("td", { className: "py-2 text-right tabular-nums", children: _jsxs("span", { style: {
|
|
63
|
+
color: row.failureRate > 20
|
|
64
|
+
? 'var(--wui-status-failed)'
|
|
65
|
+
: row.failureRate > 5
|
|
66
|
+
? 'var(--wui-status-paused)'
|
|
67
|
+
: 'var(--wui-status-completed)',
|
|
68
|
+
}, children: [row.failureRate, "%"] }) }), _jsx("td", { className: "py-2 text-right text-[var(--wui-fg-muted)]", children: formatLastRun(row.lastRunAt) })] }, row.workflowId));
|
|
69
|
+
}), paddingBottom > 0 && (_jsx("tr", { children: _jsx("td", { colSpan: 7, style: { height: paddingBottom, padding: 0, border: 'none' } }) }))] })] }) }))] }));
|
|
53
70
|
}
|
|
54
71
|
//# sourceMappingURL=WorkflowsTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsTable.js","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowsTable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkflowsTable.js","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowsTable.tsx"],"names":[],"mappings":"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"}
|