Close full operational audit findings
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-17 14:19:02 +02:00
parent cc36dabcbe
commit 78a5f0b0b2
81 changed files with 2248 additions and 1467 deletions
@@ -40,7 +40,7 @@ interface WorkbenchInspectorProps {
function formatValue(value: string | number | null | undefined): string {
if (value === null || value === undefined || value === '') {
return 'n/a'
return 'n.v.t.'
}
return String(value)
}
@@ -93,23 +93,23 @@ export function WorkbenchInspector({
const tabs: Array<{ key: InspectorTab; label: string }> = [
{ key: 'context', label: 'Context' },
{ key: 'dataset', label: 'Dataset' },
{ key: 'quality', label: 'QA/Exports' },
{ key: 'ai', label: 'AI Runs' },
{ key: 'dataset', label: 'Databron' },
{ key: 'quality', label: 'Kwaliteit en downloads' },
{ key: 'ai', label: 'Beeldanalyse' },
]
return (
<section className="workbench-inspector-panel" data-testid="workbench-inspector-panel">
<div className="inspector-header">
<div>
<p className="eyebrow">Inspector</p>
<h2>Selection details</h2>
<p className="eyebrow">Context</p>
<h2>Details van de selectie</h2>
</div>
<button type="button" className="inspector-close" onClick={onClose} aria-label="Close selection details">
Close
<button type="button" className="inspector-close" onClick={onClose} aria-label="Sluit details van de selectie">
Sluiten
</button>
</div>
<div className="inspector-tabs" role="tablist" aria-label="Inspector detail tabs">
<div className="inspector-tabs" role="tablist" aria-label="Onderdelen van de selectie">
{tabs.map((tab) => (
<button
key={tab.key}
@@ -130,36 +130,36 @@ export function WorkbenchInspector({
{activeTab === 'context' ? (
<div className="inspector-tab-panel" role="tabpanel" id={activePanelId} aria-labelledby={activeTabId}>
<div className="inspector-card">
<h3>Project context</h3>
<InspectorField label="Project" value={selectedProject?.name} />
<InspectorField label="Region" value={selectedProject?.region} />
<h3>Werkruimte</h3>
<InspectorField label="Naam" value={selectedProject?.name} />
<InspectorField label="Regio" value={selectedProject?.region} />
<InspectorField label="Status" value={selectedProject?.status} />
<InspectorField label="AOIs" value={areas.length} />
<InspectorField label="Datasets" value={datasetsCount} />
<InspectorField label="Gebieden" value={areas.length} />
<InspectorField label="Databronnen" value={datasetsCount} />
<div className="button-row">
<button type="button" className="secondary-action" onClick={onOpenDataWorkspace}>
Open data setup
Gegevens beheren
</button>
</div>
</div>
<div className="inspector-card">
<h3>Active AOI</h3>
<InspectorField label="Name" value={selectedArea?.name} />
<InspectorField label="Area m2" value={selectedArea?.area_m2} />
<InspectorField label="CRS" value={selectedArea?.original_crs} />
<InspectorField label="Geometry" value={selectedArea?.geometry?.type} />
<h3>Actief werkgebied</h3>
<InspectorField label="Naam" value={selectedArea?.name} />
<InspectorField label="Oppervlakte m²" value={selectedArea?.area_m2} />
<InspectorField label="Coördinatenstelsel" value={selectedArea?.original_crs} />
<InspectorField label="Geometrietype" value={selectedArea?.geometry?.type} />
<div className="button-row">
<button type="button" className="secondary-action" onClick={onOpenMapWorkspace}>
Open map
Kaart openen
</button>
</div>
</div>
<div className="inspector-card">
<h3>Map feature</h3>
<h3>Geselecteerd kaartobject</h3>
{selectedMapFeature ? (
<pre className="job-result">{JSON.stringify(selectedMapFeature.properties ?? {}, null, 2)}</pre>
) : (
<p className="muted">No map feature selected.</p>
<p className="muted">Er is geen kaartobject geselecteerd.</p>
)}
</div>
</div>
@@ -169,13 +169,13 @@ export function WorkbenchInspector({
<div className="inspector-tab-panel" role="tabpanel" id={activePanelId} aria-labelledby={activeTabId}>
<div className="inspector-action-bar">
<button type="button" className="secondary-action" onClick={onOpenDataWorkspace}>
Data catalog
Gegevenscatalogus
</button>
<button type="button" className="secondary-action" onClick={onOpenMapWorkspace}>
Map layer
Kaartlaag
</button>
<button type="button" className="secondary-action" onClick={onOpenExportsWorkspace}>
Export
Download
</button>
</div>
<DatasetDetailPanel {...datasetDetailProps} />
@@ -185,28 +185,26 @@ export function WorkbenchInspector({
{activeTab === 'quality' ? (
<div className="inspector-tab-panel" role="tabpanel" id={activePanelId} aria-labelledby={activeTabId}>
<div className="inspector-card">
<h3>Latest QA/QC</h3>
<InspectorField label="Check type" value={latestQualityCheck?.check_type} />
<h3>Laatste kwaliteitscontrole</h3>
<InspectorField label="Type controle" value={latestQualityCheck?.check_type?.replaceAll('_', ' ')} />
<InspectorField label="Status" value={latestQualityCheck?.status} />
<InspectorField label="Score" value={latestQualityCheck?.score} />
<InspectorField label="Metrics" value={latestQualityCheck?.metrics.length} />
<InspectorField label="Reference" value={latestQualityCheck?.reference_dataset_id} />
<InspectorField label="Meetwaarden" value={latestQualityCheck?.metrics.length} />
<div className="button-row">
<button type="button" className="secondary-action" onClick={onOpenQualityWorkspace}>
Open QA/QC
Kwaliteit openen
</button>
</div>
</div>
<div className="inspector-card">
<h3>Latest export</h3>
<InspectorField label="Created now" value={latestExport?.export_type} />
<InspectorField label="Persisted type" value={latestPersistedExport?.export_type} />
<h3>Laatste download</h3>
<InspectorField label="Zojuist aangemaakt" value={latestExport?.export_type} />
<InspectorField label="Bewaard type" value={latestPersistedExport?.export_type} />
<InspectorField label="Status" value={latestPersistedExport?.status ?? latestExport?.status} />
<InspectorField label="Path" value={latestPersistedExport?.storage_path ?? latestExport?.path} />
<InspectorField label="Export count" value={exports.length} />
<InspectorField label="Aantal downloads" value={exports.length} />
<div className="button-row">
<button type="button" className="secondary-action" onClick={onOpenExportsWorkspace}>
Open exports
Downloads openen
</button>
</div>
</div>
@@ -216,23 +214,28 @@ export function WorkbenchInspector({
{activeTab === 'ai' ? (
<div className="inspector-tab-panel" role="tabpanel" id={activePanelId} aria-labelledby={activeTabId}>
<div className="inspector-card">
<h3>Detection run</h3>
<InspectorField label="Selected run" value={selectedDetectionRunId} />
<h3>Gebouwdetectie</h3>
<InspectorField label="Status" value={selectedDetectionRun?.status} />
<InspectorField label="Model" value={selectedDetectionRun?.model_name} />
<InspectorField label="Detections loaded" value={detectionItems.length} />
<InspectorField label="Gevonden objecten" value={detectionItems.length} />
<div className="button-row">
<button type="button" className="secondary-action" onClick={onOpenAiWorkspace}>
Open AI Labs
Beeldanalyse openen
</button>
</div>
</div>
<div className="inspector-card">
<h3>Segmentation run</h3>
<InspectorField label="Selected run" value={selectedSegmentationRunId} />
<h3>Segmentatie</h3>
<InspectorField label="Status" value={selectedSegmentationRun?.status} />
<InspectorField label="Model" value={selectedSegmentationRun?.model_name} />
<InspectorField label="Segmentations loaded" value={segmentationItems.length} />
<InspectorField label="Herkende vlakken" value={segmentationItems.length} />
<details className="technical-inline-details">
<summary>Technische analyseruns</summary>
<div className="entity-meta">
<span>Detectierun-ID: {selectedDetectionRunId || 'n.v.t.'}</span>
<span>Segmentatierun-ID: {selectedSegmentationRunId || 'n.v.t.'}</span>
</div>
</details>
</div>
</div>
) : null}