From 6e8e85b77946aba11e8219cd636deff3ec37bed8 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 30 Mar 2022 15:58:47 +0200 Subject: [PATCH 1/2] Sort calendars --- www/calendar/inner.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/www/calendar/inner.js b/www/calendar/inner.js index 80b5606f2..028167838 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -149,7 +149,18 @@ define([ dragBgColor: md.color, borderColor: md.color, }; - }).filter(Boolean); + }).filter(Boolean).sort(function (a, b) { + var c1 = APP.calendars[a.id]; + var c2 = APP.calendars[b.id]; + var team1 = c1.teams.sort()[0] || c1.roTeams.sort()[0]; + var team2 = c2.teams.sort()[0] || c2.roTeams.sort()[0]; + var t1 = Util.find(c1, ['content', 'metadata', 'title']) || ''; + var t2 = Util.find(c2, ['content', 'metadata', 'title']) || ''; + + return team1 > team2 ? 1 : + (team1 < team2 ? -1 : ( + t1 > t2 ? 1 : (t1 < t2 ? -1 : 0))); + }); }; var getSchedules = function () { var s = []; @@ -664,6 +675,12 @@ define([ var cal = APP.calendars[id] || {}; var teams = (cal.teams || []).map(function (tId) { return Number(tId); }); return teams.indexOf(typeof(teamId) !== "undefined" ? Number(teamId) : 1) !== -1; + }).sort(function (a, b) { + var c1 = APP.calendars[a] || {}; + var c2 = APP.calendars[b] || {}; + var t1 = Util.find(c1, ['content', 'metadata', 'title']) || ''; + var t2 = Util.find(c2, ['content', 'metadata', 'title']) || ''; + return t1 > t2 ? 1 : (t1 === t2 ? 0 : -1); }); }; var tempCalendars = filter(0); @@ -719,7 +736,7 @@ define([ editCalendar(); }).appendTo($newContainer); - Object.keys(privateData.teams).forEach(function (teamId) { + Object.keys(privateData.teams).sort().forEach(function (teamId) { var calendars = filter(teamId); if (!calendars.length) { return; } var team = privateData.teams[teamId]; From 5f94f06a732fc7df12990045a2285ab90c96ce38 Mon Sep 17 00:00:00 2001 From: ansuz Date: Thu, 31 Mar 2022 11:57:56 +0530 Subject: [PATCH 2/2] optimize calendar sorting --- www/calendar/inner.js | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/www/calendar/inner.js b/www/calendar/inner.js index 028167838..2789371ca 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -134,8 +134,9 @@ define([ }; - var getCalendars = function () { + var LOOKUP = {}; + var TEAMS = {}; return Object.keys(APP.calendars).map(function (id) { var c = APP.calendars[id]; if (c.hidden || c.restricted || c.loading) { return; } @@ -149,14 +150,19 @@ define([ dragBgColor: md.color, borderColor: md.color, }; - }).filter(Boolean).sort(function (a, b) { - var c1 = APP.calendars[a.id]; - var c2 = APP.calendars[b.id]; - var team1 = c1.teams.sort()[0] || c1.roTeams.sort()[0]; - var team2 = c2.teams.sort()[0] || c2.roTeams.sort()[0]; - var t1 = Util.find(c1, ['content', 'metadata', 'title']) || ''; - var t2 = Util.find(c2, ['content', 'metadata', 'title']) || ''; - + }).filter(Boolean).map(function (obj) { + var id = obj.id; + var cal = APP.calendars[id]; + var team = cal.teams.sort()[0] || cal.roTeams.sort()[0]; + var title = Util.find(cal, ['content', 'metadata', 'title']) || ''; + LOOKUP[id] = title; + TEAMS[id] = team; + return obj; + }).sort(function (a, b) { + var team1 = TEAMS[a.id]; + var team2 = TEAMS[b.id]; + var t1 = LOOKUP[a.id]; + var t2 = LOOKUP[b.id]; return team1 > team2 ? 1 : (team1 < team2 ? -1 : ( t1 > t2 ? 1 : (t1 < t2 ? -1 : 0))); @@ -671,15 +677,20 @@ define([ $calendars.empty(); var privateData = metadataMgr.getPrivateData(); var filter = function (teamId) { + var LOOKUP = {}; return Object.keys(APP.calendars || {}).filter(function (id) { var cal = APP.calendars[id] || {}; var teams = (cal.teams || []).map(function (tId) { return Number(tId); }); return teams.indexOf(typeof(teamId) !== "undefined" ? Number(teamId) : 1) !== -1; + }).map(function (k) { + // nearly constant-time pre-sort + var cal = APP.calendars[k] || {}; + var title = Util.find(cal, ['content', 'metadata', 'title']) || ''; + LOOKUP[k] = title; + return k; }).sort(function (a, b) { - var c1 = APP.calendars[a] || {}; - var c2 = APP.calendars[b] || {}; - var t1 = Util.find(c1, ['content', 'metadata', 'title']) || ''; - var t2 = Util.find(c2, ['content', 'metadata', 'title']) || ''; + var t1 = LOOKUP[a]; + var t2 = LOOKUP[b]; return t1 > t2 ? 1 : (t1 === t2 ? 0 : -1); }); };