[FIX] web: fix various bugs in FieldCharDomain

now, the FieldCharDomain widget should
* correctly display the selected records instead of the whole list
* allow the removal of the current selection in edit mode (by adding
  a facet in the searchview)
* allow the selection of a full group when the list view is grouped

also, it correctly now uses the ReinitializeFieldMixin instead of
reimplementing half of it in a buggy way.
This commit is contained in:
Géry Debongnie
2015-01-22 20:45:08 +01:00
parent 21c1686f06
commit 0521c8b83f
2 changed files with 62 additions and 44 deletions
+61 -44
View File
@@ -2626,25 +2626,9 @@ instance.web.form.FieldFloat = instance.web.form.FieldChar.extend({
}
});
instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
init: function(field_manager, node) {
this._super.apply(this, arguments);
},
start: function() {
var self = this;
this._super.apply(this, arguments);
this.on("change:effective_readonly", this, function () {
this.display_field();
});
this.display_field();
return this._super();
},
set_value: function(value_) {
var self = this;
this.set('value', value_ || false);
this.display_field();
},
display_field: function() {
render_value: function() {
var self = this;
this.$el.html(instance.web.qweb.render("FieldCharDomain", {widget: this}));
if (this.get('value')) {
@@ -2671,37 +2655,24 @@ instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(insta
var self = this;
var model = this.options.model || this.field_manager.get_field_value(this.options.model_field);
this.pop = new instance.web.form.SelectCreatePopup(this);
this.pop.select_element(
model, {
var options = {
title: this.get('effective_readonly') ? 'Selected records' : 'Select records...',
readonly: this.get('effective_readonly'),
disable_multiple_selection: this.get('effective_readonly'),
no_create: this.get('effective_readonly'),
}, [], this.build_context());
this.pop.on("elements_selected", self, function(element_ids) {
if (this.pop.$('input.oe_list_record_selector').prop('checked')) {
var search_data = this.pop.searchview.build_search_data();
var domain_done = instance.web.pyeval.eval_domains_and_contexts({
domains: search_data.domains,
contexts: search_data.contexts,
group_by_seq: search_data.groupbys || []
}).then(function (results) {
return results.domain;
});
};
var domain = this.get('value');
popup = new instance.web.form.DomainEditorPopup(this);
popup.select_element(model, options, domain, {});
popup.on("elements_selected", self, function(selected_ids) {
if (!self.get('effective_readonly')) {
self.set_value(popup.get_domain(selected_ids));
}
else {
var domain = [["id", "in", element_ids]];
var domain_done = $.Deferred().resolve(domain);
}
$.when(domain_done).then(function (domain) {
var domain = self.pop.dataset.domain.concat(domain || []);
self.set_value(domain);
});
});
},
});
instance.web.DateTimeWidget = instance.web.Widget.extend({
template: "web.datepicker",
type_of_date: "datetime",
@@ -5437,6 +5408,11 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
self.view_list.appendTo(self.$(".oe_popup_list").show()).then(function() {
self.view_list.do_show();
}).then(function() {
if (self.options.initial_facet) {
self.searchview.query.reset([self.options.initial_facet], {
preventSearch: true,
});
}
self.searchview.do_search();
});
self.view_list.on("list_view_loaded", self, function() {
@@ -5458,14 +5434,12 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
});
},
do_search: function(domains, contexts, groupbys) {
var self = this;
instance.web.pyeval.eval_domains_and_contexts({
var results = instance.web.pyeval.sync_eval_domains_and_contexts({
domains: domains || [],
contexts: contexts || [],
group_by_seq: groupbys || []
}).done(function (results) {
self.view_list.do_search(results.domain, results.context, results.group_by);
});
this.view_list.do_search(results.domain, results.context, results.group_by);
},
on_click_element: function(ids) {
var self = this;
@@ -5488,6 +5462,49 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
},
});
instance.web.form.DomainEditorPopup = instance.web.form.SelectCreatePopup.extend({
select_element: function (model, options, domain, context) {
if (options.readonly) {
return this._super(model, options, domain, context);
}
options.initial_facet = {
category: _t("Custom Filter"),
icon: 'fa-star',
field: {
get_context: function () { return context; },
get_groupby: function () { return []; },
get_domain: function () { return domain; },
},
values: [{label: _t("Selected domain"), value: null}],
};
this._super(model, options, [], context);
},
get_domain: function (selected_ids) {
var group_domain = [],
domain;
if (this.$('input.oe_list_record_selector').prop('checked')) {
if (this.view_list.grouped) {
var group_domain = _.chain(_.values(this.view_list.groups.children))
.filter(function (child) { return child.records.length; })
.map(function (c) { return c.datagroup.domain;})
.value();
group_domain = _.flatten(group_domain, true);
group_domain = _.times(group_domain.length - 1, _.constant('|')).concat(group_domain);
}
var search_data = this.searchview.build_search_data();
domain = instance.web.pyeval.sync_eval_domains_and_contexts({
domains: search_data.domains,
contexts: search_data.contexts,
group_by_seq: search_data.groupbys || []
}).domain;
}
else {
domain = [["id", "in", selected_ids]];
}
return this.dataset.domain.concat(group_domain).concat(domain || []);
},
});
instance.web.form.SelectCreateListView = instance.web.ListView.extend({
do_add_record: function () {
this.popup.new_object();
+1
View File
@@ -1548,6 +1548,7 @@
<div class="o-modal-header">
<div class="o-popup-search"/>
<div class="o-search-options oe-search-options"/>
<div class="oe_popup_list_pager"/>
</div>
<div class="oe_popup_list"/>
<div class="oe_popup_form"/>