From 5225b75a934743053f0672d4d1cdf010890dfeee Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Wed, 14 Jul 2021 11:25:06 +0000 Subject: [PATCH] [IMP] web: search view for "Schedule activity" dialog Before this commit, click on "Schedule activity" in the activity view would open a dialog in which the search view is the default one on the current activity view model. With this commit, we make the dialog use the same search view as the activity view. Done to help with the task 2502339 closes odoo/odoo#73697 Signed-off-by: Aaron Bohy (aab) --- .../js/views/activity/activity_controller.js | 2 + .../src/js/views/activity/activity_view.js | 4 +- addons/mail/static/tests/activity_tests.js | 69 ++++++++++++++++++- .../src/legacy/js/views/view_dialogs.js | 3 +- 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/addons/mail/static/src/js/views/activity/activity_controller.js b/addons/mail/static/src/js/views/activity/activity_controller.js index 715f4fdb84b..26e2a8772c5 100644 --- a/addons/mail/static/src/js/views/activity/activity_controller.js +++ b/addons/mail/static/src/js/views/activity/activity_controller.js @@ -32,6 +32,7 @@ var ActivityController = BasicController.extend({ init: function (parent, model, renderer, params) { this._super.apply(this, arguments); this.title = params.title; + this.searchViewId = params.searchViewId; }, //-------------------------------------------------------------------------- @@ -59,6 +60,7 @@ var ActivityController = BasicController.extend({ var state = this.model.get(this.handle); new ViewDialogs.SelectCreateDialog(this, { res_model: state.model, + searchViewId: this.searchViewId, domain: this.model.originalDomain, title: _.str.sprintf(_t("Search: %s"), this.title), no_create: !this.activeActions.create, diff --git a/addons/mail/static/src/js/views/activity/activity_view.js b/addons/mail/static/src/js/views/activity/activity_view.js index 9a9df857166..44cab433c78 100644 --- a/addons/mail/static/src/js/views/activity/activity_view.js +++ b/addons/mail/static/src/js/views/activity/activity_view.js @@ -26,9 +26,11 @@ const ActivityView = BasicView.extend({ /** * @override */ - init: function () { + init: function (viewInfo, params) { this._super.apply(this, arguments); + const { search_view_id } = params.action || {}; + this.controllerParams.searchViewId = search_view_id ? search_view_id[0] : false; this.loadParams.type = 'list'; // limit makes no sense in this view as we display all records having activities this.loadParams.limit = false; diff --git a/addons/mail/static/tests/activity_tests.js b/addons/mail/static/tests/activity_tests.js index 57990a3c7b9..8ad4b152b08 100644 --- a/addons/mail/static/tests/activity_tests.js +++ b/addons/mail/static/tests/activity_tests.js @@ -7,9 +7,8 @@ import domUtils from 'web.dom'; import { legacyExtraNextTick, patchWithCleanup } from "@web/../tests/helpers/utils"; import { createWebClient, doAction } from "@web/../tests/webclient/helpers"; -import { patch, unpatch } from 'web.utils'; -import { registry } from "@web/core/registry"; import { session } from '@web/session'; +import { click } from "@web/../tests/helpers/utils"; let serverData; @@ -621,4 +620,70 @@ QUnit.test("Activity view: on_destroy_callback doesn't crash", async function (a activity.destroy(); }); +QUnit.test("Schedule activity dialog uses the same search view as activity view", async function (assert) { + assert.expect(8); + serverData.models.task.records = []; + serverData.views = { + "task,false,activity": ` + + +
+ +
+
+
+ `, + "task,false,list": ``, + "task,false,search": ``, + 'task,1,search': ``, + }; + + function mockRPC(route, args) { + if (args.method === "load_views") { + assert.step(JSON.stringify(args.kwargs.views)); + } + } + + const webClient = await createWebClient({ serverData, mockRPC, legacyParams: {withLegacyMockServer: true} }); + + // open an activity view (with default search arch) + await doAction(webClient, { + name: 'Dashboard', + res_model: 'task', + type: 'ir.actions.act_window', + views: [[false, 'activity']], + }); + + assert.verifySteps([ + '[[false,"activity"],[false,"search"]]', + ]) + + // click on "Schedule activity" + await click(webClient.el.querySelector(".o_activity_view .o_record_selector")); + + assert.verifySteps([ + '[[false,"list"],[false,"search"]]', + ]) + + // open an activity view (with search arch 1) + await doAction(webClient, { + name: 'Dashboard', + res_model: 'task', + type: 'ir.actions.act_window', + views: [[false, 'activity']], + search_view_id: [1,"search"], + }); + + assert.verifySteps([ + '[[false,"activity"],[1,"search"]]', + ]) + + // click on "Schedule activity" + await click(webClient.el.querySelector(".o_activity_view .o_record_selector")); + + assert.verifySteps([ + '[[false,"list"],[1,"search"]]', + ]) +}); + }); diff --git a/addons/web/static/src/legacy/js/views/view_dialogs.js b/addons/web/static/src/legacy/js/views/view_dialogs.js index 8b9c62b337b..41dcc85c14f 100644 --- a/addons/web/static/src/legacy/js/views/view_dialogs.js +++ b/addons/web/static/src/legacy/js/views/view_dialogs.js @@ -335,7 +335,8 @@ var SelectCreateDialog = ViewDialog.extend({ var _super = this._super.bind(this); var viewRefID = this.viewType === 'kanban' ? (this.options.kanban_view_ref && JSON.parse(this.options.kanban_view_ref) || false) : false; - return this.loadViews(this.res_model, this.context, [[viewRefID, this.viewType], [false, 'search']], {load_filters: true}) + const searchviewId = this.options.searchViewId || false; + return this.loadViews(this.res_model, this.context, [[viewRefID, this.viewType], [searchviewId, 'search']], {load_filters: true}) .then(this.setup.bind(this)) .then(function (fragment) { self.opened().then(function () {