# Sample storage

A React block (a whole screen) in [Beamline](https://beamline.io/)'s [Inventory](https://beamline.io/components/apps/inventory) app. Live demo: https://beamline.io/components/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 to… offers only places a location can go, never itself or anything inside it; temperatures always carry their unit; a box shows its grid, or says it has none and lists items without made-up positions. A personal list collects items across searches; every action names the exact items it touches; moving into a box says who can edit them there; items that fail to move stay on the list for a retry; marking items used up keeps their history.

## Use it for

- Keeping track of where individual containers or items sit in nested storage.
- Collecting items across searches to act on them together.

## Not for

- Shop stock counted by location ([inventory-item](https://beamline.io/components/inventory-item), [stock-count](https://beamline.io/components/stock-count)).
- A plate's wells (the spatial-grid signature).

## Anatomy

- header: the product's mark, Storage
- tree: places nested, each with its temperature
- place: name, kind and path, Move to…; temperature, grid or gridless, who can edit; what happened; the items inside with positions
- my list: find items; results with a box to collect; the list with remove, Clear; Move to a box, Mark used up; the confirmation naming each item and the access change

## States

- place: with or without temperature; gridded, gridless; moved, refused (still where it was)
- list: empty, collecting across searches; confirming a move or use-up; moved; some failed (they stay)
- item: available, used up
- phone: tree, place and list stacked
- right to left: mirrors

## Keyboard

- Tab through the tree's folds and places, Move to…, each item's box, find, the list's controls and the confirmation

## Motion

The fold's chevron turns.

## Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `locations` (required) | `StorageLocation[]` | — |  |
| `items` (required) | `StoredItem[]` | — |  |
| `onMoveLocation` | `((id: string, toId: string) => Promise<void>)` | — | Move a place (and all it holds) inside another. |
| `onMoveItems` | `((ids: string[], boxId: string) => Promise<MoveResult>)` | — | Move items into a box; resolve with the ones that didn't move. |
| `onConsume` | `((ids: string[]) => Promise<void>)` | — |  |
| `defaultLocation` | `string` | — |  |
| `defaultList` | `string[]` | — |  |
| `defaultQuery` | `string` | — |  |
| `product` | `string` | — |  |
| `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. |
| `defaultPending` | `StorageAction` | — | Open with this action waiting for confirmation (the list must not be empty). |

## Built from

- [Avatar](https://beamline.io/components/avatar.md)
- [Button](https://beamline.io/components/button.md)
- [Checkbox](https://beamline.io/components/checkbox.md)
- [Glow](https://beamline.io/components/glow.md)
- [Kbd](https://beamline.io/components/kbd.md)
- [Label](https://beamline.io/components/label.md)
- [Search field](https://beamline.io/components/search-field.md)
- [Select](https://beamline.io/components/select.md)
- [Spinner](https://beamline.io/components/spinner.md)

## Dependencies

`lucide-react`

## Import

```tsx
import { SampleStorage } from "@beamline/sample-storage";
```

## Get it

Sample storage is part of Beamline UI. Install the parts you need in your React app as compiled packages or editable source. [Get Beamline](https://beamline.io/checkout?pack=complete) · [Connect your agent](https://beamline.io/connect)

## More in Inventory

- [Stock count](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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…
- [Scan station](https://beamline.io/components/scan-station): 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…
- [Pack station](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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](https://beamline.io/components/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 ledger](https://beamline.io/components/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…

Part of [Beamline UI: polished, editable React components and complete screens for custom applications](https://beamline.io/). [Build your own style from any look; tokens, fonts, radii, motion; not only colours](https://beamline.io/docs/customize).
