Fix: laeufi.js UI.esc → UI.escape (nicht existent → crash → 🚧) (SW by-v917)

This commit is contained in:
rene 2026-05-13 20:27:22 +02:00
parent 4a52a52cff
commit 85864d8ef2
5 changed files with 22 additions and 22 deletions

View file

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

View file

@ -599,10 +599,10 @@
<div id="modal-container"></div> <div id="modal-container"></div>
<!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features --> <!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features -->
<script src="/js/api.js?v=916"></script> <script src="/js/api.js?v=917"></script>
<script src="/js/ui.js?v=916"></script> <script src="/js/ui.js?v=917"></script>
<script src="/js/app.js?v=916"></script> <script src="/js/app.js?v=917"></script>
<script src="/js/worlds.js?v=916"></script> <script src="/js/worlds.js?v=917"></script>
<!-- Feature-Seiten werden lazy geladen --> <!-- Feature-Seiten werden lazy geladen -->

View file

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

View file

@ -36,7 +36,7 @@ window.Page_laeufi = (() => {
const zwinger = _breederInfo?.zwingername || 'Mein Zwinger'; const zwinger = _breederInfo?.zwingername || 'Mein Zwinger';
const logoUrl = _breederInfo?.logo_url || null; const logoUrl = _breederInfo?.logo_url || null;
const logoHtml = logoUrl const logoHtml = logoUrl
? `<img src="${UI.esc(logoUrl)}" alt="Logo" ? `<img src="${UI.escape(logoUrl)}" alt="Logo"
style="width:48px;height:48px;border-radius:50%;object-fit:cover; style="width:48px;height:48px;border-radius:50%;object-fit:cover;
border:2px solid rgba(196,132,58,.5);flex-shrink:0" border:2px solid rgba(196,132,58,.5);flex-shrink:0"
onerror="this.style.display='none'">` onerror="this.style.display='none'">`
@ -56,7 +56,7 @@ window.Page_laeufi = (() => {
<div style="flex:1;min-width:0"> <div style="flex:1;min-width:0">
<h2 style="margin:0 0 2px;font-size:var(--text-lg);font-weight:700; <h2 style="margin:0 0 2px;font-size:var(--text-lg);font-weight:700;
color:rgba(255,255,255,.95);white-space:nowrap;overflow:hidden; color:rgba(255,255,255,.95);white-space:nowrap;overflow:hidden;
text-overflow:ellipsis;line-height:1.2">${UI.esc(zwinger)}</h2> text-overflow:ellipsis;line-height:1.2">${UI.escape(zwinger)}</h2>
<div style="display:flex;align-items:center;gap:var(--space-2)"> <div style="display:flex;align-items:center;gap:var(--space-2)">
<svg style="width:11px;height:11px;color:var(--c-primary);flex-shrink:0" viewBox="0 0 256 256"> <svg style="width:11px;height:11px;color:var(--c-primary);flex-shrink:0" viewBox="0 0 256 256">
<use href="/icons/phosphor.svg#lock-key"></use> <use href="/icons/phosphor.svg#lock-key"></use>
@ -89,7 +89,7 @@ window.Page_laeufi = (() => {
_renderHundeList(); _renderHundeList();
} catch (err) { } catch (err) {
document.getElementById('laeufi-list').innerHTML = document.getElementById('laeufi-list').innerHTML =
`<p style="color:var(--c-danger)">${UI.esc(err.message || 'Fehler')}</p>`; `<p style="color:var(--c-danger)">${UI.escape(err.message || 'Fehler')}</p>`;
} }
} }
@ -131,12 +131,12 @@ window.Page_laeufi = (() => {
cursor:pointer;user-select:none"> cursor:pointer;user-select:none">
<div style="flex:1;min-width:0"> <div style="flex:1;min-width:0">
<div style="display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap"> <div style="display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap">
<span style="font-size:var(--text-base);font-weight:700">${UI.esc(h.name)}</span> <span style="font-size:var(--text-base);font-weight:700">${UI.escape(h.name)}</span>
${h.rufname ? `<span style="color:var(--c-text-muted);font-size:var(--text-sm)">"${UI.esc(h.rufname)}"</span>` : ''} ${h.rufname ? `<span style="color:var(--c-text-muted);font-size:var(--text-sm)">"${UI.escape(h.rufname)}"</span>` : ''}
${alter ? `<span style="font-size:var(--text-xs);color:var(--c-text-muted)">${alter}</span>` : ''} ${alter ? `<span style="font-size:var(--text-xs);color:var(--c-text-muted)">${alter}</span>` : ''}
</div> </div>
${h.rasse_text || h.farbe ? `<div style="font-size:var(--text-xs);color:var(--c-text-secondary);margin-top:2px"> ${h.rasse_text || h.farbe ? `<div style="font-size:var(--text-xs);color:var(--c-text-secondary);margin-top:2px">
${[h.rasse_text, h.farbe].filter(Boolean).map(s => UI.esc(s)).join(' · ')} ${[h.rasse_text, h.farbe].filter(Boolean).map(s => UI.escape(s)).join(' · ')}
</div>` : ''} </div>` : ''}
</div> </div>
<span style="color:var(--c-text-muted)">${UI.icon('caret-down')}</span> <span style="color:var(--c-text-muted)">${UI.icon('caret-down')}</span>
@ -177,7 +177,7 @@ window.Page_laeufi = (() => {
]); ]);
_renderHundContent(el, hundId, laeufiList, deckList); _renderHundContent(el, hundId, laeufiList, deckList);
} catch (err) { } catch (err) {
el.innerHTML = `<p style="color:var(--c-danger)">${UI.esc(err.message || 'Fehler')}</p>`; el.innerHTML = `<p style="color:var(--c-danger)">${UI.escape(err.message || 'Fehler')}</p>`;
} }
} }
@ -276,7 +276,7 @@ window.Page_laeufi = (() => {
${l.ende ? `<span style="font-size:var(--text-xs);color:var(--c-text-muted)">→ ${_fmtDate(l.ende)}</span> ${l.ende ? `<span style="font-size:var(--text-xs);color:var(--c-text-muted)">→ ${_fmtDate(l.ende)}</span>
<span style="font-size:var(--text-xs);color:var(--c-text-muted)">${_daysDiff(l.beginn, l.ende)} Tage</span>` : ''} <span style="font-size:var(--text-xs);color:var(--c-text-muted)">${_daysDiff(l.beginn, l.ende)} Tage</span>` : ''}
</div> </div>
${l.notiz ? `<p style="font-size:var(--text-xs);color:var(--c-text-secondary);margin:var(--space-1) 0 0;font-style:italic">${UI.esc(l.notiz)}</p>` : ''} ${l.notiz ? `<p style="font-size:var(--text-xs);color:var(--c-text-secondary);margin:var(--space-1) 0 0;font-style:italic">${UI.escape(l.notiz)}</p>` : ''}
</div> </div>
<div style="display:flex;gap:var(--space-1);flex-shrink:0"> <div style="display:flex;gap:var(--space-1);flex-shrink:0">
<button class="btn btn-ghost btn-xs laeufi-prog-btn" data-id="${l.id}" title="Progesterontests"> <button class="btn btn-ghost btn-xs laeufi-prog-btn" data-id="${l.id}" title="Progesterontests">
@ -321,7 +321,7 @@ window.Page_laeufi = (() => {
border-radius:999px;padding:1px 8px;font-size:var(--text-xs);font-weight:600">${tc.label}</span> border-radius:999px;padding:1px 8px;font-size:var(--text-xs);font-weight:600">${tc.label}</span>
</div> </div>
<div style="display:flex;gap:var(--space-3);flex-wrap:wrap;font-size:var(--text-xs);color:var(--c-text-secondary)"> <div style="display:flex;gap:var(--space-3);flex-wrap:wrap;font-size:var(--text-xs);color:var(--c-text-secondary)">
${d.ruede_name ? `<span>${UI.icon('dog')} Rüde: ${UI.esc(d.ruede_name)}</span>` : ''} ${d.ruede_name ? `<span>${UI.icon('dog')} Rüde: ${UI.escape(d.ruede_name)}</span>` : ''}
<span>${UI.icon('arrows-clockwise')} ${_DECKART[d.deckart] || d.deckart}</span> <span>${UI.icon('arrows-clockwise')} ${_DECKART[d.deckart] || d.deckart}</span>
${d.ultraschall_datum ? `<span>${UI.icon('heartbeat')} Ultraschall: ${_fmtDate(d.ultraschall_datum)}</span>` : ''} ${d.ultraschall_datum ? `<span>${UI.icon('heartbeat')} Ultraschall: ${_fmtDate(d.ultraschall_datum)}</span>` : ''}
</div> </div>
@ -360,7 +360,7 @@ window.Page_laeufi = (() => {
</span> </span>
<span style="color:var(--c-text-secondary)">${_fmtDate(m.datum)}</span> <span style="color:var(--c-text-secondary)">${_fmtDate(m.datum)}</span>
<span style="color:${m.vorbei ? 'var(--c-text-muted)' : 'var(--c-text)'};font-weight:${m.vorbei ? '400' : '600'}"> <span style="color:${m.vorbei ? 'var(--c-text-muted)' : 'var(--c-text)'};font-weight:${m.vorbei ? '400' : '600'}">
${UI.esc(m.label)} ${UI.escape(m.label)}
</span> </span>
</div>`).join('')} </div>`).join('')}
</div> </div>
@ -390,7 +390,7 @@ window.Page_laeufi = (() => {
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label">Notiz</label> <label class="form-label">Notiz</label>
<textarea class="form-control" name="notiz" rows="2">${UI.esc(v.notiz || '')}</textarea> <textarea class="form-control" name="notiz" rows="2">${UI.escape(v.notiz || '')}</textarea>
</div> </div>
</form>`, </form>`,
footer: ` footer: `
@ -439,7 +439,7 @@ window.Page_laeufi = (() => {
<div class="form-group"> <div class="form-group">
<label class="form-label">Rüde</label> <label class="form-label">Rüde</label>
<input class="form-control" name="ruede_name" placeholder="Name des Deckrüden" <input class="form-control" name="ruede_name" placeholder="Name des Deckrüden"
value="${UI.esc(v.ruede_name || '')}"> value="${UI.escape(v.ruede_name || '')}">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label">Deckart</label> <label class="form-label">Deckart</label>
@ -468,7 +468,7 @@ window.Page_laeufi = (() => {
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label">Notiz</label> <label class="form-label">Notiz</label>
<textarea class="form-control" name="notiz" rows="2">${UI.esc(v.notiz || '')}</textarea> <textarea class="form-control" name="notiz" rows="2">${UI.escape(v.notiz || '')}</textarea>
</div> </div>
</form>`, </form>`,
footer: ` footer: `
@ -537,10 +537,10 @@ window.Page_laeufi = (() => {
<tr style="border-top:1px solid var(--c-border)"> <tr style="border-top:1px solid var(--c-border)">
<td style="padding:var(--space-2)">${_fmtDate(t.datum)}</td> <td style="padding:var(--space-2)">${_fmtDate(t.datum)}</td>
<td style="text-align:right;padding:var(--space-2);font-weight:600"> <td style="text-align:right;padding:var(--space-2);font-weight:600">
${t.wert != null ? `${t.wert} ${UI.esc(t.einheit)}` : '—'} ${t.wert != null ? `${t.wert} ${UI.escape(t.einheit)}` : '—'}
${t.wert != null ? `<span style="font-size:10px;margin-left:4px;color:var(--c-text-muted)">${_progEinschaetzung(t.wert, t.einheit)}</span>` : ''} ${t.wert != null ? `<span style="font-size:10px;margin-left:4px;color:var(--c-text-muted)">${_progEinschaetzung(t.wert, t.einheit)}</span>` : ''}
</td> </td>
<td style="padding:var(--space-2);color:var(--c-text-secondary)">${t.labor ? UI.esc(t.labor) : '—'}</td> <td style="padding:var(--space-2);color:var(--c-text-secondary)">${t.labor ? UI.escape(t.labor) : '—'}</td>
<td style="padding:var(--space-2);text-align:right"> <td style="padding:var(--space-2);text-align:right">
<button class="btn btn-ghost btn-xs prog-delete-btn" data-id="${t.id}" <button class="btn btn-ghost btn-xs prog-delete-btn" data-id="${t.id}"
style="color:var(--c-danger)">${UI.icon('trash')}</button> style="color:var(--c-danger)">${UI.icon('trash')}</button>

View file

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