Fix: Chip-Sichtbarkeit geräteübergreifend konsistent

Root cause: _mergeDefaults() interpretierte fehlende Chips als 'neu'
und fügte sie wieder ein — auch bewusst ausgeblendete.

Fix:
- _saveConfig(): berechnet cfg.hidden = alle Default-Chips die keiner
  Welt zugewiesen sind; wird mit der Config auf dem Server gespeichert
- _mergeDefaults(): prüft hidden-Set und allAssigned-Set; fügt nur echte
  Neu-Chips ein (nicht in hidden, nicht bereits anderer Welt zugewiesen)
- Verhindert auch Doppelzuweisung wenn ein Chip zwischen Welten verschoben

SW by-v1001, APP_VER 1001
This commit is contained in:
rene 2026-05-15 19:08:34 +02:00
parent 2caab31797
commit f962cf2f4d
4 changed files with 19 additions and 6 deletions

View file

@ -410,7 +410,7 @@ async def serve_media(path: str, request: _Request):
raise _HE(404, "Nicht gefunden.")
return _media_response(filepath)
APP_VER = "1000" # muss mit APP_VER in app.js übereinstimmen
APP_VER = "1001" # muss mit APP_VER in app.js übereinstimmen
@app.get("/.well-known/assetlinks.json")
async def assetlinks():

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung.
============================================================ */
const APP_VER = '1000'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VER = '1001'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app';
// Cache-Bust-Parameter nach Update-Reload sofort entfernen

View file

@ -598,13 +598,21 @@ window.Worlds = (() => {
let _cfgCache = null;
function _mergeDefaults(cfg) {
// Neue Default-Chips die noch nicht in der gespeicherten Config sind → anhängen
const result = JSON.parse(JSON.stringify(cfg));
const result = JSON.parse(JSON.stringify(cfg));
const hidden = new Set(result.hidden || []);
// Chips die bereits einer Welt zugewiesen sind, nicht nochmal einfügen
const allAssigned = new Set([
...(result.jetzt || []), ...(result.hund || []), ...(result.welt || []),
]);
for (const world of ['jetzt', 'hund', 'welt']) {
const def = _DEFAULT_CONFIG[world] || [];
const saved = result[world] || [];
for (const page of def) {
if (!saved.includes(page)) saved.push(page);
// Nur echte Neu-Chips anhängen: nicht zugewiesen UND nicht bewusst ausgeblendet
if (!allAssigned.has(page) && !hidden.has(page)) {
saved.push(page);
allAssigned.add(page);
}
}
result[world] = saved;
}
@ -637,6 +645,11 @@ window.Worlds = (() => {
}
function _saveConfig(cfg) {
// Bewusst ausgeblendete Chips tracken: Default-Chips die keiner Welt zugewiesen sind
const allAssigned = new Set([...(cfg.jetzt||[]), ...(cfg.hund||[]), ...(cfg.welt||[])]);
const allDefault = [..._DEFAULT_CONFIG.jetzt, ..._DEFAULT_CONFIG.hund, ..._DEFAULT_CONFIG.welt];
cfg.hidden = allDefault.filter(p => !allAssigned.has(p));
_cfgCache = cfg;
try { localStorage.setItem('world_chips', JSON.stringify(cfg)); } catch {}
if (_state?.user) {

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache
============================================================ */
const CACHE_VERSION = 'by-v1000';
const CACHE_VERSION = 'by-v1001';
const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache