diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-01-25 17:38:41 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-01-25 17:38:41 +0100 |
| commit | 88a87240a6aac348053ebd5fda8a2f551b1f2cd3 (patch) | |
| tree | 6fad54cedceeef44f853980f43f7109dc33d6949 /addons/web | |
| parent | ccdbc16efc82449ac78a8069806dc6a44da3bcf8 (diff) | |
| parent | 8613724bfcc21edf56757d4f9a901b629c2e82fb (diff) | |
[MERGE] forward port branch saas-11.1 up to 8613724bfcc
Diffstat (limited to 'addons/web')
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_model.js | 203 | ||||
| -rw-r--r-- | addons/web/static/src/js/widgets/debug_manager.js | 4 | ||||
| -rw-r--r-- | addons/web/static/src/less/kanban_view.less | 4 | ||||
| -rw-r--r-- | addons/web/static/tests/fields/relational_fields_tests.js | 32 |
4 files changed, 154 insertions, 89 deletions
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 57ef031a146..40de07ce638 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -3238,92 +3238,7 @@ var BasicModel = AbstractModel.extend({ defs.push(self._fetchNameGet(dp)); record._changes[name] = dp.id; } else if (field.type === 'one2many' || field.type === 'many2many') { - var fieldInfo = record.fieldsInfo[record.viewType][name]; - var view = fieldInfo.views && fieldInfo.views[fieldInfo.mode]; - var fieldsInfo = view ? view.fieldsInfo : fieldInfo.fieldsInfo; - var fields = view ? view.fields : fieldInfo.relatedFields; - var viewType = view ? view.type : fieldInfo.viewType; - - var x2manyList = self._makeDataPoint({ - context: record.context, - fieldsInfo: fieldsInfo, - fields: fields, - limit: fieldInfo.limit, - modelName: field.relation, - parentID: record.id, - rawContext: fieldInfo && fieldInfo.context, - relationField: field.relation_field, - res_ids: [], - static: true, - type: 'list', - viewType: viewType, - }); - record._changes[name] = x2manyList.id; - x2manyList._changes = []; - var many2ones = {}; - var r; - result[name] = result[name] || []; // handle false value - var isCommandList = result[name].length && _.isArray(result[name][0]); - if (!isCommandList) { - result[name] = [[6, false, result[name]]]; - } - _.each(result[name], function (value) { - // value is a command - if (value[0] === 0) { - // CREATE - r = self._makeDataPoint({ - modelName: x2manyList.model, - context: x2manyList.context, - fieldsInfo: fieldsInfo, - fields: fields, - parentID: x2manyList.id, - viewType: viewType, - }); - x2manyList._changes.push({operation: 'ADD', id: r.id}); - x2manyList._cache[r.res_id] = r.id; - - // this is necessary so the fields are initialized - _.each(r.getFieldNames(), function (fieldName) { - r.data[fieldName] = null; - }); - - r._changes = _.defaults(value[2], r.data); - for (var name in r._changes) { - if (!r._changes[name]) { - continue; - } - var isFieldInView = name in r.fields; - if (isFieldInView && r.fields[name].type === 'many2one') { - var rec = self._makeDataPoint({ - context: r.context, - modelName: r.fields[name].relation, - data: {id: r._changes[name]}, - parentID: r.id, - }); - r._changes[name] = rec.id; - many2ones[name] = true; - } - } - } - if (value[0] === 6) { - // REPLACE_WITH - _.each(value[2], function (res_id) { - x2manyList._changes.push({operation: 'ADD', resID: res_id}); - }); - var def = self._readUngroupedList(x2manyList).then(function () { - return $.when( - self._fetchX2ManysBatched(x2manyList), - self._fetchReferencesBatched(x2manyList) - ); - }); - defs.push(def); - } - }); - - // fetch many2ones display_name - _.each(_.keys(many2ones), function (name) { - defs.push(self._fetchNameGets(x2manyList, name)); - }); + defs.push(self._processX2ManyCommands(record, name, result[name])); } else { record._changes[name] = self._parseServerValue(field, result[name]); } @@ -3498,6 +3413,122 @@ var BasicModel = AbstractModel.extend({ }); }, /** + * Process x2many commands in a default record by transforming the list of + * commands in operations (pushed in _changes) and fetch the related + * records fields. + * + * Note that this method can be called recursively. + * + * @todo in master: factorize this code with the postprocessing of x2many in + * _applyOnChange + * + * @private + * @param {Object} record + * @param {string} fieldName + * @param {Array[Array]} commands + * @returns {Deferred} + */ + _processX2ManyCommands: function (record, fieldName, commands) { + var self = this; + var defs = []; + var field = record.fields[fieldName]; + var fieldInfo = record.fieldsInfo[record.viewType][fieldName]; + var view = fieldInfo.views && fieldInfo.views[fieldInfo.mode]; + var fieldsInfo = view ? view.fieldsInfo : fieldInfo.fieldsInfo; + var fields = view ? view.fields : fieldInfo.relatedFields; + var viewType = view ? view.type : fieldInfo.viewType; + + var x2manyList = self._makeDataPoint({ + context: record.context, + fieldsInfo: fieldsInfo, + fields: fields, + limit: fieldInfo.limit, + modelName: field.relation, + parentID: record.id, + rawContext: fieldInfo && fieldInfo.context, + relationField: field.relation_field, + res_ids: [], + static: true, + type: 'list', + viewType: viewType, + }); + record._changes[fieldName] = x2manyList.id; + x2manyList._changes = []; + var many2ones = {}; + var r; + commands = commands || []; // handle false value + var isCommandList = commands.length && _.isArray(commands[0]); + if (!isCommandList) { + commands = [[6, false, commands]]; + } + _.each(commands, function (value) { + // value is a command + if (value[0] === 0) { + // CREATE + r = self._makeDataPoint({ + modelName: x2manyList.model, + context: x2manyList.context, + fieldsInfo: fieldsInfo, + fields: fields, + parentID: x2manyList.id, + viewType: viewType, + }); + x2manyList._changes.push({operation: 'ADD', id: r.id}); + x2manyList._cache[r.res_id] = r.id; + + // this is necessary so the fields are initialized + _.each(r.getFieldNames(), function (fieldName) { + r.data[fieldName] = null; + }); + + r._changes = _.defaults(value[2], r.data); + for (var fieldName in r._changes) { + if (!r._changes[fieldName]) { + continue; + } + var isFieldInView = fieldName in r.fields; + if (isFieldInView) { + var field = r.fields[fieldName]; + var fieldType = field.type; + if (fieldType === 'many2one') { + var rec = self._makeDataPoint({ + context: r.context, + modelName: field.relation, + data: {id: r._changes[fieldName]}, + parentID: r.id, + }); + r._changes[fieldName] = rec.id; + many2ones[fieldName] = true; + } else if (_.contains(['one2many', 'many2many'], fieldType)) { + var x2mCommands = commands[0][2][fieldName]; + defs.push(self._processX2ManyCommands(r, fieldName, x2mCommands)); + } + } + } + } + if (value[0] === 6) { + // REPLACE_WITH + _.each(value[2], function (res_id) { + x2manyList._changes.push({operation: 'ADD', resID: res_id}); + }); + var def = self._readUngroupedList(x2manyList).then(function () { + return $.when( + self._fetchX2ManysBatched(x2manyList), + self._fetchReferencesBatched(x2manyList) + ); + }); + defs.push(def); + } + }); + + // fetch many2ones display_name + _.each(_.keys(many2ones), function (name) { + defs.push(self._fetchNameGets(x2manyList, name)); + }); + + return $.when.apply($, defs); + }, + /** * Reads data from server for all missing fields. * * @private diff --git a/addons/web/static/src/js/widgets/debug_manager.js b/addons/web/static/src/js/widgets/debug_manager.js index 50e0497b91b..ffe65a7efcf 100644 --- a/addons/web/static/src/js/widgets/debug_manager.js +++ b/addons/web/static/src/js/widgets/debug_manager.js @@ -463,7 +463,7 @@ DebugManager.include({ $defaults.parent().addClass('o_form_invalid'); return; } - var allUsers = d.$el.find('#formview_default_all').is(':checked'); + var selfUser = d.$el.find('#formview_default_self').is(':checked'); var condition = d.$el.find('#formview_default_conditions').val(); var value = _.find(self.fields, function (field) { return field.name === fieldToSet; @@ -475,7 +475,7 @@ DebugManager.include({ self._controller.fields_view.model, fieldToSet, value, - allUsers, + selfUser, true, condition || false, ], diff --git a/addons/web/static/src/less/kanban_view.less b/addons/web/static/src/less/kanban_view.less index 8e31f176e81..9158aa22df6 100644 --- a/addons/web/static/src/less/kanban_view.less +++ b/addons/web/static/src/less/kanban_view.less @@ -208,7 +208,9 @@ .o_kanban_record_headings { line-height: 1.2; .o-flex(1, 1, auto); - + // Ensure long word doesn't break out of container + word-wrap: break-word; + overflow: hidden; } } diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index d87b060579d..b30f70757e0 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -6207,6 +6207,38 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('nested x2many default values', function (assert) { + assert.expect(2); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<field name="turtles">' + + '<tree editable="top">' + + '<field name="partner_ids" widget="many2many_tags"/>' + + '</tree>' + + '</field>' + + '</form>', + mockRPC: function (route, args) { + if (args.model === 'partner' && args.method === 'default_get') { + return $.when({turtles: [[0, 0, { + partner_ids: [[6, 0, [4]]], + }]]}); + } + return this._super.apply(this, arguments); + }, + }); + + assert.strictEqual(form.$('.o_list_view .o_field_many2manytags[name="partner_ids"] .badge').length, 1, + "m2mtags should contain one tag"); + assert.strictEqual(form.$('.o_list_view .o_field_many2manytags[name="partner_ids"] .o_badge_text').text(), + 'aaa', "tag name should have been correctly loaded"); + + form.destroy(); + }); + QUnit.test('one2many (who contains display_name) with tree view and without form view', function (assert) { assert.expect(1); |
