Skip to content

v1.15.1 - #141

Merged
pataniaeli merged 14 commits into
mainfrom
dev
Sep 17, 2026
Merged

pataniaeli merged 14 commits into
mainfrom
dev

Conversation

@pataniaeli

Copy link
Copy Markdown
Collaborator

No description provided.

pataniaeli and others added 14 commits September 16, 2026 10:17
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]>
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)
@pataniaeli pataniaeli self-assigned this Sep 17, 2026
@pataniaeli pataniaeli added bug Something isn't working documentation Improvements or additions to documentation enhancement New feature or request revision Nothing is broken, but something needs to be resolved labels Sep 17, 2026
@vercel

vercel Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
chambers Ready Ready Preview Sep 17, 2026 3:14pm UTC

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation enhancement New feature or request revision Nothing is broken, but something needs to be resolved

Projects

None yet

1 participant