v1.15.1 - #141
Merged
Merged
v1.15.1#141
Conversation
Seven days times one lane per space is 21 columns. On a phone that left each about 17px -- not a layout to tune but a layout with no phone form at all, since a lane that narrow cannot carry a title, a name, or a reliable tap target. Narrow screens now show one day at a time, with every space still side by side. That keeps what the view is for: "which room is free at 3pm" is the question it exists to answer, and it cannot be answered one room at a time. A day picker above the grid moves between the days of the week on screen, marking today distinctly from the day being shown, and the sticky day header is dropped there -- with a single day on screen it spent ~100px of a phone's height repeating what the picker already said. Where the switch happens depends on how many lanes a day carries, because the calendar never gets the whole viewport: the shell's sidebar takes 224px from md up and <main> adds 64px of padding. Two spaces hold up to lg, three to xl, and more than that to 2xl. A 1024px window with three spaces gives each lane 32px, which is the crushing this issue is about rather than a fix for it. Done entirely in CSS, with all seven days rendered and all but one hidden. Measuring the viewport in JS would mean either a server render that is wrong for half the visitors and corrects itself after hydration, or no server render at all; this way the markup is right at every width on the first paint. Single-space weeks are untouched at every width -- seven columns of one lane are what that view has always been, and they are fine. Verified at 375, 768, 1024 and 1280: the day picker switches days, tapping a free slot still selects the hour and reports the spaces free for it, the advance notice window still refuses a slot inside it, and the week returns unchanged above the breakpoint. Co-Authored-By: Claude Opus 5 <[email protected]>
Only SGA Spaces bookings reached Outlook. Room bookings now do too, by the same means: the email a body already receives carries the invite, so no address is emailed that was not being emailed before. What goes on a calendar follows the allow-list Slack reminders use -- Reserved, the three Alternates and Virtual -- with Tentative sent as a tentative event. Waitlisted stays off until an administrator settles it, Pending Cancellation leaves the calendar untouched until the request is decided, and everything else comes off. An edit is a diff: weeks that are still meetings are re-sent, and ones that stopped being meetings, including weeks trimmed off a series, are cancelled. Past sessions are never touched, and a session nobody was invited to is never cancelled at them. Three paths changed a status and told the body nothing -- the admin Cancel button, approving a cancellation request, and Auto-Cancel, which emailed CSC alone. Each now sends a cancellation that also clears the event. A meeting moving online keeps its event, with Virtual as the location. One-time sessions are written in place, keyed on their id, the treatment issue #113 gave weekly occurrences: the delete-and-reinsert gave every session a new id on each save, so an invite had nothing stable to name and calendars would have collected an event per edit. Senate members who follow only some session types get only those sessions on their calendar, so one booking can send an email per audience. Every other body is a single email, as before. The VCALENDAR wrapper, escaping and SEQUENCE move to ics-core and are shared with the Spaces invites, whose output is unchanged byte for byte. Co-Authored-By: Claude Opus 5 <[email protected]>
Give the all-spaces calendar a phone layout (#125)
…-invites Calendar invites for room bookings
Pending hid where a request was waiting. Room and revision requests now start in Ops Review, and an admin can mark one Sent to CSC (Awaiting CSC) when Operational Affairs passes it on. The Requests tab leads with the suggested next step from each status but lets admins move freely: back to Ops Review, Fulfill or Deny from either open status, and Reopen a denial. A fulfilled request stays final, since a booking is linked to it. Only Ops Review counts as an admin Pending Action; Awaiting CSC is waiting on CSC. Requesters get a bell notification when their request goes to CSC, see what each open status means on the Request page, and a booking's leaders see its open revision request, and its status, in the booking detail. The migration renames 'Pending' to 'Ops Review' on both tables and must ship with this code: the old code inserts 'Pending'. Co-Authored-By: Claude Opus 5 <[email protected]>
An SGA Space booking could only list Chambers users, so an interview candidate or a guest from another office couldn't be put on it or sent its invite. Typing an @northeastern.edu address in the attendee search now offers to add it when no Chambers user has that address, and it shows as a dashed chip. Addresses are stored in a new external_attendees column on bookings and series, validated to @northeastern.edu and capped at 25. Every place that works out who to email -- create, edit (added/removed diff), cancel, blackout cascades, and all three series routes -- resolves attendees through attendeeKeys, where an external address is an `email:` key that resolveSpacesAddresses maps to itself. So external attendees get the same invites, updates and cancellations as everyone else. The room display counts them as "Guest" instead of showing their address. Co-Authored-By: Claude Opus 5 <[email protected]>
The weekly grid labelled each row with the owning body's name, so a division-wide booking read as a booking for its primary body. It now uses formatScopeLabel, like the rest of the admin UI: a divisional booking shows its division, and a multi-body booking shows its owner plus the count of the others. Co-Authored-By: Claude Opus 5 <[email protected]>
Applied to production as 20260917004809_space_external_attendees; contents unchanged. The rollback's header now names the renamed file. Co-Authored-By: Claude Opus 5 <[email protected]>
…tuses Ops Review and Awaiting CSC request statuses (#128)
Applied to production as 20260917150907_request_review_statuses; contents unchanged. The rollback's header now names the renamed file. Co-Authored-By: Claude Opus 5 <[email protected]>
Co-Authored-By: Claude Opus 5 <[email protected]>
Rename the #128 migration to the version production recorded
…y-label Name the scoped entity in the admin weekly bookings grid (#133)
…tendees External attendees on SGA Space bookings (#132)
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This was
linked to
issues
Sep 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.