fixes
This commit is contained in:
@@ -92,7 +92,7 @@ export default function FetchRequestDetail() {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const config = useConfig();
|
const config = useConfig();
|
||||||
|
|
||||||
const { data: fetchRequest, isLoading, error: fetchError } = useFetchRequest(id!);
|
const { data: fetchRequest, isLoading, error: fetchError, refetch: refetchRequest } = useFetchRequest(id!);
|
||||||
const updateMutation = useUpdateFetchRequest();
|
const updateMutation = useUpdateFetchRequest();
|
||||||
const resolveMutation = useResolveAmbiguity();
|
const resolveMutation = useResolveAmbiguity();
|
||||||
const { data: ambiguities, refetch: refetchAmbiguities } = useFetchRequestAmbiguities(id!);
|
const { data: ambiguities, refetch: refetchAmbiguities } = useFetchRequestAmbiguities(id!);
|
||||||
@@ -114,6 +114,10 @@ export default function FetchRequestDetail() {
|
|||||||
try {
|
try {
|
||||||
const parsed: SSEEvent = JSON.parse(event.data);
|
const parsed: SSEEvent = JSON.parse(event.data);
|
||||||
setSseEvents((prev) => [...prev, parsed]);
|
setSseEvents((prev) => [...prev, parsed]);
|
||||||
|
if (parsed.status === "paused") {
|
||||||
|
refetchRequest();
|
||||||
|
refetchAmbiguities();
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
// ignore malformed events
|
// ignore malformed events
|
||||||
}
|
}
|
||||||
@@ -175,6 +179,7 @@ export default function FetchRequestDetail() {
|
|||||||
const resolvedAmbiguities = ambiguities?.filter((a: any) => a.status === "resolved") ?? [];
|
const resolvedAmbiguities = ambiguities?.filter((a: any) => a.status === "resolved") ?? [];
|
||||||
const hasAmbiguities = ambiguities && ambiguities.length > 0;
|
const hasAmbiguities = ambiguities && ambiguities.length > 0;
|
||||||
const allResolved = hasAmbiguities && pendingAmbiguities.length === 0;
|
const allResolved = hasAmbiguities && pendingAmbiguities.length === 0;
|
||||||
|
const ambiguitiesLoading = !ambiguities;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container sx={{ mt: 4, mb: 4 }}>
|
<Container sx={{ mt: 4, mb: 4 }}>
|
||||||
@@ -358,22 +363,32 @@ export default function FetchRequestDetail() {
|
|||||||
</Box>
|
</Box>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
|
||||||
{hasAmbiguities && (
|
{(hasAmbiguities || req.status === "paused") && (
|
||||||
<Paper sx={{ p: 3, borderRadius: 4, mb: 3 }} variant="outlined">
|
<Paper sx={{ p: 3, borderRadius: 4, mb: 3 }} variant="outlined">
|
||||||
<Typography variant="subtitle1" fontWeight={600} gutterBottom>
|
<Typography variant="subtitle1" fontWeight={600} gutterBottom>
|
||||||
Ambiguity Resolution
|
Ambiguity Resolution
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
{allResolved ? (
|
{ambiguitiesLoading ? (
|
||||||
|
<Box sx={{ display: "flex", alignItems: "center", gap: 1, py: 2 }}>
|
||||||
|
<CircularProgress size={16} />
|
||||||
|
<Typography variant="body2" color="text.secondary">Loading ambiguities...</Typography>
|
||||||
|
</Box>
|
||||||
|
) : allResolved ? (
|
||||||
<Alert severity="success" sx={{ mb: 2, borderRadius: 2 }}>
|
<Alert severity="success" sx={{ mb: 2, borderRadius: 2 }}>
|
||||||
All ambiguities resolved — pipeline will resume on next poll cycle
|
All ambiguities resolved — pipeline will resume on next poll cycle
|
||||||
</Alert>
|
</Alert>
|
||||||
|
) : !hasAmbiguities ? (
|
||||||
|
<Alert severity="info" sx={{ mb: 2, borderRadius: 2 }}>
|
||||||
|
Pipeline paused — no ambiguities found
|
||||||
|
</Alert>
|
||||||
) : (
|
) : (
|
||||||
<Alert severity="warning" sx={{ mb: 2, borderRadius: 2 }}>
|
<Alert severity="warning" sx={{ mb: 2, borderRadius: 2 }}>
|
||||||
Pipeline paused — resolve ambiguities to continue
|
Pipeline paused — resolve ambiguities to continue
|
||||||
</Alert>
|
</Alert>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{hasAmbiguities && (
|
||||||
<Box sx={{ display: "flex", flexDirection: "column", gap: 2 }}>
|
<Box sx={{ display: "flex", flexDirection: "column", gap: 2 }}>
|
||||||
{ambiguities.map((ambiguity: any) => {
|
{ambiguities.map((ambiguity: any) => {
|
||||||
const isResolved = ambiguity.status === "resolved";
|
const isResolved = ambiguity.status === "resolved";
|
||||||
@@ -444,6 +459,7 @@ export default function FetchRequestDetail() {
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Box>
|
</Box>
|
||||||
|
)}
|
||||||
</Paper>
|
</Paper>
|
||||||
)}
|
)}
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@@ -304,20 +304,22 @@ export default function FetchRequests() {
|
|||||||
<Box sx={{ display: "flex", gap: 2 }}>
|
<Box sx={{ display: "flex", gap: 2 }}>
|
||||||
<TextField
|
<TextField
|
||||||
label="Start Date"
|
label="Start Date"
|
||||||
type="datetime-local"
|
type="date"
|
||||||
value={startDate}
|
value={startDate}
|
||||||
onChange={(e) => setStartDate(e.target.value)}
|
onChange={(e) => setStartDate(e.target.value)}
|
||||||
size="small"
|
size="small"
|
||||||
InputLabelProps={{ shrink: true }}
|
InputLabelProps={{ shrink: true }}
|
||||||
|
inputProps={{ max: new Date().toISOString().split("T")[0] }}
|
||||||
sx={{ flex: 1 }}
|
sx={{ flex: 1 }}
|
||||||
/>
|
/>
|
||||||
<TextField
|
<TextField
|
||||||
label="End Date"
|
label="End Date"
|
||||||
type="datetime-local"
|
type="date"
|
||||||
value={endDate}
|
value={endDate}
|
||||||
onChange={(e) => setEndDate(e.target.value)}
|
onChange={(e) => setEndDate(e.target.value)}
|
||||||
size="small"
|
size="small"
|
||||||
InputLabelProps={{ shrink: true }}
|
InputLabelProps={{ shrink: true }}
|
||||||
|
inputProps={{ max: new Date().toISOString().split("T")[0] }}
|
||||||
sx={{ flex: 1 }}
|
sx={{ flex: 1 }}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
@@ -465,6 +467,19 @@ export default function FetchRequests() {
|
|||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell align="right">
|
<TableCell align="right">
|
||||||
<Box sx={{ display: "flex", gap: 0.5, justifyContent: "flex-end" }}>
|
<Box sx={{ display: "flex", gap: 0.5, justifyContent: "flex-end" }}>
|
||||||
|
{req.status === "paused" && (
|
||||||
|
<Tooltip title="Resolve ambiguities">
|
||||||
|
<IconButton
|
||||||
|
size="small"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
navigate(`/fetch-requests/${req.id}`);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<WarningAmberIcon fontSize="small" color="warning" />
|
||||||
|
</IconButton>
|
||||||
|
</Tooltip>
|
||||||
|
)}
|
||||||
{req.status === "failed" && (req.retry_count ?? 0) < RETRY_MAX && (
|
{req.status === "failed" && (req.retry_count ?? 0) < RETRY_MAX && (
|
||||||
<Tooltip title="Retry">
|
<Tooltip title="Retry">
|
||||||
<IconButton
|
<IconButton
|
||||||
|
|||||||
Reference in New Issue
Block a user