From aa3ef52416b9b5a3d4ebd1d9ccc9f0b9aab40911 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 16 May 2012 15:22:37 +0200 Subject: [PATCH] [FIX] make display of advanced filters look less purely technical and more human-readable * Use field strings * Use operator labels * If applicable, use human-readable version of field values bzr revid: xmo@openerp.com-20120516132237-z6zacy34sq7ujhg0 --- addons/web/static/src/js/search.js | 54 +++++++++++++++++++++++------- doc/search-view.rst | 6 ++++ 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 2ac062e96f3..118eff17374 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -1690,20 +1690,15 @@ instance.web.search.Advanced = instance.web.search.Input.extend({ var self = this; // Get domain sections from all propositions var children = this.getChildren(); - var domain = _.invoke(children, 'get_proposition'); - var vals = _(domain).map(function (section) { - return { - label: _.str.sprintf('%s(%s)%s', section[0], section[1], section[2]), - value: null - } - }); + var propositions = _.invoke(children, 'get_proposition'); + var domain = _(propositions).pluck('value'); for (var i = domain.length; --i;) { domain.unshift('|'); } this.view.query.add({ category: _t("Advanced"), - values: vals, + values: propositions, field: { get_context: function () { }, get_domain: function () { return domain;}, @@ -1789,10 +1784,21 @@ instance.web.search.ExtendedSearchProposition = instance.web.OldWidget.extend(/* get_proposition: function() { if ( this.attrs.selected == null) return null; - var field = this.attrs.selected.name; - var op = this.$element.find('.searchview_extended_prop_op').val(); - var value = this.value.get_value(); - return [field, op, value]; + var field = this.attrs.selected; + var op = this.$element.find('.searchview_extended_prop_op')[0]; + var operator = op.options[op.selectedIndex]; + return { + label: _.str.sprintf(_t('%(field)s %(operator)s "%(value)s"'), { + field: field.string, + // According to spec, HTMLOptionElement#label should return + // HTMLOptionElement#text when not defined/empty, but it does + // not in older Webkit (between Safari 5.1.5 and Chrome 17) and + // Gecko (pre Firefox 7) browsers, so we need a manual fallback + // for those + operator: operator.label || operator.text, + value: this.value}), + value: [field.name, operator.value, this.value.get_value()] + }; } }); @@ -1800,6 +1806,18 @@ instance.web.search.ExtendedSearchProposition.Field = instance.web.Widget.extend init: function (parent, field) { this._super(parent); this.field = field; + }, + /** + * Returns a human-readable version of the value, in case the "logical" + * and the "semantic" values of a field differ (as for selection fields, + * for instance). + * + * The default implementation simply returns the value itself. + * + * @return {String} human-readable version of the value + */ + toString: function () { + return this.get_value(); } }); instance.web.search.ExtendedSearchProposition.Char = instance.web.search.ExtendedSearchProposition.Field.extend({ @@ -1852,6 +1870,9 @@ instance.web.search.ExtendedSearchProposition.Integer = instance.web.search.Exte {value: ">=", text: _lt("greater or equal than")}, {value: "<=", text: _lt("less or equal than")} ], + toString: function () { + return this.$element.val(); + }, get_value: function() { try { return instance.web.parse_value(this.$element.val(), {'widget': 'integer'}); @@ -1873,6 +1894,9 @@ instance.web.search.ExtendedSearchProposition.Float = instance.web.search.Extend {value: ">=", text: _lt("greater or equal than")}, {value: "<=", text: _lt("less or equal than")} ], + toString: function () { + return this.$element.val(); + }, get_value: function() { try { return instance.web.parse_value(this.$element.val(), {'widget': 'float'}); @@ -1887,6 +1911,11 @@ instance.web.search.ExtendedSearchProposition.Selection = instance.web.search.Ex {value: "=", text: _lt("is")}, {value: "!=", text: _lt("is not")} ], + toString: function () { + var select = this.$element[0]; + var option = select.options[select.selectedIndex]; + return option.label || option.text; + }, get_value: function() { return this.$element.val(); } @@ -1897,6 +1926,7 @@ instance.web.search.ExtendedSearchProposition.Boolean = instance.web.search.Exte {value: "=", text: _lt("is true")}, {value: "!=", text: _lt("is false")} ], + toString: function () { return ''; }, get_value: function() { return true; } diff --git a/doc/search-view.rst b/doc/search-view.rst index 0fb7657cf2f..02a239924e5 100644 --- a/doc/search-view.rst +++ b/doc/search-view.rst @@ -478,6 +478,12 @@ Advanced Search constructor, and bound to its :js:attr:`~openerp.web.search.ExtendedSearchProposition.Field.field`. +* Instead of its former domain triplet ``(field, operator, value)``, + :js:func:`~openerp.web.search.ExtendedSearchProposition.get_proposition` + now returns an object with two fields ``label`` and ``value``, + respectively a human-readable version of the proposition and the + corresponding domain triplet for the proposition. + .. [#previous] the original view was implemented on top of a monkey-patched