Skip to content

Staging Release - #1565

Merged
rlho merged 39 commits into
stagingfrom
main
Aug 25, 2026
Merged

rlho merged 39 commits into
stagingfrom
main

Conversation

@rlho

@rlho rlho commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Summary of Changes

Schema Changes

  • No tenant schema changes
  • Schema changed (describe below)

Checklist

  • I linked relevant issue(s) in the Development section
  • I checked for existing implementations and confirmed there is no duplication
  • I thoroughly tested this feature locally
  • I added or updated unit tests (or explained why not in the PR description)
  • I attached screenshots or a video demonstrating the feature (or explained why not in the PR description)
  • I reviewed all High and Medium severity comments from Claude's code review, and replied to every High severity comment (a reply is required for High), then marked conversations as resolved
  • I confirmed my PR passed all unit and end-to-end (E2E) tests
  • I confirmed there are no conflicts
  • I requested a code review from at least one other teammate

Screenshots / Video

n3xta and others added 30 commits July 21, 2026 10:41
feat: add per-resource service approvers UI
`resource.services` is typed as `string[] | ResourceServicesConfig`, but
the service-approver options builder called `.reduce()` directly, which is
only valid on the array arm. This broke the deploy build with TS2339.

Normalize both shapes with the existing `isLegacyServicesArray` guard
before reducing: use the array as-is, otherwise take the config object's
keys as the service names.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…list

Replace the Copilot feedback checklist item with one covering Claude's
code review: all High and Medium severity comments must be reviewed,
and every High severity comment requires a reply before resolving.
…eerror

Fix deploy build type error on resource services reduce
…checklist

Require review of Claude code review High/Medium comments in PR checklist
MC-Pregame-GAS PR #45 changed the calendar event description:
- New "Secondary Contact Email" line -> store as secondaryEmail
- "Secondary Contact Name" now carries real values -> also populate the
  split secondaryFirstName/secondaryLastName fields used by new bookings
- "Attendee Affiliation" now carries real values -> normalize onto the
  AttendeeAffiliation enum, passing unknown values through
- Staffing lines are now room-prefixed option values ((230)/(103) ...),
  which the existing pass-through parsing already handles

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Parse the "Booking Type" description line instead of hardcoding an
  empty bookingType (the line has existed since GAS PR #18).
- Canonicalize staffing entries: map GAS room-prefixed labels
  ("(103) Lighting Tech - Busking") onto the form's stored option values
  (LIGHTING_TECH_BUSKING) via the MC resource services config; rooms
  without a config keep the bare label (legacy value === label), and
  unmatched labels keep the (roomId) prefix so dry-run flags the drift.
  Keep the room-prefixed original in staffingServicesDetails.
- Store "yes" (form value) in cleaningService instead of the checkbox
  literal "true"; getMediaCommonsServices keys the cleaning flag off it.
- Mirror the form's forceCleaning coupling: catering requests also
  enable cleaning (every MC catering config sets forceCleaning).
- Stop storing checkbox "true" in cateringService (display-only field).
- Tolerant service detection: any value except empty/none/false/no
  counts as requested, so GAS moving from checkboxes to descriptive
  values cannot silently drop setup/catering/cleaning/security.
- Tighten attendee affiliation "all" matching to avoid substring
  false-positives.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Verified against all 43 rows of the live "Media Commons Pregame Fall
2026" sheet (the source of the events on the GAS Draft calendars):

- Staffing dropdowns store option labels without their section prefix
  ("A1", "General House Tech"), so also match the label segment after
  the " - " separator when canonicalizing.
- Expected Attendance now uses "<75"/">=75" buckets; map them to
  "74"/"75" so parseInt comparisons (isLargeEvent >= 75) work.
- Dry-run flags large events (>= 75) whose sheet row has no security,
  mirroring the form's forced-security rule for visibility.

With these changes every row round-trips with service flags identical
to the sheet checkboxes (incl. catering->cleaning coupling), staffing
values canonicalize with zero unmatched entries, and affiliation maps
onto the enum for all rows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Test imports override the requester email so real users never get
notified from dev, but the newly imported secondaryEmail kept the real
address; approving a test booking in dev would email that contact via
admin.ts. Store the +pregame alias there too when testMode is on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per the 6/16 BT meeting decision, pregame bookings that request services
must no longer skip service review on final approval. Remove the
isPregameOrigin bypass and approveAllPregameServices so pregame bookings
follow the same Pre-approved -> Services Request path as user bookings;
service-less pregame bookings still batch-approve straight to Approved.

Adds invariant tests: services route to Services Request with no
auto-approved services, service-less bookings still approve, and Approved
is reachable only after every requested service is individually approved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Handle new Pregame GAS event description format in the import
…en't crowded out

The paginated bookings fetch orders by startDate descending with a 500-row
limit. The liaison view's default "All Future" range is open-ended, so once
a semester's bulk bookings push the future count past 500, the window holds
only far-future rows and near-term REQUESTED bookings never reach the
client — the approval table renders empty while approval emails still go
out. Let the client pass a sortDirection and have the liaison All Future
view fetch ascending (nearest first).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011qR68PCSFw39F5yCxBaDRR
Annex (auxiliary space) resources in the tenant schema can now declare
parentResourceId. Such resources are hidden from the top-level room list,
their annex checkbox options are derived from the child resources (with
fallback to services.annex options for unmigrated tenants), selecting one
invites its calendar to the booking's calendar event (create/edit/
modification), and the bookings API rejects them as standalone rooms.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remove the faculty/staff-only gate on auxiliary spaces: the annex
checkboxes now render for every role and the bookings API no longer
strips annexByRoom for students. Drops the now-unused
canRequestAuxiliarySpaces helper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Selected annex spaces now render their own availability column next to
the parent room on the room selection page. Extracted the schema
resource → RoomSetting conversion into a shared helper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat: add date range to booking CSV export

This branch was previously deployed

3 inactive deployments
staging — 4b7d4fcb Deployed Aug 26, 2026 by rlho via trigger-auto-checkout (staging) #16122
production — 4b7d4fcb Deployed Aug 26, 2026 by rlho via trigger-auto-checkout (production) #16122
dev — 4b7d4fcb Deployed Aug 25, 2026 by rlho via deploy #754
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants