Conflit avec le datepicker du core
Je viens de tomber sur un bug en utilisant le plugin étiquettes lors de l'affichage du datepicker du core dans l'espace public.
L'erreur générée est la suivante :
Uncaught TypeError: "contains" is read-only
extend jQuery
DateArray http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul line 133 > injectedScript:86
Datepicker http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul line 133 > injectedScript:102
datepickerPlugin http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul line 133 > injectedScript:1657
jQuery 2
datepickerPlugin http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul line 133 > injectedScript:1639
date_picker_enable_on_this http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul:391
date_picker_init http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul:412
jQuery 2
date_picker_init http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul:411
<anonymous> http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul:441
jQuery 6
ajax http://localhost/egalite/prive/javascript/ajaxCallback.js?1674742643:134
getScript http://localhost/egalite/prive/javascript/ajaxCallback.js?1674742643:178
<anonymous> http://localhost/egalite/spip.php?page=editer_evenement&var_mode=recalcul:439
jQuery 13
jquery.js:319:6
Après recherche, je découvre que ça vient du fait que le plugin étiquettes déclare les propriétés/méthodes contains
& remove
sur l'objet Array depuis af5059ec
Or, le datepicker du core déclare aussi ces propriétés ici https://git.spip.net/spip/spip/src/branch/master/prive/formulaires/dateur/bootstrap-datepicker.js#L48
De ce que je peux lire ici https://stackoverflow.com/questions/38961414/object-defineproperty-or-prototype & surtout par là https://github.com/emberjs/ember.js/issues/19289 + https://github.com/emberjs/ember.js/pull/19356/files la modification suivante devrait faire le job, testée de mon côté elle règle le problème cé datepicker et ça ne semble pas casser étiquettes.
// Nouvelle méthode pour les tableaux
// Retourne la première occurence correspondant, sinon false
Object.defineProperty(Array.prototype, 'contains', {
configurable: true,
enumerable: false,
writable: true,
value: function (ele) {
for (var i = 0; i < this.length; i++) {
if (this[i] == ele) {
return true;
}
}
return false;
},
});
// Supprime un élément d'un tableau
// qu'il y soit une ou plusieurs fois
Object.defineProperty(Array.prototype, 'remove', {
configurable: true,
enumerable: false,
writable: true,
value: function (ele) {
var arr = new Array();
var count = 0;
for (var i = 0; i < this.length; i++) {
if (this[i] != ele) {
arr[count] = this[i];
count++;
}
}
return arr;
},
});
Peut-être serait-il plus sage que étiquettes utilise des méthodes internes pour ça, ainsi on éviterait des conflits de ce style.