X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_sortableListing.inc;h=06d817806dd777b8e03ed62e42bf0d15d99deec1;hb=0ed9b1739e716b327ca773724ebcfec83eb2904b;hp=0e346f8ade48a520d03a9116d2218963bb11839b;hpb=53553834328f43ffd06c805c940b18738349ab94;p=gosa.git diff --git a/gosa-core/include/class_sortableListing.inc b/gosa-core/include/class_sortableListing.inc index 0e346f8ad..06d817806 100644 --- a/gosa-core/include/class_sortableListing.inc +++ b/gosa-core/include/class_sortableListing.inc @@ -3,7 +3,7 @@ * This code is part of GOsa (http://www.gosa-project.org) * Copyright (C) 2003-2008 GONICUS GmbH * - * ID: $$Id: class_listing.inc 15087 2010-01-06 13:45:49Z hickert $$ + * ID: $$Id$$ * * 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 @@ -30,58 +30,76 @@ class sortableListing { private $id; private $data= array(); + private $keys= array(); private $displayData= array(); private $columns= 0; private $deleteable= false; private $editable= false; + private $colorAlternate= false; private $instantDelete= true; private $action; - private $targets; private $mapping; private $current_mapping; private $active_index; + private $scrollPosition= 0; + private $sortColumn= 0; + private $sortDirection= array(); private $acl= ""; private $modified= false; - function sortableListing($data= array(), $displayData= null) + public function sortableListing($data= array(), $displayData= null, $reorderable= false) { global $config; + // Save data to display + $this->setListData($data, $displayData); + + // Generate instance wide unique ID + $tmp= gettimeofday(); + $this->id= 'l'.md5($tmp['sec']); + + // Set reorderable flag + $this->reorderable= $reorderable; + if (!$reorderable) { + $this->sortData(); + } + } + + + public function setListData($data, $displayData= null) + { // Save data to display $this->setData($data); if (!$displayData) { $displayData= array(); - foreach ($data as $value) { - $displayData[]= array($value); + foreach ($data as $key => $value) { + $displayData[$key]= array($value); } - } else { - $this->setDisplayData($displayData); } - // Generate instance wide unique ID - $tmp= gettimeofday(); - $this->id= 'l'.md5($tmp['sec']); + $this->setDisplayData($displayData); } - function setData($data) + private function setData($data) { $this->data= $data; } - function setDisplayData($data) + private function setDisplayData($data) { if (!is_array($data)) { die ("sortableList needs an array as data!"); } // Transfer information - $this->displayData= $data; + $this->displayData= array_values($data); + $this->keys= array_keys($data); // Create initial mapping - $this->mapping= array_keys($data); + $this->mapping= range(0, abs(count($this->keys)-1)); $this->current_mapping= $this->mapping; // Find the number of coluns @@ -92,66 +110,77 @@ class sortableListing { } else { $this->columns= 1; } + + // Preset sort orders to 'down' + for ($column= 0; $column<$this->columns; $column++) { + $this->sortDirection[]= true; + } } - function setWidth($width) + public function setWidth($width) { $this->width= $width; } - function setInstantDelete($flag) + public function setInstantDelete($flag) { $this->instantDelete= $flag; } - function setEditable($flag) + public function setColorAlternate($flag) + { + $this->colorAlternate= $flag; + } + + + public function setEditable($flag) { $this->editable= $flag; } - function setDeleteable($flag) + public function setDeleteable($flag) { $this->deleteable= $flag; } - function setHeight($height) + public function setHeight($height) { $this->height= $height; } - function setCssClass($css) + public function setCssClass($css) { $this->cssclass= $css; } - function setHeader($header) + public function setHeader($header) { $this->header= $header; } - function setColspecs($specs) + public function setColspecs($specs) { $this->colspecs= $specs; } - function render() + public function render() { - $result= "
\n"; - $result.= "cssclass)?" class='".$this->cssclass."'":"").">\n"; + $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?"":""; + $edit_image= $this->editable?"":""; } if (strpos($this->acl, 'd') === false) { $delete_image= $this->deleteable?""._("Delete")."":""; @@ -164,12 +193,12 @@ class sortableListing { if ($this->colspecs) { $result.= " \n"; for ($i= 0; $i<$this->columns; $i++) { - $result.= " \n"; + $result.= " \n"; } // Extend by another column if we've actions specified if ($action_width) { - $result.= " \n"; + $result.= " \n"; } $result.= " \n"; } @@ -177,8 +206,20 @@ class sortableListing { // Do we need a header? if ($this->header) { $result.= " \n \n"; + $first= " style='border:0'"; for ($i= 0; $i<$this->columns; $i++) { - $result.= " "; + $link= "href='?plug=".$_GET['plug']."&PID=".$this->id."&act=SORT_$i'"; + $sorter= ""; + if ($i == $this->sortColumn){ + $sorter= " "; + } + + if ($this->reorderable) { + $result.= " ".(isset($this->header[$i])?$this->header[$i]:"").""; + } else { + $result.= " ".(isset($this->header[$i])?$this->header[$i]:"")."$sorter"; + } + $first= ""; } if ($action_width) { $result.= ""; @@ -188,11 +229,15 @@ class sortableListing { // Render table body if we've read permission $result.= " \n"; + $reorderable= $this->reorderable?"":" style='cursor:default'"; if (strpos($this->acl, 'r') !== false) { foreach ($this->mapping as $nr => $row) { - $result.= " \n"; + $editable= $this->editable?" onclick='$(\"edit_".$this->id."_$nr\").click()'":""; + $result.= " \n"; + $first= " style='border:0'"; foreach ($this->displayData[$row] as $column) { - $result.= " \n"; + $result.= " ".htmlentities($column)."\n"; + $first= ""; } if ($action_width) { $result.= "\n"; } - } else { - $result.= " \n"; } + // Add spacer + $result.= " "; + $num= $action_width?$this->columns:$this->columns-1; + for ($i= 0; $i<$num; $i++) { + $result.= ""; + } + $result.= "\n"; + $result.= " \n
".(isset($this->header[$i])?$this->header[$i]:"")." 
".htmlentities($column)."".str_replace('%ID', "edit_".$this->id."_$nr", $edit_image). @@ -200,27 +245,34 @@ class sortableListing { } $result.= "
\n
\n"; + $result.= " \n"; $result.= " \n"; $result.= " \n"; // Append script stuff if needed $result.= ''; @@ -228,11 +280,37 @@ class sortableListing { } - function update() + 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]; + } + + // Update mapping according to sort parameters + $this->sortData(); + } + } + // Do not do anything if we're not posted - or have no permission if (strpos($this->acl, 'w') !== false && isset($_POST['reorder_'.$this->id])){ + if (isset($_POST['position_'.$this->id]) && is_numeric($_POST['position_'.$this->id])) { + $this->scrollPosition= $_POST['position_'.$this->id]; + } + // Move requested? $move= $_POST['reorder_'.$this->id]; if ($move != "") { @@ -274,7 +352,7 @@ class sortableListing { } - function getAction() + public function getAction() { // Do not do anything if we're not posted if(!isset($_POST['reorder_'.$this->id])) { @@ -293,7 +371,7 @@ class sortableListing { } - function deleteEntry($id) + private function deleteEntry($id) { // Remove mapping $index= array_search($id, $this->mapping); @@ -305,27 +383,91 @@ class sortableListing { } - function getMaintainedData() + public function getMaintainedData() { $tmp= array(); foreach ($this->mapping as $src => $dst) { - $tmp[$src]= $this->data[$dst]; + $tmp[$this->keys[$dst]]= $this->data[$dst]; } return $tmp; } - function isModified() + public function isModified() { return $this->modified; } - function setAcl($acl) + public function setAcl($acl) { $this->acl= $acl; } + + public function sortData() + { + // Extract data + $tmp= array(); + foreach($this->displayData as $item) { + if (isset($item[$this->sortColumn])){ + $tmp[]= $item[$this->sortColumn]; + } else { + $tmp[]= ""; + } + } + + // Sort entries + if ($this->sortDirection[$this->sortColumn]) { + asort($tmp); + } else { + arsort($tmp); + } + + // Adapt mapping accordingly + $this->mapping= array(); + foreach ($tmp as $key => $value) { + $this->mapping[]= $key; + } + } + + + public function addEntry($entry, $displayEntry= null, $key= null) + { + // Only add if not already there + if (!$key) { + if (in_array($entry, $this->data)) { + return; + } + } else { + if (isset($this->data[$key])) { + return; + } + } + + // Prefill with default value if not specified + if (!$displayEntry) { + $displayEntry= array($entry); + } + + // Append to data and mapping + if ($key) { + $this->data[$key]= $entry; + $this->keys[]= $key; + } else { + $this->data[]= $entry; + $this->keys[]= count($this->mapping); + } + $this->displayData[]= $displayEntry; + $this->mapping[]= count($this->mapping); + $this->modified= true; + } + + + public function getKey($index) { + return isset($this->keys[$index])?$this->keys[$index]:null; + } + }