Files
Webklar-Kundenbereich/public/neu/fristen-streifen.js
T
ClaudeandClaude Sonnet 5.5 5cd49d6a4a Kundenansicht neu E-Fix F1 (Nachkorrektur): Widerrufsstreifen auf den Bestellseiten ausgeblendet
Auf Abo bestellen, Wechsel, Zusatzspeicher und Übernahmegutschrift fehlt der feste Widerrufsstreifen, damit Kerninfo und Knopf "Zahlungspflichtig bestellen"
auch bei Privatkunden in laufender Frist auf 375x667 auf einem Bildschirm stehen (Spec Abschnitt 4). Auf den Hauptseiten bleibt er (Spec 5.2),
"Vertrag widerrufen" bleibt im Konto und unter Verträge erreichbar.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 22:44:20 +00:00

74 lines
2.9 KiB
JavaScript

/* Kundenansicht neu: Widerrufsstreifen. Läuft eine Widerrufsfrist, steht über der Leiste ein schmaler Streifen
„Widerrufsfrist bis TT.MM. · Widerrufen“. Er ist nicht wegtippbar. Die Daten kommen von GET /api/fristen; jeder Fehler
(404 auf einem Server ohne P5, 500, Netz weg) und anzeigen !== true ergeben keinen Streifen. Daten in Europe/Berlin. */
import { h, leeren } from './dom.js'
/** Fristen vom Server holen; bei Fehlern jeder Art oder anzeigen !== true null. */
export async function ladeFristen(api) {
try {
const daten = await api('/api/fristen')
return daten?.anzeigen === true ? daten : null
} catch {
return null
}
}
/** Wie ladeFristen, aber für das Neuladen in der Sitzung: ein Fehler ergibt undefined (der bisherige Stand bleibt), keine Frist null. */
export async function ladeFristenNeu(api) {
try {
const daten = await api('/api/fristen')
return daten?.anzeigen === true ? daten : null
} catch {
return undefined
}
}
const datumBerlin = new Intl.DateTimeFormat('de-DE', { timeZone: 'Europe/Berlin', day: '2-digit', month: '2-digit' })
/** 'Widerrufsfrist bis TT.MM.' in der Zeit von Berlin; ohne gültiges Datum 'Widerrufsfrist läuft'. */
export function streifenText(iso) {
const zeit = new Date(iso)
if (!iso || Number.isNaN(zeit.getTime())) return 'Widerrufsfrist läuft'
const teile = Object.fromEntries(datumBerlin.formatToParts(zeit).map((t) => [t.type, t.value]))
return `Widerrufsfrist bis ${teile.day}.${teile.month}.`
}
/** Frühestes Ende als ISO-Text: fruehestesEnde, sonst das kleinste bis, sonst ''. */
export function fruehesteFrist(daten) {
if (daten?.fruehestesEnde) return daten.fruehestesEnde
const zeiten = (daten?.fristen ?? []).map((f) => f?.bis).filter((b) => b && !Number.isNaN(Date.parse(b)))
return zeiten.sort((a, b) => Date.parse(a) - Date.parse(b))[0] ?? ''
}
/**
* Streifen in `wurzel` füllen: setze(daten) nimmt die Fristen (null: keine), erlaube(ok) sagt, ob die gezeigte Seite den Streifen tragen darf
* (nicht die Bestellseiten, siehe zeigtWiderrufsstreifen). Sichtbar ist er nur mit Fristen auf einer erlaubten Seite; am Körper steht dann `kn-hat-streifen`.
*/
export function baueStreifen(wurzel, { koerper = document.body } = {}) {
wurzel.classList.add('kn-streifen')
wurzel.setAttribute('role', 'region')
wurzel.setAttribute('aria-label', 'Widerrufsfrist')
let stand = null
let erlaubt = true
const zeichne = () => {
leeren(wurzel)
if (!stand || !erlaubt) {
wurzel.hidden = true
koerper.classList.remove('kn-hat-streifen')
return
}
wurzel.append(streifenText(fruehesteFrist(stand)), ' · ', h('a', { class: 'kn-streifen-link', href: '/widerrufen.html' }, 'Widerrufen'))
wurzel.hidden = false
koerper.classList.add('kn-hat-streifen')
}
return {
setze(daten) { stand = daten || null; zeichne() },
erlaube(ok) {
if ((ok !== false) === erlaubt) return
erlaubt = ok !== false
zeichne()
},
}
}