diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index 4c1862365ca..6f02a8d9934 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -38,6 +38,18 @@ my.Facet = Backbone.Model.extend({
return Backbone.Model.prototype.set.call(this, key, value);
}
this.values.reset(value);
+ },
+ toJSON: function () {
+ var out = {};
+ var attrs = this.attributes;
+ for(var att in attrs) {
+ if (!attrs.hasOwnProperty(att) || att === 'field') {
+ continue;
+ }
+ out[att] = attrs[att];
+ }
+ out.values = this.values.toJSON();
+ return out;
}
});
my.SearchQuery = Backbone.Collection.extend({
@@ -215,7 +227,10 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
$.when(load_view, filters)
.pipe(function (load) { return load[0]; })
- .then(this.on_loaded);
+ .pipe(this.on_loaded)
+ .fail(function () {
+ self.ready.reject.apply(null, arguments);
+ });
}
this.$element.on('click', '.oe_searchview_unfold_drawer', function () {
diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js
index 7403afb5d0d..f53e4cd294a 100644
--- a/addons/web/static/test/search.js
+++ b/addons/web/static/test/search.js
@@ -1,4 +1,9 @@
$(document).ready(function () {
+ var xhr = QWeb2.Engine.prototype.get_xhr();
+ xhr.open('GET', '/web/static/src/xml/base.xml', false);
+ xhr.send(null);
+ var doc = xhr.responseXML;
+
var instance;
module('query', {
setup: function () {
@@ -140,4 +145,88 @@ $(document).ready(function () {
{label: 'V2', value: 1}
])
});
+
+ module('defaults', {
+ 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.search(instance);
+
+ instance.web.qweb.add_template(doc);
+
+ instance.connection.responses = {};
+ instance.connection.rpc_function = function (url, payload) {
+ if (!(url.url in this.responses)) {
+ return $.Deferred().reject(
+ {}, 'failed',
+ _.str.sprintf("Url %s not found in mock responses",
+ url.url)).promise();
+ }
+ return $.when(this.responses[url.url](payload));
+ };
+ }
+ });
+ asyncTest('defaults calling', 2, function () {
+ var defaults_called = false;
+
+ instance.web.search.fields.add(
+ 'dummy', 'instance.dummy.DummyWidget');
+ instance.dummy = {};
+ instance.dummy.DummyWidget = instance.web.search.Field.extend({
+ facet_for_defaults: function (defaults) {
+ defaults_called = true;
+ return $.when({
+ field: this,
+ category: 'Dummy',
+ values: [{label: 'dummy', value: defaults.dummy}]
+ });
+ }
+ });
+ instance.connection.responses['/web/searchview/load'] = function () {
+ return {result: {fields_view: {
+ type: 'search',
+ fields: {
+ dummy: {type: 'char'}
+ },
+ arch: {
+ tag: 'search',
+ attrs: {},
+ children: [{
+ tag: 'field',
+ attrs: {
+ name: 'dummy',
+ widget: 'dummy'
+ },
+ children: []
+ }]
+ }
+ }}};
+ };
+ instance.connection.responses['/web/searchview/get_filters'] = function () {
+ return [];
+ };
+ instance.connection.responses['/web/searchview/fields_get'] = function () {
+ return {result: {fields: {
+ dummy: {type: 'char'}
+ }}};
+ };
+
+ var dataset = {model: 'dummy.model', get_context: function () { return {}; }};
+ var view = new instance.web.SearchView(null, dataset, false, {dummy: 42});
+ view.appendTo($('#qunit-fixture'))
+ .always(start)
+ .then(function () {
+ ok(defaults_called, "should have called defaults");
+ deepEqual(
+ view.query.toJSON(),
+ [{category: 'Dummy', values: [{label: 'dummy', value: 42}]}],
+ "should have generated a facet with the default value");
+ }, function (error) {
+ ok(false, error.message);
+ });
+ });
+ // TODO: test defaults for various built-in widgets?
});
diff --git a/addons/web/static/test/test.html b/addons/web/static/test/test.html
index cc1916399f3..e352f63c17c 100644
--- a/addons/web/static/test/test.html
+++ b/addons/web/static/test/test.html
@@ -13,7 +13,7 @@
-
+