Changeset b406d25 in Klonkt for src/assets/js/mod/post-edit.js


Ignore:
Timestamp:
08/09/2026 07:57:50 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
b2adc20
Parents:
d7e72b8
Message:

Het type volgt de muziek, en de regel staat nog maar op een plek (shaer-cyg)

Robins regel zegt dat de post de soort van zijn muziek overneemt bij een enkele
insluiting. Dat deed hij nog niet: je koos het type zelf en de afleiding draaide
alleen bij de migratie. Nu verspringt de balk mee zodra je een playlist invoegt,
en zie je wat je aan het maken bent in plaats van het zelf bij te houden.

DE REGEL VERHUIST NAAR assets/js/shared/post-music-type.js. Hij wordt nu op twee
plaatsen gebruikt -- de server leidt het type van bestaande posts ermee af, de
editor laat het live volgen -- en dat MOET dezelfde regel zijn. Twee kopieen
zouden niet luidruchtig kapotgaan maar stil uit elkaar lopen: de editor zegt
album, de server zegt playlist, en niemand merkt het. De browser kan alleen bij
/assets en de server kan overal bij, dus staat hij daar en importeert
services/music hem. De module is puur: geen db, geen DOM, geen fetch -- wie hem
gebruikt levert zelf een opzoeker voor de soort van een playlist.

DRIE DINGEN DIE HIJ MET RUST LAAT. Klik je zelf een type aan, dan wint die
keuze en wordt er daarna niets meer voor je omgezet. Foto en Video zijn een
bewuste andere keuze over dezelfde post en worden nooit overschreven. En bij het
OPENEN van een post gebeurt er niets: de eerste afleiding wordt alleen als
ijkpunt onthouden, anders zou een oude post van type veranderen door hem te
bekijken.

De editor leidt af uit precies de tekst die straks wordt opgeslagen (chips terug
naar shortcodes via serializeChips), zodat hij niet iets anders ziet dan de
server. Zonder de playlist-soorten leidt de regel niets af in plaats van te
gokken.

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

File:
1 edited

Legend:

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

    rd7e72b8 rb406d25  
    66
    77import { pageData, esc, makeSweeper } from './lib.js';
     8// Dezelfde regel die de server gebruikt -- zie shared/post-music-type.js voor
     9// waarom hij daar staat en niet twee keer.
     10import { afleidenUitInsluitingen } from '../shared/post-music-type.js';
    811
    912// De oude inline scripts draaiden bij ELKE render; een module draait zijn
     
    791794    }
    792795    updateCharCount();
    793   }
     796    volgMuziek();
     797  }
     798
     799  // Wordt hieronder gevuld door het typeblok. Zolang dat er niet is (of de
     800  // gebruiker het type zelf koos) gebeurt er niets -- insertChip mag daar niet
     801  // op stuklopen.
     802  let volgMuziek = () => {};
    794803
    795804  // ── Embed insert: paste a platform URL -> [[embed:url]]-chip that becomes
     
    972981    const seg = card.querySelector('.pe-typeseg');
    973982    const panels = card.querySelectorAll('.pe-type-panel');
     983    let handmatig = false;   // heeft de gebruiker het type zelf aangeklikt?
    974984
    975985    function applyType(tt) {
     
    989999    seg.addEventListener('click', (e) => {
    9901000      const btn = e.target.closest('.pe-typeseg-btn');
    991       if (btn) applyType(btn.dataset.type);
     1001      if (!btn) return;
     1002      handmatig = true;          // jouw klik wint vanaf nu van de afleiding
     1003      applyType(btn.dataset.type);
    9921004    });
    9931005    applyType(typeInput.value || 'post');
     1006
     1007    // ── Het type volgt de muziek (shaer-cyg) ──────────────────────
     1008    //
     1009    // Robins regel: de post neemt de soort van zijn muziek over als hij precies
     1010    // EEN muzikale eenheid bevat. Dus zodra je een playlist invoegt verspringt
     1011    // de balk mee, en zie je wat je aan het maken bent in plaats van het zelf te
     1012    // moeten bijhouden.
     1013    //
     1014    // TWEE DINGEN DIE HIJ MET RUST LAAT. Klik je zelf een type aan, dan wint die
     1015    // keuze -- daarna wordt er niets meer voor je omgezet. En Foto en Video zijn
     1016    // een bewuste andere keuze over dezelfde post, dus die overschrijft hij
     1017    // nooit, ook niet als er muziek in staat.
     1018    //
     1019    // Bij het OPENEN van een post gebeurt er niets: de eerste afleiding wordt
     1020    // alleen als ijkpunt onthouden. Anders zou een oude post van type veranderen
     1021    // door hem te bekijken.
     1022    const VOLGBAAR = new Set(['post', 'album', 'playlist', 'audio']);
     1023    const kindVan = new Map();
     1024    let vorigeAfleiding = null;
     1025
     1026    const soortenGeladen = fetch('/admin/playlists/api/list', { credentials: 'same-origin' })
     1027      .then((r) => r.json())
     1028      .then((j) => {
     1029        if (j && j.ok && Array.isArray(j.playlists)) {
     1030          for (const p of j.playlists) kindVan.set(p.id, p.kind === 'playlist' ? 'playlist' : 'album');
     1031        }
     1032      })
     1033      // Zonder de soorten leidt de regel niets af (elke playlist is dan
     1034      // 'onbekend'), en dat is beter dan een gok die als keuze oogt.
     1035      .catch(() => {})
     1036      .then(() => { vorigeAfleiding = afleidenNu(); });
     1037
     1038    function afleidenNu() {
     1039      // Precies de tekst die straks wordt opgeslagen: chips terug naar
     1040      // shortcodes. Zo leidt de editor af uit wat de server ook zal zien.
     1041      const clone = editor.cloneNode(true);
     1042      serializeChips(clone);
     1043      const r = afleidenUitInsluitingen(clone.innerHTML, (id) => kindVan.get(id) || null);
     1044      return r ? r.type : null;
     1045    }
     1046
     1047    volgMuziek = async () => {
     1048      await soortenGeladen;
     1049      const nu = afleidenNu();
     1050      if (nu === vorigeAfleiding) return;    // de muziek is niet van soort veranderd
     1051      vorigeAfleiding = nu;
     1052      if (handmatig || !nu) return;
     1053      if (!VOLGBAAR.has(typeInput.value)) return;
     1054      applyType(nu);
     1055    };
     1056
     1057    // Ook getypte of geplakte shortcodes tellen, niet alleen de knoppen.
     1058    let tik = null;
     1059    editor.addEventListener('input', () => {
     1060      clearTimeout(tik);
     1061      tik = setTimeout(volgMuziek, 300);
     1062    });
    9941063
    9951064    // Video URL → [[embed:url]] chip
Note: See TracChangeset for help on using the changeset viewer.