import type { AreaRead, DatasetCreateResponse, ExportRead, ProjectRead, QualityCheckRead } from '../types' interface StatusItem { key: string label: string value: string detail: string state: 'ready' | 'warning' | 'waiting' } interface WorkbenchStatusStripProps { selectedProject: ProjectRead | null areas: AreaRead[] datasets: DatasetCreateResponse[] qualityChecks: QualityCheckRead[] exports: ExportRead[] activeLayerFeatureCount: number selectedAreaHasGeometry: boolean } function countByDatasetType(datasets: DatasetCreateResponse[], datasetType: string): number { return datasets.filter((dataset) => dataset.dataset_type === datasetType).length } function countReferenceDatasets(datasets: DatasetCreateResponse[]): number { return datasets.filter((dataset) => dataset.dataset_role === 'reference').length } function nextAction(items: StatusItem[]): string { if (!items.some((item) => item.key === 'project' && item.state === 'ready')) { return 'Create or open a project.' } if (!items.some((item) => item.key === 'area' && item.state === 'ready')) { return 'Create an AOI or select an area with geometry.' } if (!items.some((item) => item.key === 'datasets' && item.state === 'ready')) { return 'Upload a vector or raster dataset, or load the offline demo workflow.' } if (!items.some((item) => item.key === 'qa' && item.state === 'ready')) { return 'Run QA/QC against a reference dataset when candidate and reference data are available.' } if (!items.some((item) => item.key === 'exports' && item.state === 'ready')) { return 'Create a metadata, report or GeoJSON export for handoff.' } return 'Workbench has the core V1 loop populated.' } export function WorkbenchStatusStrip({ selectedProject, areas, datasets, qualityChecks, exports, activeLayerFeatureCount, selectedAreaHasGeometry, }: WorkbenchStatusStripProps): JSX.Element { const readyDatasets = datasets.filter((dataset) => dataset.status === 'ready').length const vectorDatasets = countByDatasetType(datasets, 'vector') + countByDatasetType(datasets, 'geojson') const rasterDatasets = countByDatasetType(datasets, 'raster') const referenceDatasets = countReferenceDatasets(datasets) const latestQualityCheck = qualityChecks[0] const latestExport = exports[0] const items: StatusItem[] = [ { key: 'project', label: 'Project', value: selectedProject ? selectedProject.name : 'No project', detail: selectedProject ? selectedProject.region : 'Open or create a project', state: selectedProject ? 'ready' : 'waiting', }, { key: 'area', label: 'AOI', value: `${areas.length} area${areas.length === 1 ? '' : 's'}`, detail: selectedAreaHasGeometry ? 'selected area has map geometry' : 'no selected map geometry', state: selectedAreaHasGeometry ? 'ready' : areas.length > 0 ? 'warning' : 'waiting', }, { key: 'datasets', label: 'Datasets', value: `${readyDatasets}/${datasets.length} ready`, detail: `${vectorDatasets} vector, ${rasterDatasets} raster, ${referenceDatasets} reference`, state: datasets.length === 0 ? 'waiting' : readyDatasets === datasets.length ? 'ready' : 'warning', }, { key: 'map', label: 'Map', value: `${activeLayerFeatureCount} feature${activeLayerFeatureCount === 1 ? '' : 's'}`, detail: selectedAreaHasGeometry ? 'AOI overlay available' : 'AOI overlay missing', state: selectedAreaHasGeometry || activeLayerFeatureCount > 0 ? 'ready' : 'waiting', }, { key: 'qa', label: 'QA/QC', value: `${qualityChecks.length} check${qualityChecks.length === 1 ? '' : 's'}`, detail: latestQualityCheck ? `${latestQualityCheck.check_type}: ${latestQualityCheck.status}` : 'no persisted QA/QC result', state: qualityChecks.length > 0 ? 'ready' : 'waiting', }, { key: 'exports', label: 'Exports', value: `${exports.length} export${exports.length === 1 ? '' : 's'}`, detail: latestExport ? `${latestExport.export_type}: ${latestExport.status}` : 'no handoff artifact yet', state: exports.length > 0 ? 'ready' : 'waiting', }, ] const readyCount = items.filter((item) => item.state === 'ready').length return (

V1 readiness

Workbench status: {readyCount === items.length ? 'Mol workbench is ready' : 'Mol workbench needs attention'}

{nextAction(items)}

{readyCount}/{items.length} stages ready
{items.map((item) => (
{item.label} {item.state}
{item.value}

{item.detail}

))}
) }