summaryrefslogtreecommitdiff
path: root/addons/web
diff options
context:
space:
mode:
authorYannick Tivisse <yti@odoo.com>2015-09-14 14:07:19 +0200
committerYannick Tivisse <yti@odoo.com>2015-09-22 11:33:58 +0200
commite5181b05f73364c424ab3e7cef186501b2dcb63a (patch)
tree5a3204d699927804a9bcf96357b64b3d30b833a2 /addons/web
parent8c8fee29ea3ee9737f4da19e7eed2f9937232517 (diff)
[FIX] web_kanban, web: KanbanSelection widget refactoring
- Change the widget behavior from asynchronous to asynchronous, by adding 3 related fields on the project.task model, which are the custom labels defined for the stage - Instead of making a rpc call, we are taking directly the labels on the parent for the kanban view, or on the view datarecord for the form view - There are now 2 templates for the kanban view or the form view - The development has been backported in the community version - The options attribute has been removed on the project_view.xml file for the kanban_state field
Diffstat (limited to 'addons/web')
-rw-r--r--addons/web/static/src/js/views/form_widgets.js79
-rw-r--r--addons/web/static/src/xml/base.xml29
2 files changed, 53 insertions, 55 deletions
diff --git a/addons/web/static/src/js/views/form_widgets.js b/addons/web/static/src/js/views/form_widgets.js
index 30a4700e766..074a36e76f7 100644
--- a/addons/web/static/src/js/views/form_widgets.js
+++ b/addons/web/static/src/js/views/form_widgets.js
@@ -165,6 +165,7 @@ var FieldChar = common.AbstractField.extend(common.ReinitializeFieldMixin, {
});
var KanbanSelection = FieldChar.extend({
+ template: "FormSelection",
init: function (field_manager, node) {
this._super(field_manager, node);
},
@@ -180,54 +181,58 @@ var KanbanSelection = FieldChar.extend({
prepare_dropdown_selection: function() {
var self = this;
var _data = [];
- var fetch_stage;
- var selection = this.field.selection || [];
- var stage_id = _.isArray(this.view.datarecord.stage_id) ? this.view.datarecord.stage_id[0] : this.view.datarecord.stage_id;
- var legend_field = this.options && this.options.states_legend_field || false;
- var fields_to_read = _.map(
- this.options && this.options.states_legend || {},
- function (value, key, list) { return value; });
- if (legend_field && fields_to_read && stage_id) {
- fetch_stage = new data.DataSet(
- this,
- self.view.fields[legend_field].field.relation).read_ids([stage_id],
- fields_to_read);
- }
- else { fetch_stage = $.Deferred().resolve(false); }
- return $.when(fetch_stage).then(function (stage_data) {
- _.map(selection, function(res) {
- var value = {
- 'name': res[0],
- 'tooltip': res[1],
- 'state_name': res[1],
- };
- if (stage_data && stage_data[0][self.options.states_legend[res[0]]]) {
- value['state_name'] = stage_data[0][self.options.states_legend[res[0]]];
- value['tooltip'] = stage_data[0][self.options.states_legend[res[0]]];
- }
- if (res[0] == 'normal') { value['state_class'] = 'oe_kanban_status'; }
- else if (res[0] == 'done') { value['state_class'] = 'oe_kanban_status oe_kanban_status_green'; }
- else { value['state_class'] = 'oe_kanban_status oe_kanban_status_red'; }
- _data.push(value);
- });
- return _data;
+ var current_stage_id = self.view.datarecord.stage_id[0];
+ var stage_data = {
+ id: current_stage_id,
+ legend_normal: self.view.datarecord.legend_normal,
+ legend_blocked : self.view.datarecord.legend_blocked,
+ legend_done: self.view.datarecord.legend_done,
+ };
+ _.map(self.field.selection || [], function(selection_item) {
+ var value = {
+ 'name': selection_item[0],
+ 'tooltip': selection_item[1],
+ };
+ if (selection_item[0] === 'normal') {
+ value.state_name = stage_data.legend_normal ? stage_data.legend_normal : selection_item[1];
+ } else if (selection_item[0] === 'done') {
+ value.state_class = 'oe_kanban_status_green';
+ value.state_name = stage_data.legend_done ? stage_data.legend_done : selection_item[1];
+ } else {
+ value.state_class = 'oe_kanban_status_red';
+ value.state_name = stage_data.legend_blocked ? stage_data.legend_blocked : selection_item[1];
+ }
+ _data.push(value);
});
+ return _data;
},
render_value: function() {
+ this._super();
+ this.states = this.prepare_dropdown_selection();
var self = this;
- var dd_fetched = this.prepare_dropdown_selection();
- return $.when(dd_fetched).then(function (states) {
- self.states = states;
- self.$el.addClass('oe_right oe_inline');
- self.$el.html(QWeb.render("KanbanSelection", {'widget': self}));
- self.$el.find('li').on('click', self.set_kanban_selection.bind(self));
+ // Adapt "FormSelection"
+ var current_state = _.find(this.states, function(state) {
+ return state.name === self.get('value');
});
+ this.$('.oe_kanban_status')
+ .removeClass('oe_kanban_status_red oe_kanban_status_green')
+ .addClass(current_state.state_class);
+
+ // Render "FormSelection.Items" and move it into "FormSelection"
+ var $items = $(QWeb.render('FormSelection.items', {
+ states: _.without(this.states, current_state)
+ }));
+ var $dropdown = this.$el.find('.dropdown-menu');
+ $dropdown.children().remove(); // remove old items
+ $items.appendTo($dropdown);
+ this.$el.find('a').on('click', this.set_kanban_selection.bind(this));
},
/* setting the value: in view mode, perform an asynchronous call and reload
the form view; in edit mode, use set_value to save the new value that will
be written when saving the record. */
set_kanban_selection: function (ev) {
var self = this;
+ ev.preventDefault();
var li = $(ev.target).closest('li');
if (li.length) {
var value = String(li.data('value'));
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index be17df5ba48..435352efc16 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -679,28 +679,21 @@
</t>
</span>
</t>
-<t t-name="KanbanSelection">
- <div class="btn-group kanban_state">
- <t t-foreach="widget.states" t-as="rec">
- <a t-if="widget.get('value') === rec.name">
- <a class="dropdown-toggle" data-toggle="dropdown">
- <span t-att-class="rec.state_class" t-if="widget.get('value') === rec.name" t-att-title="rec.tooltip"/>
- <span class="sr-only">Toggle Dropdown</span>
- </a>
- </a>
- </t>
+<t t-name="FormSelection">
+ <div class="btn-group o_kanban_selection">
+ <a href="#" data-toggle="dropdown"><span class="oe_kanban_status"/></a>
<ul class="dropdown-menu state" role="menu">
- <t t-foreach="widget.states" t-as="rec">
- <t t-if="widget.get('value') !== rec.name">
- <li t-att-data-value="rec.name" ><a href="#">
- <span t-att-class="rec.state_class" t-att-title="rec.tooltip"/>
- <t t-raw="rec.state_name" /></a>
- </li>
- </t>
- </t>
</ul>
</div>
</t>
+<t t-name="FormSelection.items">
+ <li t-foreach="states" t-as="rec" t-att-data-value="rec.name">
+ <a href="#">
+ <span t-att-class="'oe_kanban_status ' + (rec.state_class &amp;&amp; rec.state_class || '')"/>
+ <t t-raw="rec.state_name"/>
+ </a>
+ </li>
+</t>
<div t-name="Priority" class="o_priority">
<a t-if="!widget.readonly" t-foreach="widget.values.slice(1)" t-as="v" href="#" t-att-data-value="v[0]" t-att-title="v[1]" class="o_priority_star fa"/>
<span t-if="widget.readonly" t-foreach="widget.values.slice(1)" t-as="v" t-att-data-value="v[0]" t-att-title="v[1]" class="o_priority_star fa"/>