This commit is contained in:
2026-05-29 15:55:40 +05:30
parent ecdfc2094e
commit acbfca94f2
2 changed files with 38 additions and 7 deletions

View File

@@ -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,8 +459,9 @@ export default function FetchRequestDetail() {
); );
})} })}
</Box> </Box>
</Paper> )}
)} </Paper>
)}
</Container> </Container>
); );
} }

View File

@@ -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