You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.1 KiB
135 lines
5.1 KiB
/** @odoo-module **/
|
|
|
|
import { Dropdown } from "@web/core/dropdown/dropdown";
|
|
import { registry } from "@web/core/registry";
|
|
import { useBus, useService } from "@web/core/utils/hooks";
|
|
import { Component } from "@odoo/owl";
|
|
import { SearchDropdownItem } from "@web/search/search_dropdown_item/search_dropdown_item";
|
|
import { CustomGroupByItem } from "@web/search/group_by_menu/custom_group_by_item";
|
|
import { FACET_ICONS, GROUPABLE_TYPES } from "@web/search/utils/misc";
|
|
import { sortBy } from "@web/core/utils/arrays";
|
|
import { DropdownItem } from "@web/core/dropdown/dropdown_item";
|
|
import { _t } from "@web/core/l10n/translation";
|
|
import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog";
|
|
import { DomainSelectorDialog } from "@web/core/domain_selector_dialog/domain_selector_dialog";
|
|
const favoriteMenuRegistry = registry.category("favoriteMenu");
|
|
|
|
export class SearchWidget extends Component {
|
|
setup() {
|
|
// Filter
|
|
this.dialogService = useService("dialog");
|
|
this.filterIcon = FACET_ICONS.filter;
|
|
// GroupBy
|
|
const fields = [];
|
|
for (const [fieldName, field] of Object.entries(this.env.searchModel.searchViewFields)) {
|
|
if (this.validateField(fieldName, field)) {
|
|
fields.push(Object.assign({ name: fieldName }, field));
|
|
}
|
|
}
|
|
this.groupByIcon = FACET_ICONS.groupBy;
|
|
this.fields = sortBy(fields, "string");
|
|
// Favorite
|
|
this.favoriteIcon = FACET_ICONS.favorite;
|
|
useBus(this.env.searchModel, "update", this.render);
|
|
}
|
|
|
|
// Filter Menu
|
|
get Filteritems() {
|
|
// Get filter items for the menu.
|
|
return this.env.searchModel.getSearchItems((searchItem) =>
|
|
["filter", "dateFilter"].includes(searchItem.type)
|
|
);
|
|
}
|
|
onFilterSelected({ itemId, optionId }) {
|
|
// Handle selection of a filter item.
|
|
if (optionId) {
|
|
this.env.searchModel.toggleDateFilter(itemId, optionId);
|
|
} else {
|
|
this.env.searchModel.toggleSearchItem(itemId);
|
|
}
|
|
}
|
|
// Add custom filter dialog
|
|
onAddCustomFilterClick() {
|
|
const { _context: context, resModel } = this.env.searchModel;
|
|
this.dialogService.add(DomainSelectorDialog, {
|
|
resModel,
|
|
domain : "[]",
|
|
context,
|
|
readonly : false,
|
|
title: _t("Add Custom Filter"),
|
|
onSave: (domain) => this.env.searchModel.splitAndAddDomain(domain),
|
|
isDebugMode: !!this.env.debug,
|
|
})
|
|
}
|
|
|
|
// GroupBy Menu
|
|
get groupByitems() {
|
|
// Get groupBy items for the menu.
|
|
return this.env.searchModel.getSearchItems((searchItem) =>
|
|
["groupBy", "dateGroupBy"].includes(searchItem.type)
|
|
);
|
|
}
|
|
onGroupBySelected({ itemId, optionId }) {
|
|
// Handle selection of a groupBy item.
|
|
if (optionId) {
|
|
this.env.searchModel.toggleDateGroupBy(itemId, optionId);
|
|
} else {
|
|
this.env.searchModel.toggleSearchItem(itemId);
|
|
}
|
|
}
|
|
onAddCustomGroup(fieldName) {
|
|
// Create new custom group by
|
|
this.env.searchModel.createNewGroupBy(fieldName);
|
|
}
|
|
get hideCustomGroupBy() {
|
|
// Hide new custom group by
|
|
return this.env.searchModel.hideCustomGroupBy || false;
|
|
}
|
|
validateField(fieldName, field) {
|
|
// Validate if a field is suitable for groupBy
|
|
const { sortable, store, type } = field;
|
|
return (
|
|
(type === "many2many" ? store : sortable) &&
|
|
fieldName !== "id" &&
|
|
GROUPABLE_TYPES.includes(type)
|
|
);
|
|
}
|
|
// Favorite Menu
|
|
get favoriteitems() {
|
|
// Get favorite items for the menu.
|
|
const favorites = this.env.searchModel.getSearchItems(
|
|
(searchItem) => searchItem.type === "favorite"
|
|
);
|
|
const registryMenus = [];
|
|
for (const item of favoriteMenuRegistry.getAll()) {
|
|
if ("isDisplayed" in item ? item.isDisplayed(this.env) : true) {
|
|
registryMenus.push({
|
|
Component: item.Component,
|
|
groupNumber: item.groupNumber,
|
|
key: item.Component.name,
|
|
});
|
|
}
|
|
}
|
|
return [...favorites, ...registryMenus];
|
|
}
|
|
onFavoriteSelected(itemId) {
|
|
this.env.searchModel.toggleSearchItem(itemId);
|
|
}
|
|
openConfirmationDialog(itemId) {
|
|
// Open a confirmation dialog for removing a favorite item.
|
|
const { userId } = this.favoriteitems.find((item) => item.id === itemId);
|
|
const dialogProps = {
|
|
title: this.env._t("Warning"),
|
|
body: userId
|
|
? this.env._t("Are you sure that you want to remove this filter?")
|
|
: this.env._t(
|
|
"This filter is global and will be removed for everybody if you continue."
|
|
),
|
|
confirm: () => this.env.searchModel.deleteFavorite(itemId),
|
|
cancel: () => {},
|
|
};
|
|
this.dialogService.add(ConfirmationDialog, dialogProps);
|
|
}
|
|
}
|
|
SearchWidget.template = "SearchWidget";
|
|
SearchWidget.components = {Dropdown, CustomGroupByItem, DropdownItem:SearchDropdownItem};
|
|
|