Add admin booking management prompt and deletion

This commit is contained in:
troogs
2026-10-01 18:36:26 +02:00
parent 00e5c68ea5
commit 98486b9f01
8 changed files with 419 additions and 53 deletions
+74 -1
View File
@@ -19,6 +19,8 @@
const emptyActivities = document.getElementById("emptyActivities");
const activityMessage = document.getElementById("activityMessage");
const activityAddRow = document.getElementById("activityAddRow");
const bookingsList = document.getElementById("bookingsList");
const emptyBookings = document.getElementById("emptyBookings");
const newActivityIcon = document.getElementById("newActivityIcon");
const newActivityName = document.getElementById("newActivityName");
const newActivityType = document.getElementById("newActivityType");
@@ -33,6 +35,7 @@
let viewYear = today.getFullYear();
let viewMonth = today.getMonth();
let activities = [];
let bookings = [];
function setMessage(element, message, success) {
element.textContent = message;
@@ -149,6 +152,76 @@
prevMonthBtn.disabled = viewYear === today.getFullYear() && viewMonth === today.getMonth();
}
function renderBookings() {
bookingsList.innerHTML = "";
emptyBookings.classList.toggle("hidden", bookings.length > 0);
bookings.forEach((booking) => {
const row = document.createElement("li");
row.className = "booking-row";
const date = document.createElement("strong");
date.className = "booking-date";
date.textContent = formatDate(booking.date);
row.appendChild(date);
if (booking.activities && booking.activities.length > 0) {
const activityList = document.createElement("div");
activityList.className = "booking-activities";
booking.activities.forEach((activity) => {
const activityItem = document.createElement("span");
activityItem.className = "booking-activity";
activityItem.textContent = `${activity.icon || ""} ${activity.name}`.trim();
activityList.appendChild(activityItem);
});
row.appendChild(activityList);
}
const metadata = document.createElement("div");
metadata.className = "booking-metadata";
if (booking.name && booking.name.trim()) {
const name = document.createElement("span");
name.textContent = booking.name;
metadata.appendChild(name);
}
if (booking.bookedAt) {
const created = document.createElement("time");
created.dateTime = booking.bookedAt;
created.textContent = `Gebucht am ${new Date(booking.bookedAt).toLocaleString("de-DE", { dateStyle: "medium", timeStyle: "short" })}`;
metadata.appendChild(created);
}
if (metadata.childElementCount > 0) row.appendChild(metadata);
const deleteButton = document.createElement("button");
deleteButton.className = "delete-booking-btn";
deleteButton.type = "button";
deleteButton.textContent = "Termin löschen";
deleteButton.addEventListener("click", () => deleteBooking(booking, deleteButton));
row.appendChild(deleteButton);
bookingsList.appendChild(row);
});
}
async function deleteBooking(booking, deleteButton) {
if (!window.confirm(`Den gebuchten Termin am ${formatDate(booking.date)} wirklich löschen?`)) return;
deleteButton.disabled = true;
try {
await request("/api/admin/bookings", { method: "DELETE", body: JSON.stringify({ date: booking.date }) });
bookedDates.delete(booking.date);
await loadBookings();
renderCalendar();
renderDates();
} catch (error) {
deleteButton.disabled = false;
if (error.status === 401) showLogin("Deine Anmeldung ist abgelaufen.");
else window.alert(error.message);
}
}
async function loadBookings() {
bookings = await request("/api/admin/bookings", { method: "GET" });
renderBookings();
}
async function loadDates() {
try {
const [loadedDates, loadedBookedDates] = await Promise.all([
@@ -161,7 +234,7 @@
draftDates = new Map(dates.map((date) => [date.date, date.type]));
loginView.classList.add("hidden");
adminView.classList.remove("hidden");
await loadActivities();
await Promise.all([loadActivities(), loadBookings()]);
renderCalendar();
renderDates();
} catch (error) {