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
+16
View File
@@ -35,6 +35,8 @@ import {
SwatchBook,
Download,
Sparkles,
Upload,
Share2,
X,
type LucideIcon,
} from 'lucide-react';
@@ -71,6 +73,8 @@ import { PluginsSettings } from '@/components/settings/plugins-settings';
import { AiAssistantSettings } from '@/components/settings/ai-assistant-settings';
import { PluginIframeSlot } from '@/components/plugins/plugin-iframe-slot';
import { offersForSlot as pluginOffersForSlot, subscribe as pluginRegistrySubscribe, get as getActivePlugin } from '@/lib/plugin-sandbox/registry';
import { ImportSettings } from '@/components/settings/import-settings';
import { SharingSettings } from '@/components/settings/sharing-settings';
import { ProtocolHandlerSettings } from '@/components/settings/protocol-handler-settings';
import { useAuthStore, redirectToLogin } from '@/stores/auth-store';
import { useEmailStore } from '@/stores/email-store';
@@ -115,6 +119,8 @@ type Tab =
| 'about_data'
| 'themes'
| 'plugins'
| 'import'
| 'sharing'
| 'ai_assistant'
| 'debug';
@@ -159,6 +165,8 @@ const tabIcons: Record<Tab, LucideIcon> = {
about_data: Info,
themes: SwatchBook,
plugins: Puzzle,
import: Upload,
sharing: Share2,
ai_assistant: Sparkles,
debug: Bug,
};
@@ -243,6 +251,8 @@ const tabSearchPaths: Record<Tab, string[]> = {
themes: [],
plugins: [],
ai_assistant: [],
import: ['settings.importer'],
sharing: ['sharing'],
debug: ['settings.advanced'],
};
@@ -275,6 +285,8 @@ const tabKeywords: Record<Tab, string> = {
themes: 'custom theme css skin appearance',
plugins: 'extensions addons',
ai_assistant: 'assistant ask model llm ollama chatbot',
import: 'import email eml zip tgz mbox csv vcard contacts',
sharing: 'share shared folder calendar address book permission',
debug: 'logs developer console diagnostic',
};
@@ -624,6 +636,7 @@ export default function SettingsPage() {
{ id: 'account', label: t('tabs.account'), icon: tabIcons.account, group: 'general' },
{ id: 'language', label: t('tabs.language'), icon: tabIcons.language, group: 'general' },
{ id: 'notifications', label: t('tabs.notifications'), icon: tabIcons.notifications, group: 'general' },
{ id: 'sharing', label: t('tabs.sharing'), icon: tabIcons.sharing, group: 'general' },
{ id: 'protocol_handlers', label: t('tabs.protocol_handlers'), icon: tabIcons.protocol_handlers, group: 'general' },
// Appearance
@@ -641,6 +654,7 @@ export default function SettingsPage() {
...(supportsSieve ? [{ id: 'filters' as Tab, label: t('tabs.filters'), icon: tabIcons.filters, group: 'mail' as TabGroup }] : []),
...(isFeatureEnabled('templatesEnabled') ? [{ id: 'templates' as Tab, label: t('tabs.templates'), icon: tabIcons.templates, group: 'mail' as TabGroup }] : []),
{ id: 'folders', label: t('tabs.folders'), icon: tabIcons.folders, group: 'mail' },
{ id: 'import', label: t('tabs.import'), icon: tabIcons.import, group: 'mail' },
...(isFeatureEnabled('customKeywordsEnabled') ? [{ id: 'keywords' as Tab, label: t('tabs.keywords'), icon: tabIcons.keywords, group: 'mail' as TabGroup }] : []),
// Privacy & Security
@@ -772,6 +786,8 @@ export default function SettingsPage() {
{effectiveActiveTab === 'filters' && <FilterSettings />}
{effectiveActiveTab === 'templates' && <TemplateSettings />}
{effectiveActiveTab === 'folders' && <FolderSettings />}
{effectiveActiveTab === 'import' && <ImportSettings />}
{effectiveActiveTab === 'sharing' && <SharingSettings />}
{effectiveActiveTab === 'keywords' && <KeywordSettings />}
{effectiveActiveTab === 'security' && <AccountSecuritySettings />}
{effectiveActiveTab === 'content_senders' && <ContentSendersSettings />}