This commit is contained in:
Tomas Dvorak
2025-06-17 07:04:35 +02:00
parent 0ab0db2438
commit 1b424d4f5d
2 changed files with 55 additions and 39 deletions
+32 -7
View File
@@ -311,11 +311,36 @@ func saveApps(apps []App) error {
func handleGetReservations(w http.ResponseWriter, r *http.Request) {
reservations, err := loadReservations()
if err != nil {
http.Error(w, "Failed to load reservations", http.StatusInternalServerError)
http.Error(w, "Nepodařilo se načíst rezervace", http.StatusInternalServerError)
return
}
// Convert reservations to calendar events
// Get current time
now := time.Now()
// Filter out expired reservations (ended more than 24 hours ago)
var activeReservations []Reservation
for _, res := range reservations {
// Parse end time
endDateTime, err := time.Parse("2006-01-02 15:04",
fmt.Sprintf("%s %s", res.EndDate, res.EndTime))
if err != nil {
continue
} // Keep reservation if it ended less than 48 hours ago
if endDateTime.Add(48 * time.Hour).After(now) {
activeReservations = append(activeReservations, res)
}
}
// If we filtered out any reservations, save the cleaned up list
if len(activeReservations) < len(reservations) {
err = saveReservations(activeReservations)
if err != nil {
log.Printf("Error saving cleaned up reservations: %v", err)
}
}
// Convert active reservations to calendar events
type Event struct {
ID string `json:"id"`
Title string `json:"title"`
@@ -327,16 +352,16 @@ func handleGetReservations(w http.ResponseWriter, r *http.Request) {
}
var events []Event
for _, res := range reservations {
for _, res := range activeReservations {
// Create proper ISO datetime strings
start := fmt.Sprintf("%sT%s:00", res.StartDate, res.StartTime)
end := fmt.Sprintf("%sT%s:00", res.EndDate, res.EndTime)
startDateTime := fmt.Sprintf("%sT%s:00", res.StartDate, res.StartTime)
endDateTime := fmt.Sprintf("%sT%s:00", res.EndDate, res.EndTime)
events = append(events, Event{
ID: res.ID,
Title: fmt.Sprintf("%s - %s", res.Vehicle, res.DriverName),
Start: start,
End: end,
Start: startDateTime,
End: endDateTime,
DriverName: res.DriverName,
Vehicle: res.Vehicle,
Purpose: res.Purpose,
+23 -32
View File
@@ -1199,49 +1199,40 @@
// Filter and sort events
const currentAndFutureEvents = events
.filter(event => {
const eventDate = new Date(event.start);
eventDate.setHours(0, 0, 0, 0);
return eventDate >= now;
})
.sort((a, b) => a.start.getTime() - b.start.getTime());
.filter(event => event.end >= now)
.sort((a, b) => a.start - b.start);
// Update count
reservationsCount.textContent = currentAndFutureEvents.length > 0
? `Celkem: ${currentAndFutureEvents.length} rezervací`
: '';
? `Počet rezervací: ${currentAndFutureEvents.length}`
: 'Žádné aktuální ani budoucí rezervace';
if (currentAndFutureEvents.length === 0) {
reservationsList.innerHTML = '<div class="p-4 text-gray-500 text-center">Žádné aktuální ani budoucí rezervace</div>';
reservationsList.innerHTML = `
<div class="p-4 text-center text-gray-500">
Žádné aktuální ani budoucí rezervace
</div>
`;
return;
}
const html = currentAndFutureEvents.map(event => {
const vehicleClass = 'event-' + event.extendedProps.vehicle.toLowerCase().replace(/[^a-z0-9]+/g, '-');
const startDate = formatDateTime(event.start);
const endDate = formatDateTime(event.end);
// Check if the reservation is for today
const today = new Date();
const eventDate = new Date(event.start);
const isToday = eventDate.getDate() === today.getDate() &&
eventDate.getMonth() === today.getMonth() &&
eventDate.getFullYear() === today.getFullYear();
const vehicleClass = 'vehicle-' + event.extendedProps.vehicle.toLowerCase().replace(/\s+/g, '-');
return `
<div class="reservation-item hover:bg-gray-50 ${isToday ? 'bg-blue-50' : ''}">
<div class="flex items-center gap-4 p-3">
<div class="w-3 h-3 rounded-full ${vehicleClass}"></div>
<div class="flex-1">
<div class="font-medium flex items-center gap-2">
${event.extendedProps.driverName}
${isToday ? '<span class="text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full">Dnes</span>' : ''}
<div class="reservation-item hover:bg-gray-50">
<span class="reservation-vehicle-badge ${vehicleClass} text-sm">
${event.extendedProps.vehicle}
</span>
<div class="flex-grow">
<div class="font-medium">${event.extendedProps.driverName}</div>
<div class="text-sm text-gray-600">
${formatDateTime(event.start)} - ${formatDateTime(event.end)}
</div>
${event.extendedProps.purpose ? `
<div class="text-sm text-gray-500 mt-1">
Účel: ${event.extendedProps.purpose}
</div>
<div class="text-sm text-gray-600">${event.extendedProps.vehicle}</div>
</div>
<div class="text-sm text-gray-500">
${startDate} - ${endDate}
</div>
` : ''}
</div>
</div>
`;