80 lines
2.9 KiB
JavaScript
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;
|
|
},
|
|
});
|