From f081de9566347cfd6792b5b85874337d62041721 Mon Sep 17 00:00:00 2001 From: Tomas Dvorak Date: Wed, 11 Jun 2025 15:16:48 +0200 Subject: [PATCH] re --- main.go | 78 +++++++++++++++++++++++------ rezervace-aut.html | 120 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 169 insertions(+), 29 deletions(-) diff --git a/main.go b/main.go index 050276d..a911a91 100644 --- a/main.go +++ b/main.go @@ -50,12 +50,14 @@ type GeoCoords struct { } type Reservation struct { - ID string `json:"id"` - DriverName string `json:"driverName"` - Vehicle string `json:"vehicle"` - StartDateTime time.Time `json:"startDateTime"` - EndDateTime time.Time `json:"endDateTime"` - Purpose string `json:"purpose"` + ID string `json:"id"` + DriverName string `json:"driverName"` + Vehicle string `json:"vehicle"` + StartDate string `json:"startDate"` + StartTime string `json:"startTime"` + EndDate string `json:"endDate"` + EndTime string `json:"endTime"` + Purpose string `json:"purpose,omitempty"` } func main() { @@ -320,14 +322,39 @@ func handleCreateReservation(w http.ResponseWriter, r *http.Request) { return } - // Only validate required fields (purpose is now optional) - if reservation.DriverName == "" || reservation.Vehicle == "" { - http.Error(w, "Driver name and vehicle are required", http.StatusBadRequest) + // Validate required fields + if reservation.DriverName == "" || reservation.Vehicle == "" || + reservation.StartDate == "" || reservation.StartTime == "" || + reservation.EndDate == "" || reservation.EndTime == "" { + http.Error(w, "Missing required fields", http.StatusBadRequest) return } + // Create combined date-time string + startDateTime, err := time.Parse("2006-01-02 15:04", + fmt.Sprintf("%s %s", reservation.StartDate, reservation.StartTime)) + if err != nil { + http.Error(w, "Invalid start date/time", http.StatusBadRequest) + return + } + + endDateTime, err := time.Parse("2006-01-02 15:04", + fmt.Sprintf("%s %s", reservation.EndDate, reservation.EndTime)) + if err != nil { + http.Error(w, "Invalid end date/time", http.StatusBadRequest) + return + } + + // Validate time order + if endDateTime.Before(startDateTime) { + http.Error(w, "End time must be after start time", http.StatusBadRequest) + return + } + + // Generate unique ID reservation.ID = fmt.Sprintf("res_%d", time.Now().UnixNano()) + // Save reservation reservations, err := loadReservations() if err != nil { http.Error(w, "Failed to load reservations", http.StatusInternalServerError) @@ -347,18 +374,23 @@ func handleCreateReservation(w http.ResponseWriter, r *http.Request) { func handleCheckAvailability(w http.ResponseWriter, r *http.Request) { vehicle := r.URL.Query().Get("vehicle") - startStr := r.URL.Query().Get("start") - endStr := r.URL.Query().Get("end") + startDate := r.URL.Query().Get("startDate") + startTime := r.URL.Query().Get("startTime") + endDate := r.URL.Query().Get("endDate") + endTime := r.URL.Query().Get("endTime") - start, err := time.Parse(time.RFC3339, startStr) + // Parse combined date and time strings + startDateTime, err := time.Parse("2006-01-02 15:04", + fmt.Sprintf("%s %s", startDate, startTime)) if err != nil { - http.Error(w, "Invalid start time", http.StatusBadRequest) + http.Error(w, "Invalid start date/time", http.StatusBadRequest) return } - end, err := time.Parse(time.RFC3339, endStr) + endDateTime, err := time.Parse("2006-01-02 15:04", + fmt.Sprintf("%s %s", endDate, endTime)) if err != nil { - http.Error(w, "Invalid end time", http.StatusBadRequest) + http.Error(w, "Invalid end date/time", http.StatusBadRequest) return } @@ -371,7 +403,21 @@ func handleCheckAvailability(w http.ResponseWriter, r *http.Request) { available := true for _, res := range reservations { if res.Vehicle == vehicle { - if start.Before(res.EndDateTime) && end.After(res.StartDateTime) { + // Parse reservation dates + resStart, err := time.Parse("2006-01-02 15:04", + fmt.Sprintf("%s %s", res.StartDate, res.StartTime)) + if err != nil { + continue + } + + resEnd, err := time.Parse("2006-01-02 15:04", + fmt.Sprintf("%s %s", res.EndDate, res.EndTime)) + if err != nil { + continue + } + + // Check for overlap + if startDateTime.Before(resEnd) && endDateTime.After(resStart) { available = false break } diff --git a/rezervace-aut.html b/rezervace-aut.html index 41206c5..8d4ecf0 100644 --- a/rezervace-aut.html +++ b/rezervace-aut.html @@ -297,16 +297,70 @@
+
- - Datum začátku +
- +
- - Čas začátku + +
+
+ +
+ +
+ + +
+ +
+ +
@@ -332,6 +386,14 @@ + + + @@ -471,18 +533,24 @@ reservationForm.addEventListener('submit', async function(e) { e.preventDefault(); - // Validate dates - const startDate = new Date(document.getElementById('startDateTime').value); - const endDate = new Date(document.getElementById('endDateTime').value); + const startDate = document.getElementById('startDate').value; + const startTime = document.getElementById('startTime').value; + const endDate = document.getElementById('endDate').value; + const endTime = document.getElementById('endTime').value; - if (endDate <= startDate) { - showMessage('Čas ukončení musí být později než čas začátku', 'error'); + // Create ISO datetime strings + const startDateTime = new Date(`${startDate}T${startTime}`); + const endDateTime = new Date(`${endDate}T${endTime}`); + + // Validate dates + if (endDateTime <= startDateTime) { + showMessage('Konec musí být později než začátek', 'error'); return; } // Check vehicle availability const vehicle = document.getElementById('vehicle').value; - const isAvailable = await checkVehicleAvailability(vehicle, startDate, endDate); + const isAvailable = await checkVehicleAvailability(vehicle, startDateTime, endDateTime); if (!isAvailable) { showMessage('Vozidlo není v tomto čase dostupné', 'error'); @@ -493,8 +561,8 @@ const reservationData = { driverName: document.getElementById('driverName').value, vehicle: vehicle, - startDateTime: startDate.toISOString(), - endDateTime: endDate.toISOString(), + startDateTime: startDateTime.toISOString(), + endDateTime: endDateTime.toISOString(), purpose: document.getElementById('purpose').value }; @@ -519,6 +587,32 @@ showMessage(error.message || 'Nepodařilo se vytvořit rezervaci', 'error'); } }); + + // Populate time dropdowns with full hours + function populateTimeDropdowns() { + const timeSelects = [document.getElementById('startTime'), document.getElementById('endTime')]; + + for (let hour = 6; hour <= 22; hour++) { // 6:00 to 22:00 + const hourStr = hour.toString().padStart(2, '0'); + const timeStr = `${hourStr}:00`; + const option = new Option(timeStr, timeStr); + + timeSelects.forEach(select => { + select.appendChild(option.cloneNode(true)); + }); + } + } + + // Initialize time dropdowns when page loads + document.addEventListener('DOMContentLoaded', function() { + populateTimeDropdowns(); + + // Set default dates to today + const today = new Date(); + const dateStr = today.toISOString().split('T')[0]; + document.getElementById('startDate').value = dateStr; + document.getElementById('endDate').value = dateStr; + }); });