diff --git a/webui/scripts/test-scheduling-page-structure.mjs b/webui/scripts/test-scheduling-page-structure.mjs
index 3f44d88..c84bc66 100644
--- a/webui/scripts/test-scheduling-page-structure.mjs
+++ b/webui/scripts/test-scheduling-page-structure.mjs
@@ -52,6 +52,7 @@ assert.match(page, /type="email"[\s\S]*aria-label=\{I18N\.participantEmail\}/);
assert.doesNotMatch(page, /header: I18N\.required|
\{selected\.calendar_id\}<\/p>/);
diff --git a/webui/src/api/scheduling.ts b/webui/src/api/scheduling.ts
index fbe90c0..7f2a1ce 100644
--- a/webui/src/api/scheduling.ts
+++ b/webui/src/api/scheduling.ts
@@ -12,6 +12,7 @@ export type SchedulingCandidateSlot = {
timezone: string;
location?: string | null;
position: number;
+ revision: string;
freebusy_checked_at?: string | null;
freebusy_status?: string | null;
freebusy_conflicts: Record[];
@@ -121,6 +122,7 @@ export type SchedulingAvailabilityPayload = {
answers: Array<{
slot_id: string;
value: SchedulingAvailabilityValue;
+ option_revision: string;
}>;
};
diff --git a/webui/src/features/scheduling/SchedulingPage.tsx b/webui/src/features/scheduling/SchedulingPage.tsx
index 6620667..50ba6c9 100644
--- a/webui/src/features/scheduling/SchedulingPage.tsx
+++ b/webui/src/features/scheduling/SchedulingPage.tsx
@@ -403,8 +403,16 @@ export default function SchedulingPage({ settings, auth }: { settings: ApiSettin
event.preventDefault();
if (!selected || !selectedParticipant || !canRespond || availabilityLoading) return;
const answers = selected.slots
- .map((slot) => ({ slot_id: slot.id, value: availability[slot.id] }))
- .filter((answer): answer is { slot_id: string; value: SchedulingAvailabilityValue } => Boolean(answer.value));
+ .map((slot) => ({
+ slot_id: slot.id,
+ value: availability[slot.id],
+ option_revision: slot.revision
+ }))
+ .filter((answer): answer is {
+ slot_id: string;
+ value: SchedulingAvailabilityValue;
+ option_revision: string;
+ } => Boolean(answer.value));
if (!answers.length) {
setError(I18N.selectResponse);
return;