Polish workflow rail context navigation
This commit is contained in:
@@ -7,6 +7,14 @@
|
|||||||
|
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## Sprint 92 workflow rail interaction polish (2026-06-21)
|
||||||
|
|
||||||
|
- Audited the live Overview workflow rail click path from Overview to Data, Map, QA/QC and Exports.
|
||||||
|
- Hardened the Map workflow step to reuse the first ready vector/GeoJSON dataset through the existing map-open flow when no layer is active.
|
||||||
|
- Hardened the Export workflow step to reuse the first ready vector/GeoJSON dataset through the existing export-open flow when no dataset is selected.
|
||||||
|
- Added regression coverage for the context-aware rail handler and fallback workspace navigation.
|
||||||
|
- No API contracts, migrations, backend behavior, provider fetching or AI model behavior changed.
|
||||||
|
|
||||||
## Sprint 91 populated workflow audit polish (2026-06-21)
|
## Sprint 91 populated workflow audit polish (2026-06-21)
|
||||||
|
|
||||||
- Audited the live populated demo workflow on `http://192.168.10.150:1202` across Overview, Data, Map, QA/QC, AI Labs and Exports.
|
- Audited the live populated demo workflow on `http://192.168.10.150:1202` across Overview, Data, Map, QA/QC, AI Labs and Exports.
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ def test_workflow_guidance_routes_to_existing_workspaces() -> None:
|
|||||||
assert "target: 'analysis'" in app
|
assert "target: 'analysis'" in app
|
||||||
assert "target: 'exports'" in app
|
assert "target: 'exports'" in app
|
||||||
assert "onOpenAiWorkspace={() => setActiveWorkspace('ai')}" in app
|
assert "onOpenAiWorkspace={() => setActiveWorkspace('ai')}" in app
|
||||||
assert "onClick={() => setActiveWorkspace(step.target)}" in app
|
assert "onClick={() => openWorkflowGuidanceStep(step.target)}" in app
|
||||||
|
assert "setActiveWorkspace(target)" in app
|
||||||
|
|
||||||
|
|
||||||
def test_workflow_guidance_has_responsive_contracts() -> None:
|
def test_workflow_guidance_has_responsive_contracts() -> None:
|
||||||
@@ -50,3 +51,14 @@ def test_workflow_guidance_complete_state_and_map_copy_are_precise() -> None:
|
|||||||
assert "layer feature" in app
|
assert "layer feature" in app
|
||||||
assert "+ AOI" in app
|
assert "+ AOI" in app
|
||||||
assert "AOI loaded" in app
|
assert "AOI loaded" in app
|
||||||
|
|
||||||
|
|
||||||
|
def test_workflow_guidance_map_and_export_steps_reuse_dataset_context() -> None:
|
||||||
|
app = (ROOT / "frontend" / "src" / "App.tsx").read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
assert "openWorkflowGuidanceStep" in app
|
||||||
|
assert "target === 'map'" in app
|
||||||
|
assert "openDatasetInMap(availableMapDatasets[0])" in app
|
||||||
|
assert "target === 'exports'" in app
|
||||||
|
assert "openDatasetExport(availableMapDatasets[0])" in app
|
||||||
|
assert "onClick={() => openWorkflowGuidanceStep(step.target)}" in app
|
||||||
|
|||||||
@@ -3309,3 +3309,31 @@ Limitations:
|
|||||||
|
|
||||||
Next recommended pass:
|
Next recommended pass:
|
||||||
- After deploy and live validation, continue with any remaining populated-state visual issues found in the next audit.
|
- After deploy and live validation, continue with any remaining populated-state visual issues found in the next audit.
|
||||||
|
|
||||||
|
## Sprint 92 workflow rail interaction polish (2026-06-21)
|
||||||
|
|
||||||
|
Changed:
|
||||||
|
- Audited the live Overview workflow rail click path on `http://192.168.10.150:1202`.
|
||||||
|
- Added `openWorkflowGuidanceStep` so Map and Export rail clicks can reuse existing dataset context flows.
|
||||||
|
- Map rail click now opens the first ready vector/GeoJSON dataset through `openDatasetInMap` when no layer is active.
|
||||||
|
- Export rail click now opens the first ready vector/GeoJSON dataset through `openDatasetExport` when no dataset is selected.
|
||||||
|
- Extended `backend/tests/test_sprint90_workflow_guidance.py` with regression coverage for the context-aware rail handler.
|
||||||
|
- Updated `frontend/README.md`, `docs/TODO.md` and `CHANGELOG.md`.
|
||||||
|
|
||||||
|
Tested:
|
||||||
|
- Live pre-change browser audit showed the rail navigated correctly but Map landed with no active layer and Exports landed with `Selected dataset: none`.
|
||||||
|
- Red step: `python -m pytest backend/tests/test_sprint90_workflow_guidance.py -q` failed on missing `openWorkflowGuidanceStep` / dataset-context handler contracts.
|
||||||
|
- `python -m pytest backend/tests/test_sprint90_workflow_guidance.py backend/tests/test_sprint53_selection_ergonomics.py backend/tests/test_sprint67_map_empty_state_quick_actions.py backend/tests/test_sprint64_export_handoff_polish.py -q` (`15 passed`)
|
||||||
|
- `cd frontend && npm run typecheck`
|
||||||
|
- `cd frontend && npm run build`
|
||||||
|
- Local browser UI check against `http://127.0.0.1:5174` passed for rail rendering with no horizontal overflow. Local console showed expected Vite proxy 500s because only the frontend server was running.
|
||||||
|
- `bash scripts/run_readiness_check.sh` (`308 passed`; frontend typecheck/build passed; Alembic head `202606120900`; live smoke syntax passed)
|
||||||
|
|
||||||
|
Open:
|
||||||
|
- Tower deploy and live post-change rail interaction validation still pending for this pass.
|
||||||
|
|
||||||
|
Limitations:
|
||||||
|
- Frontend workflow navigation polish only; no API contract, persistence, migration, provider fetching or AI/model behavior changes.
|
||||||
|
|
||||||
|
Next recommended pass:
|
||||||
|
- After deploy and live validation, continue with export artifact action ergonomics or QA result drill-down, depending on the next live friction point.
|
||||||
|
|||||||
@@ -363,3 +363,4 @@ This file now starts with the current implementation status. Older preparation/b
|
|||||||
- [x] Add QA/QC result filtering and density controls for long-running demo projects.
|
- [x] Add QA/QC result filtering and density controls for long-running demo projects.
|
||||||
- [x] Add Overview workflow guidance for the V1 project -> data -> map -> QA/AI -> export path.
|
- [x] Add Overview workflow guidance for the V1 project -> data -> map -> QA/AI -> export path.
|
||||||
- [x] Audit populated demo workflow and tighten complete-state Overview guidance copy.
|
- [x] Audit populated demo workflow and tighten complete-state Overview guidance copy.
|
||||||
|
- [x] Make Overview workflow rail Map/Export clicks preserve useful dataset context.
|
||||||
|
|||||||
@@ -250,6 +250,7 @@ Detection Lab and Segmentation Lab now share the same AI workspace hierarchy: mo
|
|||||||
- The Overview workspace separates readiness, status tiles and recommended next actions into distinct visual hierarchy regions, keeping the first screen scannable without changing workflow behavior.
|
- The Overview workspace separates readiness, status tiles and recommended next actions into distinct visual hierarchy regions, keeping the first screen scannable without changing workflow behavior.
|
||||||
- The Overview workspace now also shows a compact workflow guidance rail for the V1 path from project and AOI setup through data, map review, QA/AI validation and export handoff.
|
- The Overview workspace now also shows a compact workflow guidance rail for the V1 path from project and AOI setup through data, map review, QA/AI validation and export handoff.
|
||||||
- When the V1 workflow is populated end to end, the Overview rail switches to a `Ready for handoff` state and keeps map guidance explicit about layer features versus AOI context.
|
- When the V1 workflow is populated end to end, the Overview rail switches to a `Ready for handoff` state and keeps map guidance explicit about layer features versus AOI context.
|
||||||
|
- Overview rail Map and Export clicks reuse the first ready vector/GeoJSON dataset when no layer or dataset is active, keeping the happy path connected without adding new API calls.
|
||||||
- The Data workspace surfaces selected project, AOI and dataset context before creation/upload forms, then separates form and catalog/list regions for faster scanning.
|
- The Data workspace surfaces selected project, AOI and dataset context before creation/upload forms, then separates form and catalog/list regions for faster scanning.
|
||||||
- The Export Center includes a handoff readiness summary, grouped artifact actions and provenance-rich export cards so report/GeoJSON handoff stays understandable in long-running demo projects.
|
- The Export Center includes a handoff readiness summary, grouped artifact actions and provenance-rich export cards so report/GeoJSON handoff stays understandable in long-running demo projects.
|
||||||
|
|
||||||
|
|||||||
+12
-1
@@ -449,6 +449,17 @@ function App(): JSX.Element {
|
|||||||
}
|
}
|
||||||
setActiveWorkspace('exports')
|
setActiveWorkspace('exports')
|
||||||
}
|
}
|
||||||
|
const openWorkflowGuidanceStep = (target: WorkspaceKey) => {
|
||||||
|
if (target === 'map' && availableMapDatasets.length > 0 && !mapFeatureCollection) {
|
||||||
|
openDatasetInMap(availableMapDatasets[0])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (target === 'exports' && availableMapDatasets.length > 0 && !selectedDataset) {
|
||||||
|
openDatasetExport(availableMapDatasets[0])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setActiveWorkspace(target)
|
||||||
|
}
|
||||||
const hasAnalysisOutput = qualityChecks.length > 0 || Boolean(changeDetectionResult) || detectionItems.length > 0 || segmentationItems.length > 0
|
const hasAnalysisOutput = qualityChecks.length > 0 || Boolean(changeDetectionResult) || detectionItems.length > 0 || segmentationItems.length > 0
|
||||||
const hasMapContext = mapFeatureCount > 0 || areaFeatureCount > 0
|
const hasMapContext = mapFeatureCount > 0 || areaFeatureCount > 0
|
||||||
const workflowGuidanceComplete = Boolean(selectedProjectId) && datasets.length > 0 && hasMapContext && hasAnalysisOutput && exports.length > 0
|
const workflowGuidanceComplete = Boolean(selectedProjectId) && datasets.length > 0 && hasMapContext && hasAnalysisOutput && exports.length > 0
|
||||||
@@ -630,7 +641,7 @@ function App(): JSX.Element {
|
|||||||
? 'workflow-guidance-step workflow-guidance-step-ready'
|
? 'workflow-guidance-step workflow-guidance-step-ready'
|
||||||
: 'workflow-guidance-step'
|
: 'workflow-guidance-step'
|
||||||
}
|
}
|
||||||
onClick={() => setActiveWorkspace(step.target)}
|
onClick={() => openWorkflowGuidanceStep(step.target)}
|
||||||
aria-label={`Open ${step.title} step`}
|
aria-label={`Open ${step.title} step`}
|
||||||
>
|
>
|
||||||
<span className="workflow-step-status">{step.status}</span>
|
<span className="workflow-step-status">{step.status}</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user