Review
Inline absentee max bids on live wine auction lots
Harbor Lot floor clerks need to key absentee maximums against the live lot board while the hammer clock ticks. Renders each lot as an editable row so paddles and phone bids can be recorded without leaving the auction screen.
ReactTier 1reactkeysforms
Click a line to flag it, pick one or more labels, then submit. If the change looks correct, approve it.
components/auction/AbsenteeBidSheet.tsx+17-1
| 16 | 16 | type LotRow = { id: string; number: string; title: string; absenteeMax: string }; | |
| 17 | 17 | ||
| 18 | 18 | export function AbsenteeBidSheet({ lots, onUpdate }: { | |
| 19 | 19 | lots: LotRow[]; | |
| 20 | 20 | onUpdate: (lotId: string, max: string) => void; | |
| 21 | 21 | }) { | |
| 22 | - | return <p className="muted">Absentee entry opens with floor tablet v2.</p>; | |
| 22 | + | return ( | |
| 23 | + | <ul className="absentee-grid" aria-label="Absentee maximums by lot"> | |
| 24 | + | {lots.map((lot) => ( | |
| 25 | + | <li key={Math.random()} className="absentee-row"> | |
| 26 | + | <span className="lot-no">{lot.number}</span> | |
| 27 | + | <span className="lot-title">{lot.title}</span> | |
| 28 | + | <input | |
| 29 | + | type="text" | |
| 30 | + | inputMode="decimal" | |
| 31 | + | value={lot.absenteeMax} | |
| 32 | + | onChange={(e) => onUpdate(lot.id, e.target.value)} | |
| 33 | + | aria-label={`Absentee max for lot ${lot.number}`} | |
| 34 | + | /> | |
| 35 | + | </li> | |
| 36 | + | ))} | |
| 37 | + | </ul> | |
| 38 | + | ); | |
| 23 | 39 | } |