diff --git a/frontend/src/components/calendar/CalendarDetail.tsx b/frontend/src/components/calendar/CalendarDetail.tsx index bdf31fa..38cd040 100644 --- a/frontend/src/components/calendar/CalendarDetail.tsx +++ b/frontend/src/components/calendar/CalendarDetail.tsx @@ -20,6 +20,7 @@ import { } from '@/api/calendar'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; +import { Calendar as CalendarIcon, Pencil, Trash2, X } from 'lucide-react'; function formatDate(dateStr: string | null | undefined): string { if (!dateStr) return '-'; @@ -139,9 +140,7 @@ export function CalendarDetail({ className="flex flex-col items-center justify-center h-full p-6 text-center" data-testid="calendar-detail-empty" > - +
{t('calendar.detail.noSelection')}
{t('calendar.detail.noSelectionHint')}
@@ -163,9 +162,7 @@ export function CalendarDetail({ aria-label={t('common.close')} data-testid="calendar-detail-close" > - + @@ -196,9 +193,7 @@ export function CalendarDetail({ className="inline-flex items-center justify-center gap-1.5 px-3 py-2 rounded-md text-xs font-medium bg-primary-50 text-primary-700 hover:bg-primary-100 min-h-touch" data-testid="calendar-detail-edit" > - + {t('calendar.detail.edit')} diff --git a/frontend/src/components/calendar/CalendarTree.tsx b/frontend/src/components/calendar/CalendarTree.tsx index 8c01884..4a9576a 100644 --- a/frontend/src/components/calendar/CalendarTree.tsx +++ b/frontend/src/components/calendar/CalendarTree.tsx @@ -10,6 +10,7 @@ import React, { useState } from 'react'; import clsx from 'clsx'; import { useTranslation } from 'react-i18next'; import type { Calendar, CalendarType } from '@/api/calendar'; +import { ChevronDown, Plus } from 'lucide-react'; const TYPE_ORDER: CalendarType[] = ['personal', 'team', 'project', 'company']; @@ -115,9 +116,7 @@ function TypeSection({ className="flex-shrink-0 w-4 h-4 flex items-center justify-center text-secondary-400 hover:text-secondary-600" aria-label={expanded ? 'Collapse' : 'Expand'} > - + {t(`calendar.type.${type}`)} {calendars.length} @@ -218,9 +217,7 @@ export function CalendarTree({ )} data-testid="calendar-tree-new" > - + {t('calendar.tree.newCalendar')} diff --git a/frontend/src/components/comm/blocks/ContactCardBlock.tsx b/frontend/src/components/comm/blocks/ContactCardBlock.tsx index 68ff166..e4b899b 100644 --- a/frontend/src/components/comm/blocks/ContactCardBlock.tsx +++ b/frontend/src/components/comm/blocks/ContactCardBlock.tsx @@ -1,5 +1,6 @@ import React from 'react'; import type { MessageBlock } from '@/store/commStore'; +import { ChevronRight } from 'lucide-react'; interface ContactCardBlockProps { block: MessageBlock; @@ -31,20 +32,7 @@ const ContactCardBlock: React.FC{contactName}
Kontakt anzeigen
- + ); }; diff --git a/frontend/src/components/comm/blocks/FileBlock.tsx b/frontend/src/components/comm/blocks/FileBlock.tsx index 02c4244..5c4c1ba 100644 --- a/frontend/src/components/comm/blocks/FileBlock.tsx +++ b/frontend/src/components/comm/blocks/FileBlock.tsx @@ -1,5 +1,6 @@ import React from 'react'; import type { MessageBlock } from '@/store/commStore'; +import { Download, FileText } from 'lucide-react'; interface FileBlockProps { block: MessageBlock; @@ -14,37 +15,11 @@ function formatFileSize(bytes: number | undefined): string { } const fileIcon = ( - + ); const downloadIcon = ( - + ); const FileBlock: React.FCMini-App: {appId}
diff --git a/frontend/src/components/contacts/ContactDetail.tsx b/frontend/src/components/contacts/ContactDetail.tsx index bc199e7..bee556a 100644 --- a/frontend/src/components/contacts/ContactDetail.tsx +++ b/frontend/src/components/contacts/ContactDetail.tsx @@ -6,6 +6,8 @@ import { EmptyState } from '@/components/ui/EmptyState'; import { Modal } from '@/components/ui/Modal'; import { Input } from '@/components/ui/Input'; import { useToast } from '@/components/ui/Toast'; + +import { Loader2 } from 'lucide-react'; import { type UnifiedContact, type ContactPerson, @@ -145,10 +147,7 @@ export function ContactDetail({ contact, loading, onEdit, onDeleted }: ContactDe if (loading) { return ({t('dms.noFileSelected')}
{t('dms.noFileSelectedHint')}
{t('dms.noFiles')}
{file.name}
{!isSmall && ( diff --git a/frontend/src/components/dms/FileGrid.tsx b/frontend/src/components/dms/FileGrid.tsx index a57f273..0acfc06 100644 --- a/frontend/src/components/dms/FileGrid.tsx +++ b/frontend/src/components/dms/FileGrid.tsx @@ -7,35 +7,9 @@ import React, { useMemo } from 'react'; import clsx from 'clsx'; import { useTranslation } from 'react-i18next'; import type { DmsFile } from '@/api/dms'; +import { Eye, FileText, Share2, Trash2 } from 'lucide-react'; -function getFileIcon(mimeType: string): { path: string; color: string } { - if (mimeType === 'application/pdf') { - return { path: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z', color: 'text-danger-500' }; - } - if (mimeType.startsWith('image/')) { - return { path: 'M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z', color: 'text-accent-500' }; - } - if (mimeType.includes('spreadsheet') || mimeType.includes('excel')) { - return { path: 'M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z', color: 'text-success-500' }; - } - if (mimeType.includes('presentation') || mimeType.includes('powerpoint')) { - return { path: 'M7 8h10M7 16h10M7 12h6m-7 8h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z', color: 'text-warning-500' }; - } - if (mimeType.startsWith('text/') || mimeType.includes('document') || mimeType.includes('word')) { - return { path: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z', color: 'text-primary-500' }; - } - if (mimeType.includes('zip') || mimeType.includes('compressed') || mimeType.includes('archive')) { - return { path: 'M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4', color: 'text-secondary-500' }; - } - return { path: 'M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z', color: 'text-secondary-400' }; -} - -function formatFileSize(bytes: number): string { - if (bytes < 1024) return `${bytes} B`; - if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; - if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; - return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; -} +import { getFileIcon, formatFileSize } from "./FileExplorer"; export interface FileGridProps { files: DmsFile[]; @@ -81,9 +55,7 @@ export function FileGrid({ if (files.length === 0) { return ({t('dms.noFiles')}
{file.name}
@@ -131,10 +101,7 @@ export function FileGrid({ aria-label={t('dms.preview')} title={t('dms.preview')} > - + diff --git a/frontend/src/components/dms/FilePreviewModal.tsx b/frontend/src/components/dms/FilePreviewModal.tsx index 437ea87..806323d 100644 --- a/frontend/src/components/dms/FilePreviewModal.tsx +++ b/frontend/src/components/dms/FilePreviewModal.tsx @@ -10,6 +10,7 @@ import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { getFilePreviewUrl, type DmsFile } from '@/api/dms'; +import { FileText } from 'lucide-react'; export interface FilePreviewModalProps { open: boolean; @@ -81,9 +82,7 @@ export function FilePreviewModal({ open, file, onClose }: FilePreviewModalProps) {!isPdf && !isImage && ({t('dms.preview')}
{t('dms.uploadDropHere')}
{uploads.length > 0 && ( diff --git a/frontend/src/components/layout/AISidebar.tsx b/frontend/src/components/layout/AISidebar.tsx index ff644cb..2c822a8 100644 --- a/frontend/src/components/layout/AISidebar.tsx +++ b/frontend/src/components/layout/AISidebar.tsx @@ -7,41 +7,30 @@ import { useUIStore } from '@/store/uiStore'; import { useTranslation } from 'react-i18next'; import { useUsers, useGroups } from '@/api/hooks'; import { Avatar } from '@/components/ui/Avatar'; +import { Bell, Bot, ChevronLeft, ChevronRight, Lightbulb, MessageSquare, Users, X } from 'lucide-react'; const robotIcon = (className: string) => ( - + ); const bellIcon = (className: string) => ( - + ); const bulbIcon = (className: string) => ( - + ); const teamIcon = (className: string) => ( - + ); const chatBubbleIcon = (className: string) => ( - + ); const chevronRightIcon = ( - + ); interface TabDef { @@ -94,9 +83,7 @@ function TeamPanel() { {groups.map((g) => ({g.name}
@@ -201,9 +188,7 @@ export function AISidebar() { aria-label="Benachrichtigung löschen" onClick={() => removeNotification(i)} > - +{g.name}
@@ -660,9 +643,7 @@ export function MessageSidebar() { aria-label="Zurück" data-testid="message-sidebar-back" > - + Zurück{att.filename}
{formatBytes(att.size_bytes)}
@@ -335,9 +332,7 @@ export function ComposeModal({ className="p-1 rounded hover:bg-secondary-200 text-secondary-500" aria-label={t('common.remove')} > - + ))} diff --git a/frontend/src/components/mail/LabelManager.tsx b/frontend/src/components/mail/LabelManager.tsx index 2d9b457..04d2aa6 100644 --- a/frontend/src/components/mail/LabelManager.tsx +++ b/frontend/src/components/mail/LabelManager.tsx @@ -10,6 +10,7 @@ import { Card } from '@/components/ui/Card'; import { EmptyState } from '@/components/ui/EmptyState'; import { useToast } from '@/components/ui/Toast'; import { ConfirmDialog } from '@/components/ui/ConfirmDialog'; +import { Loader2, X } from 'lucide-react'; import { fetchLabels, createLabel, @@ -81,10 +82,7 @@ export function LabelManager() { if (loading) { return ({decodeMimeHeader(att.filename)}
{formatBytes(att.size_bytes)}
diff --git a/frontend/src/components/mail/MailFolderTree.tsx b/frontend/src/components/mail/MailFolderTree.tsx index 81c314d..2fbe9d3 100644 --- a/frontend/src/components/mail/MailFolderTree.tsx +++ b/frontend/src/components/mail/MailFolderTree.tsx @@ -14,6 +14,7 @@ import type { MailAccount, MailFolder } from '@/api/mail'; import { emptyFolder } from '@/api/mail'; import { Badge } from '@/components/ui/Badge'; import { EmptyState } from '@/components/ui/EmptyState'; +import { ChevronRight, Folder, Loader2 } from 'lucide-react'; /** * Map IMAP folder names to German display names. @@ -88,23 +89,13 @@ function buildFolderTree(folders: MailFolder[], accountId: string): MailFolder[] function ChevronIcon({ expanded }: { expanded: boolean }) { return ( - + ); } function FolderIcon() { return ( - + ); } @@ -304,10 +295,7 @@ export function MailFolderTree({ accounts, folders, selectedFolderId, onSelect, if (loading) { return (