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_model.js31
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js47
2 files changed, 43 insertions, 35 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 c16f635a604..39f1be0d107 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -1495,7 +1495,8 @@ var BasicModel = AbstractModel.extend({
def = this._rpc({
model: list.model,
method: 'read',
- args: [_.pluck(data, 'id'), fieldNames]
+ args: [_.pluck(data, 'id'), fieldNames],
+ context: record.context,
}).then(function (records) {
_.each(records, function (record) {
list_records[record.id].data = record;
@@ -1743,22 +1744,21 @@ var BasicModel = AbstractModel.extend({
/**
* Fetch all name_gets for the many2ones in a group
*
- * @param {Object} group a valid resource object
+ * @param {Object[]} groups a list of object with context and record sub keys
* @returns {Deferred}
*/
- _fetchMany2OneGroup: function (group) {
- var ids = _.uniq(_.pluck(group, 'res_id'));
-
+ _fetchMany2OneGroup: function (groups) {
+ var ids = _.uniq(_.pluck(_.pluck(groups, 'record'), 'res_id'));
return this._rpc({
- model: group[0].model,
+ model: groups[0].record.model,
method: 'name_get',
args: [ids],
- context: group[0].context
+ context: groups[0].context
})
.then(function (name_gets) {
- _.each(group, function (record) {
- var nameGet = _.find(name_gets, function (n) { return n[0] === record.res_id;});
- record.data.display_name = nameGet[1];
+ _.each(groups, function (obj) {
+ var nameGet = _.find(name_gets, function (n) { return n[0] === obj.record.res_id;});
+ obj.record.data.display_name = nameGet[1];
});
});
},
@@ -2019,14 +2019,17 @@ var BasicModel = AbstractModel.extend({
if (!relatedRecord) {
return;
}
- toBeFetched.push(relatedRecord);
+ toBeFetched.push({
+ context: record.getContext({fieldName: name, viewType: record.viewType}),
+ record: relatedRecord
+ });
}
});
// group them by model and context. Using the context as key is
// necessary to make sure the correct context is used for the rpc;
- var groups = _.groupBy(toBeFetched, function (rec) {
- return [rec.model, JSON.stringify(rec.context)].join();
+ var groups = _.groupBy(toBeFetched, function (elem) {
+ return [elem.record.model, JSON.stringify(elem.context)].join();
});
return $.when.apply($, _.map(groups, this._fetchMany2OneGroup.bind(this)));
@@ -2416,7 +2419,7 @@ var BasicModel = AbstractModel.extend({
model: field.relation,
method: 'read',
args: [ids, fieldNames],
- context: {}, // FIXME
+ context: list.getContext() || {},
});
} else {
def = $.when(_.map(ids, function (id) {
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 a6d5172bfe1..042d85d414a 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -251,13 +251,12 @@ var BasicRenderer = AbstractRenderer.extend({
function _apply(element) {
// If the view is in edit mode and that a widget have to switch
// its "readonly" state, we have to re-render it completely
- if ('readonly' in modifiers
- && self.mode === "edit"
- && element.widget
- && (element.widget.mode === 'readonly') !== modifiers.readonly)
- {
- self._rerenderFieldWidget(element.widget, record);
- return; // Rerendering already applied the modifiers, no need to go further
+ if ('readonly' in modifiers && element.widget) {
+ var mode = modifiers.readonly ? 'readonly' : modifiersData.baseMode;
+ if (mode !== element.widget.mode) {
+ self._rerenderFieldWidget(element.widget, record, mode);
+ return; // Rerendering already applied the modifiers, no need to go further
+ }
}
// Toggle modifiers CSS classes if necessary
@@ -429,6 +428,12 @@ 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;
// Evaluate if necessary
if (!modifiersData.evaluatedModifiers[record.id]) {
@@ -454,7 +459,7 @@ var BasicRenderer = AbstractRenderer.extend({
}
modifiersData.elementsByRecord[record.id].push(newElement);
- this._applyModifiers(modifiersData, record, newElement);
+ this._applyModifiers(modifiersData, record, newElement, options);
}
return modifiersData.evaluatedModifiers[record.id];
@@ -493,22 +498,20 @@ var BasicRenderer = AbstractRenderer.extend({
* @param {Object} node
* @param {Object} record
* @param {Object} [options]
- * @param {Object} [modifiersOptions]
* @returns {jQueryElement}
*/
- _renderFieldWidget: function (node, record, options, modifiersOptions) {
+ _renderFieldWidget: function (node, record, options) {
var fieldName = node.attrs.name;
-
// Register the node-associated modifiers
- var modifiers = this._registerModifiers(node, record);
-
+ var mode = options && 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
var Widget = record.fieldsInfo[this.viewType][fieldName].Widget;
- var widget = new Widget(this, fieldName, record, _.extend({
- mode: modifiers.readonly ? 'readonly' : this.mode,
+ var widget = new Widget(this, fieldName, record, {
+ mode: modifiers.readonly ? 'readonly' : mode,
viewType: this.viewType,
- }, options || {}));
+ });
// Register the widget so that it can easily be found again
if (this.allFieldWidgets[record.id] === undefined) {
@@ -534,15 +537,16 @@ var BasicRenderer = AbstractRenderer.extend({
if (async) {
$el.replaceWith(widget.$el);
}
- self._registerModifiers(node, record, widget, _.extend({
+ self._registerModifiers(node, record, widget, {
callback: function (element, modifiers, record) {
element.$el.toggleClass('o_field_empty', !!(
record.data.id
- && (modifiers.readonly || self.mode === 'readonly')
+ && (modifiers.readonly || mode === 'readonly')
&& !element.widget.isSet()
));
},
- }, modifiersOptions || {}));
+ mode: mode
+ });
self._postProcessField(widget, node);
});
@@ -610,10 +614,11 @@ var BasicRenderer = AbstractRenderer.extend({
* @private
* @param {Widget} widget
* @param {Object} record
+ * @param {string} mode either 'readonly' or 'edit'
*/
- _rerenderFieldWidget: function (widget, record) {
+ _rerenderFieldWidget: function (widget, record, mode) {
// Render the new field widget
- var $el = this._renderFieldWidget(widget.__node, record);
+ var $el = this._renderFieldWidget(widget.__node, record, {mode: mode});
widget.$el.replaceWith($el);
// Destroy the old widget and position the new one at the old one's