feat: mail list font size, remove Termin toolbar, rename Flagge to Markierung with symbol picker

- Mail list: title and subject font text-xs -> text-sm
- Remove Termin (create-event) toolbar button
- Rename Flagge -> Markierung with select dropdown (star, flag, bookmark, important, question)
- Backend: add flag_type column to Mail model + migration 0006
- Backend: flag_type in MailFlagsUpdate schema, update_flags route, mail_to_response
- Frontend: flag_type in Mail interface, FlagUpdatePayload, MailList symbol display
This commit is contained in:
Agent Zero
2026-07-20 10:39:16 +02:00
parent 5fa3f0540b
commit 9da04057b9
8 changed files with 53 additions and 27 deletions
+29 -22
View File
@@ -340,6 +340,21 @@ export function MailPage() {
[toast],
);
// Handle set flag type (symbol picker)
const handleSetFlagType = useCallback(
async (mail: Mail, flagType: string) => {
try {
const isFlagged = flagType !== '';
await updateFlags(mail.id, { is_flagged: isFlagged, flag_type: flagType || null });
setSelectedMail((prev) => (prev ? { ...prev, is_flagged: isFlagged, flag_type: flagType || null } : prev));
setMails((prev) => prev.map((m) => (m.id === mail.id ? { ...m, is_flagged: isFlagged, flag_type: flagType || null } : m)));
} catch (err) {
toast.error(err instanceof Error ? err.message : String(err));
}
},
[toast],
);
// Handle toggle select for bulk operations
const handleToggleSelect = useCallback((mailId: string) => {
setSelectedMailIds((prev) => {
@@ -532,29 +547,21 @@ export function MailPage() {
{
id: 'flag',
plugin: 'mail',
label: 'Flagge',
label: 'Markierung',
group: 'mail-actions',
disabled: !hasMail,
active: selectedMailFlagged,
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 21v-4m0 0V5a2 2 0 012-2h6.5l1 1H21l-3 6 3 6h-8.5l-1-1H5a2 2 0 00-2 2zm9-13.5V9" />
</svg>
),
onClick: () => selectedMail && handleToggleFlag(selectedMail),
},
{
id: 'create-event',
plugin: 'mail',
label: 'Termin',
group: 'mail-actions',
disabled: !hasMail,
icon: (
<svg className="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
</svg>
),
onClick: () => selectedMail && handleCreateEvent(selectedMail),
type: 'select' as const,
selectValue: selectedMail?.flag_type || '',
selectOptions: [
{ value: '', label: 'Keine' },
{ value: 'star', label: '⭐ Stern' },
{ value: 'flag', label: '🚩 Flagge' },
{ value: 'bookmark', label: '🔖 Lesezeichen' },
{ value: 'important', label: '❗ Wichtig' },
{ value: 'question', label: '❓ Frage' },
],
onSelect: (value: string) => selectedMail && handleSetFlagType(selectedMail, value),
onClick: () => {},
},
{
id: 'delete',
@@ -667,7 +674,7 @@ export function MailPage() {
}
registerItems('mail', items);
return () => unregisterPlugin('mail');
}, [selectedMailId, selectedMailFlagged, selectedMailIds, handleSearch, handleCompose, handleReply, handleForward, handleToggleFlag, handleCreateEvent, handleDeleteMail, handleBulkDelete, handleBulkMarkRead, handleBulkMarkUnread, t]);
}, [selectedMailId, selectedMailFlagged, selectedMailIds, handleSearch, handleCompose, handleReply, handleForward, handleToggleFlag, handleSetFlagType, handleDeleteMail, handleBulkDelete, handleBulkMarkRead, handleBulkMarkUnread, t]);
if (loadingAccounts) {
return (