Valider 45077f23 rédigé par marcimat's avatar marcimat
Parcourir les fichiers

Ajouter le paramètre 'action' sur les posts faits par Flow

Ajout d'un moyen d'enlever les fichiers déjà présents, directement en JS : ça évite de recharger le formulaire.
Pour cela, on remplace le bouton prévu pour en JS.
parent 3ae04e89
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+56 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -61,6 +61,21 @@ class Bigup {
	**/
	private $token_expiration = 3600 * 24;

	/**
	 * Nom d'une action demandée
	 *
	 * Si pas de précision => gestion par Flow
	 * 
	 * @var string
	**/
	private $action = '';

	/**
	 * Hash d'un fichier (en cas de suppression demandée)
	 * @var string
	**/
	private $hash_fichier = '';

	/**
	 * Nom du répertoire, dans _DIR_TMP, qui va stocker les fichiers et morceaux de fichiers
	 * @var string */
@@ -96,9 +111,11 @@ class Bigup {
	 * Retrouve les paramètres pertinents pour gérer le test ou la réception de fichiers.
	**/
	public function recuperer_parametres() {
		$this->action          = _request('bigup_action'); 
		$this->token           = _request('bigup_token');
		$this->formulaire      = _request('formulaire_action');
		$this->formulaire_args = _request('formulaire_action_args');
		$this->hash_fichier    = _request('hash');
		$this->identifier_formulaire();
	}

@@ -106,17 +123,54 @@ class Bigup {
	 * Répondre
	 *
	 * Envoie un statut HTTP de réponse et quitte, en fonction de ce qui était demandé,
	 * soit tester un morceau de fichier, soit réceptionner un morceau de fichier.
	 *
	 * - soit tester un morceau de fichier,
	 * - soit réceptionner un morceau de fichier,
	 * - soit effacer un fichier
	 *
	 * Si les hash ne correspondaient pas, le programme quitte évidemment.
	**/
	public function repondre() {
		if (!$this->verifier_token()) {
			return $this->send(415);
			return $this->send(403);
		}

		$this->calculer_chemin_repertoires();

		if ($this->action) {
			switch ($this->action) {
				case "effacer":
					return $this->repondre_effacer();
					break;
				default:
					return $this->send(403);
					break;
			}
		}

		return $this->repondre_flow();
	}

	/**
	 * Répondre le cas de suppression d'un fichier
	 *
	 * L'identifiant de fichier est le md5 du chemin de stockage.
	**/
	public function repondre_effacer() {
		if (!$this->hash_fichier) {
			return $this->send(404);
		}
		if (!$this->enlever_fichier($this->hash_fichier)) {
			return $this->send(404);
		}
		return $this->send(201);
	}


	/**
	 * Répondre le cas de réception ou test de morceau de fichier
	**/
	public function repondre_flow() {
		include_spip('inc/Bigup/Flow');
		$flow = new Flow();
		$flow->definir_repertoire('parts', $this->dir_parts);
+85 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -40,7 +40,10 @@ $.fn.bigup = function() {
			fileParameterName: name,
			testChunks: true,
			maxFiles: (multiple ? 0 : 1), // TODO: gérer un nombre de fichiers maxi
			simultaneousUploads: 2, // 3 par défaut
			permanentErrors : [403, 404, 415, 500, 501], // ajout de 403 à la liste par défaut.
			query: {
				action: "bigup",
				bigup_token: token,
				formulaire_action: formulaire_action,
				formulaire_action_args: formulaire_action_args,
@@ -54,6 +57,10 @@ $.fn.bigup = function() {
			return false;
		}

		// S'il y a déjà des fichiers en attente, remplacer leurs boutons "Enlever"
		// par un équivalent en JS, ce qui évite de tout recharger le formulaire pour ça.
		$form.bigup_remplacer_boutons_enlever(name);

		// Trouver une zone où déposer les fichiers dans le HTML existant
		var $zone = $form.find(".dropfile_" + name);

@@ -121,6 +128,32 @@ $.fn.bigup = function() {
	});
}

/**
 * Remplacer les boutons "Enlever" sur les fichiers déjà présents
 * dans le formulaire (listés au dessus du champ).
 *
 * On remplace par un équivalent qui fera la chose en pur JS + ajax
 * @param string name Nom du champ (name) concerné.
 */
$.fn.bigup_remplacer_boutons_enlever = function(name) {
	var t_enlever = "<:bigup:bouton_enlever|texte_script:>";

	// Trouver les fichiers s'il y en a
	var $fichiers = $(this).find(".fichiers_" + name + " .fichier");
	$fichiers.each(function(){
		$(this).find("button[name=bigup_enlever_fichier]").each(function(){
			var hash = $(this).val();
			var js = "$.bigup_enlever_fichier(this, '" + name + "', '" + hash + "'); return true;";
			var inserer = '<span class="bigup-btn btn btn-default" onClick="' + js + '">' + t_enlever + '</span>';
			var $actions = $(this).parent();
			$(this).remove();
			$actions.append(inserer);
		});
	});
	return this;
}


/**
 * Ajoute le fichier transmis dans la liste des fichiers au dessus
 * de la zone de dépot
@@ -203,11 +236,18 @@ $.bigup_isValidFile = function(file, acceptedFiles) {
 */
$.bigup_presenter_erreur = function(file, message) {
	var $zone = file.zone;
	$zone.addClass('erreur');
	$zone.find('.infos').append("<span class='message_erreur'>" + message + "</span>");
	$zone.bigup_presenter_erreur(message);
	return true;
}

/**
 * Ajoute une erreur sur la description d'un fichier
 */
$.fn.bigup_presenter_erreur = function(message) {
	$(this).addClass('erreur').find('.infos').append("<span class='message_erreur'>" + message + "</span>");
	return this;
}

/**
 * Annuler le transfert d'un fichier déposé qui se téléverse
 */
@@ -220,6 +260,49 @@ $.bigup_annuler_transfert = function(me) {
	});
}

/**
 * Enlève le fichier du serveur et sur la liste des fichiers déjà téléversés
 * @param object me
 *     L'élément qui a cliqué
 * @param string name
 *     Le name de l'input file
 * @param string hash
 *     Le hash du fichier sur le serveur
 */
$.bigup_enlever_fichier = function(me, name, hash) {
	var $fichier = $(me).parents('.fichier');
	var $form = $fichier.parents('form');
	var $input = $form.find('input.bigup[name=' + name + ']');
	if (!$input.length) {
		var $input = $form.find('input.bigup[name="' + name + '[]"]');
	}

	// trouver les paramètres ciblant le formulaire
	var token = $input.data('token');
	var target = $form.attr('action');
	var formulaire_action = $form.find('input[name=formulaire_action]').val();
	var formulaire_action_args = $form.find('input[name=formulaire_action_args]').val();

	$.post(target, {
		action: "bigup",
		formulaire_action: formulaire_action,
		formulaire_action_args: formulaire_action_args,
		bigup_token: token,
		bigup_action: 'effacer',
		hash: hash,
	})
	.done(function() {
		$fichier.animateRemove(function(){
			$(this).remove();
		});
	})
	.fail(function() {
		$fichier.bigup_presenter_erreur("Un problème est survenu…");
	});
}



/**
 * Ajoute une balise progress dans le contenu, en douceur
 */
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -7,6 +7,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(

	// B
	'bigup_titre' => 'Big Upload',
	'bouton_enlever' => 'Enlever',

	// C
	'cfg_charger_public' => 'Script dans l’espace public',
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -9,7 +9,7 @@
			<button class='submit' type='submit'
				name='bigup_enlever_fichier' value="#IDENTIFIANT"
				onclick="jQuery(this).parents('form').find('input,textarea,select').filter('[required]').prop('required', false); return true;">
				Enlever
				<:bigup:bouton_enlever:>
			</button>
		</div>
		<div class='description'>