diff --git a/addons/purchase/__manifest__.py b/addons/purchase/__manifest__.py index accc4449a88..31243b81fa4 100644 --- a/addons/purchase/__manifest__.py +++ b/addons/purchase/__manifest__.py @@ -39,7 +39,8 @@ 'assets': { 'web.assets_backend': [ 'purchase/static/src/toaster_button/*', - 'purchase/static/src/js/purchase_dashboard.js', + 'purchase/static/src/views/*.js', + 'purchase/static/src/views/*.scss', 'purchase/static/src/js/purchase_toaster_button.js', 'purchase/static/src/js/tours/purchase.js', ], @@ -48,8 +49,7 @@ 'purchase/static/src/js/purchase_portal_sidebar.js', ], 'web.assets_qweb': [ - 'purchase/static/src/toaster_button/*.xml', - 'purchase/static/src/xml/**/*', + 'purchase/static/src/**/*.xml', ], }, 'license': 'LGPL-3', diff --git a/addons/purchase/static/src/js/purchase_dashboard.js b/addons/purchase/static/src/js/purchase_dashboard.js deleted file mode 100644 index 4b305028b64..00000000000 --- a/addons/purchase/static/src/js/purchase_dashboard.js +++ /dev/null @@ -1,280 +0,0 @@ -odoo.define('purchase.dashboard', function (require) { -"use strict"; - -/** - * This file defines the Purchase Dashboard view (alongside its renderer, model - * and controller). This Dashboard is added to the top of list and kanban Purchase - * views, it extends both views with essentially the same code except for - * _onDashboardActionClicked function so we can apply filters without changing our - * current view. - */ - -var core = require('web.core'); -var ListController = require('web.ListController'); -var ListModel = require('web.ListModel'); -var ListRenderer = require('web.ListRenderer'); -var ListView = require('web.ListView'); -var KanbanController = require('web.KanbanController'); -var KanbanModel = require('web.KanbanModel'); -var KanbanRenderer = require('web.KanbanRenderer'); -var KanbanView = require('web.KanbanView'); -var SampleServer = require('web.SampleServer'); -var view_registry = require('web.view_registry'); -const session = require('web.session'); - -var QWeb = core.qweb; - -// Add mock of method 'retrieve_dashboard' in SampleServer, so that we can have -// the sample data in empty purchase kanban and list view -let dashboardValues; -SampleServer.mockRegistry.add('purchase.order/retrieve_dashboard', () => { - return Object.assign({}, dashboardValues); -}); - - -//-------------------------------------------------------------------------- -// List View -//-------------------------------------------------------------------------- - -var PurchaseListDashboardRenderer = ListRenderer.extend({ - events:_.extend({}, ListRenderer.prototype.events, { - 'click .o_dashboard_action': '_onDashboardActionClicked', - }), - /** - * @override - * @private - * @returns {Promise} - */ - _renderView: function () { - var self = this; - return this._super.apply(this, arguments).then(function () { - var values = self.state.dashboardValues; - var purchase_dashboard = QWeb.render('purchase.PurchaseDashboard', { - values: values, - }); - self.$el.prepend(purchase_dashboard); - }); - }, - - /** - * @private - * @param {MouseEvent} - */ - _onDashboardActionClicked: function (e) { - e.preventDefault(); - var $action = $(e.currentTarget); - this.trigger_up('dashboard_open_action', { - action_name: "purchase.purchase_action_dashboard_list", - action_context: $action.attr('context'), - }); - }, -}); - -var PurchaseListDashboardModel = ListModel.extend({ - /** - * @override - */ - init: function () { - this.dashboardValues = {}; - this._super.apply(this, arguments); - }, - - /** - * @override - */ - __get: function (localID) { - var result = this._super.apply(this, arguments); - if (_.isObject(result)) { - result.dashboardValues = this.dashboardValues[localID]; - } - return result; - }, - /** - * @override - * @returns {Promise} - */ - __load: function () { - return this._loadDashboard(this._super.apply(this, arguments)); - }, - /** - * @override - * @returns {Promise} - */ - __reload: function () { - return this._loadDashboard(this._super.apply(this, arguments)); - }, - - /** - * @private - * @param {Promise} super_def a promise that resolves with a dataPoint id - * @returns {Promise -> string} resolves to the dataPoint id - */ - _loadDashboard: function (super_def) { - var self = this; - var dashboard_def = this._rpc({ - model: 'purchase.order', - method: 'retrieve_dashboard', - context: session.user_context, - }); - return Promise.all([super_def, dashboard_def]).then(function(results) { - var id = results[0]; - dashboardValues = results[1]; - self.dashboardValues[id] = dashboardValues; - return id; - }); - }, -}); - -var PurchaseListDashboardController = ListController.extend({ - custom_events: _.extend({}, ListController.prototype.custom_events, { - dashboard_open_action: '_onDashboardOpenAction', - }), - - /** - * @private - * @param {OdooEvent} e - */ - _onDashboardOpenAction: function (e) { - return this.do_action(e.data.action_name, - {additional_context: JSON.parse(e.data.action_context)}); - }, -}); - -var PurchaseListDashboardView = ListView.extend({ - config: _.extend({}, ListView.prototype.config, { - Model: PurchaseListDashboardModel, - Renderer: PurchaseListDashboardRenderer, - Controller: PurchaseListDashboardController, - }), -}); - -//-------------------------------------------------------------------------- -// Kanban View -//-------------------------------------------------------------------------- - -var PurchaseKanbanDashboardRenderer = KanbanRenderer.extend({ - events:_.extend({}, KanbanRenderer.prototype.events, { - 'click .o_dashboard_action': '_onDashboardActionClicked', - }), - /** - * @override - * @private - * @returns {Promise} - */ - _render: function () { - var self = this; - return this._super.apply(this, arguments).then(function () { - var values = self.state.dashboardValues; - var purchase_dashboard = QWeb.render('purchase.PurchaseDashboard', { - values: values, - }); - self.$el.parent().find(".o_purchase_dashboard").remove(); - self.$el.before(purchase_dashboard); - }); - }, - - /** - * @private - * @param {MouseEvent} - */ - _onDashboardActionClicked: function (e) { - e.preventDefault(); - var $action = $(e.currentTarget); - this.trigger_up('dashboard_open_action', { - action_name: "purchase.purchase_action_dashboard_kanban", - action_context: $action.attr('context'), - }); - }, -}); - -var PurchaseKanbanDashboardModel = KanbanModel.extend({ - /** - * @override - */ - init: function () { - this.dashboardValues = {}; - this._super.apply(this, arguments); - }, - - /** - * @override - */ - __get: function (localID) { - var result = this._super.apply(this, arguments); - if (_.isObject(result)) { - result.dashboardValues = this.dashboardValues[localID]; - } - return result; - }, - /** - * @override - * @returns {Promise} - */ - __load: function () { - return this._loadDashboard(this._super.apply(this, arguments)); - }, - /** - * @override - * @returns {Promise} - */ - __reload: function () { - return this._loadDashboard(this._super.apply(this, arguments)); - }, - - /** - * @private - * @param {Promise} super_def a promise that resolves with a dataPoint id - * @returns {Promise -> string} resolves to the dataPoint id - */ - _loadDashboard: function (super_def) { - var self = this; - var dashboard_def = this._rpc({ - model: 'purchase.order', - method: 'retrieve_dashboard', - context: session.user_context, - }); - return Promise.all([super_def, dashboard_def]).then(function(results) { - var id = results[0]; - dashboardValues = results[1]; - self.dashboardValues[id] = dashboardValues; - return id; - }); - }, -}); - -var PurchaseKanbanDashboardController = KanbanController.extend({ - custom_events: _.extend({}, KanbanController.prototype.custom_events, { - dashboard_open_action: '_onDashboardOpenAction', - }), - - /** - * @private - * @param {OdooEvent} e - */ - _onDashboardOpenAction: function (e) { - return this.do_action(e.data.action_name, - {additional_context: JSON.parse(e.data.action_context)}); - }, -}); - -var PurchaseKanbanDashboardView = KanbanView.extend({ - config: _.extend({}, KanbanView.prototype.config, { - Model: PurchaseKanbanDashboardModel, - Renderer: PurchaseKanbanDashboardRenderer, - Controller: PurchaseKanbanDashboardController, - }), -}); - -view_registry.add('purchase_list_dashboard', PurchaseListDashboardView); -view_registry.add('purchase_kanban_dashboard', PurchaseKanbanDashboardView); - -return { - PurchaseListDashboardModel: PurchaseListDashboardModel, - PurchaseListDashboardRenderer: PurchaseListDashboardRenderer, - PurchaseListDashboardController: PurchaseListDashboardController, - PurchaseKanbanDashboardModel: PurchaseKanbanDashboardModel, - PurchaseKanbanDashboardRenderer: PurchaseKanbanDashboardRenderer, - PurchaseKanbanDashboardController: PurchaseKanbanDashboardController -}; - -}); diff --git a/addons/purchase/static/src/views/purchase_dashboard.js b/addons/purchase/static/src/views/purchase_dashboard.js new file mode 100644 index 00000000000..d639af0d632 --- /dev/null +++ b/addons/purchase/static/src/views/purchase_dashboard.js @@ -0,0 +1,34 @@ +/** @odoo-module */ +import { useService } from "@web/core/utils/hooks"; + +const { Component, onWillStart } = owl; + +export class PurchaseDashBoard extends Component { + setup() { + this.orm = useService("orm"); + this.action = useService("action"); + + onWillStart(async () => { + this.purchaseData = await this.orm.call( + "purchase.order", + "retrieve_dashboard", + ); + }); + } + + /** + * This method clears the current search query and activates + * the filters found in `filter_name` attibute from button pressed + */ + setSearchContext(ev) { + let filter_name = ev.currentTarget.getAttribute("filter_name"); + let filters = filter_name.split(','); + let searchItems = this.env.searchModel.getSearchItems((item) => filters.includes(item.name)); + this.env.searchModel.query = []; + for (const item of searchItems){ + this.env.searchModel.toggleSearchItem(item.id); + } + } +} + +PurchaseDashBoard.template = 'purchase.PurchaseDashboard' diff --git a/addons/purchase/static/src/xml/purchase_dashboard.xml b/addons/purchase/static/src/views/purchase_dashboard.xml similarity index 75% rename from addons/purchase/static/src/xml/purchase_dashboard.xml rename to addons/purchase/static/src/views/purchase_dashboard.xml index a42714819ad..01f59417263 100644 --- a/addons/purchase/static/src/xml/purchase_dashboard.xml +++ b/addons/purchase/static/src/views/purchase_dashboard.xml @@ -1,6 +1,6 @@ - +
@@ -9,19 +9,19 @@ All RFQs
-
+ -
+ - @@ -31,19 +31,19 @@ My RFQs
-
+
-
+ -
+
-
+ -
+
- @@ -57,7 +57,7 @@ Avg Order Value
- +
@@ -65,7 +65,7 @@ Purchased Last 7 Days
- +
@@ -75,7 +75,7 @@ Lead Time to Purchase
-  Days +  Days
@@ -83,7 +83,7 @@ RFQs Sent Last 7 Days
- +
@@ -93,4 +93,3 @@
- diff --git a/addons/purchase/static/src/views/purchase_kanbanview.js b/addons/purchase/static/src/views/purchase_kanbanview.js new file mode 100644 index 00000000000..029595bf984 --- /dev/null +++ b/addons/purchase/static/src/views/purchase_kanbanview.js @@ -0,0 +1,19 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { kanbanView } from '@web/views/kanban/kanban_view'; +import { KanbanRenderer } from '@web/views/kanban/kanban_renderer'; +import { PurchaseDashBoard } from '@purchase/views/purchase_dashboard'; + + +export class PurchaseDashBoardKanbanRenderer extends KanbanRenderer {}; + +PurchaseDashBoardKanbanRenderer.template = 'purchase.PurchaseKanbanView'; +PurchaseDashBoardKanbanRenderer.components= Object.assign({}, KanbanRenderer.components, {PurchaseDashBoard}) + +export const PurchaseDashBoardKanbanView = { + ...kanbanView, + Renderer: PurchaseDashBoardKanbanRenderer, +}; + +registry.category("views").add("purchase_dashboard_kanban", PurchaseDashBoardKanbanView); diff --git a/addons/purchase/static/src/views/purchase_kanbanview.xml b/addons/purchase/static/src/views/purchase_kanbanview.xml new file mode 100644 index 00000000000..8d280fd5d5d --- /dev/null +++ b/addons/purchase/static/src/views/purchase_kanbanview.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/addons/purchase/static/src/views/purchase_listview.js b/addons/purchase/static/src/views/purchase_listview.js new file mode 100644 index 00000000000..0251d12e178 --- /dev/null +++ b/addons/purchase/static/src/views/purchase_listview.js @@ -0,0 +1,18 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { listView } from "@web/views/list/list_view"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { PurchaseDashBoard } from '@purchase/views/purchase_dashboard'; + +export class PurchaseDashBoardRenderer extends ListRenderer {}; + +PurchaseDashBoardRenderer.template = 'purchase.PurchaseListView'; +PurchaseDashBoardRenderer.components= Object.assign({}, ListRenderer.components, {PurchaseDashBoard}) + +export const PurchaseDashBoardListView = { + ...listView, + Renderer: PurchaseDashBoardRenderer, +}; + +registry.category("views").add("purchase_dashboard_list", PurchaseDashBoardListView); diff --git a/addons/purchase/static/src/views/purchase_listview.scss b/addons/purchase/static/src/views/purchase_listview.scss new file mode 100644 index 00000000000..3a807cc9f9a --- /dev/null +++ b/addons/purchase/static/src/views/purchase_listview.scss @@ -0,0 +1,3 @@ +.o_rfq_no_content { + position: static; +} \ No newline at end of file diff --git a/addons/purchase/static/src/views/purchase_listview.xml b/addons/purchase/static/src/views/purchase_listview.xml new file mode 100644 index 00000000000..383d2a13489 --- /dev/null +++ b/addons/purchase/static/src/views/purchase_listview.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml index 9a3add0f6a5..6b0ac9eb736 100644 --- a/addons/purchase/views/purchase_views.xml +++ b/addons/purchase/views/purchase_views.xml @@ -479,7 +479,7 @@ purchase.order.kanban purchase.order - + @@ -518,6 +518,7 @@ purchase.order.view.kanban.without.dashboard purchase.order + primary 20 @@ -563,7 +564,7 @@ + class="o_purchase_order" js_class="purchase_dashboard_list" sample="1">
@@ -666,7 +667,10 @@ ir.actions.act_window purchase.order tree,kanban,form,pivot,graph,calendar,activity - + [('state','in',('purchase', 'done'))] {} @@ -819,37 +823,6 @@ new - - - - Requests for Quotation - purchase.order - form,tree,kanban,pivot,graph,calendar,activity - - - main - -

- No RFQs to display -

-
-
- - - - Requests for Quotation - purchase.order - form,tree,kanban,pivot,graph,calendar,activity - - - main - -

- No RFQs to display -

-
-
- Requests for Quotation purchase.order diff --git a/odoo/addons/test_main_flows/static/tests/tours/main_flow.js b/odoo/addons/test_main_flows/static/tests/tours/main_flow.js index 137f425b4c2..f638abdf48b 100644 --- a/odoo/addons/test_main_flows/static/tests/tours/main_flow.js +++ b/odoo/addons/test_main_flows/static/tests/tours/main_flow.js @@ -715,7 +715,7 @@ tour.stepUtils.openBuggerMenu("li.breadcrumb-item.active:contains('OP/')"), ...tour.stepUtils.goToAppSteps('purchase.menu_purchase_root', _t('Go to Purchase')), { mobile: false, - trigger: '.o_data_row:has(.o_data_cell:contains("the_flow.vendor"))', + trigger: '.o_data_row:has(.o_data_cell:contains("the_flow.vendor")) .o_data_cell:first', content: _t('Select the generated request for quotation'), position: 'bottom', }, {