import { useState } from 'react'; import { Bookmark, Plus, Trash2, Check, Edit2, ChevronDown, Shield, BarChart3, Layers, Star } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { DashboardPreset, useDashboardPresets } from '@/hooks/useDashboardPresets'; import { DashboardWidget } from '@/pages/Dashboard'; import { toast } from '@/hooks/use-toast'; import { cn } from '@/lib/utils'; interface PresetManagerProps { currentWidgets: DashboardWidget[]; onLoadPreset: (widgets: DashboardWidget[]) => void; } const presetIcons: Record = { 'default': Layers, 'soc-analyst': Shield, 'executive': BarChart3, 'minimal': Star, }; const PresetManager = ({ currentWidgets, onLoadPreset }: PresetManagerProps) => { const { presets, activePreset, createPreset, updatePreset, deletePreset, loadPreset, setActivePreset } = useDashboardPresets(); const [saveDialogOpen, setSaveDialogOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [presetToDelete, setPresetToDelete] = useState(null); const [newPresetName, setNewPresetName] = useState(''); const [newPresetDescription, setNewPresetDescription] = useState(''); const handleLoadPreset = (presetId: string) => { const widgets = loadPreset(presetId); if (widgets) { onLoadPreset(widgets); const preset = presets.find(p => p.id === presetId); toast({ title: "Preset indlæst", description: `"${preset?.name}" er nu aktivt` }); } }; const handleSavePreset = () => { if (!newPresetName.trim()) { toast({ title: "Navn påkrævet", description: "Indtast et navn til preset", variant: "destructive" }); return; } createPreset(newPresetName.trim(), currentWidgets, newPresetDescription.trim() || undefined); toast({ title: "Preset gemt", description: `"${newPresetName}" er oprettet` }); setNewPresetName(''); setNewPresetDescription(''); setSaveDialogOpen(false); }; const handleUpdateActivePreset = () => { if (activePreset && !activePreset.isBuiltIn) { updatePreset(activePreset.id, currentWidgets); toast({ title: "Preset opdateret", description: `"${activePreset.name}" er opdateret` }); } }; const handleDeletePreset = () => { if (presetToDelete && !presetToDelete.isBuiltIn) { deletePreset(presetToDelete.id); toast({ title: "Preset slettet", description: `"${presetToDelete.name}" er slettet` }); setPresetToDelete(null); setDeleteDialogOpen(false); } }; const confirmDeletePreset = (preset: DashboardPreset) => { setPresetToDelete(preset); setDeleteDialogOpen(true); }; const userPresets = presets.filter(p => !p.isBuiltIn); const builtInPresets = presets.filter(p => p.isBuiltIn); return ( <>
Standard presets
{builtInPresets.map((preset) => { const Icon = presetIcons[preset.id] || Bookmark; return ( handleLoadPreset(preset.id)} className="flex items-center justify-between cursor-pointer" >
{preset.name}
{preset.description && (
{preset.description}
)}
{activePreset?.id === preset.id && ( )}
); })} {userPresets.length > 0 && ( <>
Mine presets
{userPresets.map((preset) => (
handleLoadPreset(preset.id)} >
{preset.name}
{preset.description && (
{preset.description}
)}
{activePreset?.id === preset.id && ( )}
))} )} setSaveDialogOpen(true)} className="cursor-pointer" > Gem som nyt preset {activePreset && !activePreset.isBuiltIn && ( Opdater "{activePreset.name}" )}
{/* Save Dialog */} Gem nyt preset Gem dit nuværende dashboard layout som et genbrugeligt preset
setNewPresetName(e.target.value)} className="bg-secondary/30 border-border" />
setNewPresetDescription(e.target.value)} className="bg-secondary/30 border-border" />
{currentWidgets.length} widgets vil blive gemt
{/* Delete Confirmation Dialog */} Slet preset Er du sikker på at du vil slette "{presetToDelete?.name}"? Denne handling kan ikke fortrydes. ); }; export default PresetManager;