Code

We're html5, right?
[gosa.git] / gosa-core / include / class_listing.inc
index 8b32798177430cd6ccb8940de0e4f19dc4d9f6ad..225509525ad1420ae3c3b97d4b2ddb220d2473ec 100644 (file)
@@ -28,6 +28,7 @@ class listing {
   var $departmentBrowser= false;
   var $departmentRootVisible= false;
   var $multiSelect= false;
+  var $singleSelect= false;
   var $template;
   var $headline;
   var $base;
@@ -56,7 +57,7 @@ class listing {
   var $baseSelector;
 
 
-  function listing($filename)
+  function listing($source, $isString = FALSE)
   {
     global $config;
     global $class_mapping;
@@ -64,8 +65,14 @@ class listing {
     // Initialize pid
     $this->pid= preg_replace("/[^0-9]/", "", microtime(TRUE));
 
-    if (!$this->load($filename)) {
-      die("Cannot parse $filename!");
+    if($isString){
+        if(!$this->loadString($source)){
+            die("Cannot parse $source!");
+        }
+    }else{
+        if (!$this->loadFile($source)) {
+            die("Cannot parse $source!");
+        }
     }
 
     // Set base for filter
@@ -80,7 +87,7 @@ class listing {
     }
 
     // Move footer information
-    $this->showFooter= ($config->get_cfg_value("listSummary") == "true");
+    $this->showFooter= ($config->get_cfg_value("core","listSummary") == "true");
 
     // Register build in filters
     $this->registerElementFilter("objectType", "listing::filterObjectType");
@@ -147,10 +154,13 @@ class listing {
     return false;
   }
 
+  function loadFile($filename)
+  {
+    return($this->loadString(file_get_contents($filename)));
+  }
 
-  function load($filename)
+  function loadString($contents)
   {
-    $contents = file_get_contents($filename);
     $this->xmlData= xml::xml2array($contents, 1);
 
     if (!isset($this->xmlData['list'])) {
@@ -160,7 +170,7 @@ class listing {
     $this->xmlData= $this->xmlData["list"];
 
     // Load some definition values
-    foreach (array("departmentBrowser", "departmentRootVisible", "multiSelect", "baseMode") as $token) {
+    foreach (array("departmentBrowser", "departmentRootVisible", "multiSelect","singleSelect", "baseMode") as $token) {
       if (isset($this->xmlData['definition'][$token]) &&
           $this->xmlData['definition'][$token] == "true"){
         $this->$token= true;
@@ -244,7 +254,7 @@ class listing {
             isset($config['sortType'])) {
           $this->sortAttribute= $config['sortAttribute'];
           $this->sortType= $config['sortType'];
-          $sorter= " ".image("images/lists/sort-".($this->sortDirection[$index]?"up":"down").".png", null, $this->sortDirection[$index]?_("Up"):_("Down"), "text-top");
+          $sorter= " ".image("images/lists/sort-".($this->sortDirection[$index]?"up":"down").".png", null, $this->sortDirection[$index]?_("Sort ascending"):_("Sort descending"), "text-top");
         }
         $sortable= (isset($config['sortAttribute']));
 
@@ -294,16 +304,23 @@ class listing {
     
     $result.= "<div class='listContainer' id='d_scrollbody' style='min-height:".($height+25)."px;'>\n";
     $result.= "<table summary='$this->headline' style='width:100%;table-layout:fixed' cellspacing='0' cellpadding='0' id='t_scrolltable'>\n";
-    $this->numColumns= count($this->colprops) + ($this->multiSelect?1:0);
+    $this->numColumns= count($this->colprops) + (($this->multiSelect|$this->singleSelect)?1:0);
 
     // Build list header
     $result.= "<thead class='fixedListHeader listHeaderFormat'><tr>\n";
-    if ($this->multiSelect) {
+    if ($this->multiSelect || $this->singleSelect) {
       $width= "24px";
       if (preg_match('/Konqueror/i', $_SERVER['HTTP_USER_AGENT'])){
         $width= "28px";
       }
-      $result.= "<td class='listheader' style='text-align:center;padding:0;width:$width;'><input type='checkbox' id='select_all' name='select_all' title='"._("Select all")."' onClick='toggle_all_(\"listing_selected_[0-9]*$\",\"select_all\");' ></td>\n";
+      $result.= "<td class='listheader' style='text-align:center;padding:0;width:$width;'>";
+      if($this->multiSelect){
+          $result.= "<input type='checkbox' id='select_all' name='select_all' 
+              title='"._("Select all")."' onClick='toggle_all_(\"listing_selected_[0-9]*$\",\"select_all\");' >";
+      }else{
+          $result.= "&nbsp;";
+      }
+      $result.="</td>\n";
     }
     foreach ($this->header as $header) {
       $result.= $header;
@@ -328,11 +345,11 @@ class listing {
       // Fill with department browser if configured this way
       $departmentIterator= new departmentSortIterator($this->departments, $this->sortDirection[$this->sortColumn]);
       foreach ($departmentIterator as $row => $entry){
-        $result.="<tr>";
+        $rowResult= "<tr>";
 
         // Render multi select if needed
-        if ($this->multiSelect) {
-          $result.="<td style='text-align:center;padding:0;' class='list1'>&nbsp;</td>";
+        if ($this->multiSelect || $this->singleSelect) {
+          $rowResult.="<td style='text-align:center;padding:0;' class='list1'>&nbsp;</td>";
         }
 
         // Render defined department columns, fill the rest with some stuff
@@ -343,19 +360,27 @@ class listing {
             $colspan= $config['span'];
             $this->useSpan= true;
           }
-          $result.="<td colspan='$colspan' ".$this->colprops[$index]." class='list1'>".$this->renderCell($config['value'], $entry, $row)."</td>";
+          $rowResult.="<td colspan='$colspan' ".$this->colprops[$index]." class='list1'>".$this->renderCell($config['value'], $entry, $row)."</td>";
           $rest-= $colspan;
         }
 
         // Fill remaining cols with nothing
         $last= $this->numColumns - $rest;
         for ($i= 0; $i<$rest; $i++){
-          $result.= "<td ".$this->colprops[$last+$i-1]." class='list1'>&nbsp;</td>";
+          $rowResult.= "<td ".$this->colprops[$last+$i-1]." class='list1'>&nbsp;</td>";
         }
-        $result.="</tr>";
+        $rowResult.="</tr>";
 
+        // Apply label to objecttype icon?
+        if (preg_match("/<objectType:([^:]+):(.*)\/>/i", $rowResult, $matches)){
+            $objectType= image($matches[1], null, LDAP::fix(base64_decode($matches[2])));
+            $rowResult= preg_replace("/<objectType[^>]+>/", $objectType, $rowResult);
+        }
+        $result.= $rowResult;
         $alt++;
       }
+
+
       $deps= $alt;
     }
 
@@ -368,6 +393,10 @@ class listing {
         $trow.="<td style='text-align:center;width:20px;' class='list0'><input type='checkbox' id='listing_selected_$row' name='listing_selected_$row'></td>\n";
       }
 
+      if ($this->singleSelect) {
+        $trow.="<td style='text-align:center;width:20px;' class='list0'><input type='radio' id='listing_radio_selected_$row' name='listing_radio_selected' value='{$row}'></td>\n";
+      }
+
       foreach ($this->xmlData['table']['column'] as $index => $config) {
         $renderedCell= $this->renderCell($config['value'], $entry, $row);
         $trow.="<td ".$this->colprops[$index]." class='list0'>".$renderedCell."</td>\n";
@@ -389,6 +418,17 @@ class listing {
     $entryIterator= new listingSortIterator($this->entries, $this->sortDirection[$this->sortColumn], "_sort".$this->sortColumn, $this->sortType);
     foreach ($entryIterator as $row => $entry){
 
+      // Apply label to objecttype icon?
+       if (preg_match("/<objectType:([^:]+):(.*)\/>/i", $entry['_rendered'], $matches)){
+           if (preg_match("/<rowLabel:([a-z0-9_-]*)\/>/i", $entry['_rendered'], $m)) {
+               $objectType= image($matches[1]."[".$m[1]."]", null, LDAP::fix(base64_decode($matches[2])));
+           } else {
+               $objectType= image($matches[1], null, LDAP::fix(base64_decode($matches[2])));
+           }
+           $entry['_rendered']= preg_replace("/<objectType[^>]+>/", $objectType, $entry['_rendered']);
+           $entry['_rendered']= preg_replace("/<rowLabel[^>]+>/", '', $entry['_rendered']);
+      }
+
       // Apply custom class to row?
       if (preg_match("/<rowClass:([a-z0-9_-]*)\/>/i", $entry['_rendered'], $matches)) {
         $result.="<tr class='".$matches[1]."'>\n";
@@ -448,7 +488,7 @@ class listing {
     $result.= '</script>';
 
     $smarty= get_smarty();
-    $smarty->assign("usePrototype", "true");
+
     $smarty->assign("FILTER", $this->filter->render());
     $smarty->assign("SIZELIMIT", print_sizelimit_warning());
     $smarty->assign("LIST", $result);
@@ -490,6 +530,7 @@ class listing {
     // Take care of base selector
     if ($this->baseMode) {
       $this->baseSelector->update();
+
       // Check if a wrong base was supplied
       if(!$this->baseSelector->checkLastBaseUpdate()){
          msg_dialog::display(_("Error"), msgPool::check_base(), ERROR_DIALOG);
@@ -834,7 +875,7 @@ class listing {
     $objectType= $this->getObjectType($this->objectTypes, $classes);
     if ($objectType) {
       $this->objectDnMapping[$dn]= $objectType["objectClass"];
-      $result= image($objectType["image"], null, LDAP::fix($dn));
+      $result= "<objectType:".$objectType["image"].":".base64_encode(LDAP::fix($dn))."/>";
       if (!isset($this->objectTypeCount[$objectType['label']])) {
         $this->objectTypeCount[$objectType['label']]= 0;
       }
@@ -1013,17 +1054,17 @@ class listing {
 
     /* Draw back button */
     if($enableBack){
-      $result["BACK"]= image('images/lists/back.png', 'BACK', _("Go up one department"));
+      $result["BACK"]= image('images/lists/back.png', 'BACK', _("Go to preceding level"));
     }else{
-      $result["BACK"]= image('images/lists/back-grey.png', null, _("Go up one department"));
+      $result["BACK"]= image('images/lists/back-grey.png', null, _("Go to preceding level"));
     }
 
     /* Draw home button */
    /* Draw home button */
     if($enableHome){
-      $result["HOME"]= image('images/lists/home.png', 'HOME', _("Go to users department"));
+      $result["HOME"]= image('images/lists/home.png', 'HOME', _("Go to current users level"));
     }else{
-      $result["HOME"]= image('images/lists/home-grey.png', null, _("Go to users department"));
+      $result["HOME"]= image('images/lists/home-grey.png', null, _("Go to current users level"));
     }
 
 
@@ -1064,6 +1105,12 @@ class listing {
       return $result;
     }
 
+    // Get single selection (radio box)
+    if($this->singleSelect && isset($_POST['listing_radio_selected'])){
+        $entry = $_POST['listing_radio_selected'];
+        $result['targets']= array($this->entries[$entry]['dn']);
+    }
+
     // Filter POST with "listing_" attributes
     foreach ($_POST as $key => $prop) {
 
@@ -1532,7 +1579,7 @@ class listing {
 
       // Draw snapshot button
       if($ui->allow_snapshot_create($dn, $category)){
-          $result.= image('images/snapshot.png', "listing_snapshot_$row", _("Create a new snapshot from this object"));
+          $result.= image('images/snapshot.png', "listing_snapshot_$row", _("Create new snapshot for this object"));
       }else{
           $result.= image('images/empty.png');
       }
@@ -1580,6 +1627,7 @@ class listing {
 
   function getType($dn)
   {
+    $dn = LDAP::fix($dn);
     if (isset($this->objectDnMapping[$dn])) {
       return $this->objectDnMapping[$dn];
     }