[FIX] web: order company by their sequence in the company switcher

As JS is not taking the properties in the order they are written,
the order in the rendering was always following the property name
sorting order (=id).

Previous to this commit:

    - The companies were ordered by their id in the company switcher as
      JS is not tacking the object properties order into account.

After this commit:

    - The companies will be sorted by their sequence prior to be used in the
      rendering.

task-2722235

closes odoo/odoo#81893

X-original-commit: 39c678a1ccb50d3a1871a4049a8df26427b27a3c
Signed-off-by: Laurent Stukkens (ltu) <ltu@odoo.com>
This commit is contained in:
Laurent Stukkens (LTU)
2021-12-24 12:25:01 +00:00
parent 6be63d1d81
commit 9ffb0143d0
4 changed files with 68 additions and 66 deletions
+1
View File
@@ -94,6 +94,7 @@ class Http(models.AbstractModel):
comp.id: {
'id': comp.id,
'name': comp.name,
'sequence': comp.sequence,
} for comp in user.company_ids
},
},
@@ -8,7 +8,7 @@
<t t-if="!env.isSmall"><t t-esc="currentCompany.name"/></t>
</span>
</t>
<t t-foreach="Object.values(companyService.availableCompanies)" t-as="company">
<t t-foreach="Object.values(companyService.availableCompanies).sort((c1, c2) => c1.sequence - c2.sequence)" t-as="company">
<t t-call="web.SwitchCompanyItem">
<t t-set="company" t-value="company" />
</t>
@@ -40,11 +40,11 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
hooks.beforeEach(() => {
patchWithCleanup(session.user_companies, {
allowed_companies: {
1: { id: 1, name: "Hermit" },
2: { id: 2, name: "Herman's" },
3: { id: 3, name: "Heroes TM" },
3: { id: 3, name: "Hermit", sequence: 1 },
2: { id: 2, name: "Herman's", sequence: 2 },
1: { id: 1, name: "Heroes TM", sequence: 3 },
},
current_company: 1,
current_company: 3,
});
serviceRegistry.add("ui", uiService);
serviceRegistry.add("company", companyService);
@@ -90,28 +90,28 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
const scMenu = await createSwitchCompanyMenu({ onPushState });
/**
* [x] **Company 1**
* [ ] Company 2
* [ ] Company 3
* [x] **Hermit**
* [ ] Herman's
* [ ] Heroes TM
*/
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 1);
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3);
await click(scMenu.el.querySelector(".dropdown-toggle"));
assert.containsN(scMenu.el, "[data-company-id]", 3);
assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1);
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2);
/**
* [x] **Company 1**
* [x] Company 2 -> toggle
* [ ] Company 3
* [x] **Hermit**
* [x] Herman's -> toggle
* [ ] Heroes TM
*/
await click(scMenu.el.querySelectorAll(".toggle_company")[1]);
assert.containsOnce(scMenu.el, ".dropdown-menu", "dropdown is still opened");
assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 2);
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 1);
await prom;
assert.verifySteps(["cids=1%2C2"]);
assert.verifySteps(["cids=3%2C2"]);
});
QUnit.test("can toggle multiple companies at once", async (assert) => {
@@ -125,21 +125,21 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
const scMenu = await createSwitchCompanyMenu({ onPushState }, 50);
/**
* [x] **Company 1**
* [ ] Company 2
* [ ] Company 3
* [x] **Hermit**
* [ ] Herman's
* [ ] Heroes TM
*/
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 1);
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3);
await click(scMenu.el.querySelector(".dropdown-toggle"));
assert.containsN(scMenu.el, "[data-company-id]", 3);
assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1);
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2);
/**
* [ ] **Company 1** -> toggle all
* [x] Company 2 -> toggle all
* [x] Company 3 -> toggle all
* [ ] **Hermit** -> toggle all
* [x] Herman's -> toggle all
* [x] Heroes TM -> toggle all
*/
await click(scMenu.el.querySelectorAll(".toggle_company")[0]);
await click(scMenu.el.querySelectorAll(".toggle_company")[1]);
@@ -150,7 +150,7 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
assert.verifySteps([]);
await prom; // await toggle promise
assert.verifySteps(["cids=2%2C3"]);
assert.verifySteps(["cids=2%2C1"]);
});
QUnit.test("single company selected: toggling it off will keep it", async (assert) => {
@@ -164,27 +164,27 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
const scMenu = await createSwitchCompanyMenu();
/**
* [x] **Company 1**
* [ ] Company 2
* [ ] Company 3
* [x] **Hermit**
* [ ] Herman's
* [ ] Heroes TM
*/
assert.deepEqual(scMenu.env.services.router.current.hash, { cids: 1 });
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 1);
assert.deepEqual(scMenu.env.services.router.current.hash, { cids: 3 });
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3);
await click(scMenu.el.querySelector(".dropdown-toggle"));
assert.containsN(scMenu.el, "[data-company-id]", 3);
assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1);
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2);
/**
* [ ] **Company 1** -> toggle off
* [ ] Company 2
* [ ] Company 3
* [ ] **Hermit** -> toggle off
* [ ] Herman's
* [ ] Heroes TM
*/
await click(scMenu.el.querySelectorAll(".toggle_company")[0]);
assert.deepEqual(scMenu.env.services.router.current.hash, { cids: 1 });
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 1);
assert.deepEqual(scMenu.env.services.router.current.hash, { cids: 3 });
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3);
assert.containsOnce(scMenu.el, ".dropdown-menu", "dropdown is still opened");
assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 0);
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 3);
@@ -199,21 +199,21 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
const scMenu = await createSwitchCompanyMenu({ onPushState });
/**
* [x] **Company 1**
* [ ] Company 2
* [ ] Company 3
* [x] **Hermit**
* [ ] Herman's
* [ ] Heroes TM
*/
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 1);
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3);
await click(scMenu.el.querySelector(".dropdown-toggle"));
assert.containsN(scMenu.el, "[data-company-id]", 3);
assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1);
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2);
/**
* [x] **Company 1**
* [ ] Company 2 -> log into
* [ ] Company 3
* [x] **Hermit**
* [ ] Herman's -> log into
* [ ] Heroes TM
*/
await click(scMenu.el.querySelectorAll(".log_into")[1]);
assert.containsNone(scMenu.el, ".dropdown-menu", "dropdown is directly closed");
@@ -230,9 +230,9 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
const scMenu = await createSwitchCompanyMenu({ onPushState });
/**
* [x] Company 1
* [ ] Company 2
* [x] **Company 3**
* [x] Hermit
* [ ] Herman's
* [x] **Heroes TM**
*/
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3, 1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3);
@@ -242,9 +242,9 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 1);
/**
* [x] Company 1
* [ ] Company 2 -> log into
* [x] **Company 3**
* [x] Hermit
* [ ] Herman's -> log into
* [x] **Heroes TM**
*/
await click(scMenu.el.querySelectorAll(".log_into")[1]);
assert.containsNone(scMenu.el, ".dropdown-menu", "dropdown is directly closed");
@@ -257,15 +257,15 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
function onPushState(url) {
assert.step(url.split("#")[1]);
}
Object.assign(browser.location, { hash: "cids=2%2C3" });
Object.assign(browser.location, { hash: "cids=2%2C1" });
const scMenu = await createSwitchCompanyMenu({ onPushState });
/**
* [ ] Company 1
* [x] **Company 2**
* [x] Company 3
* [ ] Hermit
* [x] **Herman's**
* [x] Heroes TM
*/
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [2, 3]);
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [2, 1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 2);
await click(scMenu.el.querySelector(".dropdown-toggle"));
assert.containsN(scMenu.el, "[data-company-id]", 3);
@@ -273,13 +273,13 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 1);
/**
* [ ] Company 1
* [x] **Company 2**
* [x] Company 3 -> log into
* [ ] Hermit
* [x] **Herman's**
* [x] Heroes TM -> log into
*/
await click(scMenu.el.querySelectorAll(".log_into")[2]);
assert.containsNone(scMenu.el, ".dropdown-menu", "dropdown is directly closed");
assert.verifySteps(["cids=3%2C2"]);
assert.verifySteps(["cids=1%2C2"]);
});
QUnit.test("companies can be logged in even if some toggled within delay", async (assert) => {
@@ -291,21 +291,21 @@ QUnit.module("SwitchCompanyMenu", (hooks) => {
const scMenu = await createSwitchCompanyMenu({ onPushState }, 50);
/**
* [x] **Company 1**
* [ ] Company 2
* [ ] Company 3
* [x] **Hermit**
* [ ] Herman's
* [ ] Heroes TM
*/
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [1]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 1);
assert.deepEqual(scMenu.env.services.company.allowedCompanyIds, [3]);
assert.strictEqual(scMenu.env.services.company.currentCompany.id, 3);
await click(scMenu.el.querySelector(".dropdown-toggle"));
assert.containsN(scMenu.el, "[data-company-id]", 3);
assert.containsN(scMenu.el, "[data-company-id] .fa-check-square", 1);
assert.containsN(scMenu.el, "[data-company-id] .fa-square-o", 2);
/**
* [ ] **Company 1** -> toggled
* [ ] Company 2 -> logged in
* [ ] Company 3 -> toggled
* [ ] **Hermit** -> toggled
* [ ] Herman's -> logged in
* [ ] Heroes TM -> toggled
*/
await click(scMenu.el.querySelectorAll(".toggle_company")[2]);
await click(scMenu.el.querySelectorAll(".toggle_company")[0]);
+1
View File
@@ -46,6 +46,7 @@ class TestSessionInfo(common.HttpCase):
str(company.id): {
'id': company.id,
'name': company.name,
'sequence': company.sequence,
} for company in self.companies
}
expected_user_companies = {