diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-09-21 17:18:49 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-09-21 17:18:49 +0200 |
| commit | bf4ccb21f6c9c8bcda9c6f94d844c89296523954 (patch) | |
| tree | ddc505b2a40b8421c9555fb1670be5c17f24a893 /addons/web/static/src | |
| parent | 6d373b109d574009ce9cfc9b350f5ab32987dde5 (diff) | |
| parent | 88395bdb8e122c1d86dede7729c9e656ca5be8a5 (diff) | |
[MERGE] forward port branch saas-16 up to 88395bdb8e1
Diffstat (limited to 'addons/web/static/src')
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"); + } } }, /** |
