summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/control_panel/favorite_menu.js
diff options
context:
space:
mode:
authorJulien Mougenot <jum@odoo.com>2020-03-11 09:38:28 +0000
committerJulien Mougenot <jum@odoo.com>2020-03-13 14:08:33 +0000
commitfbf347498f1cc7b74ef373179b7bcae201715c24 (patch)
treeb8d1eb29ec93b6c2e43dbade712e636d32fe6716 /addons/web/static/src/js/control_panel/favorite_menu.js
parent0a129284e4856b6485c48a194fd86c3ab5c736e7 (diff)
[REF] web: Control panel Owl
Refactoring of the control panel with the Owl framework. The MVC structure of the control panel has been changed to a 'component <-> model' relationship. As such: - Removed the old control panel: view/model/controller/renderer - Created a new Owl Component (ControlPanel) - Created a new class: the Model (an Owl Store did not fit here) and a newly designed ControlPanelModel extending it Refactored all inner subcomponents, including: - Pager - ActionMenus (peviously SideBar) - Filter menu > Custom filter item - Group by menu > Custom group by item > Removal of groupby_menu_mixin (and refactored graph controller in sibling commit) - Time range menu - Favorite menu > Custom favorite item > Moved the favorite menu registry to the favorite_menu file - Search bar > Removed and splitted auto-completion dropdown logic between the new SearchBar Component (descriptions) and to the new ControlPanelModel (domains). The templates (all in web/base.xml) have been adapted to the new standards. Most of the DOM structure remains unchanged with some occasional improvements (replace hiding with not rendering, removed pointless wrapper divs, etc.). Part of task 2196029 Co-authored-by: Mathieu Duckerts-Antoine <dam@odoo.com>
Diffstat (limited to 'addons/web/static/src/js/control_panel/favorite_menu.js')
-rw-r--r--addons/web/static/src/js/control_panel/favorite_menu.js101
1 files changed, 101 insertions, 0 deletions
diff --git a/addons/web/static/src/js/control_panel/favorite_menu.js b/addons/web/static/src/js/control_panel/favorite_menu.js
new file mode 100644
index 00000000000..8ebf910da08
--- /dev/null
+++ b/addons/web/static/src/js/control_panel/favorite_menu.js
@@ -0,0 +1,101 @@
+odoo.define('web.FavoriteMenu', function (require) {
+ "use strict";
+
+ const Dialog = require('web.OwlDialog');
+ const DropdownMenu = require('web.DropdownMenu');
+ const Registry = require('web.Registry');
+ const { useModel } = require('web.model');
+
+ /**
+ * 'Favorites' menu
+ *
+ * Simple rendering of the filters of type `favorites` given by the control panel
+ * model. It uses most of the behaviours implemented by the dropdown menu Component,
+ * with the addition of a submenu registry used to display additional components.
+ * Only the favorite generator (@see CustomFavoriteItem) is registered in
+ * the `web` module.
+ * @see DropdownMenu for additional details.
+ * @extends DropdownMenu
+ */
+ class FavoriteMenu extends DropdownMenu {
+ constructor() {
+ super(...arguments);
+
+ this.model = useModel('controlPanelModel');
+ this.state.deletedFavorite = false;
+ }
+
+ //---------------------------------------------------------------------
+ // Getters
+ //---------------------------------------------------------------------
+
+ /**
+ * @override
+ */
+ get items() {
+ const favorites = this.model.getFiltersOfType('favorite');
+ const registryMenus = this.constructor.registry.values().reduce(
+ (menus, Component) => {
+ if (Component.shouldBeDisplayed(this.env)) {
+ menus.push({
+ key: Component.name,
+ Component,
+ });
+ }
+ return menus;
+ },
+ []
+ );
+ return [...favorites, ...registryMenus];
+ }
+
+ /**
+ * @override
+ */
+ get title() {
+ return this.env._t("Favorites");
+ }
+
+ //---------------------------------------------------------------------
+ // Handlers
+ //---------------------------------------------------------------------
+
+ /**
+ * @private
+ * @param {OwlEvent} ev
+ */
+ _onItemRemoved(ev) {
+ const favorite = this.items.find(fav => fav.id === ev.detail.item.id);
+ this.state.deletedFavorite = favorite;
+ }
+
+ /**
+ * @private
+ * @param {OwlEvent} ev
+ */
+ _onItemSelected(ev) {
+ ev.stopPropagation();
+ this.model.dispatch('toggleFilter', ev.detail.item.id);
+ }
+
+ /**
+ * @private
+ */
+ async _onRemoveFavorite() {
+ await this.model.dispatch('deleteFavorite', this.state.deletedFavorite.id);
+ this.state.deletedFavorite = false;
+ }
+ }
+
+ FavoriteMenu.registry = new Registry();
+
+ FavoriteMenu.components = Object.assign({}, DropdownMenu.components, {
+ Dialog,
+ });
+ FavoriteMenu.defaultProps = Object.assign({}, DropdownMenu.defaultProps, {
+ icon: 'fa fa-star',
+ });
+ FavoriteMenu.template = 'web.FavoriteMenu';
+
+ return FavoriteMenu;
+});