From 96a2507979a56257e0a9afc98134d8a19dd135be Mon Sep 17 00:00:00 2001 From: Benjamin Sutter Date: Tue, 9 Jun 2026 21:32:54 +0200 Subject: [PATCH] fix: carry all unit data into + Inserat prefill When clicking + Inserat in UnitStructurePanel, the new listing form now pre-populates: floor label, fit-out standard, parking, ceiling height, Mieterausbaubeitrag, Teilbar toggle, min lettable sqm, and availability date from the unit and its parent property. Co-Authored-By: Claude Sonnet 4.6 --- src/components/supply/UnitStructurePanel.tsx | 43 ++++++++++++++------ src/hooks/useNewListingForm.ts | 18 ++++---- src/pages/supply/newListingConstants.ts | 9 ++++ 3 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/components/supply/UnitStructurePanel.tsx b/src/components/supply/UnitStructurePanel.tsx index 57f2a0c..2de6295 100644 --- a/src/components/supply/UnitStructurePanel.tsx +++ b/src/components/supply/UnitStructurePanel.tsx @@ -143,21 +143,30 @@ export function UnitStructurePanel({ p }: { p: Property }) { - {/* Inline min-unit editor */} - {editingFlexUnit === u.id && ( + {/* Inline min-unit editor — show when actively editing OR when teilbar is on but min sqm not set */} + {(editingFlexUnit === u.id || (u.isFlexible && !u.minLettableSqm)) && ( setFlexDraft(d => ({ ...d, [u.id]: parseInt(e.target.value) || undefined }))} - sx={{ width: 72, '& .MuiInputBase-input': { fontSize: '0.68rem', py: 0.375, px: 0.75 } }} + error={!flexDraft[u.id] && u.isFlexible && !u.minLettableSqm} + sx={{ + width: 80, + '& .MuiInputBase-input': { fontSize: '0.68rem', py: 0.375, px: 0.75 }, + '& .MuiOutlinedInput-root': { + '& fieldset': { borderColor: (!flexDraft[u.id] && u.isFlexible && !u.minLettableSqm) ? '#ef4444' : undefined }, + }, + }} slotProps={{ htmlInput: { min: 10, max: u.areaSqm, step: 10 } }} /> - + {editingFlexUnit === u.id && u.minLettableSqm && ( + + )} )} @@ -193,6 +204,14 @@ export function UnitStructurePanel({ p }: { p: Property }) { rentPricePerSqm: u.rentPricePerSqm ?? p.rentPricePerSqm, unitLabel: u.unitLabel, propertyId: p.id, + floor: floorLabel(u), + fitOut: p.hardFacts?.fitOut, + parking: p.hardFacts?.parking, + ceilingHeight: p.hardFacts?.ceilingHeightM, + mieterausbaubeitragPerSqm: p.hardFacts?.mieterausbaubeitragPerSqm, + isFlexible: u.isFlexible, + minLettableSqm: u.minLettableSqm, + availableFrom: u.listing?.availableFrom ?? p.availabilityDate, }, }, })} diff --git a/src/hooks/useNewListingForm.ts b/src/hooks/useNewListingForm.ts index 08497d4..19cecd6 100644 --- a/src/hooks/useNewListingForm.ts +++ b/src/hooks/useNewListingForm.ts @@ -109,19 +109,19 @@ export function useNewListingForm(pre: Prefill): NewListingFormState & NewListin const [city, setCity] = useState(pre.city ?? '') const [areaSqm, setAreaSqm] = useState(pre.areaSqm ? String(pre.areaSqm) : '') const [rentPerSqm, setRentPerSqm] = useState(pre.rentPricePerSqm ? String(pre.rentPricePerSqm) : '') - const [availableFrom, setAvailableFrom] = useState('') + const [availableFrom, setAvailableFrom] = useState(pre.availableFrom ?? '') const [description, setDescription] = useState('') const [contactName, setContactName] = useState('') const [contactEmail, setContactEmail] = useState('') const [contactPhone, setContactPhone] = useState('') - const [softLevels, setSoftLevels] = useState>(emptySoftLevels) - const [floor, setFloor] = useState('') - const [fitOut, setFitOut] = useState('') - const [parking, setParking] = useState('') - const [ceilingHeight, setCeilingHeight]= useState('') - const [mieterausbaubeitrag, setMieterausbaubeitrag] = useState('') - const [isFlexible, setIsFlexible] = useState(false) - const [minLettableSqm, setMinLettableSqm] = useState('') + const [softLevels, setSoftLevels] = useState>(() => ({ ...emptySoftLevels(), ...pre.softLevels })) + const [floor, setFloor] = useState(pre.floor ?? '') + const [fitOut, setFitOut] = useState(pre.fitOut ?? '') + const [parking, setParking] = useState(pre.parking != null ? String(pre.parking) : '') + const [ceilingHeight, setCeilingHeight]= useState(pre.ceilingHeight != null ? String(pre.ceilingHeight) : '') + const [mieterausbaubeitrag, setMieterausbaubeitrag] = useState(pre.mieterausbaubeitragPerSqm != null ? String(pre.mieterausbaubeitragPerSqm) : '') + const [isFlexible, setIsFlexible] = useState(pre.isFlexible ?? false) + const [minLettableSqm, setMinLettableSqm] = useState(pre.minLettableSqm != null ? String(pre.minLettableSqm) : '') const [images, setImages] = useState([]) const [imageInput, setImageInput] = useState('') const [floorPlanUrl, setFloorPlanUrl] = useState('') diff --git a/src/pages/supply/newListingConstants.ts b/src/pages/supply/newListingConstants.ts index c00b59d..7c4945d 100644 --- a/src/pages/supply/newListingConstants.ts +++ b/src/pages/supply/newListingConstants.ts @@ -49,6 +49,15 @@ export interface LocationState { rentPricePerSqm?: number unitLabel?: string propertyId?: string + floor?: string + fitOut?: string + parking?: number + ceilingHeight?: number + mieterausbaubeitragPerSqm?: number + isFlexible?: boolean + minLettableSqm?: number + availableFrom?: string + softLevels?: Record } }