// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. // Module Manager — Supreme Admin CRUD for XCU Module Registry // Dynamic: Add, Deactivate, Search modules. Data from xcu_iam PostgreSQL. import { useState } from 'react'; import { useModuleRegistry } from '../context/ModuleRegistryContext'; import DangerModal from './DangerModal'; export default function ModuleManager() { const { registry, allModules, totalModules, loading, source, addModule, deleteModule, refreshRegistry } = useModuleRegistry(); const [showAddForm, setShowAddForm] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [deleteTarget, setDeleteTarget] = useState(null); // Add module form state const [newId, setNewId] = useState(''); const [newName, setNewName] = useState(''); const [newGroupId, setNewGroupId] = useState('group1'); const [newGroupName, setNewGroupName] = useState(''); const [newSortOrder, setNewSortOrder] = useState(100); const [isSubmitting, setIsSubmitting] = useState(false); // Derive available groups const groups = Object.entries(registry).map(([key, val]) => ({ id: key, name: val.name })); const handleAddModule = async () => { if (!newId || !newName) return; setIsSubmitting(true); const groupName = newGroupName || (groups.find(g => g.id === newGroupId)?.name || newGroupId); const success = await addModule({ id: newId, name: newName, group_id: newGroupId, group_name: groupName, sort_order: Number(newSortOrder) }); if (success) { setNewId(''); setNewName(''); setNewSortOrder(totalModules + 1); setNewGroupName(''); setShowAddForm(false); } setIsSubmitting(false); }; const handleDeleteConfirm = async () => { if (!deleteTarget) return; await deleteModule(deleteTarget); setDeleteTarget(null); }; // Filter modules const q = searchQuery.toLowerCase(); const filteredGroups = Object.entries(registry).map(([key, group]) => ({ key, name: group.name, modules: (group.modules || []).filter(m => !q || m.id.toLowerCase().includes(q) || m.name.toLowerCase().includes(q) ) })).filter(g => g.modules.length > 0); const filteredCount = filteredGroups.reduce((sum, g) => sum + g.modules.length, 0); if (loading) { return (
Dynamic Module CRUD — Source: {source === 'API' ? 'xcu_iam PostgreSQL' : 'Static Fallback'}