summaryrefslogtreecommitdiff
path: root/addons/base/static/src
diff options
context:
space:
mode:
authorXavier Morel <xmo@openerp.com>2011-05-04 16:50:00 +0200
committerXavier Morel <xmo@openerp.com>2011-05-04 16:50:00 +0200
commit37116811aecf5d7c721414484ba00a9ad6c53ae9 (patch)
treef7244b96302f4faaf3ec102d3bbc50ee8f49dce8 /addons/base/static/src
parentfb9104f4bf021570afab7a067422f5bdb7836747 (diff)
parent075902f5c2b0febd70adf5209b4eef2cfb0813b8 (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.css5
-rw-r--r--addons/base/static/src/js/data.js33
-rw-r--r--addons/base/static/src/js/list.js13
-rw-r--r--addons/base/static/src/xml/base.xml4
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>