diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 99bad503a52..dbce531edce 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -199,6 +199,8 @@ background: linear-gradient(top, #bd5e54 0%,#90322a 60%); /* W3C */ line-height: 20px; font-weight: bold; font-size: 85%; + + white-space: nowrap; } .openerp .menu a:hover, .openerp .menu a:focus, @@ -696,6 +698,9 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, .openerp td.oe_form_frame_cell { padding: 2px; } +.openerp td.oe_form_frame_cell.oe_form_group { + padding: 0px; +} .openerp .required.error { border: 1px solid #900; } @@ -712,7 +717,7 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, .openerp label.oe_form_label, .openerp label.oe_form_label_help { display: block; text-align: right; - margin-top: 3px; + margin: 3px 0 0 10px; } .openerp label.oe_form_label_help span { font-size: 80%; @@ -788,7 +793,8 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, .openerp .separator.horizontal { font-weight: bold; border-bottom-width: 1px; - margin: 6px 4px 6px 1px; + margin: 3px 4px 3px 1px; + height: 15px; } .openerp td.required input, .openerp td.required select { background-color: #D2D2FF; diff --git a/addons/base/static/src/js/base.js b/addons/base/static/src/js/base.js index 6cddb4a0b31..55e4929e4c0 100644 --- a/addons/base/static/src/js/base.js +++ b/addons/base/static/src/js/base.js @@ -144,6 +144,9 @@ openerp.base = function(instance) { if (openerp.base.form) { openerp.base.form(instance); } + if (openerp.base.list && openerp.base.list.editable) { + openerp.base.list.editable(instance); + } }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 9ce0efa8d9f..42a314f4316 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -737,6 +737,66 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ } }); +openerp.base.Dialog = openerp.base.BaseWidget.extend({ + dialog_title: "", + identifier_prefix: 'dialog', + init: function (session, options) { + this._super(null, session); + options = _.extend({ + modal: true, + title: this.dialog_title, + width: '700px', + min_width: 0, + max_width: '100%', + height: '500px', + min_height: 0, + max_height: '100%', + buttons: {} + }, options); + + options.width = this.get_width(options.width); + options.min_width = this.get_width(options.min_width); + options.max_width = this.get_width(options.max_width); + options.height = this.get_height(options.height); + options.min_height = this.get_height(options.min_height); + options.max_height = this.get_height(options.max_height); + + if (options.width > options.max_width) options.width = options.max_width; + if (options.width < options.min_width) options.width = options.min_width; + if (options.height > options.max_height) options.height = options.max_height; + if (options.height < options.min_height) options.height = options.min_height; + + for (var f in this) { + if (f.substr(0, 10) == 'on_button_') { + options.buttons[f.substr(10)] = this[f]; + } + } + this.options = options; + }, + get_width: function(val) { + return this.get_size(val.toString(), $(window.top).width()); + }, + get_height: function(val) { + return this.get_size(val.toString(), $(window.top).height()); + }, + get_size: function(val, available_size) { + if (val == 'auto') { + return val; + } else if (val.slice(-1) == "%") { + return Math.round(available_size / 100 * parseInt(val.slice(0, -1), 10)); + } else { + return parseInt(val, 10); + } + }, + start: function () { + this.$dialog = $('
').dialog(this.options); + this._super(); + }, + stop: function () { + this.$dialog("destroy").remove(); + } +}); + openerp.base.CrashManager = openerp.base.Controller.extend({ init: function(session, element_id) { this._super(session, element_id); diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index cdbaa9e6f54..76a803fa0ff 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -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', diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 86ad8158faf..f7c4d87f725 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -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() { @@ -176,7 +176,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV return this.rpc(ajax, { model: this.dataset.model, method: method, - args: [].concat([(this.datarecord.id == null ? [] : [this.datarecord.id])], args) + args: [(this.datarecord.id == null ? [] : [this.datarecord.id])].concat(args) }, function(response) { self.on_processed_onchange(response, processed); }); @@ -1137,7 +1137,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, self.field.domain || false, 'ilike', + dataset.name_search([search_val, self.field.domain || [], 'ilike', build_relation_context(self), this.limit + 1], function(data) { self.last_search = data.result; // possible selections for the m2o @@ -1149,7 +1149,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ if (values.length > self.limit) { values = values.slice(0, self.limit); values.push({label: "   Search More...", action: function() { - dataset.name_search([search_val, self.field.domain || false, 'ilike', + dataset.name_search([search_val, self.field.domain || [], 'ilike', build_relation_context(self), false], function(data) { self._change_int_value(null); self._search_create_popup("search", data.result); @@ -1189,10 +1189,14 @@ 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); - pop.select_element(self.field.relation, ids ? _.map(ids, function(x) {return x[0]}) : undefined, view); - pop.on_select_element.add(function(element_id) { - dataset.call("name_get", [element_id], function(data) { + 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, + disable_multiple_selection: true + }); + pop.on_select_elements.add(function(element_ids) { + dataset.call("name_get", [element_ids[0]], function(data) { self._change_int_ext_value(data.result[0]); pop.stop(); }); @@ -1243,29 +1247,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 } @@ -1281,6 +1294,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); @@ -1293,6 +1315,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); @@ -1316,14 +1356,13 @@ 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; - this.list_view.start(); this.list_view.on_loaded.add_last(function() { self.is_started.resolve(); }); + this.list_view.start(); $.when(this.is_started, this.is_setted).then(function() { self.list_view.reload_content(); }); @@ -1341,15 +1380,17 @@ 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; - pop.on_select_element.add(function(element_id) { - if(! _.detect(self.dataset.ids, function(x) {return x == element_id;})) { - self.dataset.set_ids([].concat(self.dataset.ids, [element_id])); - self.reload_content(); - } + pop.on_select_elements.add(function(element_ids) { + _.each(element_ids, function(element_id) { + if(! _.detect(self.dataset.ids, function(x) {return x == element_id;})) { + self.dataset.set_ids([].concat(self.dataset.ids, [element_id])); + self.reload_content(); + } + }); pop.stop(); }); }, @@ -1366,15 +1407,22 @@ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({ } }); -openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({ - identifier_prefix: "many2xselectpopup", - template: "Many2XSelectPopup", - select_element: function(model, initial_ids, initial_view, domain, context) { +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, domain, context) { this.model = model; - this.initial_ids = initial_ids; - this.initial_view = initial_view || "search"; this.domain = domain; this.context = context; + this.options = options || {}; + this.initial_ids = this.options.initial_ids; jQuery(this.render()).dialog({title: '', modal: true, minWidth: 800}); @@ -1383,7 +1431,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.initial_view == "search") { + if ((this.options.initial_view || "search") == "search") { this.setup_search_view(); } else { // "form" this.new_object(); @@ -1395,10 +1443,14 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({ this.searchview.stop(); } this.searchview = new openerp.base.SearchView(null, this.session, - this.element_id + "_search", this.dataset, false, {}); + this.element_id + "_search", this.dataset, false, { + "selectable": !this.options.disable_multiple_selection, + "deletable": false + }); this.searchview.on_search.add(function(domains, contexts, groupbys) { if (self.initial_ids) { - self.view_list.do_search.call(self, [[["id", "in", self.initial_ids]]], contexts, groupbys); + self.view_list.do_search.call(self, [[["id", "in", + self.initial_ids]]], contexts, groupbys); self.initial_ids = undefined; } else { self.view_list.do_search.call(self, domains, contexts, groupbys); @@ -1406,15 +1458,18 @@ 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 $nbutton = $buttons.find(".oe_many2xselectpopup-search-new"); - $nbutton.click(function() { - self.new_object(); - }); - 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_selectcreatepopup-search-select"); + if(self.options.disable_multiple_selection) { + $sbutton.hide(); + } + $sbutton.click(function() { + self.on_select_elements(self.selected_ids); + }); self.view_list = new openerp.base.form.Many2XPopupListView( null, self.session, self.element_id + "_view_list", self.dataset, false, {'deletable': false}); @@ -1426,7 +1481,15 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({ }); this.searchview.start(); }, - on_select_element: function(element_id) { + on_select_elements: function(element_ids) { + }, + on_click_element: function(ids) { + this.selected_ids = ids || []; + if(this.selected_ids.length > 0) { + this.$element.find(".oe_selectcreatepopup-search-select").removeAttr('disabled'); + } else { + this.$element.find(".oe_selectcreatepopup-search-select").attr('disabled', "disabled"); + } }, new_object: function() { var self = this; @@ -1439,15 +1502,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(); }); @@ -1455,7 +1522,7 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({ this.view_form.on_created.add_last(function(r, success) { if (r.result) { var id = arguments[0].result; - self.on_select_element(id); + self.on_select_elements([id]); } }); this.view_form.do_show(); @@ -1463,8 +1530,15 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({ }); openerp.base.form.Many2XPopupListView = openerp.base.ListView.extend({ + do_add_record: function () { + this.popup.new_object(); + }, select_record: function(index) { - this.popup.on_select_element(this.dataset.ids[index]); + this.popup.on_select_elements([this.dataset.ids[index]]); + }, + do_select: function(ids, records) { + this._super(ids, records); + this.popup.on_click_element(ids); } }); diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 04fb1b540ce..8fba7eb6c4c 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -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); } diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 9767bfc6c3f..738d1823ae3 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -232,14 +232,14 @@
-
-
+
@@ -877,20 +877,20 @@

- +
- - - + + + - - - + + + diff --git a/addons/base_dashboard/static/src/css/dashboard.css b/addons/base_dashboard/static/src/css/dashboard.css index cbd89984c37..b9815593221 100644 --- a/addons/base_dashboard/static/src/css/dashboard.css +++ b/addons/base_dashboard/static/src/css/dashboard.css @@ -1,13 +1,12 @@ +.openerp table.oe-dashboard { + width: 100%; +} .openerp .oe-dashboard-links { text-align: right; - margin: -2em 1em 1em 0; -} -.openerp .oe-dashboard-column { - float: left; - padding-bottom: 100px; + margin: -2em 0.4em 1em 0; } .openerp .oe-dashboard-action { - margin: 0 1em 1em 0; + margin: 0 0.5em 0.5em 0; } .openerp .oe-dashboard-action .oe-dashboard-action-header { margin: 0.3em; @@ -58,7 +57,7 @@ } /* Layouts */ -.openerp .oe-dashboard-layout_1 .oe-dashboard-column { +.openerp .oe-dashboard-layout_1 .oe-dashboard-column.index_0 { width: 100%; } .openerp .oe-dashboard-layout_1 .oe-dashboard-column.index_1, diff --git a/addons/base_dashboard/static/src/xml/base_dashboard.xml b/addons/base_dashboard/static/src/xml/base_dashboard.xml index 9179985f145..3d45efafaa2 100644 --- a/addons/base_dashboard/static/src/xml/base_dashboard.xml +++ b/addons/base_dashboard/static/src/xml/base_dashboard.xml @@ -18,13 +18,15 @@ Change layout
-
-
+ + -
-
+ + +