diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-10-02 16:44:17 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-10-02 16:44:17 +0200 |
| commit | 597ee1c58118bdba5238b4d25cd20467f73d02bd (patch) | |
| tree | f9d908ae30ae13010232e18f5eb2ff3e364fd172 /addons/web/static/src/js/views/basic | |
| parent | 1512c1b22993ba66a2cfff36bb92b8babca4cc95 (diff) | |
| parent | afaf7cc7ccf305fd06920512e82f17aca092c01d (diff) | |
[MERGE] forward port branch saas-18 up to afaf7cc7ccf
Diffstat (limited to 'addons/web/static/src/js/views/basic')
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_controller.js | 9 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_model.js | 34 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_renderer.js | 9 |
3 files changed, 43 insertions, 9 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js index 481fc0cf4dd..c899530de07 100644 --- a/addons/web/static/src/js/views/basic/basic_controller.js +++ b/addons/web/static/src/js/views/basic/basic_controller.js @@ -19,6 +19,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { custom_events: _.extend({}, AbstractController.prototype.custom_events, FieldManagerMixin.custom_events, { discard_changes: '_onDiscardChanges', reload: '_onReload', + set_dirty: '_onSetDirty', sidebar_data_asked: '_onSidebarDataAsked', translate: '_onTranslate', }), @@ -554,6 +555,14 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { } }, /** + * @private + * @param {OdooEvent} ev + */ + _onSetDirty: function (ev) { + ev.stopPropagation(); // prevent other controllers from handling this request + this.model.setDirty(ev.data.dataPointID); + }, + /** * Handler used to get all the data necessary when a custom action is * performed through the sidebar. * 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 d85f55ddf36..57c4a1f3743 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -948,6 +948,17 @@ var BasicModel = AbstractModel.extend({ record.fieldsInfo = _.defaults(record.fieldsInfo, viewInfo.fieldsInfo); }, /** + * Manually sets a resource as dirty. This is used to notify that a field + * has been modified, but with an invalid value. In that case, the value is + * not sent to the basic model, but the record should still be flagged as + * dirty so that it isn't discarded without any warning. + * + * @param {string} id a resource id + */ + setDirty: function (id) { + this.localData[id]._isDirty = true; + }, + /** * For list resources, this changes the orderedBy key. * * @param {string} list_id id for the list resource @@ -1235,7 +1246,7 @@ var BasicModel = AbstractModel.extend({ record._rawChanges[name] = val; return; } - var oldValue = record._changes[name] || record.data[name]; + var oldValue = name in record._changes ? record._changes[name] : record.data[name]; var id; if (field.type === 'many2one') { id = false; @@ -1689,6 +1700,9 @@ var BasicModel = AbstractModel.extend({ if ('invisible' in modifiers) { result.invisible = evalModifier(modifiers.invisible); } + if ('column_invisible' in modifiers) { + result.column_invisible = evalModifier(modifiers.column_invisible); + } if ('readonly' in modifiers) { result.readonly = evalModifier(modifiers.readonly); } @@ -2847,7 +2861,7 @@ var BasicModel = AbstractModel.extend({ _isFieldProtected: function (record, fieldName, viewType) { var fieldInfo = record.fieldsInfo[viewType || record.viewType][fieldName]; if (fieldInfo) { - var rawModifiers = JSON.parse(fieldInfo.modifiers || "{}"); + var rawModifiers = fieldInfo.modifiers || {}; var modifiers = this._evalModifiers(record, rawModifiers); return modifiers.readonly && !fieldInfo.force_save; } else { @@ -2899,7 +2913,7 @@ var BasicModel = AbstractModel.extend({ _.each(element.getFieldNames(), function (fieldName) { var field = element.fields[fieldName]; var fieldInfo = element.fieldsInfo[element.viewType][fieldName]; - var rawModifiers = JSON.parse(fieldInfo.modifiers || "{}"); + var rawModifiers = fieldInfo.modifiers || {}; var modifiers = self._evalModifiers(record, rawModifiers); if (modifiers.required && !self._isFieldSet(recordData[fieldName], field.type)) { isValid = false; @@ -3179,8 +3193,18 @@ var BasicModel = AbstractModel.extend({ } if (value[0] === 6) { // REPLACE_WITH - x2manyList.res_ids = value[2]; - x2manyList.count = x2manyList.res_ids.length; + _.each(value[2], function (res_id) { + r = self._makeDataPoint({ + modelName: x2manyList.model, + context: x2manyList.context, + fieldsInfo: fieldsInfo, + fields: fields, + parentID: x2manyList.id, + res_id: res_id, + viewType: viewType, + }); + x2manyList._changes.push({operation: 'ADD', id: r.id}); + }); var def = self._readUngroupedList(x2manyList).then(function () { return $.when( self._fetchX2ManysBatched(x2manyList), diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index 24922622a42..d335999582e 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -101,8 +101,9 @@ var BasicRenderer = AbstractRenderer.extend({ // which are configured to always be reset on any change var resetWidgets = []; _.each(this.allFieldWidgets[id], function (widget) { - if (_.contains(fields, widget.name) || widget.resetOnAnyFieldChange) { - defs.push(widget.reset(record, ev)); + var fieldChanged = _.contains(fields, widget.name); + if (fieldChanged || widget.resetOnAnyFieldChange) { + defs.push(widget.reset(record, ev, fieldChanged)); resetWidgets.push(widget); } }); @@ -127,7 +128,7 @@ var BasicRenderer = AbstractRenderer.extend({ this.editRecord(id); if (typeof offset === "number") { var field = _.findWhere(this.allFieldWidgets[id], {name: fieldName}); - dom.setCursor(field.getFocusableElement(), offset); + dom.setSelectionRange(field.getFocusableElement().get(0), {start: offset, end: offset}); } }, @@ -406,7 +407,7 @@ var BasicRenderer = AbstractRenderer.extend({ // If not, check the modifiers to see if it needs registration var modifiersData = this._getModifiersData(node); if (!modifiersData) { - var modifiers = JSON.parse(node.attrs.modifiers || "{}"); // FIXME parsed multiple times (record switching, no modifiers, ...) + var modifiers = node.attrs.modifiers || {}; modifiersData = { node: node, modifiers: modifiers, |
