diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 73d44041248..e1df0a4d8b7 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -303,10 +303,10 @@ class DataSet(openerpweb.Controller): return Model.read(ids, fields or False) @openerpweb.jsonrequest - def get(self, request, model, ids): - self.do_get(request, model, ids) + def get(self, request, model, ids, fields=False): + return self.do_get(request, model, ids, fields) - def do_get(self, request, model, ids): + def do_get(self, request, model, ids, fields=False): """ Fetches and returns the records of the model ``model`` whose ids are in ``ids``. @@ -323,7 +323,7 @@ class DataSet(openerpweb.Controller): :rtype: list """ Model = request.session.model(model) - records = Model.read(ids) + records = Model.read(ids, fields) record_map = dict((record['id'], record) for record in records) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index ad4028fb155..985948a0860 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -1,8 +1,7 @@ openerp.base.data = function(openerp) { -openerp.base.DataGroup = openerp.base.Controller.extend( - /** @lends openerp.base.DataGroup# */{ +openerp.base.DataGroup = openerp.base.Controller.extend( /** @lends openerp.base.DataGroup# */{ /** * Management interface between views and the collection of selected OpenERP * records (represents the view's state?) @@ -16,10 +15,9 @@ openerp.base.DataGroup = openerp.base.Controller.extend( } }); -openerp.base.DataSet = openerp.base.Controller.extend( - /** @lends openerp.base.DataSet# */{ +openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.DataSet# */{ /** - * Management interface between views and the collection of selected + * DateaManagement interface between views and the collection of selected * OpenERP records (represents the view's state?) * * @constructs @@ -32,13 +30,14 @@ openerp.base.DataSet = openerp.base.Controller.extend( this._super(session); this.model = model; - this._ids = []; - this._active_ids = null; - this._active_id_index = 0; + this.ids = []; + this.offset + this.index = 0; + this.count = 0; - this._sort = []; - this._domain = []; - this._context = {}; + this.sort = []; + this.domain = []; + this.context = {}; }, start: function() { }, @@ -55,141 +54,54 @@ openerp.base.DataSet = openerp.base.Controller.extend( * @param {Number} [limit=null] The maximum number of records to return * @returns itself */ - fetch: function (fields, offset, limit) { + fetch: function (fields, offset, limit, callback) { + var self = this; offset = offset || 0; this.rpc('/base/dataset/find', { model: this.model, fields: fields, - domain: this._domain, - context: this._context, - sort: this._sort, + domain: this.domain, + context: this.context, + sort: this.sort, offset: offset, limit: limit - }, _.bind(function (records) { - var data_records = _.map( - records, function (record) { - return new openerp.base.DataRecord(this.session, this.model, fields, record); - }, this); - - this.on_fetch(data_records, { - offset: offset, - limit: limit, - domain: this._domain, - context: this._context, - sort: this._sort - }); - }, this)); - return this; + }, function (records) { + var r = []; + this.offset = offset; + this.count = records.length; // TODO: get real count + for (var i=0; i < records.length; i++ ) { + self.ids.push(records[i].id); + r.push(new openerp.base.DataRecord(self.session, self.model, fields, records[i])); + } + callback(r); + }); }, - /** - * Fires after the DataSet fetched the records matching its internal ids selection - * - * TODO: remove? - * - * @event - * @param {Array} records An array of the DataRecord fetched - * @param event The on_fetch event object - * @param {Number} event.offset the offset with which the original DataSet#fetch call was performed - * @param {Number} event.limit the limit set on the original DataSet#fetch call - * @param {Array} event.domain the domain set on the DataSet before DataSet#fetch was called - * @param {Object} event.context the context set on the DataSet before DataSet#fetch was called - * @param {Array} event.sort the sorting criteria used to get the ids - */ - on_fetch: function (records, event) { - }, - - /** - * Fetch all the currently active records for this DataSet (records selected via DataSet#select) - * - * TODO: add fields, return deferred - * - * @returns itself - */ - active_ids: function (fields) { + fetch_ids: function (ids, fields, callback) { this.rpc('/base/dataset/get', { - ids: this.get_active_ids(), - model: this.model - }, _.bind(function (records) { - this.on_active_ids(_.map( - records, function (record) { - return new openerp.base.DataRecord(this.session, this.model, fields, record); - }, this)); - }, this)); - return this; + model: this.model, + ids: ids, + fields: fields + }, function (records) { + var r = []; + for (var i=0; i < records.length; i++ ) { + r.push(new openerp.base.DataRecord(self.session, self.model, fields, records[i])); + } + callback(r); + }); }, - - /** - * Fires after the DataSet fetched the records matching its internal active ids selection - * - * TODO: remove? - * - * @event - * @param {Array} records An array of the DataRecord fetched - */ - on_active_ids: function (records) { - }, - - /** - * Fetches the current active record for this DataSet - * - * TODO: add field, return deferred? - * - * @returns itself - */ - active_id: function (fields) { - this.rpc('/base/dataset/get', { - ids: [this.get_active_id()], - model: this.model - }, _.bind(function (records) { - var record = records[0]; - this.on_active_id( - record && new openerp.base.DataRecord( - this.session, this.model, - fields, record)); - }, this)); - return this; - }, - - /** - * Fires after the DataSet fetched the record matching the current active record - * - * @event - * @param record the record matching the provided id, or null if there is no record for this id - */ - on_active_id: function (record) { - - }, - - /** - * Configures the DataSet - * - * @param options DataSet options - * @param {Array} options.domain the domain to assign to this DataSet for filtering - * @param {Object} options.context the context this DataSet should use during its calls - * @param {Array} options.sort the sorting criteria for this DataSet - * @returns itself - */ - set: function (options) { - if (options.domain) { - this._domain = _.clone(options.domain); - } - if (options.context) { - this._context = _.clone(options.context); - } - if (options.sort) { - this._sort = _.clone(options.sort); - } - return this; + fetch_index: function (fields, callback) { + fields = fields || false; + this.fetch_ids([this.ids[this.index]], fields, callback); }, /** * Activates the previous id in the active sequence. If there is no previous id, wraps around to the last one * @returns itself */ - prev: function () { - this._active_id_index -= 1; - if (this._active_id_index < 0) { - this._active_id_index = this._active_ids.length - 1; + previous: function () { + this.index -= 1; + if (this.index < 0) { + this.index = this.ids.length - 1; } return this; }, @@ -199,73 +111,13 @@ openerp.base.DataSet = openerp.base.Controller.extend( * @returns itself */ next: function () { - this._active_id_index += 1; - if (this._active_id_index >= this._active_ids.length) { - this._active_id_index = 0; + this.index += 1; + if (this.index >= this.ids.length) { + this.index = 0; } return this; - }, - - /** - * Sets active_ids by value: - * - * * Activates all ids part of the current selection - * - * * Sets active_id to be the first id of the selection - * - * @param {Array} ids the list of ids to activate - * @returns itself - */ - select: function (ids) { - this._active_ids = ids; - this._active_id_index = 0; - return this; - }, - - /** - * Fetches the ids of the currently selected records, if any. - */ - get_active_ids: function () { - return this._active_ids; - }, - - /** - * Sets the current active_id by value - * - * If there are no active_ids selected, selects the provided id as the sole active_id - * - * If there are ids selected and the provided id is not in them, raise an error - * - * @param {Object} id the id to activate - * @returns itself - */ - activate: function (id) { - if(!this._active_ids) { - this._active_ids = [id]; - this._active_id_index = 0; - } else { - var index = _.indexOf(this._active_ids, id); - if (index == -1) { - throw new Error( - "Could not find id " + id + - " in array [" + this._active_ids.join(', ') + "]"); - } - this._active_id_index = index; - } - return this; - }, - - /** - * Fetches the id of the current active record, if any. - * - * @returns record? record id or null - */ - get_active_id: function () { - if (!this._active_ids) { - return null; - } - return this._active_ids[this._active_id_index]; } + }); openerp.base.DataRecord = openerp.base.Controller.extend({ diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 95929eb8481..19fad46bb60 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -21,7 +21,7 @@ openerp.base.FormView = openerp.base.Controller.extend( this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; - this.fields_views = {}; + this.fields_view = {}; this.widgets = {}; this.widgets_counter = 0; this.fields = {}; @@ -35,7 +35,6 @@ openerp.base.FormView = openerp.base.Controller.extend( on_loaded: function(data) { var self = this; this.fields_view = data.fields_view; - //this.log(this.fields_view); var frame = new openerp.base.form.WidgetFrame(this, this.fields_view.arch); @@ -45,25 +44,25 @@ openerp.base.FormView = openerp.base.Controller.extend( }); this.$element.find('button.form_save').click(this.do_save); -// this.dataset.on_active_id.add(this.on_record_loaded); -// this.dataset.active_id(fields of the form, this.on_record_loaded); + this.dataset.fetch_index(this.fields_view.fields, this.on_record_loaded); }, on_next: function() { -// this.dataset.next(); -// this.dataset.active_id(fields of the form, this.on_record_loaded); + this.dataset.next(); + this.dataset.fetch_index(this.fields_view.fields, this.on_record_loaded); }, on_prev: function() { - -// this.dataset.prev(); -// this.dataset.active_id(fields of the form, this.on_record_loaded); + this.dataset.prev(); + this.dataset.fetch_index(this.fields_view.fields, this.on_record_loaded); }, on_record_loaded: function(record) { - this.datarecord = record; - for (var f in this.fields) { - this.fields[f].set_value(this.datarecord.values[f]); + if (record.length) { + this.datarecord = record[0]; + for (var f in this.fields) { + this.fields[f].set_value(this.datarecord.values[f]); + } + this.on_form_changed(); + this.ready = true; } - this.on_form_changed(); - this.ready = true; }, on_form_changed: function(widget) { for (var w in this.widgets) { @@ -101,11 +100,35 @@ openerp.base.FormView = openerp.base.Controller.extend( // rpc - save.callbacl on_saved } }, + do_search: function() { + if (!this.ready) { + return false; + } + var invalid = false; + var values = {}; + for (var f in this.fields) { + f = this.fields[f]; + if (f.invalid) { + invalid = true; + } else { + values[f.name] = f.value; + } + } + if (invalid) { + this.on_invalid(); + } else { + console.log("Save form", values); + // TODO: save values via datarecord + // rpc - save.callbacl on_saved + } + }, on_invalid: function() { }, on_saved: function() { // Check response for exceptions, display error }, + do_search: function (domains, contexts, groupbys) { + }, on_action: function (action) { } }); diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index c64f08a79cf..c1c44ad164f 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -45,8 +45,7 @@ openerp.base.ListView = openerp.base.Controller.extend({ } } this.dataset.fields = this.cols; - this.dataset.on_fetch.add(this.do_fill_table); - + var width = this.$element.width(); this.$table.jqGrid({ datatype: "local", @@ -85,10 +84,9 @@ openerp.base.ListView = openerp.base.Controller.extend({ group_by_seq: groupbys }, function (results) { // TODO: handle non-empty results.group_by with read_group - self.dataset.set({ - context: results.context, - domain: results.domain - }).fetch(self.fields_view.fields, 0, self.limit); + self.dataset.context = results.context; + self.dataset.domain = results.domain; + self.dataset.fetch(self.dataset.fields, 0, self.limit, self.do_fill_table); }); } });