diff --git a/src/components/pages/DateTimeStep/DateTimeStep.stories.tsx b/src/components/pages/DateTimeStep/DateTimeStep.stories.tsx index 4100f9b..e116973 100644 --- a/src/components/pages/DateTimeStep/DateTimeStep.stories.tsx +++ b/src/components/pages/DateTimeStep/DateTimeStep.stories.tsx @@ -38,9 +38,8 @@ const defaultValues: DateTimeStepValues = { firstName: '', surname: '', funeralDate: 'asap', - funeralDateSpecific: '', + preferredDates: [], funeralTime: 'no_preference', - religion: null, }; // ─── Meta ──────────────────────────────────────────────────────────────────── @@ -71,8 +70,8 @@ export const Default: Story = { newErrors.firstName = 'We need their first name for the funeral arrangements.'; if (!values.surname) newErrors.surname = 'We need their surname for the funeral arrangements.'; - if (values.funeralDate === 'specific' && !values.funeralDateSpecific) - newErrors.funeralDateSpecific = 'Please select a preferred date.'; + if (values.funeralDate === 'specific' && !values.preferredDates[0]) + newErrors.preferredDates = 'Please select at least one preferred date.'; setErrors(newErrors); if (Object.keys(newErrors).length === 0) alert(`Continue: ${values.firstName} ${values.surname}`); @@ -116,16 +115,17 @@ export const PrePlanning: Story = { }, }; -// ─── Specific date selected ───────────────────────────────────────────────── +// ─── Specific dates selected ─────────────────────────────────────────────── -/** Date picker revealed when "specific date" is selected */ -export const SpecificDate: Story = { +/** Multiple preferred dates entered */ +export const SpecificDates: Story = { render: () => { const [values, setValues] = useState({ ...defaultValues, firstName: 'Margaret', surname: 'Wilson', funeralDate: 'specific', + preferredDates: ['2026-04-05', '2026-04-08'], funeralTime: 'morning', }); return ( @@ -141,9 +141,9 @@ export const SpecificDate: Story = { }, }; -// ─── Name fields only (cremation/burial only) ────────────────────────────── +// ─── Name fields only ────────────────────────────────────────────────────── -/** Scheduling hidden — only name fields shown (e.g. cremation-only at-need) */ +/** Scheduling hidden — only name fields shown */ export const NameFieldsOnly: Story = { render: () => { const [values, setValues] = useState({ ...defaultValues }); @@ -193,7 +193,6 @@ export const Loading: Story = { surname: 'Wilson', funeralDate: 'asap', funeralTime: 'morning', - religion: 'Anglican', }); return ( = ({ isAtNeed = true, showNameFields = true, showScheduling = true, - religionOptions = DEFAULT_RELIGIONS, navigation, hideHelpBar, sx, @@ -148,12 +126,31 @@ export const DateTimeStep: React.FC = ({ onChange({ ...values, [field]: value }); }; + const handleDateChange = (index: number, value: string) => { + const next = [...values.preferredDates]; + next[index] = value; + onChange({ ...values, preferredDates: next }); + }; + + const handleAddDate = () => { + if (values.preferredDates.length < MAX_PREFERRED_DATES) { + onChange({ ...values, preferredDates: [...values.preferredDates, ''] }); + } + }; + + const handleRemoveDate = (index: number) => { + const next = values.preferredDates.filter((_, i) => i !== index); + onChange({ ...values, preferredDates: next.length === 0 ? [''] : next }); + }; + const personSectionHeading = isAtNeed ? 'About the person who has passed' : 'About the person'; const schedulingHeading = isAtNeed ? 'When are you hoping to have the service?' : 'When would you like the service?'; + const minDate = new Date().toISOString().split('T')[0]; + return ( = ({ A few important details - {!isAtNeed && ( - - If you're not sure about dates yet, that's fine. You can update this later. - - )} + + {isAtNeed + ? 'We just need a few details to help arrange the service.' + : "If you're not sure about dates yet, that's fine. You can update this later."} + = ({ > {/* ─── Section 1: About the person ─── */} {showNameFields && ( - - + + {personSectionHeading} @@ -195,12 +192,10 @@ export const DateTimeStep: React.FC = ({ sx={{ display: 'flex', flexDirection: { xs: 'column', sm: 'row' }, - gap: 2, - mb: 2, - pt: 0.5, + gap: 2.5, }} > - handleFieldChange('firstName', e.target.value)} @@ -210,7 +205,7 @@ export const DateTimeStep: React.FC = ({ fullWidth required /> - handleFieldChange('surname', e.target.value)} @@ -224,53 +219,113 @@ export const DateTimeStep: React.FC = ({ )} + {showNameFields && showScheduling && } + {/* ─── Section 2: Scheduling ─── */} {showScheduling && ( - - + + {schedulingHeading} {/* Date preference */} - + Preferred timing - handleFieldChange('funeralDate', e.target.value as FuneralDatePref) - } + onChange={(e) => { + const pref = e.target.value as FuneralDatePref; + onChange({ + ...values, + funeralDate: pref, + // Initialise with one empty date slot when switching to specific + preferredDates: + pref === 'specific' && values.preferredDates.length === 0 + ? [''] + : values.preferredDates, + }); + }} > - } label="As soon as possible" /> + } + label="As soon as possible" + sx={{ mb: 0.5 }} + /> } - label="I have a specific date in mind" + label="I have a preferred date" /> - {/* Specific date — progressive disclosure */} + {/* Preferred dates — progressive disclosure, up to 3 */} - handleFieldChange('funeralDateSpecific', e.target.value)} - error={!!errors?.funeralDateSpecific} - helperText={errors?.funeralDateSpecific} - InputLabelProps={{ shrink: true }} - inputProps={{ min: new Date().toISOString().split('T')[0] }} - fullWidth - required - sx={{ mb: 3 }} - /> + + {values.preferredDates.map((date, index) => ( + + handleDateChange(index, e.target.value)} + error={index === 0 && !!errors?.preferredDates} + helperText={index === 0 ? errors?.preferredDates : undefined} + InputLabelProps={{ shrink: true }} + inputProps={{ min: minDate }} + fullWidth + required={index === 0} + /> + {index > 0 && ( + handleRemoveDate(index)} + aria-label={`Remove ${DATE_LABELS[index]?.toLowerCase() ?? 'date'}`} + sx={{ mt: 1, color: 'text.secondary' }} + > + + + )} + + ))} + + {values.preferredDates.length < MAX_PREFERRED_DATES && ( + + + Add another date + + )} + + + {/* Time-of-day preference */} - - + + Do you have a preferred time of day? = ({ handleFieldChange('funeralTime', e.target.value as FuneralTimePref) } > - } label="No preference" /> - } label="Morning" /> - } label="Midday" /> - } label="Afternoon" /> + } + label="No preference" + sx={{ mb: 0.5 }} + /> + } + label="Morning" + sx={{ mb: 0.5 }} + /> + } + label="Midday" + sx={{ mb: 0.5 }} + /> + } + label="Afternoon" + sx={{ mb: 0.5 }} + /> } label="Evening" /> )} - {/* ─── Service style (religion) ─── */} - handleFieldChange('religion', newValue)} - renderInput={(params) => ( - - )} - sx={{ mb: 4 }} - /> - - + {/* CTAs */}