'use client'; import { useState, useEffect } from 'react'; import { inventoryApi } from '@/lib/api'; import PageShell from '@/components/PageShell'; import { Shield, UserPlus, User, Trash2, Tag, Plus, AlertTriangle, LogOut, Database, History, Lock, Edit2, X, Server, Globe, Wifi, WifiOff, Layers, ChevronDown } from 'lucide-react'; import { toast } from 'react-hot-toast'; import { cn } from '@/lib/utils'; export default function AdminPage() { const [users, setUsers] = useState([]); const [categories, setCategories] = useState([]); const [loading, setLoading] = useState(true); // LDAP Config State const [ldapConfig, setLdapConfig] = useState({ ldap_enabled: false, server_uri: 'ldap://192.168.84.107:3890', base_dn: 'dc=example,dc=com', user_template: 'cn={username},ou=people,dc=example,dc=com', required_group: 'inventory', groups_dn: 'ou=groups', use_tls: false, role_mappings: [] }); const [testingLdap, setTestingLdap] = useState(false); // Edit States const [editingUser, setEditingUser] = useState(null); const [editUserForm, setEditUserForm] = useState({ username: '', password: '', role: 'user' }); const [editingCategory, setEditingCategory] = useState(null); const [editCatForm, setEditCatForm] = useState({ name: '', description: '' }); useEffect(() => { loadData(); }, []); const loadData = async () => { setLoading(true); try { const [u, c, l] = await Promise.all([ inventoryApi.getUsers(), inventoryApi.getCategories(), inventoryApi.getLdapConfig() ]); setUsers(u); setCategories(c); if (l && l.server_uri) setLdapConfig(l); } catch (err) { console.error(err); toast.error("Failed to load admin data"); } finally { setLoading(false); } }; const handleAddUser = async () => { const name = prompt("Enter new username:"); if (!name) return; const pwd = prompt("Enter password for " + name + ":"); if (!pwd) return; try { await inventoryApi.createUser({ username: name, password: pwd, role: 'user' }); toast.success("User created successfully"); loadData(); } catch (err) { toast.error("Failed to create user"); } }; const handleDeleteUser = async (id: number, username: string) => { if (username === 'Admin') return; if (!confirm(`Delete user ${username}?`)) return; try { await inventoryApi.deleteUser(id); toast.success("User removed"); loadData(); } catch (err) { toast.error("Delete failed"); } }; const handleAddCategory = async () => { const name = prompt("New category name:"); if (!name) return; const desc = prompt("Description (optional):"); try { await inventoryApi.createCategory({ name, description: desc }); toast.success("Category added"); loadData(); } catch (err) { toast.error("Failed to add category"); } }; const handleUpdateCategorySubmit = async () => { if (!editingCategory) return; try { await inventoryApi.updateCategory(editingCategory.id, editCatForm); toast.success("Category updated"); setEditingCategory(null); loadData(); } catch (err) { toast.error("Update failed"); } }; const handleDeleteCategory = async (id: number, name: string) => { if (!confirm(`Delete category ${name}?`)) return; try { await inventoryApi.deleteCategory(id); toast.success("Category removed"); loadData(); } catch (err) { toast.error(err.response?.data?.detail || "Delete failed"); } }; const handleUpdateUserSubmit = async () => { if (!editingUser) return; try { const payload: any = { username: editUserForm.username, role: editUserForm.role }; if (editUserForm.password) payload.password = editUserForm.password; await inventoryApi.updateUser(editingUser.id, payload); toast.success("User updated successfully"); setEditingUser(null); loadData(); } catch (err) { toast.error("Update failed"); } }; const handleLogout = () => { localStorage.removeItem('inventory_user'); window.location.href = '/'; }; return (

System Admin

Enterprise Control Center

{/* User Management Section */}

User Accounts

{/* Local Users Group */}

Local Users

{loading ? (
Loading...
) : ( users.filter(u => (u.origin || 'local') === 'local').map(u => (
{u.role === 'admin' ? : }

{u.username}

{u.role}
{u.username !== 'Admin' && ( )}
)) )}
{/* enterprise Users Group */} {users.some(u => u.origin === 'ldap') && (

Enterprise Users (LDAP)

{users.filter(u => u.origin === 'ldap').map(u => (

{u.username}

Network Sync {u.role}
Read Only Profile
))}
)}
{/* Category Management Section */}

Category Groups

{loading ? (
Loading Categories...
) : ( categories.map(cat => (

{cat.name}

{cat.description || 'General Purpose Group'}

)) )} {categories.length === 0 && !loading && (
No categories defined
)}
{/* System Settings Section */}

System Integrity

Hybrid storage model active. Real-time synchronization between local memory and cloud-hosted SQLite.

Storage Online
{/* Enterprise LDAP Integration */}

Enterprise Integration

LLDAP / Active Directory Connectivity

LDAP Status
setLdapConfig({ ...ldapConfig, server_uri: e.target.value })} placeholder="ldap://192.168.84.107:3890" className="w-full bg-slate-950 border border-slate-800 focus:border-indigo-500/50 rounded-2xl py-4 pl-12 pr-5 text-white outline-none transition-all font-mono text-sm" />
setLdapConfig({ ...ldapConfig, base_dn: e.target.value })} placeholder="dc=example,dc=com" className="w-full bg-slate-950 border border-slate-800 focus:border-indigo-500/50 rounded-2xl py-4 px-5 text-white outline-none transition-all font-mono text-sm" />
setLdapConfig({ ...ldapConfig, user_template: e.target.value })} placeholder="uid={username},ou=people,dc=..." className="w-full bg-slate-950 border border-slate-800 focus:border-indigo-500/50 rounded-2xl py-4 px-5 text-white outline-none transition-all font-mono text-sm" />
{(ldapConfig.role_mappings || []).map((mapping: any, idx: number) => (
{ const newMappings = [...ldapConfig.role_mappings]; newMappings[idx].group = e.target.value; setLdapConfig({ ...ldapConfig, role_mappings: newMappings }); }} placeholder="Group CN (e.g. admins)" className="flex-1 bg-transparent text-xs font-mono text-white outline-none" />
))} {(ldapConfig.role_mappings || []).length === 0 && (
No roles mapped
)}
Encrypted Connection (TLS)

LLDAP usually serves LDAP on port 3890. Ensure your firewall allows traffic on this port between the inventory server and 192.168.84.107.

{/* Edit User Modal */} {editingUser && (

Edit Profile

setEditUserForm({ ...editUserForm, username: e.target.value })} className="w-full bg-slate-950 border border-slate-800 focus:border-primary rounded-2xl py-4 px-5 text-white outline-none transition-all disabled:opacity-50" /> {editingUser.username === 'Admin' &&

Default Admin name is protected

}
setEditUserForm({ ...editUserForm, password: e.target.value })} className="w-full bg-slate-950 border border-slate-800 focus:border-primary rounded-2xl py-4 px-5 text-white/50 focus:text-white outline-none transition-all placeholder:text-slate-800" />
)} {/* Edit Category Modal */} {editingCategory && (

Edit Group

setEditCatForm({ ...editCatForm, name: e.target.value })} className="w-full bg-slate-950 border border-slate-800 focus:border-primary rounded-2xl py-4 px-5 text-white outline-none transition-all" />