2011-08-18 19:34:01 +02:00
/ * *
2013-04-13 21:00:13 +02:00
* EGroupware eTemplate2 - JS Radiobox object
2011-08-18 19:34:01 +02:00
*
* @ license http : //opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @ package etemplate
* @ subpackage api
* @ link http : //www.egroupware.org
* @ author Nathan Gray
* @ copyright Nathan Gray 2011
* @ version $Id$
* /
"use strict" ;
/ * e g w : u s e s
jquery . jquery ;
2011-08-24 12:18:07 +02:00
et2 _core _inputWidget ;
2011-08-18 19:34:01 +02:00
* /
/ * *
* Class which implements the "radiobox" XET - Tag
2013-04-13 21:00:13 +02:00
*
* @ augments et2 _inputWidget
2011-08-18 19:34:01 +02:00
* /
2013-04-13 21:00:13 +02:00
var et2 _radiobox = et2 _inputWidget . extend (
{
2011-08-18 19:34:01 +02:00
attributes : {
"set_value" : {
"name" : "Set value" ,
"type" : "string" ,
"default" : "true" ,
"description" : "Value when selected"
} ,
"ro_true" : {
"name" : "Read only selected" ,
"type" : "string" ,
"default" : "x" ,
"description" : "What should be displayed when readonly and selected"
} ,
"ro_false" : {
"name" : "Read only unselected" ,
"type" : "string" ,
"default" : "" ,
"description" : "What should be displayed when readonly and not selected"
}
} ,
2012-05-08 22:25:56 +02:00
legacyOptions : [ "set_value" , "ro_true" , "ro_false" ] ,
2011-08-18 19:34:01 +02:00
2013-04-13 21:00:13 +02:00
/ * *
* Constructor
*
* @ memberOf et2 _radiobox
* /
2011-08-24 12:05:52 +02:00
init : function ( ) {
2011-08-18 19:34:01 +02:00
this . _super . apply ( this , arguments ) ;
this . input = null ;
this . id = "" ;
this . createInputWidget ( ) ;
} ,
createInputWidget : function ( ) {
2012-03-23 19:57:13 +01:00
this . input = $j ( document . createElement ( "input" ) )
. val ( this . options . set _value )
. attr ( "type" , "radio" ) ;
2011-08-18 19:34:01 +02:00
this . input . addClass ( "et2_radiobox" ) ;
this . setDOMNode ( this . input [ 0 ] ) ;
} ,
2012-03-23 19:57:13 +01:00
set _name : function ( _name ) {
if ( _name . substr ( _name . length - 2 ) != "[]" )
{
_name += "[]" ;
}
this . input . attr ( "name" , _name ) ;
} ,
2013-06-18 17:08:50 +02:00
/ * *
* Default for radio buttons is label after button
*
* @ param _label String New label for radio button . Use % s to locate the radio button somewhere else in the label
* /
set _label : function ( _label ) {
if ( _label . length > 0 && _label . indexOf ( '%s' ) == - 1 )
{
_label = '%s' + _label ;
}
this . _super . apply ( this , [ _label ] ) ;
} ,
2011-08-18 19:34:01 +02:00
/ * *
* Override default to match against set / unset value
* /
set _value : function ( _value ) {
2012-03-23 19:57:13 +01:00
if ( _value == this . options . set _value ) {
this . input . attr ( "checked" , "checked" ) ;
} else {
this . input . removeAttr ( "checked" ) ;
2011-08-18 19:34:01 +02:00
}
} ,
/ * *
* Override default to return unchecked value
* /
getValue : function ( ) {
2012-03-23 19:57:13 +01:00
if ( jQuery ( "input:checked" , this . _parent . getDOMNode ( ) ) . val ( ) == this . options . set _value ) {
return this . options . set _value ;
2011-08-18 19:34:01 +02:00
}
2012-03-23 19:57:13 +01:00
return null ;
2011-08-18 19:34:01 +02:00
}
} ) ;
et2 _register _widget ( et2 _radiobox , [ "radio" ] ) ;
2013-04-13 21:00:13 +02:00
/ * *
* @ augments et2 _valueWidget
* /
var et2 _radiobox _ro = et2 _valueWidget . extend ( [ et2 _IDetachedDOM ] ,
{
2012-03-23 19:57:13 +01:00
attributes : {
"set_value" : {
"name" : "Set value" ,
"type" : "string" ,
"default" : "true" ,
"description" : "Value when selected"
} ,
"ro_true" : {
"name" : "Read only selected" ,
"type" : "string" ,
"default" : "x" ,
"description" : "What should be displayed when readonly and selected"
} ,
"ro_false" : {
"name" : "Read only unselected" ,
"type" : "string" ,
"default" : "" ,
"description" : "What should be displayed when readonly and not selected"
} ,
"label" : {
"name" : "Label" ,
"default" : "" ,
2013-06-25 22:53:39 +02:00
"type" : "string"
2012-03-23 19:57:13 +01:00
}
} ,
2013-04-13 21:00:13 +02:00
/ * *
* Constructor
*
* @ memberOf et2 _radiobox _ro
* /
2012-03-23 19:57:13 +01:00
init : function ( ) {
this . _super . apply ( this , arguments ) ;
this . value = "" ;
this . span = $j ( document . createElement ( "span" ) )
. addClass ( "et2_radiobox" ) ;
this . setDOMNode ( this . span [ 0 ] ) ;
} ,
/ * *
* Override default to match against set / unset value
* /
set _value : function ( _value ) {
if ( _value == this . options . set _value ) {
this . span . text ( this . options . ro _true ) ;
} else {
this . span . text ( this . options . ro _false ) ;
}
} ,
2013-06-18 22:55:13 +02:00
2012-03-23 19:57:13 +01:00
/ * *
* Code for implementing et2 _IDetachedDOM
* /
getDetachedAttributes : function ( _attrs )
{
// Show label in nextmatch instead of just x
this . options . ro _true = this . options . label ;
_attrs . push ( "value" ) ;
} ,
getDetachedNodes : function ( )
{
return [ this . span [ 0 ] ] ;
} ,
setDetachedAttributes : function ( _nodes , _values )
{
this . span = jQuery ( _nodes [ 0 ] ) ;
this . set _value ( _values [ "value" ] ) ;
}
} ) ;
et2 _register _widget ( et2 _radiobox _ro , [ "radio_ro" ] ) ;
/ * *
* A group of radio buttons
2013-04-13 21:00:13 +02:00
*
2013-06-18 22:55:13 +02:00
* @ augments et2 _valueWidget
2012-03-23 19:57:13 +01:00
* /
2013-06-25 22:53:39 +02:00
var et2 _radioGroup = et2 _valueWidget . extend ( [ et2 _IDetachedDOM ] ,
2013-04-13 21:00:13 +02:00
{
2012-03-23 19:57:13 +01:00
attributes : {
2013-06-18 22:55:13 +02:00
"label" : {
2013-06-25 22:53:39 +02:00
"name" : "Label" ,
"default" : "" ,
"type" : "string" ,
"description" : "The label is displayed above the list of radio buttons. The label can contain variables, as descript for name. If the label starts with a '@' it is replaced by the value of the content-array at this index (with the '@'-removed and after expanding the variables)." ,
"translate" : true
} ,
2012-03-23 19:57:13 +01:00
"value" : {
"name" : "Value" ,
"type" : "string" ,
"default" : "true" ,
"description" : "Value for each radio button"
} ,
"ro_true" : {
"name" : "Read only selected" ,
"type" : "string" ,
"default" : "x" ,
"description" : "What should be displayed when readonly and selected"
} ,
"ro_false" : {
"name" : "Read only unselected" ,
"type" : "string" ,
"default" : "" ,
"description" : "What should be displayed when readonly and not selected"
} ,
"options" : {
"name" : "Radio options" ,
"type" : "any" ,
"default" : { } ,
"description" : "Options for radio buttons. Should be {value: label, ...}"
2013-06-25 22:53:39 +02:00
} ,
2013-06-26 22:50:10 +02:00
"needed" : {
2013-06-25 22:53:39 +02:00
"name" : "Required" ,
"default" : false ,
"type" : "boolean" ,
"description" : "If required, the user must select one of the options before the form can be submitted"
2012-03-23 19:57:13 +01:00
}
} ,
createNamespace : false ,
2013-04-13 21:00:13 +02:00
/ * *
* Constructor
*
* @ param parent
* @ param attrs
* @ memberOf et2 _radioGroup
* /
2012-03-23 19:57:13 +01:00
init : function ( parent , attrs ) {
this . _super . apply ( this , arguments ) ;
2013-06-18 22:55:13 +02:00
this . node = $j ( document . createElement ( "div" ) )
. addClass ( "et2_vbox" )
. addClass ( "et2_box_widget" ) ;
2013-06-26 22:50:10 +02:00
if ( this . options . needed )
2013-06-25 22:53:39 +02:00
{
// This isn't strictly allowed, but it works
this . node . attr ( "required" , "required" ) ;
}
2013-06-18 22:55:13 +02:00
this . setDOMNode ( this . node [ 0 ] ) ;
// The supported widget classes array defines a whitelist for all widget
2013-06-25 22:53:39 +02:00
// classes or interfaces child widgets have to support.
this . supportedWidgetClasses = [ et2 _radiobox , et2 _radiobox _ro ] ;
2012-03-23 19:57:13 +01:00
} ,
set _value : function ( _value ) {
this . value = _value ;
for ( var i = 0 ; i < this . _children . length ; i ++ )
2013-06-25 22:53:39 +02:00
{
var radio = this . _children [ i ] ;
2012-03-23 19:57:13 +01:00
radio . set _value ( _value ) ;
2013-06-25 22:53:39 +02:00
}
2012-03-23 19:57:13 +01:00
} ,
2013-06-18 22:55:13 +02:00
getValue : function ( ) {
return jQuery ( "input:checked" , this . getDOMNode ( ) ) . val ( ) ;
} ,
2012-03-23 19:57:13 +01:00
/ * *
* Set a bunch of radio buttons
* Options should be { value : label , ... }
* /
set _options : function ( _options ) {
for ( var key in _options )
{
var attrs = {
// Add index so radios work properly
"id" : ( this . options . readonly ? this . id : this . id + "[" + "]" ) ,
set _value : key ,
label : _options [ key ] ,
ro _true : this . options . ro _true ,
ro _false : this . options . ro _false ,
2013-06-25 22:53:39 +02:00
readonly : this . options . readonly ,
2013-06-26 22:50:10 +02:00
needed : this . options . needed
2013-04-13 21:00:13 +02:00
} ;
2012-03-23 19:57:13 +01:00
var radio = et2 _createWidget ( "radio" , attrs , this ) ;
}
this . set _value ( this . value ) ;
2013-06-18 22:55:13 +02:00
} ,
/ * *
* Set a label on the group of radio buttons
* /
set _label : function ( _value ) {
// Abort if ther was no change in the label
if ( _value == this . label )
{
return ;
}
if ( _value )
{
// Create the label container if it didn't exist yet
if ( this . _labelContainer == null )
{
this . _labelContainer = $j ( document . createElement ( "label" ) )
this . getSurroundings ( ) . insertDOMNode ( this . _labelContainer [ 0 ] ) ;
}
// Clear the label container.
this . _labelContainer . empty ( ) ;
// Create the placeholder element and set it
var ph = document . createElement ( "span" ) ;
this . getSurroundings ( ) . setWidgetPlaceholder ( ph ) ;
this . _labelContainer
. append ( document . createTextNode ( _value ) )
. append ( ph ) ;
}
else
{
// Delete the labelContainer from the surroundings object
if ( this . _labelContainer )
{
this . getSurroundings ( ) . removeDOMNode ( this . _labelContainer [ 0 ] ) ;
}
this . _labelContainer = null ;
}
2013-06-25 22:53:39 +02:00
} ,
/ * *
* Code for implementing et2 _IDetachedDOM
* This doesn ' t need to be implemented .
* Individual widgets are detected and handled by the grid , but the interface is needed for this to happen
* /
getDetachedAttributes : function ( _attrs )
{
} ,
getDetachedNodes : function ( )
{
return [ this . getDOMNode ( ) ] ;
} ,
setDetachedAttributes : function ( _nodes , _values )
{
2012-03-23 19:57:13 +01:00
}
2013-06-18 22:55:13 +02:00
2012-03-23 19:57:13 +01:00
} ) ;
// No such tag as 'radiogroup', but it needs something
et2 _register _widget ( et2 _radioGroup , [ "radiogroup" ] ) ;