Refactor: 1167 _esc() → UI.escape() in 36 Dateien, SW by-v1113
Bündel 1 aus dem Duplikat-Audit: existierende zentrale Helper nutzen
statt lokale Duplikate.
Pure Migration ohne neuen Code:
- 1167 _esc()-Aufrufe in 36 Page-Modulen migriert auf UI.escape()
- 24 lokale _esc/_escape-Definitionen entfernt
- lost.js hatte _escape() (Variante) — 17 Aufrufe ebenfalls migriert
- jobs.js + breeder.js: tote Alias-Wrapper entfernt
UI.escape() existierte schon — wurde nur überall lokal nochmal
implementiert. Funktional identisch (gleiche 4-replace-chain für
& < > ").
Tests 19/19 grün. Frontend-LOC um ~120 Zeilen reduziert.
Hinweis: _emptyState (7 Stellen) und _icon (8 Stellen) wurden NICHT
migriert — sie haben abweichende Signaturen von UI.emptyState({...})
bzw. UI.icon(name). Eigener Sprint nötig.
This commit is contained in:
parent
e7939ce98e
commit
c517c9281d
42 changed files with 1115 additions and 1341 deletions
|
|
@ -61,7 +61,7 @@ window.Page_friends = (() => {
|
|||
background:var(--c-surface-2);border-radius:var(--radius-md);
|
||||
font-size:var(--text-xs);color:var(--c-text-secondary);
|
||||
overflow:hidden;text-overflow:ellipsis;white-space:nowrap">
|
||||
banyaro.app/#friends?suche=${_esc(encodeURIComponent(myName))}
|
||||
banyaro.app/#friends?suche=${UI.escape(encodeURIComponent(myName))}
|
||||
</div>
|
||||
<button class="btn btn-ghost btn-sm" id="fr-copy-btn" title="Link kopieren">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#link"></use></svg>
|
||||
|
|
@ -82,7 +82,7 @@ window.Page_friends = (() => {
|
|||
</svg>
|
||||
<input id="fr-search" type="search" autocomplete="off"
|
||||
placeholder="Namen eines Hundebesitzers suchen…"
|
||||
value="${_esc(prefill || '')}"
|
||||
value="${UI.escape(prefill || '')}"
|
||||
style="width:100%;box-sizing:border-box;
|
||||
padding:var(--space-3) var(--space-3) var(--space-3) 2.5rem;
|
||||
border:1.5px solid var(--c-border);border-radius:var(--radius-lg);
|
||||
|
|
@ -278,19 +278,19 @@ window.Page_friends = (() => {
|
|||
const text = item.text || '';
|
||||
const page = _ACTIVITY_PAGE[item.type] || '';
|
||||
const dogLabel = item.dog_name
|
||||
? `<span class="fr-activity-dog">${_esc(item.dog_name)}</span>`
|
||||
? `<span class="fr-activity-dog">${UI.escape(item.dog_name)}</span>`
|
||||
: '';
|
||||
|
||||
const avatar = item.dog_foto
|
||||
? `<img src="${_esc(item.dog_foto)}" alt="${_esc(item.dog_name || '')}"
|
||||
? `<img src="${UI.escape(item.dog_foto)}" alt="${UI.escape(item.dog_name || '')}"
|
||||
loading="lazy" decoding="async" onerror="this.style.display='none'"
|
||||
class="fr-activity-avatar">`
|
||||
: item.avatar_url
|
||||
? `<img src="${_esc(item.avatar_url)}" alt="${_esc(item.user_name)}"
|
||||
? `<img src="${UI.escape(item.avatar_url)}" alt="${UI.escape(item.user_name)}"
|
||||
loading="lazy" decoding="async" onerror="this.style.display='none'"
|
||||
class="fr-activity-avatar">`
|
||||
: `<div class="fr-activity-avatar fr-activity-avatar--initial">
|
||||
${_esc((item.user_name || '?')[0].toUpperCase())}
|
||||
${UI.escape((item.user_name || '?')[0].toUpperCase())}
|
||||
</div>`;
|
||||
|
||||
const tag = page ? `button type="button"` : `div`;
|
||||
|
|
@ -303,17 +303,17 @@ window.Page_friends = (() => {
|
|||
${avatar}
|
||||
<div class="fr-activity-icon-badge">
|
||||
<svg class="ph-icon" style="width:10px;height:10px" aria-hidden="true">
|
||||
<use href="/icons/phosphor.svg#${_esc(item.icon)}"></use>
|
||||
<use href="/icons/phosphor.svg#${UI.escape(item.icon)}"></use>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fr-activity-body">
|
||||
<div class="fr-activity-meta">
|
||||
<span class="fr-activity-user">${_esc(item.user_name)}</span>
|
||||
<span class="fr-activity-user">${UI.escape(item.user_name)}</span>
|
||||
${dogLabel}
|
||||
</div>
|
||||
${text ? `<div class="fr-activity-text">${_esc(text)}</div>` : ''}
|
||||
<div class="fr-activity-time">${_esc(ago)}</div>
|
||||
${text ? `<div class="fr-activity-text">${UI.escape(text)}</div>` : ''}
|
||||
<div class="fr-activity-time">${UI.escape(ago)}</div>
|
||||
</div>
|
||||
</${page ? 'button' : 'div'}>
|
||||
`;
|
||||
|
|
@ -353,7 +353,7 @@ window.Page_friends = (() => {
|
|||
<div style="flex:1;min-width:120px">
|
||||
<div style="font-weight:var(--weight-semibold);color:var(--c-text);
|
||||
overflow:hidden;text-overflow:ellipsis;white-space:nowrap">
|
||||
${_esc(r.requester_name)}
|
||||
${UI.escape(r.requester_name)}
|
||||
</div>
|
||||
${_dogPills(r.dogs, 2)}
|
||||
</div>
|
||||
|
|
@ -392,11 +392,11 @@ window.Page_friends = (() => {
|
|||
display:flex;align-items:center;justify-content:center;
|
||||
font-weight:var(--weight-bold);color:var(--c-text-secondary);
|
||||
font-size:var(--text-sm);flex-shrink:0">
|
||||
${_esc((r.addressee_name || '?')[0].toUpperCase())}
|
||||
${UI.escape((r.addressee_name || '?')[0].toUpperCase())}
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div style="font-size:var(--text-sm);font-weight:var(--weight-semibold);
|
||||
color:var(--c-text)">${_esc(r.addressee_name)}</div>
|
||||
color:var(--c-text)">${UI.escape(r.addressee_name)}</div>
|
||||
<div class="text-xs-muted">Anfrage ausstehend</div>
|
||||
</div>
|
||||
<button class="btn btn-ghost btn-sm"
|
||||
|
|
@ -473,9 +473,9 @@ window.Page_friends = (() => {
|
|||
<div class="card fr-card" style="padding:var(--space-4);margin-bottom:var(--space-3);cursor:pointer;
|
||||
transition:box-shadow 0.15s"
|
||||
data-friend-id="${f.friend_id}"
|
||||
data-friend-name="${_esc(f.friend_name)}"
|
||||
data-dogs="${_esc(JSON.stringify(dogs))}"
|
||||
data-profile="${_esc(JSON.stringify(profile))}">
|
||||
data-friend-name="${UI.escape(f.friend_name)}"
|
||||
data-dogs="${UI.escape(JSON.stringify(dogs))}"
|
||||
data-profile="${UI.escape(JSON.stringify(profile))}">
|
||||
<div style="display:flex;align-items:center;gap:var(--space-3)">
|
||||
|
||||
<!-- Avatar (User-Avatar, erstes Hunde-Foto oder Initiale) -->
|
||||
|
|
@ -486,7 +486,7 @@ window.Page_friends = (() => {
|
|||
<div style="display:flex;align-items:center;flex-wrap:wrap;gap:2px;
|
||||
margin-bottom:var(--space-1)">
|
||||
<span style="font-weight:var(--weight-semibold);color:var(--c-text)">
|
||||
${_esc(f.friend_name)}
|
||||
${UI.escape(f.friend_name)}
|
||||
</span>
|
||||
${_erfahrungSpan(f.erfahrung)}
|
||||
</div>
|
||||
|
|
@ -506,7 +506,7 @@ window.Page_friends = (() => {
|
|||
<div style="display:flex;gap:var(--space-1);flex-shrink:0">
|
||||
<button class="btn btn-ghost btn-sm fr-note-btn"
|
||||
data-fr-note-id="${f.friend_id}"
|
||||
data-fr-note-name="${_esc(f.friend_name)}"
|
||||
data-fr-note-name="${UI.escape(f.friend_name)}"
|
||||
title="Notiz"
|
||||
onclick="event.stopPropagation()">
|
||||
<svg class="ph-icon"><use href="/icons/phosphor.svg#note-pencil"></use></svg>
|
||||
|
|
@ -539,13 +539,13 @@ window.Page_friends = (() => {
|
|||
padding-top:var(--space-3);border-top:1px solid var(--c-border)">
|
||||
${withPhotos.slice(0, 4).map(d => `
|
||||
<div class="text-center">
|
||||
<img src="${_esc(d.foto_url)}" alt="${_esc(d.name)}"
|
||||
<img src="${UI.escape(d.foto_url)}" alt="${UI.escape(d.name)}"
|
||||
loading="lazy" decoding="async" onerror="this.style.display='none'"
|
||||
style="width:44px;height:44px;border-radius:50%;object-fit:cover;
|
||||
border:2px solid var(--c-surface)">
|
||||
<div style="font-size:10px;color:var(--c-text-muted);margin-top:2px;
|
||||
max-width:44px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">
|
||||
${_esc(d.name)}
|
||||
${UI.escape(d.name)}
|
||||
</div>
|
||||
</div>
|
||||
`).join('')}
|
||||
|
|
@ -563,7 +563,7 @@ window.Page_friends = (() => {
|
|||
${dogs.map(d => `
|
||||
<div class="text-center">
|
||||
${d.foto_url
|
||||
? `<img src="${_esc(d.foto_url)}" alt="${_esc(d.name)}"
|
||||
? `<img src="${UI.escape(d.foto_url)}" alt="${UI.escape(d.name)}"
|
||||
loading="lazy" decoding="async" onerror="this.style.display='none'"
|
||||
style="width:72px;height:72px;border-radius:50%;object-fit:cover;
|
||||
border:2px solid var(--c-primary);margin-bottom:var(--space-2)">`
|
||||
|
|
@ -573,9 +573,9 @@ window.Page_friends = (() => {
|
|||
font-size:1.75rem;margin:0 auto var(--space-2)">🐕</div>`
|
||||
}
|
||||
<div style="font-size:var(--text-sm);font-weight:var(--weight-semibold);
|
||||
color:var(--c-text)">${_esc(d.name)}</div>
|
||||
color:var(--c-text)">${UI.escape(d.name)}</div>
|
||||
${d.rasse
|
||||
? `<div class="text-xs-secondary">${_esc(d.rasse)}</div>`
|
||||
? `<div class="text-xs-secondary">${UI.escape(d.rasse)}</div>`
|
||||
: ''}
|
||||
</div>
|
||||
`).join('')}
|
||||
|
|
@ -589,7 +589,7 @@ window.Page_friends = (() => {
|
|||
if (profile.wohnort) {
|
||||
parts.push(`<div style="display:flex;align-items:center;gap:var(--space-2);
|
||||
font-size:var(--text-sm);color:var(--c-text-secondary)">
|
||||
📍 ${_esc(profile.wohnort)}
|
||||
📍 ${UI.escape(profile.wohnort)}
|
||||
</div>`);
|
||||
}
|
||||
if (profile.erfahrung && _erfahrungBadge[profile.erfahrung]) {
|
||||
|
|
@ -600,13 +600,13 @@ window.Page_friends = (() => {
|
|||
if (profile.bio && profile.profil_sichtbarkeit !== 'private') {
|
||||
parts.push(`<div style="font-size:var(--text-sm);color:var(--c-text);
|
||||
line-height:1.5;padding-top:var(--space-2)">
|
||||
${_esc(profile.bio)}
|
||||
${UI.escape(profile.bio)}
|
||||
</div>`);
|
||||
}
|
||||
if (profile.social_link) {
|
||||
parts.push(`<div style="font-size:var(--text-xs);word-break:break-all">
|
||||
<a href="${_esc(profile.social_link)}" target="_blank" rel="noopener noreferrer"
|
||||
class="text-primary">${_esc(profile.social_link)}</a>
|
||||
<a href="${UI.escape(profile.social_link)}" target="_blank" rel="noopener noreferrer"
|
||||
class="text-primary">${UI.escape(profile.social_link)}</a>
|
||||
</div>`);
|
||||
}
|
||||
if (!parts.length) return '';
|
||||
|
|
@ -627,7 +627,7 @@ window.Page_friends = (() => {
|
|||
</div>` : '';
|
||||
|
||||
UI.modal.open({
|
||||
title: _esc(friendName),
|
||||
title: UI.escape(friendName),
|
||||
body: `
|
||||
<div>
|
||||
${badgesHTML}
|
||||
|
|
@ -687,7 +687,7 @@ window.Page_friends = (() => {
|
|||
<div style="display:flex;align-items:center;flex-wrap:wrap;gap:4px;
|
||||
margin-bottom:2px">
|
||||
<span style="font-size:var(--text-sm);font-weight:var(--weight-semibold);
|
||||
color:var(--c-text)">${_esc(u.name)}</span>
|
||||
color:var(--c-text)">${UI.escape(u.name)}</span>
|
||||
${u.is_founder ? `<span style="font-size:10px;font-weight:700;background:#7c3aed;color:#fff;padding:1px 5px;border-radius:4px">${u.founder_number ? `Gründer #${u.founder_number}` : 'Gründer'}</span>` : ''}
|
||||
${u.is_partner ? `<span style="font-size:10px;font-weight:700;background:#0ea5e9;color:#fff;padding:1px 5px;border-radius:4px">Partner</span>` : ''}
|
||||
${_erfahrungSpan(u.erfahrung)}
|
||||
|
|
@ -697,12 +697,12 @@ window.Page_friends = (() => {
|
|||
${u.dogs?.length
|
||||
? `<div style="font-size:var(--text-xs);color:var(--c-text-secondary);
|
||||
margin-top:2px">
|
||||
${u.dogs.map(d => _esc(d.name) + (d.rasse ? ` · ${_esc(d.rasse)}` : '')).join(' | ')}
|
||||
${u.dogs.map(d => UI.escape(d.name) + (d.rasse ? ` · ${UI.escape(d.rasse)}` : '')).join(' | ')}
|
||||
</div>`
|
||||
: ''}
|
||||
</div>
|
||||
<button class="btn btn-primary btn-sm fr-add-btn" title="Anfrage senden"
|
||||
data-user-id="${u.id}" data-user-name="${_esc(u.name)}">
|
||||
data-user-id="${u.id}" data-user-name="${UI.escape(u.name)}">
|
||||
<svg class="ph-icon"><use href="/icons/phosphor.svg#user-plus"></use></svg>
|
||||
</button>
|
||||
</div>
|
||||
|
|
@ -786,13 +786,13 @@ window.Page_friends = (() => {
|
|||
// ----------------------------------------------------------
|
||||
function _userAvatar(name, firstDog, avatarUrl) {
|
||||
if (avatarUrl) {
|
||||
return `<img src="${_esc(avatarUrl)}" alt="${_esc(name)}"
|
||||
return `<img src="${UI.escape(avatarUrl)}" alt="${UI.escape(name)}"
|
||||
loading="lazy" decoding="async" onerror="this.style.display='none'"
|
||||
style="width:44px;height:44px;border-radius:50%;object-fit:cover;
|
||||
border:2px solid var(--c-primary);flex-shrink:0">`;
|
||||
}
|
||||
if (firstDog?.foto_url) {
|
||||
return `<img src="${_esc(firstDog.foto_url)}" alt="${_esc(firstDog.name)}"
|
||||
return `<img src="${UI.escape(firstDog.foto_url)}" alt="${UI.escape(firstDog.name)}"
|
||||
loading="lazy" decoding="async" onerror="this.style.display='none'"
|
||||
style="width:44px;height:44px;border-radius:50%;object-fit:cover;
|
||||
border:2px solid var(--c-primary);flex-shrink:0">`;
|
||||
|
|
@ -803,7 +803,7 @@ window.Page_friends = (() => {
|
|||
border:2px solid var(--c-primary);
|
||||
display:flex;align-items:center;justify-content:center;
|
||||
font-weight:var(--weight-bold);color:var(--c-primary)">
|
||||
${_esc((name || '?')[0].toUpperCase())}
|
||||
${UI.escape((name || '?')[0].toUpperCase())}
|
||||
</div>`;
|
||||
}
|
||||
|
||||
|
|
@ -823,7 +823,7 @@ window.Page_friends = (() => {
|
|||
|
||||
function _wohnortLine(wohnort) {
|
||||
if (!wohnort) return '';
|
||||
return `<span class="text-xs-muted">📍 ${_esc(wohnort)}</span>`;
|
||||
return `<span class="text-xs-muted">📍 ${UI.escape(wohnort)}</span>`;
|
||||
}
|
||||
|
||||
function _bioLine(bio, sichtbarkeit) {
|
||||
|
|
@ -832,7 +832,7 @@ window.Page_friends = (() => {
|
|||
return `<div style="font-size:var(--text-xs);color:var(--c-text-secondary);
|
||||
margin-top:var(--space-1);line-height:1.4;
|
||||
overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;
|
||||
-webkit-box-orient:vertical">${_esc(text)}</div>`;
|
||||
-webkit-box-orient:vertical">${UI.escape(text)}</div>`;
|
||||
}
|
||||
|
||||
function _dogPills(dogs, max) {
|
||||
|
|
@ -844,7 +844,7 @@ window.Page_friends = (() => {
|
|||
${visible.map(d => `
|
||||
<span style="font-size:10px;padding:1px 6px;border-radius:var(--radius-full);
|
||||
background:var(--c-surface-2);color:var(--c-text-secondary)">
|
||||
🐕 ${_esc(d.name)}${d.rasse ? ` · ${_esc(d.rasse)}` : ''}
|
||||
🐕 ${UI.escape(d.name)}${d.rasse ? ` · ${UI.escape(d.rasse)}` : ''}
|
||||
</span>
|
||||
`).join('')}
|
||||
${rest > 0 ? `<span style="font-size:10px;color:var(--c-text-muted)">+${rest}</span>` : ''}
|
||||
|
|
@ -852,11 +852,6 @@ window.Page_friends = (() => {
|
|||
`;
|
||||
}
|
||||
|
||||
function _esc(s) {
|
||||
if (!s) return '';
|
||||
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
||||
}
|
||||
|
||||
function _emptyState(icon, title, text, cta = '') {
|
||||
return `<div class="empty-state">
|
||||
<svg class="ph-icon empty-state-icon" aria-hidden="true">
|
||||
|
|
@ -886,7 +881,7 @@ window.Page_friends = (() => {
|
|||
display:flex;align-items:center;justify-content:space-between;flex-shrink:0">
|
||||
<div>
|
||||
<div style="font-weight:var(--weight-semibold);font-size:var(--text-base)"><svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#note-pencil"></use></svg> Notiz</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-muted);margin-top:2px">${_esc(parentLabel)}</div>
|
||||
<div style="font-size:var(--text-xs);color:var(--c-text-muted);margin-top:2px">${UI.escape(parentLabel)}</div>
|
||||
</div>
|
||||
<button id="by-note-close" style="background:none;border:none;cursor:pointer;font-size:1.4rem;color:var(--c-text-muted);padding:4px 8px" aria-label="Schließen">×</button>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue