From 1680f9eb1278b9efccaaf3e3eaab2a2c8a35b990 Mon Sep 17 00:00:00 2001 From: hickert Date: Wed, 22 Mar 2006 05:26:26 +0000 Subject: [PATCH] Releases are now selectable Still missing : only view if entry is freeze.. git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@2882 594d385d-05f5-0310-b6e9-bd551577e9d8 --- .../class_applicationManagement.inc | 734 ++++++++++-------- plugins/admin/applications/headpage.tpl | 6 +- 2 files changed, 395 insertions(+), 345 deletions(-) diff --git a/plugins/admin/applications/class_applicationManagement.inc b/plugins/admin/applications/class_applicationManagement.inc index 90f044b34..b02c25be4 100644 --- a/plugins/admin/applications/class_applicationManagement.inc +++ b/plugins/admin/applications/class_applicationManagement.inc @@ -1,22 +1,22 @@ config= $config; - $this->ui= $ui; - - if( (isset($this->config->data['MAIN']['ENABLECOPYPASTE'])) - && - (preg_match("/true/i",$this->config->data['MAIN']['ENABLECOPYPASTE'] ))){ - $this->enableCopyPaste = true; + /* Save configuration for internal use */ + $this->config= $config; + $this->ui= $ui; + + if( (isset($this->config->data['MAIN']['ENABLECOPYPASTE'])) + && + (preg_match("/true/i",$this->config->data['MAIN']['ENABLECOPYPASTE'] ))){ + $this->enableCopyPaste = true; + } + + $this->CopyPasteHandler = new CopyPasteHandler($this->config); + + /* Get global filter config */ + if (!is_global("appfilter")){ + $base= get_base_from_people($ui->dn); + + $appfilter= array("depselect" => $base, + "regex" => "*" , + "release" => "ou=apps,".$base); + + register_global("appfilter", $appfilter); + } + + $appfilter = get_global("appfilter"); + $this->Releases = $this->getReleases($appfilter['depselect']); + $this->Release = $appfilter['release']; } - $this->CopyPasteHandler = new CopyPasteHandler($this->config); + function getReleases($base) + { + $dn = "ou=fai,ou=configs,ou=systems,".$base; + + $ret = array(); - /* Get global filter config */ - if (!is_global("appfilter")){ - $base= get_base_from_people($ui->dn); - $appfilter= array("depselect" => $base, - "regex" => "*"); - register_global("appfilter", $appfilter); - } + $ret ["ou=apps,".$base] = "/"; + + $ldap = $this->config->get_ldap_link(); + $ldap->cd($dn); + + $ldap->search("ou=apps",array("ou")); + + while($attrs = $ldap->fetch()){ + $str = str_replace($dn,"",$attrs['dn']); + $tmp = array_reverse( split("ou=",$str)); + $str = ""; + foreach($tmp as $val){ + $val = trim(preg_replace("/,/","",$val)); + if($val == "apps") break; + $str .= "/".$val; + } + $ret[$attrs['dn']]= $str; + } + return($ret); } function execute() { - /* Call parent execute */ - plugin::execute(); - -// print_a($_POST); -// print_a($_GET); - $_SESSION['LOCK_VARS_TO_USE'] = array("/^act$/","/^id$/","/^appl_edit_/","/^appl_del_/"); - - /* Save data */ - $appfilter = get_global("appfilter"); - $smarty = get_smarty(); // Smarty instance - $s_action = ""; // Contains the action to proceed - $s_entry = ""; // The value for s_action + /* Call parent execute */ + plugin::execute(); + + $_SESSION['LOCK_VARS_TO_USE'] = array("/^act$/","/^id$/","/^appl_edit_/","/^appl_del_/"); + + /* Save data */ + $appfilter = get_global("appfilter"); + $smarty = get_smarty(); // Smarty instance + $s_action = ""; // Contains the action to proceed + $s_entry = ""; // The value for s_action $base_back = ""; // The Link for Backbutton /* Start for New List Managment */ if(isset($_GET['act'])&&($_GET['act']=="dep_open")){ - $s_action="open"; - $s_entry = base64_decode($_GET['dep_id']); - $appfilter['depselect']= "".$this->config->departments[trim($s_entry)]; + $s_action="open"; + $s_entry = base64_decode($_GET['dep_id']); + $appfilter['depselect']= "".$this->config->departments[trim($s_entry)]; + } + + /* Get posted release */ + if(isset($_POST['select_release'])){ + $r = $_POST['select_release']; + if((isset($this->Releases[$r])) && ($this->Release != $r)){ + $this->Release = $r; + $appfilter = get_global("appfilter"); + $appfilter['release'] = $r; + register_global("appfilter",$appfilter); + } } /* Test Posts */ @@ -171,8 +217,8 @@ class applicationManagement extends plugin /* Only perform copy / paste if it is enabled */ if($this->enableCopyPaste){ - - /* Paste copied/cutted object in here + + /* Paste copied/cutted object in here */ if(($s_action == "editPaste") || ($this->CopyPasteHandler->stillOpen())){ $this->CopyPasteHandler->save_object(); @@ -238,340 +284,344 @@ class applicationManagement extends plugin /* Save data data to ldap */ $this->apptabs->save(); - gosa_log ("Application object'".$this->dn."' has been saved"); - - /* Application has been saved successfully, remove lock from - LDAP. */ - if ($this->dn != "new"){ - del_lock ($this->dn); - } - - /* There's no page reload so we have to read new apps at - this point. */ - $this->reload (); - unset ($this->apptabs); - $this->apptabs= NULL; - unset ($_SESSION['objectinfo']); - } else { - /* Ok. There seem to be errors regarding to the tab data, - show message and continue as usual. */ - show_errors($message); - } - } - - /* User wants to edit data? */ - if (($s_action=="edit") && (!isset($this->apptabs->config))){ - - /* Get 'dn' from posted 'applist', must be unique */ - $this->dn= $this->applications[$s_entry]['dn']; - - /* Check locking, save current plugin in 'back_plugin', so - the dialog knows where to return. */ - if (($user= get_lock($this->dn)) != ""){ - return(gen_locked_message ($user, $this->dn)); - } - - /* Lock the current entry, so everyone will get the - above dialog */ - add_lock ($this->dn, $this->ui->dn); - - /* Set up the users ACL's for this 'dn' */ - $acl= get_permissions ($this->dn, $this->ui->subtreeACL); - - /* Register apptabs to trigger edit dialog */ - $this->apptabs= new apptabs($this->config, - $this->config->data['TABS']['APPSTABS'], $this->dn); - $this->apptabs->set_acl($acl); - $_SESSION['objectinfo']= $this->dn; - } - - /* Remove user was requested */ - if ($s_action == "del"){ - - /* Get 'dn' from posted 'uid' */ - $this->dn= $this->applications[$s_entry]['dn']; - - /* Load permissions for selected 'dn' and check if - we're allowed to remove this 'dn' */ - $acl= get_permissions ($this->dn, $this->ui->subtreeACL); - $this->acl= get_module_permission($acl, "application", $this->dn); - if (chkacl($this->acl, "delete") == ""){ - - /* Check locking, save current plugin in 'back_plugin', so - the dialog knows where to return. */ - if (($user= get_lock($this->dn)) != ""){ - return (gen_locked_message ($user, $this->dn)); - } - - /* Lock the current entry, so nobody will edit it during deletion */ - add_lock ($this->dn, $this->ui->dn); - $smarty= get_smarty(); - $smarty->assign("intro", sprintf(_("You're about to delete the application '%s'."), LDAP::fix($this->dn))); - return($smarty->fetch (get_template_path('remove.tpl', TRUE))); - } else { - - /* Obviously the user isn't allowed to delete. Show message and - clean session. */ - print_red (_("You are not allowed to delete this application!")); - } - } - - /* Confirmation for deletion has been passed. Group should be deleted. */ - if (isset($_POST['delete_app_confirm'])){ - - /* Some nice guy may send this as POST, so we've to check - for the permissions again. */ - if (chkacl($this->acl, "delete") == ""){ - - /* Delete request is permitted, perform LDAP action */ - $this->apptabs= new apptabs($this->config, - $this->config->data['TABS']['APPSTABS'], $this->dn); - $this->apptabs->set_acl(array($this->acl)); - $this->apptabs->delete (); - gosa_log ("Application object'".$this->dn."' has been removed"); - unset ($this->apptabs); - $this->apptabs= NULL; - - /* Group list has changed, reload it. */ - $this->reload (); - } else { - - /* Normally this shouldn't be reached, send some extra - logs to notify the administrator */ - print_red (_("You are not allowed to delete this application!")); - gosa_log ("Warning: '".$this->ui->uid."' tried to trick group deletion."); - } - - /* Remove lock file after successfull deletion */ - del_lock ($this->dn); - } - - - /* Delete application canceled? */ - if (isset($_POST['delete_cancel'])){ - del_lock ($this->dn); - unset($_SESSION['objectinfo']); - } - - /* Show tab dialog if object is present */ - if (($this->apptabs) && (isset($this->apptabs->config))){ - $display= $this->apptabs->execute(); - - /* Don't show buttons if tab dialog requests this */ - if (!$this->apptabs->by_object[$this->apptabs->current]->dialog){ - $display.= "

\n"; - $display.= "\n"; - $display.= " \n"; - $display.= "\n"; - $display.= "

"; - } - return ($display); + gosa_log ("Application object'".$this->dn."' has been saved"); + + /* Application has been saved successfully, remove lock from + LDAP. */ + if ($this->dn != "new"){ + del_lock ($this->dn); } - /* Show main page */ + /* There's no page reload so we have to read new apps at + this point. */ + $this->reload (); + unset ($this->apptabs); + $this->apptabs= NULL; + unset ($_SESSION['objectinfo']); + } else { + /* Ok. There seem to be errors regarding to the tab data, + show message and continue as usual. */ + show_errors($message); + } + } + + /* User wants to edit data? */ + if (($s_action=="edit") && (!isset($this->apptabs->config))){ + + /* Get 'dn' from posted 'applist', must be unique */ + $this->dn= $this->applications[$s_entry]['dn']; + + /* Check locking, save current plugin in 'back_plugin', so + the dialog knows where to return. */ + if (($user= get_lock($this->dn)) != ""){ + return(gen_locked_message ($user, $this->dn)); + } + + /* Lock the current entry, so everyone will get the + above dialog */ + add_lock ($this->dn, $this->ui->dn); + + /* Set up the users ACL's for this 'dn' */ + $acl= get_permissions ($this->dn, $this->ui->subtreeACL); + + /* Register apptabs to trigger edit dialog */ + $this->apptabs= new apptabs($this->config, + $this->config->data['TABS']['APPSTABS'], $this->dn); + $this->apptabs->set_acl($acl); + $_SESSION['objectinfo']= $this->dn; + } - /* Prepare departments */ - $options= ""; - foreach ($this->config->idepartments as $key => $value){ - if ($appfilter['depselect'] == $key){ - $options.= ""; - } else { - $options.= ""; - } + /* Remove user was requested */ + if ($s_action == "del"){ + + /* Get 'dn' from posted 'uid' */ + $this->dn= $this->applications[$s_entry]['dn']; + + /* Load permissions for selected 'dn' and check if + we're allowed to remove this 'dn' */ + $acl= get_permissions ($this->dn, $this->ui->subtreeACL); + $this->acl= get_module_permission($acl, "application", $this->dn); + if (chkacl($this->acl, "delete") == ""){ + + /* Check locking, save current plugin in 'back_plugin', so + the dialog knows where to return. */ + if (($user= get_lock($this->dn)) != ""){ + return (gen_locked_message ($user, $this->dn)); } - if($this->enableCopyPaste){ - $Copy_Paste = "  "; + /* Lock the current entry, so nobody will edit it during deletion */ + add_lock ($this->dn, $this->ui->dn); + $smarty= get_smarty(); + $smarty->assign("intro", sprintf(_("You're about to delete the application '%s'."), LDAP::fix($this->dn))); + return($smarty->fetch (get_template_path('remove.tpl', TRUE))); + } else { - if($this->CopyPasteHandler->isCurrentObjectPastAble()){ + /* Obviously the user isn't allowed to delete. Show message and + clean session. */ + print_red (_("You are not allowed to delete this application!")); + } + } - if($this->CopyPasteHandler->isCurrentCutted()){ - $img = "images/cutpaste.png"; - }else{ - $img = "images/copypaste.png"; - } + /* Confirmation for deletion has been passed. Group should be deleted. */ + if (isset($_POST['delete_app_confirm'])){ + + /* Some nice guy may send this as POST, so we've to check + for the permissions again. */ + if (chkacl($this->acl, "delete") == ""){ + + /* Delete request is permitted, perform LDAP action */ + $this->apptabs= new apptabs($this->config, + $this->config->data['TABS']['APPSTABS'], $this->dn); + $this->apptabs->set_acl(array($this->acl)); + $this->apptabs->delete (); + gosa_log ("Application object'".$this->dn."' has been removed"); + unset ($this->apptabs); + $this->apptabs= NULL; + + /* Group list has changed, reload it. */ + $this->reload (); + } else { + + /* Normally this shouldn't be reached, send some extra + logs to notify the administrator */ + print_red (_("You are not allowed to delete this application!")); + gosa_log ("Warning: '".$this->ui->uid."' tried to trick group deletion."); + } + + /* Remove lock file after successfull deletion */ + del_lock ($this->dn); + } + + + /* Delete application canceled? */ + if (isset($_POST['delete_cancel'])){ + del_lock ($this->dn); + unset($_SESSION['objectinfo']); + } - $Copy_Paste .= " "; - }else{ - $Copy_Paste .= ""._("Can "; - } + /* Show tab dialog if object is present */ + if (($this->apptabs) && (isset($this->apptabs->config))){ + $display= $this->apptabs->execute(); + + /* Don't show buttons if tab dialog requests this */ + if (!$this->apptabs->by_object[$this->apptabs->current]->dialog){ + $display.= "

\n"; + $display.= "\n"; + $display.= " \n"; + $display.= "\n"; + $display.= "

"; + } + return ($display); + } + + /* Show main page */ + + /* Prepare departments */ + $options= ""; + foreach ($this->config->idepartments as $key => $value){ + if ($appfilter['depselect'] == $key){ + $options.= ""; + } else { + $options.= ""; + } + } + + if($this->enableCopyPaste){ + $Copy_Paste = "  "; + + if($this->CopyPasteHandler->isCurrentObjectPastAble()){ + + if($this->CopyPasteHandler->isCurrentCutted()){ + $img = "images/cutpaste.png"; }else{ - $Copy_Paste =""; + $img = "images/copypaste.png"; } - - // Managment - $listhead = "
". - "  ". - "  ". - "  ". - "  ". - "  ". - $Copy_Paste. - "  ". - _("Base")." ". - "  ". - "
"; - - - - if($this->enableCopyPaste){ - $actions = " "; - $actions.= " "; - $actions.= ""; - $actions.= ""; - }else{ - $actions = ""; - $actions.= ""; - } + $Copy_Paste .= " "; + }else{ + $Copy_Paste .= ""._("Can "; + } + }else{ + $Copy_Paste =""; + } + // Managment + $listhead = "
". + "  ". + "  ". + "  ". + "  ". + "  ". + $Copy_Paste. + "  ". + _("Base")." ". + "  ". + "
"; - // Defining Links - $linkopen = "%s"; - // image Buttons - $editlink = "%s"; - $userimg = "User"; - // Extension images - $applimg = "A"; + if($this->enableCopyPaste){ + $actions = " "; + $actions.= " "; + $actions.= ""; + $actions.= ""; + }else{ + + $actions = ""; + $actions.= ""; + } + - // Space - $empty = ""; + // Defining Links + $linkopen = "%s"; + // image Buttons + $editlink = "%s"; + $userimg = "User"; - $divlist = new divlist("applicationtabs"); - $divlist->SetHeader(array( - array("string" => " ", "attach" => "style='text-align:center;width:20px;'"), - array("string" => _("Application name")." / "._("Department"), "attach" => "style=''"), - array("string" => _("Actions"), "attach" => "style='width:80px;border-right:0px;text-align:right;'") - )); + // Extension images + $applimg = "A"; + // Space + $empty = ""; - $divlist->SetSummary(_("This table displays all groups, in the selected tree.")); - $divlist->SetEntriesPerPage(0); - foreach($this->departments as $key=> $val){ + $divlist = new divlist("applicationtabs"); + $divlist->SetHeader(array( + array("string" => " ", "attach" => "style='text-align:center;width:20px;'"), + array("string" => _("Application name")." / "._("Department"), "attach" => "style=''"), + array("string" => _("Actions"), "attach" => "style='width:80px;border-right:0px;text-align:right;'") + )); - if(!isset($this->config->departments[trim($key)])){ - $this->config->departments[trim($key)]=""; - } - $non_empty=""; - $keys= str_replace("/","\/",$key); - foreach($this->config->departments as $keyd=>$vald ){ - if(preg_match("/".$keys."\/.*/",$keyd)){ - $non_empty="full"; - } - } + $divlist->SetSummary(_("This table displays all groups, in the selected tree.")); + $divlist->SetEntriesPerPage(0); - $field1 = array("string" => "department", "attach" => "style='text-align:center;width:20px;'"); - $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val), "attach" => "style=''"); - $field3 = array("string" => " ", "attach" => "style='width:80px;border-right:0px;text-align:right;'"); + foreach($this->departments as $key=> $val){ - $divlist->AddEntry(array($field1,$field2,$field3)); + if(!isset($this->config->departments[trim($key)])){ + $this->config->departments[trim($key)]=""; + } + + $non_empty=""; + $keys= str_replace("/","\/",$key); + foreach($this->config->departments as $keyd=>$vald ){ + if(preg_match("/".$keys."\/.*/",$keyd)){ + $non_empty="full"; } + } - foreach($this->applications as $key => $val){ - $title = "title='dn : ".$val['dn']."'"; + $field1 = array("string" => "department", "attach" => "style='text-align:center;width:20px;'"); + $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val), "attach" => "style=''"); + $field3 = array("string" => " ", "attach" => "style='width:80px;border-right:0px;text-align:right;'"); - if(!isset($val['description'][0])){ - $desc = ""; - }else{ - $desc = " - [ ".$val['description'][0]." ]"; - } - $field1 = array("string" => sprintf($applimg,$val['dn']), "attach" => "style='text-align:center;width:20px;'"); - $field2 = array("string" => sprintf($editlink,$key,($val['cn']['0'].$desc)), "attach" => "style='' ".$title); - $field3 = array("string" => preg_replace("/%KEY%/", $key, $actions), "attach" => "style='width:80px;border-right:0px;text-align:right;'"); + $divlist->AddEntry(array($field1,$field2,$field3)); + } - $divlist->AddEntry(array($field1,$field2,$field3)); - } + foreach($this->applications as $key => $val){ + $title = "title='dn : ".$val['dn']."'"; - $smarty->assign("applicationshead", $listhead); - $smarty->assign("applications", $divlist->DrawList()); - $smarty->assign("search_image", get_template_path('images/search.png')); - $smarty->assign("tree_image", get_template_path('images/tree.png')); - $smarty->assign("infoimage", get_template_path('images/info.png')); - $smarty->assign("launchimage", get_template_path('images/launch.png')); - $smarty->assign("branchimage" , get_template_path('images/branch.png')); - $smarty->assign("deplist", $this->config->idepartments); - $smarty->assign("regex", $appfilter['regex']); - - /* Extend if we are not using javascript */ - $smarty->assign("apply", apply_filter()); - $smarty->assign("alphabet", generate_alphabet()); - $smarty->assign("hint", print_sizelimit_warning()); - - return($smarty->fetch(get_template_path('headpage.tpl', TRUE))); + if(!isset($val['description'][0])){ + $desc = ""; + }else{ + $desc = " - [ ".$val['description'][0]." ]"; + } + $field1 = array("string" => sprintf($applimg,$val['dn']), "attach" => "style='text-align:center;width:20px;'"); + $field2 = array("string" => sprintf($editlink,$key,($val['cn']['0'].$desc)), "attach" => "style='' ".$title); + $field3 = array("string" => preg_replace("/%KEY%/", $key, $actions), "attach" => "style='width:80px;border-right:0px;text-align:right;'"); + + $divlist->AddEntry(array($field1,$field2,$field3)); + } + + $smarty->assign("applicationshead", $listhead); + $smarty->assign("applications", $divlist->DrawList()); + $smarty->assign("search_image", get_template_path('images/search.png')); + $smarty->assign("tree_image", get_template_path('images/tree.png')); + $smarty->assign("infoimage", get_template_path('images/info.png')); + $smarty->assign("launchimage", get_template_path('images/launch.png')); + $smarty->assign("releaseimage" , get_template_path('images/release.png')); + $smarty->assign("deplist", $this->config->idepartments); + $smarty->assign("regex", $appfilter['regex']); + + $smarty->assign("releases", $this->Releases ); + $smarty->assign("releaseKeys", array_flip($this->Releases)); + $smarty->assign("select_release",$this->Release); + + /* Extend if we are not using javascript */ + $smarty->assign("apply", apply_filter()); + $smarty->assign("alphabet", generate_alphabet()); + $smarty->assign("hint", print_sizelimit_warning()); + + return($smarty->fetch(get_template_path('headpage.tpl', TRUE))); } function reload() { - /* Get config */ - $appfilter= get_global('appfilter'); + /* Get config */ + $appfilter= get_global('appfilter'); - /* Set base for all searches */ - $base= $appfilter['depselect']; + /* Set base for all searches */ + $base= $this->Release; + + /* Regex filter? */ + if ($appfilter['regex'] != ""){ + $regex= $appfilter['regex']; + } else { + $regex= "*"; + } - /* Regex filter? */ - if ($appfilter['regex'] != ""){ - $regex= $appfilter['regex']; - } else { - $regex= "*"; - } - - /* Generate application list */ - $res= get_list($this->ui->subtreeACL, "(&(cn=$regex)(objectClass=gosaApplication))", FALSE, "ou=apps,".$base, array("*"), TRUE); - $this->applications= array(); - foreach ($res as $value){ - $this->applications[]= $value; - } - reset ($this->applications); + /* Generate application list */ + $res= get_list($this->ui->subtreeACL, "(&(cn=$regex)(objectClass=gosaApplication))", FALSE, $base, array("*"), FALSE); + $this->applications= array(); + foreach ($res as $value){ + $this->applications[]= $value; + } + reset ($this->applications); - /* NEW LIST MANAGMENT - * We also need to search for the departments - * So we are able to navigate like in konquerer - */ - $peopleOU = get_people_ou(); + /* NEW LIST MANAGMENT + * We also need to search for the departments + * So we are able to navigate like in konquerer + */ + $peopleOU = get_people_ou(); - if(empty($peopleOU)){ - $base2 = $base; - }else{ - $base2 = preg_replace("/".$peopleOU."/i","",$base); - } + if(empty($peopleOU)){ + $base2 = $base; + }else{ + $base2 = preg_replace("/".$peopleOU."/i","",$base); + } - $res3 = get_list2($this->ui->subtreeACL, "(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))", - TRUE, $base2, array("ou", "description"), TRUE); + $res3 = get_list2($this->ui->subtreeACL, "(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))", + TRUE, $base2, array("ou", "description"), TRUE); - $this->departments= array(); - $tmp = array(); - foreach ($res3 as $value){ - $tmp[strtolower($value['dn']).$value['dn']]=$value; - } - ksort($tmp); - foreach($tmp as $value){ - if(isset($value["description"][0])){ - $this->departments[$value['dn']]=convert_department_dn2($value['dn'])." - [".$value["description"][0]."]"; - }else{ - $this->departments[$value['dn']]=convert_department_dn2($value['dn']);//$value["description"][0]; - } - } + $this->departments= array(); + $tmp = array(); + foreach ($res3 as $value){ + $tmp[strtolower($value['dn']).$value['dn']]=$value; + } + ksort($tmp); + foreach($tmp as $value){ + if(isset($value["description"][0])){ + $this->departments[$value['dn']]=convert_department_dn2($value['dn'])." - [".$value["description"][0]."]"; + }else{ + $this->departments[$value['dn']]=convert_department_dn2($value['dn']);//$value["description"][0]; + } + } - /* END NEW LIST MANAGMENT - */ + /* END NEW LIST MANAGMENT + */ - $tmp=array(); + $tmp=array(); foreach($this->applications as $tkey => $val ){ $tmp[strtolower($val['cn'][0]).$val['cn'][0]]=$val; } @@ -587,8 +637,8 @@ class applicationManagement extends plugin function remove_from_parent() { - /* Optionally execute a command after we're done */ - $this->postremove(); + /* Optionally execute a command after we're done */ + $this->postremove(); } @@ -607,8 +657,8 @@ class applicationManagement extends plugin /* Save to LDAP */ function save() { - /* Optionally execute a command after we're done */ - $this->postcreate(); + /* Optionally execute a command after we're done */ + $this->postcreate(); } function adapt_from_template($dn) diff --git a/plugins/admin/applications/headpage.tpl b/plugins/admin/applications/headpage.tpl index 376f19bee..a8a06329a 100644 --- a/plugins/admin/applications/headpage.tpl +++ b/plugins/admin/applications/headpage.tpl @@ -26,15 +26,15 @@
-

[F]{t}Branches{/t}

+

[F]{t}Releases{/t}

-- 2.30.2
{t}Current release{/t}  - + {html_options values=$releaseKeys output=$releases selected=$select_release}