Feature: Hero-Stats dynamisch aufsteigend sortiert

Statt fixer Reihenfolge werden alle 5 Werte nach dem API-Fetch
per .sort() aufsteigend geordnet und der Streifen neu aufgebaut.
Damit steht immer die kleinste Zahl links, die größte rechts —
unabhängig davon wie die Zahlen wachsen.
SW by-v1000, APP_VER 1000
This commit is contained in:
rene 2026-05-15 18:40:25 +02:00
parent 64127bf395
commit 2caab31797
4 changed files with 28 additions and 32 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 = "999" # muss mit APP_VER in app.js übereinstimmen
APP_VER = "1000" # 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 = '999'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VER = '1000'; // ← 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

@ -741,17 +741,7 @@
<span class="badge">Made in Germany</span>
<span class="badge">Offline-fähig</span>
</div>
<div class="hero-stats" id="hero-stats" style="display:none">
<strong id="stat-users"></strong> Hundemenschen
<span class="sep">·</span>
<strong id="stat-dogs"></strong> Hunde
<span class="sep">·</span>
<strong id="stat-km"></strong> km Gassi-Wege
<span class="sep">·</span>
<strong id="stat-kotbeutel"></strong> Mülleimer für Kotbeutel
<span class="sep">·</span>
<strong id="stat-diary"></strong> Tagebuch-Einträge
</div>
<div class="hero-stats" id="hero-stats" style="display:none"></div>
</div>
</header>
@ -1576,30 +1566,36 @@
fetch('/api/stats/public')
.then(function(r) { return r.json(); })
.then(function(d) {
var ids = {
users: ['stat-users', 'big-users'],
dogs: ['stat-dogs', 'big-dogs'],
km: ['stat-km', 'big-km'],
forum_posts: [null, 'big-posts'],
};
function set(id, val) {
var el = document.getElementById(id);
if (el) el.textContent = fmt.format(val);
}
set('stat-users', d.users);
set('stat-dogs', d.dogs);
set('stat-km', d.km);
set('big-users', d.users);
set('big-dogs', d.dogs);
set('big-km', d.km);
set('big-posts', d.forum_posts);
set('big-diary', d.diary_entries);
set('stat-diary', d.diary_entries);
set('stat-kotbeutel', d.kotbeutel);
set('big-kotbeutel', d.kotbeutel);
// Stats-Band (weiter unten)
set('big-users', d.users);
set('big-dogs', d.dogs);
set('big-km', d.km);
set('big-posts', d.forum_posts);
set('big-diary', d.diary_entries);
set('big-kotbeutel', d.kotbeutel);
// Hero-Streifen: aufsteigend nach Wert sortiert, dynamisch aufgebaut
var heroStats = document.getElementById('hero-stats');
if (heroStats && d.users > 0) heroStats.style.display = 'flex';
if (!heroStats || !d.users) return;
var items = [
{ val: d.users, label: 'Hundemenschen' },
{ val: d.dogs, label: 'Hunde' },
{ val: d.km, label: 'km Gassi-Wege' },
{ val: d.diary_entries, label: 'Tagebuch-Einträge' },
{ val: d.kotbeutel, label: 'Mülleimer für Kotbeutel'},
];
items.sort(function(a, b) { return a.val - b.val; });
heroStats.innerHTML = items.map(function(item, i) {
return (i > 0 ? '<span class="sep">·</span>' : '') +
'<strong>' + fmt.format(item.val) + '</strong> ' + item.label;
}).join('');
heroStats.style.display = 'flex';
})
.catch(function() {});
</script>

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache
============================================================ */
const CACHE_VERSION = 'by-v999';
const CACHE_VERSION = 'by-v1000';
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