diff --git a/api/js/etemplate/et2_widget_selectbox.js b/api/js/etemplate/et2_widget_selectbox.js index 2a28fcf607..d9883ff9a9 100644 --- a/api/js/etemplate/et2_widget_selectbox.js +++ b/api/js/etemplate/et2_widget_selectbox.js @@ -576,6 +576,19 @@ var et2_selectbox = (function(){ "use strict"; return et2_inputWidget.extend( selected.addClass('et2_country-select flag-'+ _value.toLowerCase()); } } + if(this._type == "select-bitwise" && _value && !isNaN(_value) && this.options.select_options) + { + var new_value = []; + for(var index in this.options.select_options) + { + var right = this.options.select_options[index].value; + if(!!(_value & right)) + { + new_value.push(right); + } + } + _value = new_value; + } this._oldValue = this.value; if(this.input !== null && (this.options.tags || this.options.search)) { @@ -1040,7 +1053,7 @@ et2_register_widget(et2_selectbox, ["menupopup", "listbox", "select", "select-ca "select-percent", 'select-priority', 'select-country', 'select-state', 'select-year', 'select-month', 'select-day', 'select-dow', 'select-hour', 'select-number', 'select-app', - 'select-lang', 'select-bool', 'select-timezone' ]); + 'select-lang', 'select-bool', 'select-timezone', 'select-bitwise' ]); // Static class stuff jQuery.extend(et2_selectbox, //(function(){ "use strict"; return @@ -1563,6 +1576,20 @@ var et2_selectbox_ro = (function(){ "use strict"; return et2_selectbox.extend([e set_value: function(_value) { this.value = _value; + if(this._type == "select-bitwise" && _value && !isNaN(_value) && this.options.select_options) + { + var new_value = []; + for(var index in this.options.select_options) + { + var option = this.options.select_options[index]; + var right = option && option.value ? option.value : index; + if(!!(_value & right)) + { + new_value.push(right); + } + } + _value = new_value; + } if(typeof _value == "string") { _value = _value.match(this._is_multiple_regexp) !== null ? _value.split(',') : [_value]; @@ -1661,7 +1688,7 @@ et2_register_widget(et2_selectbox_ro, ["menupopup_ro", "listbox_ro", "select_ro" "select-percent_ro", 'select-priority_ro', 'select-access_ro', 'select-country_ro', 'select-state_ro', 'select-year_ro', 'select-month_ro', 'select-day_ro', 'select-dow_ro', 'select-hour_ro', 'select-number_ro', 'select-app_ro', - 'select-lang_ro', 'select-bool_ro', 'select-timezone_ro' ]); + 'select-lang_ro', 'select-bool_ro', 'select-timezone_ro', 'select-bitwise_ro' ]); /** * Widget class which represents a single option inside a selectbox diff --git a/api/src/Etemplate/Widget/Select.php b/api/src/Etemplate/Widget/Select.php index a456d8b1d0..293559a431 100644 --- a/api/src/Etemplate/Widget/Select.php +++ b/api/src/Etemplate/Widget/Select.php @@ -255,6 +255,15 @@ class Select extends Etemplate\Widget $value = self::$request->preserv[$unavailable_name]; } } + case 'select-bitwise': + // Sum up into a single value + $sum = 0; + foreach((array) $value as $val) + { + $sum += $val; + } + $value = $sum; + } if (isset($value)) { @@ -783,6 +792,25 @@ class Select extends Etemplate\Widget $options = $type ? Api\DateTime::getTimezones() : Api\DateTime::getUserTimezones($value); } break; + case 'select-bitwise': + // type = app name + $options = $form_name ? self::selOptions($form_name) : array(); + $new_value = array(); + $i = 0; + $appname = $type ? $type : ($widget && $widget->attrs['appname'] ? + self::expand_name($widget->attrs['appname'], 0, 0,'','',self::$cont) : ''); + if($appname) + { + $options += (array)Api\Hooks::single(array('location' => 'acl_rights'), $appname); + } + foreach((array)$options as $right => $name) + { + if(!!($value & $right)) + { + $new_value[] = $right; + } + } + $value = $new_value; } if ($rows > 1 || $readonly) {