odoo18/addons/web/static/src/webclient/menus/menu_providers.js

80 lines
2.9 KiB
JavaScript

import { _t } from "@web/core/l10n/translation";
import { registry } from "@web/core/registry";
import { fuzzyLookup } from "@web/core/utils/search";
import { computeAppsAndMenuItems } from "@web/webclient/menus/menu_helpers";
import { DefaultCommandItem } from "@web/core/commands/command_palette";
import { Component } from "@odoo/owl";
class AppIconCommand extends Component {
static template = "web.AppIconCommand";
static props = {
webIconData: { type: String, optional: true },
webIcon: { type: Object, optional: true },
...DefaultCommandItem.props,
};
}
const commandCategoryRegistry = registry.category("command_categories");
commandCategoryRegistry.add("apps", { namespace: "/" }, { sequence: 10 });
commandCategoryRegistry.add("menu_items", { namespace: "/" }, { sequence: 20 });
const commandSetupRegistry = registry.category("command_setup");
commandSetupRegistry.add("/", {
emptyMessage: _t("No menu found"),
name: _t("menus"),
placeholder: _t("Search for a menu..."),
});
const commandProviderRegistry = registry.category("command_provider");
commandProviderRegistry.add("menu", {
namespace: "/",
async provide(env, options) {
const result = [];
const menuService = env.services.menu;
let { apps, menuItems } = computeAppsAndMenuItems(menuService.getMenuAsTree("root"));
if (options.searchValue !== "") {
apps = fuzzyLookup(options.searchValue, apps, (menu) => menu.label);
fuzzyLookup(options.searchValue, menuItems, (menu) =>
(menu.parents + " / " + menu.label).split("/").reverse().join("/")
).forEach((menu) => {
result.push({
action() {
menuService.selectMenu(menu);
},
category: "menu_items",
name: menu.parents + " / " + menu.label,
href: menu.href || `#menu_id=${menu.id}&action_id=${menu.actionID}`,
});
});
}
apps.forEach((menu) => {
const props = {};
if (menu.webIconData) {
const prefix = menu.webIconData.startsWith("P")
? "data:image/svg+xml;base64,"
: "data:image/png;base64,";
props.webIconData = menu.webIconData.startsWith("data:image")
? menu.webIconData
: prefix + menu.webIconData.replace(/\s/g, "");
} else {
props.webIcon = menu.webIcon;
}
result.push({
Component: AppIconCommand,
action() {
menuService.selectMenu(menu);
},
category: "apps",
name: menu.label,
href: menu.href || `#menu_id=${menu.id}&action_id=${menu.actionID}`,
props,
});
});
return result;
},
});