From b84137c67f181b6324bf1b90fd828ef4b40a41ea Mon Sep 17 00:00:00 2001 From: Martin Geubelle Date: Fri, 28 Apr 2017 11:48:09 +0200 Subject: [PATCH] [FIX] web: Kanban: deal with `group_create` attribute This attribute is used to determine one can create a new column in the kanban view. Before this commit, it was always true and not specified in the controller `activeActions` (which was causing a bug where the no content helper was displayed instead of the column quick create). The controller was also always initiated with false so the column was only available after an update. --- .../src/js/views/kanban/kanban_controller.js | 32 ++++++--- .../static/src/js/views/kanban/kanban_view.js | 3 +- addons/web/static/tests/views/kanban_tests.js | 66 +++++++++++++++++++ 3 files changed, 90 insertions(+), 11 deletions(-) diff --git a/addons/web/static/src/js/views/kanban/kanban_controller.js b/addons/web/static/src/js/views/kanban/kanban_controller.js index 9bb728011e8..cbe31e5938f 100644 --- a/addons/web/static/src/js/views/kanban/kanban_controller.js +++ b/addons/web/static/src/js/views/kanban/kanban_controller.js @@ -40,8 +40,7 @@ var KanbanController = BasicController.extend({ this.on_create = params.on_create; this.hasButtons = params.hasButtons; - // true iff grouped by an m2o field and group_create action enabled - this.create_column_enabled = false; + this.createColumnEnabled = this._isCreateColumnEnabled(); }, //-------------------------------------------------------------------------- @@ -60,16 +59,12 @@ var KanbanController = BasicController.extend({ } }, /** - * Override update method to recompute create_column_enabled. + * Override update method to recompute createColumnEnabled. * * @returns {Deferred} */ update: function () { - var state = this.model.get(this.handle, {raw: true}); - var group_by_field = state.fields[state.groupedBy[0]]; - var grouped_by_m2o = group_by_field && (group_by_field.type === 'many2one'); - var groupCreate = this.is_action_enabled('group_create'); - this.create_column_enabled = grouped_by_m2o && groupCreate; + this.createColumnEnabled = this._isCreateColumnEnabled(); return this._super.apply(this, arguments); }, @@ -95,9 +90,26 @@ var KanbanController = BasicController.extend({ */ _hasContent: function (state) { return this._super.apply(this, arguments) || - this.create_column_enabled || + this.createColumnEnabled || (state.groupedBy.length && state.data.length); }, + /** + * The column quick create should be displayed in kanban iff grouped by an + * m2o field and group_create action enabled. + * + * @returns {Boolean} + */ + _isCreateColumnEnabled: function () { + var groupCreate = this.is_action_enabled('group_create'); + if (!groupCreate) { + // pre-return to avoid a lot of the following processing + return false; + } + var state = this.model.get(this.handle, {raw: true}); + var groupByField = state.fields[state.groupedBy[0]]; + var groupedByM2o = groupByField && (groupByField.type === 'many2one'); + return groupedByM2o; + }, /** * This method calls the server to ask for a resequence. Note that this * does not rerender the user interface, because in most case, the @@ -119,7 +131,7 @@ var KanbanController = BasicController.extend({ _updateButtons: function () { if (this.$buttons) { var data = this.model.get(this.handle, {raw: true}); - var create_muted = data.count === 0 && this.create_column_enabled; + var create_muted = data.count === 0 && this.createColumnEnabled; this.$buttons.find('.o-kanban-button-new') .toggleClass('btn-primary', !create_muted) .toggleClass('btn-default', create_muted); diff --git a/addons/web/static/src/js/views/kanban/kanban_view.js b/addons/web/static/src/js/views/kanban/kanban_view.js index 190647037d5..55a90e83242 100644 --- a/addons/web/static/src/js/views/kanban/kanban_view.js +++ b/addons/web/static/src/js/views/kanban/kanban_view.js @@ -34,6 +34,7 @@ var KanbanView = BasicView.extend({ var activeActions = this.controllerParams.activeActions; activeActions = _.extend(activeActions, { + group_create: arch.attrs.group_create ? JSON.parse(arch.attrs.group_create) : true, group_edit: arch.attrs.group_edit ? JSON.parse(arch.attrs.group_edit) : true, group_delete: arch.attrs.group_delete ? JSON.parse(arch.attrs.group_delete) : true, }); @@ -41,7 +42,7 @@ var KanbanView = BasicView.extend({ this.rendererParams.column_options = { editable: activeActions.group_edit, deletable: activeActions.group_delete, - group_creatable: true, + group_creatable: activeActions.group_create, quick_create: params.isQuickCreateEnabled || this._isQuickCreateEnabled(viewInfo), }; this.rendererParams.record_options = { diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js index d804ab35d71..8141d8c8f79 100644 --- a/addons/web/static/tests/views/kanban_tests.js +++ b/addons/web/static/tests/views/kanban_tests.js @@ -913,6 +913,72 @@ QUnit.module('Views', { kanban.destroy(); }); + QUnit.test('no nocontent helper for grouped kanban with no records', function (assert) { + assert.expect(4); + + this.data.partner.records = []; + + var kanban = createView({ + View: KanbanView, + model: 'partner', + data: this.data, + arch: '' + + '' + + '
' + + '
' + + '
', + groupBy: ['product_id'], + viewOptions: { + action: { + help: "No content helper", + }, + }, + }); + + assert.strictEqual(kanban.$('.o_kanban_group').length, 0, + "there should be no columns"); + assert.strictEqual(kanban.$('.o_kanban_record').length, 0, + "there should be no records"); + assert.strictEqual(kanban.$('.oe_view_nocontent').length, 0, + "there should be no nocontent helper"); + assert.strictEqual(kanban.$('.o_column_quick_create').length, 1, + "there should be a column quick create"); + kanban.destroy(); + }); + + QUnit.test('nocontent helper for grouped kanban with no records with no group_create', function (assert) { + assert.expect(4); + + this.data.partner.records = []; + + var kanban = createView({ + View: KanbanView, + model: 'partner', + data: this.data, + arch: '' + + '' + + '
' + + '
' + + '
', + groupBy: ['product_id'], + viewOptions: { + action: { + help: "No content helper", + }, + }, + }); + + assert.strictEqual(kanban.$('.o_kanban_group').length, 0, + "there should be no columns"); + assert.strictEqual(kanban.$('.o_kanban_record').length, 0, + "there should be no records"); + assert.strictEqual(kanban.$('.oe_view_nocontent').length, 1, + "there should be a nocontent helper"); + assert.strictEqual(kanban.$('.o_column_quick_create').length, 0, + "there should not be a column quick create"); + kanban.destroy(); + }); + QUnit.test('buttons with modifiers', function (assert) { assert.expect(2);