mirror of
https://github.com/Dvorinka/PPve.git
synced 2026-06-04 12:32:59 +00:00
test cal
This commit is contained in:
@@ -311,11 +311,36 @@ func saveApps(apps []App) error {
|
|||||||
func handleGetReservations(w http.ResponseWriter, r *http.Request) {
|
func handleGetReservations(w http.ResponseWriter, r *http.Request) {
|
||||||
reservations, err := loadReservations()
|
reservations, err := loadReservations()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, "Failed to load reservations", http.StatusInternalServerError)
|
http.Error(w, "Nepodařilo se načíst rezervace", http.StatusInternalServerError)
|
||||||
return
|
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 {
|
type Event struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
@@ -327,16 +352,16 @@ func handleGetReservations(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var events []Event
|
var events []Event
|
||||||
for _, res := range reservations {
|
for _, res := range activeReservations {
|
||||||
// Create proper ISO datetime strings
|
// Create proper ISO datetime strings
|
||||||
start := fmt.Sprintf("%sT%s:00", res.StartDate, res.StartTime)
|
startDateTime := fmt.Sprintf("%sT%s:00", res.StartDate, res.StartTime)
|
||||||
end := fmt.Sprintf("%sT%s:00", res.EndDate, res.EndTime)
|
endDateTime := fmt.Sprintf("%sT%s:00", res.EndDate, res.EndTime)
|
||||||
|
|
||||||
events = append(events, Event{
|
events = append(events, Event{
|
||||||
ID: res.ID,
|
ID: res.ID,
|
||||||
Title: fmt.Sprintf("%s - %s", res.Vehicle, res.DriverName),
|
Title: fmt.Sprintf("%s - %s", res.Vehicle, res.DriverName),
|
||||||
Start: start,
|
Start: startDateTime,
|
||||||
End: end,
|
End: endDateTime,
|
||||||
DriverName: res.DriverName,
|
DriverName: res.DriverName,
|
||||||
Vehicle: res.Vehicle,
|
Vehicle: res.Vehicle,
|
||||||
Purpose: res.Purpose,
|
Purpose: res.Purpose,
|
||||||
|
|||||||
+23
-32
@@ -1199,49 +1199,40 @@
|
|||||||
|
|
||||||
// Filter and sort events
|
// Filter and sort events
|
||||||
const currentAndFutureEvents = events
|
const currentAndFutureEvents = events
|
||||||
.filter(event => {
|
.filter(event => event.end >= now)
|
||||||
const eventDate = new Date(event.start);
|
.sort((a, b) => a.start - b.start);
|
||||||
eventDate.setHours(0, 0, 0, 0);
|
|
||||||
return eventDate >= now;
|
|
||||||
})
|
|
||||||
.sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
||||||
|
|
||||||
// Update count
|
// Update count
|
||||||
reservationsCount.textContent = currentAndFutureEvents.length > 0
|
reservationsCount.textContent = currentAndFutureEvents.length > 0
|
||||||
? `Celkem: ${currentAndFutureEvents.length} rezervací`
|
? `Počet rezervací: ${currentAndFutureEvents.length}`
|
||||||
: '';
|
: 'Žádné aktuální ani budoucí rezervace';
|
||||||
|
|
||||||
if (currentAndFutureEvents.length === 0) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const html = currentAndFutureEvents.map(event => {
|
const html = currentAndFutureEvents.map(event => {
|
||||||
const vehicleClass = 'event-' + event.extendedProps.vehicle.toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
const vehicleClass = 'vehicle-' + event.extendedProps.vehicle.toLowerCase().replace(/\s+/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();
|
|
||||||
|
|
||||||
return `
|
return `
|
||||||
<div class="reservation-item hover:bg-gray-50 ${isToday ? 'bg-blue-50' : ''}">
|
<div class="reservation-item hover:bg-gray-50">
|
||||||
<div class="flex items-center gap-4 p-3">
|
<span class="reservation-vehicle-badge ${vehicleClass} text-sm">
|
||||||
<div class="w-3 h-3 rounded-full ${vehicleClass}"></div>
|
${event.extendedProps.vehicle}
|
||||||
<div class="flex-1">
|
</span>
|
||||||
<div class="font-medium flex items-center gap-2">
|
<div class="flex-grow">
|
||||||
${event.extendedProps.driverName}
|
<div class="font-medium">${event.extendedProps.driverName}</div>
|
||||||
${isToday ? '<span class="text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full">Dnes</span>' : ''}
|
<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>
|
||||||
<div class="text-sm text-gray-600">${event.extendedProps.vehicle}</div>
|
` : ''}
|
||||||
</div>
|
|
||||||
<div class="text-sm text-gray-500">
|
|
||||||
${startDate} - ${endDate}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|||||||
Reference in New Issue
Block a user