import React, { useState, useEffect, useRef } from 'react'; import { useAuth } from '../context/AuthContext'; import portalGuideService from '../services/portalGuideService'; import { toast } from 'react-toastify'; const CATEGORIES = ['Allgemein', 'IT', 'HR', 'Buchhaltung', 'Produktion', 'Verwaltung', 'Sonstiges']; const ICONS = ['πŸ“„', 'πŸ“˜', 'πŸ“—', 'πŸ“™', 'πŸ“•', 'πŸ“‹', 'πŸ–₯️', 'πŸ”§', 'πŸ“Š', 'πŸ›‘οΈ', '🌐', 'πŸ“±', 'πŸ”‘', 'βš™οΈ', '🏒']; const ROLE_GROUPS = [ { label: 'IT-Team', roles: ['super_admin', 'admin', 'support', 'bearbeiter'], icon: 'πŸ–₯️' }, { label: 'HR Personal', roles: ['hr_personal'], icon: 'πŸ§‘β€πŸ’Ό' }, { label: 'Buchhaltung', roles: ['buchhaltung'], icon: 'πŸ’Ά' }, { label: 'Produktion', roles: ['produktion', 'techniker'], icon: '🏭' }, { label: 'Benutzer', roles: ['benutzer'], icon: 'πŸ‘€' }, ]; export default function PortalPage() { const { isAdmin, isSuperAdmin } = useAuth(); const canAdmin = isAdmin() || isSuperAdmin(); const [guides, setGuides] = useState([]); const [loading, setLoading] = useState(true); const [categoryFilter, setCategoryFilter] = useState('all'); const [search, setSearch] = useState(''); // Modal state const [modal, setModal] = useState(null); // null | { mode: 'create'|'edit', guide? } const [saving, setSaving] = useState(false); const [form, setForm] = useState({ title: '', category: 'Allgemein', description: '', icon: 'πŸ“„', html_content: '', visible_roles: [] }); const fileInputRef = useRef(null); // Viewer state const [viewer, setViewer] = useState(null); // null | guide object const [viewerHtml, setViewerHtml] = useState(''); const load = async () => { try { const data = await portalGuideService.getAll(); setGuides(data); } catch { toast.error('Fehler beim Laden'); } finally { setLoading(false); } }; useEffect(() => { load(); }, []); const filtered = guides.filter(g => { const matchCat = categoryFilter === 'all' || g.category === categoryFilter; const q = search.toLowerCase(); const matchSearch = !q || g.title.toLowerCase().includes(q) || g.category.toLowerCase().includes(q) || (g.description || '').toLowerCase().includes(q); return matchCat && matchSearch; }); const categories = ['all', ...new Set(guides.map(g => g.category))]; const openCreate = () => { setForm({ title: '', category: 'Allgemein', description: '', icon: 'πŸ“„', html_content: '', visible_roles: [] }); setModal({ mode: 'create' }); }; const openEdit = async (g) => { const full = await portalGuideService.getById(g.id); let vr = []; try { vr = JSON.parse(full.visible_roles || '[]'); } catch {} setForm({ title: full.title, category: full.category, description: full.description || '', icon: full.icon || 'πŸ“„', html_content: full.html_content, visible_roles: vr }); setModal({ mode: 'edit', guide: g }); }; const openViewer = async (g) => { setViewer(g); setViewerHtml(''); try { const full = await portalGuideService.getById(g.id); setViewerHtml(full.html_content || ''); } catch { setViewerHtml('

Fehler beim Laden der Anleitung.

'); } }; const handleFileSelect = (e) => { const file = e.target.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onload = (ev) => { setForm(f => ({ ...f, html_content: ev.target.result, title: f.title || file.name.replace(/\.html?$/i, '') })); }; reader.readAsText(file, 'UTF-8'); }; const save = async () => { if (!form.title.trim()) return toast.error('Titel erforderlich'); if (!form.html_content.trim()) return toast.error('HTML-Inhalt fehlt'); setSaving(true); try { if (modal.mode === 'create') { await portalGuideService.create(form); toast.success('Anleitung erstellt'); } else { await portalGuideService.update(modal.guide.id, form); toast.success('Anleitung gespeichert'); } setModal(null); await load(); } catch (e) { toast.error(e.response?.data?.error || 'Fehler'); } finally { setSaving(false); } }; const remove = async (g) => { if (!window.confirm(`"${g.title}" wirklich lΓΆschen?`)) return; try { await portalGuideService.delete(g.id); toast.success('GelΓΆscht'); await load(); } catch { toast.error('Fehler beim LΓΆschen'); } }; // ── Viewer ─────────────────────────────────────────────────────────────── if (viewer) { return (
{/* Viewer Header */}
{viewer.icon}
{viewer.title}
{viewer.category}
{canAdmin && (
)}
{/* HTML Viewer */} {viewerHtml ? (