Crew booking
A React block (a whole screen) in Beamline's Events & bookings app.
Booking crew for a project: each person with a strip of the project's days, days in the same state joined into one run said once (booked solid, available green, unavailable red, unknown hatched and never read as free), each day's booked and free counted over the crew; chosen people invited with what saying yes means made explicit (availability only shows the dates, not the project; a draft puts them on the plan; a final booking fills places first come, and a yes after the last place is told it went); their availability set as available, unavailable or unknown with a repeat and a remark, with what it replaces said; and a person's month with each day's commitments (role, project, Day 2 of 3), a day still loading or failed never called free, where their own time on this project's role is changed (start, end, travel, a planner-only note) without touching the quote's billed time, and set back to the role's time.
Use it for
- Crewing an event, a shoot or an install from a pool of freelancers: who is free, who to ask, who said yes.
- Anywhere an invitation's yes must mean exactly one thing, places must fill first come, and unknown availability must never pass for free.
Not for
- Publishing a staff rota (roster-publish).
- The project's own periods (project-periods).
- A team's calendar of meetings (team-calendar).
Anatomy
- header: the product's mark, the title, the project and its dates
- crew: the key (Booked, Available, Unavailable, Unknown); the days with their weekday; each day's booked and free counts; each person's choice box, initials, name and functions, and their days as joined runs, each run's state said once (each day's state in its accessible name); with people chosen, Set availability and Invite
- schedule card: the chosen person's month with marked days, previous and next month, the chosen day's commitments (role, project, hours or All day, Day N of M, Own time), Change this person's time on this project's
- time override: Their own time, start, end, travel (none, out, back, both), a planner-only note, the quote's billed time kept, Save time or Back to the role's time
- invitations: each batch's kind and role or dates, when sent, places left, each person's answer in words
- invite (sheet): what it asks (with what yes means), role and places, from and to, answer by, message, what they'll see, Send
- set availability (sheet): available, unavailable or unknown, from and to, repeats (recurrence-editor), remark, what it replaces, Save
States
- day: available, unavailable (struck), booked, unknown (hatched)
- schedule: a day with commitments, none, loading, failed; a run of days (Day N of M); own time
- override: from the role's time; own time with travel and a note; saving; saved; back to the role's time; refused
- invitation: availability only, draft, final; sending; sent (pending); free; declined; on the plan as a draft; booked; filled after the last place; refused with the reason
- availability: available, unavailable, unknown (said never to read as available); repeating; replacing an existing entry (said); saving; saved
- look only: no choice boxes or actions, the permission said
- loading: shaped skeletons; no crew: an empty state
- phone: the crew with their strips full width, then the month and the invitations
- right to left: the layout and the month arrows mirror
- reduced motion: through the tokens
Keyboard
- Tab through each person's choice box and name, the month's arrows and days, the day's commitments and Change this person's time, the invitations
- Escape closes a sheet
Motion
Nothing moves beyond the parts' own feedback. Nothing runs at rest.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
projectName (required) | string | — | |
days (required) | string[] | — | The project's days, ISO dates, in order. |
crew (required) | CrewMember[] | — | |
defaultAvailability | AvailabilityEntry[] | — | |
defaultCommitments | Commitment[] | — | |
defaultBatches | InviteBatch[] | — | |
roles | string[] | — | Roles the project needs, offered in an invitation. |
dayStatus | Record<string, Record<string, "failed" | "loading">> | — | Days whose commitments are still loading (or failed), per person: never shown as free. |
defaultPersonId | string | — | |
defaultSelectedDay | string | — | |
defaultChosen | string[] | — | People chosen for Invite and Set availability when the screen opens. |
today | string | — | Today, ISO date, written on what the block records itself. |
onInvite | ((draft: InviteDraft) => Promise<void | InviteBatch>) | — | Send invitations; resolve with the batch as saved (its responses start pending). |
onSetAvailability | ((entries: AvailabilityEntry[]) => Promise<unknown>) | — | Save availability for people; reject to keep the form with your reason. |
onOverride | ((commitmentId: string, override: { start: string; end: string; travel: "back" | "both"… | — | Save a person's own time on a role (null goes back to the role's time). |
canEdit | boolean | — | |
loading | boolean | — | |
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
- Avatar
- Badge
- Button
- Calendar
- Checkbox
- Date picker
- Empty state
- Input
- Label
- Number field
- Radio group
- Recurrence editor
- Segmented control
- Select
- Sheet
- Skeleton
- Spinner
- Switch
- Text morph
- Textarea
- Toggle group
- Tooltip
Dependencies
lucide-react
Import
import { CrewBooking } from "@beamline/crew-booking";
Get it
Crew booking 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 Events & bookings
- Team calendar: A team's schedule: the people and shared calendars to show (each its colour), a month to jump by, who is out this week, and the week, day or month of…
- Day agenda: One person's days with notes, tasks and calendar events side by side, each kept as what it is. A task's scheduled day, deadline, reminder and repeat are…
- Resource booking: Booking something shared (a room, a van, a camera kit). Choose what, then either a free hour on a day: a grid of starts the app says are free (a taken…
- Resource rules: Each person's scheduling rules beside their day, the day board leading: role, available (an unavailable day filled in the danger tint and said, a job…
- Desk booking: Desks in an office for the people who book them and the admin who sets how far ahead. Your days over the next weeks: booked with a desk, free to book…
- Linked appointments: A drop-off and a pickup kept as one linked pair on the week's calendar (the shared event calendar, day view on a phone), with the car's stay drawn…
- Waitlist desk: A front desk's waitlist beside the day's book: who is waiting (filters as chips, the queue's count apart from the day's), the day's bookings and the…
- Visitor desk: An office front desk's visitors. Invite a meeting's guests from the calendar: colleagues are shown but never invited, guests without an email are said…
- Issued ticket: One issued event ticket at the door, led by the ticket itself: what it admits to (event and venue), when, the section, seat and who it admits, and its…
- Itinerary: A trip's days where every event says who sees it, in words: everyone, only Ana and Ben, or hidden from Leo. The same rules give each traveller their own…
- Trip budget: A trip's money against its plan, in the trip's own currency. The budget (set or changed in place; a refused save keeps what was typed), what's spent and…
- Proposal payments: A travel proposal's money from the agent's side to the client's. Pricing: the price rule (markup on supplier cost, a fixed price, or net), what the…
- Project periods: A project's time periods (build, show, teardown) on one time scale, the thing being planned: each period a bar across its days with the crew and gear…