diff --git a/CHANGELOG.md b/CHANGELOG.md index fccf90f0..7764bd16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -579,3 +579,11 @@ Added: - Added `scripts/verify_demo_export_workflow.sh` to smoke test demo seeding, QA/QC visibility, metadata/report/vector exports, export listing and artifact downloads through the browser-facing URL. - Added backend tests for export persistence, artifact writing, raster rejection, HTML report creation, canonical export envelopes and raw file downloads. - No migrations, new dependencies, live provider fetching, AI inference, LiDAR, Copilot, Training Studio or separate Reports module were introduced. + +## Sprint 51 QA/QC and export workspace polish (2026-06-17) + +- Polished the QA/QC workspace with persisted-check summary tiles, clearer empty state, quality-check cards and metric chips. +- Polished the Exports workspace with artifact action groups, latest-export card, export history cards and preview panel framing. +- Preserved existing API clients, callbacks and export/QA behavior. +- Added regression coverage for the QA/QC and Exports workspace structure. +- No API contracts, migrations, product capabilities, live provider fetching or AI/model dependency changes were introduced. diff --git a/backend/tests/test_sprint51_quality_export_polish.py b/backend/tests/test_sprint51_quality_export_polish.py new file mode 100644 index 00000000..960918a0 --- /dev/null +++ b/backend/tests/test_sprint51_quality_export_polish.py @@ -0,0 +1,38 @@ +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[2] + + +def test_quality_panel_uses_workbench_summary_and_cards() -> None: + quality_panel = ( + ROOT / "frontend" / "src" / "components" / "quality" / "QualityResultsPanel.tsx" + ).read_text(encoding="utf-8") + + assert 'className="quality-results-panel"' in quality_panel + assert 'className="quality-summary-grid"' in quality_panel + assert 'className="quality-check-list"' in quality_panel + assert 'className="quality-check-card"' in quality_panel + assert "No persisted QA/QC results yet" in quality_panel + assert "check.metrics.map" in quality_panel + assert "fetch(" not in quality_panel + + +def test_export_center_uses_artifact_actions_and_cards() -> None: + export_center = (ROOT / "frontend" / "src" / "components" / "exports" / "ExportCenter.tsx").read_text( + encoding="utf-8" + ) + export_preview = (ROOT / "frontend" / "src" / "components" / "exports" / "ExportPreview.tsx").read_text( + encoding="utf-8" + ) + + assert 'className="export-center"' in export_center + assert 'className="export-action-grid"' in export_center + assert 'className="latest-export-card"' in export_center + assert 'className="export-list"' in export_center + assert 'className="export-card"' in export_center + assert "onExportDataset" in export_center + assert "onExportDetectionRun" in export_center + assert "onExportSegmentationRun" in export_center + assert "download-only HTML artifact" in export_center + assert 'className="export-preview-panel"' in export_preview diff --git a/docs/CODEX_EXECUTION_LOG.md b/docs/CODEX_EXECUTION_LOG.md index 0bc3aaaa..7fa0306d 100644 --- a/docs/CODEX_EXECUTION_LOG.md +++ b/docs/CODEX_EXECUTION_LOG.md @@ -2091,3 +2091,27 @@ Limitations: Next recommended pass: - Deploy to Tower and verify the Data, Map and AI Labs workspaces on `http://192.168.10.150:1202`. + +## Sprint 51 QA/QC and export workspace polish (2026-06-17) + +Changed: +- Refined the QA/QC workspace so persisted checks are shown as summary tiles, quality-check cards and metric chips instead of a raw nested list. +- Refined the Exports workspace with grouped export actions, latest-export status, artifact history cards and a framed JSON/GeoJSON preview panel. +- Kept the existing `useQualityWorkflow` and `useExportWorkflow` dataflow intact; no API client calls or backend contracts changed. +- Added regression coverage for the polished QA/QC and Exports workspace structure. + +Tested: +- `cd frontend && npm run typecheck` +- `cd backend && python -m pytest tests/test_sprint27_frontend_workflow_hooks.py tests/test_sprint30_workbench_components.py tests/test_sprint47_workbench_interaction_smoke.py -q` +- `cd backend && python -m pytest tests/test_sprint51_quality_export_polish.py -q` +- `cd frontend && npm run build` +- `bash scripts/run_readiness_check.sh` (`207 passed`) + +Open: +- Commit, push, deploy to Tower and verify the browser-facing workbench. + +Limitations: +- This pass remains UI polish only. It does not add product capabilities, change API contracts, alter migrations, fetch live providers or enable new AI models. + +Next recommended pass: +- Verify QA/QC and Exports on the deployed Tower workbench, then continue with selected-object inspector detail tabs. diff --git a/docs/TODO.md b/docs/TODO.md index bde4e605..7e97d780 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -318,4 +318,7 @@ This file now starts with the current implementation status. Older preparation/b - [x] Replace the one-page workflow panel stack with a task-based workbench shell. - [x] Add persistent project/AOI/dataset/layer context. - [x] Move selected dataset details into a persistent inspector. -- [ ] Deploy the shell refactor to Tower and run live browser smoke on port 1202. +- [x] Deploy the shell refactor to Tower and run live browser smoke on port 1202. +- [x] Polish Data, Map and AI Labs workspaces. +- [x] Polish QA/QC and Exports workspaces. +- [ ] Add selected-object inspector detail tabs for project, AOI, dataset, QA check, export and AI run context. diff --git a/frontend/src/components/exports/ExportCenter.tsx b/frontend/src/components/exports/ExportCenter.tsx index 1ab96aa1..42679dee 100644 --- a/frontend/src/components/exports/ExportCenter.tsx +++ b/frontend/src/components/exports/ExportCenter.tsx @@ -54,57 +54,103 @@ export function ExportCenter({ onDownload, }: ExportCenterProps): JSX.Element { 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 return ( -
-

Export Center

- - - - - - +
+
+
+

Export Center

+

Create handoff artifacts from persisted datasets, AI runs and project metadata.

+
+ {exports.length} exports +
+
+
+ GeoJSON + {geojsonExports} +
+
+ Reports + {reportExports} +
+
+ Selected dataset + {selectedDataset?.name ?? 'none'} +
+
+
+ + + + + + +
{exportError ?

{exportError}

: null} {latestExport ? ( -

- Latest export: {latestExport.export_type} {'->'} {latestExport.path} -

+
+ Latest export + {latestExport.export_type} +

{latestExport.path}

+
) : null} - {exports.length === 0 ?

No exports registered yet.

: null} -