[prive ↪ spip_5566_plainjs] 3 commits

placido/prive | 3 commits

Par placido, le 30 septembre 2024 à 23h52min :

fix : animations pour .formulaire_editer-liens

ref : spip/spip#5566

Modifié
formulaires/editer_liens.html

Détails : fix : animations pour `.formulaire_editer-liens` (9bc064de) · Validations · placido / prive · GitLab

==============================
Par placido, le 30 septembre 2024 à 23h52min :

feat : Méthode de chargement alternative des ressources javascript

ref : spip/spip#5566

Principe : Dissocier le chargement des « libs » et le code d’initialisation

Les ressources externes (libs) sont chargées, au choix :
- via insert_head et concaténées par le compresseur (méthode classique, lorque cela concerne toutes les pages)
- occasionnellement, depuis un squelette via une directive import {fn} from #IMPORT_JS{module_foo}; si compatible (esm)

Les codes d’initialisation :
- [CONCIS] : dans la mesure du possible, on n’y fait que :
*- compléter l’objet de configuration global (anciennement spipConfig)
*- cibler les éléments
*- attacher des écouteurs d’événements
*- lancer l’exécution (et sa persistance via onAjaxLoad) ; de préférence une seule fonctionnalité à la fois
- [GLOBAL] : s’applique sur toutes les pages (repose sur #INSERT_HEAD)
- [AUTOMATIQUE] : insertion automatique du contenu au sein d’une balise <script[type="module"]/> si le chemin du fichier contient javascript/_inits/ (un peu à la manière dont les plugins peuvent présenter une feuille de style dynamique pour l’espace privé style_prive_plugin_foo.html )
- [POLYMORPHE] : fichiers statiques (.js) et dynamiques (.js.html) sont possibles.
- [ORDONNÉ] : on peut choisir dans quel ordre de la file ce code sera chargé en préfixant le nom du fichier d’un numéro (facultatif) qui fait office d’index ex : javascript/_inits/20_popup.js sera inséré (et exécuté) avant javascript/_inits/30_alert.js
- [SURCHARGEABLE] : la logique spipienne d’un plugin pouvant surcharger un fichier d’un plugin qu’il nécessite, demeure (l’index, et l’extension, sont ignorés pour la surcharge)
- [SOUPLE] : un fichier d’initialisation dont le path contient (‹ prive/ ›) ne sera appelé que pour l’espace privé.
En complément, s’il existe, pour la partie publique, un fichier d’initialisation vide (dont le nom correspond à un fichier disponible depuis prive/) alors on charge le contenu de ce dernier (un peu à la manière d’un gabarit vide de formulaire ayant déclaré des saisies)

Les avantages de cette méthode :

  • Un bien meilleur contrôle sur l’enchaînement et l’ordre d’exécution dans la page (?var_mode=debug_js offrant même un contrôle visuel direct).
  • Le bénéfice inhérent à la balise <script[type="module"]/> qui opère de manière différée : plus la peine de s’assurer qu’une lib est bien chargée avant de lancer l’exécution.
  • Simplifie la déclaration des variables de configuration, jusqu’ici déclarées en ligne dans le <head> via #INSERT_HEAD_CSS (ex window.mediabox_settings)
  • Vitesse de déploiement : Pas la peine de déclarer X entrées dans le pipeline insert_head
  • Réemploi possible espace privé <=> partie publique

Quelques exemples (pas si) farfelus rendus possibles :

  • Je suis hyperoptimiste et j’estime que mon tout nouveau site n’a besoin pas besoin de supporter les usages legacy
echo '// neant' > squelettes/javascript/_inits/retrocompat.js
  • Je veux redéfinir le style embarqué des éléments lors d’une animation de chargement (.loading)
touch squelettes/javascript/_inits/15_style_anim.js

Puis dans le fichier :

import { default as spip } from "config.js";
spip.css.animateLoading = 'background-color:red;';

etc…

Ajouté
javascript/_init.js.html
javascript/_init.js_fonctions.php
javascript/_inits/03_prive_config.js.html
javascript/_inits/05_retrocompat.js.html
javascript/_inits/20_ajaxbloc.js
javascript/_inits/30_ajaxform.js
Modifié
squelettes/inclure/head.html

Détails : feat : Méthode de chargement alternative des ressources javascript (2c1cd983) · Validations · placido / prive · GitLab

==============================
Par placido, le 30 septembre 2024 à 23h52min :

change : ajaxCallback.js réécrit en javascript natif

ref : spip/spip#5566

  • Le fichier gère notamment le rechargement des inclures ajaxés, des formulaires et des boutons d’action
  • Il devient un module ESM dont les fonctions utilitaires (onAjaxLoad, parametre_url, …) doivent désormais être appelées via la syntaxe import typique des modules.
  • Le fichier est ventilé en sous-modules pour faciliter lisibilité et maintenabilité, ce qui requiert une étape de compilation ou « build » : (ex : bun run build ou bun run watch depuis le dossier prive/javascript/ajaxCallback.js)
  • Exit les dépendances à jQuery et jquery.form.js
  • Un fichier retrocompat.js est dévolu à assurer une certaine rétro-compatibilité.

Changements notables :

L’objet de configuration global est désormais un module « config.js »

Ce module est accessible pour les scripts non ESM via un « alias » (proxy) depuis window.spipConfig ;

La méthode recommandée pour y accéder depuis un squelette est la suivante

<script type="module">
   import { default as spip } from "config.js";
   console.log(spip);
   spip.ajax_image_searching = "⌛";
</script>

Autres changements :

  • On peut activer le mode verbeux (log) simplement grâce au paramètre d’url?var_mode=debug_js. Des modules tiers peuvent s’appuyer sur ce dernier :
import {log} from "ajaxCallback.js";
log('quelque_chose');
  • Les fonctions d’animations . Pour l’heure, seule animateLoading() est personnalisable via l’objet de config (spip.css.animateLoading)
  • La fonction positionner() implémente désormais scrollIntoView, et l’ajustement de la marge verticale est à personnalisée manuellement via la règle CSS : scroll-margin
  • Les fonctionsjQuery.spip.intercepted.xxx, sont considérées totalement dépréciées, et supprimées.
  • Les fonctions jQuery.uaMatch, et jQuery.browser sont considérées dépréciées, mais demeurent dans le fichier résiduel jquery.browser.js le temps d’opérer la transition avec les fonctions de l’espace privé qui les nécessitent.

chores : ne pas prendre en compte les dossiers node_modules/

Ajouté
javascript/ajaxCallback.min.js
javascript/ajaxCallback/package.json
javascript/ajaxCallback/src/ajaxbloc.js
javascript/ajaxCallback/src/ajaxform.js
javascript/ajaxCallback/src/anim.js
javascript/ajaxCallback/src/cvt_verifier.js
javascript/ajaxCallback/src/history.js
javascript/ajaxCallback/src/log.js
javascript/ajaxCallback/src/main.js
javascript/ajaxCallback/src/reader.js
javascript/ajaxCallback/src/url.js
javascript/config.js.html
javascript/jquery.browser.js
javascript/retrocompat.js
javascript/retrocompat.min.js
squelettes/inclure/importmap.html
squelettes/inclure/importmap_fonctions.php
Modifié
.gitignore
CHANGELOG.md
javascript/ajaxCallback.js

Détails : change : ajaxCallback.js réécrit en javascript natif (c5ce49ff) · Validations · placido / prive · GitLab