feat: mail phase 3 - sorting (date/from/subject, asc/desc)

- Add sort_by and sort_order query params to list_mails endpoint
- Add deleted_at IS NULL filter to exclude soft-deleted mails
- Frontend: sort state in Mail.tsx, sort header bar in MailList
- Sort dropdown (Datum/Absender/Betreff) + asc/desc toggle
- fetchMails API accepts optional sortBy/sortOrder params
- i18n: 6 new sort keys (de/en)
This commit is contained in:
Agent Zero
2026-07-15 20:17:27 +02:00
parent ed1eec87dc
commit 4e100e9d33
6 changed files with 101 additions and 9 deletions
+18 -2
View File
@@ -78,6 +78,8 @@ export function MailPage() {
const [activeView, setActiveView] = useState<'folders' | 'list' | 'detail'>('folders');
const [selectedMailIds, setSelectedMailIds] = useState<Set<string>>(new Set());
const [showMoveDropdown, setShowMoveDropdown] = useState(false);
const [sortBy, setSortBy] = useState<'date' | 'from' | 'subject'>('date');
const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc');
// Load accounts
const loadAccounts = useCallback(async () => {
@@ -150,7 +152,7 @@ export function MailPage() {
setMails(result.mails);
setMailsTotal(result.total);
} else {
const result = await fetchMails(selectedFolderId, mailsPage);
const result = await fetchMails(selectedFolderId, mailsPage, sortBy, sortOrder);
setMails(result.mails);
setMailsTotal(result.total);
}
@@ -160,7 +162,7 @@ export function MailPage() {
setMails([]);
}
setLoadingMails(false);
}, [selectedFolderId, mailsPage, searchQuery]);
}, [selectedFolderId, mailsPage, searchQuery, sortBy, sortOrder]);
useEffect(() => {
loadMails();
@@ -722,6 +724,13 @@ export function MailPage() {
selectedMailIds={selectedMailIds}
onToggleSelect={handleToggleSelect}
onSelectAll={handleSelectAll}
sortBy={sortBy}
sortOrder={sortOrder}
onSortChange={(by, order) => {
setSortBy(by);
setSortOrder(order);
setMailsPage(1);
}}
/>
</ResizablePanel>
@@ -792,6 +801,13 @@ export function MailPage() {
selectedMailIds={selectedMailIds}
onToggleSelect={handleToggleSelect}
onSelectAll={handleSelectAll}
sortBy={sortBy}
sortOrder={sortOrder}
onSortChange={(by, order) => {
setSortBy(by);
setSortOrder(order);
setMailsPage(1);
}}
/>
</div>
)}