diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js index acf81039dbf..98d169c11e2 100644 --- a/addons/board/static/src/js/dashboard.js +++ b/addons/board/static/src/js/dashboard.js @@ -279,25 +279,26 @@ FormRenderer.include({ children: [] }); } + + // register actions, alongside a generated unique ID + _.each(node.children, function (column, column_index) { + _.each(column.children, function (action, action_index) { + action.attrs.id = 'action_' + column_index + '_' + action_index; + self.actionsDescr[action.attrs.id] = action.attrs; + }); + }); + var $html = $('
').append($(QWeb.render('DashBoard', {node: node}))); // render each view - _.each(node.children, function (column, column_index) { - _.each(column.children, function (action, action_index) { - var attrs = action.attrs; - var domain = Domain.prototype.stringToArray(attrs.domain, {}); - var context = new Context(attrs.context); - var actionID = _.str.toNumber(attrs.name); - self.actionsDescr[actionID] = attrs; - var $node = $html.find('.oe_action[data-id=' + actionID + '] .oe_content'); - self.defs.push(self._createController({ - $node: $node, - actionID: actionID, - context: context, - domain: domain, - viewType: attrs.view_mode, - })); - }); + _.each(this.actionsDescr, function (action) { + self.defs.push(self._createController({ + $node: $html.find('.oe_action[data-id=' + action.id + '] .oe_content'), + actionID: _.str.toNumber(action.name), + context: new Context(action.context), + domain: Domain.prototype.stringToArray(action.domain, {}), + viewType: action.view_mode, + })); }); $html.find('.oe_dashboard_column').sortable({ connectWith: '.oe_dashboard_column', @@ -341,7 +342,7 @@ FormRenderer.include({ */ _onFoldClick: function (event) { var $e = $(event.currentTarget); - var $action = $e.parents('.oe_action:first'); + var $action = $e.closest('.oe_action'); var id = $action.data('id'); var actionAttrs = this.actionsDescr[id]; diff --git a/addons/board/static/src/less/dashboard.less b/addons/board/static/src/less/dashboard.less index 72131e2fa2e..6d34b160a5a 100644 --- a/addons/board/static/src/less/dashboard.less +++ b/addons/board/static/src/less/dashboard.less @@ -108,6 +108,9 @@ } .oe_content { padding: 0 12px 12px 12px; + &.oe_folded { + display: none; + } } // Override border of many2manytags defined for form_views diff --git a/addons/board/static/src/xml/board.xml b/addons/board/static/src/xml/board.xml index 1c40084d13c..13453a945f6 100644 --- a/addons/board/static/src/xml/board.xml +++ b/addons/board/static/src/xml/board.xml @@ -18,7 +18,7 @@ -
+

@@ -27,8 +27,7 @@

- -
+
diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js index d921cd56a67..1b55551fe2b 100644 --- a/addons/board/static/tests/dashboard_tests.js +++ b/addons/board/static/tests/dashboard_tests.js @@ -326,4 +326,55 @@ QUnit.test('can drag and drop a view', function (assert) { form.destroy(); }); +QUnit.test('twice the same action in a dashboard', function (assert) { + assert.expect(2); + + var form = createView({ + View: FormView, + model: 'board', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + mockRPC: function (route) { + if (route === '/board/static/src/img/layout_1-1-1.png') { + return $.when(); + } + if (route === '/web/action/load') { + return $.when({ + res_model: 'partner', + views: [[4, 'list'],[5, 'kanban']], + }); + } + if (route === '/web/view/add_custom') { + assert.step('add custom'); + return $.when(true); + } + return this._super.apply(this, arguments); + }, + archs: { + 'partner,4,list': + '', + 'partner,5,kanban': + '' + + '
' + + '
', + }, + }); + + var $firstAction = form.$('.oe_action:contains(ABC)'); + assert.strictEqual($firstAction.find('.o_list_view').length, 1, + "list view should be displayed in 'ABC' block"); + var $secondAction = form.$('.oe_action:contains(DEF)'); + assert.strictEqual($secondAction.find('.o_kanban_view').length, 1, + "kanban view should be displayed in 'DEF' block"); + + form.destroy(); +}); + });