From abf13151ecde3c88ae1c667783be6fffade7e079 Mon Sep 17 00:00:00 2001
From: "marcimat@rezo.net" <>
Date: Thu, 19 Jan 2017 16:17:14 +0000
Subject: [PATCH] =?UTF-8?q?Permettre=20d'annuler=20l'ordre=20enregistr?=
 =?UTF-8?q?=C3=A9=20pour=20les=20liens=20sur=20les=20documents.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- une action "desordonner_liens_documents" est ajoutée (un peu sur le même fonctionnement que dissocier_document)
- une action "Réinitialiser l’ordre" est ajouté en fin de liste (visible si un rang_lien au moins est défini)
- les actions affectant l'ensemble des documents en fin de liste sont placées dans une div ".actions-liste"
- les documents déplaçables sont encadrés aussi d'une div (.sortable) essentiellement pour éviter de pouvoir les déplacer au dessus ou au dessous de la pagination ou des actions globales.
---
 .gitattributes                                |   1 +
 action/desordonner_liens_documents.php        | 108 ++++++++++++++++++
 action/dissocier_document.php                 |   2 +-
 lang/medias_fr.php                            |   2 +
 modeles/document_desc.html                    |   2 +-
 paquet.xml                                    |   2 +-
 .../inclure/portfolio-documents.html          |  36 +++++-
 prive/style_prive_plugin_medias.html          |   5 +-
 8 files changed, 149 insertions(+), 9 deletions(-)
 create mode 100644 action/desordonner_liens_documents.php

diff --git a/.gitattributes b/.gitattributes
index 20d27105..5d80e75f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,6 +3,7 @@ action/acceder_document.php -text
 action/ajouter_documents.php -text
 action/changer_mode_document.php -text
 action/copier_local.php -text
+action/desordonner_liens_documents.php -text
 action/dissocier_document.php -text
 action/editer_document.php -text
 action/ordonner_liens_documents.php -text
diff --git a/action/desordonner_liens_documents.php b/action/desordonner_liens_documents.php
new file mode 100644
index 00000000..38b0b0f2
--- /dev/null
+++ b/action/desordonner_liens_documents.php
@@ -0,0 +1,108 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2016                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+/**
+ * Gestion de l'action desordonner_document
+ *
+ * @package SPIP\Medias\Action
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Désordonner des documents
+ *
+ * @param string $arg
+ *     fournit les arguments de la fonction dissocier_document
+ *     sous la forme `$id_objet-$objet-$document-suppr-safe`
+ *
+ *     - 4eme arg : suppr = true, false sinon
+ *     - 5eme arg : safe = true, false sinon
+ *
+ * @return void
+ */
+function action_desordonner_liens_documents_dist($arg = null) {
+	if (is_null($arg)) {
+		$securiser_action = charger_fonction('securiser_action', 'inc');
+		$arg = $securiser_action();
+	}
+
+	$arg = explode('-', $arg);
+	list($id_objet, $objet, $document) = $arg;
+
+	if (
+		$id_objet = intval($id_objet)
+		and autoriser('desordonnerdocuments', $objet, $id_objet)
+	) {
+		desordonner_liens_documents($document, $objet, $id_objet);
+	} else {
+		spip_log("Interdit de désordonner les documents sur : $objet $id_objet", 'spip');
+	}
+}
+
+/**
+ * Désordonner des documents
+ *
+ * @param int|string $document
+ *   id_document a désordonner
+ *   I/image pour dissocier les images en mode Image
+ *   I/document pour dissocier les images en mode document
+ *   D/document pour dissocier les documents non image en mode document
+ * @param string $objet
+ *   objet duquel dissocier
+ * @param  $id_objet
+ *   id_objet duquel dissocier
+ * @return void
+ */
+function desordonner_liens_documents($document, $objet, $id_objet) {
+	include_spip('action/editer_liens');
+	if ($id_document = intval($document)) {
+		desordonner_liens_document($id_document, $objet, $id_objet);
+	} else {
+		list($image, $mode) = explode('/', $document);
+		$image = ($image == 'I');
+		$typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $image ? '' : 'NOT');
+
+		$obj = 'id_objet=' . intval($id_objet) . ' AND objet=' . sql_quote($objet);
+
+		$s = sql_select(
+			'docs.id_document',
+			'spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document',
+			"$obj AND vu='non' AND docs.mode=" . sql_quote($mode) . " AND $typdoc"
+		);
+		while ($t = sql_fetch($s)) {
+			desordonner_liens_document($t['id_document'], $objet, $id_objet);
+		}
+	}
+}
+
+/**
+ * Désordonner un document
+ *
+ * @param int $id_document
+ *   id_document a désordonner
+ * @param string $objet
+ *   objet duquel dissocier
+ * @param  $id_objet
+ *   id_objet duquel dissocier
+ * @return void
+ */
+function desordonner_liens_document($id_document, $objet, $id_objet) {
+	objet_qualifier_liens(
+		array('document' => $id_document),
+		array($objet => $id_objet),
+		array('rang_lien' => 0)
+	);
+}
\ No newline at end of file
diff --git a/action/dissocier_document.php b/action/dissocier_document.php
index 4bf0d842..a2d75425 100644
--- a/action/dissocier_document.php
+++ b/action/dissocier_document.php
@@ -149,7 +149,7 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
  *   I/image pour dissocier les images en mode Image
  *   I/document pour dissocier les images en mode document
  *   D/document pour dissocier les documents non image en mode document
- * @param  $objet
+ * @param string $objet
  *   objet duquel dissocier
  * @param  $id_objet
  *   id_objet duquel dissocier
diff --git a/lang/medias_fr.php b/lang/medias_fr.php
index b07ad001..d7668a16 100644
--- a/lang/medias_fr.php
+++ b/lang/medias_fr.php
@@ -141,6 +141,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'label_paginer_par' => 'Paginer par :',
 	'label_parents' => 'Ce document est lié à',
 	'label_refdoc_joindre' => 'Document numéro',
+	'lien_tout_desordonner' => 'Réinitialiser l’ordre',
+	'lien_tout_desordonner_verif' => 'L’ordre définit pour cette liste de documents sera réinitialisé. Êtes-vous sûr ?',
 	'lien_tout_enlever' => 'Tout enlever',
 	'logo' => 'Logo',
 
diff --git a/modeles/document_desc.html b/modeles/document_desc.html
index 2908ed6e..147b068f 100644
--- a/modeles/document_desc.html
+++ b/modeles/document_desc.html
@@ -77,7 +77,7 @@ Distribue sous licence GPL
 		[(#TOTAL_BOUCLE|=={1}|et{#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET}}|et{#VU|=={non}})[(#BOUTON_ACTION{<:medias:bouton_enlever_supprimer_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT-suppr-safe,#SELF},ajax,<:medias:bouton_enlever_supprimer_document_confirmation:>,'',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]]
 		[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:bouton_enlever_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT--safe,#SELF},ajax,'','',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]]
 		[(#AUTORISER{modifier,document,#ID_DOCUMENT}|oui)
-			<span class="deplacer-document"><img src='#CHEMIN_IMAGE{deplacer-16.png}' width='16' height='16' alt='<:medias:ordonner_ce_document|attribut_html:>' /></span>
+			<span class="deplacer-document" data-rang="#RANG_LIEN"><img src='#CHEMIN_IMAGE{deplacer-16.png}' width='16' height='16' alt='<:medias:ordonner_ce_document|attribut_html:>' title='<:medias:ordonner_ce_document|attribut_html:>' /></span>
 			<a href="#URL_ECRIRE{document_edit,id_document=#ID_DOCUMENT}" target="_blank" class="editbox" tabindex="0" role="button"><:medias:bouton_modifier_document:></a>
 		]<//B_compte>
 		[(#PIPELINE{document_desc_actions,#ARRAY{args,#ARRAY{id_document,#ID_DOCUMENT,position,document_desc,objet,#OBJET,id_objet,#ID_OBJET},data,''}})]
diff --git a/paquet.xml b/paquet.xml
index e0b25372..f0409279 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,7 +1,7 @@
 <paquet
 	prefix="medias"
 	categorie="multimedia"
-	version="2.17.1"
+	version="2.17.2"
 	etat="stable"
 	compatibilite="[3.2.0-dev;]"
 	logo="prive/themes/spip/images/portfolio-32.png"
diff --git a/prive/squelettes/inclure/portfolio-documents.html b/prive/squelettes/inclure/portfolio-documents.html
index f565e0c0..1dcfc363 100644
--- a/prive/squelettes/inclure/portfolio-documents.html
+++ b/prive/squelettes/inclure/portfolio-documents.html
@@ -14,11 +14,18 @@
 <h3><span class="image_loading"></span><:medias:info_illustrations:></h3>
 <div class="liste_items documents" id="illustrations#ENV{id_unique}">
 [<p class="pagination">(#PAGINATION{prive})</p>]
+<div class="sortable">
 <BOUCLE_illustrations(DOCUMENTS documents_liens types_documents){inclus=image}{mode=image}{id_objet}{objet}{par rang_lien, num titre, date,id_document}{pagination 50}{statut?}>
 	#MODELE{document_desc,id_document,id_objet,objet}
 </BOUCLE_illustrations>
+</div>
 [<p class="pagination">(#PAGINATION{prive})</p>]
-[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/image,#SELF|ancre_url{illustrations}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]]
+[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})
+	<div class="actions-liste">
+	[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/image,#SELF|ancre_url{illustrations}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]
+	[(#BOUTON_ACTION{<:medias:lien_tout_desordonner:>,#URL_ACTION_AUTEUR{desordonner_liens_documents,#ID_OBJET-#OBJET-I/image,#SELF|ancre_url{illustrations}},'ajax tout_desordonner',<:medias:lien_tout_desordonner_verif:>})]
+	</div>
+]
 </div>
 #SET{nbdocs,#GET{nbdocs}|plus{#GRAND_TOTAL}}
 </B_illustrations>
@@ -28,11 +35,18 @@
 <h3><:medias:info_portfolio:></h3>
 <div class="liste_items documents" id="portfolio#ENV{id_unique}">
 [<p class="pagination">(#PAGINATION{prive})</p>]
+<div class="sortable">
 <BOUCLE_portfolio(DOCUMENTS documents_liens types_documents){inclus=image}{mode=document}{id_objet}{objet}{par rang_lien, num titre, date,id_document}{pagination 50}{statut?}>
 	#MODELE{document_desc,id_document,id_objet,objet}
 </BOUCLE_portfolio>
+</div>
 [<p class="pagination">(#PAGINATION{prive})</p>]
-[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/document,#SELF|ancre_url{portfolio}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]]
+[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})
+	<div class="actions-liste">
+		[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/document,#SELF|ancre_url{portfolio}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]
+		[(#BOUTON_ACTION{<:medias:lien_tout_desordonner:>,#URL_ACTION_AUTEUR{desordonner_liens_documents,#ID_OBJET-#OBJET-I/document,#SELF|ancre_url{illustrations}},'ajax tout_desordonner',<:medias:lien_tout_desordonner_verif:>})]
+	</div>
+]
 </div>
 #SET{nbdocs,#GET{nbdocs}|plus{#GRAND_TOTAL}}
 </B_portfolio>
@@ -42,11 +56,18 @@
 <h3><:medias:info_documents:></h3>
 <div class="liste_items documents" id="documents#ENV{id_unique}">
 [<p class="pagination">(#PAGINATION{prive})</p>]
+<div class="sortable">
 <BOUCLE_documents(DOCUMENTS documents_liens types_documents){inclus!=image}{mode!=vignette}{id_objet}{objet}{par rang_lien, num titre, date,id_document}{pagination 50}{statut?}>
 	#MODELE{document_desc,id_document,id_objet,objet}
 </BOUCLE_documents>
+</div>
 [<p class="pagination">(#PAGINATION{prive})</p>]
-[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-D/document,#SELF|ancre_url{documents}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]]
+[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})
+	<div class="actions-liste">
+		[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-D/document,#SELF|ancre_url{documents}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]
+		[(#BOUTON_ACTION{<:medias:lien_tout_desordonner:>,#URL_ACTION_AUTEUR{desordonner_liens_documents,#ID_OBJET-#OBJET-D/document,#SELF|ancre_url{documents}},'ajax tout_desordonner',<:medias:lien_tout_desordonner_verif:>})]
+	</div>
+]
 </div>
 #SET{nbdocs,#GET{nbdocs}|plus{#GRAND_TOTAL}}
 </B_documents>
@@ -137,7 +158,7 @@ function choix_affichages_documents() {
 /* Gestion du tri des listes de documents et de leur enregistrement */
 function ordonner_listes_documents() {
 	if ($.fn.sortable) {
-		$("#illustrations#ENV{id_unique}, #portfolio#ENV{id_unique}, #documents#ENV{id_unique}").each(function () {
+		$("#illustrations#ENV{id_unique}, #portfolio#ENV{id_unique}, #documents#ENV{id_unique}").find('> .sortable').each(function () {
 			// détruire / recréer le sortable à chaque appel ajax
 			if ($(this).has('.ui-sortable').length) {
 				$(this).sortable('destroy');
@@ -203,10 +224,17 @@ function ordonner_listes_documents() {
 							item.css({backgroundColor: couleur_succes}).animate({backgroundColor: couleur_origine}, 'normal', function(){
 								item.css({backgroundColor: ''});
 							});
+							items.parent().find('.tout_desordonner').show();
 						}
 					});
 				}
 			});
+			// bouton "désordonner"
+			if ($(this).parent().find('.deplacer-document[data-rang!=0]').length) {
+				$(this).parent().find('.tout_desordonner').show();
+			} else {
+				$(this).parent().find('.tout_desordonner').hide();
+			}
 		});
 	}
 }
diff --git a/prive/style_prive_plugin_medias.html b/prive/style_prive_plugin_medias.html
index d98e492e..838837c0 100644
--- a/prive/style_prive_plugin_medias.html
+++ b/prive/style_prive_plugin_medias.html
@@ -194,7 +194,8 @@ p.actions {clear:both;}
 .portfolios .item .titre > .sanstitre,
 .portfolios .item .titre > .sanstitre + .fichier {opacity:0.4;}
 
-.portfolios .tout_supprimer { clear:both; margin-top:.6925em; display:block; }
+.portfolios .actions-liste { clear:both; margin-top:.6925em; display:block; }
+.portfolios .actions-liste > * {display:inline; }
 .portfolios .tout_supprimer span {display:block; text-align:#GET{right};}
 
 .item.vu_oui {background:#f9f9f9;}
@@ -298,7 +299,7 @@ h3 .affichages {
 
 
 /* Grille en cases des documents. */
-.portfolios .documents_cases {
+.portfolios .documents_cases .sortable {
 	display:flex;
 	flex-wrap: wrap;
 }
-- 
GitLab