source: Klonkt/src/assets/js/mod/lib.js@ 52fc278

main
Last change on this file since 52fc278 was 54ee51c, checked in by roboburr <roboburr@…>, 5 weeks ago

De profielkop, de track-editor en het data-kanaal (shaer-bqr, stap 3c)

PROFIELKOP naar mod/chrome.js: chrome.ejs neemt die partial op, dus hij zit in
de OOB-swap en kwam bij elke navigatie opnieuw binnen. Hoort bij de chrome, niet
bij een pagina.

TRACK-EDITOR (475 regels, geen interpolatie) naar een eigen module. admin-audio
neemt hem op, dus die route vraagt om 'admin-audio track-editor' -- een pagina
mag meer dan een module willen.

HET DATA-KANAAL, want de rest heeft het nodig. Een module is een statisch
bestand, dus er kan geen EJS in; alles wat een script van de server nodig heeft
gaat via partials/page-data.ejs en wordt gelezen met pageData() uit mod/lib.js.

Dat is een script-element en toch geen CSP-probleem: een script met een ander
type dan JavaScript wordt niet uitgevoerd en niet opgehaald, dus script-src heeft
er niets over te zeggen. Het werkt daarmee ook in inhoud die via htmx binnenkomt.

Twee dingen die daar misgaan als je ze niet doet, en allebei nagemeten:

De kleiner-dan wordt ontsnapt. Zonder dat sluit een sluitende script-tag IN de
gegevens het blok voortijdig af en staat de rest als HTML op de pagina.
Getoetst met precies zo'n waarde.

pageData() leest ELKE KEER opnieuw en onthoudt niets. Bij een htmx-navigatie
wisselt de inhoud terwijl de module blijft leven, dus een blok dat je bij het
laden vasthoudt is een pagina later verouderd.

Alle templates compileren.

  • Property mode set to 100644
File size: 1.2 KB
Line 
1// Gedeeld gereedschap voor de pagina-modules (shaer-bqr).
2
3/**
4 * De servergegevens van deze pagina.
5 *
6 * Een module is een statisch bestand, dus er kan geen EJS in. Wat het script van
7 * de server nodig heeft -- vertalingen, ids, instellingen -- zet de pagina in
8 * een <script type="application/json"> via partials/page-data.ejs, en dit leest
9 * het terug.
10 *
11 * ELKE KEER OPNIEUW LEZEN en niet eenmalig onthouden: bij een htmx-navigatie
12 * wisselt de inhoud terwijl de module blijft leven, dus een gegevensblok dat je
13 * bij het laden vasthoudt is een pagina later verouderd.
14 *
15 * Nooit een uitzondering: een module die valt over ontbrekende gegevens neemt de
16 * hele pagina mee. Wat er niet is, is een leeg object.
17 */
18export function pageData() {
19 try {
20 var el = document.querySelector('script[type="application/json"][data-page-data]');
21 return el ? (JSON.parse(el.textContent) || {}) : {};
22 } catch (e) {
23 return {};
24 }
25}
26
27/**
28 * Een enkele waarde, met een terugval. Scheelt in elke module hetzelfde
29 * gedoe met ontbrekende sleutels.
30 */
31export function pageValue(key, fallback) {
32 var d = pageData();
33 return (d && Object.prototype.hasOwnProperty.call(d, key)) ? d[key] : fallback;
34}
Note: See TracBrowser for help on using the repository browser.