diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-04-24 17:42:41 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-04-24 17:42:41 +0200 |
| commit | b192431aeecc59b48898ce9c6f276b82d65cbfa6 (patch) | |
| tree | 598ec468eac64914858e24d2235827d905692c80 /addons/web/static/src | |
| parent | ddf601d44367a791848da38df9cff02b3e32b95b (diff) | |
| parent | ec5e27bb7cc7808d7128eae4e7e67910f40492c0 (diff) | |
[MERGE] forward port branch saas-11.3 up to ec5e27bb7cc
Diffstat (limited to 'addons/web/static/src')
5 files changed, 35 insertions, 9 deletions
diff --git a/addons/web/static/src/js/chrome/action_manager_act_window.js b/addons/web/static/src/js/chrome/action_manager_act_window.js index 0ed909e2512..e040096f60b 100644 --- a/addons/web/static/src/js/chrome/action_manager_act_window.js +++ b/addons/web/static/src/js/chrome/action_manager_act_window.js @@ -615,7 +615,14 @@ ActionManager.include({ }; var controllerDef = action.controllers[viewType]; - if (!controllerDef) { + if (!controllerDef || controllerDef.state() === 'rejected') { + // if the controllerDef is rejected, it probably means that the js + // code or the requests made to the server crashed. In that case, + // if we reuse the same deferred, then the switch to the view is + // definitely blocked. We want to use a new controller, even though + // it is very likely that it will recrash again. At least, it will + // give more feedback to the user, and it could happen that one + // record crashes, but not another. controllerDef = newController(); } else { controllerDef = controllerDef.then(function (controller) { diff --git a/addons/web/static/src/js/fields/field_registry.js b/addons/web/static/src/js/fields/field_registry.js index 53a12fc8944..135243398fe 100644 --- a/addons/web/static/src/js/fields/field_registry.js +++ b/addons/web/static/src/js/fields/field_registry.js @@ -26,6 +26,7 @@ registry .add('datetime', basic_fields.FieldDateTime) .add('domain', basic_fields.FieldDomain) .add('text', basic_fields.FieldText) + .add('html', basic_fields.FieldText) .add('float', basic_fields.FieldFloat) .add('char', basic_fields.FieldChar) .add('link_button', basic_fields.LinkButton) 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 45d698cd75b..ec0fad66a06 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -358,6 +358,7 @@ var BasicModel = AbstractModel.extend({ var element = this.localData[id]; var isNew = this.isNew(id); var rollback = 'rollback' in options ? options.rollback : isNew; + var initialOffset = element.offset; this._visitChildren(element, function (elem) { if (rollback && elem._savePoint) { if (elem._savePoint instanceof Array) { @@ -376,6 +377,7 @@ var BasicModel = AbstractModel.extend({ delete elem.tempLimitIncrement; } }); + element.offset = initialOffset; }, /** * Duplicate a record (by calling the 'copy' route) @@ -3667,7 +3669,7 @@ var BasicModel = AbstractModel.extend({ r._changes[fieldName] = rec.id; many2ones[fieldName] = true; } else if (_.contains(['one2many', 'many2many'], fieldType)) { - var x2mCommands = commands[0][2][fieldName]; + var x2mCommands = value[2][fieldName]; defs.push(self._processX2ManyCommands(r, fieldName, x2mCommands)); } else { r._changes[fieldName] = self._parseServerValue(field, r._changes[fieldName]); diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js index b847d7ca391..240beb9f1dc 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -559,6 +559,7 @@ return AbstractModel.extend({ }); var fs = []; + var undefined_fs = []; _.each(events, function (event) { var data = event.record[fieldName]; if (!_.contains(['many2many', 'one2many'], field.type)) { @@ -568,15 +569,18 @@ return AbstractModel.extend({ } _.each(data, function (_value) { var value = _.isArray(_value) ? _value[0] : _value; - fs.push({ + var f = { 'color_index': self.model_color === (field.relation || element.model) ? value : false, 'value': value, - 'label': fieldUtils.format[field.type](_value, field), + 'label': fieldUtils.format[field.type](_value, field) || _t("Undefined"), 'avatar_model': field.relation || element.model, - }); + }; + // if field used as color does not have value then push filter in undefined_fs, + // such filters should come last in filter list with Undefined string, later merge it with fs + value ? fs.push(f) : undefined_fs.push(f); }); }); - _.each(fs, function (f) { + _.each(_.union(fs, undefined_fs), function (f) { var f1 = _.findWhere(filter.filters, f); if (f1) { f1.display = true; diff --git a/addons/web/static/src/js/views/kanban/kanban_controller.js b/addons/web/static/src/js/views/kanban/kanban_controller.js index 5e8bcbf963f..986fff3a53e 100644 --- a/addons/web/static/src/js/views/kanban/kanban_controller.js +++ b/addons/web/static/src/js/views/kanban/kanban_controller.js @@ -79,6 +79,16 @@ var KanbanController = BasicController.extend({ return this.renderer.updateRecord(this.model.get(id)); }, /** + * @param {number[]} ids + * @private + * @returns {Deferred} + */ + _resequenceColumns: function (ids) { + var state = this.model.get(this.handle, {raw: true}); + var model = state.fields[state.groupedBy[0]].relation; + return this.model.resequence(model, ids, this.handle); + }, + /** * This method calls the server to ask for a resequence. Note that this * does not rerender the user interface, because in most case, the * resequencing operation has already been displayed by the renderer. @@ -134,6 +144,10 @@ var KanbanController = BasicController.extend({ _onAddColumn: function (event) { var self = this; this.model.createGroup(event.data.value, this.handle).then(function () { + var state = self.model.get(self.handle, {raw: true}); + var ids = _.pluck(state.data, 'res_id').filter(_.isNumber); + return self._resequenceColumns(ids); + }).then(function () { return self.update({}, {reload: false}); }).then(function () { self._updateButtons(); @@ -396,9 +410,7 @@ var KanbanController = BasicController.extend({ */ _onResequenceColumn: function (event) { var self = this; - var state = this.model.get(this.handle, {raw: true}); - var model = state.fields[state.groupedBy[0]].relation; - this.model.resequence(model, event.data.ids, this.handle).then(function () { + this._resequenceColumns(event.data.ids).then(function () { self._updateEnv(); }); }, |
