summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/views/basic')
-rw-r--r--addons/web/static/src/js/views/basic/basic_controller.js2
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js57
2 files changed, 42 insertions, 17 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 c4dff8fad2e..2ddadfb0027 100644
--- a/addons/web/static/src/js/views/basic/basic_controller.js
+++ b/addons/web/static/src/js/views/basic/basic_controller.js
@@ -514,7 +514,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, {
// TODO this will tell the renderer to rerender the widget that
// asked for the discard but will unfortunately lose the click
// made on another row if any
- self._confirmChange(self.handle, [ev.data.fieldName], ev)
+ self._confirmChange(recordID, [ev.data.fieldName], ev)
.always(ev.data.onSuccess);
})
.fail(ev.data.onFailure);
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 f0d41f31f49..977674c022a 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -30,6 +30,7 @@ var BasicRenderer = AbstractRenderer.extend({
this.activeActions = params.activeActions;
this.viewType = params.viewType;
this.mode = params.mode || 'readonly';
+ this.widgets = [];
},
/**
* This method has two responsabilities: find every invalid fields in the
@@ -95,6 +96,9 @@ var BasicRenderer = AbstractRenderer.extend({
return this._render().then(_.constant([]));
}
+ // reset all widgets (from the <widget> tag) if any:
+ _.invoke(this.widgets, 'updateState', state);
+
var defs = [];
// Reset all the field widgets that are marked as changed and the ones
@@ -254,7 +258,10 @@ var BasicRenderer = AbstractRenderer.extend({
if ('readonly' in modifiers && element.widget) {
var mode = modifiers.readonly ? 'readonly' : modifiersData.baseMode;
if (mode !== element.widget.mode) {
- self._rerenderFieldWidget(element.widget, record, mode);
+ self._rerenderFieldWidget(element.widget, record, {
+ keepBaseMode: true,
+ mode: mode,
+ });
return; // Rerendering already applied the modifiers, no need to go further
}
}
@@ -406,12 +413,25 @@ var BasicRenderer = AbstractRenderer.extend({
* @param {Object} record
* @param {jQuery|AbstractField} [element]
* @param {Object} [options]
- * @param {Object} [options.callback] - the callback to call on registration
- * and on modifiers updates
+ * @param {Object} [options.callback] the callback to call on registration
+ * and on modifiers updates
+ * @param {boolean} [options.keepBaseMode=false] this function registers the
+ * 'baseMode' of the node; this is a field widget specific settings which
+ * represents the generic mode of the widget, regardless of its modifiers
+ * (the interesting case is the list view: all widgets are supposed to be
+ * in the baseMode 'readonly', except the ones that are in the line that
+ * is currently being edited).
+ * With option 'keepBaseMode' set to true, the current baseMode of the
+ * node isn't overridden (this is particularily useful when a field widget
+ * is re-rendered because its readonly modifier changed, as in this case,
+ * we don't want to change its base mode).
+ * @param {string} [options.mode] the 'baseMode' of the node is set to this
+ * value (if not given, it is set to this.mode, the mode of the renderer)
* @returns {Object} for code efficiency, returns the last evaluated
- * modifiers for the given node and record.
+ * modifiers for the given node and record.
*/
_registerModifiers: function (node, record, element, options) {
+ options = options || {};
// Check if we already registered the modifiers for the given node
// If yes, this is simply an update of the related element
// If not, check the modifiers to see if it needs registration
@@ -428,12 +448,11 @@ var BasicRenderer = AbstractRenderer.extend({
this.allModifiersData.push(modifiersData);
}
}
- // we register here the base mode of the node. This is a field widget
- // specific settings which represents the generic mode for the widget,
- // regardless of its modifiers. The interesting case is the list view:
- // all widgets are supposed to be in the baseMode 'readonly', except the
- // ones that are in the line that is currently being edited.
- modifiersData.baseMode = (options && options.mode) || this.mode;
+
+ // Compute node's base mode if necessary
+ if (!options.keepBaseMode) {
+ modifiersData.baseMode = options.mode || this.mode;
+ }
// Evaluate if necessary
if (!modifiersData.evaluatedModifiers[record.id]) {
@@ -497,13 +516,16 @@ var BasicRenderer = AbstractRenderer.extend({
* @private
* @param {Object} node
* @param {Object} record
- * @param {Object} [options]
+ * @param {Object} [options] passed to @_registerModifiers
+ * @param {string} [options.mode] either 'edit' or 'readonly' (defaults to
+ * this.mode, the mode of the renderer)
* @returns {jQueryElement}
*/
_renderFieldWidget: function (node, record, options) {
+ options = options || {};
var fieldName = node.attrs.name;
// Register the node-associated modifiers
- var mode = options && options.mode || this.mode;
+ var mode = options.mode || this.mode;
var modifiers = this._registerModifiers(node, record, null, options);
// Initialize and register the widget
// Readonly status is known as the modifiers have just been registered
@@ -545,7 +567,8 @@ var BasicRenderer = AbstractRenderer.extend({
&& !element.widget.isSet()
));
},
- mode: mode
+ keepBaseMode: !!options.keepBaseMode,
+ mode: mode,
});
self._postProcessField(widget, node);
});
@@ -596,6 +619,8 @@ var BasicRenderer = AbstractRenderer.extend({
var Widget = widgetRegistry.get(node.attrs.name);
var widget = new Widget(this, record, node);
+ this.widgets.push(widget);
+
// Prepare widget rendering and save the related deferred
var def = widget._widgetRenderAndInsert(function () {});
if (def.state() === 'pending') {
@@ -616,11 +641,11 @@ var BasicRenderer = AbstractRenderer.extend({
* @private
* @param {Widget} widget
* @param {Object} record
- * @param {string} mode either 'readonly' or 'edit'
+ * @param {Object} [options] options passed to @_renderFieldWidget
*/
- _rerenderFieldWidget: function (widget, record, mode) {
+ _rerenderFieldWidget: function (widget, record, options) {
// Render the new field widget
- var $el = this._renderFieldWidget(widget.__node, record, {mode: mode});
+ var $el = this._renderFieldWidget(widget.__node, record, options);
widget.$el.replaceWith($el);
// Destroy the old widget and position the new one at the old one's