import React, { useState } from 'react' import { Link } from 'react-router-dom' import { useEntities } from '../../contexts/EntityContext' import { FaPlus, FaSearch, FaEdit, FaTrashAlt, FaEye, FaEyeSlash, FaFilter, FaCalendarAlt, FaDatabase, FaCheckCircle, FaTable, FaBolt, } from 'react-icons/fa' import { ROUTES_ENUM } from '@/routes/route.constant' import { useLocalization } from '@/utils/hooks/useLocalization' const EntityManager: React.FC = () => { const { entities, deleteEntity, toggleEntityActiveStatus } = useEntities() const [searchTerm, setSearchTerm] = useState('') const [filterActive, setFilterActive] = useState<'all' | 'active' | 'inactive'>('all') const { translate } = useLocalization() const filteredEntities = entities.filter((entity) => { const matchesSearch = entity.name.toLowerCase().includes(searchTerm.toLowerCase()) || entity.displayName.toLowerCase().includes(searchTerm.toLowerCase()) || (entity.description || '').toLowerCase().includes(searchTerm.toLowerCase()) const matchesActiveFilter = filterActive === 'all' || (filterActive === 'active' && entity.isActive) || (filterActive === 'inactive' && !entity.isActive) return matchesSearch && matchesActiveFilter }) const handleToggleActive = async (id: string) => { try { await toggleEntityActiveStatus(id) } catch (err) { console.error('Failed to toggle entity status:', err) } } const handleDelete = async (id: string, name: string) => { if ( window.confirm( `Are you sure you want to delete the "${name}" entity?\n\nThis action will permanently remove:\n• The entity and all its fields\n• All related migrations\n• All related API endpoints\n\nThis cannot be undone.`, ) ) { try { await deleteEntity(id) } catch (err) { console.error('Failed to delete entity:', err) alert(translate('::App.DeveloperKit.Entity.DeleteFailed')) } } } const stats = { total: entities.length, active: entities.filter((e) => e.isActive).length, migrationsPending: entities.filter((e) => e.migrationStatus === 'pending').length, endpointsApplied: entities.filter((e) => e.endpointStatus === 'applied').length, } return (
{translate('::App.DeveloperKit.Entity.Description')}
{translate('::App.DeveloperKit.Entity.TotalEntities')}
{stats.total}
{translate('::App.DeveloperKit.Entity.ActiveEntities')}
{stats.active} / {stats.total}
{translate('::App.DeveloperKit.Entity.PendingMigrations')}
{stats.migrationsPending}
{translate('::App.DeveloperKit.Entity.CrudEndpoints')}
{stats.endpointsApplied}
{translate('::App.DeveloperKit.Entity.TableLabel')}: {entity.tableName}
{entity.description}
)}{searchTerm || filterActive !== 'all' ? translate('::App.DeveloperKit.Entity.TryAdjustingFilters') : translate('::App.DeveloperKit.Entity.CreateFirstEntity')}
{!searchTerm && filterActive === 'all' && (