import { useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useWorkspaces, useCreateWorkspace, useUpdateWorkspace, useDeleteWorkspace, useSetWorkspaceModules, useAssignWorkspaceUser, useRemoveWorkspaceUser, type Workspace, type WorkspaceModule } from '@/api/hooks/workspaces'; import { usePluginStore } from '@/store/pluginStore'; import { LayoutGrid, Plus, Trash2, Edit, Users, Save, X, Check } from 'lucide-react'; // Static core menu items — same as Sidebar.tsx const CORE_MENU_ITEMS = [ { key: 'dashboard', label: 'Dashboard' }, { key: 'contacts', label: 'Kontakte' }, ]; export function WorkspaceManager() { const { t } = useTranslation(); const { data: wsData } = useWorkspaces(); const createWs = useCreateWorkspace(); const updateWs = useUpdateWorkspace(); const deleteWs = useDeleteWorkspace(); const setModules = useSetWorkspaceModules(); const manifests = usePluginStore(s => s.manifests); // Dynamically build available modules from core menu items + plugin manifests const availableModules = useMemo(() => { const pluginItems = manifests .flatMap(m => m.menu_items || []) .map(item => ({ key: item.path.replace(/^\//, '').split('/')[0], label: item.label || item.label_key, })); // Merge core + plugin, deduplicate by key const seen = new Set(); return [...CORE_MENU_ITEMS, ...pluginItems].filter(m => { if (seen.has(m.key)) return false; seen.add(m.key); return true; }); }, [manifests]); const [showCreate, setShowCreate] = useState(false); const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(''); const [editDesc, setEditDesc] = useState(''); const [editIcon, setEditIcon] = useState('LayoutGrid'); const [editDefault, setEditDefault] = useState(false); const [moduleWsId, setModuleWsId] = useState(null); const [moduleConfig, setModuleConfig] = useState([]); const [configEditingKey, setConfigEditingKey] = useState(null); const workspaces = wsData?.items || []; const handleCreate = async () => { await createWs.mutateAsync({ name: editName, icon: editIcon, description: editDesc, is_default: editDefault }); setShowCreate(false); setEditName(''); setEditDesc(''); setEditDefault(false); }; const handleSaveEdit = async () => { if (!editingId) return; await updateWs.mutateAsync({ id: editingId, name: editName, description: editDesc, is_default: editDefault }); setEditingId(null); }; const handleDelete = async (id: string) => { if (confirm('Workspace wirklich löschen?')) { await deleteWs.mutateAsync(id); } }; const openModuleEditor = (ws: Workspace) => { setModuleWsId(ws.id); const existing = ws.modules || []; setModuleConfig(availableModules.map(m => { const existingMod = existing.find(e => e.module_key === m.key); return { module_key: m.key, is_visible: existingMod?.is_visible ?? false, menu_order: existingMod?.menu_order ?? 0, config: existingMod?.config || {}, }; })); }; const saveModules = async () => { if (!moduleWsId) return; await setModules.mutateAsync({ workspaceId: moduleWsId, modules: moduleConfig }); setModuleWsId(null); }; const toggleModule = (key: string) => { setModuleConfig(prev => prev.map(m => m.module_key === key ? { ...m, is_visible: !m.is_visible } : m )); }; return (

{t('workspaces.title', 'Workspaces')}

{showCreate && (

{t('workspaces.createNew', 'Neuen Workspace erstellen')}

setEditName(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-900 text-sm" /> setEditDesc(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-900 text-sm" />
)} {moduleWsId && (

{t('workspaces.moduleConfig', 'Module konfigurieren')}

{moduleConfig.map(m => { const mod = availableModules.find(a => a.key === m.module_key); return (
{m.is_visible && configEditingKey === m.module_key && (