function handleLogoChange() { const e = logoInput.files[0]; if (!e) return; const t = new FileReader(); (t.addEventListener("load", () => { ((selectedLogoDataUrl = String(t.result || "")), updateLogoPreview(selectedLogoDataUrl), setStatus( profileStatus, "Logo ausgewählt. Speichern übernimmt die Änderung.", "", )); }), t.readAsDataURL(e)); } async function runApiAction(button, loadingLabel, apiCall, fallbackMessage) { try { return await withLoading(button, loadingLabel, apiCall); } catch (error) { return { success: false, error: getErrorMessage(error, fallbackMessage), }; } } async function handleProfileSubmit(e) { if ( (e.preventDefault(), !validateForm( profileForm, "Bitte ergänzen Sie die Pflichtfelder im Firmenprofil.", )) ) return; const t = collectProfileData(), a = await runApiAction( qs('button[type="submit"]', profileForm), "Speichern läuft", () => wpSaveProfile(t), "Profil konnte nicht gespeichert werden.", ); const errorMessage = getErrorMessage( a.error, "Profil konnte nicht gespeichert werden.", ); const isCreated = a.action === "created"; const successMessage = isCreated ? "Profil neu angelegt (WP-ID: " + a.id + ")" : "Profil aktualisiert (WP-ID: " + a.id + ")"; const toastMessage = isCreated ? "Profil wurde neu angelegt." : "Profiländerungen wurden gespeichert."; (a.success ? ((t.wpId = a.id), (currentSession.wpId = Number(a.id) || currentSession.wpId), (currentSession.email = t.email || currentSession.email), (currentSession.profile = t), saveSession(), writeProfileData(t), setStatus( profileStatus, successMessage, "success", ), showToast(toastMessage, "success"), renderSession()) : (setStatus( profileStatus, errorMessage, "error", ), showToast(errorMessage, "error"))); } async function handleTicketsSubmit(e) { if ( (e.preventDefault(), !validateForm( ticketsForm, "Bitte ergänzen Sie Anzahl und Empfänger-E-Mail.", )) ) return; const t = collectTicketRequest(); if (!Number.isInteger(t.ticketCount) || t.ticketCount < 1) return ( setStatus( ticketsStatus, "Bitte geben Sie mindestens ein Ticket an.", "error", ), void showToast("Bitte geben Sie mindestens ein Ticket an.", "error") ); const a = await runApiAction( qs('button[type="submit"]', ticketsForm), "Senden läuft", () => wpSubmitAnfrage("tickets", { anzahl_tickets: t.ticketCount, empfaenger_email: t.recipientEmail, nachricht: t.message, aussteller_id: currentSession.wpId, }), "Freiticket-Anfrage konnte nicht gesendet werden.", ); const errorMessage = getErrorMessage( a.error, "Freiticket-Anfrage konnte nicht gesendet werden.", ); (updatePortalData((e) => { e.ticketRequests.push(t); }), ticketsForm.reset(), a.success ? (setStatus( ticketsStatus, `Freiticket-Anfrage für ${t.ticketCount} Ticket(s) gesendet. ID: ${a.id}`, "success", ), typeof loadRequestsFromAPI === "function" && loadRequestsFromAPI(), showToast("Freiticket-Anfrage wurde gesendet.", "success")) : (setStatus( ticketsStatus, errorMessage, "error", ), showToast(errorMessage, "error"))); } async function handleServicesSubmit(e) { if ( (e.preventDefault(), !validateForm( servicesForm, "Bitte prüfen Sie die Angaben zu den Zusatzleistungen.", )) ) return; const t = collectServiceRequest(); if (!Number.isInteger(t.parking) || t.parking < 0) return ( setStatus( servicesStatus, "Bitte geben Sie eine gültige Parkplatz-Anzahl an.", "error", ), void showToast("Bitte Parkplatz-Anzahl prüfen.", "error") ); const a = [ `Stromanschluss: ${t.electricity}`, `Möbel-Paket: ${t.furniture}`, `Standreinigung: ${t.cleaning}`, `WLAN: ${t.wlan}`, `Parkplätze: ${t.parking}`, "", t.message, ] .filter(Boolean) .join("\n"), o = await runApiAction( qs('button[type="submit"]', servicesForm), "Senden läuft", () => wpSubmitAnfrage("services", { anzahl_tickets: 0, empfaenger_email: currentSession.email || "", aussteller_id: currentSession.wpId, nachricht: a, }), "Zusatzleistungen konnten nicht gesendet werden.", ); const errorMessage = getErrorMessage( o.error, "Zusatzleistungen konnten nicht gesendet werden.", ); (updatePortalData((e) => { e.serviceRequests.push(t); }), servicesForm.reset(), (servicesForm.elements.parking.value = "0"), o.success ? (setStatus( servicesStatus, `Zusatzleistungen gesendet. ID: ${o.id}`, "success", ), typeof loadRequestsFromAPI === "function" && loadRequestsFromAPI(), showToast("Zusatzleistungen wurden gesendet.", "success")) : (setStatus( servicesStatus, errorMessage, "error", ), showToast(errorMessage, "error"))); } async function handleBadgesSubmit(e) { if ( (e.preventDefault(), !validateForm(badgesForm, "Bitte ergänzen Sie Anzahl und Namen.")) ) return; const t = collectBadgeRequest(); if (!Number.isInteger(t.badgeCount) || t.badgeCount < 1) return ( setStatus( badgesStatus, "Bitte geben Sie mindestens einen Ausweis an.", "error", ), void showToast("Bitte Ausweis-Anzahl prüfen.", "error") ); if (t.names.length < 1) return ( setStatus( badgesStatus, "Bitte erfassen Sie mindestens einen Namen.", "error", ), void showToast("Bitte Namen ergänzen.", "error") ); const a = [ `Anzahl Ausweise: ${t.badgeCount}`, `Rückfrage-E-Mail: ${t.email || "nicht angegeben"}`, "Namen:", ...t.names, ].join("\n"), o = await runApiAction( qs('button[type="submit"]', badgesForm), "Senden läuft", () => wpSubmitAnfrage("badges", { anzahl: t.badgeCount, email: t.email, namen: t.names.join("\n"), nachricht: a, aussteller_id: currentSession.wpId, }), "Ausweise konnten nicht gesendet werden.", ); const errorMessage = getErrorMessage( o.error, "Ausweise konnten nicht gesendet werden.", ); (updatePortalData((e) => { e.badgeRequests.push(t); }), badgesForm.reset(), o.success ? (setStatus(badgesStatus, `Ausweise beantragt. ID: ${o.id}`, "success"), typeof loadRequestsFromAPI === "function" && loadRequestsFromAPI(), showToast("Ausstellerausweise wurden beantragt.", "success")) : (setStatus( badgesStatus, errorMessage, "error", ), showToast(errorMessage, "error"))); } function handleDocumentClick(e) { e.preventDefault(); const t = e.currentTarget.dataset.documentName; (updatePortalData((e) => { e.documentDownloads.push({ documentName: t, createdAt: new Date().toISOString(), }); }), setStatus( documentsStatus, `${t} wurde als Download-Klick erfasst.`, "success", ), showToast(`${t} wurde erfasst.`, "success")); } // Register toggle const showRegister = document.getElementById("show-register"), registerForm = document.getElementById("register-form"), registerBtn = document.getElementById("register-btn"), registerStatus = document.getElementById("register-status"); async function handleRegisterSubmit(e) { e.preventDefault(); if (!validateForm(registerForm, "Bitte alle Pflichtfelder ausfuellen.")) return; const company = document.getElementById("reg-company").value.trim(), email = document.getElementById("reg-email").value.trim(), password = document.getElementById("reg-pass").value, contact = document.getElementById("reg-contact").value.trim(), phone = document.getElementById("reg-phone").value.trim(); const result = await runApiAction( registerBtn, "Registrierung laeuft", () => wpCreateUser(email, company, password), "Registrierung fehlgeschlagen.", ); const success = result && (result.success === true || Number(result.id) > 0); updatePortalData((data) => { ((data.profile.companyName = company), (data.profile.email = email), (data.profile.contactPerson = contact), (data.profile.phone = phone), (data.profile.wpId = Number(result.id) || 0), (data.profile.wpUserId = Number(result.wp_user_id) || 0), (data.profile.mockRegister = !success)); }); const message = success ? result.message || "Registrierung erfolgreich!" : getErrorMessage( result.error || result.message, "Registrierung fehlgeschlagen.", ); (setStatus(registerStatus, message, success ? "success" : "error"), success && (registerForm.reset(), registerForm.classList.add("is-hidden"), (loginEmail.value = email), loginPassword.focus()), showToast( success ? "Registrierung erfolgreich!" : message, success ? "success" : "error", )); } if (showRegister && registerForm) { (showRegister.addEventListener("click", function (e) { (e.preventDefault(), registerForm.classList.remove("is-hidden"), registerForm.scrollIntoView({ behavior: "smooth", block: "start" })); }), registerForm.addEventListener("submit", handleRegisterSubmit)); }