From b36d9320f69747944ed8fa42ecef2b032cacaaa8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 19 Jan 2026 20:47:49 +0000 Subject: [PATCH 1/5] Add guest permissions and meeting visibility controls to event types This commit implements granular controls for guest permissions and calendar visibility on a per-event-type basis. Features added: - Guest Permissions: - guestsCanModify: Allow/prevent guests from modifying events (default: false) - guestsCanInviteOthers: Allow/prevent guests from inviting additional attendees (default: false) - guestsCanSeeOtherGuests: Allow/prevent guests from seeing attendee list (default: true) - Calendar Visibility: - visibility: Controls Google Calendar event visibility (default/public/private) - default: Uses calendar's default visibility - public: Event details visible to everyone - private: Shows only as "Busy" without details Implementation: - Updated EventType interface in both frontend and backend - Added UI controls in ConfigScreen under "Guest Permissions & Visibility" section - Applied settings in bookTimeslot() when creating calendar events - All fields are optional for backward compatibility Files modified: - frontend/src/models/EventType.ts - backend/src/app.ts - frontend/src/components/ConfigScreen.tsx --- backend/src/app.ts | 19 ++++ frontend/src/components/ConfigScreen.tsx | 116 +++++++++++++++++++++++ frontend/src/models/EventType.ts | 6 ++ 3 files changed, 141 insertions(+) diff --git a/backend/src/app.ts b/backend/src/app.ts index ce13f71..8480fdf 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -11,6 +11,12 @@ interface EventType { DAYS_IN_ADVANCE?: number; CALENDARS?: string[]; schedulingStrategy?: 'collective' | 'round_robin'; + // Guest permissions + guestsCanModify?: boolean; + guestsCanInviteOthers?: boolean; + guestsCanSeeOtherGuests?: boolean; + // Meeting visibility + visibility?: 'default' | 'public' | 'private'; } const CONFIG = { @@ -252,6 +258,19 @@ function bookTimeslot( status: "confirmed", } ); + + // Apply guest permissions (defaults: modify=false, invite=false, see=true) + event.setGuestsCanModify(eventType.guestsCanModify ?? false); + event.setGuestsCanInviteOthers(eventType.guestsCanInviteOthers ?? false); + event.setGuestsCanSeeGuests(eventType.guestsCanSeeOtherGuests ?? true); + + // Apply visibility setting + if (eventType.visibility === 'public') { + event.setVisibility(CalendarApp.Visibility.PUBLIC); + } else if (eventType.visibility === 'private') { + event.setVisibility(CalendarApp.Visibility.PRIVATE); + } + // 'default' visibility doesn't require explicit setting return `Timeslot booked successfully`; } catch (e) { const error = e as Error; diff --git a/frontend/src/components/ConfigScreen.tsx b/frontend/src/components/ConfigScreen.tsx index 27462fa..e155f1f 100644 --- a/frontend/src/components/ConfigScreen.tsx +++ b/frontend/src/components/ConfigScreen.tsx @@ -834,6 +834,122 @@ export function ConfigScreen({ onBack }: { onBack: () => void }) { )} + {/* Guest Permissions & Visibility */} +
+
+ +

+ Control what guests can do and how the event appears in calendars. +

+
+ + {/* Guest Permissions */} +
+
+ updateEventType(index, { guestsCanModify: checked })} + className="mt-1" + /> +
+ + + Guests can change the event time, location, and other details + +
+
+ +
+ updateEventType(index, { guestsCanInviteOthers: checked })} + className="mt-1" + /> +
+ + + Guests can add additional attendees to the event + +
+
+ +
+ updateEventType(index, { guestsCanSeeOtherGuests: checked })} + className="mt-1" + /> +
+ + + Guests can view the list of all attendees + +
+
+
+ + {/* Visibility Setting */} +
+
+ +

+ Control how the event appears in Google Calendar +

+
+ + + + + + updateEventType(index, { visibility: 'default' })}> +
+ Default + Uses calendar's default visibility setting +
+ {(!et.visibility || et.visibility === 'default') && } +
+ updateEventType(index, { visibility: 'public' })}> +
+ Public + Event details visible to everyone +
+ {et.visibility === 'public' && } +
+ updateEventType(index, { visibility: 'private' })}> +
+ Private + Shows as "Busy" without event details +
+ {et.visibility === 'private' && } +
+
+
+
+
+ )} diff --git a/frontend/src/models/EventType.ts b/frontend/src/models/EventType.ts index 42b04ff..b7e467d 100644 --- a/frontend/src/models/EventType.ts +++ b/frontend/src/models/EventType.ts @@ -9,6 +9,12 @@ export interface EventType { DAYS_IN_ADVANCE?: number; CALENDARS?: string[]; schedulingStrategy?: 'collective' | 'round_robin'; + // Guest permissions + guestsCanModify?: boolean; + guestsCanInviteOthers?: boolean; + guestsCanSeeOtherGuests?: boolean; + // Meeting visibility + visibility?: 'default' | 'public' | 'private'; } export interface Config { From 91fa960faf340b2ee2a5d3c5f965761dd6e93d01 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 19 Jan 2026 20:48:24 +0000 Subject: [PATCH 2/5] Update backend package-lock.json --- backend/package-lock.json | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 08827e3..4e43a16 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -7,7 +7,6 @@ "": { "name": "backend", "version": "1.0.0", - "license": "ISC", "dependencies": { "@types/google-apps-script": "^1.0.84", "typescript": "^5.6.3" From 47781e52a5b15a5e8ea57d7bb0797373d9a9722d Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 19 Jan 2026 21:04:27 +0000 Subject: [PATCH 3/5] Improve UX for guest permissions and calendar visibility controls Reorganized the UI to be more consistent with existing design patterns: - Moved guest permissions and calendar visibility OUT of Settings Overrides section - Placed them side-by-side in the main event type editor, below duration and "Show on public selection page" - Changed guest permissions from individual switches to a multi-select dropdown with checkboxes - Kept calendar visibility as a single-select dropdown with detailed descriptions This makes the interface more compact and consistent with the existing dropdown-based controls for scheduling strategy and work days. --- frontend/src/components/ConfigScreen.tsx | 225 +++++++++++------------ 1 file changed, 107 insertions(+), 118 deletions(-) diff --git a/frontend/src/components/ConfigScreen.tsx b/frontend/src/components/ConfigScreen.tsx index e155f1f..170757b 100644 --- a/frontend/src/components/ConfigScreen.tsx +++ b/frontend/src/components/ConfigScreen.tsx @@ -578,7 +578,7 @@ export function ConfigScreen({ onBack }: { onBack: () => void }) { minutes -
+
void }) { If disabled, this type can only be booked via direct links
- +
+
+
+ +

+ Control what guests can do with this event. +

+
+ + + + + + updateEventType(index, { guestsCanModify: checked })} + onSelect={(e) => e.preventDefault()} + > +
+ Allow guests to modify event + Change time, location, details +
+
+ updateEventType(index, { guestsCanInviteOthers: checked })} + onSelect={(e) => e.preventDefault()} + > +
+ Allow guests to invite others + Add additional attendees +
+
+ updateEventType(index, { guestsCanSeeOtherGuests: checked })} + onSelect={(e) => e.preventDefault()} + > +
+ Allow guests to see other guests + View attendee list +
+
+
+
+
+
+
+ +

+ How the event appears in Google Calendar. +

+
+ + + + + + updateEventType(index, { visibility: 'default' })}> +
+ Default + Uses calendar's default visibility setting +
+ {(!et.visibility || et.visibility === 'default') && } +
+ updateEventType(index, { visibility: 'public' })}> +
+ Public + Event details visible to everyone +
+ {et.visibility === 'public' && } +
+ updateEventType(index, { visibility: 'private' })}> +
+ Private + Shows as "Busy" without event details +
+ {et.visibility === 'private' && } +
+
+
@@ -834,122 +939,6 @@ export function ConfigScreen({ onBack }: { onBack: () => void }) { )} - {/* Guest Permissions & Visibility */} -
-
- -

- Control what guests can do and how the event appears in calendars. -

-
- - {/* Guest Permissions */} -
-
- updateEventType(index, { guestsCanModify: checked })} - className="mt-1" - /> -
- - - Guests can change the event time, location, and other details - -
-
- -
- updateEventType(index, { guestsCanInviteOthers: checked })} - className="mt-1" - /> -
- - - Guests can add additional attendees to the event - -
-
- -
- updateEventType(index, { guestsCanSeeOtherGuests: checked })} - className="mt-1" - /> -
- - - Guests can view the list of all attendees - -
-
-
- - {/* Visibility Setting */} -
-
- -

- Control how the event appears in Google Calendar -

-
- - - - - - updateEventType(index, { visibility: 'default' })}> -
- Default - Uses calendar's default visibility setting -
- {(!et.visibility || et.visibility === 'default') && } -
- updateEventType(index, { visibility: 'public' })}> -
- Public - Event details visible to everyone -
- {et.visibility === 'public' && } -
- updateEventType(index, { visibility: 'private' })}> -
- Private - Shows as "Busy" without event details -
- {et.visibility === 'private' && } -
-
-
-
-
- )} From 482e369c07843071545b3b24a4ed1942dba8ded0 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 19 Jan 2026 21:08:09 +0000 Subject: [PATCH 4/5] Simplify Calendar Visibility dropdown - remove subtext when closed --- frontend/src/components/ConfigScreen.tsx | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/ConfigScreen.tsx b/frontend/src/components/ConfigScreen.tsx index 170757b..2580799 100644 --- a/frontend/src/components/ConfigScreen.tsx +++ b/frontend/src/components/ConfigScreen.tsx @@ -659,19 +659,10 @@ export function ConfigScreen({ onBack }: { onBack: () => void }) { - From 0f18dd2b30028520ad967aa3d88b04a17f0423ce Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 19 Jan 2026 21:27:37 +0000 Subject: [PATCH 5/5] Document guest permissions and calendar visibility features in README Added documentation for the new guest permissions and calendar visibility controls: Key Features section: - Added "Guest Permission Controls" feature highlighting Event Types configuration section: - Guest Permissions: Detailed explanation of modify, invite, and see guests controls - Calendar Visibility: Explained default, public, and private visibility options These features give users fine-grained control over event privacy and guest capabilities. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 2ebfe44..37061ed 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Someday is a simple, open-source scheduling tool designed specifically for Gmail - **Multiple Event Types**: Create diverse meeting options like "Quick Chat" or "Deep Dive" with unique durations and availability settings. - **Team Scheduling**: Add multiple calendars including teammates' calendars (with read access) for collaborative scheduling. - **Flexible Scheduling Strategies**: Choose between "Collective" (all team members must be free) or "Round-Robin" (distribute bookings among available team members) scheduling modes. +- **Guest Permission Controls**: Fine-grained control over what guests can do with booked events (modify, invite others, see attendees) and calendar visibility (public, private, or default). - **Dynamic Configuration**: Adjust your timezone, working hours, available days, and monitored calendars globally or per event type directly through the integrated Settings screen. - **Owner-Only Access**: Secure access to configuration via the script owner's Google account session. - **Simple Booking Process**: Users can select a date and time slot, then fill out a straightforward form with their name, email, phone, and an optional note. @@ -55,6 +56,14 @@ Someday includes a built-in **Settings** screen for easy configuration. **Event Types**: - **Custom Meeting Types**: Create unlimited event types (e.g. "15 Min Discovery", "1 Hour Review"). - **Flexible Durations**: Set specific lengths for each meeting type (up to 24 hours). + - **Guest Permissions**: Control what guests can do with booked events: + - **Modify Event**: Allow/prevent guests from changing event details, time, or location + - **Invite Others**: Allow/prevent guests from adding additional attendees + - **See Other Guests**: Allow/prevent guests from viewing the attendee list + - **Calendar Visibility**: Choose how events appear in Google Calendar: + - **Default**: Uses your calendar's default visibility setting + - **Public**: Event details are publicly visible to everyone + - **Private**: Shows only as "Busy" without revealing event details - **Smart Overrides**: Override global Work Hours, Available Days, Monitored Calendars, and Scheduling Strategy for specific event types. - **Per-Event Strategies**: Set different scheduling strategies for different event types (e.g., Round-Robin for sales calls, Collective for team meetings). - **Direct Links**: Copy a unique booking URL for any event type to share directly.