diff --git a/web_widget_x2many_2d_matrix/README.rst b/web_widget_x2many_2d_matrix/README.rst
index 44f5920c..52b2f3cf 100644
--- a/web_widget_x2many_2d_matrix/README.rst
+++ b/web_widget_x2many_2d_matrix/README.rst
@@ -146,6 +146,8 @@ Known issues / Roadmap
will enter into the 1st cell until https://github.com/odoo/odoo/pull/26490
is merged.
+* Support extra invisible fields inside each cell.
+
Bug Tracker
===========
diff --git a/web_widget_x2many_2d_matrix/static/src/js/2d_matrix_renderer.js b/web_widget_x2many_2d_matrix/static/src/js/2d_matrix_renderer.js
index dcbc44ad..d3c98afa 100644
--- a/web_widget_x2many_2d_matrix/static/src/js/2d_matrix_renderer.js
+++ b/web_widget_x2many_2d_matrix/static/src/js/2d_matrix_renderer.js
@@ -180,22 +180,22 @@ odoo.define('web_widget_x2many_2d_matrix.X2Many2dMatrixRenderer', function (requ
* the aggregate cell.
*
* @private
- * @param {Object} row: The row that will be rendered.
+ * @param {Object} row The row that will be rendered.
* @returns {jQueryElement} the
element that has been rendered.
*/
_renderRow: function (row) {
- var self = this;
- var $tr = $('
', {class: 'o_data_row'});
- $tr = $tr.append(self._renderLabelCell(row.data[0]));
+ var $tr = $('
', {class: 'o_data_row'}),
+ _data = _.without(row.data, undefined);
+ $tr = $tr.append(this._renderLabelCell(_data[0]));
var $cells = _.map(this.columns, function (node, index) {
var record = row.data[index];
// Make the widget use our field value for each cell
- node.attrs.name = self.matrix_data.field_value;
- return self._renderBodyCell(record, node, index, {mode:''});
- });
+ node.attrs.name = this.matrix_data.field_value;
+ return this._renderBodyCell(record, node, index, {mode:''});
+ }.bind(this));
$tr = $tr.append($cells);
if (row.aggregate) {
- $tr.append(self._renderAggregateRowCell(row));
+ $tr.append(this._renderAggregateRowCell(row));
}
return $tr;
},
@@ -223,7 +223,7 @@ odoo.define('web_widget_x2many_2d_matrix.X2Many2dMatrixRenderer', function (requ
* Create a cell and fill it with the aggregate value.
*
* @private
- * @param {Object} row: the row object to aggregate.
+ * @param {Object} row the row object to aggregate.
* @returns {jQueryElement} The rendered cell.
*/
_renderAggregateRowCell: function (row) {
@@ -238,10 +238,10 @@ odoo.define('web_widget_x2many_2d_matrix.X2Many2dMatrixRenderer', function (requ
* we always want the widget to be editable.
*
* @private
- * @param {Object} record: Contains the data for this cell
- * @param {jQueryElement} node: The HTML of the field.
- * @param {int} colIndex: The index of the current column.
- * @param {Object} options: The obtions used for the widget
+ * @param {Object} record Contains the data for this cell
+ * @param {jQueryElement} node The HTML of the field.
+ * @param {int} colIndex The index of the current column.
+ * @param {Object} options The obtions used for the widget
* @returns {jQueryElement} the rendered cell.
*/
_renderBodyCell: function (record, node, colIndex, options) {
@@ -263,6 +263,12 @@ odoo.define('web_widget_x2many_2d_matrix.X2Many2dMatrixRenderer', function (requ
// the user might want to attach to each single cell.
var $td = $('', {
'class': tdClassName,
+ });
+ if (_.isUndefined(record)) {
+ // Without record, nothing elese to do
+ return $td;
+ }
+ $td.attr({
'data-form-id': record.id,
'data-id': record.data.id,
});
@@ -348,7 +354,12 @@ odoo.define('web_widget_x2many_2d_matrix.X2Many2dMatrixRenderer', function (requ
value: 0,
};
_.each(this.rows, function (row) {
- column.aggregate.value += row.data[index].data[fname];
+ // TODO Use only one _.propertyOf in underscore 1.9.0+
+ try {
+ column.aggregate.value += row.data[index].data[fname];
+ } catch (error) {
+ // Nothing to do
+ }
});
}.bind(this));
},
@@ -419,7 +430,12 @@ odoo.define('web_widget_x2many_2d_matrix.X2Many2dMatrixRenderer', function (requ
value: 0,
};
_.each(row.data, function (col) {
- row.aggregate.value += col.data[fname];
+ // TODO Use _.property in underscore 1.9+
+ try {
+ row.aggregate.value += col.data[fname];
+ } catch (error) {
+ // Nothing to do
+ }
});
});
},
@@ -490,10 +506,11 @@ odoo.define('web_widget_x2many_2d_matrix.X2Many2dMatrixRenderer', function (requ
* @param {String} id: The id of the row that needs to be updated.
*/
_updateRow: function (id) {
- var record = _.findWhere(this.state.data, {id: id});
+ var record = _.findWhere(this.state.data, {id: id}),
+ _id = _.property("id");
_.each(this.rows, function (row) {
_.each(row.data, function (col, i) {
- if (col.id === id) {
+ if (_id(col) === id) {
row.data[i] = record;
}
});
diff --git a/web_widget_x2many_2d_matrix/static/src/js/widget_x2many_2d_matrix.js b/web_widget_x2many_2d_matrix/static/src/js/widget_x2many_2d_matrix.js
index 638c080a..addf7cd4 100644
--- a/web_widget_x2many_2d_matrix/static/src/js/widget_x2many_2d_matrix.js
+++ b/web_widget_x2many_2d_matrix/static/src/js/widget_x2many_2d_matrix.js
@@ -16,9 +16,9 @@ odoo.define('web_widget_x2many_2d_matrix.widget', function (require) {
widget_class: 'o_form_field_x2many_2d_matrix',
/**
- *Initialize the widget & parameters.
+ * Initialize the widget & parameters.
*
- *@param {Object} parent contains the form view.
+ * @param {Object} parent contains the form view.
* @param {String} name the name of the field.
* @param {Object} record information about the database records.
* @param {Object} options view options.
@@ -29,7 +29,7 @@ odoo.define('web_widget_x2many_2d_matrix.widget', function (require) {
},
/**
- *Initialize the widget specific parameters.
+ * Initialize the widget specific parameters.
* Sets the axis and the values.
*/
init_params: function () {
@@ -195,7 +195,12 @@ odoo.define('web_widget_x2many_2d_matrix.widget', function (require) {
*/
activate: function (options) {
// Won't work fine without https://github.com/odoo/odoo/pull/26490
- this._backwards = options.event.data.direction === "previous";
+ // TODO Use _.propertyOf in underscore 1.9+
+ try {
+ this._backwards = options.event.data.direction === "previous";
+ } catch (error) {
+ this._backwards = false;
+ }
var result = this._super.apply(this, arguments);
delete this._backwards;
return result;
|