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
|
|
@ -26,16 +26,7 @@ window.Page_trainingsplaene = (() => {
|
|||
// ----------------------------------------------------------
|
||||
// HELPER
|
||||
// ----------------------------------------------------------
|
||||
function _esc(str) {
|
||||
if (!str) return '';
|
||||
return String(str)
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"');
|
||||
}
|
||||
|
||||
function _icon(name) {
|
||||
function _icon(name) {
|
||||
return `<svg class="ph-icon" aria-hidden="true" style="width:1em;height:1em;vertical-align:-0.15em"><use href="/icons/phosphor.svg#${name}"></use></svg>`;
|
||||
}
|
||||
|
||||
|
|
@ -57,9 +48,9 @@ window.Page_trainingsplaene = (() => {
|
|||
// ----------------------------------------------------------
|
||||
|
||||
function _renderTable(headers, rows) {
|
||||
const ths = headers.map(h => `<th style="padding:6px 10px;background:var(--c-surface-2);font-weight:var(--weight-semibold);font-size:var(--text-sm);white-space:nowrap">${_esc(h)}</th>`).join('');
|
||||
const ths = headers.map(h => `<th style="padding:6px 10px;background:var(--c-surface-2);font-weight:var(--weight-semibold);font-size:var(--text-sm);white-space:nowrap">${UI.escape(h)}</th>`).join('');
|
||||
const trs = rows.map(row => {
|
||||
const tds = row.map((cell, i) => `<td style="padding:6px 10px;font-size:var(--text-sm);color:var(--c-text);border-top:1px solid var(--c-border);${i === 0 ? 'white-space:nowrap;font-weight:var(--weight-semibold)' : ''}">${_esc(cell)}</td>`).join('');
|
||||
const tds = row.map((cell, i) => `<td style="padding:6px 10px;font-size:var(--text-sm);color:var(--c-text);border-top:1px solid var(--c-border);${i === 0 ? 'white-space:nowrap;font-weight:var(--weight-semibold)' : ''}">${UI.escape(cell)}</td>`).join('');
|
||||
return `<tr>${tds}</tr>`;
|
||||
}).join('');
|
||||
return `
|
||||
|
|
@ -80,15 +71,15 @@ window.Page_trainingsplaene = (() => {
|
|||
if (checked) doneCount++;
|
||||
return `
|
||||
<label style="display:flex;align-items:flex-start;gap:var(--space-2);cursor:pointer;padding:var(--space-1) 0" class="tp-goal-label">
|
||||
<input type="checkbox" data-lskey="${_esc(key)}" ${checked ? 'checked' : ''}
|
||||
<input type="checkbox" data-lskey="${UI.escape(key)}" ${checked ? 'checked' : ''}
|
||||
style="margin-top:2px;flex-shrink:0;accent-color:var(--c-primary);width:16px;height:16px">
|
||||
<span style="font-size:var(--text-sm);color:var(--c-text);line-height:1.5">${_esc(goal)}</span>
|
||||
<span style="font-size:var(--text-sm);color:var(--c-text);line-height:1.5">${UI.escape(goal)}</span>
|
||||
</label>`;
|
||||
}).join('');
|
||||
|
||||
const progress = total > 0 ? Math.round((doneCount / total) * 100) : 0;
|
||||
return `
|
||||
<div class="tp-goals" data-plan="${_esc(planId)}" data-total="${total}">
|
||||
<div class="tp-goals" data-plan="${UI.escape(planId)}" data-total="${total}">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-2)">
|
||||
<span style="font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--c-text-secondary)">
|
||||
${_icon('check-circle')} Lernziele
|
||||
|
|
@ -106,13 +97,13 @@ window.Page_trainingsplaene = (() => {
|
|||
|
||||
function _renderAccordionPhase(id, title, content) {
|
||||
return `
|
||||
<div class="tp-acc" id="tp-acc-${_esc(id)}">
|
||||
<button class="tp-acc-head" data-acc="${_esc(id)}"
|
||||
<div class="tp-acc" id="tp-acc-${UI.escape(id)}">
|
||||
<button class="tp-acc-head" data-acc="${UI.escape(id)}"
|
||||
style="width:100%;display:flex;justify-content:space-between;align-items:center;padding:var(--space-3) var(--space-4);background:none;border:none;border-top:1px solid var(--c-border);cursor:pointer;text-align:left">
|
||||
<span style="font-weight:var(--weight-semibold);color:var(--c-text)">${title}</span>
|
||||
<span class="tp-acc-arrow">${_icon('caret-down')}</span>
|
||||
</button>
|
||||
<div class="tp-acc-body" id="tp-acc-body-${_esc(id)}" hidden
|
||||
<div class="tp-acc-body" id="tp-acc-body-${UI.escape(id)}" hidden
|
||||
style="padding:var(--space-3) var(--space-4) var(--space-4)">
|
||||
${content}
|
||||
</div>
|
||||
|
|
@ -122,7 +113,7 @@ window.Page_trainingsplaene = (() => {
|
|||
function _renderHintBox(text) {
|
||||
return `
|
||||
<div style="background:var(--c-surface-2);border-left:3px solid var(--c-primary);border-radius:var(--radius-sm);padding:var(--space-3) var(--space-4);margin:var(--space-3) 0;font-size:var(--text-sm);color:var(--c-text);line-height:1.6">
|
||||
${_icon('info')} ${_esc(text)}
|
||||
${_icon('info')} ${UI.escape(text)}
|
||||
</div>`;
|
||||
}
|
||||
|
||||
|
|
@ -141,7 +132,7 @@ window.Page_trainingsplaene = (() => {
|
|||
justify-content:center;gap:2px;white-space:normal;text-align:center;line-height:1.2">
|
||||
<svg class="ph-icon" aria-hidden="true" style="width:22px;height:22px"><use href="/icons/phosphor.svg#${p.icon}"></use></svg>
|
||||
<span style="font-size:var(--text-sm);font-weight:600">${p.label}</span>
|
||||
<span style="font-size:var(--text-xs);opacity:0.8">${_esc(p.sub)}</span>
|
||||
<span style="font-size:var(--text-xs);opacity:0.8">${UI.escape(p.sub)}</span>
|
||||
</button>`).join('');
|
||||
return `<div style="display:flex;gap:var(--space-2);margin-bottom:var(--space-4);flex-wrap:wrap">${btns}</div>`;
|
||||
}
|
||||
|
|
@ -764,7 +755,7 @@ window.Page_trainingsplaene = (() => {
|
|||
<div style="flex:1;min-width:220px">
|
||||
<div style="font-size:var(--text-sm);font-weight:var(--weight-semibold);
|
||||
color:var(--c-text);margin-bottom:var(--space-2)">
|
||||
${_esc(MONTHS[month - 1])} ${year}
|
||||
${UI.escape(MONTHS[month - 1])} ${year}
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:repeat(7,1fr);gap:3px">
|
||||
${wdayHeader}
|
||||
|
|
@ -793,7 +784,7 @@ window.Page_trainingsplaene = (() => {
|
|||
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