diff options
Diffstat (limited to 'addons/web/static/src/js/views')
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_controller.js | 89 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_view.js | 1 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/list/list_renderer.js | 36 |
3 files changed, 116 insertions, 10 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js index e76aec046e8..fc9cd1c7f2f 100644 --- a/addons/web/static/src/js/views/basic/basic_controller.js +++ b/addons/web/static/src/js/views/basic/basic_controller.js @@ -21,6 +21,8 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { reload: '_onReload', resequence_records: '_onResequenceRecords', set_dirty: '_onSetDirty', + load_optional_fields: '_onLoadOptionalFields', + save_optional_fields: '_onSaveOptionalFields', sidebar_data_asked: '_onSidebarDataAsked', translate: '_onTranslate', }), @@ -43,6 +45,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { // operations to complete before checking if there are changes to // discard when discardChanges is called this.savingDef = Promise.resolve(); + this.viewId = params.viewId; }, /** * @override @@ -419,6 +422,49 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { }); }, /** + * Compute the optional fields local storage key using the given parts. + * + * @param {Object} keyParts + * @param {string} keyParts.viewType view type + * @param {string} [keyParts.relationalField] name of the field with subview + * @param {integer} [keyParts.subViewId] subview id + * @param {string} [keyParts.subViewType] type of the subview + * @param {Object} keyParts.fields fields + * @param {string} keyParts.fields.name field name + * @param {string} keyParts.fields.type field type + * @returns {string} local storage key for optional fields in this view + * @private + */ + _getOptionalFieldsLocalStorageKey: function (keyParts) { + keyParts.model = this.modelName; + keyParts.viewType = this.viewType; + keyParts.viewId = this.viewId; + + var parts = [ + 'model', + 'viewType', + 'viewId', + 'relationalField', + 'subViewType', + 'subViewId', + ]; + + var viewIdentifier = parts.reduce(function (identifier, partName) { + if (partName in keyParts) { + return identifier + ',' + keyParts[partName]; + } + return identifier; + }, 'optional_fields'); + + viewIdentifier = + keyParts.fields.sort(this._nameSortComparer) + .reduce(function (identifier, field) { + return identifier + ',' + field.name; + }, viewIdentifier); + + return viewIdentifier; + }, + /** * Return the params (current_min, limit and size) to pass to the pager, * according to the current state. * @@ -458,6 +504,16 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { return true; }, /** + * Sort function used to sort the fields by names, to compute the optional fields keys + * + * @param {Object} left + * @param {Object} right + * @private + */ + _nameSortComparer: function(left, right) { + return left.name < right.name ? -1 : 1; + }, + /** * Helper function to display a warning that some fields have an invalid * value. This is used when a save operation cannot be completed. * @@ -676,6 +732,39 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { }); }, /** + * Load the optional columns settings in local storage for this view + * + * @param {OdooEvent} ev + * @param {Object} ev.data.keyParts see _getLocalStorageKey + * @param {function} ev.data.callback function to call with the result + * @private + */ + _onLoadOptionalFields: function (ev) { + var res = this.call( + 'local_storage', + 'getItem', + this._getOptionalFieldsLocalStorageKey(ev.data.keyParts) + ); + ev.data.callback(res); + }, + /** + * Save the optional columns settings in local storage for this view + * + * @param {OdooEvent} ev + * @param {Object} ev.data.keyParts see _getLocalStorageKey + * @param {Array<string>} ev.data.optionalColumnsEnabled list of optional + * field names that have been enabled + * @private + */ + _onSaveOptionalFields: function (ev) { + this.call( + 'local_storage', + 'setItem', + this._getOptionalFieldsLocalStorageKey(ev.data.keyParts), + ev.data.optionalColumnsEnabled + ); + }, + /** * @private * @param {OdooEvent} ev */ diff --git a/addons/web/static/src/js/views/basic/basic_view.js b/addons/web/static/src/js/views/basic/basic_view.js index 008bbcf8775..428378d69ab 100644 --- a/addons/web/static/src/js/views/basic/basic_view.js +++ b/addons/web/static/src/js/views/basic/basic_view.js @@ -48,6 +48,7 @@ var BasicView = AbstractView.extend({ this.controllerParams.archiveEnabled = 'active' in this.fields; this.controllerParams.hasButtons = 'action_buttons' in params ? params.action_buttons : true; + this.controllerParams.viewId = viewInfo.view_id; this.loadParams.fieldsInfo = this.fieldsInfo; this.loadParams.fields = this.fields; diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index f7efaab1798..2a8e44df4a2 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -69,7 +69,16 @@ var ListRenderer = BasicRenderer.extend({ this.editable = params.editable; this.isGrouped = this.state.groupedBy.length > 0; this.groupbys = params.groupbys; + }, + /** + * Compute columns visilibity. This can't be done earlier as we need the + * controller to respond to the load_optional_fields call of processColumns. + * + * @override + */ + willStart: function() { this._processColumns(this.columnInvisibleFields || {}); + return this._super.apply(this, arguments); }, //-------------------------------------------------------------------------- @@ -240,14 +249,13 @@ var ListRenderer = BasicRenderer.extend({ * @private * @returns {string} */ - _getOptionalColumnsStorageKey: function () { + _getOptionalColumnsStorageKeyParts: function () { var self = this; - var fields = []; - _.each(this.state.fieldsInfo[this.viewType], function (field, name) { - fields.push(name + ":" + self.state.fields[name].type); - }); - fields.sort(); - return "list_optional_fields," + this.state.model + "," + this.viewType + "," + fields.join(','); + return { + fields: _.map(this.state.fieldsInfo[this.viewType], function (_, fieldName) { + return {name: fieldName, type: self.state.fields[fieldName].type}; + }), + } }, /** * Removes the columns which should be invisible. @@ -260,8 +268,13 @@ var ListRenderer = BasicRenderer.extend({ this.columns = []; this.optionalColumns = []; this.optionalColumnsEnabled = []; - var localStorageKey = this._getOptionalColumnsStorageKey(); - var storedOptionalColumns = this.call('local_storage', 'getItem', localStorageKey); + var storedOptionalColumns; + this.trigger_up('load_optional_fields', { + keyParts: this._getOptionalColumnsStorageKeyParts(), + callback: function(res) { + storedOptionalColumns = res; + }, + }); _.each(this.arch.children, function (c) { if (c.tag !== 'control' && c.tag !== 'groupby') { var reject = c.attrs.modifiers.column_invisible; @@ -1030,7 +1043,10 @@ var ListRenderer = BasicRenderer.extend({ } else { this.optionalColumnsEnabled.push(input.name); } - this.call('local_storage', 'setItem', this._getOptionalColumnsStorageKey(), this.optionalColumnsEnabled); + this.trigger_up('save_optional_fields', { + keyParts: this._getOptionalColumnsStorageKeyParts(), + optionalColumnsEnabled: this.optionalColumnsEnabled, + }); this._processColumns(this.columnInvisibleFields || {}); this._renderView().then(function() { self._onToggleOptionalColumnDropdown(ev); |
