config.features (news, termine) als reine Daten in config.js, config.ustHinweis, config.funktionen als Alias mit Gettern auf features.news. Neu featureRegistry.js (featureConfig, featureKeys, featureHaken mit Ueberschreib-Regel, oeffentlicheAnsicht); FEATURE_KEYS, FEATURE_LABELS und DISABLED_MESSAGE in siteFeatures.js kommen aus dem Register, Werte unveraendert. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
73 lines
2.7 KiB
JavaScript
73 lines
2.7 KiB
JavaScript
import { config } from '../config.js'
|
|
|
|
// Helfer fuer das Funktionen-Register config.features (News-Pinnwand, Terminplaner; Daten in server/config.js).
|
|
// Diese Datei wird von siteFeatures.js importiert und importiert selbst keine Dienste statisch: Standard-Haken
|
|
// laden ihre Dienste per dynamischem import() innerhalb der Funktion (sonst entstuenden Importzyklen).
|
|
|
|
/** Namen der Haken, die ein Registereintrag hat (optional): Bestell-, Freischalt- und Unterlagenpruefungen. */
|
|
const HAKEN_NAMEN = ['verfuegbar', 'bestellpruefung', 'unterlagenBereit', 'belehrung', 'freischaltbar']
|
|
|
|
/**
|
|
* Standard-Haken je Funktion (Funktionen, nicht Daten). Leer in Task B1; es fuellen sie B6 (verfuegbar,
|
|
* bestellpruefung, unterlagenBereit), B7 (belehrung) und B11 (freischaltbar). News hat keine Standard-Haken.
|
|
*/
|
|
const STANDARD_HAKEN = {
|
|
news: {},
|
|
termine: {},
|
|
}
|
|
|
|
/** Registereintrag oder null; nur eigene Schluessel des Registers ('analyse', '__proto__', 'toString' => null). */
|
|
export function featureConfig(key) {
|
|
if (typeof key !== 'string' || !Object.hasOwn(config.features, key)) return null
|
|
return config.features[key]
|
|
}
|
|
|
|
/** Schluessel der Funktionen im Register, in Registerreihenfolge. */
|
|
export function featureKeys() {
|
|
return Object.keys(config.features)
|
|
}
|
|
|
|
/**
|
|
* Haken einer Funktion: { verfuegbar?, bestellpruefung?, unterlagenBereit?, belehrung?, freischaltbar? }.
|
|
* Wer config.features.<key>.<haken> als Funktion setzt (Tests), ueberschreibt den Standard.
|
|
*/
|
|
export function featureHaken(key) {
|
|
const eintrag = featureConfig(key)
|
|
if (!eintrag) return {}
|
|
const standard = Object.hasOwn(STANDARD_HAKEN, key) ? STANDARD_HAKEN[key] : {}
|
|
const haken = {}
|
|
for (const name of HAKEN_NAMEN) {
|
|
const fn = typeof eintrag[name] === 'function' ? eintrag[name] : standard[name]
|
|
if (typeof fn === 'function') haken[name] = fn
|
|
}
|
|
return haken
|
|
}
|
|
|
|
const fassung = (f) => (f ? { version: f.version, url: f.url ?? '' } : null)
|
|
|
|
/**
|
|
* Sicht fuer den Browser (Bestellseite): JSON-sicher, ohne Funktionen und ohne ticket/mails, eine Kopie
|
|
* (Aenderungen daran aendern das Register nicht). Unbekannter Schluessel => null.
|
|
*/
|
|
export function oeffentlicheAnsicht(key) {
|
|
const e = featureConfig(key)
|
|
if (!e) return null
|
|
return {
|
|
key: e.key,
|
|
name: e.label.name,
|
|
kurz: e.label.kurz,
|
|
priceLabel: e.priceLabel,
|
|
setupEstimate: e.setupEstimate,
|
|
consent: {
|
|
version: e.consent.version,
|
|
knopf: e.consent.knopf,
|
|
items: e.consent.items.map((item) => ({ id: item.id, text: item.text, haken: Boolean(item.haken) })),
|
|
},
|
|
leistungsbeschreibung: fassung(e.leistungsbeschreibung),
|
|
avv: fassung(e.avv),
|
|
widerruf: fassung(e.widerruf),
|
|
returnHash: e.returnHash,
|
|
requiresWartungsAbo: e.requiresWartungsAbo === true,
|
|
}
|
|
}
|