Floor plan & resources
Areas, tables and other physical resources, accessible and online flags, approved table combinations and the visual layout editor.
The floor plan is the physical truth every booking allocates against:
areas group your rooms and floors, resources are the bookable seats
(tables, booths, bar places, private rooms), and combinations are
approved joins of two to four resources for larger parties. Two people
can never hold the same resource at the same time — the database refuses
it. Configuration needs the venues.manage permission (owner, org admin
or manager); every staff role can read the plan.
Where editing happens today
The editors live in the operator panels at /app/panels: “Areas & resources (DEV-012 panel)” and “Resource combinations (DEV-013 panel)”. They are keyboard, list-based forms that call exactly the commands a visual editor would call — there is no drag-and-drop canvas in the pilot. Everything you enter is validated again server-side.
Areas
An area is a named group of resources (“Main room”, “Terrace”, “First floor”). Form “Save an area”:
| Field | What it is | Rules/limits |
|---|---|---|
| Area id | Identifies an existing area to update. | Leave blank to create. |
| Name | The area name staff see. | 1–80 characters, unique within the venue. |
| Floor label | Optional floor tag (“Ground”, “2F”). | Up to 40 characters. |
| Tags | Optional free-form labels. | Up to 10 tags, each 1–40 characters, comma-separated in the form. |
| Sort order | Display/processing order. | 0–999. |
| Active | Whether the area is in use. | Inactive areas keep their history but drop out of setup. |
AREA_NAME_TAKEN (409) — another area of this venue already uses that
name. Choose a different name; names are per-venue, so two venues may
both have a “Terrace”.
Resources
A resource is one bookable physical seat unit. Form “Save a resource”:
| Field | What it is | Rules/limits |
|---|---|---|
| Resource id | Identifies an existing resource to update. | Leave blank to create. |
| Area id | The area the resource sits in. | Must belong to the same venue. |
| Label | The table label staff and bookings see (“T7”). | 1–40 characters, unique within the venue. |
| Type | Physical kind. | Table, Booth, Seat, Bar, Private room. |
| Minimum party | Smallest party the resource fits. | 1–50, default 2. |
| Maximum party | Largest party the resource fits. | 1–50, default 4, and at least the minimum. |
| Priority | Tie-break weight when several fits are equal. | 0–999, default 100; best-fit prefers the fewest wasted seats, then priority, then the stable id. |
| Accessible seating | Records the resource as accessible. | A venue-maintained flag; the layout read reports it so staff seat guests appropriately. |
| Online bookable | Whether public online booking may select it. | On by default. Switched off, the resource is only usable for staff-taken (phone/walk-in) bookings. |
| Active | Whether the resource participates. | Inactive resources keep history but are never allocated. |
RESOURCE_LABEL_TAKEN (409) — another resource of this venue already
uses that label.
The layout editor and LAYOUT_STALE
Each resource carries an optional placement record stored as a versioned
structure: a shape (rectangle or circle), an x/y position and a
width/height, all on a normalized 0–1000 grid (width/height
1–1000), plus an optional rotation of 0–359 degrees. Form “Place a
resource (list layout editor)” saves one placement; form “Read the
layout (list view)” prints every resource as
label @ area plus either its placement or (unplaced).
The layout uses optimistic concurrency, which is where LAYOUT_STALE
lives:
- The editor form carries “Layout version you loaded” — the version number from your last read.
- Your save is applied only if the venue’s layout is still at that
version. If someone else saved first, the write refuses with
LAYOUT_STALE(409): “The layout changed since you loaded it — refresh first.” - Remedy: read the layout again (this returns the new version), then re-apply your change on top of it. Nothing partial is ever written — a refused save leaves the stored layout untouched.
A single layout save may place up to 200 resources, and each resource appears at most once per save.
Combinations — approved multi-table joins
A combination is a named join of resources the venue approves in advance, so a party of ten can be allocated “T4 + T5” as one unit. Guests never define combinations, and staff can only move a party onto resources that form an approved combination. Form “Save a combination”:
| Field | What it is | Rules/limits |
|---|---|---|
| Combination id | Identifies an existing combination to update. | Leave blank to create. |
| Name | What staff call the join (“Window four”). | 1–80 characters, unique within the venue. |
| Member resource ids | The joined resources. | 2–4 distinct resource ids of the same venue, comma-separated. |
| Minimum party | Smallest party the combination fits. | 1–200, default 5. |
| Maximum party | Largest party the combination fits. | 1–200, default 12, and at least the minimum. |
| Priority | Best-fit tie-break, like a resource. | 0–999, default 100. |
| Active | Whether the combination participates. | Inactive combinations are never allocated. |
Error codes:
COMBINATION_NAME_TAKEN(409) — rename the combination.CONFLICT(409) — “The combination changed concurrently — retry with fresh members.” Reload the combination list and re-enter your change.
For how the allocator uses resources and combinations once service starts, see The service board and Making a booking.