forked from Techsystech/web
parent
354324bbc2
commit
bfb5a0686f
|
@ -7,7 +7,8 @@ Web widget boolean switch
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
This module add a widget ``boolean_switch`` to render boolean fields. One
|
This module add a widget ``boolean_switch`` to render boolean fields. One
|
||||||
of it's main features is to quick edit that field without enter in edit mode.
|
of it's main features is to quick edit that field without enter in edit mode
|
||||||
|
from list view or form view.
|
||||||
|
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
|
@ -40,31 +41,39 @@ extra
|
||||||
|
|
||||||
*Available options*:
|
*Available options*:
|
||||||
|
|
||||||
* **size**: The checkbox size - default: `null` - values: null, 'mini', 'small', 'normal', 'large'
|
* **size**: The checkbox size - default: `null` - values: null, 'mini',
|
||||||
|
'small', 'normal', 'large'
|
||||||
* **animate**: Animate the switch - default: `true`
|
* **animate**: Animate the switch - default: `true`
|
||||||
* **indeterminate**: Indeterminate state - default: `false`
|
* **indeterminate**: Indeterminate state - default: `false`
|
||||||
* **inverse**: Inverse switch direction - default: `false`
|
* **inverse**: Inverse switch direction - default: `false`
|
||||||
* **onColor**: Color of the left side of the switch - default: `"primary"` - values: 'primary', 'info', 'success', 'warning', 'danger', 'default'
|
* **onColor**: Color of the left side of the switch - default: `"primary"` -
|
||||||
* **offColor**: Color of the right side of the switch - default: `default` - values: 'primary', 'info', 'success', 'warning', 'danger', 'default'
|
values: 'primary', 'info', 'success', 'warning', 'danger', 'default'
|
||||||
|
* **offColor**: Color of the right side of the switch - default: `default` -
|
||||||
|
values: 'primary', 'info', 'success', 'warning', 'danger', 'default'
|
||||||
* **onText**: Text of the left side of the switch - default: `"ON"`
|
* **onText**: Text of the left side of the switch - default: `"ON"`
|
||||||
* **offText**: Text of the right side of the switch - default: `"OFF"`,
|
* **offText**: Text of the right side of the switch - default: `"OFF"`
|
||||||
* **labelText**: Text of the center handle of the switch - default: `" "`,
|
* **labelText**: Text of the center handle of the switch - default:
|
||||||
* **handleWidth**: Width of the left and right sides in pixels - default: `"auto"`,
|
`" "`,
|
||||||
* **labelWidth**: Width of the center handle in pixels - default: `"auto"`,
|
* **handleWidth**: Width of the left and right sides in pixels - default:
|
||||||
* **baseClass**: Global class prefix - default: `"bootstrap-switch"`,
|
`"auto"`,
|
||||||
* **wrapperClass**: Container element class(es) - default: `"wrapper"`,
|
* **labelWidth**: Width of the center handle in pixels - default: `"auto"`
|
||||||
|
* **baseClass**: Global class prefix - default: `"bootstrap-switch"`
|
||||||
|
* **wrapperClass**: Container element class(es) - default: `"wrapper"`
|
||||||
|
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
Those parameters are overwritten by this module or highly discouraged:
|
Those parameters are overwritten by this module or highly discouraged:
|
||||||
|
|
||||||
* **radioAllOff**: Allow this radio button to be unchecked by the user - default: `false`
|
* **radioAllOff**: Allow this radio button to be unchecked by the user -
|
||||||
|
default: `false`
|
||||||
* **state**: The checkbox state - default: `true`
|
* **state**: The checkbox state - default: `true`
|
||||||
* **disabled**: Disable state - default: `false`
|
* **disabled**: Disable state - default: `false`
|
||||||
* **readonly**: Readonly state - default: `false`
|
* **readonly**: Readonly state - default: `false`
|
||||||
* **onInit**: Callback function to execute on initialization - default: `function() {}`,
|
* **onInit**: Callback function to execute on initialization - default:
|
||||||
* **onSwitchChange**: Callback function to execute on switch state change - default: `function() {}`
|
`function() {}`,
|
||||||
|
* **onSwitchChange**: Callback function to execute on switch state change -
|
||||||
|
default: `function() {}`
|
||||||
|
|
||||||
attrs
|
attrs
|
||||||
-----
|
-----
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
'static/lib/bootstrap-switch/bootstrap-switch.js',
|
'static/lib/bootstrap-switch/bootstrap-switch.js',
|
||||||
'static/src/js/web_widget_boolean_switch.js',
|
'static/src/js/web_widget_boolean_switch.js',
|
||||||
],
|
],
|
||||||
|
'test': [
|
||||||
|
'static/test/web_widget_boolean_switch.js',
|
||||||
|
],
|
||||||
"css": [
|
"css": [
|
||||||
'static/lib/bootstrap-switch/bootstrap-switch.css',
|
'static/lib/bootstrap-switch/bootstrap-switch.css',
|
||||||
],
|
],
|
||||||
|
@ -34,5 +37,139 @@
|
||||||
"demo": [
|
"demo": [
|
||||||
'demo/res_users_view.xml',
|
'demo/res_users_view.xml',
|
||||||
],
|
],
|
||||||
'description': """""", # TODO: copy README.rst
|
'description': """
|
||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Web widget boolean switch
|
||||||
|
=========================
|
||||||
|
|
||||||
|
This module add a widget ``boolean_switch`` to render boolean fields. One
|
||||||
|
of it's main features is to quick edit that field without enter in edit mode
|
||||||
|
from list view or form view.
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
In the view (test on tree view and form view), you can declare any boolean
|
||||||
|
field using this widget.
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
```
|
||||||
|
<field name="active"
|
||||||
|
widget="boolean_switch"
|
||||||
|
attrs="{'readonly': [('login', '=', 'admin')]}"
|
||||||
|
context="{'fake_parameter': 'foo'}"
|
||||||
|
options="{'quick_edit': True, 'extra': {'onText': 'Yes', 'offText': 'No'}}"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
Options
|
||||||
|
-------
|
||||||
|
|
||||||
|
quick_edit
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
extra
|
||||||
|
~~~~~
|
||||||
|
``extra`` is used to set
|
||||||
|
`bootstrap-switch <http://www.bootstrap-switch.org/options.html>`_ options.
|
||||||
|
|
||||||
|
*Available options*:
|
||||||
|
|
||||||
|
* **size**: The checkbox size - default: `null` - values: null, 'mini',
|
||||||
|
'small', 'normal', 'large'
|
||||||
|
* **animate**: Animate the switch - default: `true`
|
||||||
|
* **indeterminate**: Indeterminate state - default: `false`
|
||||||
|
* **inverse**: Inverse switch direction - default: `false`
|
||||||
|
* **onColor**: Color of the left side of the switch - default: `"primary"` -
|
||||||
|
values: 'primary', 'info', 'success', 'warning', 'danger', 'default'
|
||||||
|
* **offColor**: Color of the right side of the switch - default: `default` -
|
||||||
|
values: 'primary', 'info', 'success', 'warning', 'danger', 'default'
|
||||||
|
* **onText**: Text of the left side of the switch - default: `"ON"`
|
||||||
|
* **offText**: Text of the right side of the switch - default: `"OFF"`
|
||||||
|
* **labelText**: Text of the center handle of the switch - default:
|
||||||
|
`" "`,
|
||||||
|
* **handleWidth**: Width of the left and right sides in pixels - default:
|
||||||
|
`"auto"`,
|
||||||
|
* **labelWidth**: Width of the center handle in pixels - default: `"auto"`
|
||||||
|
* **baseClass**: Global class prefix - default: `"bootstrap-switch"`
|
||||||
|
* **wrapperClass**: Container element class(es) - default: `"wrapper"`
|
||||||
|
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
Those parameters are overwritten by this module or highly discouraged:
|
||||||
|
|
||||||
|
* **radioAllOff**: Allow this radio button to be unchecked by the user -
|
||||||
|
default: `false`
|
||||||
|
* **state**: The checkbox state - default: `true`
|
||||||
|
* **disabled**: Disable state - default: `false`
|
||||||
|
* **readonly**: Readonly state - default: `false`
|
||||||
|
* **onInit**: Callback function to execute on initialization - default:
|
||||||
|
`function() {}`,
|
||||||
|
* **onSwitchChange**: Callback function to execute on switch state change -
|
||||||
|
default: `function() {}`
|
||||||
|
|
||||||
|
attrs
|
||||||
|
-----
|
||||||
|
|
||||||
|
This attribute is supported as expected!
|
||||||
|
|
||||||
|
context
|
||||||
|
-------
|
||||||
|
|
||||||
|
``context`` is sent to the ``write`` method of the field model in case of
|
||||||
|
special needs with the quick edition.
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
|
||||||
|
:alt: Try me on Runbot
|
||||||
|
:target: https://runbot.odoo-community.org/runbot/162/7.0
|
||||||
|
|
||||||
|
Known issues / Roadmap
|
||||||
|
======================
|
||||||
|
|
||||||
|
* Manage Null values
|
||||||
|
*
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues <https://github.com/OCA/web/issues>`_.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and
|
||||||
|
welcomed feedback `here <https://github.com/OCA/web/issues/new?body=module:%20
|
||||||
|
web_widget_boolean_switch%0Aversion:%207.0%0A%0A**Steps%20to%20reproduce**%0A-
|
||||||
|
%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Pierre Verkest <pverkest@anybox.fr>
|
||||||
|
|
||||||
|
Maintainer
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. image:: https://odoo-community.org/logo.png
|
||||||
|
:alt: Odoo Community Association
|
||||||
|
:target: https://odoo-community.org
|
||||||
|
|
||||||
|
This module is maintained by the OCA.
|
||||||
|
|
||||||
|
OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||||
|
mission is to support the collaborative development of Odoo features and
|
||||||
|
promote its widespread use.
|
||||||
|
|
||||||
|
To contribute to this module, please visit http://odoo-community.org.
|
||||||
|
|
||||||
|
""",
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,22 +18,21 @@ openerp.web_widget_boolean_switch = function(instance){
|
||||||
var switchOptions = options.hasOwnProperty('extra') ?
|
var switchOptions = options.hasOwnProperty('extra') ?
|
||||||
options.extra : {};
|
options.extra : {};
|
||||||
|
|
||||||
_.extend(switchOptions, {
|
|
||||||
'disabled': options.hasOwnProperty('disabled') ?
|
|
||||||
options.disabled : !this.quick_edit,
|
|
||||||
});
|
|
||||||
|
|
||||||
if(options.hasOwnProperty('onSwitchChange')){
|
if(options.hasOwnProperty('onSwitchChange')){
|
||||||
switchOptions.onSwitchChange = options.onSwitchChange;
|
switchOptions.onSwitchChange = options.onSwitchChange;
|
||||||
}
|
}
|
||||||
this.checkboxes.bootstrapSwitch(switchOptions);
|
this.checkboxes.bootstrapSwitch(switchOptions);
|
||||||
|
this.set_disabled(options.hasOwnProperty('disabled') ?
|
||||||
|
options.disabled : !this.quick_edit);
|
||||||
if(this.quick_edit && quick_edit_callback){
|
if(this.quick_edit && quick_edit_callback){
|
||||||
this.checkboxes.on('switchChange.bootstrapSwitch',
|
this.checkboxes.on('switchChange.bootstrapSwitch',
|
||||||
quick_edit_callback);
|
quick_edit_callback);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
set_value: function(value){
|
set_value: function(value){
|
||||||
// the third parameter tell if we should skip to fire evnets
|
// the third parameter tell if we should skip to fire events
|
||||||
|
// and force change the state whatever it's readonly or disabled
|
||||||
this.checkboxes.bootstrapSwitch('state', value, true);
|
this.checkboxes.bootstrapSwitch('state', value, true);
|
||||||
},
|
},
|
||||||
set_readonly: function(value){
|
set_readonly: function(value){
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
openerp.testing.section('web_widget_boolean_switch',
|
||||||
|
{'dependences': ['web.web_widget_boolean_switch'],
|
||||||
|
}, function(test){
|
||||||
|
"use strict";
|
||||||
|
var check_values = function (scratchpad, value, readonly, disabled,
|
||||||
|
message){
|
||||||
|
var $container = scratchpad.children();
|
||||||
|
var $input = $container.find('input');
|
||||||
|
strictEqual($input[0].checked, value, message + " - Input value");
|
||||||
|
strictEqual($input[0].readOnly && $input[0].readOnly ? true : false,
|
||||||
|
readonly, message + " - Input readonly");
|
||||||
|
strictEqual($input[0].disabled && $input[0].disabled ? true : false, disabled,
|
||||||
|
message + " - Input disabled");
|
||||||
|
|
||||||
|
var prefix = 'bootstrap-switch-';
|
||||||
|
ok($container[0].classList.contains(prefix + (value ? 'on' : 'off')),
|
||||||
|
message + " - Bootstrap-switch value class");
|
||||||
|
strictEqual($container[0].classList.contains(prefix + "readonly"),
|
||||||
|
readonly, message + " - Bootstrap-switch readonly class");
|
||||||
|
strictEqual($container[0].classList.contains(prefix + "disabled"),
|
||||||
|
disabled, message + " - Bootstrap-switch disabled class");
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
var init_check_values = function(instance, scratchpad, html, options,
|
||||||
|
checked, readonly, disabled, message){
|
||||||
|
scratchpad.html(html);
|
||||||
|
var widget = new instance.web.BooleanSwitchWidget(
|
||||||
|
scratchpad.find('input'), options, null);
|
||||||
|
check_values(scratchpad, checked, readonly, disabled, message);
|
||||||
|
return widget;
|
||||||
|
};
|
||||||
|
|
||||||
|
test('BooleanSwitchWidget Class test method', function(instance, $scratchpad){
|
||||||
|
|
||||||
|
var numTest = 1;
|
||||||
|
var widget = init_check_values(
|
||||||
|
instance, $scratchpad, '<input type="checkbox" disabled/>', {},
|
||||||
|
false, false, true, numTest++ + " - init values");
|
||||||
|
|
||||||
|
ok($scratchpad.children()[0].classList.contains('bootstrap-switch'),
|
||||||
|
"Basic bootstrap-switch init using BooleanSwitchWidget class");
|
||||||
|
|
||||||
|
widget.set_disabled(false);
|
||||||
|
check_values($scratchpad, false, false, false,
|
||||||
|
numTest++ + " - Enable");
|
||||||
|
|
||||||
|
widget.set_value(true);
|
||||||
|
check_values($scratchpad, true, false, false,
|
||||||
|
numTest++ + " - Set true");
|
||||||
|
|
||||||
|
widget.set_readonly(true);
|
||||||
|
check_values($scratchpad, true, true, false,
|
||||||
|
numTest++ + " - Set readonly");
|
||||||
|
|
||||||
|
widget.set_disabled(true);
|
||||||
|
check_values($scratchpad, true, true, true,
|
||||||
|
numTest++ + " - Disabled");
|
||||||
|
|
||||||
|
widget.set_value(false);
|
||||||
|
check_values($scratchpad, false, true, true,
|
||||||
|
numTest++ + " - set value whatever its Disabled and readonly");
|
||||||
|
widget.set_readonly(false);
|
||||||
|
widget.set_value(true);
|
||||||
|
check_values($scratchpad, true, false, true,
|
||||||
|
numTest++ + " - set value whatever its Disabled");
|
||||||
|
widget.set_disabled(false);
|
||||||
|
widget.set_readonly(true);
|
||||||
|
widget.set_value(false);
|
||||||
|
check_values($scratchpad, false, true, false,
|
||||||
|
numTest++ + " - set value whatever its readonly");
|
||||||
|
});
|
||||||
|
|
||||||
|
test('BooleanSwitchWidget Class test init', function(instance, $scratchpad){
|
||||||
|
var numTest = 1;
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" disabled readonly checked/>',
|
||||||
|
{}, true, true, true,
|
||||||
|
numTest++ + " - init values disabled readonly checked");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" disabled readonly/>',
|
||||||
|
{}, false, true, true,
|
||||||
|
numTest++ + " - init values disabled readonly");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" disabled checked/>',
|
||||||
|
{}, true, false, true,
|
||||||
|
numTest++ + " - init values disabled checked");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" checked readonly/>',
|
||||||
|
{'disabled': false}, true, true, false,
|
||||||
|
numTest++ + " - init values checked readonly");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox"/>',
|
||||||
|
{}, false, false, true,
|
||||||
|
numTest++ + " - By default input is disabled without any parameter");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" checked/>',
|
||||||
|
{'disabled': false}, true, false, false,
|
||||||
|
numTest++ + " - init values checked");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" readonly/>',
|
||||||
|
{'disabled': false, 'quick_edit': true},
|
||||||
|
false, true, false,
|
||||||
|
numTest++ + " - init values disabled readonly");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox"/>',
|
||||||
|
{'disabled': false}, false, false, false,
|
||||||
|
numTest++ + " - every thing is false");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" checked/>',
|
||||||
|
{'quick_edit': true}, true, false, false,
|
||||||
|
numTest++ + " - quick edit enable widget");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" checked disabled/>',
|
||||||
|
{'quick_edit': true}, true, false, false,
|
||||||
|
numTest++ + " - quick edit enable widget case initial element is disabled");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" checked/>',
|
||||||
|
{}, true, false, true,
|
||||||
|
numTest++ + " - By default widget is disabled test with checked");
|
||||||
|
|
||||||
|
init_check_values(instance, $scratchpad,
|
||||||
|
'<input type="checkbox" checked readonly/>',
|
||||||
|
{}, true, true, true,
|
||||||
|
numTest++ + " - By default widget is disabled test with checked and readonly");
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in New Issue