From 86f937663521ce3a1d52a01feccb9667f3f0aae5 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Fri, 8 Oct 2010 13:00:45 +0000
Subject: [PATCH] Une fonction Ooops qui permet d'annuler la derniere
 suppression de liens. Ainsi, si on clique sur le mauvais lien 'retirer cet
 auteur' ou par inadvertance sur 'Retrier tous les auteurs', il suffit de
 cliquer sur 'Ooops' pour retablir la situation

---
 prive/formulaires/editer_liens.html |  2 ++
 prive/formulaires/editer_liens.php  | 45 ++++++++++++++++++++++-------
 2 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/prive/formulaires/editer_liens.html b/prive/formulaires/editer_liens.html
index f54cb6ef03..d036fe2d82 100644
--- a/prive/formulaires/editer_liens.html
+++ b/prive/formulaires/editer_liens.html
@@ -9,7 +9,9 @@
 		<input type="hidden" name="visible" value="#ENV{visible,0}" id="visible-#ENV{id}"/>
 	  <p class='boutons' style="display:none;"><span class='image_loading'>&nbsp;</span><input type='submit' class='submit' value='<:bouton_changer:>' /></p>
 	]
+
 		<INCLURE{fond=prive/listes/#ENV{_vue_liee},env,ajax}>
+		[<div class="action"><input type="hidden" name="_oups" value='(#ENV**{_oups})' /><input type="submit" name="annuler_oups" value="Ooops" /></div>]
 
 		[(#ENV{visible,0}|et{#ENV{editable}}|oui)
 			<div class="selecteur[(#ENV{recherche}|oui)filtre]">
diff --git a/prive/formulaires/editer_liens.php b/prive/formulaires/editer_liens.php
index 189ebe9813..be86ec1a1c 100644
--- a/prive/formulaires/editer_liens.php
+++ b/prive/formulaires/editer_liens.php
@@ -44,6 +44,7 @@ function formulaires_editer_liens_charger_dist($table_source,$objet,$id_objet){
 		'recherche'=>'',
 		'visible'=>0,
 		'editable'=>autoriser('modifier',$objet,$id_objet),
+		'_oups' => _request('_oups'),
 	);
 
 	return $valeurs;
@@ -53,17 +54,41 @@ function formulaires_editer_liens_traiter_dist($table_source,$objet,$id_objet){
 
 	if (_request('tout_voir'))
 		set_request('recherche','');
-	#var_dump($_REQUEST);
-	if ($ajouter = _request('ajouter_lien')){
-		$ajouter_lien = charger_fonction('ajouter_lien','action');
-		foreach($ajouter as $lien=>$dummy)
-			$ajouter_lien($lien);
-	}
 
-	if ($supprimer = _request('supprimer_lien')){
-		$supprimer_lien = charger_fonction('supprimer_lien','action');
-		foreach($supprimer as $lien=>$dummy)
-			$supprimer_lien($lien);
+
+	if (autoriser('modifier',$objet,$id_objet)) {
+		// annuler les suppressions du coup d'avant !
+		if (_request('annuler_oups')
+			AND $oups = _request('_oups')
+			AND $oups = unserialize($oups)){
+			$objet_source = objet_type($table_source);
+			include_spip('action/editer_liens');
+			foreach($oups as $oup) {
+				objet_associer(array($objet_source=>$oup[$objet_source]), array($objet=>$oup[$objet]),$oup);
+			}
+			# oups ne persiste que pour la derniere action, si suppression
+			set_request('_oups');
+		}
+		
+		if ($ajouter = _request('ajouter_lien')){
+			$ajouter_lien = charger_fonction('ajouter_lien','action');
+			foreach($ajouter as $lien=>$dummy)
+				$ajouter_lien($lien);
+			# oups ne persiste que pour la derniere action, si suppression
+			set_request('_oups');
+		}
+
+		if ($supprimer = _request('supprimer_lien')){
+			include_spip('action/editer_liens');
+			$oups = array();
+			foreach($supprimer as $lien=>$dummy) {
+				$lien = explode("-",$lien);
+				list($objet_source,$ids,$objet_lie,$idl) = $lien;
+				$oups = array_merge($oups,  objet_trouver_liens(array($objet_source=>$ids), array($objet_lie=>$idl)));
+				objet_dissocier(array($objet_source=>$ids), array($objet_lie=>$idl));
+			}
+			set_request('_oups',$oups?serialize($oups):null);
+		}
 	}
 
 	$res = array('editable'=>true);
-- 
GitLab