/** * RealEstateParcelsView * * Parzellen-Verwaltung für eine Real Estate/PEK-Instanz. * Verwendet FormGeneratorTable analog zu TrusteeDocumentsView. */ import React, { useState, useMemo, useEffect } from 'react'; import { useRealEstateParcels, useRealEstateParcelOperations, type RealEstateParcel, } from '../../../hooks/useRealEstate'; import { useInstanceId } from '../../../hooks/useCurrentInstance'; import { FormGeneratorTable } from '../../../components/FormGenerator/FormGeneratorTable'; import { FormGeneratorForm } from '../../../components/FormGenerator/FormGeneratorForm'; import { FaSync } from 'react-icons/fa'; import styles from '../../admin/Admin.module.css'; import { useLanguage } from '../../../providers/language/LanguageContext'; import { resolveColumnTypes } from '../../../utils/columnTypeResolver'; export const RealEstateParcelsView: React.FC = () => { const { t } = useLanguage(); const instanceId = useInstanceId(); const { items: parcels, attributes, permissions, pagination, loading, error, refetch, fetchById, updateOptimistically, removeOptimistically, } = useRealEstateParcels(); const { handleDelete, handleCreate, handleUpdate, deletingItems, } = useRealEstateParcelOperations(); const [editingParcel, setEditingParcel] = useState(null); const [isCreateMode, setIsCreateMode] = useState(false); useEffect(() => { if (instanceId) { refetch(); } }, [instanceId, refetch]); const columns = useMemo(() => { const raw = (attributes || []).map(attr => ({ key: attr.name, label: attr.label || attr.name, sortable: attr.sortable !== false, filterable: attr.filterable !== false, searchable: attr.searchable !== false, width: attr.width || 150, minWidth: attr.minWidth || 100, maxWidth: attr.maxWidth || 400, displayField: (attr as any).displayField, })); return resolveColumnTypes(raw, attributes || []); }, [attributes]); const canCreate = permissions?.create !== 'n'; const canUpdate = permissions?.update !== 'n'; const canDelete = permissions?.delete !== 'n'; const handleEditClick = async (parcel: RealEstateParcel) => { const full = await fetchById(parcel.id); if (full) { setEditingParcel(full); setIsCreateMode(false); } }; const handleCreateClick = () => { setEditingParcel(null); setIsCreateMode(true); }; const handleFormSubmit = async (data: Partial) => { if (isCreateMode) { const result = await handleCreate(data); if (result.success) { setIsCreateMode(false); refetch(); } } else if (editingParcel) { const result = await handleUpdate(editingParcel.id, data); if (result.success) { setEditingParcel(null); refetch(); } } }; const handleDeleteParcel = async (parcel: RealEstateParcel) => { removeOptimistically(parcel.id); const success = await handleDelete(parcel.id); if (!success) { refetch(); } }; const handleCloseModal = () => { setEditingParcel(null); setIsCreateMode(false); }; const formAttributes = useMemo(() => { const excluded = ['id', 'mandateId', 'instanceId', 'sysCreatedBy', 'sysCreatedAt', 'sysModifiedAt', 'sysModifiedBy']; return (attributes || []).filter(attr => !excluded.includes(attr.name)); }, [attributes]); const handleInlineUpdate = async ( itemId: string, updateData: Partial, row: RealEstateParcel ) => { updateOptimistically(itemId, updateData); const result = await handleUpdate(itemId, { ...row, ...updateData }); if (!result.success) { refetch(); } }; if (error) { return (
⚠️

Fehler beim Laden der Parzellen: {error}

); } return (

{t('Parzellen verwalten')}

{canCreate && ( )}
deletingItems.has(row.id), }, ] : []), ]} onDelete={handleDeleteParcel} hookData={{ refetch, permissions, pagination, handleDelete, handleInlineUpdate, updateOptimistically, }} emptyMessage={t('Keine Parzellen gefunden')} />
{(editingParcel || isCreateMode) && (

{isCreateMode ? t('Neue Parzelle') : t('Parzelle bearbeiten')}

{formAttributes.length === 0 ? (
{t('Formular laden')}
) : ( )}
)}
); }; export default RealEstateParcelsView;