From 6739e10b50767f6d6f4ed7cf2933bf1f6c094451 Mon Sep 17 00:00:00 2001 From: Adrien Dieudonne Date: Wed, 18 May 2016 10:41:45 +0200 Subject: [PATCH] [ADD] web: add 'is between' operation for dates in search filters - Add two datepickers to specify a range of date/datetime --- .../web/static/src/js/views/search_filters.js | 82 +++++++++++++------ 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/addons/web/static/src/js/views/search_filters.js b/addons/web/static/src/js/views/search_filters.js index 041cda35580..bd3edb2168d 100644 --- a/addons/web/static/src/js/views/search_filters.js +++ b/addons/web/static/src/js/views/search_filters.js @@ -46,15 +46,7 @@ var ExtendedSearchProposition = Widget.extend(/** @lends instance.web.search.Ext } }, operator_changed: function (e) { - var $value = this.$('.o_searchview_extended_prop_value'); - switch ($(e.target).val()) { - case '∃': - case '∄': - $value.hide(); - break; - default: - $value.show(); - } + this.value.show_inputs($(e.target)); }, /** * Selects the provided field object @@ -95,7 +87,7 @@ var ExtendedSearchProposition = Widget.extend(/** @lends instance.web.search.Ext return { attrs: { - domain: [this.value.get_domain(field, operator)], + domain: this.value.get_domain(field, operator), string: this.value.get_label(field, operator), }, children: [], @@ -131,14 +123,21 @@ ExtendedSearchProposition.Field = Widget.extend({ }, get_domain: function (field, operator) { switch (operator.value) { - case '∃': return this.make_domain(field.name, '!=', false); - case '∄': return this.make_domain(field.name, '=', false); - default: return this.make_domain( - field.name, operator.value, this.get_value()); + case '∃': return [[field.name, '!=', false]]; + case '∄': return [[field.name, '=', false]]; + default: return [[field.name, operator.value, this.get_value()]]; } }, - make_domain: function (field, operator, value) { - return [field, operator, value]; + show_inputs: function ($operator) { + var $value = this.$('.o_searchview_extended_prop_value'); + switch ($operator.val()) { + case '∃': + case '∄': + $value.hide(); + break; + default: + $value.show(); + } }, /** * Returns a human-readable version of the value, in case the "logical" @@ -174,6 +173,9 @@ ExtendedSearchProposition.Char = ExtendedSearchProposition.Field.extend({ ExtendedSearchProposition.DateTime = ExtendedSearchProposition.Field.extend({ tagName: 'span', + attributes: { + type: 'datetime' + }, operators: [ {value: "=", text: _lt("is equal to")}, {value: "!=", text: _lt("is not equal to")}, @@ -181,29 +183,63 @@ ExtendedSearchProposition.DateTime = ExtendedSearchProposition.Field.extend({ {value: "<", text: _lt("less than")}, {value: ">=", text: _lt("greater than or equal to")}, {value: "<=", text: _lt("less than or equal to")}, + {value: "between", text: _lt("is between")}, {value: "∃", text: _lt("is set")}, {value: "∄", text: _lt("is not set")} ], widget: function () { return datepicker.DateTimeWidget; }, get_value: function() { - return this.datewidget.get_value(); + return this.datewidget_1.get_value(); + }, + get_domain: function (field, operator) { + switch (operator.value) { + case '∃': + return [[field.name, '!=', false]]; + case '∄': + return [[field.name, '=', false]]; + case 'between': + return [[field.name, '>=', this.datewidget_1.get_value()], [field.name,'<=', this.datewidget_2.get_value()]]; + default: + return [[field.name, operator.value, this.get_value()]]; + } + }, + show_inputs: function ($operator) { + this._super($operator); + if ($operator.val() === 'between') { + if (!this.datewidget_2) { + this.datewidget_2 = new (this.widget())(this); + this.datewidget_2.appendTo(this.$el); + } + else { + this.datewidget_2.$el.show(); + } + } + else { + if (this.datewidget_2) { + this.datewidget_2.$el.hide(); + } + } }, toString: function () { - return formats.format_value(this.get_value(), { type:"datetime" }); + var str = formats.format_value(this.get_value(), { type:this.attributes['type'] }); + if (this.datewidget_2.get_value()) { + str += ' and ' + formats.format_value(this.datewidget_2.get_value(), { type:this.attributes['type'] }); + } + return str; }, start: function() { var ready = this._super(); - this.datewidget = new (this.widget())(this); - this.datewidget.appendTo(this.$el); + this.datewidget_1 = new (this.widget())(this); + this.datewidget_1.appendTo(this.$el); return ready; } }); ExtendedSearchProposition.Date = ExtendedSearchProposition.DateTime.extend({ + attributes: { + type: 'date' + }, widget: function () { return datepicker.DateWidget; }, - toString: function () { - return formats.format_value(this.get_value(), { type:"date" }); - } }); ExtendedSearchProposition.Integer = ExtendedSearchProposition.Field.extend({