[ADD] date search widget

bzr revid: xmo@openerp.com-20110401151735-hdxo0289ilmik1go
This commit is contained in:
Xavier Morel 2011-04-01 17:17:35 +02:00
parent efbeb7e50d
commit ac649d5ccc
4 changed files with 169 additions and 8 deletions

View File

@ -654,15 +654,79 @@ openerp.base.search.SelectionField = openerp.base.search.Field.extend({
return this.$element.val();
}
});
openerp.base.search.DateTimeField = openerp.base.search.Field.extend({
get_value: function () {
return this.$element.val();
/**
* @class
* @extends openerp.base.search.Field
*/
openerp.base.search.DateField = openerp.base.search.Field.extend(
/** @lends openerp.base.search.DateField# */{
template: 'SearchView.fields.date',
/**
* enables date picker on the HTML widgets
*/
start: function () {
this._super();
this.$element.find('input').datepicker();
},
stop: function () {
this.$element.find('input').datepicker('destroy');
},
/**
* Returns an object with two optional keys ``from`` and ``to`` providing
* the values for resp. the from and to sections of the date widget.
*
* If a key is absent, then the corresponding field was not filled.
*
* @returns {Object}
*/
get_values: function () {
var values_array = this.$element.find('input').serializeArray();
var from = values_array[0].value;
var to = values_array[1].value;
var field_values = {};
if (from) {
field_values.from = from;
}
if (to) {
field_values.to = to;
}
return field_values;
},
get_context: function () {
var values = this.get_values();
if (!this.attrs.context || _.isEmpty(values)) {
return null;
}
return _.extend(
{}, this.attrs.context,
{own_values: {self: values}});
},
get_domain: function () {
var values = this.get_values();
if (_.isEmpty(values)) {
return null;
}
var domain = this.attrs['filter_domain'];
if (!domain) {
domain = [];
if (values.from) {
domain.push([this.attrs.name, '>=', values.from]);
}
if (values.to) {
domain.push([this.attrs.name, '<=', values.to]);
}
return domain;
}
return _.extend(
{}, domain,
{own_values: {self: values}});
}
});
openerp.base.search.DateField = openerp.base.search.Field.extend({
get_value: function () {
return this.$element.val();
}
openerp.base.search.DateTimeField = openerp.base.search.DateField.extend({
// TODO: time?
});
openerp.base.search.OneToManyField = openerp.base.search.IntegerField.extend({
// TODO: .relation, .context, .domain

View File

@ -319,6 +319,21 @@
<t t-if="filters.length" t-raw="filters.render(defaults)"/>
</div>
</t>
<t t-name="SearchView.fields.date">
<label style="display: block" t-att-title="attrs.help"
t-att-for="element_id">
<t t-esc="attrs.string || attrs.name"/>
<span t-if="attrs.help">(?)</span>
</label>
<div style="white-space: nowrap;" t-att-id="element_id">
<input t-att-name="attrs.name"
t-att-value="defaults[attrs.name] || ''"/>
to
<input t-att-name="attrs.name"
t-att-value="defaults[attrs.name] || ''"/>
<t t-if="filters.length" t-raw="filters.render(defaults)"/>
</div>
</t>
<t t-name="SearchView.field.selection">
<label style="display: block" t-att-title="attrs.help"
t-att-for="element_id">

View File

@ -0,0 +1,73 @@
$(document).ready(function () {
var openerp;
function get_widget(attrs) {
var widget = new openerp.base.search.DateField(
{attrs: attrs}, {name: 'foo'}, {inputs: []});
$('#qunit-fixture').html(widget.render({}));
widget.start();
return widget;
}
module('search-date', {
setup: function () {
openerp = window.openerp.init(true);
window.openerp.base.chrome(openerp);
window.openerp.base.views(openerp);
window.openerp.base.search(openerp);
}
});
test('no values', function () {
var widget = get_widget();
deepEqual(widget.get_values(), {});
strictEqual(widget.get_context(), null);
strictEqual(widget.get_domain(), null);
});
test('filled from', function () {
var widget = get_widget();
widget.$element.find('input:eq(0)').val('1912-06-23');
deepEqual(widget.get_values(), {from: '1912-06-23'});
strictEqual(widget.get_context(), null);
deepEqual(widget.get_domain(), [['foo', '>=', '1912-06-23']]);
});
test('filled to', function () {
var widget = get_widget();
widget.$element.find('input:eq(1)').val('1954-06-07');
deepEqual(widget.get_values(), {to: '1954-06-07'});
strictEqual(widget.get_context(), null);
deepEqual(widget.get_domain(), [['foo', '<=', '1954-06-07']]);
});
test('filled both', function () {
var widget = get_widget();
widget.$element.find('input:eq(0)').val('1912-06-23');
widget.$element.find('input:eq(1)').val('1954-06-07');
deepEqual(widget.get_values(), {from: '1912-06-23', to: '1954-06-07'});
strictEqual(widget.get_context(), null);
deepEqual(widget.get_domain(),
[['foo', '>=', '1912-06-23'], ['foo', '<=', '1954-06-07']]);
});
test('custom context', function () {
var widget = get_widget({context: {__id: -1}});
widget.$element.find('input:eq(0)').val('1912-06-23');
widget.$element.find('input:eq(1)').val('1954-06-07');
deepEqual(
widget.get_context(),
{__id: -1,
own_values: {
self: {from: '1912-06-23', to: '1954-06-07'}}});
});
test('custom filter_domain', function () {
var widget = get_widget({filter_domain: {__id: -42}});
widget.$element.find('input:eq(0)').val('1912-06-23');
widget.$element.find('input:eq(1)').val('1954-06-07');
deepEqual(
widget.get_domain(),
{__id: -42,
own_values: {
self: {from: '1912-06-23', to: '1954-06-07'}}});
});
});

View File

@ -12,11 +12,18 @@
<!-- jquery -->
<script src="/base/static/lib/jquery/jquery-1.5.1.js"></script>
<script src="/base/static/lib/jquery.ui/js/jquery-ui-1.8.9.custom.min.js"></script>
<script src="/base/static/lib/qweb/qweb.js"></script>
<script src="/base/static/src/js/base.js"></script>
<script src="/base/static/src/js/chrome.js"></script>
<script src="/base/static/src/js/data.js"></script>
<script src="/base/static/src/js/views.js"></script>
<script src="/base/static/src/js/search.js"></script>
<script type="text/javascript">
QWeb.add_template('/base/static/src/xml/base.xml');
</script>
</head>
<body id="oe" class="openerp">
<h1 id="qunit-header">OpenERP Base Test Suite</h1>
@ -24,7 +31,9 @@
<div id="qunit-testrunner-toolbar"></div>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
<div id="qunit-fixture"></div>
</body>
<script type="text/javascript" src="/base/static/test/dataset.js"></script>
<script type="text/javascript" src="/base/static/test/registry.js"></script>
<script type="text/javascript" src="/base/static/test/search-date.js"></script>
</html>