Ignore:
Timestamp:
08/13/2026 01:08:32 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
f59a46c
Parents:
5300652
git-author:
Robin <roboburr@…> (08/13/2026 12:16:47 PM)
git-committer:
Robin <roboburr@…> (08/13/2026 01:08:32 PM)
Message:

Het paneel hoort bij wie je bent, niet bij je bestanden (Robins correctie)

Verhuisd van Beheer -> Audio naar het profielscherm van de site-eigenaar, en
daar staat het NAAST de aliassen -- want dat is dezelfde vraag. Een alias zegt
wie je elders in de fediverse bent, een MBID zegt wie je in het muziekregister
bent. Bij de audiobestanden ging het over beheer van spullen; hier gaat het over
identiteit, en daar hoort het thuis.

DE VERHUIZING VERANDERDE DE VORM, en dat is de moeite waard om te weten. Het
profielscherm IS een formulier, en een formulier in een formulier bestaat niet
in HTML. Dus geen eigen opslaan-knop meer: de keuze zet een verborgen veld en
gaat mee met de Opslaan van de pagina, precies zoals de profielfoto. Dat leest
ook beter -- een halve wijziging die je nog kunt herzien voor je opslaat.

Ontkoppelen is nu het veld leegmaken, geen aparte route. Minder oppervlak.

Het zoek-endpoint ging mee naar /admin/sites/:slug/api/musicbrainz. Een endpoint
onder /admin/audio laten staan voor een scherm in /admin/sites is precies zo'n
naad die later niemand meer kan plaatsen. De teksten heten nu asite.mb_* in
plaats van aaud.mb_*, in alle drie de talen, met een placeholder erbij.

Wat NIET veranderde: de zoekopdracht draait server-side (hun regel geldt per
applicatie), wij kiezen niet voor de artiest, en alleen een echte MBID komt de
kolom in.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/admin-site-edit.js

    r5300652 r6401681  
    134134  }
    135135})();
     136
     137  // MusicBrainz-paneel (shaer-mbz). Binnen run(), niet op moduleniveau: deze
     138  // modules krijgen bij elke paginawissel opnieuw init(), en een blok dat maar
     139  // een keer per sessie draait is precies wat shaer-5s1 opleverde.
     140  wireMusicBrainz();
    136141}
     142
     143// ── MusicBrainz: ben jij dit? (shaer-mbz) ─────────────────────────
     144//
     145// De kandidaten komen van de server, want MusicBrainz eist een verzoek per
     146// seconde per APPLICATIE en een User-Agent met contact -- allebei niet vanuit
     147// een browser af te dwingen.
     148//
     149// WIJ KIEZEN NIET. Ook niet als er precies een treffer is: een verkeerd geraden
     150// MBID zet jouw naam onder andermans werk. De knop staat er, de klik is van de
     151// artiest. En de keuze gaat mee met de Opslaan-knop van de pagina -- een eigen
     152// formulier kan hier niet, want deze pagina IS er een.
     153function wireMusicBrainz() {
     154  const knop = document.getElementById('mb-zoek-btn');
     155  const veld = document.getElementById('mb-q');
     156  const uit = document.getElementById('mb-uit');
     157  const idVeld = document.getElementById('mb-id');
     158  const naamVeld = document.getElementById('mb-naam');
     159  const huidig = document.getElementById('mb-huidig');
     160  if (!knop || !veld || !uit || !idVeld || knop.__wired) return;
     161  knop.__wired = true;
     162
     163  const el = (tag, cls, tekst) => {
     164    const e = document.createElement(tag);
     165    if (cls) e.className = cls;
     166    // textContent en nooit innerHTML: dit is tekst uit een vreemd register.
     167    if (tekst != null) e.textContent = tekst;
     168    return e;
     169  };
     170
     171  function zet(mbid, naam) {
     172    idVeld.value = mbid || '';
     173    naamVeld.value = naam || '';
     174    if (huidig) {
     175      huidig.hidden = !mbid;
     176      const n = document.getElementById('mb-huidig-naam');
     177      const a = document.getElementById('mb-huidig-link');
     178      if (n) n.textContent = naam || mbid || '';
     179      if (a) a.href = mbid ? `https://musicbrainz.org/artist/${mbid}` : '#';
     180    }
     181    uit.hidden = true;
     182    uit.replaceChildren();
     183  }
     184
     185  const wis = document.getElementById('mb-wis');
     186  if (wis) wis.addEventListener('click', () => zet('', ''));
     187
     188  async function zoek() {
     189    const q = (veld.value || '').trim();
     190    if (!q) return;
     191    uit.hidden = false;
     192    uit.replaceChildren(el('p', 'form-hint', T.asite_mb_busy || 'Zoeken…'));
     193    knop.disabled = true;
     194    try {
     195      const r = await fetch(`api/musicbrainz?q=${encodeURIComponent(q)}`, { credentials: 'same-origin' });
     196      const j = await r.json();
     197      toon((j && j.kandidaten) || []);
     198    } catch {
     199      uit.replaceChildren(el('p', 'form-hint', T.asite_mb_fail || 'MusicBrainz is even niet bereikbaar.'));
     200    } finally {
     201      knop.disabled = false;
     202    }
     203  }
     204
     205  function toon(kandidaten) {
     206    if (!kandidaten.length) {
     207      uit.replaceChildren(el('p', 'form-hint', T.asite_mb_none || 'Niets gevonden.'));
     208      return;
     209    }
     210    const lijst = el('ul', 'mb-lijst');
     211    for (const k of kandidaten) {
     212      const li = el('li', 'mb-kandidaat');
     213      li.appendChild(el('strong', null, k.naam));
     214      // De toelichting is het hele punt: er zijn drie bands die Nirvana heten,
     215      // en zonder dit veld kiest iemand de verkeerde.
     216      const bij = [k.toelichting, k.soort, k.land, k.jaren].filter(Boolean).join(' · ');
     217      if (bij) li.appendChild(el('small', 'mb-bij', bij));
     218      const open = el('a', 'mb-open', T.asite_mb_open || 'Bekijk op MusicBrainz');
     219      open.href = k.url; open.target = '_blank'; open.rel = 'noopener';
     220      li.appendChild(open);
     221      const b = el('button', 'btn', T.asite_mb_pick || 'Dit ben ik');
     222      b.type = 'button';
     223      b.addEventListener('click', () => zet(k.mbid, k.naam));
     224      li.appendChild(b);
     225      lijst.appendChild(li);
     226    }
     227    uit.replaceChildren(lijst);
     228  }
     229
     230  knop.addEventListener('click', zoek);
     231  veld.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); zoek(); } });
     232}
Note: See TracChangeset for help on using the changeset viewer.