From 0ef8d61e0190bfd928fa3f61124143a5c6d24e7b Mon Sep 17 00:00:00 2001
From: "marcimat@rezo.net" <>
Date: Sat, 14 Jan 2017 22:31:30 +0000
Subject: [PATCH] =?UTF-8?q?Int=C3=A9gration=20du=20plugin=20"Ordoc"=20dans?=
 =?UTF-8?q?=20M=C3=A9dias.=20Cela=20permet=20d'ordonner=20les=20documents?=
 =?UTF-8?q?=20attach=C3=A9s=20=C3=A0=20des=20objets=20=C3=A9ditoriaux.=20L?=
 =?UTF-8?q?'ordre=20est=20stock=C3=A9=20dans=20la=20colonne=20"rang=5Flien?=
 =?UTF-8?q?"=20de=20la=20table=20"spip=5Fdocuments=5Fliens".?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes                                |   3 +
 action/ordonner_liens_documents.php           | 103 ++++++++++++++++++
 base/medias.php                               |   3 +-
 lang/medias_fr.php                            |   4 +
 medias_administrations.php                    |   4 +
 modeles/document_desc.html                    |   9 +-
 paquet.xml                                    |   4 +-
 .../inclure/portfolio-documents.html          |  85 ++++++++++++++-
 prive/style_prive_plugin_medias.html          |  19 +++-
 prive/themes/spip/images/deplacer-16.png      | Bin 0 -> 3222 bytes
 prive/themes/spip/images/deplacer-24.png      | Bin 0 -> 3453 bytes
 11 files changed, 220 insertions(+), 14 deletions(-)
 create mode 100644 action/ordonner_liens_documents.php
 create mode 100644 prive/themes/spip/images/deplacer-16.png
 create mode 100644 prive/themes/spip/images/deplacer-24.png

diff --git a/.gitattributes b/.gitattributes
index b97ca5dc..20d27105 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,6 +5,7 @@ action/changer_mode_document.php -text
 action/copier_local.php -text
 action/dissocier_document.php -text
 action/editer_document.php -text
+action/ordonner_liens_documents.php -text
 action/supprimer_document.php -text
 action/supprimer_tous_orphelins.php -text
 action/tourner.php -text
@@ -282,6 +283,8 @@ prive/themes/spip/images/base/video-16.png -text
 prive/themes/spip/images/base/video-22.png -text
 prive/themes/spip/images/base/video-32.png -text
 prive/themes/spip/images/base/vu-16.png -text
+prive/themes/spip/images/deplacer-16.png -text
+prive/themes/spip/images/deplacer-24.png -text
 prive/themes/spip/images/distant-16.png -text
 prive/themes/spip/images/doc-16.png -text
 prive/themes/spip/images/doc-24.png -text
diff --git a/action/ordonner_liens_documents.php b/action/ordonner_liens_documents.php
new file mode 100644
index 00000000..a1be0467
--- /dev/null
+++ b/action/ordonner_liens_documents.php
@@ -0,0 +1,103 @@
+<?php
+
+/**
+ * Action ordonnant un lien sur une table de liens
+ *
+ * @plugin     Medias
+ * @copyright  2017
+ * @author     Matthieu Marcillaud
+ * @licence    GNU/GPL
+ * @package    SPIP\Ordoc\Action
+ */
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+function action_ordonner_liens_documents_dist() {
+	action_ordonner_liens_dist();
+}
+
+
+function action_ordonner_liens_dist() {
+	include_spip('inc/autoriser');
+	include_spip('base/objets');
+	include_spip('action/editer_liens');
+
+	// source (table spip_xx_liens)
+	$objet = objet_type(_request('objet_source'));
+
+	// objet lié
+	$objet_lie = _request('objet_lie');
+	$id_objet_lie = intval(_request('id_objet_lie'));
+
+	// ordre des éléments
+	$ordre = _request('ordre');
+
+	if (!$objet or !$objet_lie or !$id_objet_lie OR !$ordre or !objet_associable($objet)) {
+		return envoyer_json_erreur(_T('medias:erreur_objet_absent') . ' ' . _T('medias:erreur_deplacement_impossible'));
+	}
+
+	if (!autoriser('modifier', $objet_lie, $id_objet_lie)) {
+		return envoyer_json_erreur(_T('medias:erreur_autorisation') . ' ' . _T('medias:erreur_deplacement_impossible'));
+	}
+
+	list($_id_objet, $table_liens) = objet_associable($objet);
+
+	$success = $errors = array();
+
+	$actuels = sql_allfetsel(
+		array($_id_objet . ' AS id', 'rang_lien'),
+		$table_liens,
+		array(
+			sql_in($_id_objet, $ordre),
+			'objet = ' . sql_quote($objet_lie),
+			'id_objet = ' . sql_quote($id_objet_lie)
+		)
+	);
+
+	$futurs = array_flip($ordre);
+	// ordre de 1 à n (pas de 0 à n).
+	array_walk($futurs, function(&$v) { $v++; });
+
+	$updates = array();
+
+	foreach ($actuels as $l) {
+		if ($futurs[$l['id']] !== $l['rang_lien']) {
+			$updates[$l['id']] = $futurs[$l['id']];
+		}
+	}
+
+	if ($updates) {
+		foreach ($updates as $id => $ordre) {
+			sql_updateq(
+				$table_liens,
+				array('rang_lien' => $ordre),
+				array(
+					$_id_objet . ' = ' . $id,
+					'objet = ' . sql_quote($objet_lie),
+					'id_objet = ' . sql_quote($id_objet_lie)
+				)
+			);
+		}
+	}
+
+	return envoyer_json_envoi(array(
+		'done' => true,
+		'success' => $success,
+		'errors' => $errors,
+	));
+}
+
+function envoyer_json_envoi($data) {
+	header('Content-Type: application/json; charset=' . $GLOBALS['meta']['charset']);
+	echo json_encode($data);
+}
+
+function envoyer_json_erreur($msg) {
+	return envoyer_json_envoi(array(
+		'done' => false,
+		'success' => array(),
+		'errors' => array($msg)
+	));
+}
diff --git a/base/medias.php b/base/medias.php
index 778c457b..73d508ca 100644
--- a/base/medias.php
+++ b/base/medias.php
@@ -87,7 +87,8 @@ function medias_declarer_tables_auxiliaires($tables_auxiliaires) {
 		'id_document' => "bigint(21) DEFAULT '0' NOT NULL",
 		'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
 		'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
-		'vu' => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL"
+		'vu' => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL",
+		'rang_lien' => "int(4) DEFAULT '0' NOT NULL"
 	);
 
 	$spip_documents_liens_key = array(
diff --git a/lang/medias_fr.php b/lang/medias_fr.php
index e55b0288..b07ad001 100644
--- a/lang/medias_fr.php
+++ b/lang/medias_fr.php
@@ -74,14 +74,17 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'entree_titre_image' => 'Titre de l’image :',
 	'erreur_aucun_document' => 'Ce document n’existe pas dans la médiathèque',
 	'erreur_aucun_fichier' => 'Aucun fichier n’a été trouvé',
+	'erreur_autorisation' => 'Échec de l’autorisation.',
 	'erreur_chemin_distant' => 'Le fichier distant @nom@ n’a pas pu être trouvé',
 	'erreur_chemin_ftp' => 'Le fichier indiqué n’a pas été trouvé sur le serveur',
 	'erreur_copie_fichier' => 'Impossible de copier le fichier @nom@',
+	'erreur_deplacement_impossible' => 'Déplacement impossible.',
 	'erreur_dossier_tmp_manquant' => 'Un dossier temporaire est manquant pour télécharger les fichiers',
 	'erreur_ecriture_fichier' => 'Erreur lors de l’écriture du fichier sur le disque',
 	'erreur_format_fichier_image' => 'Le format de @nom@ ne convient pas pour une image',
 	'erreur_indiquez_un_fichier' => 'Indiquez un fichier !',
 	'erreur_insertion_document_base' => 'Impossible d’enregistrer le document @fichier@ en base de données',
+	'erreur_objet_absent' => 'Informations reçues incomplètes.',
 	'erreur_suppression_vignette' => 'Erreur lors de la suppression de la vignette',
 	'erreur_upload_type_interdit' => 'Le téléchargement des fichiers du type de @nom@ n’est pas autorisé',
 	'erreur_upload_vignette' => 'Erreur lors du chargement de la vignette @nom@',
@@ -155,6 +158,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	// O
 	'objet_document' => 'Document',
 	'objet_documents' => 'Documents',
+	'ordonner_ce_document' => 'Ordonner ce document',
 
 	// P
 	'par_date' => 'Date',
diff --git a/medias_administrations.php b/medias_administrations.php
index 99922362..1979fc9f 100644
--- a/medias_administrations.php
+++ b/medias_administrations.php
@@ -169,6 +169,10 @@ function medias_upgrade($nom_meta_base_version, $version_cible) {
 		// ajout de ics + vcf
 		array('creer_base_types_doc')
 	);
+	$maj['1.3.0'] = array(
+		// ajout de rang_lien
+		array('maj_tables', 'spip_documents_liens'),
+	);
 	include_spip('base/upgrade');
 	include_spip('base/medias');
 	maj_plugin($nom_meta_base_version, $version_cible, $maj);
diff --git a/modeles/document_desc.html b/modeles/document_desc.html
index 62e814bc..2908ed6e 100644
--- a/modeles/document_desc.html
+++ b/modeles/document_desc.html
@@ -12,7 +12,7 @@ Distribue sous licence GPL
 
 		<div class="descriptions">
 			<h4 class="titrem">
-				[(#VU|=={oui}|oui)<img src='#CHEMIN_IMAGE{vu-16-10.png}' width='16' height='10' alt='<:medias:document_vu:>' title='<:medias:document_vu:>'/> ]
+				[(#VU|=={oui}|oui)<img src='#CHEMIN_IMAGE{vu-16-10.png}' width='16' height='10' alt='<:medias:document_vu|attribut_html:>' title='<:medias:document_vu:>'/> ]
 				<span class="#EDIT{titre} titre" title="[(#FICHIER*|basename|attribut_html)]">
 					[(#TITRE|oui)#TITRE]
 					[(#TITRE|non)
@@ -27,7 +27,7 @@ Distribue sous licence GPL
 
 			<div class="infos">
 				<div class="permanentes">
-					[(#DISTANT|=={oui}|oui)<img src='#CHEMIN_IMAGE{distant-16.png}' width='16' height='16' alt='<:medias:fichier_distant:>' title='<:medias:fichier_distant:>'/> ]<:info_numero_abbreviation:>#ID_DOCUMENT - #EXTENSION
+					[(#DISTANT|=={oui}|oui)<img src='#CHEMIN_IMAGE{distant-16.png}' width='16' height='16' alt='<:medias:fichier_distant|attribut_html:>' title='<:medias:fichier_distant|attribut_html:>'/> ]<:info_numero_abbreviation:>#ID_DOCUMENT - #EXTENSION
 
 					<a class="lien_details"
 						onClick="$(this).parent().next('.detaillees').toggle(); return true;"
@@ -76,9 +76,10 @@ Distribue sous licence GPL
 		<BOUCLE_compte(documents_liens){id_document}{0,2} />
 		[(#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)
+		[(#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>
 			<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>
+		]<//B_compte>
 		[(#PIPELINE{document_desc_actions,#ARRAY{args,#ARRAY{id_document,#ID_DOCUMENT,position,document_desc,objet,#OBJET,id_objet,#ID_OBJET},data,''}})]
 	</div>
 
diff --git a/paquet.xml b/paquet.xml
index d9a894f1..b8077a6a 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,11 +1,11 @@
 <paquet
 	prefix="medias"
 	categorie="multimedia"
-	version="2.16.0"
+	version="2.17.0"
 	etat="stable"
 	compatibilite="[3.2.0-dev;]"
 	logo="prive/themes/spip/images/portfolio-32.png"
-	schema="1.2.7"
+	schema="1.3.0"
 >
 
 	<nom>Medias</nom>
diff --git a/prive/squelettes/inclure/portfolio-documents.html b/prive/squelettes/inclure/portfolio-documents.html
index c9e9afb6..663c71dd 100644
--- a/prive/squelettes/inclure/portfolio-documents.html
+++ b/prive/squelettes/inclure/portfolio-documents.html
@@ -14,7 +14,7 @@
 <h3><span class="image_loading"></span><:medias:info_illustrations:></h3>
 <div class="liste_items documents" id="illustrations#ENV{id_unique}">
 [<p class="pagination">(#PAGINATION)</p>]
-<BOUCLE_illustrations(DOCUMENTS documents_liens types_documents){inclus=image}{mode=image}{id_objet}{objet}{par num titre,date,id_document}{pagination 50}{statut?}>
+<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>
 [(#TOTAL_BOUCLE|>{20}|oui)<p class="pagination">#PAGINATION</p>]
@@ -28,7 +28,7 @@
 <h3><:medias:info_portfolio:></h3>
 <div class="liste_items documents" id="portfolio#ENV{id_unique}">
 [<p class="pagination">(#PAGINATION)</p>]
-<BOUCLE_portfolio(DOCUMENTS documents_liens types_documents){inclus=image}{mode=document}{id_objet}{objet}{par num titre,date,id_document}{pagination 50}{statut?}>
+<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>
 [(#TOTAL_BOUCLE|>{20}|oui)<p class="pagination">#PAGINATION</p>]
@@ -42,7 +42,7 @@
 <h3><:medias:info_documents:></h3>
 <div class="liste_items documents" id="documents#ENV{id_unique}">
 [<p class="pagination">(#PAGINATION)</p>]
-<BOUCLE_documents(DOCUMENTS documents_liens types_documents){inclus!=image}{mode!=vignette}{id_objet}{objet}{par num titre,date,id_document}{pagination 50}{statut?}>
+<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>
 [(#TOTAL_BOUCLE|>{20}|oui)<p class="pagination">#PAGINATION</p>]
@@ -134,11 +134,90 @@ 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 () {
+			// détruire / recréer le sortable à chaque appel ajax
+			if ($(this).has('.ui-sortable').length) {
+				$(this).sortable('destroy');
+			}
+			// pas de tri possible s'il n'y a qu'un seul élément.
+			if ($(this).find('> .item').length < 2) {
+				$(this).find('.deplacer-document').hide();
+				return true; // continue
+			} else {
+				$(this).find('.deplacer-document').show();
+			}
+			$(this).sortable({
+				/*axis: "y",*/ /* minidoc a un affichage en case */
+				handle: "",
+				placeholder: "ui-state-highlight deplacer-document-placeholder",
+				cancel: 'img.croix_centre_image',
+				start: function(event, ui) {
+					ui.item.addClass('document-en-mouvement');
+				},
+				stop: function(event, ui) {
+					ui.item.removeClass('document-en-mouvement');
+				},
+				update: function (event, ui) {
+					var items = $(this);
+					var item = ui.item;
+					var liste = items.sortable('toArray');
+					var ordre = [];
+
+					$.each(liste, function(i, id) {
+						if (id) {
+							ordre.push( id.substring(3) ); // doc123 => 123
+						}
+					});
+
+					var action = '[(#VAL{ordonner_liens_documents}|generer_url_action{"", 1})]';
+					var params = {
+						objet_source: 'document',
+						objet_lie: '#OBJET',
+						id_objet_lie: '#ID_OBJET',
+						ordre: ordre,
+					};
+
+					item.animateLoading();
+
+					$.ajax({
+						url: action,
+						data: params,
+						dataType: 'json',
+						cache: false,
+					}).done(function(data) {
+
+						var couleur_origine = item.css('background-color');
+						var couleur_erreur = $("<div class='remove'></div>").css('background-color');
+						var couleur_succes = $("<div class='append'></div>").css('background-color');
+						item.endLoading(true);
+
+						if (data.errors.length) {
+							items.sortable('cancel');
+							item.css({backgroundColor: couleur_erreur}).animate({backgroundColor: couleur_origine}, 'normal', function(){
+								item.css({backgroundColor: ''});
+							});
+						} else {
+							item.css({backgroundColor: couleur_succes}).animate({backgroundColor: couleur_origine}, 'normal', function(){
+								item.css({backgroundColor: ''});
+							});
+						}
+					});
+				}
+			});
+		});
+	}
+}
+
 if (window.jQuery) {
 	jQuery(function($){
 		onAjaxLoad(check_reload_page);
 		choix_affichages_documents();
 		onAjaxLoad(choix_affichages_documents);
+		ordonner_listes_documents();
+		onAjaxLoad(ordonner_listes_documents);
 	});
 }
 /*]]>*/</script>
diff --git a/prive/style_prive_plugin_medias.html b/prive/style_prive_plugin_medias.html
index ca0d7f05..51255b81 100644
--- a/prive/style_prive_plugin_medias.html
+++ b/prive/style_prive_plugin_medias.html
@@ -197,6 +197,12 @@ p.actions {clear:both;}
 
 .item.vu_oui {background:#f9f9f9;}
 
+.deplacer-document-placeholder { height:130px; }
+.deplacer-document { margin-#GET{right}:0.5em; float: #GET{left}; margin-top:2px; cursor:move; }
+.document-en-mouvement { cursor:move; }
+
+.portfolios .item .actions a.editbox { margin-top: 0 !important; }
+
 
 /* Types d'affichages des listes de douments */
 h3 .affichages {
@@ -275,13 +281,16 @@ h3 .affichages {
 }
 .portfolios .documents_liste .item .actions {
 	align-items:center;
+	text-align:#GET{right};
 	margin-#GET{left}:1em;
 	padding-#GET{right}:0;
+	min-width:80px;
 }
 .portfolios .documents_liste .item .actions .editbox,
-.portfolios .documents_liste .item .actions .ordoc-deplacer {
+.portfolios .documents_liste .item .actions .deplacer-document {
 	display:inline-block;
 }
+.documents_liste .deplacer-document-placeholder { height:40px; }
 
 
 /* Grille en cases des documents. */
@@ -310,10 +319,12 @@ h3 .affichages {
 	display:inline-block;
 	float:#GET{right};
 }
-.portfolios .documents_cases .item .actions .ordoc-deplacer {
+.portfolios .documents_cases .item .actions .deplacer-document {
 	display:inline-block;
-	float:#GET{left};
+	margin-top:0px;
 }
+.documents_cases .deplacer-document-placeholder { height:130px; width:113px; padding: 2px; margin: 2px;}
+
 .portfolios .documents_cases .item .vignette {
 	width:auto;
 	height:auto;
@@ -331,7 +342,7 @@ h3 .affichages {
 	width:100%;
 	margin-bottom:0;
 	box-sizing:border-box;
-	padding: 4px 6px;
+	padding: 2px 5px 1px 5px;
 }
 .portfolios .documents_cases .tout_supprimer {
 	flex-basis: 100%;
diff --git a/prive/themes/spip/images/deplacer-16.png b/prive/themes/spip/images/deplacer-16.png
new file mode 100644
index 0000000000000000000000000000000000000000..7823dce1acf400597e3d52634476d0485b5ed3a4
GIT binary patch
literal 3222
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyFB
zvd(mN4hYD|FUc>?$S+XvbaqxKD9TUE%t>Wn@aUX7tvn?7rda#=z2<uZCJA&+xsaU^
z#N@%d*JGldmLaEr*MSKPN@gx01ulUTmvI<rJZM<#JaMB^S1V)S#@8&8E>{W*M5L#A
zrmU5`zo+v3+1dByzt?5Y-+TUU`uo~zyBH??X=Xj-6T#WQvoJ#B;q#*%z1`^v?2J4g
z7?^Vy9u#ce>?HQXjcF!R&5fR%nZiHB_wM3T`1xDwvVG4%hX3=Y?2J@0WC)ni^Ze6~
zn=z8&CoOEl=csP?KRIKYiSIcBuX9R~O-5mpi$Cc^*L<6q%5VAEsKrL|bn&@IsUM!)
zQGeWPDYUO=VuGajbB-T7jrOS}H<x&}IULJ>vQe_e&x}E1(jC2L#la~#y2+C?jGA;G
zS28^CI2r%pl77UQ^TMb3kDfadr6;7ayhBngCb+G4vT*mq^XGk^cON}tz-Qj8{K)Xe
zOvy-@heZr&=l?{CROU)<QnJ2bVQFEItDCz|<4S$(pV^bXmraXnsedQwBLCy?xA3}|
zybK$brEb0Xt35YUlp*#tW5Dje?PnA88M-#@E9I*#l-pGk7j)#2PP+E$J9lEd8Rutf
z>c4pZYd&ASb9~MDpnZ4WKTWLoJlSGWiJ^0xd0tx8GM6JK&OIvl$@6S}`ww~cf2DF_
zf`3%@b?8rVbveDvN5N;>*60($9jr5*+8ln&pY?<P@V_NDcTVfP^+WK&v<Rl9ic$`B
zats<;f(o3~DcTp_*K!|oXa0G%`{K+QbAO+2`d1si!{^@#F_rqhWOo;%9YTTU-pu+F
z#blzu;OfBq%0c=Cv+x0yZ3hH*Fz`QMW^&Z%U@1&6e9$B^fzd@lT%=*^0*NV2YZKI0
zu$3+lG-);~kSJ+Peqdt3uGe@vf#nWkkOAMk2F(v#XB-4tT2Baw2DO(cIG>Q&)EY5C
z`Ux|uvtWSC6b@BqCl4l3ht~^&R>-Vsd$lm_Mf3}e5~*Dbyw2Mf1ZD{R60KraHsD-#
zFlvKf4(sLwe+!Pj7V(28KNwla>osjZFtvcWM&MnG|KaHm1S7cY8<z_<2nbp&>NXG*
zJLKjxu|kDYP;vDHp(RY24!0)AEs@{Z<uP&jiD(fvS69OTpDEm@<V9N_Et<A4Y@ylW
zRe|gQb64113B96`#r0Lt*DZU|*^B31FqG(6NzU!oa|>TE`-1F?%`XJMSo{)YYhIY#
zW7sEA?<1oox|wOS<Ywv1eU`0~$9fW%ZH!oBbxr1V7w^%c4M{nM+qkL)s)edqt@~=5
zl^>N9Y_o`uvGMEBJ`(yMszALUyg+z|<Q}1W0`GhHkAD7e`eW)3w;KLB4*S0OiW<T_
zoa<UVoU{^k7f!n1X5qcVyTVaL=xc}Hk%C1HJK7>VZCq^pWmNa62708am}xeuDCR1@
zRiCSLS81=p<dbeG{6#jAKKGpR)aEPRSKlAFKr2FvMdO1=nD!No60MlPie(+)CLv!!
zV%E%9AF;5)rO@N!N};%u9-V8C1V$|lSzHqGvhC6qqtKgfmLZnTm79yYKe0Y_7tuM|
z@yPjMV3)>kjdYFVkd{^cslhw1lwNUr75U17*V%X(>xH1qrCahdnzv|*c6H75+Tu0O
ztM^o)sHW^f>5I%SUVbt9mH4almvyLasDJ3bS87+yu4=DZfA!gl$`v24dR@77)$Pi?
zmBv?UuUx*eeP#K|`<ERuXJocyKgoJ?(PH(-629EN(=zYoOtNf$e&<??=~)wHlkkjp
zmt`)@xpwK=r^}}<t-55j_-n}Qb#E8WUA5QwcgwdWe4)pE-4|?je!k>favRs-$rI15
zNcm#8ti-hRZ>j38ue+Le8CM;v3ao0adRz7V3+FGLzbb!af9?Gh%x1-=$i~XHmTf!l
z$2OhAB8Ow!{<f{}?deVGF_S2jv^5Gd<})~Fo@cr*+sUlZJTmQ4LeW`~<Wokz#&>h8
zZt|FIHupAMZ76NjepdDj>$BZw+jTF9`H4Aovvo`R2wk2$^KedTU(_YtW?gRG-8%Cl
zB_obT=Wc$r{Z~eA{@lE~8MVjTl7usYGcG58UcGjv?)7cQzTJxX6mx&)>gQ$WYxC0c
zj&Hx6Tz+|8mVDCwgZr-kYi?fLd}86*#7h?s7+&0X?IT<FF|Op?w7KO@)|HlP%dDP#
zxpwnl<eQosKgGqDdC&6hKE1f|*ykUgrJnche6_PE=5_4SJf7_?+xO-LmB*I%RX6`;
z=C9?S=RWy(%kq`!tDZZaPmjA6r?j4L{q>ymZ(iRt^N-v<zxzn_h4x3nPlMkU-w!`;
zeslZP@>A#U<+t9~tlv^U;lJ5`X~rnVI}OhoRyrI%FtxGPamfN!$E%L~O=p{2585gg
zcqE+oHevT?-sjxU%Uhc+G+cPQ@cW^j!_!)8<@-4Kxz}^nOC$;h3S8XZuq)wY(=^ug
zN_&+~E4_D_>EgMlYO&~I;YG6-#~-gaKIOPa^4g^EV{u)VJA{vv9#4L}`0?yV%f)}`
z+}T-RbI@*~#lv4pk6kOf^>nU9%-Q$jhtN^gIjZhL7ds6*bvxf%E}X-5?#rcyrCYt1
z@5p(l_fB{odp>*qr1z)vpZlxqRGX@9>s97^Z=TJ}NArRvehN7t7Q#Jm`LE^ImhSW8
z_Pss-o2ISWUR&nr6K52LcnB`z{B5+=__I;_<};hSHZM6nXZqV1GgU4j(^Ti1-J5nF
zHMx2IO2ZMCO>suE9#0FN{8`Q1>bu9hqIm}S2|I6o@;$BosrK{!xW=f1u@|EkL~q!Z
zP_p#-sb8TNRxMp!75;j?UX<;=WBF$rx3+A}%&yniqNk%@vr{iE)_-Ey#aW9seyw{Q
z-7VVXdeq!(N6w1d9k(=YSnSArw``TKymy7Fxc6FbZLj<J&+_*Dn0hvRYJBajNn27k
zoLQK2KI}}`!)vc^-`Os!5w3S$U;eh-roF}N$?hlnrdv;cvnL=iJaBvW2JcPYQIat?
zV^agRZhci->h;y5H{7>+ZQ9#qx32H5+`azI#~YW!mWPH%ea~B;@cwMo{$J<V7PocP
z&ZxEgEobIt{;mG(uU$Jm7q8s%@^Ib5x|fX|%(Z9x&YsnsrJK68VD*yHPYH((p1xmE
zfBEjQoYncuw@;U2YFBBOtDpVj?bpMO?bZDo`nJ@j|A@_H-@15-@T-`6mRF}<QhnR^
zTFy?YV$1g9OP4>cKK=f?{AJs);+UruH#rY=E)t&a_iX+gyQ!tGUcP*CIeD*l)%!V}
zw#94p_vC-bxp4FI^P2N>Uw(gMUwQBApN-t-#QWk>V&Cj~Qn0f4K;44J?7!u$*kswP
z+hy8!>08IXlbmN>^Qi0h)XU*}*U#H6R`B-Hi9Zt`z7D*ef6rrw;@*?Hf4&I&wf6b;
z;=J>BB8$aqw?CP8X>Zr>S>L7WO#W_+eWhS)_sZ7lL&Cvk>*PBd)$LRNf2rH^Lh)zf
z(Ux;ApOtUBA6KhY*SC-RQSry~+T@wbkJ@YhkNJJ($<6Zp6@QEjM6FH##eDg5dHwA8
z75i`ezw|EkeaVe4f5Ro$r^QX*6IfsTK=*a-|J^gng^hQ<-}qkJen#DkpAug_zFXeo
zKfjLod&}qF4?<SyGcYhHBzpw;GB8xBF)%c=FfjaLU|?u?!N5>zz`*b-fq}tl1_Oh5
z!JJ)zHVh05Y)RhkE)41nI~bnVH%^dXU|`@Z@Q5sCV30cm!i;$rO6?dJ7}!fZeO=if
zGO~*a@!Xg+VG9ET;{s0?#}JFty_5H5hd7EHtxv!AF705fs(?<~d*)vG)&&V#8#$9w
z(>H7o-}23V<Mz$oxw$#5Axg)b7I9eH3D^fc>Fn73KI+H4Pn*^i`WqX!SL>CZo72c@
z(0#V*wvJs!@n?bm4UsnOU!=a<6&Npl^z#z$nI!p&W{Ym-54=031bxihXLhDPcKcp_
zmOazDg(@sopM6}fcH*(7R-KRq!`GQU;U^AtPU&iX%p)CTcWYbCm3gn)Bfng;H1764
z`zUL1=-!<@Us%4c?kK&$^8LL7;~Iw59?n|t749j&eORZzG%0*q|GLNfn7;@<$n9o*
z=dSx*@;~>Es|RfrjvZ)?`m<1PbwNCP%NM@y4ayIA-YM8MS)CQFI$*Yebq%AiuiDb`
z-KrP9A3nU`-~*Kl6Tck2J700zr5zfE-7}6ZyQsW*##Y}mpD*s|?3ZRvSJSJQ$-6}J
z-EIf|R_zK?kChdP;^(#Z-u=G6sl;UdF2+49RrMXOL?7`vMDH>1NE2M8rQ9N$uzA^c
zj+>@6QOgQ9K1uJ|=zT1Fj^d*dDe?J{VrxtCW*yyqy!QG1bzT$p*FCP?#=yY9;OXk;
Jvd$@?2>>j>6C(fs

literal 0
HcmV?d00001

diff --git a/prive/themes/spip/images/deplacer-24.png b/prive/themes/spip/images/deplacer-24.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b92b6afa36ca06f733e809246f149a18ae4531a
GIT binary patch
literal 3453
zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoSkfJR9T^xl_H+M9WMyFB
zvd(mN4hYD|FUc>?$S+XvbaqxKD9TUE%t>Wn@aUX7tvn?7rda#=z2<uZCJA&+xsaU^
z#N@%d*JGldmLaEr*MSKPN@gx01ulUTmvI<rJZM<#JaMB^S1V)S#@8&8E>{W*M5L#A
zrmU5`zo+v3+1dByzt?5Y-+TUU`uo~zyBH??X=Xj-6T#WQvoJ#B;q#*%z1`^v?2J4g
z7?^Vy9u#ce>?HQXjcF!R&5fR%nZiHB_wM3T`1xDwvVG4%hX3=Y?2J@0WC)ni^Ze6~
zn=z8&CoOEl=csP?KRIKYiSIcBuX9R~O-5mpi$Cc^*L<6q%5VAEsKrL|bn&@IsUM!)
zQGeWPDYUO=VuGajbB-T7jrOS}H<x&}IULJ>vQe_e&x}E1(jC2L#la~#y2+C?jGA;G
zS28^CI2r%pl77UQ^TMb3kDfadr6;7ayhBngCb+G4vT*mq^XGk^cON}tz-Qj8{K)Xe
zOvy-@heZr&=l?{CROU)<QnJ2bVQFEItDCz|<4S$(pV^bXmraXnsedQwBLCy?xA3}|
zybK$brEb0Xt35YUlp*#tW5Dje?PnA88M-#@E9I*#l-pGk7j)#2PP+E$J9lEd8Rutf
z>c4pZYd&ASb9~MDpnZ4WKTWLoJlSGWiJ^0xd0tx8GM6JK&OIvl$@6S}`ww~cf2DF_
zf`3%@b?8rVbveDvN5N;>*60($9jr5*+8ln&pY?<P@V_NDcTVfP^+WK&v<Rl9ic$`B
zats<;f(o3~DcTp_*K!|oXa0G%`{K+QbAO+2`d1si!{^@#F_rqhWOo;%9YTTU-pu+F
z#blzu;OfBq%0c=Cv+x0yZ3hH*Fz`QMW^&Z%U@1&6e9$B^fzd@lT%=*^0*NV2YZKI0
zu$3+lG-);~kSJ+Peqdt3uGe@vf#nWkkOAMk2F(v#XB-4tT2Baw2DO(cIG>Q&)EY5C
z`Ux|uvtWSC6b@BqCl4l3ht~^&R>-Vsd$lm_Mf3}e5~*Dbyw2Mf1ZD{R60KraHsD-#
zFlvKf4(sLwe+!Pj7V(28KNwla>osjZFtvcWM&MnG|KaHm1S7cY8<z_<2nbp&>NXG*
zJLKjxu|kDYP;vDHp(RY24!0)AEs@{Z<uP&jiD(fvS69OTpDEm@<V9N_Et<A4Y@ylW
zRe|gQb64113B96`#r0Lt*DZU|*^B31FqG(6NzU!oa|>TE`-1F?%`XJMSo{)YYhIY#
zW7sEA?<1oox|wOS<Ywv1eU`0~$9fW%ZH!oBbxr1V7w^%c4M{nM+qkL)s)edqt@~=5
zl^>N9Y_o`uvGMEBJ`(yMszALUyg+z|<Q}1W0`GhHkAD7e`eW)3w;KLB4*S0OiW<T_
zoa<UVoU{^k7f!n1X5qcVyTVaL=xc}Hk%C1HJK7>VZCq^pWmNa62708am}xeuDCR1@
zRiCSLS81=p<dbeG{6#jAKKGpR)aEPRSKlAFKr2FvMdO1=nD!No60MlPie(+)CLv!!
zV%E%9AF;5)rO@N!N};%u9-V8C1V$|lSzHqGvhC6qqtKgfmLZnTm79yYKe0Y_7tuM|
z@yPjMV3)>kjdYFVkd{^cslhw1lwNUr75U17*V%X(>xH1qrCahdnzv|*c6H75+Tu0O
ztM^o)sHW^f>5I%SUVbt9mH4almvyLasDJ3bS87+yu4=DZfA!gl$`v24dR@77)$Pi?
zmBv?UuUx*eeP#K|`<ERuXJocyKgoJ?(PH(-629EN(=zYoOtNf$e&<??=~)wHlkkjp
zmt`)@xpwK=r^}}<t-55j_-n}Qb#E8WUA5QwcgwdWe4)pE-4|?je!k>favRs-$rI15
zNcm#8ti-hRZ>j38ue+Le8CM;v3ao0adRz7V3+FGLzbb!af9?Gh%x1-=$i~XHmTf!l
z$2OhAB8Ow!{<f{}?deVGF_S2jv^5Gd<})~Fo@cr*+sUlZJTmQ4LeW`~<Wokz#&>h8
zZt|FIHupAMZ76NjepdDj>$BZw+jTF9`H4Aovvo`R2wk2$^KedTU(_YtW?gRG-8%Cl
zB_obT=Wc$r{Z~eA{@lE~8MVjTl7usYGcG58UcGjv?)7cQzTJxX6mx&)>gQ$WYxC0c
zj&Hx6Tz+|8mVDCwgZr-kYi?fLd}86*#7h?s7+&0X?IT<FF|Op?w7KO@)|HlP%dDP#
zxpwnl<eQosKgGqDdC&6hKE1f|*ykUgrJnche6_PE=5_4SJf7_?+xO-LmB*I%RX6`;
z=C9?S=RWy(%kq`!tDZZaPmjA6r?j4L{q>ymZ(iRt^N-v<zxzn_h4x3nPlMkU-w!`;
zeslZP@>A#U<+t9~tlv^U;lJ5`X~rnVI}OhoRyrI%FtxGPamfN!$E%L~O=p{2585gg
zcqE+oHevT?-sjxU%Uhc+G+cPQ@cW^j!_!)8<@-4Kxz}^nOC$;h3S8XZuq)wY(=^ug
zN_&+~E4_D_>EgMlYO&~I;YG6-#~-gaKIOPa^4g^EV{u)VJA{vv9#4L}`0?yV%f)}`
z+}T-RbI@*~#lv4pk6kOf^>nU9%-Q$jhtN^gIjZhL7ds6*bvxf%E}X-5?#rcyrCYt1
z@5p(l_fB{odp>*qr1z)vpZlxqRGX@9>s97^Z=TJ}NArRvehN7t7Q#Jm`LE^ImhSW8
z_Pss-o2ISWUR&nr6K52LcnB`z{B5+=__I;_<};hSHZM6nXZqV1GgU4j(^Ti1-J5nF
zHMx2IO2ZMCO>suE9#0FN{8`Q1>bu9hqIm}S2|I6o@;$BosrK{!xW=f1u@|EkL~q!Z
zP_p#-sb8TNRxMp!75;j?UX<;=WBF$rx3+A}%&yniqNk%@vr{iE)_-Ey#aW9seyw{Q
z-7VVXdeq!(N6w1d9k(=YSnSArw``TKymy7Fxc6FbZLj<J&+_*Dn0hvRYJBajNn27k
zoLQK2KI}}`!)vc^-`Os!5w3S$U;eh-roF}N$?hlnrdv;cvnL=iJaBvW2JcPYQIat?
zV^agRZhci->h;y5H{7>+ZQ9#qx32H5+`azI#~YW!mWPH%ea~B;@cwMo{$J<V7PocP
z&ZxEgEobIt{;mG(uU$Jm7q8s%@^Ib5x|fX|%(Z9x&YsnsrJK68VD*yHPYH((p1xmE
zfBEjQoYncuw@;U2YFBBOtDpVj?bpMO?bZDo`nJ@j|A@_H-@15-@T-`6mRF}<QhnR^
zTFy?YV$1g9OP4>cKK=f?{AJs);+UruH#rY=E)t&a_iX+gyQ!tGUcP*CIeD*l)%!V}
zw#94p_vC-bxp4FI^P2N>Uw(gMUwQBApN-t-#QWk>V&Cj~Qn0f4K;44J?7!u$*kswP
z+hy8!>08IXlbmN>^Qi0h)XU*}*U#H6R`B-Hi9Zt`z7D*ef6rrw;@*?Hf4&I&wf6b;
z;=J>BB8$aqw?CP8X>Zr>S>L7WO#W_+eWhS)_sZ7lL&Cvk>*PBd)$LRNf2rH^Lh)zf
z(Ux;ApOtUBA6KhY*SC-RQSry~+T@wbkJ@YhkNJJ($<6Zp6@QEjM6FH##eDg5dHwA8
z75i`ezw|EkeaVe4f5Ro$r^QX*6IfsTK=*a-|J^gng^hQ<-}qkJen#DkpAug_zFXeo
zKfjLod&}qF4?<SyGcYhHBzpw;GB8xBF)%c=FfjaLU|?u?!N5>zz`*b-fq}tl1_Oh5
z!JJ)zHVh05Y)RhkE)41nI~bnVH%<VxP&o@cB8wRq<PL!_W8Q^QI|c>@_7YEDSN4aD
z>|$){Q4RYRGB7Z;d%8G=cpP6lb$_-<pulna&v_TsI9dEUcfU6+V^dtD5V5kA;}&Pr
zf`}PG*4*CS(g(F}NC=pOJ>%zSS|YSXsA&PC^!K-JJ2jqMdGsak_@lD(d*yfT{&OQO
z@!8q(do|CkKPRxy-}=xr`*7>rBPV7YU<h3>ZT30l)%TVwC!e)=aBq3XiP@7XkN)1`
zv4>xD#|z0-<}MCflmES_t;+G|oYNg}b@PF&_$f?E+$-)$x?K(E+H#d^f?PpS0mIeX
zN=CbX%SkXx3LjuORLdg3IC1)gZL42RPZT)laBi{kWr^VLg_l@nRc`)YvQFP*uYdjY
z76AtLz5ds?uRXAHg+&c(a@~TcoAY)v`gGK6GTRe6>Fa+MW8?PD$1JZGv3KY^56b-3
zkfQ3F5<8FUtWDa*TOTx!m8?FoD}(7Oe*?3NOTg8matkb5F8_RM&%C~R#*BPrt`%l3
zM~)T-31=U+bh$U3wa+8EQ#E>CNz04f?5q~)O$rgtU!%)?Z?Ruv*Sqv}I@6xyX}b<Z
zUC1!mWPI-I9`DQT2k!bYw^lkvsXjP;;Od@9+gI3~JI%7<$&_czCxWhJ-SxS&K5`=$
z7i;Vmvyg1(Qa!G!vP-tFmA0CNyj~=3yYGOgophYO_DO~x7K{gem#}g)`i7d`?dcHt
z<MqGGaMdsF8DH&UwZxtraQtj{mw_)*de+-2g9Y-w^6HaSdmc`nBY$cQH~%7;^D}$B
z-etaCG`Z4M+Ro3cZ11|c-C10rzw&q$>TBo7+_>DF+*6qQ)AM`ot)F^5RV7-Bg>rJQ
z&JGTqJo~`XzHhhp*ncnlv?A{R$$d4~T-UF8>ruG3eC6Ap7r)yb-L;`D=;#cs$ZxfC
s+~bd}JJ8m2f-}Uwa=x9U`8#>epTb9Ux#p~3U|?YIboFyt=akR{0HH&FzyJUM

literal 0
HcmV?d00001

-- 
GitLab