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.Title')}

{translate('::App.DeveloperKit.Entity.Description')}

{translate('::App.DeveloperKit.Entity.NewEntity')}
{/* Stats Cards */}

{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}

{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-emerald-500 focus:border-transparent transition-colors" />
{/* Entities List */} {filteredEntities.length > 0 ? (
{filteredEntities.map((entity) => { return (

{entity.displayName}

{translate('::App.DeveloperKit.Entity.TableLabel')}: {entity.tableName}

{entity.description && (

{entity.description}

)}
{translate('::App.DeveloperKit.Entity.Updated')}:{' '} {entity.lastModificationTime ? new Date(entity.lastModificationTime).toLocaleDateString() : 'Never'}
{entity.fields.length} {translate('::App.DeveloperKit.Entity.Fields')}
{/* Entity Fields Preview */}

{translate('::App.DeveloperKit.Entity.FieldsLabel')}:

{entity.fields.slice(0, 4).map((field) => (
{field.type} {field.name} {field.isRequired && *}
))} {entity.fields.length > 4 && (
+{entity.fields.length - 4}{' '} {translate('::App.DeveloperKit.Entity.More')}
)}
{/* Migration and Endpoint Status */}
{translate('::App.DeveloperKit.Entity.MigrationStatus')} {entity.migrationStatus}
{translate('::App.DeveloperKit.Entity.EndpointStatus')} {entity.endpointStatus}
{/* Actions */}
) })}
) : (

{searchTerm || filterActive !== 'all' ? translate('::App.DeveloperKit.Entity.NoEntitiesFound') : translate('::App.DeveloperKit.Entity.NoEntitiesYet')}

{searchTerm || filterActive !== 'all' ? translate('::App.DeveloperKit.Entity.TryAdjustingFilters') : translate('::App.DeveloperKit.Entity.CreateFirstEntity')}

{!searchTerm && filterActive === 'all' && ( {translate('::App.DeveloperKit.Entity.CreateEntity')} )}
)}
) } export default EntityManager