Repository navigation
Conversation
Migrate to pnpm 12 and Vite+, React 19 with shadcn and FullCalendar, TanStack Router and Query, Apollo Server, Prisma 7, and generated TypeScript contracts. Restore compact room filters and original calendar, booking, and rules behavior. Add signed sessions, private phone fields, serializable booking writes, modern CI, and real Gamma Playwright coverage. Keep PostgreSQL 12 and Redis 5 server upgrades as documented separate follow-ups. Verified 45 unit/API tests, four E2E flows, strict types and lint, production builds, clean dependency audit, and local Docker smoke tests.
Invalidate the moved booking's detail query alongside all calendar ranges. Cover opening details, dragging, immediately editing and preserving the moved timestamps in the real browser suite.
Build frontend and backend from the repository root, replace obsolete demo Gamma settings with required current OIDC configuration, and keep backing services private on the deferred database versions. Document explicit schema setup and existing database storage migration precautions.
Split four packed flows into ten independent tests while sharing the existing worker environment. Separate setup, actions and assertions with whitespace, format all E2E files with Vite+, and document role-first selectors with date/time label fallbacks. Verified ten browser tests, the retained mobile day-view regression, 45 unit/API tests, strict TypeScript and formatting/lint checks.
|
@GAsplund I see! Check it out, all fixed. |
Fixed @Goosetaf |
|
Having tried to set it up locally, I found a few things:
|
`pnpm deploy --legacy` in the Dockerfile re-resolves dependencies instead of using the lockfile, so the exact-version allowlist entries broke the image build once @prisma/engines 7.10.1 was published. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Restore the original brighter room colors; the theme refresh had muted them. - Drop the admin shield icon from the header since it carried no meaning. - Keep list and month list-item rows plain for multi-room bookings and show the booked rooms as diagonal bands in the dot, so single- and multi-room rows look consistent. Block events keep the striped background. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
It was from the theme refresh, not the dimming. Restored the original room colors (
It was an admin marker with no function. Removed.
The list view (and the month view's timed entries) now keeps a plain row for every booking, and the dot is gone. The striped background is kept only for block events in the week/day views and multi-day rows. Also fixed in 62d2b43: the Docker image build started failing because And in a7ce9eb: the CI audit step failed on advisories published since the last run, so Vite+ is now 1.3.0 (Vitest 5) and the remaining dependencies were refreshed within their ranges. The PR description's dependency table is updated. |
The CI audit started failing on advisories published after the last run, most of them in Vite+ 0.3 and its bundled Vitest, oxfmt and tinypool. Move to Vite+ 1.3.0 (Vitest 5) in the workspace, overrides and CI, and refresh the remaining dependencies within their ranges to pick up the patched Express, axios, Prisma, testcontainers and GraphQL tooling releases. TanStack Router now types route errors as unknown, so the root error component coerces before rendering. The one remaining advisory, braces stack exhaustion, has no patched release and is only reached when globbing our own schema files, so it is ignored explicitly in the audit configuration. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review feedback: the dot carried no meaning for multi-room bookings, so list-item entries now show only the time and title on a plain row. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The rule label had z-index 2 so it stayed clickable above FullCalendar's event layer, which spans the whole lane. That also drew it over bookings that overlapped the rule. The event layer is now click-transparent with events and more-links opting back in, so the label can sit in the background layer and still receive clicks where no booking covers it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Found with knip and a manual sweep of the configuration: - bookit: drop the direct pg and @types/pg dependencies, which @prisma/adapter-pg already provides; move tsx to devDependencies since only the dev script uses it and the image runs the compiled build; drop the unreferenced start script, the missing index.js entry, the empty description and author fields, and correct the license to MIT to match the LICENSE file. - root: drop the vite alias, which Vite+ provides transitively and nothing at the root peers on. - frontend: remove the unused calendar expander icon, the unused shadcn card, dialog, table, and tabs sub-components, exports nothing imports, and the unused eyebrow style and token. - e2e: keep the container image list internal to compose.ts. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The calendar and booking page derived edit permission from the user's groups, but the server applies more checks when a booking is moved: an anonymized contact or a private booking of a restricted room fails validation even for an administrator, so a drag ended in an error toast. Each booking now carries can_edit and can_move flags computed by the same predicates the mutations use. The calendar only enables dragging for movable bookings, and the booking page only shows Edit and Delete when the server would accept them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review finding: can_move only mirrored two of the checks a move runs against the unchanged booking, so a legacy booking longer than the maximum range or with an invalid stored phone number still reported can_move true and failed with a toast after the drag. The checks that depend only on the booking and the acting user now live in one function shared by validation and can_move: end after start, maximum length, group membership, contact present, no private booking of restricted rooms, at least one room, and a valid phone number. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Any non-alumni super group a user belonged to could book rooms, so the
set of booking groups could only be changed by editing Gamma group types.
Maintainers now assign the super groups that may book to a client
authority on the BookIT client in Gamma (BOOKING_AUTHORITY, default
"booking"), read through Gamma's new GET /api/client/v1/authorities/{name}.
Sessions get the user's non-alumni super groups that also hold the
authority. A missing authority is logged and leaves nobody able to book
as a group rather than falling back to every membership; other Gamma
errors still fail the sign-in. The admin authority is unchanged.
The e2e harness provisions the authority for digit and accepts a
GAMMA_IMAGE override, since the pinned Gamma 2.5.1 predates the endpoint.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The local Gamma seed now grants digIT the booking authority and adds a hobbyIT super group, of which bookmember is also a member, without it, so the local stack shows that membership alone no longer allows booking. Gamma creates users before super groups and groups, so gamma-init now also waits for the seeded groups before inserting rows that reference the digit super group. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gamma 2.5.3 ships GET /api/client/v1/authorities/{name}, so local
development and the e2e suite now run against it instead of 2.5.1,
and the documentation names the minimum version.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review findings on the booking authority: - Gamma's mock bootstrap appends the year to group names, so gamma-init never saw digit-local and hobbyit-local and the local stack could not start. It now waits for the fixture group IDs, which Gamma keeps. - Sessions stored in Redis by an older build kept their group list and bypassed the authority check until they expired. The store now tags each session with a version and discards sessions from other versions, so an upgrade forces a fresh sign-in. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Goosetaf
left a comment
There was a problem hiding this comment.
I have been demoed the application and I can see clear improvements. Thank you for this.
LGTM







Important
Deploy steps, in order
bookingon the BookIT client and assign the super groups that may book.ghcr.io/cthit/bookit:<tag>, port 8080 serving/and/api. Keep the backend's env vars, addDB_HOST,DB_NAME,DB_USER,DB_PASS, andNODE_ENV=production.prisma migrate resolve --applied 20260920000000_initialwith the app's env. Without it the image exits with P3005.No pending migrations to apply.db-scriptscleanup job; the backend does it now.bookingauthority means step 2 is missing.Details: README, Production.
Modernizes BookIT across the UI, runtime, and deployment. Replaces the legacy frontend with TypeScript and shadcn/ui, generates GraphQL contracts, strengthens booking concurrency and contact-data privacy, and serves the frontend and API from one container.
Review guide
bookingauthority deciding bookable groups, per-bookingcan_edit/can_moveflags, transactional overlap checks, and automatic contact-data cleanup.Dependency changes
Removed unused legacy dependencies including express-session, connect-redis, js-base64, qs, prop-types and web-vitals. Moved personal-data cleanup from the separate Jobber container into the backend. Updated CI and container builds for the workspace layout.
Existing PostgreSQL 12 and Redis 5 deployments remain supported. The optional production Compose stack uses PostgreSQL 16; migrating existing PostgreSQL 12 data to it requires dump/restore, not reusing the old data directory.
Upgrade verified from main
Tested locally by running the current
mainrelease (its backend creates the schema withprisma db push) against a fresh PostgreSQL 12, Redis 5, and Gamma 2.5.3, creating 14 bookings through its UI, then switching the same database and Redis volumes to this branch's image:prisma migrate difffrom the live database to the new schema produced an empty migration, so the pushed schema matches.prisma migrate resolve --applied 20260920000000_initial, the image started with "No pending migrations to apply".Issues resolved
Screenshots
Desktop
Rules table
Calendar — list view
Calendar — month view
Calendar — week view
Mobile
Mobile — booking form
Mobile — rules table
Mobile — list view
Mobile — month view