From 15996acc083aabdb08cdcd55cc539a4b7bd29ea2 Mon Sep 17 00:00:00 2001 From: hickert Date: Tue, 20 Jul 2010 10:13:34 +0000 Subject: [PATCH] Updated Sortable listing -Backported current trunk version of this class. -We got problems while rendering two lists on the same page. Post wasn't captured correctly. git-svn-id: https://oss.gonicus.de/repositories/gosa/branches/2.6@19025 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-core/include/class_sortableListing.inc | 167 ++++++++++++++------ 1 file changed, 117 insertions(+), 50 deletions(-) diff --git a/gosa-core/include/class_sortableListing.inc b/gosa-core/include/class_sortableListing.inc index a30758ebc..7556c8c18 100644 --- a/gosa-core/include/class_sortableListing.inc +++ b/gosa-core/include/class_sortableListing.inc @@ -60,9 +60,27 @@ class sortableListing { // Save data to display $this->setListData($data, $displayData); + // Get list of used IDs + if(!session::is_set('sortableListing_USED_IDS')){ + session::set('sortableListing_USED_IDS',array()); + } + $usedIds = session::get('sortableListing_USED_IDS'); + // Generate instance wide unique ID - $tmp= gettimeofday(); - $this->id= 'l'.md5($tmp['sec']); + $id = ""; + while($id == "" || in_array($id, $usedIds)){ + + // Wait 1 msec to ensure that we definately get a new id + if($id != "") usleep(1); + $tmp= gettimeofday(); + $id = 'l'.md5(microtime().$tmp['sec']); + } + + // Only keep the last 10 list IDsi + $usedIds = array_slice($usedIds, count($usedIds) -10, 10); + $usedIds[] = $id; + session::set('sortableListing_USED_IDS',$usedIds); + $this->id = $id; // Set reorderable flag $this->reorderable= $reorderable; @@ -71,6 +89,15 @@ class sortableListing { } } + public function setReorderable($bool) + { + $this->reorderable= $bool; + } + + public function setDefaultSortColumn($id) + { + $this->sortColumn = $id; + } public function setListData($data, $displayData= null) { @@ -95,12 +122,13 @@ class sortableListing { private function setDisplayData($data) { if (!is_array($data)) { - die ("sortableList needs an array as data!"); + trigger_error ("sortableList needs an array as data!"); } // Transfer information $this->displayData= array(); $this->modes= array(); + $this->mapping= array(); foreach ($data as $key => $value) { $this->displayData[]= $value['data']; if (isset($value['mode'])) { @@ -110,7 +138,9 @@ class sortableListing { $this->keys= array_keys($data); // Create initial mapping - $this->mapping= range(0, abs(count($this->keys)-1)); + if(count($this->keys)){ + $this->mapping= range(0, abs(count($this->keys)-1)); + } $this->current_mapping= $this->mapping; // Find the number of coluns @@ -124,7 +154,9 @@ class sortableListing { // Preset sort orders to 'down' for ($column= 0; $column<$this->columns; $column++) { - $this->sortDirection[]= true; + if(!isset($this->sortDirection[$column])){ + $this->sortDirection[$column]= true; + } } } @@ -185,31 +217,35 @@ class sortableListing { public function render() { - $result= "
\n"; - $result.= "cssclass)?" class='".$this->cssclass."'":"").">\n"; - $action_width= 0; - if (strpos($this->acl, 'w') === false) { - $edit_image= $this->editable?""._("Edit")."":""; - } else { - $edit_image= $this->editable?"":""; - } - if (strpos($this->acl, 'd') === false) { - $delete_image= $this->deleteable?""._("Delete")."":""; - } else { - $delete_image= $this->deleteable?"":""; - } + $result= "
\n"; + $result.= "
cssclass)?" class='".$this->cssclass."'":"").">\n"; + $action_width= 0; + if (strpos($this->acl, 'w') === false) { + $edit_image= $this->editable?""._("Edit")."":""; + } else { + $edit_image= $this->editable?"":""; + } + if (strpos($this->acl, 'd') === false) { + $delete_image= $this->deleteable?""._("Delete")."":""; + } else { + $delete_image= $this->deleteable?"":""; + } // Do we need colspecs? - $action_width= ($this->editable?20:0) + ($this->deleteable?20:0); + $action_width= ($this->editable?30:0) + ($this->deleteable?30:0); if ($this->colspecs) { $result.= " \n"; for ($i= 0; $i<$this->columns; $i++) { - $result.= " \n"; + if(isset($this->colspecs[$i]) && $this->colspecs[$i] != '*'){ + $result.= " \n"; + }else{ + $result.= " \n"; + } } // Extend by another column if we've actions specified if ($action_width) { - $result.= " \n"; + $result.= " \n"; } $result.= " \n"; } @@ -217,18 +253,19 @@ class sortableListing { // Do we need a header? if ($this->header) { $result.= " \n \n"; - $first= " style='border:0'"; + $first= " style='border-left:0'"; for ($i= 0; $i<$this->columns; $i++) { $link= "href='?plug=".$_GET['plug']."&PID=".$this->id."&act=SORT_$i'"; $sorter= ""; if ($i == $this->sortColumn){ - $sorter= " "; + $sorter= " "; } if ($this->reorderable) { $result.= " ".(isset($this->header[$i])?$this->header[$i]:"").""; } else { - $result.= " ".(isset($this->header[$i])?$this->header[$i]:"")."$sorter"; + $result.= " ".(isset($this->header[$i])?$this->header[$i]:"")."$sorter"; } $first= ""; } @@ -243,7 +280,7 @@ class sortableListing { $reorderable= $this->reorderable?"":" style='cursor:default'"; if (strpos($this->acl, 'r') !== false) { foreach ($this->mapping as $nr => $row) { - $editable= $this->editable?" onclick='$(\"edit_".$this->id."_$nr\").click()'":""; + $editable= $this->editable?" onClick='$(\"edit_".$this->id."_$nr\").click()'":""; $id= ""; if (isset($this->modes[$row])) { @@ -262,8 +299,14 @@ class sortableListing { $first= " style='border:0'"; foreach ($this->displayData[$row] as $column) { - $result.= " ".$column."\n"; - $first= ""; + + // Do NOT use the onClick statement for columns that contain links or buttons. + if(preg_match("<.*type=.submit..*>", $column) || preg_match("", $column)){ + $result.= " ".$column."\n"; + }else{ + $result.= " ".$column."\n"; + } + $first= ""; } if ($action_width) { @@ -284,7 +327,7 @@ class sortableListing { $result.= "\n"; $result.= " \n
\n
\n"; - $result.= " \n"; +# $result.= " \n"; $result.= " \n"; $result.= " \n"; @@ -310,26 +353,27 @@ class sortableListing { public function update() { - // Do not do anything if this is not our PID, or there's even no PID available... - if(!isset($_REQUEST['PID']) || $_REQUEST['PID'] != $this->id) { - return; - } // Filter GET with "act" attributes - if (!$this->reorderable && isset($_GET['act'])) { - $key= validate($_GET['act']); - if (preg_match('/^SORT_([0-9]+)$/', $key, $match)) { - // Switch to new column or invert search order? - $column= $match[1]; - if ($this->sortColumn != $column) { - $this->sortColumn= $column; - } else { - $this->sortDirection[$column]= !$this->sortDirection[$column]; - } + if (!$this->reorderable){ + if(isset($_GET['act']) && isset($_GET['PID']) && $this->id == $_GET['PID']) { + + $key= validate($_GET['act']); + if (preg_match('/^SORT_([0-9]+)$/', $key, $match)) { + + // Switch to new column or invert search order? + $column= $match[1]; + if ($this->sortColumn != $column) { + $this->sortColumn= $column; + } else { + $this->sortDirection[$column]= !$this->sortDirection[$column]; + } - // Update mapping according to sort parameters - $this->sortData(); + } } + + // Update mapping according to sort parameters + $this->sortData(); } } @@ -337,7 +381,7 @@ class sortableListing { public function save_object() { // Do not do anything if this is not our PID, or there's even no PID available... - if(!isset($_REQUEST['PID']) || $_REQUEST['PID'] != $this->id) { + if(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->id) { return; } @@ -365,9 +409,10 @@ class sortableListing { } // Delete requested? + $this->action = ""; if (strpos($this->acl, 'd') !== false){ foreach ($_POST as $key => $value) { - if (preg_match('/^del_'.$this->id.'_([0-9]+)_x.*$/', $key, $matches)) { + if (preg_match('/^del_'.$this->id.'_([0-9]+)_x$/', $key, $matches)) { $this->active_index= $this->mapping[$matches[1]]; // Ignore request if mode requests it @@ -390,7 +435,7 @@ class sortableListing { // Edit requested? if (strpos($this->acl, 'w') !== false){ foreach ($_POST as $key => $value) { - if (preg_match('/^edit_'.$this->id.'_([0-9]+)_x.*$/', $key, $matches)) { + if (preg_match('/^edit_'.$this->id.'_([0-9]+)_x$/', $key, $matches)) { $this->active_index= $this->mapping[$matches[1]]; // Ignore request if mode requests it @@ -440,11 +485,10 @@ class sortableListing { public function getMaintainedData() { $tmp= array(); - foreach ($this->mapping as $src => $dst) { - $tmp[$this->keys[$dst]]= $this->data[$dst]; + $realKey = $this->keys[$dst]; + $tmp[$realKey] = $this->data[$realKey]; } - return $tmp; } @@ -463,6 +507,8 @@ class sortableListing { public function sortData() { + if(!count($this->data)) return; + // Extract data $tmp= array(); foreach($this->displayData as $item) { @@ -518,6 +564,23 @@ class sortableListing { $this->mapping[]= count($this->mapping); $this->modified= true; + // Find the number of coluns + reset($this->displayData); + $first= current($this->displayData); + if (is_array($first)) { + $this->columns= count($first); + } else { + $this->columns= 1; + } + + // Preset sort orders to 'down' + for ($column= 0; $column<$this->columns; $column++) { + if(!isset($this->sortDirection[$column])){ + $this->sortDirection[$column]= true; + } + } + + // Sort data after we've added stuff $this->sortData(); } @@ -527,4 +590,8 @@ class sortableListing { return isset($this->keys[$index])?$this->keys[$index]:null; } + public function getData($index) { + $realkey = $this->keys[$index]; + return($this->data[$realkey]); + } } -- 2.30.2