// --------------------------------------------------------------------------- // pages / DrillPanel.tsx — EXIT wave 2 (W2-7, contract Y6). // // ⛔ THIS PANEL IS DELIBERATELY THIN, AND IT SAYS SO ON SCREEN. // // Y1 amendment 4: drill descriptors are DECLARATIONS this wave — there is no // resolver route yet. Every descriptor the server sends is complete (window + // scope + label), so wave 3 adds the resolver with no shape change. Y6 is // explicit about the consequence: full parity with `ui/drawers.py` (1,473 lines, // 19 drawer bodies) is NOT in this wave, and the rule is *"say so in the UI // rather than shipping a panel that looks complete and is not."* // // So this panel shows exactly what is true — WHICH entity or window you asked // for, in the words the server used — and names what is coming. A panel that // rendered a plausible-looking empty shell would be worse than this one: behind // a login, an empty detail view reads as "this customer has no orders". // // The owner rule underneath it ([[no-unverifiable-aggregates]]) is why the // descriptor is echoed in full rather than summarised: the number you clicked // and the window it covers must be inspectable even before the rows arrive. // --------------------------------------------------------------------------- import { fmt } from "../ui"; import type { DecompDescriptor, DrillDescriptor, EntityDescriptor } from "../ui/types"; const ENTITY_WORD: Record = { customer: "Customer", sku: "Product", rep: "Salesperson", bu: "Business Unit", }; function Row({ label, value }: { label: string; value: string }) { return (
{label} {value}
); } export function DrillPanel({ drill, onClose, }: { drill: DrillDescriptor; onClose: () => void; }) { const isDecomp = drill.kind === "decomp"; const d = drill as DecompDescriptor; const e = drill as EntityDescriptor; return ( ); }