import { useMemo, useState } from 'react' import type { DatasetCreateResponse, ExportCreateResponse, ExportRead } from '../../types' interface ExportCenterProps { selectedProjectId: string | null selectedDataset: DatasetCreateResponse | null selectedDetectionRunId: string selectedSegmentationRunId: string exports: ExportRead[] latestExport: ExportCreateResponse | null exportError: string | null loadingExports: boolean exporting: boolean onRefresh: () => void onExportDataset: () => void onExportDetectionRun: () => void onExportSegmentationRun: () => void onExportProjectMetadata: () => void onExportProjectReport: () => void onPreviewContent: (exportId: string) => void onDownload: (exportId: string) => void } function isVectorDatasetType(datasetType: string): boolean { return datasetType === 'vector' || datasetType === 'geojson' } function canPreviewJson(item: ExportRead): boolean { if (item.export_type === 'project_report_html') { return false } if (item.metadata_json?.format === 'html') { return false } return true } function compactPath(value: string): string { const parts = value.split('/').filter(Boolean) if (parts.length <= 2) { return value } return parts.slice(-2).join('/') } function formatExportType(value: string): string { const labels: Record = { vector_selection_geojson: 'Kaartselectie (GeoJSON)', map_analysis_json: 'Gebiedsanalyse (JSON)', map_evolution_json: 'Historische vergelijking (JSON)', dataset_geojson: 'Kaartlaag (GeoJSON)', detection_geojson: 'Gebouwdetecties - controlelaag (GeoJSON)', segmentation_geojson: 'Segmentaties (GeoJSON)', project_metadata_json: 'Werkruimtedata (JSON)', project_report_html: 'Projectrapport (HTML)', } if (labels[value]) { return labels[value] } return value .split('_') .filter(Boolean) .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) .join(' ') } function formatExportCreated(value?: string | null): string { if (!value) { return 'Tijdstip onbekend' } const parsed = new Date(value) return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleString('nl-BE') } function getLatestExportByType(exports: ExportRead[], exportType: string): ExportRead | null { return exports.find((item) => item.export_type === exportType) ?? null } function exportMatchesSearch(item: ExportRead, query: string): boolean { const normalizedQuery = query.trim().toLowerCase() if (!normalizedQuery) { return true } return [item.export_type, item.status, item.id, item.storage_path] .filter(Boolean) .some((value) => String(value).toLowerCase().includes(normalizedQuery)) } export function ExportCenter({ selectedProjectId, selectedDataset, selectedDetectionRunId, selectedSegmentationRunId, exports, latestExport, exportError, loadingExports, exporting, onRefresh, onExportDataset, onExportDetectionRun, onExportSegmentationRun, onExportProjectMetadata, onExportProjectReport, onPreviewContent, onDownload, }: ExportCenterProps): JSX.Element { const [showAllExports, setShowAllExports] = useState(false) const [exportTypeFilter, setExportTypeFilter] = useState('all') const [exportStatusFilter, setExportStatusFilter] = useState('all') const [exportSearchQuery, setExportSearchQuery] = useState('') const canExportDataset = Boolean(selectedDataset && isVectorDatasetType(selectedDataset.dataset_type)) const geojsonExports = exports.filter((item) => item.export_type.includes('geojson')).length const reportExports = exports.filter((item) => item.export_type === 'project_report_html').length const handoffStatus = selectedProjectId ? 'werkruimte gekozen' : 'kies een werkruimte' const exportTypes = useMemo(() => Array.from(new Set(exports.map((item) => item.export_type))).sort(), [exports]) const exportStatuses = useMemo(() => Array.from(new Set(exports.map((item) => item.status))).sort(), [exports]) const latestHandoffArtifacts = useMemo( () => [ { key: 'map_analysis_json', label: 'Gebiedsanalyse', detail: 'Server-side herberekende metingen van de kaartselectie', item: getLatestExportByType(exports, 'map_analysis_json'), }, { key: 'map_evolution_json', label: 'Historische vergelijking', detail: 'Bewaarde evolutie van het geselecteerde gebied', item: getLatestExportByType(exports, 'map_evolution_json'), }, { key: 'vector_selection_geojson', label: 'Kaartselectie (GeoJSON)', detail: 'Persistente objecten binnen de geselecteerde rechthoek', item: getLatestExportByType(exports, 'vector_selection_geojson'), }, { key: 'project_report_html', label: 'Leesbaar rapport', detail: 'HTML-rapport om te bekijken en te delen', item: getLatestExportByType(exports, 'project_report_html'), }, { key: 'project_metadata_json', label: 'Werkruimtedata', detail: 'Technische inventaris in JSON-formaat', item: getLatestExportByType(exports, 'project_metadata_json'), }, { key: 'dataset_geojson', label: 'Kaartlaag (GeoJSON)', detail: 'De geselecteerde vector- of referentielaag', item: getLatestExportByType(exports, 'dataset_geojson'), }, { key: 'detection_geojson', label: 'Herkende gebouwen - controlelaag (GeoJSON)', detail: 'Bewaarde geometrieën uit beeldanalyse', item: getLatestExportByType(exports, 'detection_geojson'), }, { key: 'segmentation_geojson', label: 'Segmentaties (GeoJSON)', detail: 'Bewaarde segmentatiepolygonen', item: getLatestExportByType(exports, 'segmentation_geojson'), }, ], [exports], ) const availableLatestArtifacts = latestHandoffArtifacts.filter((artifact) => artifact.item) const filteredExports = useMemo( () => exports.filter((item) => { const typeMatches = exportTypeFilter === 'all' || item.export_type === exportTypeFilter const statusMatches = exportStatusFilter === 'all' || item.status === exportStatusFilter return typeMatches && statusMatches && exportMatchesSearch(item, exportSearchQuery) }), [exports, exportTypeFilter, exportStatusFilter, exportSearchQuery], ) const visibleExports = showAllExports ? filteredExports : filteredExports.slice(0, 10) const hiddenExportCount = Math.max(filteredExports.length - visibleExports.length, 0) const hasActiveExportFilters = exportTypeFilter !== 'all' || exportStatusFilter !== 'all' || exportSearchQuery.trim().length > 0 return (

Downloads en rapporten

Bewaar de geselecteerde kaartlaag, analyseresultaten of een leesbaar projectrapport.

{exports.length} bestanden
GeoJSON {geojsonExports}
Rapporten {reportExports}
Geselecteerde kaartlaag {selectedDataset?.name ?? 'geen'}

Klaar om te delen

Controleer het juiste bestand voordat je gegevens buiten GeoIntel gebruikt.

{handoffStatus}
Vectorkaartlaag {canExportDataset ? selectedDataset?.name : 'geen beschikbaar'}
Gebouwanalyse {selectedDetectionRunId || 'geen'}
Segmentatieanalyse {selectedSegmentationRunId || 'geen'}
Laatste bestand {latestExport ? formatExportType(latestExport.export_type) : 'geen'}

Laatste downloads

Open de recentste bestanden zonder in de volledige geschiedenis te zoeken.

{availableLatestArtifacts.map((artifact) => { const item = artifact.item return (
{artifact.label} {item ? (item.status === 'ready' ? 'Beschikbaar' : item.status) : 'Nog niet gemaakt'}

{item ? compactPath(item.storage_path) : artifact.detail}

{item ? ( <> {formatExportCreated(item.created_at)}
{canPreviewJson(item) ? ( ) : ( alleen downloaden )}
) : null}
) })} {availableLatestArtifacts.length === 0 ? (
Nog geen recente downloads

De laatst bewaarde bestanden verschijnen hier.

) : null}

Wat wil je bewaren?

Maak een leesbaar rapport of download gegevens voor verder gebruik.

Vernieuwen Bewaarde bestanden

Laad de persistente downloads van de geselecteerde werkruimte opnieuw.

Rapport Leesbaar projectoverzicht

Maak een HTML-rapport met de beschikbare bronnen, controles en resultaten.

Technische gegevens Projectgegevens (JSON)

Download de volledige projectinventaris voor geautomatiseerde verwerking.

Kaartlaag Geselecteerde bron (GeoJSON)

Download de actieve vector- of referentielaag.

{selectedDetectionRunId ?
Gebouwanalyse Herkende gebouwen - controlelaag (GeoJSON)

Bewaar de persistente detectiegeometrie van de geselecteerde analyserun.

: null} {selectedSegmentationRunId ?
Segmentatieanalyse Segmentaties (GeoJSON)

Bewaar de persistente polygonen van de geselecteerde segmentatierun.

: null}
{loadingExports ? (
Downloads laden.

De bewaarde bestanden van deze werkruimte worden opgehaald.

) : null} {exportError ? (
Download kon niet worden gemaakt.

{exportError}

) : null} {latestExport ? (
Laatste download {formatExportType(latestExport.export_type)}

{latestExport.path}

) : null} {exports.length === 0 ? (
Nog niets bewaard

Maak een leesbaar rapport, een projectoverzicht, of bewaar de actieve kaartlaag.

) : null}
Downloadgeschiedenis {exports.length} bestanden

Bewaarde downloads

Bekijk persistente bestanden en open beschikbare JSON-voorbeelden.

{exports.length > 0 ? (
) : null} {filteredExports.length > 10 ? (
{visibleExports.length} van {filteredExports.length} passende downloads zichtbaar. {hiddenExportCount > 0 ? ` ${hiddenExportCount} oudere bestanden verborgen.` : ' Alle passende bestanden zijn zichtbaar.'}
) : null} {exports.length > 0 && filteredExports.length === 0 ? (
Geen downloads passen bij deze filters.

Wis de zoekopdracht of filters om de recentste bestanden opnieuw te tonen.

) : null}
    {visibleExports.map((item) => (
  • {formatExportType(item.export_type)}
    download-id: {item.id} {item.analysis_run_id ? analyserun: {item.analysis_run_id} : null} {item.created_at ? gemaakt: {formatExportCreated(item.created_at)} : null}
    {item.status}

    {compactPath(item.storage_path)}

    {canPreviewJson(item) ? ( ) : ( HTML alleen downloaden )}
  • ))}
) }