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:
+29
-22
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user