From 4c0222355dfc1ea87ea05589eb014ce182d1a97b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Fri, 13 Jun 2014 11:57:18 +0200 Subject: [PATCH 1/4] [IMP] add default order parameter to list views List views can now be sorted by default with a simple keyword 'order'. For example ... ... --- addons/web/static/src/js/view_list.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 16d0310ab4d..4a63b9921c3 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -354,6 +354,12 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi this.sidebar.$el.hide(); } //Sort + var default_order = this.fields_view.arch.attrs.order, + unsorted = !this.dataset._sort.length; + if (unsorted && default_order) { + this.dataset.sort(default_order); + } + if(this.dataset._sort.length){ if(this.dataset._sort[0].indexOf('-') == -1){ this.$el.find('th[data-id=' + this.dataset._sort[0] + ']').addClass("sortdown"); From 44db8772ec31b9239df6f536c651274832728d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Fri, 13 Jun 2014 12:08:36 +0200 Subject: [PATCH 2/4] [IMP] add default order to kanban views Now, the kanban view can be sorted by any field by default. It just needs to be given in the xml descriptor. For ex, --- addons/web_kanban/static/src/js/kanban.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 1d97522e011..b0c0a1680ec 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -62,6 +62,14 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }, load_kanban: function(data) { this.fields_view = data; + + // use default order if defined in xml description + var default_order = this.fields_view.arch.attrs.order, + unsorted = !this.dataset._sort.length; + if (unsorted && default_order) { + this.dataset.sort(default_order); + } + this.$el.addClass(this.fields_view.arch.attrs['class']); this.$buttons = $(QWeb.render("KanbanView.buttons", {'widget': this})); if (this.options.$buttons) { From cb7450acec2d80b3503fdf7451271e3e941dfa81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Fri, 13 Jun 2014 14:55:26 +0200 Subject: [PATCH 3/4] [IMP] improves the default order parameter It is renamed 'default_order' and now supports the usual syntax for sorting fields: for example 'field1, field2 desc, field3 asc' --- addons/web/static/src/js/view_list.js | 7 +++++-- addons/web_kanban/static/src/js/kanban.js | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 4a63b9921c3..2dce42fe3ba 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -354,10 +354,13 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi this.sidebar.$el.hide(); } //Sort - var default_order = this.fields_view.arch.attrs.order, + var default_order = this.fields_view.arch.attrs.default_order, unsorted = !this.dataset._sort.length; if (unsorted && default_order) { - this.dataset.sort(default_order); + _.each(default_order.split(',').reverse(), function (order) { + var split = _.without(order.split(' '), ''); + self.dataset.sort(split[0], split[1] === 'desc'); + }); } if(this.dataset._sort.length){ diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index b0c0a1680ec..56bebb8cbd2 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -61,13 +61,17 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ $('html').off('click.kanban'); }, load_kanban: function(data) { + var self = this; this.fields_view = data; // use default order if defined in xml description - var default_order = this.fields_view.arch.attrs.order, + var default_order = this.fields_view.arch.attrs.default_order, unsorted = !this.dataset._sort.length; if (unsorted && default_order) { - this.dataset.sort(default_order); + _.each(default_order.split(',').reverse(), function (order) { + var split = _.without(order.split(' '), ''); + self.dataset.sort(split[0], split[1] === 'desc'); + }); } this.$el.addClass(this.fields_view.arch.attrs['class']); From 5f09c7dedc6f4a60a1b42858324990aa35084f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Mon, 16 Jun 2014 10:44:23 +0200 Subject: [PATCH 4/4] [IMP] improves sorting mechanisms in datasets Create a deserialize_sort method and add a set_sort method to datasets. The set_sort method is useful to avoid duplicating code in lists and kanban views (to set the initial default order) --- addons/web/static/src/js/data.js | 20 ++++++++++++++++++++ addons/web/static/src/js/view_list.js | 5 +---- addons/web_kanban/static/src/js/kanban.js | 6 +----- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index 6819634655d..f580d282516 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -21,6 +21,17 @@ instance.web.serialize_sort = function (criterion) { }).join(', '); }; +/** + * Reverse of the serialize_sort function: convert an array of SQL-like sort + * descriptors into a list of fields prefixed with '-' if necessary. + */ + instance.web.deserialize_sort = function (criterion) { + return _.map(criterion, function (criteria) { + var split = _.without(criteria.split(' '), ''); + return (split[1] && split[1].toLowerCase() === 'desc' ? '-' : '') + split[0]; + }); +}; + instance.web.Query = instance.web.Class.extend({ init: function (model, fields) { this._model = model; @@ -685,6 +696,15 @@ instance.web.DataSet = instance.web.Class.extend(instance.web.PropertiesMixin, this._sort.unshift((reverse ? '-' : '') + field); return undefined; }, + /** + * Set the sort criteria on the dataset. + * + * @param {Array} fields_list: list of fields order descriptors, as used by + * Odoo's ORM (such as 'name desc', 'product_id', 'order_date asc') + */ + set_sort: function (fields_list) { + this._sort = instance.web.deserialize_sort(fields_list); + }, size: function () { return this.ids.length; }, diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 2dce42fe3ba..6bea2bbe4ad 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -357,10 +357,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi var default_order = this.fields_view.arch.attrs.default_order, unsorted = !this.dataset._sort.length; if (unsorted && default_order) { - _.each(default_order.split(',').reverse(), function (order) { - var split = _.without(order.split(' '), ''); - self.dataset.sort(split[0], split[1] === 'desc'); - }); + this.dataset.set_sort(default_order.split(',')); } if(this.dataset._sort.length){ diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 56bebb8cbd2..239a703d276 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -61,17 +61,13 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ $('html').off('click.kanban'); }, load_kanban: function(data) { - var self = this; this.fields_view = data; // use default order if defined in xml description var default_order = this.fields_view.arch.attrs.default_order, unsorted = !this.dataset._sort.length; if (unsorted && default_order) { - _.each(default_order.split(',').reverse(), function (order) { - var split = _.without(order.split(' '), ''); - self.dataset.sort(split[0], split[1] === 'desc'); - }); + this.dataset.set_sort(default_order.split(',')); } this.$el.addClass(this.fields_view.arch.attrs['class']);