summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-10-02 16:44:17 +0200
committerChristophe Simonis <chs@odoo.com>2017-10-02 16:44:17 +0200
commit597ee1c58118bdba5238b4d25cd20467f73d02bd (patch)
treef9d908ae30ae13010232e18f5eb2ff3e364fd172 /addons/web/static/src/js/views/basic
parent1512c1b22993ba66a2cfff36bb92b8babca4cc95 (diff)
parentafaf7cc7ccf305fd06920512e82f17aca092c01d (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.js9
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js34
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js9
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,