summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2017-09-20 14:45:23 +0200
committerGéry Debongnie <ged@odoo.com>2017-09-21 10:55:09 +0200
commita8bc2a8bf8211085e1553e720d12d110b234a499 (patch)
tree0e7853d6f2c3e19733d03552e0a525e6a697b017 /addons/web/static/src
parent332eb431c5d215c87c0915677dc72f8688897646 (diff)
[FIX] web: several minor issues with editable list
- correctly update the pager when a record is added or removed - destroy the widgets of the removed row when the user clicks on 'Cancel' when creating a new record - ensure that the list always contains 4 rows (before this rev., in list views with less than 4 records, if the user created a new record, then clicked on 'Discard', there were only 3 rows left - properly destroy field widgets when removed from the DOM Note that the change of parent.parentID to parent.static is not a bug fix, but it's better to use the key that indicates the type of list element, instead of implying it from other attributes.
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js3
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js18
-rw-r--r--addons/web/static/src/js/views/list/list_controller.js2
-rw-r--r--addons/web/static/src/js/views/list/list_editable_renderer.js21
4 files changed, 30 insertions, 14 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 965237e1df1..276fd4df82b 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -769,7 +769,7 @@ var BasicModel = AbstractModel.extend({
removeLine: function (elementID) {
var record = this.localData[elementID];
var parent = this.localData[record.parentID];
- if (parent.parentID) {
+ if (parent.static) {
// x2Many case: the new record has been stored in _changes, as a
// command so we remove the command(s) related to that record
parent._changes = _.filter(parent._changes, function (change) {
@@ -778,6 +778,7 @@ var BasicModel = AbstractModel.extend({
} else {
// main list view case: the new record is in data
parent.data = _.without(parent.data, elementID);
+ parent.count--;
}
},
/**
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 ee6e685c3d4..24922622a42 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -288,18 +288,18 @@ var BasicRenderer = AbstractRenderer.extend({
* from internal referencing.
*
* @private
- * @param {Object} record
+ * @param {string} recordID id of the local resource
* @param {AbstractField} widget
* @returns {integer} the index of the removed widget
*/
- _destroyFieldWidget: function (record, widget) {
- var recordWidgets = this.allFieldWidgets[record.id];
+ _destroyFieldWidget: function (recordID, widget) {
+ var recordWidgets = this.allFieldWidgets[recordID];
var index = recordWidgets.indexOf(widget);
if (index >= 0) {
recordWidgets.splice(index, 1);
}
- this._unregisterModifiersElement(widget.__node, record, widget);
- widget.$el.destroy();
+ this._unregisterModifiersElement(widget.__node, recordID, widget);
+ widget.destroy();
return index;
},
/**
@@ -594,7 +594,7 @@ var BasicRenderer = AbstractRenderer.extend({
widget.$el.replaceWith(newWidget.$el);
// Destroy the old widget and position the new one at the old one's
- var oldIndex = this._destroyFieldWidget(record, widget);
+ var oldIndex = this._destroyFieldWidget(record.id, widget);
var recordWidgets = this.allFieldWidgets[record.id];
recordWidgets.splice(oldIndex, 0, newWidget);
recordWidgets.pop();
@@ -606,13 +606,13 @@ var BasicRenderer = AbstractRenderer.extend({
* node and record.
*
* @param {Object} node
- * @param {Object} record
+ * @param {string} recordID id of the local resource
* @param {jQuery|AbstractField} element
*/
- _unregisterModifiersElement: function (node, record, element) {
+ _unregisterModifiersElement: function (node, recordID, element) {
var modifiersData = this._getModifiersData(node);
if (modifiersData) {
- var elements = modifiersData.elementsByRecord[record.id];
+ var elements = modifiersData.elementsByRecord[recordID];
var index = _.findIndex(elements, function (oldElement) {
return oldElement.widget === element
|| oldElement.$el[0] === element[0];
diff --git a/addons/web/static/src/js/views/list/list_controller.js b/addons/web/static/src/js/views/list/list_controller.js
index 7222d792c69..460ad5de100 100644
--- a/addons/web/static/src/js/views/list/list_controller.js
+++ b/addons/web/static/src/js/views/list/list_controller.js
@@ -182,6 +182,7 @@ var ListController = BasicController.extend({
if ((recordID || this.handle) !== this.handle) {
var state = this.model.get(this.handle);
this.renderer.removeLine(state, recordID);
+ this._updatePager();
}
},
/**
@@ -202,6 +203,7 @@ var ListController = BasicController.extend({
var state = self.model.get(self.handle);
self.renderer.updateState(state, {});
self.renderer.editRecord(recordID);
+ self._updatePager();
}).always(this._enableButtons.bind(this));
},
/**
diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js
index 8379ab3a891..31d8154f3c1 100644
--- a/addons/web/static/src/js/views/list/list_editable_renderer.js
+++ b/addons/web/static/src/js/views/list/list_editable_renderer.js
@@ -186,6 +186,7 @@ ListRenderer.include({
* @param {string} recordID
*/
removeLine: function (state, recordID) {
+ var self = this;
var rowIndex = _.findIndex(this.state.data, {id: recordID});
this.state = state;
if (rowIndex === -1) {
@@ -194,8 +195,20 @@ ListRenderer.include({
if (rowIndex === this.currentRow) {
this.currentRow = null;
}
+
+ // remove the row
var $row = this.$('.o_data_row:nth(' + rowIndex + ')');
- $row.remove();
+ if (this.state.count >= 4) {
+ $row.remove();
+ } else {
+ $row.replaceWith(this._renderEmptyRow());
+ }
+
+ // destroy the removed row's widgets
+ var widgetsToDestroy = this.allFieldWidgets[recordID].slice();
+ _.each(widgetsToDestroy, function (widget) {
+ self._destroyFieldWidget(recordID, widget);
+ });
},
/**
* Updates the already rendered row associated to the given recordID so that
@@ -274,7 +287,7 @@ ListRenderer.include({
// destroyed. This is not the case for simple buttons so we have to
// do it here.
if ($td.hasClass('o_list_button')) {
- self._unregisterModifiersElement(node, record, $td.children());
+ self._unregisterModifiersElement(node, recordID, $td.children());
}
// For edit mode we only replace the content of the cell with its
@@ -284,14 +297,14 @@ ListRenderer.include({
if (editMode) {
$td.empty().append($newTd.contents());
} else {
- self._unregisterModifiersElement(node, record, $td);
+ self._unregisterModifiersElement(node, recordID, $td);
$td.replaceWith($newTd);
}
});
delete this.defs;
// Destroy old field widgets
- _.each(oldWidgets, this._destroyFieldWidget.bind(this, record));
+ _.each(oldWidgets, this._destroyFieldWidget.bind(this, recordID));
// Toggle selected class here so that style is applied at the end
$row.toggleClass('o_selected_row', editMode);