feat: mail group panel with date day/week/month/year grouping options

This commit is contained in:
Agent Zero
2026-07-30 16:03:11 +02:00
parent 679c6abc6d
commit 61b9d2958e
@@ -22,7 +22,10 @@ const GROUP_FIELDS: GroupFieldDef[] = [
{ key: 'is_read', label: 'Gelesen', type: 'text', group: 'Allgemein' }, { key: 'is_read', label: 'Gelesen', type: 'text', group: 'Allgemein' },
{ key: 'is_flagged', label: 'Markiert', type: 'text', group: 'Allgemein' }, { key: 'is_flagged', label: 'Markiert', type: 'text', group: 'Allgemein' },
{ key: 'has_attachments', label: 'Anhänge', 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 { export interface GroupCondition {
@@ -39,6 +42,26 @@ export const emptyGroupState: GroupState = {
}; };
function getFieldValue(mail: any, field: string): any { 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]; return (mail as any)[field];
} }