import DataSortModal from '@/components/data-sort-modal'; import DeleteModal from '@/components/inertia/delete-modal'; import Switch from '@/components/switch'; import Tabs from '@/components/tabs'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { router, useForm } from '@inertiajs/react'; import { ArrowUpDown, ChevronDown, Edit, ExternalLink, Plus, Settings, Trash2, X } from 'lucide-react'; import React, { useState } from 'react'; interface NavbarItemForm { type: string; slug: string; title: string; value: string; active: boolean; items: { title: string; url: string }[]; sort: number; [key: string]: any; } const NavbarEditor = ({ navbar }: { navbar: Navbar }) => { const navbarItems = navbar.navbar_items; const [activeType, setActiveType] = useState('url'); const [editingItem, setEditingItem] = useState(null); const [isFormOpen, setIsFormOpen] = useState(false); const { data, setData, post, put, processing } = useForm({ type: 'url', slug: '', title: '', value: '', items: [], active: true, sort: 0, }); // Filter items by type const filteredItems = navbarItems.filter((item) => item.type === activeType); const openCreateForm = (type: string) => { setEditingItem(null); setData({ type, slug: '', title: '', value: '', items: [], active: true, sort: Math.max(...navbarItems.map((item) => item.sort), 0) + 1, }); setIsFormOpen(true); }; const openEditForm = (item: NavbarItem) => { setEditingItem(item); setData({ type: item.type, slug: item.slug, title: item.title, value: item.value || '', active: item.active, items: Array.isArray(item.items) ? item.items.map((subItem: any) => ({ title: subItem.title || '', url: subItem.url || '' })) : [], sort: item.sort, }); setIsFormOpen(true); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (editingItem) { // Update existing item put(`/dashboard/settings/navbar-items/${editingItem.id}`, { onSuccess: () => { setIsFormOpen(false); router.reload({ only: ['navbar'] }); }, }); } else { // Create new item post(`/dashboard/settings/navbar/${navbar.id}/items`, { onSuccess: () => { setIsFormOpen(false); router.reload({ only: ['navbar'] }); }, }); } }; const addDropdownItem = () => { setData((prev) => ({ ...prev, items: [...prev.items, { title: '', url: '' }] })); }; const updateDropdownItem = (index: number, field: 'title' | 'url', value: string) => { const updatedItems = [...data.items]; updatedItems[index] = { ...updatedItems[index], [field]: value }; setData((prev) => ({ ...prev, items: updatedItems })); }; const removeDropdownItem = (index: number) => { const updatedItems = data.items.filter((_: any, i: number) => i !== index); setData((prev) => ({ ...prev, items: updatedItems })); }; return (
{/* Type Tabs */}
URL Items ({navbarItems.filter((item) => item.type === 'url').length}) Dropdowns ({navbarItems.filter((item) => item.type === 'dropdown').length}) Actions ({navbarItems.filter((item) => item.type === 'action').length})
Reorder } onOrderChange={(newOrder, setOpen) => { router.post( route('settings.navbar.items.reorder'), { sortedData: newOrder, }, { preserveScroll: true, onSuccess: () => setOpen && setOpen(false) }, ); }} renderContent={(item) => (

{item.title}

{ router.put(`/dashboard/settings/navbar-items/${item.id}`, { ...(item as any), active: checked, }); }} />
)} /> {activeType !== 'action' && ( )}
{/* URL Items */} {filteredItems.length > 0 ? (
{filteredItems.map((item) => (
{item.title}
{item.value}
} />
))}
) : (
No URL items found. Click "Add URL Item" to create one.
)}
{/* Dropdown Items */} {filteredItems.length > 0 ? (
{filteredItems.map((item, index) => (
{item.title}
} />
{item.items && Array.isArray(item.items) && (
{(item.items as any[]).map((subItem: any, idx: number) => (
{subItem.title} ({subItem.url})
))}
)}
))}
) : (
No dropdown items found. Click "Add Dropdown" to create one.
)}
{/* Action Items */} {filteredItems.length > 0 ? (
{filteredItems.map((item) => (

{item.title}

{ router.put(`/dashboard/settings/navbar-items/${item.id}`, { ...(item as any), active: checked, }); }} />
))}
) : (
No action items found. Click "Add Action Item" to create one.
)}
{/* Create/Edit Form Dialog */} {editingItem ? 'Edit' : 'Create'} {data.type.charAt(0).toUpperCase() + data.type.slice(1)} Item {editingItem ? 'Update the details of this navbar item.' : 'Add a new navbar item to your navigation.'}
setData((prev) => ({ ...prev, title: e.target.value }))} placeholder="Enter title" required />
setData((prev) => ({ ...prev, slug: e.target.value }))} placeholder="Enter unique slug" required />
{data.type === 'url' && (
setData((prev) => ({ ...prev, value: e.target.value }))} placeholder="Enter URL (e.g., /courses, https://example.com)" required />
)} {data.type === 'dropdown' && (
{data.items.map((item, index) => (
updateDropdownItem(index, 'title', e.target.value)} placeholder="Title" className="flex-1" /> updateDropdownItem(index, 'url', e.target.value)} placeholder="URL" className="flex-1" />
))}
)} {data.type === 'action' && (
)}
); }; export default NavbarEditor;