fix: pannello contenuti — PUT ritorna value salvato, data-q aggiornato, guard hash, aria-label

This commit is contained in:
2026-07-05 17:35:41 +02:00
parent be52781499
commit 608b1b68d2
2 changed files with 16 additions and 8 deletions
+12 -7
View File
@@ -43,7 +43,7 @@ const allStyles = STYLE_GROUPS as Record<string, readonly string[]>;
<h1>Contenuti</h1>
<a href="/?annotate=1" target="_blank">Vedi sito con tag ↗</a>
</div>
<input class="afield" id="csearch" type="search" placeholder="Cerca per tag o contenuto…" autocomplete="off" />
<input class="afield" id="csearch" type="search" placeholder="Cerca per tag o contenuto…" aria-label="Cerca per tag o contenuto" autocomplete="off" />
<div id="cgroups">
{GROUP_ORDER.map((g) => {
@@ -66,7 +66,7 @@ const allStyles = STYLE_GROUPS as Record<string, readonly string[]>;
: <em>Nessun override: il sito usa l'immagine originale.</em>}
</p>
<p class="cactions">
<input type="file" accept="image/*" data-file />
<input type="file" accept="image/*" aria-label={`Nuova immagine per ${it.tag}`} data-file />
<button class="abtn" type="button" data-upload>Carica</button>
<button class="abtn abtn--danger" type="button" data-restore>Ripristina originale</button>
</p>
@@ -74,8 +74,8 @@ const allStyles = STYLE_GROUPS as Record<string, readonly string[]>;
) : (
<>
{isLong(it.value)
? <textarea class="afield" rows="4" data-value>{it.value}</textarea>
: <input class="afield" value={it.value} data-value />}
? <textarea class="afield" rows="4" aria-label={`Contenuto ${it.tag}`} data-value>{it.value}</textarea>
: <input class="afield" value={it.value} aria-label={`Contenuto ${it.tag}`} data-value />}
{it.styleOptions.length > 0 && (
<p class="cstyles">
{it.styleOptions.map((sg) => (
@@ -185,9 +185,13 @@ const allStyles = STYLE_GROUPS as Record<string, readonly string[]>;
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ value, styles }),
}),
() => {
(data) => {
const saved = typeof data.value === 'string' ? data.value : value;
const field = row.querySelector<HTMLInputElement | HTMLTextAreaElement>('[data-value]')!;
field.value = saved;
row.dataset.q = `${row.dataset.tag} ${saved}`.toLowerCase();
row.querySelector<HTMLElement>('.crow-snippet')!.textContent =
value.length > 60 ? `${value.slice(0, 60)}…` : value;
saved.length > 60 ? `${saved.slice(0, 60)}…` : saved;
},
'Salvato.', 'Salvataggio non riuscito.');
} else if (btn.hasAttribute('data-upload')) {
@@ -226,7 +230,8 @@ const allStyles = STYLE_GROUPS as Record<string, readonly string[]>;
// Ancore: #<tag> apre gruppo + riga, scrolla ed evidenzia.
function openHash(): void {
const tag = decodeURIComponent(location.hash.slice(1));
let tag: string;
try { tag = decodeURIComponent(location.hash.slice(1)); } catch { return; }
if (!tag) return;
const row = document.getElementById(tag);
if (!row || !row.classList.contains('crow')) return;