From 6d92e145159c1158ef412979d9c4ff28095ced55 Mon Sep 17 00:00:00 2001 From: mauriceboe Date: Sat, 4 Apr 2026 17:09:03 +0200 Subject: [PATCH] fix(trips): preserve day content when setting dates on dateless trips Dateless days are now reassigned to the new date range instead of being deleted and recreated. This keeps all assignments, notes, bookings and other day content intact when a user adds start/end dates to a trip that was created without them. --- server/src/services/tripService.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/server/src/services/tripService.ts b/server/src/services/tripService.ts index c89acbf..592fa7c 100644 --- a/server/src/services/tripService.ts +++ b/server/src/services/tripService.ts @@ -75,9 +75,13 @@ export function generateDays(tripId: number | bigint | string, startDate: string const targetDateSet = new Set(targetDates); const toDelete = existing.filter(d => d.date && !targetDateSet.has(d.date)); - const datelessToDelete = existing.filter(d => !d.date); + const dateless = existing.filter(d => !d.date).sort((a, b) => a.day_number - b.day_number); const del = db.prepare('DELETE FROM days WHERE id = ?'); - for (const d of [...toDelete, ...datelessToDelete]) del.run(d.id); + for (const d of toDelete) del.run(d.id); + + // Reassign dateless days to the first unmatched target dates (preserves content) + const assignDate = db.prepare('UPDATE days SET date = ?, day_number = ? WHERE id = ?'); + let datelessIdx = 0; const setTemp = db.prepare('UPDATE days SET day_number = ? WHERE id = ?'); const kept = existing.filter(d => d.date && targetDateSet.has(d.date)); @@ -91,10 +95,17 @@ export function generateDays(tripId: number | bigint | string, startDate: string const ex = existingByDate.get(date); if (ex) { update.run(i + 1, ex.id); + } else if (datelessIdx < dateless.length) { + // Reuse a dateless day — keeps its assignments, notes, etc. + assignDate.run(date, i + 1, dateless[datelessIdx].id); + datelessIdx++; } else { insert.run(tripId, i + 1, date); } } + + // Delete any remaining unused dateless days + for (let i = datelessIdx; i < dateless.length; i++) del.run(dateless[i].id); } // ── Trip CRUD ─────────────────────────────────────────────────────────────