[REF] web: update systray registry to take Component/props
This commit is contained in:
committed by
Aaron Bohy
parent
2e2d6a166e
commit
f4bb46cd29
@@ -21,7 +21,13 @@ export const debugService = {
|
||||
start(env, { orm }) {
|
||||
let accessRightsProm;
|
||||
if (env.debug !== "") {
|
||||
registry.category("systray").add("web.debug_mode_menu", DebugMenu, { sequence: 100 });
|
||||
registry.category("systray").add(
|
||||
"web.debug_mode_menu",
|
||||
{
|
||||
Component: DebugMenu,
|
||||
},
|
||||
{ sequence: 100 }
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
@@ -32,7 +32,7 @@ function addSystrayItem(Widget) {
|
||||
SystrayItem.template = tags.xml`<SystrayItemAdapter Component="Widget" />`;
|
||||
SystrayItem.components = { SystrayItemAdapter };
|
||||
|
||||
systrayRegistry.add(name, SystrayItem, { sequence: Widget.prototype.sequence });
|
||||
systrayRegistry.add(name, { Component: SystrayItem }, { sequence: Widget.prototype.sequence });
|
||||
|
||||
convertedItems.push(Widget);
|
||||
}
|
||||
|
||||
@@ -14,12 +14,15 @@ const systrayRegistry = registry.category("systray");
|
||||
export class MenuDropdown extends Dropdown {
|
||||
setup() {
|
||||
super.setup();
|
||||
useEffect(() => {
|
||||
if (this.props.xmlid) {
|
||||
const toggler = this.el.querySelector("button.o_dropdown_toggler");
|
||||
toggler.dataset.menuXmlid = this.props.xmlid;
|
||||
}
|
||||
}, () => []);
|
||||
useEffect(
|
||||
() => {
|
||||
if (this.props.xmlid) {
|
||||
const toggler = this.el.querySelector("button.o_dropdown_toggler");
|
||||
toggler.dataset.menuXmlid = this.props.xmlid;
|
||||
}
|
||||
},
|
||||
() => []
|
||||
);
|
||||
}
|
||||
}
|
||||
MenuDropdown.props.xmlid = {
|
||||
@@ -30,11 +33,14 @@ MenuDropdown.props.xmlid = {
|
||||
export class MenuItem extends DropdownItem {
|
||||
setup() {
|
||||
super.setup();
|
||||
useEffect(() => {
|
||||
if (this.props.payload.xmlid) {
|
||||
this.el.dataset.menuXmlid = this.props.payload.xmlid;
|
||||
}
|
||||
}, () => []);
|
||||
useEffect(
|
||||
() => {
|
||||
if (this.props.payload.xmlid) {
|
||||
this.el.dataset.menuXmlid = this.props.payload.xmlid;
|
||||
}
|
||||
},
|
||||
() => []
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +83,7 @@ export class NavBar extends Component {
|
||||
get systrayItems() {
|
||||
return systrayRegistry
|
||||
.getAll()
|
||||
.filter((Item) => ("isDisplayed" in Item ? Item.isDisplayed(this.env) : true))
|
||||
.filter((item) => ("isDisplayed" in item ? item.isDisplayed(this.env) : true))
|
||||
.reverse();
|
||||
}
|
||||
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
|
||||
<!-- Systray -->
|
||||
<ul class="o_menu_systray" role="menu">
|
||||
<t t-foreach="systrayItems" t-as="Item" t-key="Item_index">
|
||||
<t t-component="Item" />
|
||||
<t t-foreach="systrayItems" t-as="item" t-key="item_index">
|
||||
<t t-component="item.Component" t-props="item.props" />
|
||||
</t>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
@@ -9,11 +9,6 @@ const { Component, hooks } = owl;
|
||||
const { useState } = hooks;
|
||||
|
||||
export class SwitchCompanyMenu extends Component {
|
||||
static isDisplayed(env) {
|
||||
const { availableCompanies } = env.services.company;
|
||||
return Object.keys(availableCompanies).length > 1 && !env.isSmall;
|
||||
}
|
||||
|
||||
setup() {
|
||||
this.companyService = useService("company");
|
||||
this.currentCompany = this.companyService.currentCompany;
|
||||
@@ -45,4 +40,12 @@ export class SwitchCompanyMenu extends Component {
|
||||
SwitchCompanyMenu.template = "web.SwitchCompanyMenu";
|
||||
SwitchCompanyMenu.toggleDelay = 1000;
|
||||
|
||||
registry.category("systray").add("SwitchCompanyMenu", SwitchCompanyMenu, { sequence: 1 });
|
||||
const systrayItem = {
|
||||
Component: SwitchCompanyMenu,
|
||||
isDisplayed(env) {
|
||||
const { availableCompanies } = env.services.company;
|
||||
return Object.keys(availableCompanies).length > 1 && !env.isSmall;
|
||||
},
|
||||
};
|
||||
|
||||
registry.category("systray").add("SwitchCompanyMenu", systrayItem, { sequence: 1 });
|
||||
|
||||
@@ -13,19 +13,18 @@ const userMenuRegistry = registry.category("user_menuitems");
|
||||
class UserMenuItem extends DropdownItem {
|
||||
setup() {
|
||||
super.setup();
|
||||
useEffect(() => {
|
||||
if (this.props.payload.id) {
|
||||
this.el.dataset.menu = this.props.payload.id;
|
||||
}
|
||||
}, () => []);
|
||||
useEffect(
|
||||
() => {
|
||||
if (this.props.payload.id) {
|
||||
this.el.dataset.menu = this.props.payload.id;
|
||||
}
|
||||
},
|
||||
() => []
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class UserMenu extends Component {
|
||||
static isDisplayed(env) {
|
||||
return !env.isSmall;
|
||||
}
|
||||
|
||||
setup() {
|
||||
this.user = useService("user");
|
||||
const { origin } = browser.location;
|
||||
@@ -58,4 +57,8 @@ export class UserMenu extends Component {
|
||||
UserMenu.template = "web.UserMenu";
|
||||
UserMenu.components = { UserMenuItem };
|
||||
|
||||
registry.category("systray").add("web.user_menu", UserMenu, { sequence: 0 });
|
||||
const systrayItem = {
|
||||
Component: UserMenu,
|
||||
isDisplayed: (env) => !env.isSmall,
|
||||
};
|
||||
registry.category("systray").add("web.user_menu", systrayItem, { sequence: 0 });
|
||||
|
||||
@@ -27,7 +27,7 @@ QUnit.module("Navbar", {
|
||||
serviceRegistry.add("notification", notificationService);
|
||||
serviceRegistry.add("hotkey", hotkeyService);
|
||||
serviceRegistry.add("ui", uiService);
|
||||
systrayRegistry.add("addon.myitem", MySystrayItem);
|
||||
systrayRegistry.add("addon.myitem", { Component: MySystrayItem });
|
||||
patchWithCleanup(browser, {
|
||||
setTimeout: (handler, delay, ...args) => handler(...args),
|
||||
clearTimeout: () => {},
|
||||
@@ -154,10 +154,10 @@ QUnit.test("navbar can display systray items ordered based on their sequence", a
|
||||
MyItem4.template = xml`<li class="my-item-4">my item 4</li>`;
|
||||
|
||||
clearRegistryWithCleanup(systrayRegistry);
|
||||
systrayRegistry.add("addon.myitem2", MyItem2);
|
||||
systrayRegistry.add("addon.myitem1", MyItem1, { sequence: 0 });
|
||||
systrayRegistry.add("addon.myitem3", MyItem3, { sequence: 100 });
|
||||
systrayRegistry.add("addon.myitem4", MyItem4);
|
||||
systrayRegistry.add("addon.myitem2", { Component: MyItem2 });
|
||||
systrayRegistry.add("addon.myitem1", { Component: MyItem1 }, { sequence: 0 });
|
||||
systrayRegistry.add("addon.myitem3", { Component: MyItem3 }, { sequence: 100 });
|
||||
systrayRegistry.add("addon.myitem4", { Component: MyItem4 });
|
||||
const env = await makeTestEnv(baseConfig);
|
||||
const target = getFixture();
|
||||
const navbar = await mount(NavBar, { env, target });
|
||||
@@ -202,11 +202,7 @@ QUnit.test("can adapt with 'more' menu sections behavior", async (assert) => {
|
||||
3,
|
||||
"should have 3 menu sections displayed (that are not the 'more' menu)"
|
||||
);
|
||||
assert.containsNone(
|
||||
navbar.el,
|
||||
".o_menu_sections_more",
|
||||
"the 'more' menu should not exist"
|
||||
);
|
||||
assert.containsNone(navbar.el, ".o_menu_sections_more", "the 'more' menu should not exist");
|
||||
// Force minimal width and dispatch window resize event
|
||||
navbar.el.style.width = "0%";
|
||||
window.dispatchEvent(new Event("resize"));
|
||||
@@ -238,11 +234,7 @@ QUnit.test("can adapt with 'more' menu sections behavior", async (assert) => {
|
||||
3,
|
||||
"should have 3 menu sections displayed (that are not the 'more' menu)"
|
||||
);
|
||||
assert.containsNone(
|
||||
navbar.el,
|
||||
".o_menu_sections_more",
|
||||
"the 'more' menu should not exist"
|
||||
);
|
||||
assert.containsNone(navbar.el, ".o_menu_sections_more", "the 'more' menu should not exist");
|
||||
// Check the navbar adaptation calls
|
||||
assert.verifySteps([
|
||||
"adapt -> hide 0/3 sections",
|
||||
@@ -252,104 +244,115 @@ QUnit.test("can adapt with 'more' menu sections behavior", async (assert) => {
|
||||
navbar.destroy();
|
||||
});
|
||||
|
||||
QUnit.test("'more' menu sections adaptations do not trigger render in some cases", async (assert) => {
|
||||
let adaptRunning = false;
|
||||
let adaptCount = 0;
|
||||
let adaptRenderCount = 0;
|
||||
class MyNavbar extends NavBar {
|
||||
async adapt() {
|
||||
adaptRunning = true;
|
||||
adaptCount++;
|
||||
await super.adapt();
|
||||
adaptRunning = false;
|
||||
}
|
||||
async render() {
|
||||
if (adaptRunning) {
|
||||
adaptRenderCount++;
|
||||
QUnit.test(
|
||||
"'more' menu sections adaptations do not trigger render in some cases",
|
||||
async (assert) => {
|
||||
let adaptRunning = false;
|
||||
let adaptCount = 0;
|
||||
let adaptRenderCount = 0;
|
||||
class MyNavbar extends NavBar {
|
||||
async adapt() {
|
||||
adaptRunning = true;
|
||||
adaptCount++;
|
||||
await super.adapt();
|
||||
adaptRunning = false;
|
||||
}
|
||||
async render() {
|
||||
if (adaptRunning) {
|
||||
adaptRenderCount++;
|
||||
}
|
||||
await super.render(...arguments);
|
||||
}
|
||||
await super.render(...arguments);
|
||||
}
|
||||
|
||||
const newMenus = {
|
||||
root: { id: "root", children: [1], name: "root", appID: "root" },
|
||||
1: { id: 1, children: [11, 12, 13], name: "App1", appID: 1 },
|
||||
11: { id: 11, children: [], name: "Section 1", appID: 1 },
|
||||
12: { id: 12, children: [], name: "Section 2", appID: 1 },
|
||||
13: { id: 13, children: [], name: "Section 3", appID: 1 },
|
||||
};
|
||||
baseConfig.serverData.menus = newMenus;
|
||||
|
||||
// Force the parent width, to make this test independent of screen size
|
||||
const target = getFixture();
|
||||
target.style.width = "600px";
|
||||
|
||||
const env = await makeTestEnv(baseConfig);
|
||||
const navbar = await mount(MyNavbar, { env, target });
|
||||
assert.strictEqual(navbar.currentAppSections.length, 0, "0 app sub menus");
|
||||
assert.strictEqual(navbar.el.offsetWidth, 600);
|
||||
assert.strictEqual(adaptCount, 1);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount,
|
||||
0,
|
||||
"during adapt, render not triggered as the navbar has no app sub menus"
|
||||
);
|
||||
|
||||
// Force minimal width and dispatch window resize event
|
||||
navbar.el.style.width = "0%";
|
||||
window.dispatchEvent(new Event("resize"));
|
||||
await nextTick();
|
||||
assert.strictEqual(navbar.el.offsetWidth, 0);
|
||||
assert.strictEqual(adaptCount, 2);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount,
|
||||
0,
|
||||
"during adapt, render not triggered as the navbar has no app sub menus"
|
||||
);
|
||||
|
||||
// Set menu
|
||||
env.services.menu.setCurrentMenu(1);
|
||||
await nextTick();
|
||||
assert.strictEqual(navbar.currentAppSections.length, 3, "3 app sub menus");
|
||||
assert.strictEqual(
|
||||
navbar.currentAppSectionsExtra.length,
|
||||
3,
|
||||
"all app sub menus are inside the more menu"
|
||||
);
|
||||
assert.strictEqual(adaptCount, 3);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount,
|
||||
1,
|
||||
"during adapt, render triggered as the navbar does not have enough space for app sub menus"
|
||||
);
|
||||
|
||||
// Force 40% width and dispatch window resize event
|
||||
navbar.el.style.width = "40%";
|
||||
window.dispatchEvent(new Event("resize"));
|
||||
await nextTick();
|
||||
assert.strictEqual(
|
||||
navbar.currentAppSectionsExtra.length,
|
||||
3,
|
||||
"all app sub menus are STILL inside the more menu"
|
||||
);
|
||||
assert.strictEqual(adaptCount, 4);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount,
|
||||
1,
|
||||
"during adapt, render not triggered as the more menu dropdown is STILL the same"
|
||||
);
|
||||
|
||||
// Reset to full width and dispatch window resize event
|
||||
navbar.el.style.width = "100%";
|
||||
window.dispatchEvent(new Event("resize"));
|
||||
await nextTick();
|
||||
assert.strictEqual(navbar.currentAppSections.length, 3, "still 3 app sub menus");
|
||||
assert.strictEqual(
|
||||
navbar.currentAppSectionsExtra.length,
|
||||
0,
|
||||
"all app sub menus are NO MORE inside the more menu"
|
||||
);
|
||||
assert.strictEqual(adaptCount, 5);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount,
|
||||
2,
|
||||
"during adapt, render triggered as the more menu dropdown is NO MORE the same"
|
||||
);
|
||||
|
||||
navbar.destroy();
|
||||
}
|
||||
|
||||
const newMenus = {
|
||||
root: { id: "root", children: [1], name: "root", appID: "root" },
|
||||
1: { id: 1, children: [11, 12, 13], name: "App1", appID: 1 },
|
||||
11: { id: 11, children: [], name: "Section 1", appID: 1 },
|
||||
12: { id: 12, children: [], name: "Section 2", appID: 1 },
|
||||
13: { id: 13, children: [], name: "Section 3", appID: 1 },
|
||||
};
|
||||
baseConfig.serverData.menus = newMenus;
|
||||
|
||||
// Force the parent width, to make this test independent of screen size
|
||||
const target = getFixture();
|
||||
target.style.width = "600px";
|
||||
|
||||
const env = await makeTestEnv(baseConfig);
|
||||
const navbar = await mount(MyNavbar, { env, target });
|
||||
assert.strictEqual(navbar.currentAppSections.length, 0, "0 app sub menus");
|
||||
assert.strictEqual(navbar.el.offsetWidth, 600);
|
||||
assert.strictEqual(adaptCount, 1);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount, 0,
|
||||
"during adapt, render not triggered as the navbar has no app sub menus"
|
||||
);
|
||||
|
||||
// Force minimal width and dispatch window resize event
|
||||
navbar.el.style.width = "0%";
|
||||
window.dispatchEvent(new Event("resize"));
|
||||
await nextTick();
|
||||
assert.strictEqual(navbar.el.offsetWidth, 0);
|
||||
assert.strictEqual(adaptCount, 2);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount, 0,
|
||||
"during adapt, render not triggered as the navbar has no app sub menus"
|
||||
);
|
||||
|
||||
// Set menu
|
||||
env.services.menu.setCurrentMenu(1);
|
||||
await nextTick();
|
||||
assert.strictEqual(navbar.currentAppSections.length, 3, "3 app sub menus");
|
||||
assert.strictEqual(
|
||||
navbar.currentAppSectionsExtra.length, 3,
|
||||
"all app sub menus are inside the more menu"
|
||||
);
|
||||
assert.strictEqual(adaptCount, 3);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount, 1,
|
||||
"during adapt, render triggered as the navbar does not have enough space for app sub menus"
|
||||
);
|
||||
|
||||
// Force 40% width and dispatch window resize event
|
||||
navbar.el.style.width = "40%";
|
||||
window.dispatchEvent(new Event("resize"));
|
||||
await nextTick();
|
||||
assert.strictEqual(
|
||||
navbar.currentAppSectionsExtra.length, 3,
|
||||
"all app sub menus are STILL inside the more menu"
|
||||
);
|
||||
assert.strictEqual(adaptCount, 4);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount, 1,
|
||||
"during adapt, render not triggered as the more menu dropdown is STILL the same"
|
||||
);
|
||||
|
||||
// Reset to full width and dispatch window resize event
|
||||
navbar.el.style.width = "100%";
|
||||
window.dispatchEvent(new Event("resize"));
|
||||
await nextTick();
|
||||
assert.strictEqual(navbar.currentAppSections.length, 3, "still 3 app sub menus");
|
||||
assert.strictEqual(
|
||||
navbar.currentAppSectionsExtra.length, 0,
|
||||
"all app sub menus are NO MORE inside the more menu"
|
||||
);
|
||||
assert.strictEqual(adaptCount, 5);
|
||||
assert.strictEqual(
|
||||
adaptRenderCount, 2,
|
||||
"during adapt, render triggered as the more menu dropdown is NO MORE the same"
|
||||
);
|
||||
|
||||
navbar.destroy();
|
||||
});
|
||||
);
|
||||
|
||||
QUnit.test("'more' menu sections properly updated on app change", async (assert) => {
|
||||
const newMenus = {
|
||||
|
||||
Reference in New Issue
Block a user