diff --git a/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js b/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js index f56197299bd..7e84745a94c 100644 --- a/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js +++ b/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js @@ -132,10 +132,15 @@ export class CalendarFilterPanel extends Component { if (a.type === b.type) { const va = a.value ? -1 : 0; const vb = b.value ? -1 : 0; + //Condition to put unvaluable item (eg: Open Shifts) at the end of the sorted list. if (a.type === "dynamic" && va !== vb) { return va - vb; } - return b.label.localeCompare(a.label); + return a.label.localeCompare(b.label, undefined, { + numeric: true, + sensitivity: "base", + ignorePunctuation: true, + }); } else { return this.getFilterTypePriority(a.type) - this.getFilterTypePriority(b.type); } diff --git a/addons/web/static/src/views/calendar/mobile_filter_panel/calendar_mobile_filter_panel.js b/addons/web/static/src/views/calendar/mobile_filter_panel/calendar_mobile_filter_panel.js index c6c06252913..adb04c0e58f 100644 --- a/addons/web/static/src/views/calendar/mobile_filter_panel/calendar_mobile_filter_panel.js +++ b/addons/web/static/src/views/calendar/mobile_filter_panel/calendar_mobile_filter_panel.js @@ -18,10 +18,15 @@ export class CalendarMobileFilterPanel extends Component { if (a.type === b.type) { const va = a.value ? -1 : 0; const vb = b.value ? -1 : 0; + //Condition to put unvaluable item (eg: Open Shifts) at the end of the sorted list. if (a.type === "dynamic" && va !== vb) { return va - vb; } - return b.label.localeCompare(a.label); + return a.label.localeCompare(b.label, undefined, { + numeric: true, + sensitivity: "base", + ignorePunctuation: true, + }); } else { return this.getFilterTypePriority(a.type) - this.getFilterTypePriority(b.type); } diff --git a/addons/web/static/tests/views/calendar/calendar_filter_panel_tests.js b/addons/web/static/tests/views/calendar/calendar_filter_panel_tests.js index d34363a45cb..382745065b3 100644 --- a/addons/web/static/tests/views/calendar/calendar_filter_panel_tests.js +++ b/addons/web/static/tests/views/calendar/calendar_filter_panel_tests.js @@ -47,13 +47,13 @@ QUnit.module("CalendarView - FilterPanel", ({ beforeEach }) => { assert.containsN(sections[0], ".o_calendar_filter_item", 4); assert.strictEqual( sections[0].textContent.trim(), - "AttendeesMitchell AdminMarc DemoBrandon FreemanEverybody's calendar" + "AttendeesMitchell AdminBrandon FreemanMarc DemoEverybody's calendar" ); header = sections[1].querySelector(".o_cw_filter_label"); assert.strictEqual(header.textContent, "Users"); assert.containsN(sections[1], ".o_calendar_filter_item", 2); - assert.strictEqual(sections[1].textContent.trim(), "UsersMarc DemoBrandon Freeman"); + assert.strictEqual(sections[1].textContent.trim(), "UsersBrandon FreemanMarc Demo"); }); QUnit.test("section can collapse", async (assert) => { @@ -101,12 +101,12 @@ QUnit.module("CalendarView - FilterPanel", ({ beforeEach }) => { assert.hasAttrValue( filters[1].querySelector(".o_cw_filter_avatar"), "data-src", - "/web/image/res.partner/6/avatar_128" + "/web/image/res.partner/4/avatar_128" ); assert.hasAttrValue( filters[2].querySelector(".o_cw_filter_avatar"), "data-src", - "/web/image/res.partner/4/avatar_128" + "/web/image/res.partner/6/avatar_128" ); }); @@ -148,7 +148,7 @@ QUnit.module("CalendarView - FilterPanel", ({ beforeEach }) => { await click(filters[1], ".o_calendar_filter_item .o_remove"); await click(filters[2], ".o_calendar_filter_item .o_remove"); - assert.verifySteps(["partner_ids 2", "partner_ids 1"]); + assert.verifySteps(["partner_ids 1", "partner_ids 2"]); }); QUnit.test("click on filter", async (assert) => { @@ -172,8 +172,8 @@ QUnit.module("CalendarView - FilterPanel", ({ beforeEach }) => { await click(filters[3], "input"); assert.verifySteps([ "partner_ids 3 false", - "partner_ids 6 true", "partner_ids 4 false", + "partner_ids 6 true", "partner_ids all true", "partner_ids all false", ]); diff --git a/addons/web/static/tests/views/calendar/calendar_view_tests.js b/addons/web/static/tests/views/calendar/calendar_view_tests.js index fd15ac4a6a3..5d5e9ac5efc 100644 --- a/addons/web/static/tests/views/calendar/calendar_view_tests.js +++ b/addons/web/static/tests/views/calendar/calendar_view_tests.js @@ -460,7 +460,7 @@ QUnit.module("Views", ({ beforeEach }) => { "should display 7 events ('event 5' counts for 2 because it spans two weeks and thus generate two fc-event elements)" ); await click(target.querySelectorAll(".o_calendar_filter input[type=checkbox]")[1]); // click on partner 2 - assert.containsN(target, ".fc-event", 5, "should now only display 5 event"); + assert.containsN(target, ".fc-event", 6, "should now only display 6 event"); await click(target.querySelectorAll(".o_calendar_filter input[type=checkbox]")[2]); assert.containsNone(target, ".fc-event", "should not display any event anymore"); // test search bar in filter @@ -577,7 +577,7 @@ QUnit.module("Views", ({ beforeEach }) => { [...section.querySelectorAll(".o_calendar_filter_item")].map((el) => el.textContent.trim() ), - ["partner 2", "partner 1", "Everything"] + ["partner 1", "partner 2", "Everything"] ); // Open the autocomplete dropdown @@ -659,7 +659,7 @@ QUnit.module("Views", ({ beforeEach }) => { [...section.querySelectorAll(".o_calendar_filter_item")].map((el) => el.textContent.trim() ), - ["partner 2", "partner 1", "foo partner 5", "Everything"] + ["foo partner 5", "partner 1", "partner 2", "Everything"] ); assert.strictEqual(input.value, ""); @@ -740,7 +740,7 @@ QUnit.module("Views", ({ beforeEach }) => { [...section.querySelectorAll(".o_calendar_filter_item")].map((el) => el.textContent.trim() ), - ["partner 2", "partner 1", "foo partner 5", "Everything"] + ["foo partner 5", "partner 1", "partner 2", "Everything"] ); assert.strictEqual(input.value, ""); }); @@ -2604,7 +2604,7 @@ QUnit.module("Views", ({ beforeEach }) => { [...section.querySelectorAll(".o_calendar_filter_item")].map((el) => el.textContent.trim() ), - ["Forest", "Desert", "Undefined"] + ["Desert", "Forest", "Undefined"] ); }); @@ -4988,9 +4988,9 @@ QUnit.module("Views", ({ beforeEach }) => { await clickEvent(target, 1); assert.deepEqual( - [...target.querySelectorAll(".o_popover [name='properties'] .o_card_property_field")].map( - (el) => el.textContent - ), + [ + ...target.querySelectorAll(".o_popover [name='properties'] .o_card_property_field"), + ].map((el) => el.textContent), ["hello", "B"] ); }); @@ -5374,4 +5374,56 @@ QUnit.module("Views", ({ beforeEach }) => { assert.verifySteps(["scale_year"]); }); }); + + QUnit.test("calendar sidebar filters are ASC sorted (not valued @end)", async (assert) => { + patchDate(2023, 11, 14, 9, 0, 0); + serverData.models.event.records = []; + for (let i = 1; i <= 18; i++) { + serverData.models.event.records.push({ + user_id: i, + name: `event ${i}`, + start: "2023-12-11 00:00:00", + stop: "2023-12-11 00:00:00", + }); + } + serverData.models.event.records.push({ + name: `event X`, + start: "2023-12-11 00:00:00", + stop: "2023-12-11 00:00:00", + }); + serverData.models.user.records = [ + { id: 1, display_name: "Zoooro" }, + { id: 2, display_name: "Jean-Paul 1" }, + { id: 3, display_name: "Jean-Paul 2" }, + { id: 4, display_name: "Jeremy" }, + { id: 5, display_name: "Kévin" }, + { id: 6, display_name: "Romelü" }, + { id: 7, display_name: "Edên" }, + { id: 8, display_name: "Thibaùlt" }, + { id: 9, display_name: "1 - brol" }, + { id: 10, display_name: "10 - machin" }, + { id: 11, display_name: "11 - chose" }, + { id: 12, display_name: "101" }, + { id: 13, display_name: "100 - bidule" }, + { id: 14, display_name: "1000 - truc" }, + { id: 15, display_name: "00 - bazar" }, + { id: 16, display_name: "0 - chouette" }, + { id: 17, display_name: "@Hello" }, + { id: 18, display_name: "#Hello" }, + ]; + await makeView({ + type: "calendar", + resModel: "event", + serverData, + arch: ` + + + + `, + }); + assert.strictEqual( + target.querySelector(".o_calendar_filter_items").textContent, + "00 - bazar0 - chouette1 - brol10 - machin11 - chose100 - bidule1011000 - trucEdên@Hello#HelloJean-Paul 1Jean-Paul 2JeremyKévinRomelüThibaùltZoooroUndefined" + ); + }); });