This commit is contained in:
2026-05-30 03:29:25 +05:30
parent cb7f20181e
commit be7c2817b7
2 changed files with 23 additions and 15 deletions

View File

@@ -81,19 +81,16 @@ function computeProgressPercent(
return status === "processing" || status === "paused" ? 10 : 0; return status === "processing" || status === "paused" ? 10 : 0;
} }
const stepLabels = ["Load Content", "Extract", "Validate", "Enrich", "Save"]; const stepLabels = ["Load Content", "Extract", "Raw Expense", "Enrich", "Save"];
function statusToActiveStep(status: FetchRequestStatus): number { function computeActiveStep(status: FetchRequestStatus, seenSteps: Set<string>): number {
switch (status) { if (status === "completed") return stepLabels.length;
case "pending": return -1; if (seenSteps.has("complete")) return 4;
case "processing": return 0; if (seenSteps.has("enrich") || status === "enriched_done") return 3;
case "paused": return 2; if (seenSteps.has("txn_dicts") || status === "raw_expenses_done") return 2;
case "raw_expenses_done": return 2; if (seenSteps.has("txn_blocks")) return 1;
case "enriched_done": return 3; if (seenSteps.has("load_content") || status === "processing" || status === "paused") return 0;
case "completed": return stepLabels.length; return -1;
case "failed": return 0;
default: return -1;
}
} }
function formatProgressMessage(msg: ProgressMessage): string { function formatProgressMessage(msg: ProgressMessage): string {
@@ -226,8 +223,15 @@ export default function FetchRequestDetail() {
break; break;
} }
} }
const terminalStatuses = new Set(["completed", "skipped", "paused"]);
return sseEvents.filter((e, i) => { return sseEvents.filter((e, i) => {
if (e.step === "txn_dicts" && e.status === "progress") return i === lastProgressIdx; if (e.step === "txn_dicts" && e.status === "progress") return i === lastProgressIdx;
if (e.status === "started") {
return !sseEvents.slice(i + 1).some(
(later) => later.step === e.step && terminalStatuses.has(later.status),
);
}
return true; return true;
}); });
}, [sseEvents]); }, [sseEvents]);
@@ -255,7 +259,8 @@ export default function FetchRequestDetail() {
const displayParsedCount = React.useMemo(() => { const displayParsedCount = React.useMemo(() => {
if (liveParsedCount > 0) return liveParsedCount; if (liveParsedCount > 0) return liveParsedCount;
const source = (fetchRequest as any)?.source; const source = (fetchRequest as any)?.source;
if (source?.txn_dicts_count) return source.txn_dicts_count; const persistedCount = source?.txn_dict_count ?? source?.txn_dicts_count ?? 0;
if (persistedCount > 0) return persistedCount;
const dicts = source?.txn_dicts; const dicts = source?.txn_dicts;
if (Array.isArray(dicts) && dicts.length > 0) return dicts.length; if (Array.isArray(dicts) && dicts.length > 0) return dicts.length;
return 0; return 0;
@@ -298,7 +303,7 @@ export default function FetchRequestDetail() {
} }
const req = fetchRequest as any; const req = fetchRequest as any;
const activeStep = statusToActiveStep(req.status); const activeStep = computeActiveStep(req.status as FetchRequestStatus, seenSteps);
const retryCount = req.retry_count ?? 0; const retryCount = req.retry_count ?? 0;
const isRetryExhausted = retryCount >= RETRY_MAX; const isRetryExhausted = retryCount >= RETRY_MAX;
const pendingAmbiguities = ambiguities?.filter((a: any) => a.status === "pending") ?? []; const pendingAmbiguities = ambiguities?.filter((a: any) => a.status === "pending") ?? [];

View File

@@ -13,6 +13,7 @@ export interface FileSource {
raw_lines?: string[]; raw_lines?: string[];
txn_blocks?: Record<string, any>; txn_blocks?: Record<string, any>;
txn_dicts?: Record<string, any>[]; txn_dicts?: Record<string, any>[];
txn_dict_count?: number;
txn_dicts_count?: number; txn_dicts_count?: number;
} }
@@ -21,6 +22,7 @@ export interface EmailSource {
from_email?: string; from_email?: string;
subject?: string; subject?: string;
raw_terms?: string[]; raw_terms?: string[];
txn_dict_count?: number;
txn_dicts_count?: number; txn_dicts_count?: number;
} }
@@ -84,7 +86,8 @@ export interface ResolveAmbiguityPayload {
export type SSEEventStep = export type SSEEventStep =
| "load_content" | "raw_lines" | "txn_blocks" | "txn_dicts" | "load_content" | "raw_lines" | "txn_blocks" | "txn_dicts"
| "resume_extract" | "extract" | "paused" | "complete" | "enrich"; | "resume_extract" | "extract" | "paused" | "complete" | "enrich"
| "save_expenses";
export type SSEEventStatus = export type SSEEventStatus =
| "started" | "completed" | "skipped" | "paused" | "progress"; | "started" | "completed" | "skipped" | "paused" | "progress";