X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_listing.inc;h=225509525ad1420ae3c3b97d4b2ddb220d2473ec;hb=0d0212e3580dd226418612cee85b6d08f8a5399d;hp=dfa01839be2b14e4d349917389ebbe1055a26013;hpb=d100decf4aec5185e984f23a717e505ef50a7bb6;p=gosa.git diff --git a/gosa-core/include/class_listing.inc b/gosa-core/include/class_listing.inc index dfa01839b..225509525 100644 --- a/gosa-core/include/class_listing.inc +++ b/gosa-core/include/class_listing.inc @@ -28,9 +28,9 @@ class listing { var $departmentBrowser= false; var $departmentRootVisible= false; var $multiSelect= false; + var $singleSelect= false; var $template; var $headline; - var $module; var $base; var $sortDirection= null; var $sortColumn= null; @@ -42,6 +42,7 @@ class listing { var $header= array(); var $colprops= array(); var $filters= array(); + var $filter= null; var $pid; var $objectTypes= array(); var $objectTypeCount= array(); @@ -52,9 +53,11 @@ class listing { var $exportColumns= array(); var $useSpan= false; var $height= 0; + var $scrollPosition= 0; + var $baseSelector; - function listing($filename) + function listing($source, $isString = FALSE) { global $config; global $class_mapping; @@ -62,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 @@ -78,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"); @@ -95,6 +104,9 @@ class listing { } } } + + // Instanciate base selector + $this->baseSelector= new baseSelector($this->bases, $this->base); } @@ -116,6 +128,12 @@ class listing { } + function getFilter() + { + return($this->filter); + } + + function setFilter($filter) { $this->filter= &$filter; @@ -136,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'])) { @@ -149,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; @@ -159,7 +180,7 @@ class listing { // Fill objectTypes from departments and xml definition $types = departmentManagement::get_support_departments(); foreach ($types as $class => $data) { - $this->objectTypes[]= array("label" => $data['TITLE'], + $this->objectTypes[$data['OC']]= array("label" => $data['TITLE'], "objectClass" => $data['OC'], "image" => $data['IMG']); } @@ -169,12 +190,14 @@ class listing { $this->xmlData['definition']['objectType']= array($this->xmlData['definition']['objectType']); } foreach ($this->xmlData['definition']['objectType'] as $index => $otype) { - $this->objectTypes[]= $this->xmlData['definition']['objectType'][$index]; + $tmp = $this->xmlData['definition']['objectType'][$index]; + $this->objectTypes[$tmp['objectClass']]= $tmp; if (isset($this->xmlData['definition']['objectType'][$index]['category'])){ - $this->categories[]= $this->xmlData['definition']['objectType'][$index]['category']; + $this->categories[]= $otype['category']; } } } + $this->objectTypes = array_values($this->objectTypes); // Parse layout per column $this->colprops= $this->parseLayout($this->xmlData['table']['layout']); @@ -182,9 +205,8 @@ class listing { // Prepare table headers $this->renderHeader(); - // Assign headline/module + // Assign headline/Categories $this->headline= _($this->xmlData['definition']['label']); - $this->module= $this->xmlData['definition']['module']; if (!is_array($this->categories)){ $this->categories= array($this->categories); } @@ -232,21 +254,21 @@ class listing { isset($config['sortType'])) { $this->sortAttribute= $config['sortAttribute']; $this->sortType= $config['sortType']; - $sorter= " "; + $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'])); $link= "href='?plug=".$_GET['plug']."&PID=".$this->pid."&act=SORT_$index'"; if (isset($config['label'])) { if ($sortable) { - $this->header[$index]= "colprops[$index].">"._($config['label'])."$sorter"; + $this->header[$index]= "colprops[$index].">"._($config['label'])."$sorter"; } else { $this->header[$index]= "colprops[$index].">"._($config['label']).""; } $this->plainHeader[]= _($config['label']); } else { if ($sortable) { - $this->header[$index]= "colprops[$index]."> $sorter"; + $this->header[$index]= "colprops[$index]."> $sorter"; } else { $this->header[$index]= "colprops[$index]."> "; } @@ -267,35 +289,38 @@ class listing { // Some browsers don't have the ability do do scrollable table bodies, filter them // here. $switch= false; - if (preg_match('/(Opera|Konqueror|Safari|msie)/i', $_SERVER['HTTP_USER_AGENT'])){ + if (preg_match('/(Opera|Konqueror|Safari)/i', $_SERVER['HTTP_USER_AGENT'])){ $switch= true; } // Initialize list $result= "\n"; + $result.= "\n"; $height= 450; if ($this->height != 0) { $result.= "\n"; $height= $this->height; } - $result.= ""; + $result.= "
\n"; - - $height= ""; - if ($switch){ - $height= "height:100%;"; - } - $result.= "\n"; - $this->numColumns= count($this->colprops) + ($this->multiSelect?1:0); + $result.= "
\n"; + $result.= "
\n"; + $this->numColumns= count($this->colprops) + (($this->multiSelect|$this->singleSelect)?1:0); // Build list header $result.= "\n"; - if ($this->multiSelect) { + if ($this->multiSelect || $this->singleSelect) { $width= "24px"; if (preg_match('/Konqueror/i', $_SERVER['HTTP_USER_AGENT'])){ $width= "28px"; } - $result.= "\n"; + $result.= "\n"; } foreach ($this->header as $header) { $result.= $header; @@ -307,7 +332,7 @@ class listing { // No results? Just take an empty colspanned row if (count($this->entries) + count($this->departments) == 0) { - $result.= ""; + $result.= ""; } // Line color alternation @@ -320,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.=""; + $rowResult= ""; // Render multi select if needed - if ($this->multiSelect) { - $result.=""; + if ($this->multiSelect || $this->singleSelect) { + $rowResult.=""; } // Render defined department columns, fill the rest with some stuff @@ -335,19 +360,27 @@ class listing { $colspan= $config['span']; $this->useSpan= true; } - $result.=""; + $rowResult.=""; $rest-= $colspan; } // Fill remaining cols with nothing $last= $this->numColumns - $rest; for ($i= 0; $i<$rest; $i++){ - $result.= ""; + $rowResult.= ""; } - $result.=""; + $rowResult.=""; + // Apply label to objecttype icon? + if (preg_match("//i", $rowResult, $matches)){ + $objectType= image($matches[1], null, LDAP::fix(base64_decode($matches[2]))); + $rowResult= preg_replace("/]+>/", $objectType, $rowResult); + } + $result.= $rowResult; $alt++; } + + $deps= $alt; } @@ -360,6 +393,10 @@ class listing { $trow.="\n"; } + if ($this->singleSelect) { + $trow.="\n"; + } + foreach ($this->xmlData['table']['column'] as $index => $config) { $renderedCell= $this->renderCell($config['value'], $entry, $row); $trow.="\n"; @@ -380,10 +417,29 @@ class listing { // Complete list by sorting entries for _sort$index and appending them to the output $entryIterator= new listingSortIterator($this->entries, $this->sortDirection[$this->sortColumn], "_sort".$this->sortColumn, $this->sortType); foreach ($entryIterator as $row => $entry){ - $alt++; - $result.="\n"; - $result.= $entry['_rendered']; + + // Apply label to objecttype icon? + if (preg_match("//i", $entry['_rendered'], $matches)){ + if (preg_match("//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, $entry['_rendered']); + $entry['_rendered']= preg_replace("/]+>/", '', $entry['_rendered']); + } + + // Apply custom class to row? + if (preg_match("//i", $entry['_rendered'], $matches)) { + $result.="\n"; + $result.= preg_replace("/]+>/", '', $entry['_rendered']); + } else { + $result.="\n"; + $result.= $entry['_rendered']; + } + $result.="\n"; + $alt++; } // Need to fill the list if it's not full (nobody knows why this is 22 ;-)) @@ -398,35 +454,41 @@ class listing { if ($i != $this->numColumns-1) { $result.= ""; } else { - $result.= ""; + $result.= ""; } } + $result.= ""; } // Close list body - $result.= "
"; + if($this->multiSelect){ + $result.= ""; + }else{ + $result.= " "; + } + $result.="
 
 
  colprops[$index]." class='list1'>".$this->renderCell($config['value'], $entry, $row)."colprops[$index]." class='list1'>".$this->renderCell($config['value'], $entry, $row)."colprops[$last+$i-1]." class='list1'> colprops[$last+$i-1]." class='list1'> 
colprops[$index]." class='list0'>".$renderedCell."
   
"; // Add the footer if requested if ($this->showFooter) { - $result.= ""; + $result.= "
"; foreach ($this->objectTypes as $objectType) { if (isset($this->objectTypeCount[$objectType['label']])) { $label= _($objectType['label']); - $result.= "$label ".$this->objectTypeCount[$objectType['label']]."    "; + $result.= image($objectType['image'], null, $label)." ".$this->objectTypeCount[$objectType['label']]."  "; } } - $result.= ""; + $result.= "
"; } // Close list - $result.= ""; $result.= $switch?"":""; + // Add scroll positioner + $result.= ''; + $smarty= get_smarty(); - $smarty->assign("usePrototype", "true"); + $smarty->assign("FILTER", $this->filter->render()); $smarty->assign("SIZELIMIT", print_sizelimit_warning()); $smarty->assign("LIST", $result); @@ -438,6 +500,7 @@ class listing { } // Assign action menu / base + $smarty->assign("HEADLINE", $this->headline); $smarty->assign("ACTIONS", $this->renderActionMenu()); $smarty->assign("BASE", $this->renderBase()); @@ -447,7 +510,15 @@ class listing { // Assign summary $smarty->assign("HEADLINE", $this->headline); - return ($smarty->fetch(get_template_path($this->xmlData['definition']['template'], true))); + // Try to load template from plugin the folder first... + $file = get_template_path($this->xmlData['definition']['template'], true); + + // ... if this fails, try to load the file from the theme folder. + if(!file_exists($file)){ + $file = get_template_path($this->xmlData['definition']['template']); + } + + return ($smarty->fetch($file)); } @@ -456,92 +527,115 @@ class listing { global $config; $ui= get_userinfo(); + // 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); + } + } + + // Save base + $refresh= false; + if ($this->baseMode) { + $this->base= $this->baseSelector->getBase(); + session::global_set("CurrentMainBase", $this->base); + $refresh= true; + } + + // Reset object counter / DN mapping $this->objectTypeCount= array(); $this->objectDnMapping= array(); // Do not do anything if this is not our PID - if(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->pid) { - return; - } + if($refresh || !(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->pid)) { - // Save base - if (isset($_POST['BASE']) && $this->baseMode) { - $base= get_post('BASE'); - if (isset($this->bases[$base])) { - $this->base= $base; - session::global_set("CurrentMainBase", $this->base); + // Save position if set + if (isset($_POST['position_'.$this->pid]) && is_numeric($_POST['position_'.$this->pid])) { + $this->scrollPosition= $_POST['position_'.$this->pid]; } - } - // Override the base if we got a message from the browser navigation - if ($this->departmentBrowser && isset($_GET['act'])) { - if (preg_match('/^department_([0-9]+)$/', validate($_GET['act']), $match)){ - if (isset($this->departments[$match[1]])){ - $this->base= $this->departments[$match[1]]['dn']; - session::global_set("CurrentMainBase", $this->base); + // Override the base if we got a message from the browser navigation + if ($this->departmentBrowser && isset($_GET['act'])) { + if (preg_match('/^department_([0-9]+)$/', validate($_GET['act']), $match)){ + if (isset($this->departments[$match[1]])){ + $this->base= $this->departments[$match[1]]['dn']; + if ($this->baseMode) { + $this->baseSelector->setBase($this->base); + } + session::global_set("CurrentMainBase", $this->base); + } } } - } - // Filter POST with "act" attributes -> posted from action menu - if (isset($_POST['exec_act']) && $_POST['act'] != '') { - if (preg_match('/^export.*$/', $_POST['act']) && isset($this->exporter[$_POST['act']])) { - $exporter= $this->exporter[$_POST['act']]; - $userinfo= ", "._("created by")." ".$ui->cn." - ".strftime('%A, %d. %B %Y, %H:%M:%S'); - $entryIterator= new listingSortIterator($this->entries, $this->sortDirection[$this->sortColumn], "_sort".$this->sortColumn, $this->sortType); - $sortedEntries= array(); - foreach ($entryIterator as $entry){ - $sortedEntries[]= $entry; + // Filter POST with "act" attributes -> posted from action menu + if (isset($_POST['exec_act']) && $_POST['act'] != '') { + if (preg_match('/^export.*$/', $_POST['act']) && isset($this->exporter[$_POST['act']])) { + $exporter= $this->exporter[$_POST['act']]; + $userinfo= ", "._("created by")." ".$ui->cn." - ".strftime('%A, %d. %B %Y, %H:%M:%S'); + $entryIterator= new listingSortIterator($this->entries, $this->sortDirection[$this->sortColumn], "_sort".$this->sortColumn, $this->sortType); + $sortedEntries= array(); + foreach ($entryIterator as $entry){ + $sortedEntries[]= $entry; + } + $instance= new $exporter['class']($this->headline.$userinfo, $this->plainHeader, $sortedEntries, $this->exportColumns); + $type= call_user_func(array($exporter['class'], "getInfo")); + $type= $type[$_POST['act']]; + send_binary_content($instance->query(), $type['filename'], $type= $type['mime']); } - $instance= new $exporter['class']($this->headline.$userinfo, $this->plainHeader, $sortedEntries, $this->exportColumns); - $type= call_user_func(array($exporter['class'], "getInfo")); - $type= $type[$_POST['act']]; - send_binary_content($instance->query(), $type['filename'], $type= $type['mime']); } - } - // Filter GET with "act" attributes - if (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]; - } + // Filter GET with "act" attributes + if (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]; + } - // Allow header to update itself according to the new sort settings - $this->renderHeader(); + // Allow header to update itself according to the new sort settings + $this->renderHeader(); + } } - } - // Override base if we got signals from the navigation elements - $action= ""; - foreach ($_POST as $key => $value) { - if (preg_match('/^(ROOT|BACK|HOME)_x$/', $key, $match)) { - $action= $match[1]; - break; + // Override base if we got signals from the navigation elements + $action= ""; + foreach ($_POST as $key => $value) { + if (preg_match('/^(ROOT|BACK|HOME)(_x)?$/', $key, $match)) { + $action= $match[1]; + break; + } } - } - // Navigation handling - if ($action == 'ROOT') { - $deps= $ui->get_module_departments($this->module); - $this->base= $deps[0]; - } - if ($action == 'BACK') { - $deps= $ui->get_module_departments($this->module); - $base= preg_replace("/^[^,]+,/", "", $this->base); - if(in_array_ics($base, $deps)){ - $this->base= $base; + // Navigation handling + if ($action == 'ROOT') { + $deps= $ui->get_module_departments($this->categories); + $this->base= $deps[0]; + $this->baseSelector->setBase($this->base); + session::global_set("CurrentMainBase", $this->base); + } + if ($action == 'BACK') { + $deps= $ui->get_module_departments($this->categories); + $base= preg_replace("/^[^,]+,/", "", $this->base); + if(in_array_ics($base, $deps)){ + $this->base= $base; + $this->baseSelector->setBase($this->base); + session::global_set("CurrentMainBase", $this->base); + } + } + if ($action == 'HOME') { + $ui= get_userinfo(); + $this->base= get_base_from_people($ui->dn); + $this->baseSelector->setBase($this->base); + session::global_set("CurrentMainBase", $this->base); } - } - if ($action == 'HOME') { - $ui= get_userinfo(); - $this->base= $this->filter->getObjectBase($ui->dn); } // Reload departments @@ -552,12 +646,20 @@ class listing { // Update filter and refresh entries $this->filter->setBase($this->base); $this->entries= $this->filter->query(); + + // Fix filter if querie returns NULL + if ($this->entries == null) { + $this->entries= array(); + } } function setBase($base) { $this->base= $base; + if ($this->baseMode) { + $this->baseSelector->setBase($this->base); + } } @@ -572,12 +674,12 @@ class listing { $result= array(); $layout= preg_replace("/^\|/", "", $layout); $layout= preg_replace("/\|$/", "", $layout); - $cols= split("\|", $layout); + $cols= explode("|", $layout); foreach ($cols as $index => $config) { if ($config != "") { $res= ""; - $components= split(';', $config); + $components= explode(';', $config); foreach ($components as $part) { if (preg_match("/^r$/", $part)) { $res.= "text-align:right;"; @@ -602,15 +704,18 @@ class listing { $res.= "min-width:200px;"; } - $result[$index]= " style='$res' "; + $result[$index]= " style='$res'"; } else { - $result[$index]= " style='min-width:100px'"; + $result[$index]= " style='min-width:100px;'"; } } // Save number of columns for later use $this->numColumns= count($cols); + // Add no border to the last column + $result[$this->numColumns-1]= preg_replace("/'$/", "border-right:0;'", $result[$this->numColumns-1]); + return $result; } @@ -646,35 +751,7 @@ class listing { return; } - $result= ""; - - // Reset the currently used base to the first DN we found if there - // was no match. - if(!$found){ - $this->base = $firstDN; - } - - return $result; + return $this->baseSelector->render(); } @@ -704,21 +781,31 @@ class listing { // Row is replaced by the row number if ($param == "row") { $params[]= $row; + continue; } // pid is replaced by the current PID if ($param == "pid") { $params[]= $this->pid; + continue; } // base is replaced by the current base if ($param == "base") { $params[]= $this->getBase(); + continue; } // Fixie with "" is passed directly if (preg_match('/^".*"$/', $param)){ $params[]= preg_replace('/"/', '', $param); + continue; + } + + // Move dn if needed + if ($param == "dn") { + $params[]= LDAP::fix($config["dn"]); + continue; } // LDAP variables get replaced by their objects @@ -729,13 +816,9 @@ class listing { unset($values['count']); } $params[]= $values; + break; } } - - // Move dn if needed - if ($param == "dn") { - $params[]= LDAP::fix($config["dn"]); - } } // Replace information @@ -792,7 +875,7 @@ class listing { $objectType= $this->getObjectType($this->objectTypes, $classes); if ($objectType) { $this->objectDnMapping[$dn]= $objectType["objectClass"]; - $result= ""; + $result= ""; if (!isset($this->objectTypeCount[$objectType['label']])) { $this->objectTypeCount[$objectType['label']]= 0; } @@ -813,25 +896,30 @@ class listing { // Go thru all actions $result= ""; $actions= $this->xmlData['actiontriggers']['action']; + + // Ensure we've a valid actions array, if there is only one action in the actiontriggers col + // then we've to create a valid array here. + if(isset($actions['name'])) $actions = array($actions); + foreach($actions as $action) { // Skip the entry completely if there's no permission to execute it - if (!$this->hasActionPermission($action, $dn)) { - $result.= " "; + if (!$this->hasActionPermission($action, $dn, $classes)) { + $result.= image('images/empty.png'); continue; } // Skip entry if the pseudo filter does not fit if (isset($action['filter']) && preg_match('/^[a-z0-9_]+!?=[a-z0-9_]+$/i', $action['filter'])) { - list($fa, $fv)= split('=', $action['filter']); + list($fa, $fv)= explode('=', $action['filter']); if (preg_match('/^(.*)!$/', $fa, $m)){ $fa= $m[1]; if (isset($this->entries[$row][$fa]) && $this->entries[$row][$fa][0] == $fv) { - $result.= " "; + $result.= image('images/empty.png'); continue; } } else { if (!isset($this->entries[$row][$fa]) && !$this->entries[$row][$fa][0] == $fv) { - $result.= " "; + $result.= image('images/empty.png'); continue; } } @@ -845,12 +933,17 @@ class listing { if (preg_match('/^!(.*)$/', $objectclass, $m)){ $objectclass= $m[1]; if(in_array($objectclass, $classes)) { - $result.= " "; + $result.= image('images/empty.png'); continue; } - } else { + } elseif (is_string($objectclass)) { if(!in_array($objectclass, $classes)) { - $result.= " "; + $result.= image('images/empty.png'); + continue; + } + } elseif (is_array($objectclass)) { + if(count(array_intersect($objectclass, $classes)) != count($objectclass)){ + $result.= image('images/empty.png'); continue; } } @@ -860,8 +953,7 @@ class listing { if ($action['type'] == "entry") { $label= $this->processElementFilter($action['label'], $this->entries[$row], $row); $image= $this->processElementFilter($action['image'], $this->entries[$row], $row); - $result.=""; + $result.= image($image, "listing_".$action['name']."_$row", $label); } // Handle special types @@ -875,7 +967,9 @@ class listing { } if ($action['type'] == "copypaste") { - $result.= $this->renderCopyPasteActions($row, $this->entries[$row]['dn'], $category, $class); + $copy = !isset($action['copy']) || $action['copy'] == "true"; + $cut = !isset($action['cut']) || $action['cut'] == "true"; + $result.= $this->renderCopyPasteActions($row, $this->entries[$row]['dn'], $category, $class,$copy,$cut); } else { $result.= $this->renderSnapshotActions($row, $this->entries[$row]['dn'], $category, $class); } @@ -937,7 +1031,7 @@ class listing { $ui = get_userinfo(); /* Check if base = first available base */ - $deps = $ui->get_module_departments($this->module); + $deps = $ui->get_module_departments($this->categories); if(!count($deps) || $deps[0] == $this->filter->base){ $enableBack = false; @@ -947,37 +1041,35 @@ class listing { $listhead =""; /* Check if we are in users home department */ - if(!count($deps) || $this->filter->base == $this->filter->getObjectBase($ui->dn)){ + if(!count($deps) || $this->filter->base == get_base_from_people($ui->dn)){ $enableHome = false; } /* Draw root button */ if($enableRoot){ - $result["ROOT"]= ""; + $result["ROOT"]= image('images/lists/root.png', 'ROOT', _("Root")); }else{ - $result["ROOT"]= ""._("Root").""; + $result["ROOT"]= image('images/lists/root-grey.png', null, _("Root")); } /* Draw back button */ if($enableBack){ - $result["BACK"]= ""; + $result["BACK"]= image('images/lists/back.png', 'BACK', _("Go to preceding level")); }else{ - $result["BACK"]= ""._("Up").""; + $result["BACK"]= image('images/lists/back-grey.png', null, _("Go to preceding level")); } /* Draw home button */ + /* Draw home button */ if($enableHome){ - $result["HOME"]= ""; + $result["HOME"]= image('images/lists/home.png', 'HOME', _("Go to current users level")); }else{ - $result["HOME"]= ""._("Home").""; + $result["HOME"]= image('images/lists/home-grey.png', null, _("Go to current users level")); } + /* Draw reload button, this button is enabled everytime */ - $result["RELOAD"]= ""; + $result["RELOAD"]= image('images/lists/reload.png', 'REFRESH', _("Reload list")); return ($result); } @@ -990,6 +1082,11 @@ class listing { return; } + // Save position if set + if (isset($_POST['position_'.$this->pid]) && is_numeric($_POST['position_'.$this->pid])) { + $this->scrollPosition= $_POST['position_'.$this->pid]; + } + $result= array("targets" => array(), "action" => ""); // Filter GET with "act" attributes @@ -1008,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) { @@ -1054,9 +1157,11 @@ class listing { function renderActionMenu() { + $result= "
"; + // Don't send anything if the menu is not defined if (!isset($this->xmlData['actionmenu']['action'])){ - return ""; + return $result; } // Array? @@ -1066,14 +1171,12 @@ class listing { // Load shortcut $actions= &$this->xmlData['actionmenu']['action']; - $result= "
". - ""; } @@ -1104,7 +1207,7 @@ class listing { // Fill image if set $img= ""; if (isset($action['image'])){ - $img= " "; + $img= image($action['image'])." "; } if ($action['type'] == "separator"){ @@ -1116,7 +1219,7 @@ class listing { if ($action['type'] == "sub" && isset($action['action'])) { $level++; if (isset($action['label'])){ - $result.= "$img"._($action['label'])." "; + $result.= "$img"._($action['label'])." ".image('images/forward-arrow.png').""; } // Ensure we've an array of actions, this enables sub menus with only one action. @@ -1132,13 +1235,15 @@ class listing { // Render entry elseways if (isset($action['label'])){ - $result.= "$img"._($action['label']).""; + $result.= "$img"._($action['label']).""; } // Check for special types switch ($action['type']) { case 'copypaste': - $result.= $this->renderCopyPasteMenu($separator); + $cut = !isset($action['cut']) || $action['cut'] != "false"; + $copy = !isset($action['copy']) || $action['copy'] != "false"; + $result.= $this->renderCopyPasteMenu($separator, $copy , $cut); break; case 'snapshot': @@ -1162,7 +1267,7 @@ class listing { } - function hasActionPermission($action, $dn) + function hasActionPermission($action, $dn, $classes= null) { $ui= get_userinfo(); @@ -1174,9 +1279,15 @@ class listing { // Every ACL has to pass foreach ($acls as $acl) { - $module= $this->module; + $module= $this->categories; $aclList= array(); + // Replace %acl if available + if ($classes) { + $otype= $this->getObjectType($this->objectTypes, $classes); + $acl= str_replace('%acl', $otype['category']."/".$otype['class'], $acl); + } + // Split for category and plugins if needed // match for "[rw]" style entries if (preg_match('/^\[([rwcdm]+)\]$/', $acl, $match)){ @@ -1198,7 +1309,7 @@ class listing { // match "users/user[userPassword:rw(,...)*]" style entries if (preg_match('/^([a-zA-Z0-9]+\/[a-zA-Z0-9]+)\[([a-zA-Z0-9]+:[rwcdm]+(,[a-zA-Z0-9]+:[rwcdm]+)*)\]$/', $acl, $match)){ $module= $match[1]; - $aclList= split(',', $match[2]); + $aclList= explode(',', $match[2]); } // Walk thru prepared ACL by using $module @@ -1206,7 +1317,7 @@ class listing { $checkAcl= ""; // Category or detailed permission? - if (strpos('/', $module) === false) { + if (strpos($module, '/') !== false) { if (preg_match('/([a-zA-Z0-9]+):([rwcdm]+)/', $sAcl, $m) ) { $checkAcl= $ui->get_permissions($dn, $module, $m[1]); $sAcl= $m[2]; @@ -1241,7 +1352,7 @@ class listing { // Do some array munching to get it user friendly $ids= $config->idepartments; - $d= $ui->get_module_departments($this->module); + $d= $ui->get_module_departments($this->categories); $k_ids= array_keys($ids); $deps= array_intersect($d,$k_ids); @@ -1250,6 +1361,12 @@ class listing { foreach($k_ids as $department){ $this->bases[$department] = $ids[$department]; } + + // Populate base selector if already present + if ($this->baseSelector && $this->baseMode) { + $this->baseSelector->setBases($this->bases); + $this->baseSelector->update(TRUE); + } } @@ -1262,7 +1379,7 @@ class listing { $types = departmentManagement::get_support_departments(); // Load departments allowed by ACL - $validDepartments = $ui->get_module_departments($this->module); + $validDepartments = $ui->get_module_departments($this->categories); // Build filter and look in the LDAP for possible sub departments // of current base @@ -1273,7 +1390,7 @@ class listing { $attrs[]= $data['ATTR']; } $filter.= "))"; - $res= get_list($filter, $this->module, $this->base, $attrs, GL_NONE); + $res= get_list($filter, $this->categories, $this->base, $attrs, GL_NONE); // Analyze list of departments foreach ($res as $department) { @@ -1324,13 +1441,13 @@ class listing { // Copy entry if($copy){ - $result.= " "._("Copy").""; + $result.= "".image('images/lists/copy.png')." "._("Copy").""; $separator= ""; } // Cut entry if($cut){ - $result.= " "._("Cut").""; + $result.= "".image("images/lists/cut.png")." "._("Cut").""; $separator= ""; } } @@ -1338,9 +1455,9 @@ class listing { // Draw entries that allow pasting entries if($paste){ if($this->copyPasteHandler->entries_queued()){ - $result.= " "._("Paste").""; + $result.= "".image("images/lists/paste.png")." "._("Paste").""; }else{ - $result.= " "._("Paste").""; + $result.= "".image('images/lists/paste-grey.png')." "._("Paste").""; } } @@ -1363,20 +1480,18 @@ class listing { // Render cut entries if($cut){ if($ui->is_cutable($dn, $category, $class)){ - $result .= ""; + $result.= image('images/lists/cut.png', "listing_cut_$row", _("Cut this entry")); }else{ - $result.=" "; + $result.= image('images/empty.png'); } } // Render copy entries if($copy){ if($ui->is_copyable($dn, $category, $class)){ - $result.= ""; + $result.= image('images/lists/copy.png', "listing_copy_$row", _("Copy this entry")); }else{ - $result.=" "; + $result.= image('images/empty.png'); } } @@ -1396,7 +1511,7 @@ class listing { $result = ""; $ui = get_userinfo(); - if($this->snapshotHandler->enabled() && $ui->allow_snapshot_restore($this->base, $this->module)){ + if($this->snapshotHandler->enabled() && $ui->allow_snapshot_restore($this->base, $this->categories)){ // Check if there is something to restore $restore= false; @@ -1406,9 +1521,9 @@ class listing { // Draw icons according to the restore flag if($restore){ - $result.= " "._("Restore snapshots").""; + $result.= "".image('images/lists/restore.png')." "._("Restore snapshots").""; }else{ - $result.= " "._("Restore snapshots").""; + $result.= "".image('images/lists/restore-grey.png')." "._("Restore snapshots").""; } } @@ -1422,11 +1537,11 @@ class listing { $result = ""; // Draw entries - $result.= " "._("Export list")." 
    "; + $result.= "".image('images/lists/export.png')." "._("Export list")." ".image("images/forward-arrow.png")."
      "; // Export CVS as build in exporter foreach ($this->exporter as $action => $exporter) { - $result.= "
    •  ".$exporter['label']."
    • "; + $result.= "
    • ".image($exporter['image'])." ".$exporter['label']."
    • "; } // Finalize list @@ -1456,21 +1571,17 @@ class listing { // Do we have snapshots for this dn? if($this->snapshotHandler->hasSnapshots($dn)){ - $result.= ""; + $result.= image('images/lists/restore.png', "listing_restore_$row", _("Restore snapshot")); } else { - $result.= " "; + $result.= image('images/lists/restore-grey.png'); } } // Draw snapshot button if($ui->allow_snapshot_create($dn, $category)){ - $result.= ""; + $result.= image('images/snapshot.png', "listing_snapshot_$row", _("Create new snapshot for this object")); }else{ - $result.= " "; + $result.= image('images/empty.png'); } } @@ -1487,7 +1598,7 @@ class listing { $events= DaemonEvent::get_event_types_by_category($this->categories); if(isset($events['BY_CLASS']) && count($events['BY_CLASS'])){ foreach($events['BY_CLASS'] as $name => $event){ - $result.= "".$event['MenuImage']." ".$event['s_Menu_Name'].""; + $result.= "".$event['MenuImage']." ".$event['s_Menu_Name'].""; $separator= ""; } } @@ -1497,8 +1608,26 @@ class listing { } + function getEntry($dn) + { + foreach ($this->entries as $entry) { + if (isset($entry['dn']) && strcasecmp($dn, $entry['dn']) == 0){ + return $entry; + } + } + return null; + } + + + function getEntries() + { + return $this->entries; + } + + function getType($dn) { + $dn = LDAP::fix($dn); if (isset($this->objectDnMapping[$dn])) { return $this->objectDnMapping[$dn]; }