From f6d9f456440ac31043765e355ae8d9abfcb21204 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@users.sourceforge.net>
Date: Thu, 2 Aug 2007 22:02:58 +0000
Subject: [PATCH] Modification codification ordre d'une boite afin de gerer
 independemment les colonnes (on met une lettre A, B, ... au debut du champ
 ordre)

---
 htdocs/admin/boxes.php                  | 73 ++++++++++++++-----------
 htdocs/ajaxbox.php                      | 17 ++----
 htdocs/boxes.php                        | 64 +++++++++++++---------
 htdocs/includes/boxes/modules_boxes.php |  2 +-
 htdocs/index.php                        | 59 ++++++++++----------
 htdocs/lib/lib_head.js                  |  2 +-
 htdocs/theme/eldy/eldy.css.php          |  6 ++
 mysql/migration/2.1.0-2.2.0.sql         |  9 ++-
 8 files changed, 132 insertions(+), 100 deletions(-)

diff --git a/htdocs/admin/boxes.php b/htdocs/admin/boxes.php
index 15ad2bc4257..6f2f1225dd3 100644
--- a/htdocs/admin/boxes.php
+++ b/htdocs/admin/boxes.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2003-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
- * Copyright (C) 2004-2006 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2004-2007 Laurent Destailleur  <eldy@users.sourceforge.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,8 +35,8 @@ if (!$user->admin)
   accessforbidden();
 
 // D�finition des positions possibles pour les boites
-$pos_array = array(0);                          // Positions possibles pour une boite (0,1,2,...)
-$pos_name = array($langs->trans("Home"));       // Nom des positions 0=Homepage, 1=...
+$pos_array = array(0);                             // Positions possibles pour une boite (0,1,2,...)
+$pos_name = array(0=>$langs->trans("Home"));       // Nom des positions 0=Homepage, 1=...
 $boxes = array();
 
 /*
@@ -59,12 +59,13 @@ if ($_POST["action"] == 'add')
 
 			// Si la boite n'est pas deja active
 	        $sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes (box_id, position, fk_user) values (".$_POST["boxid"].",".$_POST["pos"].", 0)";
-			dolibarr_syslog("boxes.php::activation boite sql=".$sql);
+			dolibarr_syslog("boxes.php activate box sql=".$sql);
 	        $resql = $db->query($sql);
 
 		    // Remove all personalized setup when a box is activated or disabled
 			$sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param";
 		    $sql.= " WHERE param like 'MAIN_BOXES_%'";
+			dolibarr_syslog("boxes.php delete user_param sql=".$sql);
 		    $resql = $db->query($sql);
 
 			$db->commit();
@@ -108,11 +109,11 @@ if ($_GET["action"] == 'switch')
     
     if (is_object($objfrom) && is_object($objto))
     {
-        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=".$objto->box_order." WHERE rowid=".$objfrom->rowid;
+        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order='".$objto->box_order."' WHERE rowid=".$objfrom->rowid;
 		//print "xx".$sql;
         $resultupdatefrom = $db->query($sql);
         if (! $resultupdatefrom) { dolibarr_print_error($db); }
-        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=".$objfrom->box_order." WHERE rowid=".$objto->rowid;
+        $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order='".$objfrom->box_order."' WHERE rowid=".$objto->rowid;
 		//print "xx".$sql;
         $resultupdateto = $db->query($sql);
         if (! $resultupdateto) { dolibarr_print_error($db); }
@@ -137,43 +138,53 @@ print_fiche_titre($langs->trans("Boxes"),'','setup');
 print $langs->trans("BoxesDesc")."<br>\n";
 
 /*
- * Recherche des boites actives par position possible
- * On stocke les boites actives par $boxes[position][id_boite]=1
+ * Recherche des boites actives par defaut pour chaque position possible
+ * On stocke les boites actives par defaut dans $boxes[position][id_boite]=1
  */
 
+$actives = array();
+
 $sql  = "SELECT b.rowid, b.box_id, b.position, b.box_order, d.name, d.rowid as boxid";
 $sql .= " FROM ".MAIN_DB_PREFIX."boxes as b, ".MAIN_DB_PREFIX."boxes_def as d";
 $sql .= " WHERE b.box_id = d.rowid AND fk_user=0";
 $sql .= " ORDER by position, box_order";
 
 $resql = $db->query($sql);
-
-$actives = array();
-
 if ($resql)
 {
-  $num = $db->num_rows($resql);
-  $i = 0;
-  $decalage=0;
-  while ($i < $num)
-    {
-      $var = ! $var;
-      $obj = $db->fetch_object($resql);
-      $boxes[$obj->position][$obj->box_id]=1;
-      $i++;
-      
-      array_push($actives,$obj->boxid);
-
-      // On renum�rote l'ordre des boites si l'une d'elle est � 0 (Ne doit arriver que sur des anciennes versions)
-      if ($obj->box_order==0) $decalage++;
-      if ($decalage)
+	$num = $db->num_rows($resql);
+	$i = 0;
+	$decalage=0;
+	while ($i < $num)
+	{
+		$var = ! $var;
+		$obj = $db->fetch_object($resql);
+		$boxes[$obj->position][$obj->box_id]=1;
+		$i++;
+		
+		array_push($actives,$obj->box_id);
+
+		if ($obj->box_order == '' || $obj->box_order == '0' || $decalage) $decalage++;
+		// On renum�rote l'ordre des boites si l'une d'elle est � 0 (Ne doit arriver que sur des anciennes versions)
+		if ($decalage)
+		{
+			$sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=".$decalage." WHERE rowid=".$obj->rowid;
+			$db->query($sql);
+		}
+	}
+	if ($decalage)
 	{
-	  $sql="UPDATE ".MAIN_DB_PREFIX."boxes set box_order=box_order+".$decalage." WHERE rowid=".$obj->rowid;
-	  $db->query($sql);
+		// Si on a renumerote, on corrige champ box_order (Ne doit arriver que sur des anciennes versions)
+		$sql="update llx_boxes set box_order = concat('A0',box_order) where length(box_order) = 1 and substr(box_order,-1) in ('1','3','5','7','9')";
+		$resql = $db->query($sql);
+		$sql="update llx_boxes set box_order = concat('B0',box_order) where length(box_order) = 1 and substr(box_order,-1) in ('0','2','4','6','8')";
+		$resql = $db->query($sql);
+		$sql="update llx_boxes set box_order = concat('A',box_order) where length(box_order) = 2 and substr(box_order,-1) in ('1','3','5','7','9')";
+		$resql = $db->query($sql);
+		$sql="update llx_boxes set box_order = concat('B',box_order) where length(box_order) = 2 and substr(box_order,-1) in ('0','2','4','6','8')";
+		$resql = $db->query($sql);
 	}
-    }
-  
-  $db->free($resql);
+	$db->free($resql);
 }
 
 
diff --git a/htdocs/ajaxbox.php b/htdocs/ajaxbox.php
index 12b6adfde73..3bf45bda531 100644
--- a/htdocs/ajaxbox.php
+++ b/htdocs/ajaxbox.php
@@ -1,5 +1,6 @@
 <?php
 /* Copyright (C) 2005-2007 Regis Houssin        <regis.houssin@cap-networks.com>
+ * Copyright (C) 2007      Laurent Destailleur  <eldy@users.sourceforge.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +22,7 @@
 
 /**
         \file       htdocs/ajaxbox.php
-        \brief      Fichier de reponse sur evenement Ajax
+        \brief      Fichier de reponse sur evenement Ajax deplacement boxes
         \version    $Revision$
 */
 
@@ -29,18 +30,12 @@ require('master.inc.php');
 require_once(DOL_DOCUMENT_ROOT."/boxes.php");
 
 // Enregistrement de la position des boxes
-if((isset($_GET['boxorder']) && !empty($_GET['boxorder'])) && (isset($_GET['boxid']) && !empty($_GET['boxid'])) && (isset($_GET['userid']) && !empty($_GET['userid'])))
+if((isset($_GET['boxorder']) && !empty($_GET['boxorder'])) && (isset($_GET['userid']) && !empty($_GET['userid'])))
 {
-	$infobox=new InfoBox($db);
-	
-	dolibarr_syslog("InfoBox::Ajax.Request list=".$_GET['boxorder']." boxid=".$_GET['boxid']." userid=".$_GET['userid'], LOG_DEBUG);
-	
-	$boxid = explode(',',$_GET['boxid']);
-	$boxorder = explode(',',$_GET['boxorder']);
-	
-	$infobox->saveboxorder("0",$boxid,$boxorder,$_GET['userid']);
+	dolibarr_syslog("AjaxBox boxorder=".$_GET['boxorder']." userid=".$_GET['userid'], LOG_DEBUG);
 
+	$infobox=new InfoBox($db);
+	$result=$infobox->saveboxorder("0",$_GET['boxorder'],$_GET['userid']);
 }
 
-
 ?>
diff --git a/htdocs/boxes.php b/htdocs/boxes.php
index 7ad14777df0..e19f5307164 100644
--- a/htdocs/boxes.php
+++ b/htdocs/boxes.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2003      Rodolphe Quiedeville <rodolphe@quiedeville.org> 
- * Copyright (C) 2004-2006 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2004-2007 Laurent Destailleur  <eldy@users.sourceforge.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,7 +18,6 @@
  *
  * $Id$
  * $Source$
- *
  */
 
 /**
@@ -74,7 +73,7 @@ class InfoBox
 			$sql.= " AND b.fk_user = ".$user->id;
 			$sql.= " ORDER BY b.box_order";
 		
-			dolibarr_syslog("InfoBox::listBoxes sql=$sql");
+			dolibarr_syslog("InfoBox::listBoxes get user box list sql=$sql");
 			$result = $this->db->query($sql);
 			if ($result)
 			{
@@ -91,7 +90,7 @@ class InfoBox
 					$box->position=$obj->position;
 					$box->box_order=$obj->box_order;
 					$box->fk_user=$obj->fk_user;
-					$boxes[$j]=$box;
+					$boxes[]=$box;
 					$j++;
 				}
 			}
@@ -112,7 +111,7 @@ class InfoBox
 			$sql.= " AND b.fk_user = 0";
 			$sql.= " ORDER BY b.box_order";
 
-			dolibarr_syslog("InfoBox::listBoxes sql=$sql");
+			dolibarr_syslog("InfoBox::listBoxes get default box list sql=$sql");
 			$result = $this->db->query($sql);
 			if ($result)
 			{
@@ -129,7 +128,7 @@ class InfoBox
 					$box->position=$obj->position;
 					$box->box_order=$obj->box_order;
 					$box->fk_user=$obj->fk_user;
-					$boxes[$j]=$box;
+					$boxes[]=$box;
 					$j++;
 				}
 			}
@@ -147,12 +146,11 @@ class InfoBox
     /**
      *      \brief      Sauvegarde sequencement des boites pour la zone et le user
      *      \param      $zone       ID de la zone (0 pour la Homepage, ...)
-     *      \param      $boxid      Id des boites
-     *      \param      $boxorder  Liste des boites dans le bon ordre
+     *      \param      $boxorder   Liste des boites dans le bon ordre 'A:123,456,...-B:789,321...'
      *      \param      $userid     Id du user
      *      \return     int         <0 si ko, >= 0 si ok
      */
-	function saveboxorder($zone,$boxid,$boxorder,$userid=0)
+	function saveboxorder($zone,$boxorder,$userid=0)
 	{
 		dolibarr_syslog("InfoBoxes::saveboxorder zone=".$zone." user=".$userid);
 
@@ -176,26 +174,43 @@ class InfoBox
 		$sql.=" WHERE fk_user = ".$userid;
 		$sql.=" AND position = ".$zone;
 		$result = $this->db->query($sql);
+		
+		dolibarr_syslog("InfoBox::saveboxorder sql=".$sql);
 		if ($result)
 		{
-			for ($ii=0, $ni=sizeof($boxid); $ii < $ni; $ii++)
+			$colonnes=split('-',$boxorder);
+			foreach ($colonnes as $collist)
 			{
-				$sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes";
-		    $sql.= "(box_id, position, box_order, fk_user)";
-		    $sql.= " values (";
-		    $sql.= " ".$boxid[$ii].",";
-		    $sql.= " ".$zone.",";
-		    $sql.= " ".($boxorder[$ii]+1).",";
-		    $sql.= " ".$userid;
-		    $sql.= ")";
-		    $result = $this->db->query($sql);
-				if ($result < 0)
+				$part=split(':',$collist);
+				$colonne=$part[0];
+				$list=$part[1];
+				dolibarr_syslog('InfoBox::saveboxorder colonne='.$colonne.' list='.$list);
+				
+				$i=0;
+				$listarray=split(',',$list);
+				foreach ($listarray as $id)
 				{
-					$error++;
-					break;
-				}			
+					//dolibarr_syslog("aaaaa".sizeof($listarray));
+					$i++;
+					$ii=sprintf('%02d',$i);
+					$sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes";
+				    $sql.= "(box_id, position, box_order, fk_user)";
+				    $sql.= " values (";
+				    $sql.= " ".$id.",";
+				    $sql.= " ".$zone.",";
+				    $sql.= " '".$colonne.$ii."',";
+				    $sql.= " ".$userid;
+				    $sql.= ")";
+
+					dolibarr_syslog("InfoBox::saveboxorder sql=".$sql);
+				    $result = $this->db->query($sql);
+					if ($result < 0)
+					{
+						$error++;
+						break;
+					}			
+				}
 			}
-	
 			if ($error)
 			{
 				$this->error=$this->db->error();
@@ -214,7 +229,6 @@ class InfoBox
 			$this->db->rollback();
 			return -1;
 		}
-		
 	}  
 }
 ?>
diff --git a/htdocs/includes/boxes/modules_boxes.php b/htdocs/includes/boxes/modules_boxes.php
index 6274ed6ac25..42974f113f1 100644
--- a/htdocs/includes/boxes/modules_boxes.php
+++ b/htdocs/includes/boxes/modules_boxes.php
@@ -113,7 +113,7 @@ class ModeleBoxes
 
         print "\n\n<!-- Box start -->\n";
         print '<table width="100%" class="noborder"';
-        if (isset($this->boxid)) print ' id="boxobject_'.$this->boxid.'"';
+        if (isset($this->box_id)) print ' id="boxobject_'.$this->box_id.'"';
         print '>';
 
         // Affiche titre de la boite
diff --git a/htdocs/index.php b/htdocs/index.php
index 3b05f2fdb67..77dd0eadaf7 100644
--- a/htdocs/index.php
+++ b/htdocs/index.php
@@ -539,6 +539,8 @@ print '</td></tr></table>';
  *
  */
 $boxarray=$infobox->listboxes("0",$user);       // 0=valeur pour la page accueil
+$boxid_left = array();
+$boxid_right = array();
 
 if (sizeof($boxarray))
 {
@@ -547,49 +549,47 @@ if (sizeof($boxarray))
 	print '<table width="100%" class="notopnoleftnoright">';
 	print '<td>'."\n";
 	
-	$boxid_left = Array();
-	$boxid_right = Array();
-	
 	// Affichage colonne gauche (boites paires)
 	print '<div id="left" style="width: 50%; padding: 0px; margin: 0px; float: left;">'."\n";
-	for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
+	$ii=0;
+	foreach ($boxarray as $key => $box)
 	{
-		if ($ii%2 != 1) // pair
+		//print "xxx".$key."-".$value;
+		if (eregi('^A',$box->box_order)) // colonne A
 		{
-			print '<div style="padding-right: 2px; padding-bottom: 4px;" id="boxto_'.$ii.'">';
+			$ii++;
+			print '<div style="padding-right: 2px; padding-bottom: 4px;" id="boxto_'.$box->box_id.'">';
 			//print 'box_id '.$boxarray[$ii]->box_id.' ';
-		  //print 'box_order '.$boxarray[$ii]->box_order.'<br>';
-		  $boxid_left[$ii] = $boxarray[$ii]->box_id;
-			// Affichage boite ii
-			$box=$boxarray[$ii];
+		    //print 'box_order '.$boxarray[$ii]->box_order.'<br>';
+		    $boxid_left[$key] = $boxarray[$key]->box_id;
+			// Affichage boite key
 			$box->loadBox();
-			$box->boxid="$ii";
 			$box->showBox();
 			
 			print '</div>';
-    }
+		}
 	}
-  print '</div>';
-  print "\n";
+    print '</div>';
+    print "\n";
   
-  // Affichage colonne droite (boites impaires)
-  print '<div id="right" style="width: 50%; padding: 0px; margin: 0px; float: right;">'."\n";
-  for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
+	// Affichage colonne droite (boites impaires)
+	print '<div id="right" style="width: 50%; padding: 0px; margin: 0px; float: right;">'."\n";
+	$ii=0;
+	foreach ($boxarray as $key => $box)
 	{
-		if ($ii%2 == 1) //impair
+		if (eregi('^B',$box->box_order)) // colonne B
 		{
-			print '<div style="padding-left: 2px; padding-bottom: 4px;" id="boxto_'.$ii.'">';
+			$ii++;
+			print '<div style="padding-left: 2px; padding-bottom: 4px;" id="boxto_'.$box->box_id.'">';
 			//print 'box_id '.$boxarray[$ii]->box_id.' ';
-		  //print 'box_order '.$boxarray[$ii]->box_order.'<br>';
-		  $boxid_right[$ii] = $boxarray[$ii]->box_id;
-			// Affichage boite ii
-			$box=$boxarray[$ii];
+		    //print 'box_order '.$boxarray[$ii]->box_order.'<br>';
+		    $boxid_right[$key] = $boxarray[$key]->box_id;
+			// Affichage boite key
 			$box->loadBox();
-			$box->boxid="$ii";
 			$box->showBox();
 			
 			print '</div>';
-    }
+		}
 	}
   print '</div>';
   print "\n";
@@ -600,19 +600,18 @@ if (sizeof($boxarray))
 
 if ($conf->use_ajax)
 {
-	$boxid = join(',',$boxid_left).','.join(',',$boxid_right);
+	//$boxid = join(',',$boxid_left).'-'.join(',',$boxid_right);
 	
 	print '<script type="text/javascript" language="javascript">
 	function updateOrder(){
     var left_list = cleanSerialize(Sortable.serialize(\'left\'));
     var right_list = cleanSerialize(Sortable.serialize(\'right\'));
-    var boxid = \''.$boxid.'\';
-    var boxorder = left_list + \',\' + right_list;
-    //alert( \'boxorder = \' + boxorder );
+    var boxorder = \'A:\' + left_list + \'-B:\' + right_list;
+    //alert( \'boxorder=\' + boxorder );
     var userid = \''.$user->id.'\';
     var url = "ajaxbox.php";
     o_options = new Object();
-    o_options = {asynchronous:true,method: \'get\',parameters: \'boxorder=\' + boxorder + \'&boxid=\' + boxid + \'&userid=\' + userid};
+    o_options = {asynchronous:true,method: \'get\',parameters: \'boxorder=\' + boxorder + \'&userid=\' + userid};
     var myAjax = new Ajax.Request(url, o_options);
   }'."\n";
 	print '// <![CDATA['."\n";
diff --git a/htdocs/lib/lib_head.js b/htdocs/lib/lib_head.js
index 3bc7543d936..cc2b8a6cb47 100644
--- a/htdocs/lib/lib_head.js
+++ b/htdocs/lib/lib_head.js
@@ -644,7 +644,7 @@ function ac_return(field, item){
 ==================================================================*/
 function cleanSerialize(expr) {
 	var reg = new RegExp("(&)", "g");
-	var reg2 = new RegExp("[^0-9,]", "g");
+	var reg2 = new RegExp("[^A-Z0-9,]", "g");
 	var liste1 = expr.replace(reg, ",");
 	var liste = liste1.replace(reg2, "");
 	return liste;
diff --git a/htdocs/theme/eldy/eldy.css.php b/htdocs/theme/eldy/eldy.css.php
index 902da179220..1656beca365 100644
--- a/htdocs/theme/eldy/eldy.css.php
+++ b/htdocs/theme/eldy/eldy.css.php
@@ -876,6 +876,10 @@ border: 0px;
 /*
  *  Boxes
  */
+table.box {
+margin: 2px;
+}
+
 tr.box_titre {
 background: #7699A9;
 background-image: url(<?php echo $dolibarr_main_url_root.'/theme/eldy/img/liste_titre.png' ?>);
@@ -884,6 +888,8 @@ font: 12px arial, helvetica, verdana, sans-serif;
 font-weight: bold;
 border-bottom: 1px solid #FDFFFF;
 white-space: nowrap;
+-moz-border-radius-topleft:6px;
+-moz-border-radius-topright:6px;
 }
 
 tr.box_impair {
diff --git a/mysql/migration/2.1.0-2.2.0.sql b/mysql/migration/2.1.0-2.2.0.sql
index 663cbd539ac..926bcb79a40 100644
--- a/mysql/migration/2.1.0-2.2.0.sql
+++ b/mysql/migration/2.1.0-2.2.0.sql
@@ -814,4 +814,11 @@ INSERT INTO `llx_c_ecotaxe` (`rowid`, `code`, `libelle`, `price`, `organization`
 ALTER TABLE `llx_commandedet` CHANGE `coef` `marge_tx` real DEFAULT NULL;
 ALTER TABLE `llx_propaldet` CHANGE `coef` `marge_tx` real DEFAULT NULL;
 ALTER TABLE llx_commandedet ADD COLUMN marque_tx real DEFAULT NULL after marge_tx;
-ALTER TABLE llx_propaldet ADD COLUMN marque_tx real DEFAULT NULL after marge_tx;
\ No newline at end of file
+ALTER TABLE llx_propaldet ADD COLUMN marque_tx real DEFAULT NULL after marge_tx;
+
+-- Nouveau mode de stockage de l'ordre des box (X99 ou X = colonne et 99 position dans colonne)
+alter table llx_boxes modify box_order varchar(3) NOT NULL;
+update llx_boxes set box_order = concat('A0',box_order) where length(box_order) = 1 and substr(box_order,-1) in ('1','3','5','7','9');
+update llx_boxes set box_order = concat('B0',box_order) where length(box_order) = 1 and substr(box_order,-1) in ('0','2','4','6','8');
+update llx_boxes set box_order = concat('A',box_order) where length(box_order) = 2 and substr(box_order,-1) in ('1','3','5','7','9');
+update llx_boxes set box_order = concat('B',box_order) where length(box_order) = 2 and substr(box_order,-1) in ('0','2','4','6','8');
-- 
GitLab