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
|
||||
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
|
||||
|
@ -24,7 +25,7 @@ Example
|
|||
widget="boolean_switch"
|
||||
attrs="{'readonly': [('login', '=', 'admin')]}"
|
||||
context="{'fake_parameter': 'foo'}"
|
||||
options="{'quick_edit': True, 'extra': {'onText': 'Yes', 'offText': 'No' }}"/>
|
||||
options="{'quick_edit': True, 'extra': {'onText': 'Yes', 'offText': 'No'}}"/>
|
||||
```
|
||||
|
||||
Options
|
||||
|
@ -40,31 +41,39 @@ extra
|
|||
|
||||
*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`
|
||||
* **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'
|
||||
* **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"`,
|
||||
* **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`
|
||||
* **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() {}`
|
||||
* **onInit**: Callback function to execute on initialization - default:
|
||||
`function() {}`,
|
||||
* **onSwitchChange**: Callback function to execute on switch state change -
|
||||
default: `function() {}`
|
||||
|
||||
attrs
|
||||
-----
|
||||
|
|
|
@ -25,6 +25,9 @@
|
|||
'static/lib/bootstrap-switch/bootstrap-switch.js',
|
||||
'static/src/js/web_widget_boolean_switch.js',
|
||||
],
|
||||
'test': [
|
||||
'static/test/web_widget_boolean_switch.js',
|
||||
],
|
||||
"css": [
|
||||
'static/lib/bootstrap-switch/bootstrap-switch.css',
|
||||
],
|
||||
|
@ -34,5 +37,139 @@
|
|||
"demo": [
|
||||
'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') ?
|
||||
options.extra : {};
|
||||
|
||||
_.extend(switchOptions, {
|
||||
'disabled': options.hasOwnProperty('disabled') ?
|
||||
options.disabled : !this.quick_edit,
|
||||
});
|
||||
|
||||
if(options.hasOwnProperty('onSwitchChange')){
|
||||
switchOptions.onSwitchChange = options.onSwitchChange;
|
||||
}
|
||||
this.checkboxes.bootstrapSwitch(switchOptions);
|
||||
this.set_disabled(options.hasOwnProperty('disabled') ?
|
||||
options.disabled : !this.quick_edit);
|
||||
if(this.quick_edit && quick_edit_callback){
|
||||
this.checkboxes.on('switchChange.bootstrapSwitch',
|
||||
quick_edit_callback);
|
||||
}
|
||||
},
|
||||
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);
|
||||
},
|
||||
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