Schon bei einem anderen Anbieter für Domain, Hosting oder E-Mail bezahlt? Nach dem Abschluss können Sie eine Übernahmegutschrift beantragen – wir rechnen die doppelt bezahlte Zeit anteilig an.
Ihr Stundenkontingent, der Verlauf und Ihr Vertrag.
${sub.paymentProblem ? '
Die letzte Abbuchung ist fehlgeschlagen. Bitte aktualisieren Sie Ihre Zahlungsart über „Zahlungsart aktualisieren“ in der Seitenleisteunter Verträge, damit Ihre Website online bleibt.
Jeden bezahlten Monat kommt 1 Stunde dazu. Angerechnet wird in 15-Minuten-Schritten, die ältesten Stunden zuerst. Aufträge schicken Sie uns einfach über den Chat.
Ihr Wechsel zum Wartungs-Abo ist erst abgeschlossen, wenn die Zahlung bestätigt ist.${url ? '' : ' Schreiben Sie uns gern im Chat, wenn Sie Hilfe brauchen.'}
` : ''}
+ ${renderSwitchCard(data)}
+ `
+ view.querySelector('#contract-manage')?.addEventListener('click', (ev) => openBillingPortal(ev.currentTarget, view.querySelector('#contract-error')))
+ view.querySelector('#contract-mailbox')?.addEventListener('click', requestMailbox)
+ renderStoragePanel(view.querySelector('#storage-panel'), data)
+}
+
+async function loadContracts({ afterCheckout = false } = {}) {
const card = document.getElementById('abo-card')
const view = document.getElementById('view-stunden')
- if (!card || !view) return
+ const contracts = document.getElementById('kb-contracts')
+ if (!card || !view || !contracts) return
try {
let data = await api('/api/abo')
// Direkt nach dem Checkout kann der Stripe-Webhook noch unterwegs sein
@@ -1010,13 +1147,10 @@ async function loadAboCard({ afterCheckout = false } = {}) {
data = await api('/api/abo')
}
aboState.data = data
- if (data.subscription?.active) {
- renderAboSideActive(card, data)
- renderAboAccountView(view, data)
- } else {
- renderAboSideOffer(card, data, { ended: Boolean(data.subscription) })
- renderAboOrderView(view, data)
- }
+ renderSideCard(card, data)
+ renderContractsView(contracts, data)
+ if (data.subscription?.active && data.subscription.productKey === 'wartung') renderHoursView(view, data)
+ else view.innerHTML = '
Stundenkonto
Ein Stundenkonto gibt es im Wartungs-Abo. Ihre Verträge finden Sie unter Verträge.
'
card.classList.remove('hidden')
document.getElementById('invoices-abo-note')?.classList.toggle('hidden', !data.subscription)
document.getElementById('kb-sheet-abo')?.classList.toggle('hidden', !data.subscription)
@@ -1506,7 +1640,7 @@ async function initDashboardPage() {
const aboParam = getQueryParam('abo')
if (aboParam) window.history.replaceState(null, '', `/dashboard.html${window.location.hash}`)
- loadAboCard({ afterCheckout: aboParam === 'success' })
+ loadContracts({ afterCheckout: aboParam === 'success' })
loadCustomerInvoices()
const initialView = viewFromHash()
@@ -1954,8 +2088,8 @@ function initAppShell() {
renderInstallOffers()
updateAppBar()
- // Nach der Bestellung bei Stripe: Bestaetigung steht auf der Abo-Karte im Tab "Verträge"
- if (isAppLayout() && getQueryParam('abo') === 'success') showView('vertraege')
+ // Nach der Bestellung bei Stripe: Bestaetigung steht in der Ansicht "Verträge" (Handy und Desktop)
+ if (getQueryParam('abo') === 'success') showView('vertraege')
}
// iOS zoomt beim Tippen in ein Feld hinein, wenn dessen Schrift effektiv unter 16 px liegt – z. B. bei
diff --git a/public/dashboard.html b/public/dashboard.html
index 1da14ea..45fb90d 100644
--- a/public/dashboard.html
+++ b/public/dashboard.html
@@ -184,7 +184,7 @@
-
@@ -192,6 +192,7 @@
Ihre Verträge mit WEBklar: Hosting, Wartung und Zusatzspeicher.