- {isLoading ? (
-
- {Array.from({ length: 5 }).map((_, i) => (
-
- ))}
+
+
+
+
+
+ 999 ACKs · Reference
+
+
+ · {items.length} on file
+
+
+
+ Acknowledgments,{" "}
+ received.
+
- ) : items.length === 0 ? (
-
+
+
+ Envelope · accepted / rejected / partial
+
+
+ Press ? for shortcuts
+
+
+
+
+
+
+ 999 Implementation Acknowledgments — generated automatically in
+ response to 837P ingests, or parsed from inbound 999 uploads.
+ Each row below is a single transaction set with its accept /
+ reject counts and the original X12 to download.
+
+
+
+
+ {/* =================================================================
+ FOLD — TORN PAGE
+ ================================================================= */}
+
+
+
+
+
+ {Array.from({ length: 48 }, (_, i) => (
+
+ ))}
+
+
+
+ ↘
+
+
+ 999 register
+
+
+ ↙
+
+
+
+
+ {/* =================================================================
+ PAPER PLANE
+ ================================================================= */}
+
+ {/* Paper grain */}
+
\")",
+ backgroundSize: "160px 160px",
+ mixBlendMode: "multiply",
+ }}
+ />
+
+ {/* Title block */}
+
+
- ) : (
-
-
-
-
- ID
- Source Batch
- Accepted
- Rejected
- Received
- ACK Code
- Parsed
-
-
-
-
- {items.map((a, idx) => {
- const isSelected = selectedIndex === idx;
- return (
-
-
-
+
+
+ Register · 999 Implementation ACKs
+
+
+ The register.
+
+
+ One row per inbound 999 — the accept / reject / partial
+ count, the source batch it answers, and the original
+ transaction set to download.
+
+
+
+
+ On file
+
+
+ {items.length}
+
+
+ 999 ACK
+ {items.length === 1 ? "" : "s"}
+
+
+
+
+
+ {/* KPI strip — § 01 Vital signs */}
+
+
+
+ § 01
+
+
+
+ Vital signs
+
+
+
+
+
+ {/* Table — § 02 The register */}
+
+
+
+ § 02
+
+
+
+ The register
+
+
+
+
+
+
+
+ The register
+
+
+ All 999s, newest first.
+
+
+
+ Navigate rows with{" "}
+
+ j
+ {" "}
+ /{" "}
+
+ k
+
+ .
+
+
+
+ {isError ? (
+
+ refetch()}
+ />
+
+ ) : isLoading ? (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ ) : items.length === 0 ? (
+
+
+
+ ) : (
+
+
+
+
+
-
- {a.id}
-
- {a.sourceBatchId}
-
-
- {a.acceptedCount}
-
-
- {a.rejectedCount}
-
-
- {a.receivedCount}
-
-
-
-
-
- {a.parsedAt ? fmt.dateShort(a.parsedAt) : "—"}
-
-
-
-
-
- );
- })}
-
-
- )}
+
+ ID
+
+
+ Source Batch
+
+
+ Accepted
+
+
+ Rejected
+
+
+ Received
+
+
+ ACK Code
+
+
+ Parsed
+
+
+
+
+
+ {items.map((a, idx) => {
+ const isSelected = selectedIndex === idx;
+ return (
+
+
+
+
+
+ {a.id}
+
+
+ {a.sourceBatchId}
+
+
+ {a.acceptedCount}
+
+
+ {a.rejectedCount}
+
+
+ {a.receivedCount}
+
+
+
+
+
+ {a.parsedAt ? fmt.dateShort(a.parsedAt) : "—"}
+
+
+
+
+
+ );
+ })}
+
+
+
+ )}
+
+
+
+ {/* Footer */}
+
+ End of register
+ Cyclone · 999 ACKs
+
+ {items.length} {items.length === 1 ? "row" : "rows"}
+
+
>
);
}
+
+// ---------------------------------------------------------------------------
+// AckKpiTile — paper-toned metric for the ACK register.
+// ---------------------------------------------------------------------------
+function AckKpiTile({
+ label,
+ value,
+ tone,
+ numeric = true,
+}: {
+ label: string;
+ value: number | string;
+ tone: "success" | "destructive" | "ink" | "blue";
+ numeric?: boolean;
+}) {
+ const accentMap = {
+ success: "hsl(152 64% 38%)",
+ destructive: "hsl(358 70% 42%)",
+ ink: "hsl(var(--surface-ink))",
+ blue: "hsl(212 100% 45%)",
+ } as const;
+ const tintMap = {
+ success: "hsl(152 50% 88%)",
+ destructive: "hsl(358 70% 92%)",
+ ink: "hsl(36 22% 90%)",
+ blue: "hsl(212 85% 92%)",
+ } as const;
+ const accent = accentMap[tone];
+ const tint = tintMap[tone];
+ return (
+