[IMP] [CLEAN] [REF] Statusbar widget: now working, cleaned code.

bzr revid: tde@openerp.com-20120525101057-62o01luqdfl3oo53
This commit is contained in:
Thibault Delavallée 2012-05-25 12:10:57 +02:00
parent 9792150892
commit ea11df3838
1 changed files with 45 additions and 30 deletions

View File

@ -1485,7 +1485,6 @@ instance.web.form.FormWidget = instance.web.Widget.extend(_.extend({}, instance.
if (! v_context) {
v_context = (this.field || {}).context || {};
}
if (v_context.__ref || true) { //TODO: remove true
var fields_values = this._build_eval_context(blacklist);
v_context = new instance.web.CompoundContext(v_context).set_eval_context(fields_values);
@ -3874,9 +3873,14 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
this._super();
this.selected_value = null;
//this.render_list();
/** preview before set_value only for selection fields, because of
* the dynamic behavior of many2one fields. */
if (this.field.type == 'selection') {
this.render_list();
}
},
set_value: function(value_) {
var self = this;
this._super(value_);
/** find selected value: ex:
* - many2one: [2, "New"] -> 2
@ -3887,51 +3891,57 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
else {
this.selected_value = value_;
}
this.render_list();
// trick to be sure all values are loaded in the form, therefore
// enabling the evaluation of dynamic domains
$.async_when().then(function() {
return self.render_list();
});
},
/** Get the status list and render them
* to_show: [[identifier, value_to_displaty]] where
* - identifier = db value for a selection, id for a many2one
* - display_val = value that will be displayed
* - ex: [[0, "New"]] (selection) or [["new", "new"]] (many2one)
* - display_val = label that will be displayed
* - ex: [[0, "New"]] (many2one) or [["new", "In Progress"]] (selection)
*/
render_list: function() {
var self = this;
// get selection values
var selection_done = this.get_selection();
// search in the external relation for all possible values, then render them
var rendering_done = $.when(selection_done).pipe(function () {
self.filter_selection();
}).pipe(self.proxy('render_elements'));
return rendering_done;
// get selection values, filter them and render them
return this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements'));
},
/** Get the selection list to be displayed in the statusbar widget.
* For selection fields: this is directly given by this.field.selection
* For many2one fields :
* - perform a search on the relation of the many2one field (given by
* field.relation )
* - get the field domain for the search
* - self.build_domain() gives the domain given by the view or by
* the field
* - if the optional statusbar_fold attribute is set to true, make
* an AND with build_domain to hide all 'fold=true' columns
* - make an OR with current value, to be sure it is displayed,
* with the correct order, even if it is folded
*/
get_selection: function() {
var self = this;
if (this.field.type == "many2one") {
this.selection = [];
// get a DataSet on the current model (ex: crm.lead)
var model = new instance.web.DataSet(this, this.field_manager.dataset.model);
// get fold information from widget
var fold = ((this.node.attrs || {}).statusbar_fold || true);
// build final domain: if fold option required, add the
if (fold == true)
var domain = new instance.web.CompoundDomain(['|'], ['&'], self.build_domain(), [['fold', '=', false]], [['id', '=', self.selected_value]])
else {
var domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.selected_value]])
}
// get a DataSetSearch on the current field relation (ex: crm.lead.stage_id -> crm.case.stage)
console.log('this');
console.log(this);
var context = self.build_context();
console.log('context');
console.log(context);
var domain = self.build_domain();
console.log('domain');
console.log(domain);
//var new_domain = new instance.web.CompoundDomain(['|'], domain, [['case_default', '=', 'True']]);
//console.log(new_domain);
var model_ext = new instance.web.DataSetSearch(this, this.field.relation, context);
var model_ext = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain);
// fetch selection
//var read_defer = model_ext.read_slice(['name'], {'domain': domain, 'context': context}).pipe( function (records) {
var read_defer = model_ext.read_slice(['name'], {'domain': []}).pipe( function (records) {
self.to_show = [];
var read_defer = model_ext.read_slice(['name'], {}).pipe( function (records) {
_(records).each(function (record) {
self.selection.push([record.id, record.name]);
});
console.log('to_show');
console.log(self.to_show);
});
}
else {
@ -3940,6 +3950,7 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
}
return read_defer;
},
/** Filters this.selection, according to values coming from the statusbar_visible
* attribute of the field. For example: statusbar_visible="draft,open"
* Currently, the key of (key, label) pairs has to be used in the
@ -3960,6 +3971,10 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
});
}
},
/** Renders the widget. This function also check for statusbar_colors='{"pending": "blue"}'
* attribute in the widget. This allows to set a given color to a given
* state (given by the key of (key, label)). */
render_elements: function () {
var content = instance.web.qweb.render("FieldStatus.content", {widget: this, _:_});
this.$element.html(content);