Changeset 1d76e0e in Klonkt for src/assets/js/mod/reply-editor.js


Ignore:
Timestamp:
08/08/2026 09:51:53 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
bfd9c73
Parents:
df70d8e
git-author:
Robin <roboburr@…> (08/08/2026 09:51:49 PM)
git-committer:
Robin <roboburr@…> (08/08/2026 09:51:53 PM)
Message:

De reply-editor wordt een module (shaer-nh2)

Stond nog als <script src> onderaan partials/reply-editor.ejs -- het patroon dat
shaer-bqr overal weghaalde, maar dit bestand ging niet mee omdat die migratie
over INLINE scripts ging en dit er een met src is.

Bij een volledige laadbeurt ging het goed: injectCspNonce zet er een nonce op.
Bij een htmx-navigatie draagt de partial de nonce van DAT verzoek, terwijl het
document die van zijn eigen laadbeurt heeft. De CSP is strict-dynamic, dus
alleen die laatste telt en het script draaide niet. Gevolg: geen toolbar, geen
media-drop, geen .re-full -- en op mobiel dus geen fullscreen-compose.

De omzetting was mechanisch, want de opzet was al goed: init(form) had al een
__re-vlag PER FORMULIER. Na een htmx-wissel zijn de formulieren nieuw, dus
geen vlag, dus opnieuw opgewaardeerd. Alleen de IIFE, de window-vlag en de
DOMContentLoaded eromheen konden weg; init(form) heet nu initForm om plaats te
maken voor de geexporteerde init().

pageJs erbij op de drie routes die de editor tonen: Berichten, een post met
reacties, en authorize-interaction.

EN DIT IS DE VOORWAARDE VOOR HET SAMENVOEGEN. Robin wil een herbruikbaar
editor-component; een los script kan niet importeren uit mod/lib.js, een module
wel. Dit is dus stap nul van die samenvoeging en niet alleen een bugfix.

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

File:
1 moved

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/reply-editor.js

    rdf70d8e r1d76e0e  
     1// Rijke reply-editor -- MODULE sinds shaer-nh2.
     2//
     3// Stond als <script src> onderaan partials/reply-editor.ejs. Bij een volledige
     4// laadbeurt ging dat goed (injectCspNonce zet er een nonce op), maar bij een
     5// htmx-navigatie draagt de partial de nonce van DAT verzoek terwijl het
     6// document die van zijn eigen laadbeurt heeft. De CSP is strict-dynamic, dus
     7// alleen die laatste telt -- en het script draaide niet. Gevolg: geen toolbar,
     8// geen .re-full, en op mobiel dus geen fullscreen-compose.
     9//
     10// Als module wordt hij door de bootstrap in de shell geladen, die WEL de juiste
     11// nonce heeft. Dat is bovendien de voorwaarde om straks code te DELEN met de
     12// posteditor: een los script kan niet importeren uit mod/lib.js.
     13
    114// Rich reply editor — upgrades every form[data-re] (partials/reply-editor.ejs)
    215// from a plain textarea to a contenteditable with a small toolbar and, on
     
    518// before. On submit: `content` = editor HTML (server sanitizes), `text` =
    619// plain-text fallback.
    7 (function () {
    8   'use strict';
    9   if (window.__replyEditorInit) return;
    10   window.__replyEditorInit = true;
    1120
    1221  var MOBILE = '(max-width: 700px)';
    1322
    14   function init(form) {
     23function initForm(form) {
    1524    if (form.__re) return;
    1625    form.__re = true;
     
    206215  }
    207216
    208   function initAll() {
    209     document.querySelectorAll('form[data-re]').forEach(init);
    210   }
    211   if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initAll);
    212   else initAll();
    213 })();
     217/**
     218 * De bootstrap roept dit aan bij elke paginawissel waarop deze module actief
     219 * is. Opnieuw scannen is veilig: init(form) heeft een eigen `__re`-vlag per
     220 * FORMULIER, en na een htmx-wissel zijn de formulieren nieuw -- dus geen vlag,
     221 * dus opnieuw opgewaardeerd. Precies wat je wilt.
     222 */
     223export function init() {
     224  document.querySelectorAll('form[data-re]').forEach(initForm);
     225}
Note: See TracChangeset for help on using the changeset viewer.