mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-06-23 11:21:42 +02:00
keep client/javascript from re-ordering nummeric option-values by sending them as array of objects with attribute value
This commit is contained in:
parent
e125b27e52
commit
a1b66d286d
@ -83,18 +83,9 @@ class etemplate_widget_menupopup extends etemplate_widget
|
|||||||
{
|
{
|
||||||
$value = $value_in = self::get_array($content, $form_name);
|
$value = $value_in = self::get_array($content, $form_name);
|
||||||
|
|
||||||
$allowed = $this->attrs['multiple'] ? array() : array('' => $this->attrs['options']);
|
$allowed = self::selOptions($form_name, true); // true = return array of option-values
|
||||||
/* if beforeSendToClient is used, we dont need to call it again here
|
if (!$this->attrs['multiple']) $allowed[] = '';
|
||||||
if ($this->attrs['type'])
|
|
||||||
{
|
|
||||||
$allowed += self::typeOptions($form_name, $this->attrs['type'], $this->attrs['no_lang']);
|
|
||||||
// current eTemplate uses sel_options too, not sure if we want/need to keep that
|
|
||||||
//$allowed += self::selOptions($form_name, $this->attrs['no_lang']);
|
|
||||||
}
|
|
||||||
else*/
|
|
||||||
{
|
|
||||||
$allowed += self::selOptions($form_name);
|
|
||||||
}
|
|
||||||
foreach((array) $value as $val)
|
foreach((array) $value as $val)
|
||||||
{
|
{
|
||||||
// array_key_exists() (used below) is inconsistent in how it handles empty/false
|
// array_key_exists() (used below) is inconsistent in how it handles empty/false
|
||||||
@ -102,8 +93,8 @@ class etemplate_widget_menupopup extends etemplate_widget
|
|||||||
if(!$val && $val !== 0) $val = '';
|
if(!$val && $val !== 0) $val = '';
|
||||||
|
|
||||||
// Special for select-account - selOptions doesn't always load all accounts
|
// Special for select-account - selOptions doesn't always load all accounts
|
||||||
if($this->attrs['type'] == 'select-account' && !$GLOBALS['egw']->accounts->visible($val) && !isset($allowed[$val]) ||
|
if($this->attrs['type'] == 'select-account' && !$GLOBALS['egw']->accounts->visible($val) && !in_array($val, $allowed) ||//!isset($allowed[$val]) ||
|
||||||
$this->attrs['type'] != 'select-account' && !array_key_exists($val,$allowed))
|
$this->attrs['type'] != 'select-account' && !in_array($val, $allowed))//!array_key_exists($val,$allowed))
|
||||||
{
|
{
|
||||||
self::set_validation_error($form_name,lang("'%1' is NOT allowed ('%2')!",$val,implode("','",array_keys($allowed))),'');
|
self::set_validation_error($form_name,lang("'%1' is NOT allowed ('%2')!",$val,implode("','",array_keys($allowed))),'');
|
||||||
$value = '';
|
$value = '';
|
||||||
@ -144,7 +135,6 @@ class etemplate_widget_menupopup extends etemplate_widget
|
|||||||
($this->attrs['rows'] && strpos($this->attrs['options'], $this->attrs['rows']) !== 0 ? $this->attrs['rows'].','.$this->attrs['options'] : $this->attrs['options']),
|
($this->attrs['rows'] && strpos($this->attrs['options'], $this->attrs['rows']) !== 0 ? $this->attrs['rows'].','.$this->attrs['options'] : $this->attrs['options']),
|
||||||
$no_lang, $this->attrs['readonly'], self::get_array(self::$request->content, $form_name));
|
$no_lang, $this->attrs['readonly'], self::get_array(self::$request->content, $form_name));
|
||||||
|
|
||||||
|
|
||||||
// if no_lang was modified, forward modification to the client
|
// if no_lang was modified, forward modification to the client
|
||||||
if ($no_lang != $this->attr['no_lang'])
|
if ($no_lang != $this->attr['no_lang'])
|
||||||
{
|
{
|
||||||
@ -152,7 +142,6 @@ class etemplate_widget_menupopup extends etemplate_widget
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Make sure s, etc. are properly encoded when sent, and not double-encoded
|
// Make sure s, etc. are properly encoded when sent, and not double-encoded
|
||||||
$options = (self::$request->sel_options[$form_name] ? $form_name : $this->id);
|
$options = (self::$request->sel_options[$form_name] ? $form_name : $this->id);
|
||||||
if(is_array(self::$request->sel_options[$options]))
|
if(is_array(self::$request->sel_options[$options]))
|
||||||
@ -172,37 +161,57 @@ class etemplate_widget_menupopup extends etemplate_widget
|
|||||||
*
|
*
|
||||||
* @param array $options
|
* @param array $options
|
||||||
*/
|
*/
|
||||||
public static function fix_encoded_options(array &$options)
|
public static function fix_encoded_options(array &$options, $use_array_of_objects=null)
|
||||||
{
|
{
|
||||||
foreach($options as &$label)
|
$backup_options = $options;
|
||||||
|
|
||||||
|
foreach($options as $value => &$label)
|
||||||
{
|
{
|
||||||
|
if (is_null($use_array_of_objects) && is_numeric($value))
|
||||||
|
{
|
||||||
|
$options = $backup_options;
|
||||||
|
return self::fix_encoded_options($options, true);
|
||||||
|
}
|
||||||
// optgroup or values for keys "label" and "title"
|
// optgroup or values for keys "label" and "title"
|
||||||
if(is_array($label))
|
if(is_array($label))
|
||||||
{
|
{
|
||||||
self::fix_encoded_options($label);
|
self::fix_encoded_options($label, false);
|
||||||
|
if ($use_array_of_objects) $label['value'] = $value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$label = html_entity_decode($label, ENT_NOQUOTES, 'utf-8');
|
$label = html_entity_decode($label, ENT_NOQUOTES, 'utf-8');
|
||||||
|
|
||||||
|
if ($use_array_of_objects)
|
||||||
|
{
|
||||||
|
$label = array(
|
||||||
|
'value' => $value,
|
||||||
|
'label' => $label,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ($use_array_of_objects)
|
||||||
|
{
|
||||||
|
$options = array_values($options);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get options from $sel_options array for a given selectbox name
|
* Get options from $sel_options array for a given selectbox name
|
||||||
*
|
*
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @param boolean $no_lang=false value of no_lang attribute
|
* @param boolean $return_values=false true: return array with option values, instead of value => label pairs
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function selOptions($name)
|
public static function selOptions($name, $return_values=false)
|
||||||
{
|
{
|
||||||
$options = array();
|
$options = array();
|
||||||
|
|
||||||
// Check for exact match on name
|
// Check for exact match on name
|
||||||
if (isset(self::$request->sel_options[$name]) && is_array(self::$request->sel_options[$name]))
|
if (isset(self::$request->sel_options[$name]) && is_array(self::$request->sel_options[$name]))
|
||||||
{
|
{
|
||||||
$options += self::$request->sel_options[$name];
|
$options = array_merge($options, self::$request->sel_options[$name]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for base of name in root of sel_options
|
// Check for base of name in root of sel_options
|
||||||
@ -214,11 +223,11 @@ class etemplate_widget_menupopup extends etemplate_widget
|
|||||||
$org_name = $name_parts[count($name_parts)-1];
|
$org_name = $name_parts[count($name_parts)-1];
|
||||||
if (isset(self::$request->sel_options[$org_name]) && is_array(self::$request->sel_options[$org_name]))
|
if (isset(self::$request->sel_options[$org_name]) && is_array(self::$request->sel_options[$org_name]))
|
||||||
{
|
{
|
||||||
$options += self::$request->sel_options[$org_name];
|
$options = array_merge($options, self::$request->sel_options[$org_name]);
|
||||||
}
|
}
|
||||||
elseif (isset(self::$request->sel_options[$name_parts[0]]) && is_array(self::$request->sel_options[$name_parts[0]]))
|
elseif (isset(self::$request->sel_options[$name_parts[0]]) && is_array(self::$request->sel_options[$name_parts[0]]))
|
||||||
{
|
{
|
||||||
$options += self::$request->sel_options[$name_parts[0]];
|
$options = array_merge($options, self::$request->sel_options[$name_parts[0]]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,7 +235,23 @@ class etemplate_widget_menupopup extends etemplate_widget
|
|||||||
// Check for options-$name in content
|
// Check for options-$name in content
|
||||||
if (is_array(self::$request->content['options-'.$name]))
|
if (is_array(self::$request->content['options-'.$name]))
|
||||||
{
|
{
|
||||||
$options += self::$request->content['options-'.$name];
|
$options = array_merge($options, self::$request->content['options-'.$name]);
|
||||||
|
}
|
||||||
|
if ($return_values)
|
||||||
|
{
|
||||||
|
$values = array();
|
||||||
|
foreach($options as $key => $val)
|
||||||
|
{
|
||||||
|
if (is_array($val) && isset($val['value']))
|
||||||
|
{
|
||||||
|
$values[] = $val['value'];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$values[] = $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$options = $values;
|
||||||
}
|
}
|
||||||
//error_log(__METHOD__."('$name') returning ".array2string($options));
|
//error_log(__METHOD__."('$name') returning ".array2string($options));
|
||||||
return $options;
|
return $options;
|
||||||
|
@ -78,7 +78,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
},
|
},
|
||||||
// Type specific legacy options. Avoid using.
|
// Type specific legacy options. Avoid using.
|
||||||
"other": {
|
"other": {
|
||||||
"ignore": true,
|
"ignore": true,
|
||||||
"type": "any"
|
"type": "any"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -87,7 +87,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Construtor
|
* Construtor
|
||||||
*
|
*
|
||||||
* @memberOf et2_selectbox
|
* @memberOf et2_selectbox
|
||||||
*/
|
*/
|
||||||
init: function() {
|
init: function() {
|
||||||
@ -95,14 +95,14 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
|
|
||||||
this.input = null;
|
this.input = null;
|
||||||
this.value = '';
|
this.value = '';
|
||||||
|
|
||||||
// Allow no other widgets inside this one
|
// Allow no other widgets inside this one
|
||||||
this.supportedWidgetClasses = [];
|
this.supportedWidgetClasses = [];
|
||||||
|
|
||||||
// Legacy options could have row count or empty label in first slot
|
// Legacy options could have row count or empty label in first slot
|
||||||
if(typeof this.options.rows == "string")
|
if(typeof this.options.rows == "string")
|
||||||
{
|
{
|
||||||
if(isNaN(this.options.rows))
|
if(isNaN(this.options.rows))
|
||||||
{
|
{
|
||||||
this.options.empty_label = this.options.rows;
|
this.options.empty_label = this.options.rows;
|
||||||
this.options.rows = 1;
|
this.options.rows = 1;
|
||||||
@ -113,7 +113,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.options.rows > 1)
|
if(this.options.rows > 1)
|
||||||
{
|
{
|
||||||
this.options.multiple = true;
|
this.options.multiple = true;
|
||||||
if(this.options.tags)
|
if(this.options.tags)
|
||||||
@ -183,7 +183,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
{
|
{
|
||||||
content_options = this.getArrayMgr("sel_options").getEntry(name_parts[name_parts.length-1]);
|
content_options = this.getArrayMgr("sel_options").getEntry(name_parts[name_parts.length-1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try name like widget[$row]
|
// Try name like widget[$row]
|
||||||
if(!content_options || content_options.length == 0)
|
if(!content_options || content_options.length == 0)
|
||||||
{
|
{
|
||||||
@ -249,7 +249,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
{
|
{
|
||||||
return this._appendMultiOption(_value, _label, _title, dom_element);
|
return this._appendMultiOption(_value, _label, _title, dom_element);
|
||||||
}
|
}
|
||||||
|
|
||||||
var option = $j(document.createElement("option"))
|
var option = $j(document.createElement("option"))
|
||||||
.attr("value", _value)
|
.attr("value", _value)
|
||||||
.text(_label+"");
|
.text(_label+"");
|
||||||
@ -263,14 +263,14 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
// Make sure empty / all option is first
|
// Make sure empty / all option is first
|
||||||
option.prependTo(this.input);
|
option.prependTo(this.input);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
option.appendTo(dom_element || this.input);
|
option.appendTo(dom_element || this.input);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Append a value to multi-select
|
* Append a value to multi-select
|
||||||
*/
|
*/
|
||||||
_appendMultiOption: function(_value, _label, _title, dom_element) {
|
_appendMultiOption: function(_value, _label, _title, dom_element) {
|
||||||
var option_data = null;
|
var option_data = null;
|
||||||
@ -282,7 +282,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
|
|
||||||
// Already in header
|
// Already in header
|
||||||
if(_label == this.options.empty_label) return;
|
if(_label == this.options.empty_label) return;
|
||||||
|
|
||||||
var opt_id = this.dom_id + "_opt_" + _value;
|
var opt_id = this.dom_id + "_opt_" + _value;
|
||||||
var label = jQuery(document.createElement("label"))
|
var label = jQuery(document.createElement("label"))
|
||||||
.attr("for", opt_id)
|
.attr("for", opt_id)
|
||||||
@ -317,7 +317,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
}
|
}
|
||||||
label.append(jQuery("<span>"+_label+"</span>"));
|
label.append(jQuery("<span>"+_label+"</span>"));
|
||||||
var li = jQuery(document.createElement("li")).append(label);
|
var li = jQuery(document.createElement("li")).append(label);
|
||||||
|
|
||||||
li.appendTo(dom_element || this.multiOptions);
|
li.appendTo(dom_element || this.multiOptions);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -366,14 +366,14 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
.addClass("ui-multiselect-header")
|
.addClass("ui-multiselect-header")
|
||||||
.appendTo(header);
|
.appendTo(header);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up for options to be added later
|
// Set up for options to be added later
|
||||||
var options = this.multiOptions = jQuery(document.createElement("ul"));
|
var options = this.multiOptions = jQuery(document.createElement("ul"));
|
||||||
this.multiOptions.addClass("ui-multiselect-checkboxes ui-helper-reset")
|
this.multiOptions.addClass("ui-multiselect-checkboxes ui-helper-reset")
|
||||||
.css("height", 1.9*this.options.rows + "em")
|
.css("height", 1.9*this.options.rows + "em")
|
||||||
.appendTo(node);
|
.appendTo(node);
|
||||||
|
|
||||||
if(this.options.rows >= 5)
|
if(this.options.rows >= 5)
|
||||||
{
|
{
|
||||||
// Check / uncheck all
|
// Check / uncheck all
|
||||||
var header_controls = {
|
var header_controls = {
|
||||||
@ -397,7 +397,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setDOMNode(node[0]);
|
this.setDOMNode(node[0]);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -534,14 +534,14 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
*/
|
*/
|
||||||
set_tags: function(tags) {
|
set_tags: function(tags) {
|
||||||
this.options.tags = tags;
|
this.options.tags = tags;
|
||||||
|
|
||||||
// Can't actually do chosen until attached, loadingFinished should call again
|
// Can't actually do chosen until attached, loadingFinished should call again
|
||||||
if(!this.isAttached()) return;
|
if(!this.isAttached()) return;
|
||||||
|
|
||||||
if(this.input != null && !this.options.tags && !this.options.search)
|
if(this.input != null && !this.options.tags && !this.options.search)
|
||||||
{
|
{
|
||||||
this.input.unchosen().css('width', '');
|
this.input.unchosen().css('width', '');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -614,12 +614,12 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
.append('<li class="ui-widget-header"><span>'+key+'</span></li>')
|
.append('<li class="ui-widget-header"><span>'+key+'</span></li>')
|
||||||
.appendTo(this.multiOptions);
|
.appendTo(this.multiOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(var sub in _options[key])
|
for(var sub in _options[key])
|
||||||
{
|
{
|
||||||
if (typeof _options[key][sub] === 'object')
|
if (typeof _options[key][sub] === 'object')
|
||||||
{
|
{
|
||||||
this._appendOptionElement(sub,
|
this._appendOptionElement(sub,
|
||||||
_options[key][sub]["label"] ? _options[key][sub]["label"] : "",
|
_options[key][sub]["label"] ? _options[key][sub]["label"] : "",
|
||||||
_options[key][sub]["title"] ? _options[key][sub]["title"] : "",
|
_options[key][sub]["title"] ? _options[key][sub]["title"] : "",
|
||||||
group
|
group
|
||||||
@ -635,11 +635,12 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
{
|
{
|
||||||
// Allow some special extras for objects by passing the whole thing
|
// Allow some special extras for objects by passing the whole thing
|
||||||
_options[key]["label"] = _options[key]["label"] ? _options[key]["label"] : "";
|
_options[key]["label"] = _options[key]["label"] ? _options[key]["label"] : "";
|
||||||
this._appendMultiOption(key, _options[key], _options[key]["title"]);
|
this._appendMultiOption(_options[key].value ? _options[key].value : key,
|
||||||
|
_options[key], _options[key]["title"]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this._appendOptionElement(key,
|
this._appendOptionElement(_options[key].value ? _options[key].value : key,
|
||||||
_options[key]["label"] ? _options[key]["label"] : "",
|
_options[key]["label"] ? _options[key]["label"] : "",
|
||||||
_options[key]["title"] ? _options[key]["title"] : "");
|
_options[key]["title"] ? _options[key]["title"] : "");
|
||||||
}
|
}
|
||||||
@ -667,7 +668,7 @@ var et2_selectbox = et2_inputWidget.extend(
|
|||||||
}
|
}
|
||||||
return this.value;
|
return this.value;
|
||||||
},
|
},
|
||||||
|
|
||||||
isDirty: function() {
|
isDirty: function() {
|
||||||
if(this.input == null)
|
if(this.input == null)
|
||||||
{
|
{
|
||||||
@ -689,14 +690,14 @@ et2_register_widget(et2_selectbox, ["menupopup", "listbox", "select", "select-ca
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* et2_selectbox_ro is the readonly implementation of the selectbox.
|
* et2_selectbox_ro is the readonly implementation of the selectbox.
|
||||||
*
|
*
|
||||||
* @augments et2_selectbox
|
* @augments et2_selectbox
|
||||||
*/
|
*/
|
||||||
var et2_selectbox_ro = et2_selectbox.extend([et2_IDetachedDOM],
|
var et2_selectbox_ro = et2_selectbox.extend([et2_IDetachedDOM],
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @memberOf et2_selectbox_ro
|
* @memberOf et2_selectbox_ro
|
||||||
*/
|
*/
|
||||||
init: function() {
|
init: function() {
|
||||||
@ -917,14 +918,14 @@ et2_register_widget(et2_selectbox_ro, ["menupopup_ro", "listbox_ro", "select_ro"
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class which just implements the menulist container
|
* Class which just implements the menulist container
|
||||||
*
|
*
|
||||||
* @augments et2_DOMWidget
|
* @augments et2_DOMWidget
|
||||||
*/
|
*/
|
||||||
var et2_menulist = et2_DOMWidget.extend(
|
var et2_menulist = et2_DOMWidget.extend(
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Construtor
|
* Construtor
|
||||||
*
|
*
|
||||||
* @memberOf et2_menulist
|
* @memberOf et2_menulist
|
||||||
*/
|
*/
|
||||||
init: function() {
|
init: function() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user