From 1af0a6ba7a26a4aec664b076affb2908d8773af3 Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Mon, 24 Aug 2026 00:53:43 +0530 Subject: [PATCH 1/6] feat(fetch-requests): pdf/xlsx source types + trust_fallback create field --- src/FetchRequest/FetchRequestCreate.tsx | 2 +- .../fetch-requests/fetch-requests.models.ts | 19 +++++++++++++++++-- src/features/fetch-requests/index.ts | 4 ++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/FetchRequest/FetchRequestCreate.tsx b/src/FetchRequest/FetchRequestCreate.tsx index 5b19e7b..b6d7154 100644 --- a/src/FetchRequest/FetchRequestCreate.tsx +++ b/src/FetchRequest/FetchRequestCreate.tsx @@ -13,7 +13,7 @@ import { EmptyState } from "../ui/EmptyState"; import { formatApiError } from "../features/fetch-requests"; import { useToast } from "../ui/Toast"; -const CREATE_FIELDS = ["account", "bank", "pipeline", "start_date", "end_date", "source"]; +const CREATE_FIELDS = ["account", "bank", "pipeline", "trust_fallback", "start_date", "end_date", "source"]; function FetchRequestList() { const navigate = useNavigate(); diff --git a/src/features/fetch-requests/fetch-requests.models.ts b/src/features/fetch-requests/fetch-requests.models.ts index 82a41eb..f3750dc 100644 --- a/src/features/fetch-requests/fetch-requests.models.ts +++ b/src/features/fetch-requests/fetch-requests.models.ts @@ -7,7 +7,10 @@ export type FetchRequestStatus = | "completed" | "failed"; +export type SourceType = "file" | "pdf" | "xlsx" | "email"; + export interface FileSource { + type?: SourceType; path: string; bank: string; raw_lines?: string[]; @@ -17,7 +20,16 @@ export interface FileSource { txn_dicts_count?: number; } +export interface PdfSource extends FileSource { + type: "pdf"; +} + +export interface XlsxSource extends FileSource { + type: "xlsx"; +} + export interface EmailSource { + type: "email"; bank: string; from_email?: string; subject?: string; @@ -28,10 +40,13 @@ export interface EmailSource { export type PipelineType = "heuristic" | "llm" | "llama_parse"; +export type TrustFallback = "amount" | "balance"; + export interface FetchRequestCreate { - source: FileSource | EmailSource; + source: PdfSource | XlsxSource | FileSource | EmailSource; account_name: string; pipeline?: PipelineType; + trust_fallback?: TrustFallback | null; payor_username?: string; start_date?: string; end_date?: string; @@ -113,7 +128,7 @@ export interface SSEEvent { export interface FetchRequestFilters { status?: FetchRequestStatus[]; account_name?: string; - source_type?: "file" | "email"; + source_type?: SourceType; } export function formatApiError(err: any): string { diff --git a/src/features/fetch-requests/index.ts b/src/features/fetch-requests/index.ts index 9750d51..92944cd 100644 --- a/src/features/fetch-requests/index.ts +++ b/src/features/fetch-requests/index.ts @@ -5,6 +5,9 @@ export type { FetchRequestStatus, FetchRequestFilters, FileSource, + PdfSource, + XlsxSource, + SourceType, EmailSource, UploadResult, PendingAmbiguity, @@ -15,6 +18,7 @@ export type { SSEEventStatus, ProgressMessage, PipelineType, + TrustFallback, } from "./fetch-requests.models"; export { RETRY_MAX, formatApiError } from "./fetch-requests.models"; export { -- 2.49.1 From 699c3df3a5f61bc5b695c94b76faccf3309c459a Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Mon, 24 Aug 2026 15:07:35 +0530 Subject: [PATCH 2/6] feat(fetch-requests): csv source type; stop offering legacy file source on create --- src/features/fetch-requests/fetch-requests.models.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/features/fetch-requests/fetch-requests.models.ts b/src/features/fetch-requests/fetch-requests.models.ts index f3750dc..8d4574b 100644 --- a/src/features/fetch-requests/fetch-requests.models.ts +++ b/src/features/fetch-requests/fetch-requests.models.ts @@ -7,7 +7,7 @@ export type FetchRequestStatus = | "completed" | "failed"; -export type SourceType = "file" | "pdf" | "xlsx" | "email"; +export type SourceType = "file" | "pdf" | "xlsx" | "csv" | "email"; export interface FileSource { type?: SourceType; @@ -28,6 +28,10 @@ export interface XlsxSource extends FileSource { type: "xlsx"; } +export interface CsvSource extends FileSource { + type: "csv"; +} + export interface EmailSource { type: "email"; bank: string; @@ -43,7 +47,7 @@ export type PipelineType = "heuristic" | "llm" | "llama_parse"; export type TrustFallback = "amount" | "balance"; export interface FetchRequestCreate { - source: PdfSource | XlsxSource | FileSource | EmailSource; + source: PdfSource | XlsxSource | CsvSource | EmailSource; account_name: string; pipeline?: PipelineType; trust_fallback?: TrustFallback | null; -- 2.49.1 From 51a209f3498a6ad7ec0decd03b0006164875cd29 Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Mon, 24 Aug 2026 19:36:25 +0530 Subject: [PATCH 3/6] style(fetch-requests): two glass panes on create page + matching list rows - Source & Account / Window & Policy split into equal-height frosted panes (grid stretch, account/bank above source) - fixed full-viewport brand-indigo gradient backdrop so blur(8px) reads as glass - recent fetch-request rows adopt the same translucent recipe --- src/FetchRequest/FetchRequestCreate.tsx | 170 ++++++++++++++++-------- 1 file changed, 117 insertions(+), 53 deletions(-) diff --git a/src/FetchRequest/FetchRequestCreate.tsx b/src/FetchRequest/FetchRequestCreate.tsx index b6d7154..c2aa37c 100644 --- a/src/FetchRequest/FetchRequestCreate.tsx +++ b/src/FetchRequest/FetchRequestCreate.tsx @@ -6,6 +6,7 @@ import { import { useNavigate } from "react-router-dom"; import ReceiptLongIcon from "@mui/icons-material/ReceiptLong"; import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline"; +import { alpha } from "@mui/material/styles"; import { useAppContext, useResource, ListCellRenderer, FormFieldRenderer, getApi, applyDisplayFormat } from "../../react-openapi"; import type { FieldConfig } from "../../react-openapi"; import { PageHeader } from "../ui/PageHeader"; @@ -15,6 +16,33 @@ import { useToast } from "../ui/Toast"; const CREATE_FIELDS = ["account", "bank", "pipeline", "trust_fallback", "start_date", "end_date", "source"]; +// Two-pane form partition — explicit names, spec order is unreliable. +// Grid stretch keeps both panes equal-height regardless of which source +// variant is active (email adds From/Subject under the type select). +const SOURCE_PANE_FIELDS = ["account", "bank"]; +const POLICY_PANE_FIELDS = ["start_date", "end_date", "pipeline", "trust_fallback"]; + +const glassSx = (theme: any) => ({ + backgroundColor: alpha(theme.palette.background.default, 0.72), + backdropFilter: "blur(8px)", + borderColor: "divider", + boxShadow: 1, +}); + +function GlassPanel({ title, children }: { title: string; children: React.ReactNode }) { + return ( + ({ p: 3, borderRadius: 3, ...glassSx(theme) })}> + + {title} + + {children} + + ); +} + function FetchRequestList() { const navigate = useNavigate(); const { list, remove, resource } = useResource("fetch-requests"); @@ -88,13 +116,18 @@ function FetchRequestList() { ({ p: 2, cursor: "pointer", - borderRadius: 2, - transition: "border-color 160ms ease, box-shadow 160ms ease", - "&:hover": { borderColor: "primary.main", boxShadow: 1 }, - }} + borderRadius: 3, + transition: "border-color 160ms ease, box-shadow 160ms ease, background-color 160ms ease", + "&:hover": { + borderColor: "primary.main", + boxShadow: 1, + backgroundColor: alpha(theme.palette.background.default, 0.9), + }, + ...glassSx(theme), + })} onClick={() => navigate(`/fetch-requests/${row.id}`)} > @@ -207,59 +240,90 @@ export default function FetchRequestCreate() { ); } + const renderPaneFields = (names: string[]) => + names.map((name) => { + const field = formFields.find((f) => f.name === name); + if (!field) return null; + return ( + handleChange(field.name, val)} + fkOptions={fkOptions[field.name]} + /> + ); + }); + return ( - - + {/* Decorative gradient backdrop — gives the frosted panes something to blur. */} + + [ + `radial-gradient(640px circle at 12% 8%, ${alpha(theme.palette.primary.main, 0.14)}, transparent 70%)`, + `radial-gradient(900px circle at 88% 92%, ${alpha(theme.palette.primary.main, 0.09)}, transparent 70%)`, + `radial-gradient(520px circle at 78% 22%, ${alpha(theme.palette.primary.light, 0.07)}, transparent 70%)`, + ].join(", "), + }} /> + + - - - New Fetch Request - - - Choose an account, pipeline, and a file or email source to kick off an import. - + + + New Fetch Request + + + Choose an account, pipeline, and a file or email source to kick off an import. + - - {formFields.map((field) => ( - handleChange(field.name, val)} - fkOptions={fkOptions[field.name]} - /> - ))} + + + {renderPaneFields(SOURCE_PANE_FIELDS)} + {renderPaneFields(["source"])} + + {renderPaneFields(POLICY_PANE_FIELDS)} + + + + + + + + {result && ( + setResult(null)}> + {result.message} + + )} - - - - - - {result && ( - setResult(null)}> - {result.message} - - )} - - - - Recent Fetch Requests - - - + + Recent Fetch Requests + + + + ); } -- 2.49.1 From a3a87cc1eda362e53b29a396200cb2af5f3b4879 Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Mon, 24 Aug 2026 19:39:27 +0530 Subject: [PATCH 4/6] style(reports): right-align generated date in report rows --- src/Reports/ReportList.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Reports/ReportList.tsx b/src/Reports/ReportList.tsx index ad264cf..e35710c 100644 --- a/src/Reports/ReportList.tsx +++ b/src/Reports/ReportList.tsx @@ -81,14 +81,15 @@ export function ReportList({ reports, loading, fields, selectedId, onView, onReg {amounts} )} - {fields && ( - - - - )} + {fields && ( + + + + )} +