Fix: Selektives Loeschen griff auf Geraet nicht — Keep-Set jetzt selbsttragend aus der Meta

Renes Befund: 'Alles loeschen' wischte weiter alles. Ursachen: (a) Bestands-
Gebiete hatten keine standort-Region (ensureHomeArea legt nur bei FEHLENDER
Kachel los), (b) Korridor-Keys waren nur aus API-Tracks ableitbar -> leeres
Keep-Set = Komplett-Wipe.
- downloadCorridor speichert vereinfachten Track (<=60 Pkt) in der Region-Meta;
  clear() baut Korridor-Keep daraus — ohne API/Login/GPS
- Standort-ADOPTION: clear() mit center legt fehlende standort-Region
  synthetisch an (Bestandsdaten vor Runde 6)
- map.js: center-Fallback auf by_last_position wenn GPS noch keinen Fix hat
- Test r7 erweitert (clear ohne Optionen haelt Korridor aus Meta), alle gruen
Bump v1236
This commit is contained in:
rene 2026-06-06 13:44:01 +02:00
parent 29cd489287
commit ca97613938
8 changed files with 56 additions and 24 deletions

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung.
============================================================ */
const APP_VER = '1235'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VER = '1236'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt
window.APP_VER = APP_VER; // global verfügbar für andere Module (z.B. offline-indicator)
window.APP_VERSION = APP_VERSION;

View file

@ -598,13 +598,21 @@ window.MapOffline = (function () {
if (opts.onProgress) opts.onProgress({ bytes: state.bytes, done: state.done, total: total });
}).then(function () { return chunkLoop(idx + 64); });
}
// Vereinfachten Track (≤60 Punkte) in der Region-Meta ablegen: damit kann clear()
// die Korridor-Keep-Keys SELBST aus IndexedDB bauen — ohne API/Login/GPS
// (Gerätetest René 2026-06-08: leeres Keep-Set = Komplett-Wipe trotz Routen).
var step = Math.max(1, Math.ceil(track.length / 60));
var slim = track.filter(function (p, i) { return i % step === 0; });
if (slim[slim.length - 1] !== track[track.length - 1]) slim.push(track[track.length - 1]);
slim = slim.map(function (p) { return { lat: p.lat, lon: p.lon }; });
return chunkLoop(0)
.then(function () { return _cacheGlyphs(); })
.then(function (gb) { state.bytes += gb; return _cachePois(bb); })
.then(function (pc) {
poiCount = pc;
return _addRegion({ type: 'korridor', name: opts.name || null, lat: track[0].lat, lon: track[0].lon,
tiles: state.stored, bytes: state.bytes, pois: poiCount, savedAt: Date.now() });
track: slim, tiles: state.stored, bytes: state.bytes, pois: poiCount, savedAt: Date.now() });
})
.then(function () { return _bumpTotal(state.bytes); })
.then(function () { return { tiles: state.stored, bytes: state.bytes, pois: poiCount, capped: state.bytes >= cap }; });
@ -797,8 +805,18 @@ window.MapOffline = (function () {
var keptRegions = regions.filter(function (r) { return r.type === 'standort' || r.type === 'korridor'; });
regions.forEach(function (r) {
if (r.type === 'standort' && r.radiusKm) _keepRegionKeys(r.lat, r.lon, r.radiusKm, keep);
// Korridor-Keep direkt aus der Region-Meta (r.track) — unabhängig von API/Login.
if (r.type === 'korridor' && r.track && r.track.length >= 2) _keepCorridorKeys(r.track, 1, keep);
});
if (opts.center) _keepRegionKeys(opts.center.lat, opts.center.lon, 5, keep);
if (opts.center) {
_keepRegionKeys(opts.center.lat, opts.center.lon, 5, keep);
// Standort-ADOPTION: Bestandsdaten haben evtl. keine standort-Region (Gebiet wurde
// vor Runde 6 geladen) — Eintrag synthetisch anlegen, damit Folge-Läufe ihn kennen.
if (!keptRegions.some(function (r) { return r.type === 'standort'; })) {
keptRegions.push({ type: 'standort', lat: opts.center.lat, lon: opts.center.lon,
radiusKm: 5, tiles: 0, bytes: 0, pois: 0, savedAt: Date.now() });
}
}
(opts.keepTracks || []).forEach(function (t) {
if (t && t.length >= 2) _keepCorridorKeys(t, 1, keep);
});

View file

@ -2310,15 +2310,21 @@ window.Page_map = (() => {
}
// SELEKTIV löschen (René 2026-06-08, spart Vorladezeit): Standort-Gebiet + Korridore
// der gespeicherten Routen bleiben einfach stehen statt löschen-und-neu-laden.
// (Korridor-Keep kommt primär aus der Region-Meta; API-Tracks sind Ergänzung.)
let keepTracks = [];
try {
keepTracks = ((await API.routes.list()) || [])
.map(r => r.preview_track).filter(t => (t || []).length >= 2);
} catch (e) {}
await MapOffline.clear({
center: _userPos ? { lat: _userPos.lat, lon: _userPos.lon } : null,
keepTracks,
}).catch(() => {});
// Position: GPS-Fix, sonst letzte bekannte Position (wetter.js et al.)
let center = _userPos ? { lat: _userPos.lat, lon: _userPos.lon } : null;
if (!center) {
try {
const p = JSON.parse(localStorage.getItem('by_last_position') || 'null');
if (p?.lat != null) center = { lat: p.lat, lon: p.lon };
} catch (e) {}
}
await MapOffline.clear({ center, keepTracks }).catch(() => {});
_setCoverage(false);
UI.modal.close();
UI.toast.success('Offline-Karten gelöscht — Standort-Gebiet und Routen-Korridore bleiben erhalten.');