feat: P2.3 Folder Sharing + P2.5 Email Import + P2.6 Contact Import + P2.7 Free/Busy

- P2.3: Folder sharing system — ShareFolderDialog, sharing-store, sharing-settings
- P2.5: Email import (.eml, .tgz, .zip) with dedup and progress
- P2.6: Contact import (vCard + CSV) with auto-mapping
- P2.7: Free/Busy view grid with color-coded slots
This commit is contained in:
Bernd Rodler
2026-08-07 13:32:33 +02:00
parent 83e29b3ef1
commit e7acf56753
21 changed files with 3321 additions and 43 deletions
@@ -21,6 +21,7 @@ import {
FolderX,
RefreshCw,
Upload,
Share2,
} from "lucide-react";
interface Position {
@@ -86,6 +87,7 @@ interface MailboxContextMenuProps {
onRenameFolder?: (mailboxId: string) => void;
onDeleteFolder?: (mailboxId: string) => void;
onImportEmail?: (mailboxId: string) => void;
onShareFolder?: (mailboxId: string) => void;
onRefresh?: () => void;
}
@@ -105,6 +107,7 @@ export function MailboxContextMenu({
onRenameFolder,
onDeleteFolder,
onImportEmail,
onShareFolder,
onRefresh,
}: MailboxContextMenuProps) {
const t = useTranslations("mailbox_context_menu");
@@ -191,6 +194,12 @@ export function MailboxContextMenu({
onClick={() => handleAction(() => onRenameFolder?.(mailbox.id))}
disabled={!onRenameFolder || !canRename}
/>
<ContextMenuItem
icon={Share2}
label={t("share_folder")}
onClick={() => handleAction(() => onShareFolder?.(mailbox.id))}
disabled={!onShareFolder || mailbox.isShared}
/>
<ContextMenuSeparator />
+3
View File
@@ -90,6 +90,7 @@ interface SidebarProps {
onDeleteFolder?: (mailboxId: string) => void;
onImportEmail?: (mailboxId: string) => void;
onRefreshMailboxes?: () => void;
onShareFolder?: (mailboxId: string) => void;
scheduledTotal?: number;
showScheduledMailbox?: boolean;
/** True when the unified view spans multiple login accounts (cross-account).
@@ -779,6 +780,7 @@ export function Sidebar({
onDeleteFolder,
onImportEmail,
onRefreshMailboxes,
onShareFolder,
scheduledTotal = 0,
showScheduledMailbox = false,
crossAccountActive = false,
@@ -1452,6 +1454,7 @@ export function Sidebar({
onRenameFolder={onRenameFolder}
onDeleteFolder={onDeleteFolder}
onImportEmail={onImportEmail}
onShareFolder={onShareFolder}
onRefresh={onRefreshMailboxes}
/>
</div>