added htmlAccordion and option to specify user name suggestion format
This commit is contained in:
parent
76d207f19f
commit
5932e0abc6
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15"><title>Upgrade notes</title>
|
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15"><title>Upgrade notes</title>
|
||||||
|
|
||||||
|
@ -35,7 +36,10 @@ This is a list of API changes for all LAM releases.
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<h2>4.0 -> 4.1</h2>CSS changes:<br>
|
<h2>4.1 -> 4.2</h2>New meta HTML classes: htmlEqualHeight, htmlAccordion<br>
|
||||||
|
<br>
|
||||||
|
<h2>4.0 -> 4.1</h2>
|
||||||
|
CSS changes:<br>
|
||||||
<ul>
|
<ul>
|
||||||
<li>type specific "td.{TYPE}nav-activepage" was replaced by common "td.activepage" in layout.css</li>
|
<li>type specific "td.{TYPE}nav-activepage" was replaced by common "td.activepage" in layout.css</li>
|
||||||
<li>renamed ".{TYPE}list-bright" to ".{TYPE}-bright" and ".{TYPE}list-dark" to ".{TYPE}-dark"</li>
|
<li>renamed ".{TYPE}list-bright" to ".{TYPE}-bright" and ".{TYPE}list-dark" to ".{TYPE}-dark"</li>
|
||||||
|
|
|
@ -2973,4 +2973,78 @@ class htmlSortableList extends htmlElement {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a list of content elements in accordion style.
|
||||||
|
* HTML special characters must be escaped before providing to htmlAccordion.
|
||||||
|
*/
|
||||||
|
class htmlAccordion extends htmlElement {
|
||||||
|
|
||||||
|
private $id = null;
|
||||||
|
private $elements = null;
|
||||||
|
private $openInitial = '1';
|
||||||
|
private $collapsible = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param String $id HTML ID
|
||||||
|
* @param array $elements list of content elements array('title' => htmlElement)
|
||||||
|
* @param String $openInitial index of element that is initially opened (default: 0), set to 'false' to close all
|
||||||
|
* @param boolean $collapsible specifies if all elements may be closed at the same time (default: false, true if $openInitial is false)
|
||||||
|
*/
|
||||||
|
function __construct($id, $elements, $openInitial = '0', $collapsible = false) {
|
||||||
|
$this->id = $id;
|
||||||
|
$this->elements = $elements;
|
||||||
|
$this->openInitial = $openInitial;
|
||||||
|
if (($openInitial === 'false') || ($openInitial === false)) {
|
||||||
|
$this->collapsible = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$this->collapsible = $collapsible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the HTML code for this element.
|
||||||
|
*
|
||||||
|
* @param string $module Name of account module
|
||||||
|
* @param array $input List of meta-HTML elements
|
||||||
|
* @param array $values List of values which override the defaults in $input (name => value)
|
||||||
|
* @param boolean $restricted If true then no buttons will be displayed
|
||||||
|
* @param integer $tabindex Start value of tabulator index for input fields
|
||||||
|
* @param string $scope Account type
|
||||||
|
* @return array List of input field names and their type (name => type)
|
||||||
|
*/
|
||||||
|
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
|
||||||
|
$result = array();
|
||||||
|
$collapsible = 'false';
|
||||||
|
if ($this->collapsible) {
|
||||||
|
$collapsible = 'true';
|
||||||
|
}
|
||||||
|
$active = 'false';
|
||||||
|
if ($this->openInitial !== false) {
|
||||||
|
$active = $this->openInitial;
|
||||||
|
}
|
||||||
|
echo '<div id="' . $this->id . '">';
|
||||||
|
foreach ($this->elements as $label => $content) {
|
||||||
|
echo '<h3>' . $label . '</h3>';
|
||||||
|
echo '<div>';
|
||||||
|
$result = array_merge($result, $content->generateHTML($module, $input, $values, $restricted, $tabindex, $scope));
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
echo '</div>';
|
||||||
|
$script = 'jQuery(function() {
|
||||||
|
$( "#' . $this->id . '" ).accordion({
|
||||||
|
collapsible: ' . $collapsible . ',
|
||||||
|
active: ' . $active . '
|
||||||
|
});
|
||||||
|
});';
|
||||||
|
$js = new htmlJavaScript($script);
|
||||||
|
$js->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -66,8 +66,6 @@ class posixAccount extends baseModule implements passwordService {
|
||||||
private $cachedUIDList = null;
|
private $cachedUIDList = null;
|
||||||
/** caches the list of known user names */
|
/** caches the list of known user names */
|
||||||
private $cachedUserNameList = null;
|
private $cachedUserNameList = null;
|
||||||
/** if set to true the suggested user name for John Doe will be john.doe instead of jdoe */
|
|
||||||
protected $SUGGEST_LONG_USER_NAME = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function fills the error message array with messages.
|
* This function fills the error message array with messages.
|
||||||
|
@ -219,7 +217,6 @@ class posixAccount extends baseModule implements passwordService {
|
||||||
$configOptionsContainer->addElement(new htmlSubTitle(_('Options')), true);
|
$configOptionsContainer->addElement(new htmlSubTitle(_('Options')), true);
|
||||||
$configOptionsContainer->addElement(new htmlTableExtendedSelect('posixAccount_pwdHash', getSupportedHashTypes(),
|
$configOptionsContainer->addElement(new htmlTableExtendedSelect('posixAccount_pwdHash', getSupportedHashTypes(),
|
||||||
array('SSHA'), _("Password hash type"), 'pwdHash'), true);
|
array('SSHA'), _("Password hash type"), 'pwdHash'), true);
|
||||||
$configOptionsContainer->addElement(new htmlTableExtendedInputCheckbox('posixAccount_primaryGroupAsSecondary', false, _('Set primary group as memberUid'), 'primaryGroupAsSecondary'), true);
|
|
||||||
$configOptionsContainer->addElement(new htmlTableExtendedInputTextarea('posixAccount_shells', implode("\r\n", $this->getShells()), 30, 4, _('Login shells'), 'loginShells'), true);
|
$configOptionsContainer->addElement(new htmlTableExtendedInputTextarea('posixAccount_shells', implode("\r\n", $this->getShells()), 30, 4, _('Login shells'), 'loginShells'), true);
|
||||||
$hiddenOptionsContainer = new htmlGroup();
|
$hiddenOptionsContainer = new htmlGroup();
|
||||||
$hiddenOptionsContainer->colspan = 5;
|
$hiddenOptionsContainer->colspan = 5;
|
||||||
|
@ -239,7 +236,13 @@ class posixAccount extends baseModule implements passwordService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$hiddenOptionsContainer->addElement($configContainerOptions);
|
$hiddenOptionsContainer->addElement($configContainerOptions);
|
||||||
$configOptionsContainer->addElement($hiddenOptionsContainer);
|
$configOptionsContainer->addElement($hiddenOptionsContainer, true);
|
||||||
|
$advancedOptions = new htmlTable();
|
||||||
|
$advancedOptions->addElement(new htmlTableExtendedInputCheckbox('posixAccount_primaryGroupAsSecondary', false, _('Set primary group as memberUid'), 'primaryGroupAsSecondary'), true);
|
||||||
|
$advancedOptions->addElement(new htmlTableExtendedInputField(_('User name suggestion'), 'posixAccount_userNameSuggestion', '@givenname@%sn%', 'userNameSuggestion'));
|
||||||
|
$advancedOptionsAccordion = new htmlAccordion('posixAccountAdvancedOptions', array(_('Advanced options') => $advancedOptions), false);
|
||||||
|
$advancedOptionsAccordion->colspan = 5;
|
||||||
|
$configOptionsContainer->addElement($advancedOptionsAccordion);
|
||||||
|
|
||||||
$return['config_options']['all'] = $configOptionsContainer;
|
$return['config_options']['all'] = $configOptionsContainer;
|
||||||
// upload
|
// upload
|
||||||
|
@ -393,6 +396,11 @@ class posixAccount extends baseModule implements passwordService {
|
||||||
}
|
}
|
||||||
// help Entries
|
// help Entries
|
||||||
$return['help'] = array(
|
$return['help'] = array(
|
||||||
|
'userNameSuggestion' => array(
|
||||||
|
"Headline" => _("User name suggestion"),
|
||||||
|
"Text" => _("LAM will suggest a user name based on e.g. first and last name. Here you can specify the suggestion. %sn% will be replaced by the last name. @givenname@ will be replaced by the first character of first name. Only attributes of tab Personal may be used.")
|
||||||
|
. '<br>' . _('Common examples are "@givenname@%sn%" or "%givenname%.%sn%".')
|
||||||
|
),
|
||||||
'hiddenOptions' => array(
|
'hiddenOptions' => array(
|
||||||
"Headline" => _("Hidden options"),
|
"Headline" => _("Hidden options"),
|
||||||
"Text" => _("The selected options will not be managed inside LAM. You can use this to reduce the number of displayed input fields.")
|
"Text" => _("The selected options will not be managed inside LAM. You can use this to reduce the number of displayed input fields.")
|
||||||
|
@ -2630,20 +2638,36 @@ class posixAccount extends baseModule implements passwordService {
|
||||||
* @return String user name
|
* @return String user name
|
||||||
*/
|
*/
|
||||||
protected function getUserNameSuggestion($attrs) {
|
protected function getUserNameSuggestion($attrs) {
|
||||||
if (isset($attrs['sn'][0])) {
|
$attributes = array_change_key_case($attrs, CASE_LOWER);
|
||||||
if (isset($attrs['givenName'][0]) && ($attrs['givenName'][0] != '')) {
|
$format = '@givenname@%sn%';
|
||||||
if ($this->SUGGEST_LONG_USER_NAME) {
|
if (isset($this->moduleSettings['posixAccount_userNameSuggestion'][0])) {
|
||||||
return preg_replace('/[^a-z0-9_\\.-]/', '', strtolower($attrs['givenName'][0] . '.' . $attrs['sn'][0]));
|
$format = strtolower($this->moduleSettings['posixAccount_userNameSuggestion'][0]);
|
||||||
|
}
|
||||||
|
// search for @key@ wildcards in format string and replace with first character of attribute
|
||||||
|
$wildcards = array();
|
||||||
|
if (preg_match_all('/@([^@]|[a-zA-Z_-])+@/', $format, $wildcards) > 0) {
|
||||||
|
for ($i = 0; $i < sizeof($wildcards[0]); $i++) {
|
||||||
|
$wc = substr($wildcards[0][$i], 1, strlen($wildcards[0][$i]) - 2);
|
||||||
|
$value = '';
|
||||||
|
if (isset($attributes[$wc][0])) {
|
||||||
|
$value = $attributes[$wc][0][0];
|
||||||
}
|
}
|
||||||
else {
|
$format = str_replace('@' . $wc . '@', $value, $format);
|
||||||
return preg_replace('/[^a-z0-9_-]/', '', strtolower($attrs['givenName'][0][0] . $attrs['sn'][0]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return preg_replace('/[^a-z0-9_-]/', '', strtolower($attrs['sn'][0]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
// search for %key% wildcards in format string and replace with attribute
|
||||||
|
$wildcards = array();
|
||||||
|
if (preg_match_all('/%([^%]|[a-zA-Z_-])+%/', $format, $wildcards) > 0) {
|
||||||
|
for ($i = 0; $i < sizeof($wildcards[0]); $i++) {
|
||||||
|
$wc = substr($wildcards[0][$i], 1, strlen($wildcards[0][$i]) - 2);
|
||||||
|
$value = '';
|
||||||
|
if (isset($attributes[$wc][0])) {
|
||||||
|
$value = $attributes[$wc][0];
|
||||||
|
}
|
||||||
|
$format = str_replace('%' . $wc . '%', $value, $format);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $format;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue