diff --git a/lam/templates/lib/500_lam.js b/lam/templates/lib/500_lam.js index c29bd35f..782d89a0 100644 --- a/lam/templates/lib/500_lam.js +++ b/lam/templates/lib/500_lam.js @@ -1043,24 +1043,21 @@ window.lam.html.showDnSelection = function(fieldId, title, okText, cancelText, t }) .done(function(jsonData) { jQuery('#dlg_' + fieldId).html(jsonData.dialogData); - }) - .fail(function() { - jQuery(this).dialog("close"); - }); - var buttonList = {}; - buttonList[cancelText] = function() { jQuery(this).dialog("close"); }; - jQuery('#dlg_' + fieldId).dialog({ - modal: true, - title: title, - dialogClass: 'defaultBackground', - buttons: buttonList, - width: 'auto' + var buttonList = {}; + buttonList[cancelText] = function() { jQuery(this).dialog("close"); }; + jQuery('#dlg_' + fieldId).dialog({ + modal: true, + title: title, + dialogClass: 'defaultBackground', + buttons: buttonList, + width: 'auto' + }); }); }; /** * Selects the DN from dialog. - * + * * @param el ok button in dialog * @param fieldId field id of input field * @returns false @@ -1073,6 +1070,39 @@ window.lam.html.selectDn = function(el, fieldId) { return false; } +/** + * Updates the DN selection. + * + * @param el element + * @param fieldId field id of dialog + * @param tokenName CSRF token name + * @param tokenValue CSRF token value + */ +window.lam.html.updateDnSelection = function(el, fieldId, tokenName, tokenValue) { + var fieldDiv = jQuery('#dlg_' + fieldId); + var dn = jQuery(el).parents('.row').data('dn'); + var data = { + jsonInput: '' + }; + data[tokenName] = tokenValue; + data['fieldId'] = fieldId; + data['dn'] = dn; + jQuery.ajax({ + url: '../misc/ajax.php?function=dnselection', + method: 'POST', + data: data + }) + .done(function(jsonData) { + jQuery('#dlg_' + fieldId).html(jsonData.dialogData); + jQuery(fieldDiv).dialog({ + position: {my: 'center', at: 'center', of: window} + }); + }) + .fail(function() { + jQuery(fieldDiv).dialog("close"); + }); +} + jQuery(document).ready(function() { window.lam.gui.equalHeight(); window.lam.form.autoTrim(); diff --git a/lam/templates/misc/ajax.php b/lam/templates/misc/ajax.php index 04562a7a..93bcd56f 100644 --- a/lam/templates/misc/ajax.php +++ b/lam/templates/misc/ajax.php @@ -4,8 +4,7 @@ use \LAM\TOOLS\IMPORT_EXPORT\Importer; use \LAM\TOOLS\IMPORT_EXPORT\Exporter; use \LAM\TYPES\TypeManager; use \htmlResponsiveRow; -use \htmlDiv; -use \htmlGroup; +use \htmlLink; use \htmlOutputText; use \htmlButton; /* @@ -171,25 +170,28 @@ class Ajax { $result = checkPasswordStrength($password, null, null); echo json_encode(array("result" => $result)); } - + /** * Handles DN selection fields. - * + * * @return string JSON output */ private function dnSelection() { $dn = trim($_POST['dn']); if (empty($dn) || !get_preg($dn, 'dn')) { $dnList = $this->getDefaultDns(); + $dn = null; } - $dnList = $this->getDefaultDns(); // TODO remove - $html = $this->buildDnSelectionHtml($dnList); + else { + $dnList = $this->getSubDns($dn); + } + $html = $this->buildDnSelectionHtml($dnList, $dn); return json_encode(array('dialogData' => $html)); } - + /** * Returns a list of default DNs from account types + tree suffix. - * + * * @return string[] default DNs */ private function getDefaultDns() { @@ -206,22 +208,57 @@ class Ajax { $baseDnList[] = $suffix; } $baseDnList = array_unique($baseDnList); - sort($baseDnList); + usort($baseDnList, 'compareDN'); return $baseDnList; } - + /** * Returns the HTML to build the DN selection list. - * + * * @param string[] $dnList DN list + * @param string $currentDn current DN */ - private function buildDnSelectionHtml($dnList) { + private function buildDnSelectionHtml($dnList, $currentDn) { $fieldId = trim($_POST['fieldId']); $mainRow = new htmlResponsiveRow(); + if (!empty($currentDn)) { + $row = new htmlResponsiveRow(); + $row->addDataAttribute('dn', $currentDn); + $text = new htmlOutputText($currentDn); + $text->setIsBold(true); + $row->add($text, 12, 9); + $row->setCSSClasses(array('text-right')); + $buttonId = base64_encode($currentDn); + $buttonId = str_replace('=', '', $buttonId); + $button = new htmlButton($buttonId, _('Ok')); + $button->setIconClass('okButton'); + $button->setOnClick('window.lam.html.selectDn(this, \'' . htmlspecialchars($fieldId) . '\')'); + $row->add($button, 12, 3); + $mainRow->add($row, 12); + // back up + $onclickUp = 'window.lam.html.updateDnSelection(this, \'' + . htmlspecialchars($fieldId) . '\', \'' . getSecurityTokenName() . '\', \'' + . getSecurityTokenValue() . '\')'; + $row = new htmlResponsiveRow(); + $row->addDataAttribute('dn', extractDNSuffix($currentDn)); + $text = new htmlLink('..', '#'); + $text->setCSSClasses(array('bold')); + $text->setOnClick($onclickUp); + $row->add($text, 12, 9); + $row->setCSSClasses(array('text-right')); + $buttonId = base64_encode('..'); + $buttonId = str_replace('=', '', $buttonId); + $button = new htmlButton($buttonId, _('Up')); + $button->setIconClass('upButton'); + $button->setOnClick($onclickUp); + $row->add($button, 12, 3); + $mainRow->add($row, 12); + } foreach ($dnList as $dn) { $row = new htmlResponsiveRow(); $row->addDataAttribute('dn', $dn); $row->add(new htmlOutputText($dn), 12, 9); + $row->setCSSClasses(array('text-right')); $buttonId = base64_encode($dn); $buttonId = str_replace('=', '', $buttonId); $button = new htmlButton($buttonId, _('Ok')); @@ -238,6 +275,22 @@ class Ajax { return $out; } + /** + * Returns the sub DNs of given DN. + * + * @param string $dn DN + * @return string[] sub DNs + */ + private function getSubDns($dn) { + $dnEntries = ldapListDN($dn); + $dnList = array(); + foreach ($dnEntries as $entry) { + $dnList[] = $entry['dn']; + } + usort($dnList, 'compareDN'); + return $dnList; + } + }