From 35b6a7efec5f8c59ef26abe646a787898672b65f Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 17 Mar 2011 14:41:55 +0100 Subject: [PATCH] form logic part1 bzr revid: al@openerp.com-20110317134155-snjjer2ynnbwuynf --- addons/base/static/openerp/js/base_views.js | 564 +++++++++++--------- 1 file changed, 299 insertions(+), 265 deletions(-) diff --git a/addons/base/static/openerp/js/base_views.js b/addons/base/static/openerp/js/base_views.js index c03b08018fc..3c649d4af6f 100644 --- a/addons/base/static/openerp/js/base_views.js +++ b/addons/base/static/openerp/js/base_views.js @@ -3,6 +3,86 @@ *---------------------------------------------------------*/ openerp.base$views = function(openerp) { + +openerp.base.Action = openerp.base.Controller.extend({ + init: function(session, element_id) { + this._super(session, element_id); + this.action = null; + this.dataset = null; + this.searchview_id = false; + this.searchview = null; + this.listview_id = false; + this.listview = null; + this.formview_id = false; + this.formview = null; + }, + start: function() { + this.$element.html(QWeb.render("Action", {"prefix":this.element_id})); + this.$element.find("#mode_list").bind('click',this.on_mode_list); + this.$element.find("#mode_form").bind('click',this.on_mode_form); + this.on_mode_list(); + }, + on_mode_list: function() { + $("#oe_action_form").hide(); + $("#oe_action_search").show(); + $("#oe_action_list").show(); + }, + on_mode_form: function() { + $("#oe_action_form").show(); + $("#oe_action_search").hide(); + $("#oe_action_list").hide(); + }, + do_action: function(action) { + // instantiate the right controllers by understanding the action + this.action = action; + this.log(action); +// debugger; + //this.log(action); + if(action.type == "ir.actions.act_window") { + this.do_action_window(action); + } + }, + do_action_window: function(action) { + this.formview_id = false; + this.dataset = new openerp.base.DataSet(this.session, "oe_action_dataset", action.res_model); + this.dataset.start(); + + // Locate first tree view + this.listview_id = false; + for(var i = 0; i < action.views.length; i++) { + if(action.views[i][1] == "tree") { + this.listview_id = action.views[i][0]; + break; + } + } + this.listview = new openerp.base.ListView(this.session, "oe_action_list", this.dataset, this.listview_id); + this.listview.start(); + + // Locate first form view + this.listview_id = false; + for(var j = 0; j < action.views.length; j++) { + if(action.views[j][1] == "form") { + this.formview_id = action.views[j][0]; + break; + } + } + this.formview = new openerp.base.FormView(this.session, "oe_action_form", this.dataset, this.formview_id); + this.formview.start(); + + // Take the only possible search view. Is that consistent ? + this.searchview_id = false; + if(this.listview && action.search_view_id) { + this.searchview_id = action.search_view_id[0]; + } + this.searchview = new openerp.base.SearchView(this.session, "oe_action_search", this.dataset, this.searchview_id); + this.searchview.start(); + } +}); + +openerp.base.View = openerp.base.Controller.extend({ +// to replace Action +}); + openerp.base.DataSet = openerp.base.Controller.extend({ init: function(session, element_id, model) { this._super(session, element_id); @@ -42,15 +122,18 @@ openerp.base.DataSet = openerp.base.Controller.extend({ }); openerp.base.DataRecord = openerp.base.Controller.extend({ - init: function(session, element_id, model, id) { - this._super(session, element_id); + init: function(session, model, fields) { + this._super(session, null); this.model = model; this.id = id; - this.value = {}; + this.fields = fields; + this.values = {}; }, - start: function() { + load: function(id) { + // READ }, - on_ready: function() { + on_loaded: function() { + // set t this.values = data.rea }, }, on_change: function() { }, @@ -58,6 +141,204 @@ openerp.base.DataRecord = openerp.base.Controller.extend({ } }); +openerp.base.SearchView = 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.input_index = 0; + this.input_ids = {}; + this.domain = []; + }, + start: function() { + //this.log('Starting SearchView '+this.model+this.view_id) + this.rpc("/base/searchview/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.input_ids = {}; + this.$element.html(QWeb.render("SearchView", {"fields_view": this.fields_view})); + this.$element.find("#search").bind('click',this.on_search); + // TODO bind click event on all button + // TODO we don't do many2one yet, but in the future bind a many2one controller on them + this.log(this.$element.find("#search")); + }, + register_input: function(node) { + // self should be passed in the qweb dict to do: + // + + // generate id + var id = this.element_id + "_" + this.input_index++; + // TODO construct a nice object + // save it in our registry + this.input_ids[id] = { + node: node, + type: "filter", + domain: "", + context: "", + disabled: false + }; + + return id; + }, + on_click: function() { + // event catched on a button + // flip the disabled flag + // adjust the css class + }, + on_search: function() { + this.log("on_search"); + // collect all non disabled domains definitions, AND them + // evaluate as python expression + // save the result in this.domain + this.dataset.do_load(); + }, + on_clear: function() { + } +}); + +openerp.base.SearchViewInput = openerp.base.Controller.extend({ +// TODO not sure should we create a controller for every input ? + +// of we just keep a simple dict for each input in +// openerp.base.SearchView#input_ids +// and use if when we get an event depending on the type +// i think it's less bloated to avoid useless controllers + +// but i think for many2one a controller would be nice +// so simple dict for simple inputs +// an controller for many2one ? + +}); + +openerp.base.FormView = openerp.base.Controller.extend({ + init: function(session, element_id, dataset, view_id) { + this._super(session, element_id); + this.dataset = dataset; + this.dataset_index = 0; + this.model = dataset.model; + this.view_id = view_id; + this.fields_views = {}; + this.widgets = {}; + this.fields = {}; + this.datarecord = {}; + }, + 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); + }, + on_loaded: function(data) { + this.fields_view = data.fields_view; + //this.log(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(); + } + // bind to all wdigets that have onchange ?? + + // When the dataset is loaded load the first record (like gtk) + this.dataset.on_loaded.add_last(this.do_load_record); + + // When a datarecord is loaded display the values in the inputs + this.datarecord = new openerp.base.DataRecord(this.session, this.model,{}); + this.datarecord.on_loaded.add(this.on_record_loaded); + + }, + do_load_record: function() { + // if dataset is empty display the empty datarecord + if(this.dataset.ids.length == 0) { + this.on_record_loaded(); + } + this.datarecord.load(this.dataset.ids[this.dataset_index]); + }, + on_record_loaded: function() { + //for i in this.fields: f.update_from_datarecord() + }, +}); + +openerp.base.ListView = 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.name = ""; + + this.cols = []; + + this.$table = null; + this.colnames = []; + this.colmodel = []; + + this.event_loading = false; // TODO in the future prevent abusive click by masking + }, + start: function() { + //this.log('Starting ListView '+this.model+this.view_id) + this.rpc("/base/listview/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.name = "" + this.fields_view.arch.attrs.string; + this.$element.html(QWeb.render("ListView", {"fields_view": this.fields_view})); + this.$table = this.$element.find("table"); + this.cols = []; + this.colnames = []; + this.colmodel = []; + // TODO uss a object for each col, fill it with view and fallback to dataset.model_field + var tree = this.fields_view.arch.children; + for(var i = 0; i < tree.length; i++) { + var col = tree[i]; + if(col.tag == "field") { + this.cols.push(col.attrs.name); + this.colnames.push(col.attrs.name); + this.colmodel.push({ name: col.attrs.name, index: col.attrs.name }); + } + } + //this.log(this.cols); + this.dataset.fields = this.cols; + this.dataset.on_loaded.add_last(this.do_fill_table); + }, + do_fill_table: function() { + //this.log("do_fill_table"); + + var self = this; + //this.log(this.dataset.data); + var rows = []; + var ids = this.dataset.ids; + for(var i = 0; i < ids.length; i++) { + // TODO very strange is sometimes non existing ? even as admin ? example ir.ui.menu + var row = this.dataset.values[ids[i]]; + if(row) + rows.push(row); +// else +// debugger; + } + //this.log(rows); + this.$table.jqGrid({ + data: rows, + datatype: "local", + height: "100%", + rowNum: 100, + //rowList: [10,20,30], + colNames: this.colnames, + colModel: this.colmodel, + //pager: "#plist47", + viewrecords: true, + caption: this.name + }).setGridWidth(this.$element.width()); + $(window).bind('resize', function() { self.$table.setGridWidth(self.$element.width()); }).trigger('resize'); + } +}); + +openerp.base.TreeView = openerp.base.Controller.extend({ +}); + openerp.base.Widget = openerp.base.Controller.extend({ // TODO Change this to init: function(view, node) { and use view.session and a new element_id for the super // it means that widgets are special controllers @@ -211,6 +492,7 @@ openerp.base.WidgetButton = openerp.base.Widget.extend({ openerp.base.Field = openerp.base.Widget.extend({ init: function(session, element_id, view, node) { this._super(session, element_id, view, node); + // this.datarecord = this.view.datarecord ?? } }); @@ -218,7 +500,18 @@ openerp.base.FieldChar = openerp.base.Field.extend({ init: function(session, element_id, view, node) { this._super(session, element_id, view, node); this.template = "FormView.field.char"; - } + + }, + start: function() { + // this.$element.bind('leaving_focus',) + }, + set_value: function() { + // this.$element.val(this.view.datarecord.values[this.name]) + }, + on_change: function() { + //this.view.update_field(this.name,value); + + }, }); openerp.base.FieldEmail = openerp.base.Field.extend({ @@ -321,112 +614,6 @@ openerp.base.widgets = { '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); - }, - on_loaded: function(data) { - this.fields_view = data.fields_view; - //this.log(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() { - }, - on_write: function() { - } -}); - -openerp.base.ListView = 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.name = ""; - - this.cols = []; - - this.$table = null; - this.colnames = []; - this.colmodel = []; - - this.event_loading = false; // TODO in the future prevent abusive click by masking - }, - start: function() { - //this.log('Starting ListView '+this.model+this.view_id) - this.rpc("/base/listview/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.name = "" + this.fields_view.arch.attrs.string; - this.$element.html(QWeb.render("ListView", {"fields_view": this.fields_view})); - this.$table = this.$element.find("table"); - this.cols = []; - this.colnames = []; - this.colmodel = []; - // TODO uss a object for each col, fill it with view and fallback to dataset.model_field - var tree = this.fields_view.arch.children; - for(var i = 0; i < tree.length; i++) { - var col = tree[i]; - if(col.tag == "field") { - this.cols.push(col.attrs.name); - this.colnames.push(col.attrs.name); - this.colmodel.push({ name: col.attrs.name, index: col.attrs.name }); - } - } - //this.log(this.cols); - this.dataset.fields = this.cols; - this.dataset.on_loaded.add_last(this.do_fill_table); - }, - do_fill_table: function() { - //this.log("do_fill_table"); - - var self = this; - //this.log(this.dataset.data); - var rows = []; - var ids = this.dataset.ids; - for(var i = 0; i < ids.length; i++) { - // TODO very strange is sometimes non existing ? even as admin ? example ir.ui.menu - var row = this.dataset.values[ids[i]]; - if(row) - rows.push(row); -// else -// debugger; - } - //this.log(rows); - this.$table.jqGrid({ - data: rows, - datatype: "local", - height: "100%", - rowNum: 100, - //rowList: [10,20,30], - colNames: this.colnames, - colModel: this.colmodel, - //pager: "#plist47", - viewrecords: true, - caption: this.name - }).setGridWidth(this.$element.width()); - $(window).bind('resize', function() { self.$table.setGridWidth(self.$element.width()); }).trigger('resize'); - } -}); - -openerp.base.TreeView = openerp.base.Controller.extend({ -}); - openerp.base.CalendarView = openerp.base.Controller.extend({ // Dhtmlx scheduler ? }); @@ -442,165 +629,12 @@ openerp.base.DiagramView = openerp.base.Controller.extend({ openerp.base.GraphView = openerp.base.Controller.extend({ }); -openerp.base.SearchViewInput = openerp.base.Controller.extend({ -// TODO not sure should we create a controller for every input ? - -// of we just keep a simple dict for each input in -// openerp.base.SearchView#input_ids -// and use if when we get an event depending on the type -// i think it's less bloated to avoid useless controllers - -// but i think for many2one a controller would be nice -// so simple dict for simple inputs -// an controller for many2one ? - -}); - -openerp.base.SearchView = 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.input_index = 0; - this.input_ids = {}; - this.domain = []; - }, - start: function() { - //this.log('Starting SearchView '+this.model+this.view_id) - this.rpc("/base/searchview/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.input_ids = {}; - this.$element.html(QWeb.render("SearchView", {"fields_view": this.fields_view})); - this.$element.find("#search").bind('click',this.on_search); - // TODO bind click event on all button - // TODO we don't do many2one yet, but in the future bind a many2one controller on them - this.log(this.$element.find("#search")); - }, - register_input: function(node) { - // self should be passed in the qweb dict to do: - // - - // generate id - var id = this.element_id + "_" + this.input_index++; - // TODO construct a nice object - // save it in our registry - this.input_ids[id] = { - node: node, - type: "filter", - domain: "", - context: "", - disabled: false - }; - - return id; - }, - on_click: function() { - // event catched on a button - // flip the disabled flag - // adjust the css class - }, - on_search: function() { - this.log("on_search"); - // collect all non disabled domains definitions, AND them - // evaluate as python expression - // save the result in this.domain - }, - on_clear: function() { - } -}); - openerp.base.ProcessView = openerp.base.Controller.extend({ }); openerp.base.HelpView = openerp.base.Controller.extend({ }); -openerp.base.View = openerp.base.Controller.extend({ -// to replace Action -}); - -openerp.base.Action = openerp.base.Controller.extend({ - init: function(session, element_id) { - this._super(session, element_id); - this.action = null; - this.dataset = null; - this.searchview_id = false; - this.searchview = null; - this.listview_id = false; - this.listview = null; - this.formview_id = false; - this.formview = null; - }, - start: function() { - this.$element.html(QWeb.render("Action", {"prefix":this.element_id})); - this.$element.find("#mode_list").bind('click',this.on_mode_list); - this.$element.find("#mode_form").bind('click',this.on_mode_form); - this.on_mode_list(); - }, - on_mode_list: function() { - $("#oe_action_form").hide(); - $("#oe_action_search").show(); - $("#oe_action_list").show(); - }, - on_mode_form: function() { - $("#oe_action_form").show(); - $("#oe_action_search").hide(); - $("#oe_action_list").hide(); - }, - do_action: function(action) { - // instantiate the right controllers by understanding the action - this.action = action; - this.log(action); -// debugger; - //this.log(action); - if(action.type == "ir.actions.act_window") { - this.do_action_window(action); - } - }, - do_action_window: function(action) { - this.formview_id = false; - this.dataset = new openerp.base.DataSet(this.session, "oe_action_dataset", action.res_model); - this.dataset.start(); - - // Locate first tree view - this.listview_id = false; - for(var i = 0; i < action.views.length; i++) { - if(action.views[i][1] == "tree") { - this.listview_id = action.views[i][0]; - break; - } - } - this.listview = new openerp.base.ListView(this.session, "oe_action_list", this.dataset, this.listview_id); - this.listview.start(); - - // Locate first form view - this.listview_id = false; - for(var j = 0; j < action.views.length; j++) { - if(action.views[j][1] == "form") { - this.formview_id = action.views[j][0]; - break; - } - } - this.formview = new openerp.base.FormView(this.session, "oe_action_form", this.dataset, this.formview_id); - this.formview.start(); - - // Take the only possible search view. Is that consistent ? - this.searchview_id = false; - if(this.listview && action.search_view_id) { - this.searchview_id = action.search_view_id[0]; - } - this.searchview = new openerp.base.SearchView(this.session, "oe_action_search", this.dataset, this.searchview_id); - this.searchview.start(); - - // Connect the the dataset load event with the search button of search view - // THIS IS COOL - this.searchview.on_search.add_last(this.dataset.do_load); - } -}); }; // DEBUG_RPC:rpc.request:('execute', 'addons-dsh-l10n_us', 1, '*', ('ir.filters', 'get_filters', u'res.partner'))