summaryrefslogtreecommitdiff
path: root/addons/web
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-11-16 12:40:36 +0100
committerChristophe Simonis <chs@odoo.com>2017-11-16 12:40:36 +0100
commita094f6318b556298ab73df7910a70bc2a6f6a54e (patch)
tree0c9282cf8c92ed72ca8514a1c650e7966ed54b59 /addons/web
parent6e8faf40bd1f63b8001aad11bca9ff749ca365c8 (diff)
parent745d00362ab8353bf88457b05f090c470f780ef5 (diff)
[MERGE] forward port branch saas-16 up to 745d00362ab
Diffstat (limited to 'addons/web')
-rw-r--r--addons/web/static/src/js/chrome/search_inputs.js2
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js6
-rw-r--r--addons/web/static/src/js/services/crash_manager.js2
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js1
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js59
-rw-r--r--addons/web/static/tests/helpers/mock_server.js17
-rw-r--r--addons/web/static/tests/views/list_tests.js38
-rw-r--r--addons/web/static/tests/views/view_dialogs_tests.js1
8 files changed, 122 insertions, 4 deletions
diff --git a/addons/web/static/src/js/chrome/search_inputs.js b/addons/web/static/src/js/chrome/search_inputs.js
index d734bb0ebf2..d567551873f 100644
--- a/addons/web/static/src/js/chrome/search_inputs.js
+++ b/addons/web/static/src/js/chrome/search_inputs.js
@@ -349,7 +349,7 @@ var DateField = Field.extend(/** @lends instance.web.search.DateField# */{
var t, v;
try {
t = (this.attrs && this.attrs.type === 'datetime') ? 'datetime' : 'date';
- v = field_utils.parse[t](needle, {type: t});
+ v = field_utils.parse[t](needle, {type: t}, {timezone: true});
} catch (e) {
return $.when(null);
}
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index e5a7cc3da2f..6f775e789d4 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -1257,9 +1257,13 @@ var FieldMany2Many = FieldX2Many.extend({
*
* @override
* @private
+ * @param {OdooEvent|MouseEvent} ev this event comes either from the 'Add
+ * record' link in the list editable renderer, or from the 'Create' button
+ * in the kanban view
*/
- _onAddRecord: function () {
+ _onAddRecord: function (ev) {
var self = this;
+ ev.stopPropagation();
var domain = this.record.getDomain({fieldName: this.name});
diff --git a/addons/web/static/src/js/services/crash_manager.js b/addons/web/static/src/js/services/crash_manager.js
index 3ce280c3aa8..9c7914eeebf 100644
--- a/addons/web/static/src/js/services/crash_manager.js
+++ b/addons/web/static/src/js/services/crash_manager.js
@@ -54,7 +54,7 @@ var CrashManager = core.Class.extend({
new (handler)(this, error).display();
return;
}
- if (error.data.name === "openerp.http.SessionExpiredException" || error.data.name === "werkzeug.exceptions.Forbidden") {
+ if (error.data.name === "odoo.http.SessionExpiredException" || error.data.name === "werkzeug.exceptions.Forbidden") {
this.show_warning({type: _t("Odoo Session Expired"), data: {message: _t("Your Odoo session expired. Please refresh the current web page.")}});
return;
}
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js
index 4028bff322a..4bd12bf2bc3 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -3458,6 +3458,7 @@ var BasicModel = AbstractModel.extend({
domain: list.domain,
context: list.context,
groupBy: list.groupedBy,
+ orderBy: list.orderedBy,
lazy: true,
})
.then(function (groups) {
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index 2e8499b31e1..aa8fa8e4d0c 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -5521,6 +5521,65 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('many2many list in a one2many opened by a many2one', function (assert) {
+ assert.expect(1);
+
+ this.data.turtle.records[1].turtle_trululu = 2;
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<field name="turtles">' +
+ '<tree editable="bottom">' +
+ '<field name="turtle_trululu"/>' +
+ '</tree>' +
+ '</field>' +
+ '</form>',
+ res_id: 1,
+ archs: {
+ "partner,false,form": '<form string="P">' +
+ '<field name="timmy"/>' +
+ '</form>',
+ "partner_type,false,list": '<tree editable="bottom">' +
+ '<field name="display_name"/>' +
+ '</tree>',
+ "partner_type,false,search": '<search>' +
+ '</search>',
+ },
+ viewOptions: {
+ mode: 'edit',
+ },
+ mockRPC: function (route, args) {
+ if (route === '/web/dataset/call_kw/partner/get_formview_id') {
+ return $.when(false);
+ }
+ if (args.method === 'write') {
+ assert.deepEqual(args.args[1].timmy, [[6, false, [12]]],
+ 'should properly write ids')
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ // edit the first partner in the one2many partner form view
+ form.$('.o_data_row:first td.o_data_cell').click();
+ // open form view for many2one
+ form.$('.o_external_button').click();
+
+ // click on add, to add a new partner in the m2m
+ $('.modal .o_field_x2many_list_row_add a').click();
+
+ // select the partner_type 'gold' (this closes the 2nd modal)
+ $('.modal td:contains(gold)').click();
+
+ // confirm the changes in the modal
+ $('.modal .modal-footer .btn-primary').click();
+
+ form.$buttons.find('.o_form_button_save').click();
+ form.destroy();
+ });
+
QUnit.test('one2many (who contains display_name) with tree view and without form view', function (assert) {
assert.expect(1);
diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js
index 3556fb946aa..b9d0fc50dd9 100644
--- a/addons/web/static/tests/helpers/mock_server.js
+++ b/addons/web/static/tests/helpers/mock_server.js
@@ -707,6 +707,23 @@ var MockServer = Class.extend({
return res;
});
+
+ if (kwargs.orderby) {
+ // only consider first sorting level
+ kwargs.orderby = kwargs.orderby.split(',')[0];
+ var fieldName = kwargs.orderby.split(' ')[0];
+ var order = kwargs.orderby.split(' ')[1];
+ result.sort(function (g1, g2) {
+ if (g1[fieldName] < g2[fieldName]) {
+ return order === 'ASC' ? -1 : 1;
+ }
+ if (g1[fieldName] > g2[fieldName]) {
+ return order === 'ASC' ? 1 : -1;
+ }
+ return 0;
+ });
+ }
+
return result;
},
/**
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 242eb2f62d6..1e4c332291f 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -637,6 +637,42 @@ QUnit.module('Views', {
list.destroy();
});
+ QUnit.test('groups can be sorted on aggregates', function (assert) {
+ assert.expect(10);
+
+ var list = createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ groupBy: ['foo'],
+ arch: '<tree editable="bottom"><field name="int_field" sum="Sum"/></tree>',
+ mockRPC: function (route, args) {
+ if (args.method === 'read_group') {
+ assert.step(args.kwargs.orderby || 'default order');
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ assert.strictEqual(list.$('tbody .o_list_number').text(), '10517',
+ "initial order should be 10, 5, 17");
+ assert.strictEqual(list.$('tfoot td:nth(2)').text(), '32', "total should be 32");
+
+ list.$('.o_column_sortable').click(); // sort (int_field ASC)
+ assert.strictEqual(list.$('tfoot td:nth(2)').text(), '32', "total should still be 32");
+ assert.strictEqual(list.$('tbody .o_list_number').text(), '51017',
+ "order should be 5, 10, 17");
+
+ list.$('.o_column_sortable').click(); // sort (int_field DESC)
+ assert.strictEqual(list.$('tbody .o_list_number').text(), '17105',
+ "initial order should be 17, 10, 5");
+ assert.strictEqual(list.$('tfoot td:nth(2)').text(), '32', "total should still be 32");
+
+ assert.verifySteps(['default order', 'int_field ASC', 'int_field DESC']);
+
+ list.destroy();
+ });
+
QUnit.test('properly apply onchange in simple case', function (assert) {
assert.expect(2);
@@ -1695,7 +1731,7 @@ QUnit.module('Views', {
// close first level group
nbRPCs = {readGroup: 0, searchRead: 0};
envIDs = []; // the group being closed, there is no more record in the environment
- list.$('.o_group_header:first').click();
+ list.$('.o_group_header:nth(1)').click();
assert.strictEqual(nbRPCs.readGroup, 0, "should have done no read_group");
assert.strictEqual(nbRPCs.searchRead, 0, "should have done no search_read");
diff --git a/addons/web/static/tests/views/view_dialogs_tests.js b/addons/web/static/tests/views/view_dialogs_tests.js
index 30ab2b8274e..1d99d5b1cb7 100644
--- a/addons/web/static/tests/views/view_dialogs_tests.js
+++ b/addons/web/static/tests/views/view_dialogs_tests.js
@@ -95,6 +95,7 @@ QUnit.module('Views', {
domain: [["display_name","like","a"], ["display_name","ilike","piou"], ["foo","ilike","piou"]],
fields:["display_name","foo","bar"],
groupby:["bar"],
+ orderby: '',
lazy: true
}, "should search with the complete domain (domain + search), and group by 'bar'");
}