diff --git a/web_widget_radio_tree/README.rst b/web_widget_radio_tree/README.rst new file mode 100644 index 00000000..35fa88b2 --- /dev/null +++ b/web_widget_radio_tree/README.rst @@ -0,0 +1,75 @@ +.. 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 radio tree +===================== + +This module allows to use input radio in a tree view inside a form, in order to ensure the user marks only one record. + +Example: You have a partner company from with many contacts. The contacts are shown in a tree and you want to specify only one as preferred. + +Usage +===== + +In the view declaration, put widget='radio_tree' attribute in the field tag:: + + ... + +
+ ... + + + + ... + + + ... + + + +
+ ... + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub 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 +`_. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Cesar Lage +* Robert Rübner + +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 https://odoo-community.org. \ No newline at end of file diff --git a/web_widget_radio_tree/__init__.py b/web_widget_radio_tree/__init__.py new file mode 100644 index 00000000..add09d83 --- /dev/null +++ b/web_widget_radio_tree/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, an open source suite of business apps +# This module copyright (C) 2015 bloopark systems (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## diff --git a/web_widget_radio_tree/__openerp__.py b/web_widget_radio_tree/__openerp__.py new file mode 100644 index 00000000..c2c0ae36 --- /dev/null +++ b/web_widget_radio_tree/__openerp__.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, an open source suite of business apps +# This module copyright (C) 2015 bloopark systems (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + 'name': "Web Widget Radio Tree", + 'summary': """Add radio buttons for records in tree.""", + 'author': "bloopark systems GmbH & Co. KG", + 'website': "http://www.bloopark.de", + 'category': 'web', + 'version': '1.0', + 'depends': [ + 'web', + ], + 'data': [ + 'views/assets.xml', + ], + 'qweb': [ + 'static/src/xml/widget.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/web_widget_radio_tree/static/src/js/widget.js b/web_widget_radio_tree/static/src/js/widget.js new file mode 100644 index 00000000..fbb8b0d4 --- /dev/null +++ b/web_widget_radio_tree/static/src/js/widget.js @@ -0,0 +1,90 @@ +openerp.web_widget_radio_tree = function (instance) { + + var QWeb = instance.web.qweb; + + instance.web.list.columns.add('field.radio_tree', 'instance.web.list.RadioTreeColumn'); + + instance.web.list.RadioTreeColumn = instance.web.list.Column.extend({ + _format: function (row_data, options) { + var name = options.model + '_' + this.id; + return _.template( + ' readonly="readonly">', { + name: name, + checked: row_data[this.id].value ? 'checked' : '', + }); + } + }); + + instance.web.form.widgets.add('radio_tree', 'instance.web.form.RadioTree'); + + instance.web.form.RadioTree = instance.web.form.FieldBoolean.extend({ + template: 'RadioTree', + start: function() { + var self = this; + this.$checkbox = $('input', this.$el); + var radio_name = this.__parentedParent.model + '_' + this.$checkbox[0].name; + this.$checkbox.attr('name', radio_name); + this.setupFocus(this.$checkbox); + this.$el.click(_.bind(function() { + self.clean_radio_in_records(); + this.internal_set_value(true); + }, this)); + var check_readonly = function() { + self.$checkbox.prop('disabled', self.get('effective_readonly')); + self.click_disabled_boolean(); + }; + this.on('change:effective_readonly', this, check_readonly); + check_readonly.call(this); + this._super.apply(this, arguments); + }, + click_disabled_boolean: function(){ + var $disabled = this.$el.find('input[type=radio]:disabled'); + $disabled.each(function (){ + $(this).next('div').remove(); + $(this).closest('span').append($('
')); + }); + }, + clean_radio_in_records: function() { + var name = (this.$checkbox[0].name).split('_')[1]; + var ids = this.__parentedParent.dataset.ids; + var current_id = this.__parentedParent.datarecord.id; + + // updating write hash + var already_added = []; + var to_write = this.__parentedParent.dataset.to_write; + for (var j=0; j + + + + + + + diff --git a/web_widget_radio_tree/views/assets.xml b/web_widget_radio_tree/views/assets.xml new file mode 100644 index 00000000..c1c7d187 --- /dev/null +++ b/web_widget_radio_tree/views/assets.xml @@ -0,0 +1,10 @@ + + + + + +