From d2afcf578d81e54b650f5fd6c29c44ef1736558c Mon Sep 17 00:00:00 2001 From: greta Date: Wed, 17 Sep 2025 14:22:09 +0200 Subject: [PATCH 1/2] fix: list separators depending on sort by date Signed-off-by: greta --- src/components/Mailbox.vue | 3 +- src/components/MailboxThread.vue | 53 +++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/components/Mailbox.vue b/src/components/Mailbox.vue index d155b9fb94..fa05e952a9 100644 --- a/src/components/Mailbox.vue +++ b/src/components/Mailbox.vue @@ -579,8 +579,9 @@ export default { return t('mail', 'Last week') case 'lastMonth': return t('mail', 'Last month') + default: + return group } - return t('mail', 'Older') }, }, } diff --git a/src/components/MailboxThread.vue b/src/components/MailboxThread.vue index e07337a9ef..9f0297e4c4 100644 --- a/src/components/MailboxThread.vue +++ b/src/components/MailboxThread.vue @@ -297,7 +297,10 @@ export default { }, groupEnvelopes() { const allEnvelopes = this.mainStore.getEnvelopes(this.mailbox.databaseId, this.searchQuery) - return this.groupEnvelopesByDate(allEnvelopes, this.mainStore.syncTimestamp) + return this.groupEnvelopesByDate(allEnvelopes, this.mainStore.syncTimestamp, this.sortOrder) + }, + sortOrder() { + return this.mainStore.getPreference('sort-order', 'newest') }, }, watch: { @@ -335,8 +338,9 @@ export default { clearTimeout(this.startMailboxTimer) }, methods: { - groupEnvelopesByDate(envelopes, syncTimestamp) { + groupEnvelopesByDate(envelopes, syncTimestamp, sortOrder = 'newest') { const now = new Date(syncTimestamp) + const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000) const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()) const startOfYesterday = new Date(startOfToday) @@ -352,11 +356,14 @@ export default { yesterday: [], lastWeek: [], lastMonth: [], - older: [], } + const monthsMap = {} + const yearsMap = {} + for (const envelope of envelopes) { const date = new Date(envelope.dateInt * 1000) + if (date >= oneHourAgo) { groups.lastHour.push(envelope) } else if (date >= startOfToday) { @@ -367,13 +374,49 @@ export default { groups.lastWeek.push(envelope) } else if (date >= startOfLastMonth) { groups.lastMonth.push(envelope) + } else if (date.getFullYear() === now.getFullYear()) { + const m = date.getMonth() + monthsMap[m] = monthsMap[m] || [] + monthsMap[m].push(envelope) } else { - groups.older.push(envelope) + const y = date.getFullYear() + yearsMap[y] = yearsMap[y] || [] + yearsMap[y].push(envelope) } } + const orderByDate = (a, b) => + this.sortOrder === 'newest' ? b.dateInt - a.dateInt : a.dateInt - b.dateInt + + Object.values(groups).forEach(list => list.sort(orderByDate)) + Object.values(monthsMap).forEach(list => list.sort(orderByDate)) + Object.values(yearsMap).forEach(list => list.sort(orderByDate)) + + const groupOrder = [] + + const fixedGroups = ['lastHour', 'today', 'yesterday', 'lastWeek', 'lastMonth'] + groupOrder.push(...(this.sortOrder === 'newest' ? fixedGroups : fixedGroups.reverse())) + + const monthOrder = Object.keys(monthsMap).map(Number) + monthOrder.sort((a, b) => (this.sortOrder === 'newest' ? b - a : a - b)) + for (const m of monthOrder) { + const monthName = new Date(now.getFullYear(), m, 1) + .toLocaleString('default', { month: 'long' }) + groups[monthName] = monthsMap[m] + groupOrder.push(monthName) + } + + const yearKeys = Object.keys(yearsMap).map(Number) + yearKeys.sort((a, b) => (this.sortOrder === 'newest' ? b - a : a - b)) + for (const y of yearKeys) { + groups[String(y)] = yearsMap[y] + groupOrder.push(String(y)) + } + return Object.fromEntries( - Object.entries(groups).filter(([_, list]) => list.length > 0), + groupOrder + .filter(label => groups[label] && groups[label].length > 0) + .map(label => [label, groups[label]]), ) }, async fetchEnvelopes() { From 72206d8a7de0f12b95b4f25dd160bc55e1f9be38 Mon Sep 17 00:00:00 2001 From: greta Date: Thu, 25 Sep 2025 10:50:43 +0200 Subject: [PATCH 2/2] fixup! fix: list separators depending on sort by date Signed-off-by: greta --- src/components/MailboxThread.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/MailboxThread.vue b/src/components/MailboxThread.vue index 9f0297e4c4..1b96a65465 100644 --- a/src/components/MailboxThread.vue +++ b/src/components/MailboxThread.vue @@ -338,7 +338,7 @@ export default { clearTimeout(this.startMailboxTimer) }, methods: { - groupEnvelopesByDate(envelopes, syncTimestamp, sortOrder = 'newest') { + groupEnvelopesByDate(envelopes, syncTimestamp) { const now = new Date(syncTimestamp) const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000) @@ -376,11 +376,11 @@ export default { groups.lastMonth.push(envelope) } else if (date.getFullYear() === now.getFullYear()) { const m = date.getMonth() - monthsMap[m] = monthsMap[m] || [] + monthsMap[m] ??= [] monthsMap[m].push(envelope) } else { const y = date.getFullYear() - yearsMap[y] = yearsMap[y] || [] + yearsMap[y] ??= [] yearsMap[y].push(envelope) } } @@ -395,7 +395,7 @@ export default { const groupOrder = [] const fixedGroups = ['lastHour', 'today', 'yesterday', 'lastWeek', 'lastMonth'] - groupOrder.push(...(this.sortOrder === 'newest' ? fixedGroups : fixedGroups.reverse())) + groupOrder.push(...(this.sortOrder === 'newest' ? fixedGroups : fixedGroups.toReversed())) const monthOrder = Object.keys(monthsMap).map(Number) monthOrder.sort((a, b) => (this.sortOrder === 'newest' ? b - a : a - b))