diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-11-16 12:40:36 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-11-16 12:40:36 +0100 |
| commit | a094f6318b556298ab73df7910a70bc2a6f6a54e (patch) | |
| tree | 0c9282cf8c92ed72ca8514a1c650e7966ed54b59 /addons/web | |
| parent | 6e8faf40bd1f63b8001aad11bca9ff749ca365c8 (diff) | |
| parent | 745d00362ab8353bf88457b05f090c470f780ef5 (diff) | |
[MERGE] forward port branch saas-16 up to 745d00362ab
Diffstat (limited to 'addons/web')
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'"); } |
