summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-09-21 17:18:49 +0200
committerChristophe Simonis <chs@odoo.com>2017-09-21 17:18:49 +0200
commitbf4ccb21f6c9c8bcda9c6f94d844c89296523954 (patch)
treeddc505b2a40b8421c9555fb1670be5c17f24a893 /addons/web/static/src
parent6d373b109d574009ce9cfc9b350f5ab32987dde5 (diff)
parent88395bdb8e122c1d86dede7729c9e656ca5be8a5 (diff)
[MERGE] forward port branch saas-16 up to 88395bdb8e1
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/chrome/view_manager.js15
-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/form/form_renderer.js11
-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.js32
-rw-r--r--addons/web/static/src/js/widgets/date_picker.js11
7 files changed, 69 insertions, 23 deletions
diff --git a/addons/web/static/src/js/chrome/view_manager.js b/addons/web/static/src/js/chrome/view_manager.js
index dd50929537d..b13839ca4a2 100644
--- a/addons/web/static/src/js/chrome/view_manager.js
+++ b/addons/web/static/src/js/chrome/view_manager.js
@@ -292,12 +292,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
}).fail(view.loaded.reject.bind(view.loaded));
} else {
view.loaded = view.loaded.then(function() {
- // By default, the view will be loaded in readonly mode
- // Returns to this default mode if you load action from breadcrumb
view_options = _.extend({}, view_options, self.env);
- if (view_type === 'form') {
- view_options.mode = view_options.mode || 'readonly';
- }
return view.controller.reload(view_options);
});
}
@@ -382,8 +377,14 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
});
},
select_view: function (index) {
- var view_type = this.view_stack[index].type;
- return this.switch_mode(view_type);
+ var viewType = this.view_stack[index].type;
+ var viewOptions = {};
+ if (viewType === 'form') {
+ // reload form views in readonly, except for inline actions (i.e.
+ // settings views) that stay in edit
+ viewOptions.mode = this.action.target === 'inline' ? 'edit' : 'readonly';
+ }
+ return this.switch_mode(viewType, viewOptions);
},
/**
* Renders the switch buttons for multi- and mono-record views and adds
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 cf5a18488a6..103c0d4c5d2 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -768,7 +768,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) {
@@ -777,6 +777,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 e040a5fa7f0..09b264be0b5 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -273,18 +273,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;
},
/**
@@ -541,7 +541,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();
@@ -553,13 +553,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/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js
index 6b9949897ca..5c18d4246e8 100644
--- a/addons/web/static/src/js/views/form/form_renderer.js
+++ b/addons/web/static/src/js/views/form/form_renderer.js
@@ -12,6 +12,7 @@ var FormRenderer = BasicRenderer.extend({
className: "o_form_view",
events: _.extend({}, BasicRenderer.prototype.events, {
'click .o_notification_box .oe_field_translate': '_onTranslate',
+ 'click .oe_title, .o_group': '_onClick',
}),
/**
* @override
@@ -836,6 +837,16 @@ var FormRenderer = BasicRenderer.extend({
//--------------------------------------------------------------------------
/**
+ * Makes the Edit button bounce in readonly
+ *
+ * @private
+ */
+ _onClick: function () {
+ if (this.mode === 'readonly') {
+ this.trigger_up('bounce_edit');
+ }
+ },
+ /**
* @override
* @private
* @param {OdooEvent} ev
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 7984ebf21e1..6519fdfaec4 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
@@ -133,6 +133,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) {
@@ -141,8 +142,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
@@ -221,7 +234,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
@@ -231,14 +244,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);
@@ -667,6 +680,17 @@ ListRenderer.include({
}
},
/**
+ * Overrides to prevent from sorting if we are currently editing a record.
+ *
+ * @override
+ * @private
+ */
+ _onSortColumn: function () {
+ if (this.currentRow === null) {
+ this._super.apply(this, arguments);
+ }
+ },
+ /**
* Triggers a delete event. I don't know why we stop the propagation of the
* event.
*
diff --git a/addons/web/static/src/js/widgets/date_picker.js b/addons/web/static/src/js/widgets/date_picker.js
index 76281d9366a..b95a1c4f936 100644
--- a/addons/web/static/src/js/widgets/date_picker.js
+++ b/addons/web/static/src/js/widgets/date_picker.js
@@ -74,9 +74,16 @@ var DateWidget = Widget.extend({
* set datetime value
*/
changeDatetime: function () {
- if(this.isValid()) {
+ if (this.isValid()) {
+ var oldValue = this.getValue();
this._setValueFromUi();
- this.trigger("datetime_changed");
+ var newValue = this.getValue();
+
+ if (!oldValue !== !newValue || oldValue && newValue && !oldValue.isSame(newValue)) {
+ // The condition is strangely written; this is because the
+ // values can be false/undefined
+ this.trigger("datetime_changed");
+ }
}
},
/**