[imp] many improvements to o2m
bzr revid: nicolas.vanhoren@openerp.com-20110616164134-z76za62jmqt7pd1f
This commit is contained in:
commit
cfe274d633
|
@ -322,7 +322,7 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
|
|||
},
|
||||
/**
|
||||
* Arguments:
|
||||
* name='', args=None, operator='ilike', context=None, limit=100
|
||||
* name='', args=[], operator='ilike', context=None, limit=100
|
||||
*/
|
||||
name_search: function (args, callback, error_callback) {
|
||||
return this.call('name_search',
|
||||
|
|
|
@ -32,7 +32,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV
|
|||
this.ready = false;
|
||||
this.show_invalid = true;
|
||||
this.touched = false;
|
||||
this.flags = this.view_manager.action.flags || {};
|
||||
this.flags = this.view_manager.flags || {};
|
||||
this.registry = openerp.base.form.widgets;
|
||||
},
|
||||
start: function() {
|
||||
|
@ -1125,7 +1125,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
|
|||
|
||||
var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []);
|
||||
|
||||
dataset.name_search([search_val, false, 'ilike', {}, this.limit + 1], function(data) {
|
||||
dataset.name_search([search_val, [], 'ilike', {}, this.limit + 1], function(data) {
|
||||
self.last_search = data.result;
|
||||
// possible selections for the m2o
|
||||
var values = _.map(data.result, function(x) {
|
||||
|
@ -1136,7 +1136,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
|
|||
if (values.length > self.limit) {
|
||||
values = values.slice(0, self.limit);
|
||||
values.push({label: "<em> Search More...</em>", action: function() {
|
||||
dataset.name_search([search_val, false, 'ilike', {}, false], function(data) {
|
||||
dataset.name_search([search_val, [], 'ilike', {}, false], function(data) {
|
||||
self._change_int_value(null);
|
||||
self._search_create_popup("search", data.result);
|
||||
});
|
||||
|
@ -1173,7 +1173,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
|
|||
_search_create_popup: function(view, ids) {
|
||||
var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []);
|
||||
var self = this;
|
||||
var pop = new openerp.base.form.Many2XSelectPopup(null, self.view.session);
|
||||
var pop = new openerp.base.form.SelectCreatePopup(null, self.view.session);
|
||||
pop.select_element(self.field.relation,{
|
||||
initial_ids: ids ? _.map(ids, function(x) {return x[0]}) : undefined,
|
||||
initial_view: view,
|
||||
|
@ -1231,29 +1231,38 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
|
|||
|
||||
this.dataset = new openerp.base.DataSetStatic(this.session, this.field.relation);
|
||||
this.dataset.on_unlink.add_last(function(ids) {
|
||||
// TODO niv check form view
|
||||
var view = self.viewmanager.views[self.viewmanager.active_view].controller;
|
||||
view.reload_content();
|
||||
// TODO niv make real suppression (list or direct)
|
||||
self.dataset.set_ids(_.without.apply(_, [self.dataset.ids].concat(ids)));
|
||||
self.on_ui_change();
|
||||
self.reload_current_view();
|
||||
});
|
||||
|
||||
var modes = this.node.attrs.mode;
|
||||
modes = !!modes ? modes.split(",") : ["tree", "form"];
|
||||
var views = [];
|
||||
_.each(modes, function(mode) {
|
||||
var view = [false, mode == "tree" ? "list" : mode];
|
||||
var view = {view_id: false, view_type: mode == "tree" ? "list" : mode};
|
||||
if (self.field.views && self.field.views[mode]) {
|
||||
view.push(self.field.views[mode]);
|
||||
view.embedded_view = self.field.views[mode];
|
||||
}
|
||||
if(view.view_type === "list") {
|
||||
view.options = {
|
||||
};
|
||||
}
|
||||
views.push(view);
|
||||
});
|
||||
this.views = views;
|
||||
|
||||
this.viewmanager = new openerp.base.ViewManager(this.view.session,
|
||||
this.element_id, this.dataset, views);
|
||||
var reg = new openerp.base.Registry();
|
||||
reg.add("form", openerp.base.views.map["form"]);
|
||||
reg.add("graph", openerp.base.views.map["graph"]);
|
||||
reg.add("list", "openerp.base.form.One2ManyListView");
|
||||
this.viewmanager.registry = reg;
|
||||
|
||||
this.viewmanager.on_controller_inited.add_last(function(view_type, controller) {
|
||||
if (view_type == "list") {
|
||||
// TODO niv
|
||||
controller.o2m = self;
|
||||
} else if (view_type == "form") {
|
||||
// TODO niv
|
||||
}
|
||||
|
@ -1269,6 +1278,15 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
|
|||
// TODO niv: handle other types of views
|
||||
});
|
||||
},
|
||||
reload_current_view: function() {
|
||||
var self = this;
|
||||
var view = self.viewmanager.views[self.viewmanager.active_view].controller;
|
||||
if(self.viewmanager.active_view === "list") {
|
||||
view.reload_content();
|
||||
} else if (self.viewmanager.active_view === "form") {
|
||||
// TODO niv: but fme did not implemented delete in form view anyway
|
||||
}
|
||||
},
|
||||
set_value: function(value) {
|
||||
if(value != false) {
|
||||
this.dataset.set_ids(value);
|
||||
|
@ -1281,6 +1299,24 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
|
|||
}
|
||||
});
|
||||
|
||||
openerp.base.form.One2ManyListView = openerp.base.ListView.extend({
|
||||
do_add_record: function () {
|
||||
var self = this;
|
||||
var pop = new openerp.base.form.SelectCreatePopup(null, self.o2m.view.session);
|
||||
pop.select_element(self.o2m.field.relation,{
|
||||
initial_view: "form",
|
||||
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined
|
||||
});
|
||||
pop.on_select_elements.add(function(element_ids) {
|
||||
var ids = self.o2m.dataset.ids;
|
||||
_.each(element_ids, function(x) {if (!_.include(ids, x)) ids.push(x);});
|
||||
self.o2m.dataset.set_ids(ids);
|
||||
self.o2m.on_ui_change();
|
||||
self.o2m.reload_current_view();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({
|
||||
init: function(view, node) {
|
||||
this._super(view, node);
|
||||
|
@ -1304,7 +1340,6 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({
|
|||
|
||||
this.list_view = new openerp.base.form.Many2ManyListView(
|
||||
null, this.view.session, this.list_id, this.dataset, false, {
|
||||
'selectable': false,
|
||||
'addable': 'Add'
|
||||
});
|
||||
this.list_view.m2m_field = this;
|
||||
|
@ -1329,7 +1364,7 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({
|
|||
|
||||
openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({
|
||||
do_add_record: function () {
|
||||
var pop = new openerp.base.form.Many2XSelectPopup(
|
||||
var pop = new openerp.base.form.SelectCreatePopup(
|
||||
null, this.m2m_field.view.session);
|
||||
pop.select_element(this.model);
|
||||
var self = this;
|
||||
|
@ -1356,14 +1391,15 @@ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({
|
|||
}
|
||||
});
|
||||
|
||||
openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({
|
||||
identifier_prefix: "many2xselectpopup",
|
||||
template: "Many2XSelectPopup",
|
||||
openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({
|
||||
identifier_prefix: "selectcreatepopup",
|
||||
template: "SelectCreatePopup",
|
||||
/**
|
||||
* options:
|
||||
* - initial_ids
|
||||
* - initial_view: form or search (default search)
|
||||
* - disable_multiple_selection
|
||||
* - alternative_form_view
|
||||
*/
|
||||
select_element: function(model, options) {
|
||||
this.model = model;
|
||||
|
@ -1377,7 +1413,7 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({
|
|||
start: function() {
|
||||
this._super();
|
||||
this.dataset = new openerp.base.DataSetSearch(this.session, this.model);
|
||||
if (this.options.initial_view || "search" == "search") {
|
||||
if ((this.options.initial_view || "search") == "search") {
|
||||
this.setup_search_view();
|
||||
} else { // "form"
|
||||
this.new_object();
|
||||
|
@ -1404,12 +1440,12 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({
|
|||
});
|
||||
this.searchview.on_loaded.add_last(function () {
|
||||
var $buttons = self.searchview.$element.find(".oe_search-view-buttons");
|
||||
$buttons.append(QWeb.render("Many2XSelectPopup.search.buttons"));
|
||||
var $cbutton = $buttons.find(".oe_many2xselectpopup-search-close");
|
||||
$buttons.append(QWeb.render("SelectCreatePopup.search.buttons"));
|
||||
var $cbutton = $buttons.find(".oe_selectcreatepopup-search-close");
|
||||
$cbutton.click(function() {
|
||||
self.stop();
|
||||
});
|
||||
var $sbutton = $buttons.find(".oe_many2xselectpopup-search-select");
|
||||
var $sbutton = $buttons.find(".oe_selectcreatepopup-search-select");
|
||||
if(self.options.disable_multiple_selection) {
|
||||
$sbutton.hide();
|
||||
}
|
||||
|
@ -1432,9 +1468,9 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({
|
|||
on_click_element: function(ids) {
|
||||
this.selected_ids = ids || [];
|
||||
if(this.selected_ids.length > 0) {
|
||||
this.$element.find(".oe_many2xselectpopup-search-select").removeAttr('disabled');
|
||||
this.$element.find(".oe_selectcreatepopup-search-select").removeAttr('disabled');
|
||||
} else {
|
||||
this.$element.find(".oe_many2xselectpopup-search-select").attr('disabled', "disabled");
|
||||
this.$element.find(".oe_selectcreatepopup-search-select").attr('disabled', "disabled");
|
||||
}
|
||||
},
|
||||
new_object: function() {
|
||||
|
@ -1448,15 +1484,19 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({
|
|||
this.dataset.index = null;
|
||||
this.view_form = new openerp.base.FormView(null, this.session,
|
||||
this.element_id + "_view_form", this.dataset, false);
|
||||
if (this.options.alternative_form_view) {
|
||||
debugger;
|
||||
this.view_form.set_embedded_view(this.options.alternative_form_view);
|
||||
}
|
||||
this.view_form.start();
|
||||
this.view_form.on_loaded.add_last(function() {
|
||||
var $buttons = self.view_form.$element.find(".oe_form_buttons");
|
||||
$buttons.html(QWeb.render("Many2XSelectPopup.form.buttons"));
|
||||
var $nbutton = $buttons.find(".oe_many2xselectpopup-form-save");
|
||||
$buttons.html(QWeb.render("SelectCreatePopup.form.buttons"));
|
||||
var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save");
|
||||
$nbutton.click(function() {
|
||||
self.view_form.do_save();
|
||||
});
|
||||
var $cbutton = $buttons.find(".oe_many2xselectpopup-form-close");
|
||||
var $cbutton = $buttons.find(".oe_selectcreatepopup-form-close");
|
||||
$cbutton.click(function() {
|
||||
self.stop();
|
||||
});
|
||||
|
|
|
@ -78,10 +78,12 @@ openerp.base.ViewManager = openerp.base.Controller.extend({
|
|||
this.dataset = dataset;
|
||||
this.searchview = null;
|
||||
this.active_view = null;
|
||||
this.views_src = views;
|
||||
this.views_src = _.map(views, function(x)
|
||||
{return x instanceof Array? {view_id: x[0], view_type: x[1]} : x;});
|
||||
this.views = {};
|
||||
this.flags = this.flags || {};
|
||||
this.sidebar = new openerp.base.NullSidebar();
|
||||
this.registry = openerp.base.views;
|
||||
},
|
||||
/**
|
||||
* @returns {jQuery.Deferred} initial view loading promise
|
||||
|
@ -94,14 +96,13 @@ openerp.base.ViewManager = openerp.base.Controller.extend({
|
|||
self.on_mode_switch($(this).data('view-type'));
|
||||
});
|
||||
_.each(this.views_src, function(view) {
|
||||
self.views[view[1]] = { view_id: view[0], controller: null,
|
||||
embedded_view: view[2]};
|
||||
self.views[view.view_type] = $.extend({}, view, {controller: null});
|
||||
});
|
||||
if (this.flags.views_switcher === false) {
|
||||
this.$element.find('.oe_vm_switch').hide();
|
||||
}
|
||||
// switch to the first one in sequence
|
||||
return this.on_mode_switch(this.views_src[0][1]);
|
||||
return this.on_mode_switch(this.views_src[0].view_type);
|
||||
},
|
||||
stop: function() {
|
||||
},
|
||||
|
@ -117,8 +118,9 @@ openerp.base.ViewManager = openerp.base.Controller.extend({
|
|||
var view = this.views[view_type];
|
||||
if (!view.controller) {
|
||||
// Lazy loading of views
|
||||
var controllerclass = openerp.base.views.get_object(view_type);
|
||||
var controller = new controllerclass( this, this.session, this.element_id + "_view_" + view_type, this.dataset, view.view_id);
|
||||
var controllerclass = this.registry.get_object(view_type);
|
||||
var controller = new controllerclass( this, this.session, this.element_id + "_view_" + view_type,
|
||||
this.dataset, view.view_id, view.options);
|
||||
if (view.embedded_view) {
|
||||
controller.set_embedded_view(view.embedded_view);
|
||||
}
|
||||
|
|
|
@ -232,14 +232,14 @@
|
|||
<!-- TODO prefix id with the element_id of the controller t-attf-id="#{prefix}_localid" -->
|
||||
<div class="oe_vm_switch">
|
||||
<t t-if="views.length != 1" t-foreach="views" t-as="view">
|
||||
<button type="button" t-att-data-view-type="view[1]">
|
||||
<t t-esc="view[1]"/>
|
||||
<button type="button" t-att-data-view-type="view.view_type">
|
||||
<t t-esc="view.view_type"/>
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
<div t-attf-id="#{prefix}_search" t-opentag="true"/>
|
||||
<t t-foreach="views" t-as="view">
|
||||
<div t-attf-id="#{prefix}_view_#{view[1]}"/>
|
||||
<div t-attf-id="#{prefix}_view_#{view.view_type}"/>
|
||||
</t>
|
||||
</td>
|
||||
<td class="view-manager-main-sidebar" height="100%">
|
||||
|
@ -877,20 +877,20 @@
|
|||
</p>
|
||||
</div>
|
||||
</t>
|
||||
<t t-name="Many2XSelectPopup">
|
||||
<t t-name="SelectCreatePopup">
|
||||
<div t-att-id="element_id">
|
||||
<div t-att-id="element_id + '_search'"></div>
|
||||
<div t-att-id="element_id + '_view_list'"></div>
|
||||
<div t-att-id="element_id + '_view_form'"></div>
|
||||
</div>
|
||||
</t>
|
||||
<t t-name="Many2XSelectPopup.search.buttons">
|
||||
<button type="button" class="oe_many2xselectpopup-search-select" disabled="disabled">Select</button>
|
||||
<button type="button" class="oe_many2xselectpopup-search-close">Close</button>
|
||||
<t t-name="SelectCreatePopup.search.buttons">
|
||||
<button type="button" class="oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
|
||||
<button type="button" class="oe_selectcreatepopup-search-close">Close</button>
|
||||
</t>
|
||||
<t t-name="Many2XSelectPopup.form.buttons">
|
||||
<button type="button" class="oe_many2xselectpopup-form-save">Save</button>
|
||||
<button type="button" class="oe_many2xselectpopup-form-close">Close</button>
|
||||
<t t-name="SelectCreatePopup.form.buttons">
|
||||
<button type="button" class="oe_selectcreatepopup-form-save">Save</button>
|
||||
<button type="button" class="oe_selectcreatepopup-form-close">Close</button>
|
||||
</t>
|
||||
|
||||
<t t-name="ListView.row.frame" t-extend="WidgetFrame">
|
||||
|
|
Loading…
Reference in New Issue