diff --git a/apps/pwa/src/components/EventForm.test.tsx b/apps/pwa/src/components/EventForm.test.tsx index b65033d..d5f326d 100644 --- a/apps/pwa/src/components/EventForm.test.tsx +++ b/apps/pwa/src/components/EventForm.test.tsx @@ -239,7 +239,10 @@ describe('EventForm', () => { it('renders recurrence options: None, Daily, Weekly, Monthly, Yearly', () => { renderForm(); - expect(screen.getByText('None')).toBeDefined(); + // Use getAllByText since "None" now appears in both the recurrence picker and the + // reminder picker (Phase 11 — two setReminderValue(e.target.value)} + style={{ + ...inputStyle, + padding: '0 var(--space-3)', + cursor: 'pointer', + }} + > + {allDay ? ( + // D-02: all-day presets (day-granularity) + <> + + + + + + {/* D-07: synthetic option for off-list all-day value */} + {reminderValue !== '__none__' && + reminderValue !== '__custom__' && + !ALLDAY_REMINDER_PRESETS.has(parseInt(reminderValue, 10)) && + Number.isFinite(parseInt(reminderValue, 10)) && ( + + )} + {/* D-07: read-only Custom (kept) for absolute/multi alarm */} + {reminderValue === '__custom__' && ( + + )} + + ) : ( + // D-01: timed presets + <> + + + + + + + + + + {/* D-07: synthetic option for off-list timed value */} + {reminderValue !== '__none__' && + reminderValue !== '__custom__' && + !TIMED_REMINDER_PRESETS.has(parseInt(reminderValue, 10)) && + Number.isFinite(parseInt(reminderValue, 10)) && ( + + )} + {/* D-07: read-only Custom (kept) for absolute/multi alarm */} + {reminderValue === '__custom__' && ( + + )} + + )} + + {/* Helper text: shown in edit mode when value is __custom__ or synthetic off-list (D-07) */} + {eventFormMode === 'edit' && + (reminderValue === '__custom__' || + (reminderValue !== '__none__' && + !TIMED_REMINDER_PRESETS.has(parseInt(reminderValue, 10)) && + !ALLDAY_REMINDER_PRESETS.has(parseInt(reminderValue, 10)) && + Number.isFinite(parseInt(reminderValue, 10)))) && ( +
+ {/* Plain text — XSS guard (T-11-10 / T-03-15) */} + Custom reminder kept — select a preset to replace it. +
+ )} + + {/* D-06: Recurrence bound control — shown only when recurrence ≠ 'none' in create mode */} {eventFormMode !== 'edit' && recurrence !== 'none' && (