Scan station
A React block (a whole screen) in Beamline's Inventory app.
A warehouse scanner, phone-first. Home: one scan field that also takes typing (and says so when the scanner isn't connected), each code named as what it is (product, location, transfer, operation, serial) before anything moves, an unknown or ambiguous code starting nothing, a transfer code opening its work, and the picking and counts assigned to this person (unknown said). Picking: a batch of orders walked line by line, the prompt saying what to scan next (the location, the product, a serial), each line under its order in words with picked of required, a wrong location, another order's product, a product already fully picked or a serial already allocated refused and said, and Validate kept apart (short lines said on it) so a refusal keeps everything picked. Receiving: serials scanned onto a receipt line; when a label won't scan, a typed serial taken and marked typed, or refused with the way to recover when the operation takes scans only.
Use it for
- A handheld or phone screen for warehouse work: scanning codes, picking several orders in one walk, receiving serial-tracked goods.
- Anywhere a scan must say what it read before it changes anything, and a refusal must keep the work done so far.
Not for
- Counting stock on shelves (stock-count).
- Assigning serial numbers to a delivery from the desk (serial-allocation).
- Raising purchase orders (purchase-orders).
Anatomy
- header: Back (inside picking and receiving), the product's mark and the view's title
- home: scanner-not-connected notice, the scan field, the hint or Looking it up, what the code is (with Open for a transfer), Picking with assigned, Receiving, Counts with assigned
- picking: the batch and its orders; what to scan next as a card (what it is, the location, product or serial large, the line it's for), the sentence also said to screen readers; the scan field, what was said, Validate (with short lines); beside it each order with its lines: product, location, serials, picked of required
- receiving: the receipt, the line's serial count, the scan field, Label won't scan, the typed field or the scans-only refusal, what was said; beside it the serials, each scanned or typed, and received of expected
States
- home: hint; looking up; known code (named by kind); unknown code (nothing started); ambiguous code; transfer opens picking; scanner not connected (typing works); assigned unknown
- picking: go to the location; scan the product; scan a serial; wrong location; another order's product; product fully picked; not in the batch; serial already allocated (refused with where); all picked
- validate: with lines short (said); validating; validated; refused with the reason (everything picked kept)
- receiving: serial scanned; serial repeated (refused); typing allowed (kept as typed); scans only (refused with the way to recover)
- phone: the work over the orders, one column
- right to left: the layout mirrors
- reduced motion: through the tokens
Keyboard
- The scan field takes the scanner's Enter or typing plus Enter, clears and keeps focus; Tab to the lines' view, Validate, and in receiving to Label won't scan and the typed field
Motion
Nothing moves beyond the parts' own feedback. Nothing runs at rest.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
resolve (required) | (code: string) => Promise<ScanResolution> | — | Read a code; your app knows its barcode rules and permissions. |
scannerConnected | boolean | — | false: the scanner isn't connected (typing still works). |
assigned | { picking: number | null; counts: number | null; } | — | Work assigned to this person; null when not known. |
batch | PickBatch | null | — | |
receipt | SerialReceipt | null | — | |
serialPolicy | "manual" | "scan-only" | — | Receiving: "manual" lets a serial be typed when its label won't scan (kept as typed); "scan-only" refuses it. |
onSerial | ((lineId: string, serial: string) => Promise<unknown>) | — | Allocate a serial to a line; reject with where it already is ("SO-4098 line 2"). |
onValidate | ((batch: PickBatch) => Promise<unknown>) | — | Validate the batch (your app moves the stock once); reject to keep everything picked. |
onReceiveSerial | ((serial: string, typed: boolean) => Promise<unknown>) | — | |
onOpenTransfer | ((id: string) => void) | — | The transfer a transfer code opens; it opens the batch. |
onOpenCounts | (() => void) | — | Counts open in your app's count screen. |
defaultView | "home" | "picking" | "receiving" | — | |
product | string | — | Your product's name, shown as its mark. |
className | string | — | Classes on the documented visual root; no override by default. |
ref | Ref<HTMLDivElement> | — | Receives the documented native target or imperative handle; omitted by default. |
Built from
Dependencies
lucide-react
Import
import { ScanStation } from "@beamline/scan-station";
Get it
Scan station is part of Beamline UI. Install the parts you need in your React app as compiled packages or editable source. Get Beamline · Connect your agent
More in Inventory
- Stock count: A shelf counted. Count: the products on it with counted units, not counted (an empty field that changes nothing) kept apart from a counted zero, expected…
- Inventory counts: Recurring stock counts from plan to shelf: a phone-first count of one occurrence where an untouched part reads not counted and a zero reads counted, none…
- Goods receiving: Goods received against purchase orders and invoices. Cards grouped by purchase order or invoice, each line once whichever way (a line keeps both sources…
- Purchase order desk: Purchase orders for stock from draft to closed. The list of orders with status (ready for review on warning, approved, ordered and partly received on…
- Restock desk: Restocking from suppliers' own shops. Items low on stock (below the minimum on danger, at it on warning, unknown said) beside the chosen item with how…
- Stock alerts: Alerts on stock counts and expiry dates. Counts of alerts gone off (danger) and close (warning) in the header. A table: item and type, the rule in words…
- Inventory finder: Find stock and act on what's found. A rail of filters: name or SKU; folders with or without their subfolders (folders the person can't see said as not…
- Item setup: Setting items up for scanning and records. Barcodes: scanned codes waiting to be linked, each with its symbology, when and who; Look it up brings a…
- Bulk item edit: Many items corrected at once. Pick a folder, with its subfolders or not (fixed once anything is edited), up to a limit said. The items in a grid: name…
- Kit builder: A kit (bundle) made of standalone products, and how many its parts' stock can make. Sell as a kit; the parts in one kit with units per kit, removable…
- Serial allocation: A receipt line's serial numbers. Serials generated from a first serial and how many (its digits counted up, padding kept; a first serial without digits…
- Stock moves: Where stock went, and moving it. The ledger lists movements newest first: moves on info, stock added on success, stock taken out on warning; each with…
- Pack station: A packing bench. Scanner, scale and printer each said, on the warning tone when away. Find the shipment by scanning or typing its number (none found…
- Shipment split: An order's lines split across shipments. A table of lines with what was ordered and a column per shipment (new ones marked); a line already shipped can't…
- Route plan: A day's delivery routes in the service's zone. The day at a glance: routes, routes without a driver (warning), stops running late (danger), stops done…
- Job materials: Materials sent out to jobs and pick lists. Jobs: the list (draft, active on info, completed on success) beside the chosen job with its site, dates (the…
- Service tasks: A fleet shop's maintenance setup. Tasks: active and archived, searchable, main tasks and their subtasks told apart in words, archiving refused while…
- Owner records: Who a customer is and what they own, at the front desk. New customer: name, phone and email checked as typed against existing customers; each likely…
- Sample storage: Where physical items are kept (rooms, freezers, shelves, racks, boxes) and acting on several at once. The storage tree is browsed apart from moving: Move…
- Sample ledger: Materials used in a record and the containers they came from, plus pooling. Subtracting a used amount writes a stock movement with its unit and the…