diff --git a/addons/base/static/openerp/base.css b/addons/base/static/openerp/base.css index b6278fdf718..a62d37011a0 100644 --- a/addons/base/static/openerp/base.css +++ b/addons/base/static/openerp/base.css @@ -290,3 +290,13 @@ body { border-radius: 3px; background: white; } + +/* Widgets */ +.openerp .separator { + border: 0 solid #666; +} +.openerp .separator.horizontal { + font-weight: bold; + border-bottom-width: 1px; + margin: 6px 4px 6px 1px; +} diff --git a/addons/base/static/openerp/base.xml b/addons/base/static/openerp/base.xml index 01084a4da96..434759f49dc 100644 --- a/addons/base/static/openerp/base.xml +++ b/addons/base/static/openerp/base.xml @@ -93,7 +93,7 @@
- +

@@ -133,6 +133,99 @@ + +

+
+ + + 0 / 0 + + +
+ +
+ +
+
+ + Unhandled widget + + + + + + + + + +
+ +
+
+ + +
+ + +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ One2Many widget +
+
+ + + + + + + + +

diff --git a/addons/base/static/openerp/js/controllers.js b/addons/base/static/openerp/js/controllers.js index 41333244b9d..8a4cf10baba 100644 --- a/addons/base/static/openerp/js/controllers.js +++ b/addons/base/static/openerp/js/controllers.js @@ -447,21 +447,253 @@ openerp.base.XmlInput = openerp.base.Controller.extend({ // to replace view editor }); +openerp.base.Widget = openerp.base.Controller.extend({ + init: function(session, element_id, view, node) { + var type = view.fields_view.fields[node.attrs.name] || {}; + this.type = node.attrs.widget || type.type || node.tag; + this.name = node.attrs.name; + var type = view.fields_view.fields[node.attrs.name] || {}; + this.type = node.attrs.widget || type.type || node.tag; + this.element_id = (node.tag == this.type ? node.tag : node.tag + '_' + this.type) + '_'; + this.element_id += (this.name ? this.name + (this.is_field_label ? '_label' : '') + '_' : ''); + this.element_id += Math.round(Math.random() * (new Date()).getTime()); + this._super(session, this.element_id); + this.view = view; + this.view.widgets[this.element_id] = this; + this.node = node; + this.children = node.children; + this.colspan = parseInt(node.attrs.colspan || 1); + if (node.tag == 'field') { + this.view.fields[node.attrs.name] = this; + if (node.attrs.nolabel != '1' && this.colspan > 1) { + this.colspan--; + } + } + this.field = view.fields_view.fields[node.attrs.name]; + this.template = "FormView.widget"; + + this.invisible = (node.attrs.invisible == '1'); + this.string = node.attrs.string || (this.field ? this.field.string : undefined); + this.help = node.attrs.help || (this.field ? this.field.help : undefined); + this.nolabel = (node.attrs.nolabel == '1'); + }, + register: function() { + this.$element = $('#' + this.element_id); + return this; + }, + render: function() { + var template = this.template; + return QWeb.render(template, { "widget": this }); + } +}); +openerp.base.WidgetFrame = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.frame"; + this.columns = node.attrs.col || 4; + this.x = 0; + this.y = 0; + this.table = []; + this.add_row(); + for (var i = 0; i < node.children.length; i++) { + var n = node.children[i]; + if (n.tag == "newline") { + this.add_row(); + } else { + this.handle_node(n); + } + } + this.set_row_cells_with(this.table[this.table.length - 1]); + }, + add_row: function(){ + if (this.table.length) { + this.set_row_cells_with(this.table[this.table.length - 1]); + } + var row = []; + this.table.push(row); + this.x = 0; + this.y += 1; + return row; + }, + set_row_cells_with: function(row) { + for (var i = 0; i < row.length; i++) { + var w = row[i]; + if (w.is_field_label) { + w.width = "1%"; + if (row[i + 1]) { + row[i + 1].width = Math.round((100 / this.columns) * (w.colspan + 1) - 1) + '%'; + } + } else if (w.width === undefined) { + w.width = Math.round((100 / this.columns) * w.colspan) + '%'; + } + } + }, + handle_node: function(n) { + var type = this.view.fields_view.fields[n.attrs.name] || {}; + var widget_type = n.attrs.widget || type.type || n.tag; + if (openerp.base.widgets[widget_type]) { + if (n.tag == 'field' && n.attrs.nolabel != '1') { + var label = new openerp.base.widgets['label'](this.session, null, this.view, n); + this.add_widget(label); + } + var widget = new openerp.base.widgets[widget_type](this.session, null, this.view, n); + this.add_widget(widget); + } else { + console.log("Unhandled widget type : " + widget_type, n); + } + }, + add_widget: function(w) { + if (!w.invisible) { + var current_row = this.table[this.table.length - 1]; + if (current_row.length && (this.x + w.colspan) > this.columns) { + current_row = this.add_row(); + } + current_row.push(w); + this.x += w.colspan; + } + return w; + } +}); +openerp.base.WidgetNotebook = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.notebook"; + this.pages = []; + for (var i = 0; i < node.children.length; i++) { + var n = node.children[i]; + if (n.tag == "page") { + var page = new openerp.base.WidgetFrame(this.session, null, this.view, n); + this.pages.push(page); + } + } + } +}); +openerp.base.WidgetSeparator = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.separator"; + } +}); +openerp.base.WidgetLabel = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this.is_field_label = true; + this._super(session, element_id, view, node); + this.template = "FormView.label"; + this.colspan = 1; + } +}); +openerp.base.WidgetFieldChar = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.char"; + } +}); +openerp.base.WidgetFieldEmail = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.char"; + } +}); +openerp.base.WidgetFieldFloat = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.char"; + } +}); +openerp.base.WidgetFieldBoolean = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.boolean"; + } +}); +openerp.base.WidgetFieldDate = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.date"; + } +}); +openerp.base.WidgetFieldDatetime = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.datetime"; + } +}); +openerp.base.WidgetFieldText = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.text"; + } +}); +openerp.base.WidgetFieldSelection = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.selection"; + } +}); +openerp.base.WidgetFieldMany2One = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.many2one"; + } +}); +openerp.base.WidgetFieldOne2Many = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.one2many"; + } +}); +openerp.base.WidgetFieldReference = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.field.reference"; + } +}); +openerp.base.WidgetButton = openerp.base.Widget.extend({ + init: function(session, element_id, view, node) { + this._super(session, element_id, view, node); + this.template = "FormView.button"; + } +}); +openerp.base.widgets = { + 'group' : openerp.base.WidgetFrame, + 'notebook' : openerp.base.WidgetNotebook, + 'separator' : openerp.base.WidgetSeparator, + 'label' : openerp.base.WidgetLabel, + 'char' : openerp.base.WidgetFieldChar, + 'email' : openerp.base.WidgetFieldEmail, + 'date' : openerp.base.WidgetFieldDate, + 'datetime' : openerp.base.WidgetFieldDatetime, + 'text' : openerp.base.WidgetFieldText, + 'selection' : openerp.base.WidgetFieldSelection, + 'many2one' : openerp.base.WidgetFieldMany2One, + 'one2many' : openerp.base.WidgetFieldOne2Many, + 'reference' : openerp.base.WidgetFieldReference, + 'boolean' : openerp.base.WidgetFieldBoolean, + 'float' : openerp.base.WidgetFieldFloat, + 'button' : openerp.base.WidgetButton +} + openerp.base.FormView = openerp.base.Controller.extend({ init: function(session, element_id, dataset, view_id) { this._super(session, element_id); this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; + this.widgets = {}; + this.fields = {}; }, start: function() { //this.log('Starting FormView '+this.model+this.view_id) - this.rpc("/base/formview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded); + this.rpc("/base/formview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, on_loaded: function(data) { this.fields_view = data.fields_view; //this.log(this.fields_view); - this.$element.html(QWeb.render("FormView", {"fields_view": this.fields_view})); + var frame = new openerp.base.WidgetFrame(this.session, null, this, this.fields_view.arch); + this.$element.html(QWeb.render("FormView", { "frame": frame, "view": this })); + for (var i in this.widgets) { + this.widgets[i].register(); + } }, on_button: function() { },