Reines HTML5/CSS3/JavaScript ohne Build-Tooling, lauffaehig direkt per Doppelklick auf index.html (file://, kein Server noetig): - Datenmodell fuer Ausflugsziele mit allen Feldern aus der Anforderung, 15 feste Kategorien inkl. Farbe/Icon - Zentraler Pub/Sub-Store mit LocalStorage-Persistenz und Migrations-Grundgeruest - Interaktive Karte (Leaflet + Leaflet.markercluster, lokal vendored) mit kategoriefarbenen Markern, Clustering, Popups, Geolocation-Button - Kartengrundlage ueber CARTO-Basemaps statt tile.openstreetmap.org, da dessen Referer-Pflicht file://-Aufrufe blockiert - Seed-Daten als eingebettetes Script (data/seed.js) statt JSON-Datei, da fetch() auf lokale Dateien unter file:// nicht zuverlaessig funktioniert - Ergebnisliste mit 10 Beispiel-Ausflugszielen, sicher gerendert ueber textContent/DOM-APIs statt innerHTML (Vorbereitung fuer spaeteren KI-JSON-Import mit Fremddaten) - Responsives Layout (Desktop nebeneinander, Mobile gestapelt)
38 lines
1.1 KiB
JavaScript
38 lines
1.1 KiB
JavaScript
// Schlanke Migrations-Infrastruktur für das LocalStorage-Datenschema.
|
|
// Aktuell existiert nur Schema-Version 1, daher ist MIGRATIONS leer.
|
|
// Neue Migrationen werden als { from, to, migrate(data) } ergänzt und
|
|
// von migrate() sequenziell angewendet.
|
|
|
|
(function () {
|
|
const { CURRENT_SCHEMA_VERSION } = EventMap.config;
|
|
|
|
const MIGRATIONS = [
|
|
// Beispiel für zukünftige Migrationen:
|
|
// { from: 1, to: 2, migrate: (data) => ({ ...data, neuesFeld: 'default' }) },
|
|
];
|
|
|
|
/**
|
|
* Wendet alle nötigen Migrationsschritte an, bis schemaVersion der
|
|
* aktuellen CURRENT_SCHEMA_VERSION entspricht.
|
|
*/
|
|
function migrate(data) {
|
|
let current = data ?? {};
|
|
let version = current.schemaVersion ?? 1;
|
|
|
|
while (version < CURRENT_SCHEMA_VERSION) {
|
|
const step = MIGRATIONS.find((m) => m.from === version);
|
|
if (!step) {
|
|
// Keine passende Migration gefunden: auf aktuelle Version springen,
|
|
// um die App nicht zu blockieren.
|
|
break;
|
|
}
|
|
current = step.migrate(current);
|
|
version = step.to;
|
|
}
|
|
|
|
return { ...current, schemaVersion: CURRENT_SCHEMA_VERSION };
|
|
}
|
|
|
|
EventMap.store.migrate = migrate;
|
|
})();
|