From 3900059eb1ad57ab23c9685ac93dada9cae33054 Mon Sep 17 00:00:00 2001 From: Aiirondev Date: Fri, 26 Jun 2026 19:13:30 +0200 Subject: [PATCH] Configurierung des Slot amount generation --- Web/templates/termin_configure.html | 48 ++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/Web/templates/termin_configure.html b/Web/templates/termin_configure.html index 7765f4f..699c1c4 100644 --- a/Web/templates/termin_configure.html +++ b/Web/templates/termin_configure.html @@ -202,7 +202,19 @@ if (slotsAmountsInput) slotsAmountsInput.value = totalSlots; if (slotsAmountsDisplay) slotsAmountsDisplay.innerText = totalSlots + " Slots gesamt"; } - + + // Helper utility in case your timeToMinutes handler doesn't catch empty strings safely + function safeTimeToMinutes(timeString) { + if (!timeString || typeof timeString !== 'string' || !timeString.includes(':')) { + return 0; // Return 0 instead of NaN for empty or missing values + } + const parts = timeString.split(':'); + const hours = parseInt(parts[0], 10); + const minutes = parseInt(parts[1], 10); + if (isNaN(hours) || isNaN(minutes)) return 0; + return (hours * 60) + minutes; + } + // Berechnet die Slots basierend auf den konfigurierten Zeiten & Pausen function calculateSlots() { if (!slotLengthInput || !slotsAmountsInput || !clientsperslot) return; @@ -212,25 +224,29 @@ updateSlotsDisplay(0); return; } - + + // FIX 1: Make sure we parse the input VALUE, defaulting to 1 if empty or invalid + const multiplier = parseInt(clientsperslot.value, 10) || 1; + let totalSlots = 0; const rows = Array.from(daysContainer.querySelectorAll('[data-day-row]')); - + rows.forEach(row => { const startTime = row.querySelector('[data-time-start]')?.value; const endTime = row.querySelector('[data-time-end]')?.value; const pauseStart = row.querySelector('[data-time-pause-start]')?.value; const pauseEnd = row.querySelector('[data-time-pause-end]')?.value; - + if (!startTime || !endTime) return; - - const startMins = timeToMinutes(startTime); - const endMins = timeToMinutes(endTime); - const pauseStartMins = timeToMinutes(pauseStart); - const pauseEndMins = timeToMinutes(pauseEnd); - - if (endMins <= startMins) return; // Ungültige Zeit - + + // Using safety parsing to prevent missing values from generating NaN + const startMins = safeTimeToMinutes(startTime); + const endMins = safeTimeToMinutes(endTime); + const pauseStartMins = safeTimeToMinutes(pauseStart); + const pauseEndMins = safeTimeToMinutes(pauseEnd); + + if (isNaN(startMins) || isNaN(endMins) || endMins <= startMins) return; + // Wenn eine gültige Pause innerhalb der Start/Endzeit existiert if (pauseStartMins > 0 && pauseEndMins > 0 && pauseStartMins < pauseEndMins && pauseStartMins > startMins && pauseStartMins < endMins) { // Segment 1 (Vor der Pause) @@ -248,8 +264,12 @@ totalSlots += Math.floor((endMins - startMins) / slotLength); } }); - totalSlotscomplete = totalSlots * Number(clientsperslot) - updateSlotsDisplay(totalSlotscomplete); + + // FIX 2: Multiply by our safely parsed input value scalar + const totalSlotscomplete = totalSlots * multiplier; + + // Safety check: if anything went wrong anyway, fallback to 0 instead of displaying NaN + updateSlotsDisplay(isNaN(totalSlotscomplete) ? 0 : totalSlotscomplete); } // Synchronisiert das Textfeld und fügt den Break-Cut hinzu