From 59b66769266839f416a7e4ea9415979d7f4c6bcb Mon Sep 17 00:00:00 2001 From: Tomas Dvorak Date: Tue, 17 Jun 2025 07:32:40 +0200 Subject: [PATCH] ff --- rezervace-aut.html | 120 ++++++++++++++++++++++++++++----------------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/rezervace-aut.html b/rezervace-aut.html index 2097a90..86f243e 100644 --- a/rezervace-aut.html +++ b/rezervace-aut.html @@ -744,11 +744,18 @@

Nová rezervace

-
- +
- + + class="w-full p-2 border border-gray-300 rounded-md">
@@ -989,10 +996,34 @@ document.getElementById(inputId)?.addEventListener('change', checkAvailabilityAndTraffic); }); + // Name validation function + function validateDriverName(name) { + // Check if name has at least two parts with minimum 2 characters each + const parts = name.trim().split(/\s+/); + return parts.length >= 2 && parts.every(part => part.length >= 2 && /^[A-Za-zÀ-ž]+$/.test(part)); + } + + // Add input validation for driver name + const driverNameInput = document.getElementById('driverName'); + const nameError = document.getElementById('nameError'); + + driverNameInput.addEventListener('input', function() { + const isValid = validateDriverName(this.value); + this.classList.toggle('border-red-500', !isValid); + this.classList.toggle('border-gray-300', isValid); + nameError.classList.toggle('hidden', isValid); + }); + // Handle form submission reservationForm.addEventListener('submit', async function(e) { e.preventDefault(); + const driverName = document.getElementById('driverName').value; + if (!validateDriverName(driverName)) { + showMessage('Prosím zadejte platné jméno a příjmení', 'error'); + return; + } + const startDateInput = document.getElementById('startDate'); const startTimeInput = document.getElementById('startTime'); const endDateInput = document.getElementById('endDate'); @@ -1137,18 +1168,8 @@ // Calendar configuration const calendarConfig = { - eventDidMount: function(info) { - const vehicleClass = 'event-' + info.event.extendedProps.vehicle.toLowerCase().replace(/\s+/g, '-'); - info.el.classList.add(vehicleClass); - - // Apply initial filtering - if (selectedVehicle !== 'all' && info.event.extendedProps.vehicle !== selectedVehicle) { - info.el.classList.add('hidden-vehicle'); - } - }, initialView: 'dayGridMonth', + initialView: 'dayGridMonth', headerToolbar: { - left: 'prev,next today', - center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay' }, validRange: { @@ -1165,28 +1186,22 @@ eventTimeFormat: { hour12: false }, + eventDidMount: function(info) { + const vehicleClass = 'event-' + info.event.extendedProps.vehicle.toLowerCase().replace(/\s+/g, '-'); + info.el.classList.add(vehicleClass); + + // Apply initial filtering + if (selectedVehicle !== 'all' && info.event.extendedProps.vehicle !== selectedVehicle) { + info.el.classList.add('hidden-vehicle'); + } + }, + eventSourceSuccess: function(content, xhr) { + // This runs after events are successfully loaded from the API + setTimeout(updateReservationsList, 0); // Use setTimeout to ensure DOM is ready + return content; + }, eventClassNames: function(arg) { return ['event-' + arg.event.extendedProps.vehicle.toLowerCase().replace(/\s+/g, '-')]; - }, eventContent: function(arg) { - return { - html: ` -
-
${arg.event.extendedProps.driverName}
-
${arg.timeText}
-
${arg.event.extendedProps.vehicle}
-
- ` - }; - }, - dateClick: function(info) { - const now = Date.now(); - if (this.lastClick && (now - this.lastClick < 300)) { - showReservationForm(info.date); - } - this.lastClick = now; - }, - eventClick: function(info) { - showEventModal(info.event); } }; @@ -1273,9 +1288,7 @@ if (warningEl) { warningEl.style.display = 'none'; } - } - - // Function to update reservations list + } // Function to update reservations list function updateReservationsList() { const reservationsList = document.getElementById('reservationsList'); const reservationsCount = document.getElementById('reservationsCount'); @@ -1288,14 +1301,12 @@ // Filter and sort events const currentAndFutureEvents = events .filter(event => event.end >= now) + .filter(event => selectedVehicle === 'all' || event.extendedProps.vehicle === selectedVehicle) .sort((a, b) => a.start - b.start); - // Update count - reservationsCount.textContent = currentAndFutureEvents.length > 0 - ? `Počet rezervací: ${currentAndFutureEvents.length}` - : 'Žádné aktuální ani budoucí rezervace'; - + // Update count and list if (currentAndFutureEvents.length === 0) { + reservationsCount.textContent = 'Žádné aktuální ani budoucí rezervace'; reservationsList.innerHTML = `
Žádné aktuální ani budoucí rezervace @@ -1304,11 +1315,12 @@ return; } + reservationsCount.textContent = `Počet rezervací: ${currentAndFutureEvents.length}`; + const html = currentAndFutureEvents.map(event => { const vehicleClass = 'vehicle-' + event.extendedProps.vehicle.toLowerCase().replace(/\s+/g, '-'); - const isHidden = selectedVehicle !== 'all' && event.extendedProps.vehicle !== selectedVehicle ? 'hidden-vehicle' : ''; return ` -
+
${event.extendedProps.vehicle} @@ -1489,6 +1501,26 @@ }); }); }); + + // New Reservation button handler + document.getElementById('newReservationBtn').addEventListener('click', function() { + // Reset form + reservationForm.reset(); + + // Set default times + const now = new Date(); + const defaultStartDate = now.toISOString().split('T')[0]; + const defaultStartTime = now.getHours().toString().padStart(2, '0') + ':00'; + const defaultEndTime = (now.getHours() + 1).toString().padStart(2, '0') + ':00'; + + document.getElementById('startDate').value = defaultStartDate; + document.getElementById('startTime').value = defaultStartTime; + document.getElementById('endDate').value = defaultStartDate; + document.getElementById('endTime').value = defaultEndTime; + + // Show modal + document.getElementById('reservationModal').style.display = 'block'; + }); });