Skip to content

Screens: inventory, members and settings

S5. Inventory list (inventory) ← R2 header/stat cards + adapted dense table (§5)

Section titled “S5. Inventory list (inventory) ← R2 header/stat cards + adapted dense table (§5)”

Layout: L3 ListLayout width="wide". The slots are filled as follows: header = title, meta counts, “+ Add item” primary, an Export menu as secondary; callout = reorder suggestions; tabs = All / Low / Out / Archived; filters = search, saved views and column picker; body = table (DataTable in card chrome); bulkBar = QR enable/disable and export; detail = S6 drawer.

Inventory ( Export ▾ ) [■ + Add item ]
248 items · 12 low stock · 3 on the repair shelf
┌ ! 6 items are at or below their reorder point. Review suggestions → ┐ (only if >0)
All 248 │ Low stock 12 │ Out of stock 4 │ Archived [ Search items ⌕ ] [Views ▾] [Columns ▾]
┌──────────────────────────────────────────────────────────────────────────────────────────────┐
│ ☐ Item Mode Total Available Issued Damaged Lost ⋯ │ 40h header
│ ☐ [img] Arduino Uno R3 Count 20 (Limited) 3 15 1 1 ⋯ │ 56h rows
│ ☐ [img] Multimeter Fluke 101 Individual 6 (Available) 5 1 0 0 ⋯ │
└──────────────────────────────────────────────────────────────────────────────────────────────┘
1–24 of 248 ‹ 1 2 3 … 11 ›
╭ 3 selected ( Enable QR ) ( Disable QR ) ( Export 3 ) Clear ╮ ← sticky bulk bar
  • Collapse the ~9 toolbar buttons to: primary “+ Add item”; secondary “Export ▾” (CSV/XLSX, scoped to the selection when rows are selected); filter tabs for Active/Low/Out/Archived (replacing three toggles; the archived, low_stock and out_of_stock URL params are unchanged); Saved views and a column picker on the right. Bulk QR enable/disable lives only in the selection bar (the existing BulkActionToolbar).
  • Row: the whole name cell opens the item detail. The row “⋯” menu holds Edit, Move to repair shelf…, Add to To buy…, Archive. Archive has no confirm dialog because it already has a toast with Undo (useInventoryArchive): “Arduino Uno archived. Undo”. Restore works the same way.
  • The availability cell keeps InventoryAvailability as a status pill with the word.
  • ReorderSuggestions becomes the single callout (P5.1) linking to a drawer with the suggestions.
  • Empty (no items): “No parts added yet. Add your first item.” with “+ Add item” repeated in-card (brand voice example). Filtered empty: “Nothing low on stock.” / “No archived items.”
  • Mobile: table becomes stacked cards (image, name, availability pill, “Issued 15 · Damaged 1 · Lost 1”), selection via long-press or a checkbox; bulk bar fixed at the bottom.

S6. Inventory item detail ← R7 (detail header + tabs) + R5 (settings rows, danger zone)

Section titled “S6. Inventory item detail ← R7 (detail header + tabs) + R5 (settings rows, danger zone)”

Layout: L4 DetailLayout presentation="drawer" width=720. The slots are filled as follows: identity = image; status = availability; tabs = Details / Stock / QR & assets / History / Custody; Details main = SettingsRows (the rows from L5, used standalone) with a dirty save footer; danger = Archive. Add item is L6 FormPageLayout; preview = the public ProductCard.

Opens as a drawer at 720 px or full screen on mobile (it is currently the ItemModal with 8 stacked blocks). Deep link ?item=<id> (new param; the current id list filter stays separate).

← Inventory
[img] Arduino Uno R3 ( View public page ↗ )
(Limited) Count-tracked · Electronics · Public: status only
Details Stock QR & assets History Custody
───────────────────────────────────────────────
Details: settings rows (Name & description │ Photo │ Category │ Public visibility │ Kit components │ Borrowing terms)
( Discard ) [■ Save changes ] ← appears when dirty
┌ Archive item ─ Hides it from active inventory and the public catalogue. ( Archive… ) ┐ red
  • Stock tab: stat cards (Total, Available, Issued, Damaged, Lost), then QuantityAdjust as a form card with a reason; Individual mode adds the asset table (IndividualAssets).
  • QR & assets: QrHistory. History: LendingHistory. Custody: ChainOfCustodyBlock. The last two only when canViewAudit.
  • Public visibility row groups is_public, public_availability_mode (segmented: Exact count / Status only / Hidden) and show_public_count, with a live preview pill of what the public sees (R3 live-preview pattern). The rule from CLAUDE.md is computed client-side only for display. “Exact count” with show_public_count=false previews as “Limited” and the helper says why.
  • Add item uses the same layout as a create page (R3): form left, “Public catalogue preview” card right (ProductCard rendering). Then, as today, it reopens in edit mode to add a photo, with the copy “Item created. Add a photo so members can recognise it.”

Layout: L3 ListLayout. The slots are filled as follows: header = “Invite member” primary; callout = pending requests; tabs = Members / Requests / Present now / Plans / Waivers; body = table; detail = member drawer (L4 drawer with SettingsRows).

Members [■ Invite member ]
People who belong to this makerspace and what they can do here.
┌ ! 3 people are waiting for approval. Review requests → ┐
Members 128 │ Requests 3 │ Present now 4 │ Plans │ Waivers [ Search ⌕ ] [Status ▾]
┌──────────────────────────────────────────────────────────────────────────────────────┐
│ Person Role Status Waiver Joined ⋯ │
│ (MN) Meera Nair (Verified) (Member) (Active) Current 13 Oct ⋯ │
│ meera@example.test │
└──────────────────────────────────────────────────────────────────────────────────────┘
  • Invite = the R4 invite card pattern, opened from the primary into a modal: email, role select (defaults to first role, as today) and “Send invite”. The Requests tab lists both membership requests and staff invitations (today’s second panel), each with inline “Approve” (primary pill) and “Decline…” (red text). The plan picker appears inline in the approve modal when membership is on.
  • Row “⋯”: Change role, Verify / Unverify, Can refer (toggle), Can verify (toggle), Terms, Record witnessed acceptance (only when the waiver is needed), then a divider, then “Revoke membership…” (red). Clicking the row opens a member drawer with settings rows (role, capabilities, waiver, payments via PaymentReconcileActions, vouches) so the table row stays one line.
  • Present now tab = the current “Currently present” panel as a P14 table with “until 18:30”. The Plans and Waivers tabs show only when membership is on and canManageMakerspace (current gating).
  • Empty (members): “It’s just you so far. Invite someone with the button above.” Requests empty: “No one is waiting. New membership requests appear here.”
  • Mobile: the table becomes cards (name, role and status pills, ⋯).

S8. Staff & roles (users) ← R4 (table) + R6 (checkbox cards for permissions)

Section titled “S8. Staff & roles (users) ← R4 (table) + R6 (checkbox cards for permissions)”

Layout: L3 ListLayout. The slots are filled as follows: tabs = Staff / Roles / Invitations; body = table. The role detail is L4 DetailLayout (page). Its main = permission checkbox-card groups with a Discard/Save footer, and danger = “Delete role…”. “Create makerspace” is L6 (or an L7 onboarding flow).

Staff & roles ( Create makerspace )* [■ Add staff ]
Who can work in this makerspace and what each role is allowed to do.
[Makerspace ▾]* Staff 9 │ Roles 6 │ Invitations 1
Staff table: Person · Role (pill) · Makerspace* · Status (Restricted pill if any) · ⋯ (Change role, Reset password…, Restrict…, Restore, Revoke role…)

* superadmin / multi-makerspace only.

  • The first-staff invitation link renders as the R4 invite-link card (read-only field, “Unused” pill, “Copy link” primary, “Dismiss”).
  • Roles tab: role list rows (name, the “Default” pill for the 4 protected roles, “n actions”, “m staff”) leading to a role detail with the RoleEditor actions grouped as checkbox cards (R6) by area (Lending, Inventory, Machines, Community, Money, Admin), each card showing the human label plus the action key in mono, and RoleMachineScopeEditor as its own settings row. Save via a Discard/Save pair. Danger zone: “Delete role…” for custom roles.
  • Invitations tab: StaffInvitations (when staff.invitations).
  • Empty: “No staff yet. Add staff to share the work.”

S9. Makerspace settings (settings) ← R5 + R6 + R17

Section titled “S9. Makerspace settings (settings) ← R5 + R6 + R17”

Layout: L5 SettingsLayout subnav="auto". The slots are filled as follows: sections = the 12 groups in the table below, each with its own save; danger = the archive request. The Settings-family siblings (Staff & roles, API access, and the rest) are separate tabs using L3 or L5 as listed in S24.

MakerspaceSettingsPanel stacks ~30 independent sections on one page. Spec: an in-page sub-nav (sticky, left column 200 at ≥1280; a horizontal scroll chip row below that) with scroll-spy, so no routing change is needed. Optional later: settings/<section> via TABS_WITH_SUBPATHS, which PLAN §5 already allows.

Sub-nav section Existing components
General MakerspaceGeneralSettings, MakerspaceProfileSettings, MakerspaceLocationSettings (incl. hours)
Branding & public site MakerspaceBrandingSettings, MakerspacePublicStatsSettings, public print status lookup policy, MakerspaceSubdomainSettings, MakerspaceCustomDomainSettings
Features MakerspaceFeatureSettings, SpacePacksPanel
Lending loan, reminder and kit settings inside MakerspaceReminderSettings, KioskStationSettings
Membership MakerspaceMembershipSettings, MakerspaceGeofenceSettings
Bookings MakerspaceBookingSettings, MakerspaceBookingRulesSettings
Machines & materials MakerspaceFilamentSettings
Money MakerspacePaymentSettings, BillingDocumentsSettings
Notifications staff email toggle, NotificationTimingSettings, NotificationMuteMatrix, NotificationRecipientPicker, NotificationDestinations
Email & integrations MakerspaceEmailSettings, MakerspaceWebhookSettings, IntegrationHealthPanel
Privacy & evidence Superadmin access, EvidenceRetentionPanel (and AbandonedUploadCleanupSection where it lives)
Danger zone MakerspaceArchiveRequestPanel (the two-key archive request) as a P16 card
  • Every section is a P15 block: an h2 section title (20 bold), then rows with label and helper on the left and the control on the right.
  • Save model: instant toggles keep saving on change, with a toast “Staff emails turned off.” and, where the PATCH is symmetric, Undo by re-PATCHing the previous value. Text and field groups get a per-section Discard/Save pair that appears only when the section is dirty (sticky at the bottom of the viewport while that section is in view). Never one global Save for 30 sections.
  • Status pills on rows (On/Off, “Token only”) stay; the button copy is the action (“Turn off access”).
  • The “Manage my authenticator…” link moves to the user menu (§2.4); it is personal, not makerspace configuration.
  • The h1 “Makerspace settings” is a test pin and is kept. The sidebar item reads “General”.
  • Loading: row skeletons per section. Error: per-section error with Retry (the sections load independently).

Part of Space Works UX spec, published from docs/ux-spec.md. Edit it there.