import React, { useEffect, useState, useRef } from 'react'; import { AppSettings, User, NotificationGroup, Contact } from '../types'; import { fetchSettings, saveSettings, sendTestEmail, fetchUsers, createUser, deleteUser, updateUser, fetchGroups, saveGroup, deleteGroup, fetchContacts, saveContact, deleteContact, DEFAULT_SETTINGS } from '../graphService'; import { TrashIcon, PlusIcon, SaveIcon, UserIcon, BriefcaseIcon, BellIcon, SettingsIcon, EditIcon } from './Icons'; interface AdminSettingsProps { onSettingsUpdate?: (settings: AppSettings) => void; } const AdminSettings: React.FC = ({ onSettingsUpdate }) => { const [activeTab, setActiveTab] = useState<'general' | 'auth' | 'users' | 'groups' | 'vendors'>('general'); const [loading, setLoading] = useState(false); const [message, setMessage] = useState<{type: 'success'|'error', text: string} | null>(null); const [settings, setSettings] = useState(DEFAULT_SETTINGS); const [users, setUsers] = useState([]); const [groups, setGroups] = useState([]); const [contacts, setContacts] = useState([]); const [editingUserId, setEditingUserId] = useState(null); const [newUser, setNewUser] = useState({ username: '', password: '', email: '', role: 'editor' as 'admin'|'editor', auth_source: 'local' as 'local'|'azure'|'ldap', sendEmail: true }); const [newGroup, setNewGroup] = useState({ groupName: '', emails: '' }); const [newVendor, setNewVendor] = useState({ vendorName: '', contactName: '', contactEmail: '', contactPhone: '' }); const loadAllData = async () => { setLoading(true); try { const [sData, uData, gData, cData] = await Promise.all([ fetchSettings().catch(() => DEFAULT_SETTINGS), fetchUsers().catch(() => []), fetchGroups().catch(() => []), fetchContacts().catch(() => []) ]); setSettings(sData || DEFAULT_SETTINGS); setUsers(uData || []); setGroups(gData || []); setContacts(cData || []); } catch (e: any) { setMessage({ type: 'error', text: e.message }); } finally { setLoading(false); } }; useEffect(() => { loadAllData(); }, []); const handleSaveSettings = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); try { await saveSettings(settings); setMessage({ type: 'success', text: 'Configuration saved successfully.' }); if (onSettingsUpdate) onSettingsUpdate(settings); } catch (e: any) { setMessage({ type: 'error', text: e.message }); } finally { setLoading(false); } }; const handleTestEmail = async () => { const email = prompt("Enter test recipient email:", settings.smtp_from); if (!email) return; setLoading(true); try { await sendTestEmail(email); setMessage({ type: 'success', text: `Test email sent to ${email}.` }); } catch (e: any) { setMessage({ type: 'error', text: e.message }); } finally { setLoading(false); } }; const handleCreateGroup = async (e: React.FormEvent) => { e.preventDefault(); try { setLoading(true); await saveGroup(newGroup); const updated = await fetchGroups(); setGroups(updated || []); setNewGroup({ groupName: '', emails: '' }); setMessage({ type: 'success', text: 'Group created.' }); } catch (e: any) { setMessage({ type: 'error', text: e.message }); } finally { setLoading(false); } }; const handleCreateVendor = async (e: React.FormEvent) => { e.preventDefault(); try { setLoading(true); await saveContact(newVendor); const updated = await fetchContacts(); setContacts(updated || []); setNewVendor({ vendorName: '', contactName: '', contactEmail: '', contactPhone: '' }); setMessage({ type: 'success', text: 'Vendor added.' }); } catch (e: any) { setMessage({ type: 'error', text: e.message }); } finally { setLoading(false); } }; const handleCreateOrUpdateUser = async (e: React.FormEvent) => { e.preventDefault(); try { setLoading(true); if (editingUserId) { const payload = { ...newUser }; if (!payload.password) delete (payload as any).password; await updateUser(editingUserId, payload); } else { await createUser(newUser); } await loadAllData(); setEditingUserId(null); setNewUser({ username: '', password: '', email: '', role: 'editor', auth_source: 'local', sendEmail: true }); } catch (e: any) { setMessage({ type: 'error', text: e.message }); } finally { setLoading(false); } }; return (

System Admin

{[ {id:'general', label:'Application', icon:}, {id:'auth', label:'Identity & SSO', icon:}, {id:'users', label:'Local Users', icon:}, {id:'groups', label:'Alert Groups', icon:}, {id:'vendors', label:'Vendors', icon:} ].map(tab => ( ))}
{message && (
{message.text}
)} {activeTab === 'general' && (

Core Defaults

setSettings({...settings, alert_days: parseInt(e.target.value)})} className="input-style" />

SMTP Server

setSettings({...settings, smtp_host: e.target.value})} className="input-style" /> setSettings({...settings, smtp_port: e.target.value})} className="input-style" /> setSettings({...settings, smtp_user: e.target.value})} className="input-style" /> setSettings({...settings, smtp_pass: e.target.value})} className="input-style" /> setSettings({...settings, smtp_from: e.target.value})} className="input-style md:col-span-2" />
)} {activeTab === 'auth' && (

Identity & SSO

Microsoft Entra (Azure)

setSettings({...settings, azure_enabled: e.target.checked})} className="w-5 h-5 rounded bg-slate-800 border-slate-600 text-cyan-500" />
{settings.azure_enabled && (
setSettings({...settings, azure_tenant_id: e.target.value})} className="input-style" /> setSettings({...settings, azure_client_id: e.target.value})} className="input-style" /> setSettings({...settings, azure_client_secret: e.target.value})} className="input-style" />
)}

LDAP / Active Directory

setSettings({...settings, ldap_enabled: e.target.checked})} className="w-5 h-5 rounded bg-slate-800 border-slate-600 text-cyan-500" />
{settings.ldap_enabled && (
setSettings({...settings, ldap_host: e.target.value})} className="input-style" /> setSettings({...settings, ldap_port: e.target.value})} className="input-style" /> setSettings({...settings, ldap_base_dn: e.target.value})} className="input-style md:col-span-2" /> setSettings({...settings, ldap_bind_dn: e.target.value})} className="input-style" /> setSettings({...settings, ldap_bind_pass: e.target.value})} className="input-style" /> setSettings({...settings, ldap_user_filter: e.target.value})} className="input-style md:col-span-2" />
)}

Allow Local DB Login

setSettings({...settings, allow_local_login: e.target.checked})} className="w-5 h-5 rounded bg-slate-800 border-slate-600 text-cyan-500" />
)} {activeTab === 'users' && (
setNewUser({...newUser, username: e.target.value})} className="input-style" /> setNewUser({...newUser, email: e.target.value})} className="input-style" /> setNewUser({...newUser, password: e.target.value})} className="input-style" />
{users.map(u => ( ))}
UserRoleActions
{u.username}
{u.email}
{u.role} {u.id !== 1 && }
)} {activeTab === 'groups' && (
setNewGroup({...newGroup, groupName: e.target.value})} className="input-style flex-1" /> setNewGroup({...newGroup, emails: e.target.value})} className="input-style flex-[2]" />
{groups.map(g => ( ))}
NameRecipientsActions
{g.groupName}{g.emails}
)} {activeTab === 'vendors' && (
setNewVendor({...newVendor, vendorName: e.target.value})} className="input-style" /> setNewVendor({...newVendor, contactName: e.target.value})} className="input-style" /> setNewVendor({...newVendor, contactEmail: e.target.value})} className="input-style" />
setNewVendor({...newVendor, contactPhone: e.target.value})} className="input-style flex-1" />
{contacts.map(c => ( ))}
VendorContactEmailActions
{c.vendorName} {c.contactName || '---'} {c.contactEmail || '---'}
)}
); }; export default AdminSettings;