Browse Source

fix: Ajout d’une méthode `buildFormData()` qui supplante `getFormData()`

Cette fonction retourne un objet `FormData` plutôt qu’un tableau d’une part,
et d’autre part, elle fonctionne mieux lorsque le name accepte plusieurs entrées
tel que `name="items[]"`.

Cela oblige néanmoins à réécrire les scripts qui utilisaient la sortie de `getFormData()`
avec les méthodes natives de `FormData` tel que `.set()`, `.append()` ou `.delete()`
d’une part, et aussi de transmettre l’option `processData: false,` à jQuery.ajax

Refs: #4861
(cherry picked from commit bb20c8df11)
2.1
Matthieu Marcillaud 3 months ago
parent
commit
a503a7f8e4
  1. 81
      javascript/bigup.documents_edit.js
  2. 62
      javascript/bigup.js

81
javascript/bigup.documents_edit.js

@ -9,42 +9,57 @@ function formulaires_documents_edit_avec_bigup () {
.not('.bigup_document_edit')
.addClass('bigup_document_edit')
.on('bigup.fileSuccess', function(event, file, description) {
var bigup = file.bigup;
var input = file.emplacement;
const bigup = file.bigup;
const input = file.emplacement;
var data = $.extend(bigup.getFormData(), {
joindre_upload: true,
joindre_zip: true, // les zips sont conservés zippés systématiquement.
formulaire_action_verifier_json: true,
bigup_reinjecter_uniquement: [description.bigup.identifiant],
});
const data = bigup.buildFormData();
data.set('joindre_upload', true);
data.set('joindre_zip', true);
data.set('formulaire_action_verifier_json', true);
data.set('bigup_reinjecter_uniquement', [description.bigup.identifiant]);
// verifier les champs
$.post(bigup.target, data, null, 'json')
.done(function(erreurs) {
var erreur = erreurs[bigup.name] || erreurs.message_erreur;
if (erreur) {
bigup.presenter_erreur(input, erreur);
} else {
delete data.formulaire_action_verifier_json;
// Faire le traitement prévu, supposant qu'il n'y aura pas d'erreur...
var conteneur = bigup.form.parents('.formulaire_editer_document');
conteneur.animateLoading();
// Faire le traitement prévu, supposant qu'il n'y aura pas d'erreur...
$.post(bigup.target, data)
.done(function(html) {
bigup.presenter_succes(input, _T('bigup:succes_fichier_envoye'));
bigup.form.parents('.formulaire_spip').parent().html(html);
})
.fail(function(data) {
conteneur.endLoading();
bigup.presenter_erreur(input, _T('bigup:erreur_probleme_survenu'));
});
}
})
.fail(function(data) {
bigup.presenter_erreur(input, _T('bigup:erreur_probleme_survenu'));
});
$.ajax({
type: "POST",
url: bigup.target,
data: data,
processData: false,
contentType: false,
cache: false,
dataType: 'json',
})
.done(function(erreurs) {
var erreur = erreurs[bigup.name] || erreurs.message_erreur;
if (erreur) {
bigup.presenter_erreur(input, erreur);
} else {
data.delete('formulaire_action_verifier_json');
// Faire le traitement prévu, supposant qu'il n'y aura pas d'erreur...
var conteneur = bigup.form.parents('.formulaire_editer_document');
conteneur.animateLoading();
// Faire le traitement prévu, supposant qu'il n'y aura pas d'erreur...
$.ajax({
type: "POST",
url: bigup.target,
data: data,
processData: false,
contentType: false,
cache: false,
})
.done(function(html) {
bigup.presenter_succes(input, _T('bigup:succes_fichier_envoye'));
bigup.form.parents('.formulaire_spip').parent().html(html);
})
.fail(function(data) {
conteneur.endLoading();
bigup.presenter_erreur(input, _T('bigup:erreur_probleme_survenu'));
});
}
})
.fail(function(data) {
bigup.presenter_erreur(input, _T('bigup:erreur_probleme_survenu'));
});
});
}
jQuery(function($) {

62
javascript/bigup.js

@ -362,7 +362,7 @@ Bigup.prototype = {
// console.info("success", file, message, chunk);
var desc = "";
try {
desc = JSON.parse(message);
desc = JSON.parse(message);
// enlever le bouton annuler
file.emplacement.find(".cancel").fadeOut("normal", function(){
$(this).remove();
@ -377,7 +377,7 @@ Bigup.prototype = {
} catch(e) {
desc = _T('bigup:erreur_de_transfert')+" : "+e;
me.progress.retirer(file.emplacement.find("progress"));
me.presenter_erreur(file.emplacement, desc);
me.presenter_erreur(file.emplacement, desc);
}
});
@ -410,7 +410,7 @@ Bigup.prototype = {
data = JSON.parse(message);
if (typeof data.error !== 'undefined') {
message_erreur = data.error;
}
}
} catch(e){
message_erreur += " : "+e;
}
@ -817,9 +817,17 @@ Bigup.prototype = {
*
* On ne récupère pas les type file, ni sumbit.
*
* @note
* Dans certains cas (en présence de `name` avec des champs mulitples comme `name="items[]"`),
* cette fonction ne retourne pas lensemble des valeurs attendues
* @deprecated Use buildFormData() instead
* @return object Couples [nom du champ => valeur]
*/
getFormData: function () {
console.info(
'Method `bigup.getFormData` is deprecated and will be removed in future version of Bigup.',
'Please use `bigup.buildFormData` instead and adapt your code (see #4861)'
);
var inputName, inputType;
var data = {};
@ -845,6 +853,54 @@ Bigup.prototype = {
return data;
},
/**
* Récupère les champs que le formulaire poste habituellement
*
* Peut être utile pour faire un hit ajax, sans modifier le formulaire.
* Code en partie repris de dropzone.js
*
* On ne récupère pas les type file, ni sumbit.
*
* @return FormData object
*/
buildFormData: function() {
const formData = new FormData();
const form = this.form[0];
for (let input of form.querySelectorAll(
"input, textarea, select, button"
)) {
let inputName = input.getAttribute("name");
let inputType = input.getAttribute("type");
if (inputType) inputType = inputType.toLowerCase();
// If the input doesn't have a name, we can't use it.
if (typeof inputName === "undefined" || inputName === null) continue;
if (input.tagName === "SELECT" && input.hasAttribute("multiple")) {
// Possibly multiple values
for (let option of input.options) {
if (option.selected) {
formData.append(inputName, option.value);
}
}
} else if (
!inputType ||
(
inputType !== "checkbox"
&& inputType !== "radio"
&& inputType !== "file"
&& inputType !== "submit"
) ||
input.checked
) {
formData.append(inputName, input.value);
}
}
return formData;
},
/**
* Assign one or more DOM nodes as a drop extended target.

Loading…
Cancel
Save