summaryrefslogtreecommitdiff
path: root/addons/board/static/src/js/add_to_board_menu.js
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/board/static/src/js/add_to_board_menu.js
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/board/static/src/js/add_to_board_menu.js')
-rw-r--r--addons/board/static/src/js/add_to_board_menu.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/addons/board/static/src/js/add_to_board_menu.js b/addons/board/static/src/js/add_to_board_menu.js
new file mode 100644
index 00000000..42a4a707
--- /dev/null
+++ b/addons/board/static/src/js/add_to_board_menu.js
@@ -0,0 +1,152 @@
+odoo.define('board.AddToBoardMenu', function (require) {
+ "use strict";
+
+ const Context = require('web.Context');
+ const Domain = require('web.Domain');
+ const DropdownMenuItem = require('web.DropdownMenuItem');
+ const FavoriteMenu = require('web.FavoriteMenu');
+ const { sprintf } = require('web.utils');
+ const { useAutofocus } = require('web.custom_hooks');
+
+ const { useState } = owl.hooks;
+
+ /**
+ * 'Add to board' menu
+ *
+ * Component consisiting of a toggle button, a text input and an 'Add' button.
+ * The first button is simply used to toggle the component and will determine
+ * whether the other elements should be rendered.
+ * The input will be given the name (or title) of the view that will be added.
+ * Finally, the last button will send the name as well as some of the action
+ * properties to the server to add the current view (and its context) to the
+ * user's dashboard.
+ * This component is only available in actions of type 'ir.actions.act_window'.
+ * @extends DropdownMenuItem
+ */
+ class AddToBoardMenu extends DropdownMenuItem {
+ constructor() {
+ super(...arguments);
+
+ this.interactive = true;
+ this.state = useState({
+ name: this.env.action.name || "",
+ open: false,
+ });
+
+ useAutofocus();
+ }
+
+ //---------------------------------------------------------------------
+ // Private
+ //---------------------------------------------------------------------
+
+ /**
+ * This is the main function for actually saving the dashboard. This method
+ * is supposed to call the route /board/add_to_dashboard with proper
+ * information.
+ * @private
+ */
+ async _addToBoard() {
+ const searchQuery = this.env.searchModel.get('query');
+ const context = new Context(this.env.action.context);
+ context.add(searchQuery.context);
+ context.add({
+ group_by: searchQuery.groupBy,
+ orderedBy: searchQuery.orderedBy,
+ });
+ if (searchQuery.timeRanges && searchQuery.timeRanges.hasOwnProperty('fieldName')) {
+ context.add({
+ comparison: searchQuery.timeRanges,
+ });
+ }
+ let controllerQueryParams;
+ this.env.searchModel.trigger('get-controller-query-params', params => {
+ controllerQueryParams = params || {};
+ });
+ controllerQueryParams.context = controllerQueryParams.context || {};
+ const queryContext = controllerQueryParams.context;
+ delete controllerQueryParams.context;
+ context.add(Object.assign(controllerQueryParams, queryContext));
+
+ const domainArray = new Domain(this.env.action.domain || []);
+ const domain = Domain.prototype.normalizeArray(domainArray.toArray().concat(searchQuery.domain));
+
+ const evalutatedContext = context.eval();
+ for (const key in evalutatedContext) {
+ if (evalutatedContext.hasOwnProperty(key) && /^search_default_/.test(key)) {
+ delete evalutatedContext[key];
+ }
+ }
+ evalutatedContext.dashboard_merge_domains_contexts = false;
+
+ Object.assign(this.state, {
+ name: $(".o_input").val() || "",
+ open: false,
+ });
+
+ const result = await this.rpc({
+ route: '/board/add_to_dashboard',
+ params: {
+ action_id: this.env.action.id || false,
+ context_to_save: evalutatedContext,
+ domain: domain,
+ view_mode: this.env.view.type,
+ name: this.state.name,
+ },
+ });
+ if (result) {
+ this.env.services.notification.notify({
+ title: sprintf(this.env._t("'%s' added to dashboard"), this.state.name),
+ message: this.env._t("Please refresh your browser for the changes to take effect."),
+ type: 'warning',
+ });
+ } else {
+ this.env.services.notification.notify({
+ message: this.env._t("Could not add filter to dashboard"),
+ type: 'danger',
+ });
+ }
+ }
+
+ //---------------------------------------------------------------------
+ // Handlers
+ //---------------------------------------------------------------------
+
+ /**
+ * @private
+ * @param {KeyboardEvent} ev
+ */
+ _onInputKeydown(ev) {
+ switch (ev.key) {
+ case 'Enter':
+ ev.preventDefault();
+ this._addToBoard();
+ break;
+ case 'Escape':
+ // Gives the focus back to the component.
+ ev.preventDefault();
+ ev.target.blur();
+ break;
+ }
+ }
+
+ //---------------------------------------------------------------------
+ // Static
+ //---------------------------------------------------------------------
+
+ /**
+ * @param {Object} env
+ * @returns {boolean}
+ */
+ static shouldBeDisplayed(env) {
+ return env.action.type === 'ir.actions.act_window';
+ }
+ }
+
+ AddToBoardMenu.props = {};
+ AddToBoardMenu.template = 'AddToBoardMenu';
+
+ FavoriteMenu.registry.add('add-to-board-menu', AddToBoardMenu, 10);
+
+ return AddToBoardMenu;
+});