function showRecentChanges() { $("#recentChangesDialog").dialog({ modal: true, width: 400, height: 700 }); $.ajax({ url: baseApiUrl + 'recent-changes/', type: 'GET', success: function (result) { const groupedByDate = new Map(); const dayCache = {}; for (const row of result) { if (row.encryption > 0) { if (isEncryptionAvailable()) { row.note_title = decryptString(row.note_title); } else { row.note_title = "[encrypted]"; } } let dateDay = getDateFromTS(row.date_modified); dateDay.setHours(0); dateDay.setMinutes(0); dateDay.setSeconds(0); dateDay.setMilliseconds(0); // this stupidity is to make sure that we always use the same day object because Map uses only // reference equality if (dayCache[dateDay]) { dateDay = dayCache[dateDay]; } else { dayCache[dateDay] = dateDay; } if (!groupedByDate.has(dateDay)) { groupedByDate.set(dateDay, []); } groupedByDate.get(dateDay).push(row); } for (const [dateDay, dayChanges] of groupedByDate) { const changesListEl = $('