From 61b9d2958e58bdde1934d336ae960e503dbd2e7d Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Thu, 30 Jul 2026 16:03:11 +0200 Subject: [PATCH] feat: mail group panel with date day/week/month/year grouping options --- .../src/components/mail/MailGroupPanel.tsx | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/mail/MailGroupPanel.tsx b/frontend/src/components/mail/MailGroupPanel.tsx index cc7698a..28d56ad 100644 --- a/frontend/src/components/mail/MailGroupPanel.tsx +++ b/frontend/src/components/mail/MailGroupPanel.tsx @@ -22,7 +22,10 @@ const GROUP_FIELDS: GroupFieldDef[] = [ { key: 'is_read', label: 'Gelesen', type: 'text', group: 'Allgemein' }, { key: 'is_flagged', label: 'Markiert', type: 'text', group: 'Allgemein' }, { key: 'has_attachments', label: 'Anhänge', type: 'text', group: 'Allgemein' }, - { key: 'date', label: 'Datum', type: 'date', group: 'Metadaten' }, + { key: 'date_day', label: 'Datum (Tag)', type: 'date', group: 'Datum' }, + { key: 'date_week', label: 'Kalenderwoche', type: 'date', group: 'Datum' }, + { key: 'date_month', label: 'Monat', type: 'date', group: 'Datum' }, + { key: 'date_year', label: 'Jahr', type: 'date', group: 'Datum' }, ]; export interface GroupCondition { @@ -39,6 +42,26 @@ export const emptyGroupState: GroupState = { }; function getFieldValue(mail: any, field: string): any { + // Virtual date grouping fields + if (field === 'date_day') { + const d = new Date(mail.date); + return d.toISOString().split('T')[0]; // YYYY-MM-DD + } + if (field === 'date_week') { + const d = new Date(mail.date); + const onejan = new Date(d.getFullYear(), 0, 1); + const week = Math.ceil(((d.getTime() - onejan.getTime()) / 86400000 + onejan.getDay() + 1) / 7); + return `KW ${week} ${d.getFullYear()}`; + } + if (field === 'date_month') { + const d = new Date(mail.date); + const months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']; + return `${months[d.getMonth()]} ${d.getFullYear()}`; + } + if (field === 'date_year') { + const d = new Date(mail.date); + return String(d.getFullYear()); + } return (mail as any)[field]; }