diff options
| author | Xavier Morel <xmo@openerp.com> | 2011-05-04 16:50:00 +0200 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2011-05-04 16:50:00 +0200 |
| commit | 37116811aecf5d7c721414484ba00a9ad6c53ae9 (patch) | |
| tree | f7244b96302f4faaf3ec102d3bbc50ee8f49dce8 /addons/base/static/src | |
| parent | fb9104f4bf021570afab7a067422f5bdb7836747 (diff) | |
| parent | 075902f5c2b0febd70adf5209b4eef2cfb0813b8 (diff) | |
[ADD] column sorting in list view
bzr revid: xmo@openerp.com-20110504145000-tn91g3gorp2cdva3
Diffstat (limited to 'addons/base/static/src')
| -rw-r--r-- | addons/base/static/src/css/base.css | 5 | ||||
| -rw-r--r-- | addons/base/static/src/js/data.js | 33 | ||||
| -rw-r--r-- | addons/base/static/src/js/list.js | 13 | ||||
| -rw-r--r-- | addons/base/static/src/xml/base.xml | 4 |
4 files changed, 51 insertions, 4 deletions
diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 1bd004b53f6..43021e32bc6 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -485,6 +485,11 @@ body.openerp { .openerp .oe-listview td, .openerp .oe-listview th { vertical-align: middle; + text-align: left; +} +.openerp .oe-listview th.oe-sortable, +.openerp .oe-listview th.oe-sortable .ui-icon { + cursor: pointer; } .openerp .oe-listview .oe-field-cell { diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 6d566f4de0a..da0f18001a8 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -144,7 +144,7 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ init: function(session, model) { this._super(session, model); this.domain = []; - this.sort = []; + this._sort = []; this.offset = 0; // subset records[offset:offset+limit] // is it necessary ? @@ -166,7 +166,7 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ fields: fields, domain: this.domain, context: this.context, - sort: this.sort, + sort: this.sort(), offset: offset, limit: limit }, function (records) { @@ -177,6 +177,35 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ } callback(records); }); + }, + /** + * Reads or changes sort criteria on the dataset. + * + * If not provided with any argument, serializes the sort criteria to + * an SQL-like form usable by OpenERP's ORM. + * + * If given a field, will set that field as first sorting criteria or, + * if the field is already the first sorting criteria, will reverse it. + * + * @param {String} [field] field to sort on, reverses it (toggle from ASC to DESC) if already the main sort criteria + * @param {Boolean} [force_reverse=false] forces inserting the field as DESC + * @returns {String|undefined} + */ + sort: function (field, force_reverse) { + if (!field) { + return _.map(this._sort, function (criteria) { + if (criteria[0] === '-') { + return criteria.slice(1) + ' DESC'; + } + return criteria + ' ASC'; + }).join(', '); + } + + var reverse = force_reverse || (this._sort[0] === field); + this._sort = _.without(this._sort, field, '-' + field); + + this._sort.unshift((reverse ? '-' : '') + field); + return undefined; } }); diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index cc84efa65f2..e9061fa7121 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -123,6 +123,8 @@ openerp.base.ListView = openerp.base.Controller.extend( this.visible_columns = _.filter(this.columns, function (column) { return column.invisible !== '1'; }); + + if (!this.fields_view.sorted) { this.fields_view.sorted = {}; } this.$element.html(QWeb.render("ListView", this)); // Head hook @@ -130,6 +132,14 @@ openerp.base.ListView = openerp.base.Controller.extend( this.$element.find('#oe-list-delete') .hide() .click(this.do_delete_selected); + this.$element.find('thead').delegate('th[data-id]', 'click', function (e) { + e.stopPropagation(); + + self.dataset.sort($(this).data('id')); + + // TODO: should only reload content (and set the right column to a sorted display state) + self.do_reload(); + }); var $table = this.$element.find('table'); // Cell events @@ -318,7 +328,8 @@ openerp.base.ListView = openerp.base.Controller.extend( 'model': this.dataset.model, 'id': this.view_id, 'context': this.dataset.context, - 'domain': this.dataset.domain + 'domain': this.dataset.domain, + 'sort': this.dataset.sort && this.dataset.sort() }, this.do_fill_table); }, /** diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 82a41b3f859..9e8000c0f95 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -181,9 +181,11 @@ <tr t-if="options.header"> <th t-if="options.selectable"/> <t t-foreach="columns" t-as="column"> - <th t-if="column.invisible !== '1'"> + <th t-if="column.invisible !== '1'" t-att-data-id="column.id" + t-att-class="((options.sortable and column.tag !== 'button') ? 'oe-sortable' : null)"> <t t-if="column.tag !== 'button'"> <t t-esc="column.string"/> + <span t-att-class="(fields_view.sorted.field === column.id) ? ('ui-icon' + (fields_view.sorted.reversed ? ' ui-icon-triangle-1-n' : ' ui-icon-triangle-1-s')) : ''"/> </t> </th> </t> |
