[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.
This commit is contained in:
Martin Geubelle
2017-05-04 11:58:26 +02:00
parent 0bc70b64a9
commit b84137c67f
3 changed files with 90 additions and 11 deletions
@@ -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);
@@ -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 = {
@@ -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: '<kanban>' +
'<templates><t t-name="kanban-box">' +
'<div><field name="foo"/></div>' +
'</t></templates>' +
'</kanban>',
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: '<kanban group_create="false">' +
'<templates><t t-name="kanban-box">' +
'<div><field name="foo"/></div>' +
'</t></templates>' +
'</kanban>',
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);