[FIX] advanced search

reimplement facet management internally, don't try to go through facets

also tests

bzr revid: xmo@openerp.com-20120511120726-ue2y7exuqv2wh22p
This commit is contained in:
Xavier Morel 2012-05-11 14:07:26 +02:00
parent f3721bb43b
commit 7b4137b49c
2 changed files with 115 additions and 17 deletions

View File

@ -1644,25 +1644,28 @@ instance.web.search.Advanced = instance.web.search.Input.extend({
commit_search: function () {
var self = this;
// Get domain sections from all propositions
var children = this.getChildren(),
domain = _.invoke(children, 'get_proposition');
var filters = _(domain).map(function (section) {
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: new instance.web.search.Filter({attrs: {
domain: [section]
}}, self.view)
};
label: _.str.sprintf('%s(%s)%s', section[0], section[1], section[2]),
value: null
}
});
// Create Filter (& FilterGroup around it) with that domain
var f = new instance.web.search.FilterGroup(filters, this.view);
// add group to query
for (var i = domain.length; --i;) {
domain.unshift('|');
}
this.view.query.add({
category: _t("Advanced"),
values: filters,
field: f
values: vals,
field: {
get_context: function () { },
get_domain: function () { return domain;},
get_groupby: function () { }
}
});
// remove all propositions
_.invoke(children, 'destroy');
// add new empty proposition

View File

@ -203,7 +203,7 @@ $(document).ready(function () {
return {result: {fields_view: {
type: 'search',
fields: {
dummy: {type: 'char'}
dummy: {type: 'char', string: "Dummy"}
},
arch: {
tag: 'search',
@ -225,7 +225,7 @@ $(document).ready(function () {
};
instance.connection.responses['/web/searchview/fields_get'] = function () {
return {result: {fields: {
dummy: {type: 'char'}
dummy: {type: 'char', string: 'Dummy'}
}}};
};
@ -716,7 +716,7 @@ $(document).ready(function () {
var $fix = $('#qunit-fixture');
var view = makeSearchView({
get_domain: function (facet) {
equal(facet.get('category'), "dummy");
equal(facet.get('category'), "Dummy");
deepEqual(facet.values.toJSON(), [{label: "42", value: 42}]);
got_domain = true;
return null;
@ -1059,5 +1059,100 @@ $(document).ready(function () {
});
});
module('advanced', {
setup: function () {
instance = window.openerp.init([]);
window.openerp.web.corelib(instance);
window.openerp.web.coresetup(instance);
window.openerp.web.chrome(instance);
window.openerp.web.data(instance);
window.openerp.web.formats(instance);
window.openerp.web.search(instance);
instance.web.qweb.add_template(doc);
mockifyRPC(instance.connection);
}
});
asyncTest('single-advanced', 6, function () {
var view = makeSearchView();
var $fix = $('#qunit-fixture');
view.appendTo($fix)
.always(start)
.fail(function (error) { ok(false, error.message); })
.done(function () {
var $advanced = $fix.find('.oe_searchview_advanced');
// open advanced search (not actually useful)
$advanced.find('> h4').click();
// select proposition (only one)
var $prop = $advanced.find('> form li:first');
// field select should have two possible values, dummy and id
equal($prop.find('.searchview_extended_prop_field option').length,
2, "advanced search should provide choice between two fields");
// field should be dummy
equal($prop.find('.searchview_extended_prop_field').val(),
'dummy',
"only field should be dummy");
// operator should be "contains"/'ilike'
equal($prop.find('.searchview_extended_prop_op').val(),
'ilike', "default char operator should be ilike");
// put value in
$prop.find('.searchview_extended_prop_value input')
.val("stupid value");
// validate advanced search
$advanced.find('button.oe_apply').click();
// resulting search
equal(view.query.length, 1, "search query should have a single facet");
var facet = view.query.at(0);
ok(!facet.get('field').get_context(facet),
"advanced search facets should yield no context");
deepEqual(facet.get('field').get_domain(facet),
[['dummy', 'ilike', "stupid value"]],
"advanced search facet should return proposed domain");
});
});
asyncTest('multiple-advanced', 3, function () {
var view = makeSearchView();
var $fix = $('#qunit-fixture');
view.appendTo($fix)
.always(start)
.fail(function (error) { ok(false, error.message); })
.done(function () {
var $advanced = $fix.find('.oe_searchview_advanced');
// open advanced search (not actually useful)
$advanced.find('> h4').click();
// open second condition
$advanced.find('button.oe_add_condition').click();
// select first proposition
var $prop1 = $advanced.find('> form li:first');
$prop1.find('.searchview_extended_prop_field').val('dummy').change();
$prop1.find('.searchview_extended_prop_op').val('ilike');
$prop1.find('.searchview_extended_prop_value input')
.val("stupid value");
// select first proposition
var $prop2 = $advanced.find('> form li:last');
// need to trigger event manually or op not changed
$prop2.find('.searchview_extended_prop_field').val('id').change();
$prop2.find('.searchview_extended_prop_op').val('=');
$prop2.find('.searchview_extended_prop_value input')
.val(42);
// validate advanced search
$advanced.find('button.oe_apply').click();
// resulting search
equal(view.query.length, 1, "search query should have a single facet");
var facet = view.query.at(0);
ok(!facet.get('field').get_context(facet),
"advanced search facets should yield no context");
deepEqual(facet.get('field').get_domain(facet),
['|', ['dummy', 'ilike', "stupid value"],
['id', '=', 42]],
"advanced search facet should return proposed domain");
});
});
// TODO: UI tests?
});