Hello,
Merci @noodom pour cette solution.
Je pense qu’il y a tout de même un soucis coté core (en design), surtout que c’est la seul page qui utilise la méthode domUtils.DOMparseHTML
contrairement au dashboard qui utilise Element.prototype.html
Il faudrait sans doute ouvrir une issue, pour avoir une réflexion sur ce sujet, et qu’il ne tombe pas aux oubliettes
Toujours est-il que j’avais aussi testé quelques chose sur mon Alpha.
J’ai surtout copié ce que le core fait déja et adapté avec ton code.
Je partage, ca peut peut-être aider :
domUtils.includeJS = function (_filenames, _callback, _idx = 0) {
console.log('>>>>>>>> domUtils.includeJS <<<<<<<<<<')
if (_idx == undefined || _idx === null) _idx = 0
if (typeof _filenames === 'string') {
_filenames = [_filenames];
}
if (_idx >= _filenames.length) {
if (typeof _callback === 'function') {
return _callback()
}
return
}
var script = document.createElement('script')
script.src = _filenames[_idx]
script.type = "text/javascript"
script.setAttribute('injext', '1')
if (domUtils.headInjexted.includes(script.src)) {
// already in the header
domUtils.includeJS(_filenames, _callback, _idx + 1)
} else {
domUtils.headInjexted.push(script.src)
script.onload = function() {
domUtils.includeJS(_filenames, _callback, _idx + 1)
}
document.head.append(script)
}
}
ce code je l’ai direct intégré dans le core core/dom/dom.utils.js
, mais il est peut-être possible de le modifier pour l’intégrer en custom.js …
Aller retour au boulot, mon parquet va pas se poser tout seul
1 « J'aime »
Bien joué je regarderai mais après mes travaux aussi j’ai un muret à gérer dans l’immédiat
Alors, j’ai regardé hier soir et c’est finalement l’équivalent en mode récursif (avec un code plus compact et plus sympa).
Dans mes quelques tests, je retrouve d’ailleurs le même comportement (et le même problème) :
- Si on laisse le code pour n’importe qu’une fois un même fichier d’un même widget, seul le premier équipement correspondant est bien affiché.
- Si on retire le test de doublons, on retrouve alors un affichage correct (malgré une erreur remontée dans certains cas de widgets multiples sur une même page)
Ces retours de tests sont équivalents lorsque la fonction est déclarée au niveau du core ou dans du code spécifique au widget (ou dans les personnalisations avancées) comme ici :
Code en récursif (à privilégier) pour les widgets ou personnalisation avancée
function includeJS (_filenames, _callback, _idx = 0) {
console.log('>>>>>>>> includeJS rec <<<<<<<<<<')
if (_idx == undefined || _idx === null) _idx = 0
if (typeof _filenames === 'string') {
_filenames = [_filenames];
}
if (_idx >= _filenames.length) {
if (typeof _callback === 'function') {
return _callback()
}
return
}
var script = document.createElement('script')
script.src = _filenames[_idx]
script.type = "text/javascript"
script.setAttribute('injext', '1')
/* vérification de non doublon provoque une erreur d'affichage si plusieurs widgets inclus dans une même page
if (domUtils.headInjexted.includes(script.src)) {
// already in the header
console.log('>>>>>>>> already in use ' + _filenames[_idx])
includeJS(_filenames, _callback, _idx + 1)
} else {
*/
console.log('>>>>>>>> include ' + _filenames[_idx])
domUtils.headInjexted.push(script.src)
script.onload = function() {
includeJS(_filenames, _callback, _idx + 1)
}
document.head.append(script)
//}
}
Par contre, je n’ai pas regardé les différences d’appels depuis les designs (dont tu parles), mais j’obtiens les mêmes comportements (ko avec vérification de doublons, ok sinon).
Hello,
Et si on push que lorsque le script est onload ?
console.log('>>>>>>>> include ' + _filenames[_idx])
script.onload = function() {
domUtils.headInjexted.push(script.src)
includeJS(_filenames, _callback, _idx + 1)
}
Hello,
Si on le Push pas, il sera jamais onload
(Réflexion avant le café du matin )
si, le push c’est juste pour le consigner dans une variable, pour ne pas le recharger lors d’un second appel.
le onload se fait après : document.head.append(script)
Ok j’avais pas fait gaffe au append à la fin.
Je testerai mais par contre j’ai l’impression que du coup, on chargera systématiquement le fichier pour chaque widget (comme actuellement avec le if commenté)
Oui si le if est commenté, plus moyen de vérifier si le fichier est déja dans le head.
Ce que je voulais dire c’est que le if sera (quasiment) toujours false avec cette modif et donc on chargera 2 fois le même js (comme avec le if commenté)
Ce qui fonctionne au final (et d’ailleurs la méthode utilisée sur tous les widgets actuels multiplie aussi les includes des fichiers js donc pas de régression sur l’existant ) mais si on pouvait éviter ça serait idéal
tout dépend de l’ordre ou sera chargé les widgets, mais la actuellement a ce que tu constate c’est que si 2 widget charge le même fichier,
- consigne avant tout le nom du fichier (push).
- charge le fichier (onload).
- Le callback qui charge la suite du script.
- le 2ème widget qui utilise le même script, et qui est lancé entre l’étape 1 et 2 du 1er widget :
- vérifie si pas déja chargé
- vu qu’il existe (includes) lance direct le callback, et donc erreur car existe dans la variable mais pas encore chargé.
l’idée étant de consigner dans la variable que quand le fichier est bien onload. Ce qui je te rejoint sur ta remarque équivaut a charger 2 fois le fichier lorsque ce cas ce présente.
Je ne comprends pas grand chose à ce que vous dites mais n’y aurait il pas un moyen de dire au 1er appel que c’est en cours de chargement et seulement à la fin du chargement que c’est ok comme ça le 2eme appel voit que c’est en cours et attend lui aussi la fin du chargement pour continuer ?
C’est justement ce point qui est bloquant, pour arriver a ce résultat c’est le code du core (plan.js) qu’il faudrait modifier, Actuellement sur les design le chargement de chaque éléments semble être asynchrone.
Bon j’ai modifier plan.js sur mon Alpha,
j’arrive a un truc qui semble
- fonctionner a tous les coups
- ordonnée (synch)
- et qui ne charge pas 2x le même fichier
et sans faire de bidouille dans le widget
Je rassemble les infos et je partage, si un kamikaze veut tester sur un design bien fourni en widget
Cool, c’est intéressant, et a l’actualisation du design ? idem ?
J’ai été en MP avec @Furaxworld, et le core JS était activé …
Après désactivation, pas d’erreur sur le design et il semble ne pas avoir de soucis d’affichage.
2 « J'aime »
Merci a mon kamikaze @Furaxworld qui n’hésite pas a faire ce genre d’essais, et sur sa Prod en plus
@noodom , si tu as l’occasion de tester.
Il est sans doute possible de faire plus propre que de retransformer l’object en html pour pouvoir faire passer le contenu dans la fonction Element.prototype.html
du core, mais la s’arrête mes connaissances.
3 « J'aime »
Hello
Je vais regarder et tester pour te faire mon retour.
Tu gardes un include classique dans les widgets du coup, idem pour la visu en Dashboard ?
Cc,
Oui un simple script src est suffisant, pas de setTimeout…