/** @odoo-module **/ import { makeFakeUserService } from "@web/../tests/helpers/mock_services"; import { click, getFixture, makeDeferred, nextTick, selectDropdownItem, } from "@web/../tests/helpers/utils"; import { makeWithSearch, setupControlPanelServiceRegistry, switchView, toggleSearchBarMenu, toggleMenuItem, } from "@web/../tests/search/helpers"; import { createWebClient, doAction } from "@web/../tests/webclient/helpers"; import { registry } from "@web/core/registry"; import { SearchBarMenu } from "@web/search/search_bar_menu/search_bar_menu"; import { SearchPanel } from "@web/search/search_panel/search_panel"; import { Component, xml, onWillStart as onWillStartOWL, onWillUpdateProps as onWillUpdatePropsOWL, } from "@odoo/owl"; const serviceRegistry = registry.category("services"); //----------------------------------------------------------------------------- // Helpers //----------------------------------------------------------------------------- function getValues(el, type) { switch (type) { case "category": { return [...el.querySelectorAll(".o_search_panel_category_value header")]; } case "filter": { return [...el.getElementsByClassName("o_search_panel_filter_value")]; } case "filterGroup": { return [...el.getElementsByClassName("o_search_panel_filter_group")]; } case "groupHeader": { return [...el.getElementsByClassName("o_search_panel_group_header")]; } } } function getValue(el, type, content = 0, additionalSelector = null) { const values = getValues(el, type); let match = null; if (Number.isInteger(content) && content < values.length) { match = values[content]; } else { const re = new RegExp(content, "i"); match = values.find((v) => re.test(v.innerText.trim())); } if (match && additionalSelector) { match = match.querySelector(additionalSelector); } return match; } function parseContent([value, counter]) { return counter ? `${value}: ${counter}` : value; } function getContent(el, type, parse = parseContent) { return getValues(el, type) .map((v) => parse(v.innerText.trim().split(/\s+/))) .filter((v) => v !== null); } // Categories function getCategory(el, ...args) { return getValue(el, "category", ...args); } function getCategoriesContent(el, ...args) { return getContent(el, "category", ...args); } // Filters function getFilter(el, ...args) { return getValue(el, "filter", ...args); } function getFiltersContent(el, ...args) { return getContent(el, "filter", ...args); } // Filter groups function getFilterGroup(el, ...args) { return getValue(el, "filterGroup", ...args); } function getFilterGroupContent(el, ...args) { const group = getFilterGroup(el, ...args); return [getContent(group, "groupHeader")[0], getFiltersContent(group)]; } function getCounters(v) { return isNaN(v[1]) ? null : Number(v[1]); } function makeTestComponent({ onWillStart, onWillUpdateProps } = {}) { let domain; class TestComponent extends Component { setup() { onWillStartOWL(async () => { if (onWillStart) { await onWillStart(); } domain = this.props.domain; }); onWillUpdatePropsOWL(async (nextProps) => { if (onWillUpdateProps) { await onWillUpdateProps(); } domain = nextProps.domain; }); } } TestComponent.components = { SearchBarMenu, SearchPanel }; TestComponent.template = xml`
`; return { TestComponent, getDomain: () => domain }; } let serverData; let target; QUnit.module("Search", (hooks) => { hooks.beforeEach(() => { serverData = { models: { partner: { fields: { foo: { string: "Foo", type: "char" }, bar: { string: "Bar", type: "boolean" }, int_field: { string: "Int Field", type: "integer", group_operator: "sum" }, company_id: { string: "company", type: "many2one", relation: "company" }, company_ids: { string: "Companies", type: "many2many", relation: "company", }, category_id: { string: "category", type: "many2one", relation: "category" }, state: { string: "State", type: "selection", selection: [ ["abc", "ABC"], ["def", "DEF"], ["ghi", "GHI"], ], }, }, records: [ { id: 1, bar: true, foo: "yop", int_field: 1, company_ids: [3], company_id: 3, state: "abc", category_id: 6, }, { id: 2, bar: true, foo: "blip", int_field: 2, company_ids: [3], company_id: 5, state: "def", category_id: 7, }, { id: 3, bar: true, foo: "gnap", int_field: 4, company_ids: [], company_id: 3, state: "ghi", category_id: 7, }, { id: 4, bar: false, foo: "blip", int_field: 8, company_ids: [5], company_id: 5, state: "ghi", category_id: 7, }, ], }, company: { fields: { name: { string: "Display Name", type: "char" }, parent_id: { string: "Parent company", type: "many2one", relation: "company", }, category_id: { string: "Category", type: "many2one", relation: "category" }, }, records: [ { id: 3, name: "asustek", category_id: 6 }, { id: 5, name: "agrolait", category_id: 7 }, ], }, category: { fields: { name: { string: "Category Name", type: "char" }, }, records: [ { id: 6, name: "gold" }, { id: 7, name: "silver" }, ], }, }, actions: { 1: { id: 1, name: "Partners", res_model: "partner", type: "ir.actions.act_window", views: [ [false, "kanban"], [false, "list"], [false, "pivot"], [false, "form"], ], }, 2: { id: 2, name: "Partners", res_model: "partner", type: "ir.actions.act_window", views: [[false, "form"]], }, }, views: { "partner,false,toy": /* xml */ ``, "partner,false,list": /* xml */ ` `, "partner,false,kanban": /* xml */ `
`, "partner,false,form": /* xml */ `