Development #16658
Les formulaires chargés en popup ne fonctionnent pas bien si ils dépendend de librairies JS chargées dans le <head/> (ou en fait n'importe où en dehors du contenu de <form/>
0%
Description
En effet jQuery n’interprète les balises script qu'une fois celles-ci insérées dans le document principal.
Fichiers
Révisions associées
Historique
Mis à jour par Benjamin Dauvergne il y a presque 7 ans
- Fichier 0001-gadjo.js-load-script-tag-in-displayPopup-fixes-16658.patch 0001-gadjo.js-load-script-tag-in-displayPopup-fixes-16658.patch ajouté
- Patch proposed changé de Non à Oui
Problème visible sur le CUT où on utilise boostrap datetimepicker dans la vue d'édition des utilisateurs Authentic. J'ai fait un premier fix qui a été d'ajouter une balise {{ media.js }}
dans mon <form/>
mais c'est plus propre ainsi je trouve.
Mis à jour par Benjamin Dauvergne il y a presque 7 ans
- Patch proposed changé de Oui à Non
Ça ne suffit pas, il faut attendre que les scripts soient tous chargés avec des deferred :/
Mis à jour par Benjamin Dauvergne il y a presque 7 ans
- Fichier 0001-gadjo.js-load-script-tag-in-displayPopup-fixes-16658.patch 0001-gadjo.js-load-script-tag-in-displayPopup-fixes-16658.patch ajouté
- Patch proposed changé de Non à Oui
Patch qui fonctionne, j'ajoute un timeout entre la fin du chargement de tous les scripts et la création du dialogue, sinon l'exécution des scripts chargés n'est pas effective. Aussi je vérifie si les scripts n'ont pas déjà été chargés par une balise <script/>
avec le même attribut src
.
Mis à jour par Frédéric Péters il y a presque 7 ans
.git/rebase-apply/patch:80: trailing whitespace. close: function (ev, ui) { .git/rebase-apply/patch:81: trailing whitespace. $(this).dialog('destroy');
(j'imagine que les espaces étaient déjà là mais comme les lignes changent, c'est l'occasion de corriger ça)
Ok avec ajout de quelques commentaires, genre :
+ /* load additional scripts from popup */ var $script = $html.filter('script[src]'); var loading = []; for (var i = 0; i < $script.length; i++) {
+ /* add millisecond timeout to let additional scripts load */ $.when(loading, deferred_timeout(1)).always(function () {
Mis à jour par Benjamin Dauvergne il y a presque 7 ans
Modifications appliquées:
diff --git a/gadjo/static/js/gadjo.js b/gadjo/static/js/gadjo.js index 6206f88..fda019c 100644 --- a/gadjo/static/js/gadjo.js +++ b/gadjo/static/js/gadjo.js @@ -114,6 +114,7 @@ var gadjo_js = gadjo_js || {}; var html = html; } var $html = $(html); + /* load additional scripts from popup */ var $script = $html.filter('script[src]'); var loading = []; for (var i = 0; i < $script.length; i++) { @@ -133,7 +134,8 @@ var gadjo_js = gadjo_js || {}; success: function () {}, })); } - $.when(loading, deferred_timeout(1)).always(function () { + /* add millisecond timeout to let additional scripts load */ + $.when(loading, deferred_timeout(100)).always(function () { /* get content and form (if different) ouf of html */ var $content = $html.find(selector); if ($content.is('form')) { @@ -149,8 +151,8 @@ var gadjo_js = gadjo_js || {}; modal: modal, 'title': title, width: 'auto', - close: function (ev, ui) { - $(this).dialog('destroy'); + close: function (ev, ui) { + $(this).dialog('destroy'); }, });
Je pousse.
Mis à jour par Benjamin Dauvergne il y a presque 7 ans
- Statut changé de Nouveau à Solution déployée
gadjo.js: load script tag in displayPopup (#16658)
It allows forms using JS widgets to be loaded using link with rel="popup".