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
+27 -7
View File
@@ -46,6 +46,7 @@ export function useProjectWorkspace() {
const [loadingProjects, setLoadingProjects] = useState(false)
const [loadingAreas, setLoadingAreas] = useState(false)
const [loadingDatasets, setLoadingDatasets] = useState(false)
const [archivingProjectId, setArchivingProjectId] = useState<string | null>(null)
const [errorMessage, setErrorMessage] = useState<string | null>(null)
const projectDataRequestSequence = useRef(0)
@@ -159,7 +160,7 @@ export function useProjectWorkspace() {
setSelectedProjectId(nextProjectId)
}
} catch (error) {
setErrorMessage(error instanceof Error ? error.message : 'Failed to load projects')
setErrorMessage(error instanceof Error ? error.message : 'Werkruimtes konden niet worden geladen')
} finally {
setLoadingProjects(false)
}
@@ -180,7 +181,7 @@ export function useProjectWorkspace() {
return projectData
} catch (error) {
if (requestId === projectDataRequestSequence.current) {
setErrorMessage(error instanceof Error ? error.message : 'Failed to load project data')
setErrorMessage(error instanceof Error ? error.message : 'De gegevens van de werkruimte konden niet worden geladen')
}
return null
} finally {
@@ -194,7 +195,7 @@ export function useProjectWorkspace() {
const createProject = async (event: FormEvent) => {
event.preventDefault()
if (!projectForm.name.trim()) {
setErrorMessage('Project name is required')
setErrorMessage('Geef een naam voor de werkruimte op')
return
}
try {
@@ -207,21 +208,21 @@ export function useProjectWorkspace() {
setSelectedProjectId(createdProject.id)
await loadProjects(createdProject.id)
} catch (error) {
setErrorMessage(error instanceof Error ? error.message : 'Failed to create project')
setErrorMessage(error instanceof Error ? error.message : 'De werkruimte kon niet worden aangemaakt')
}
}
const createArea = async (event: FormEvent) => {
event.preventDefault()
if (!selectedProjectId) {
setErrorMessage('Select a project first')
setErrorMessage('Kies eerst een werkruimte')
return
}
let geometry: AreaCreate['geometry']
try {
geometry = JSON.parse(areaForm.geometry) as AreaCreate['geometry']
} catch {
setErrorMessage('Invalid GeoJSON geometry JSON')
setErrorMessage('De opgegeven GeoJSON-geometrie is ongeldig')
return
}
try {
@@ -233,7 +234,24 @@ export function useProjectWorkspace() {
await loadProjectData(selectedProjectId)
setAreaForm((previous) => ({ ...previous, name: '' }))
} catch (error) {
setErrorMessage(error instanceof Error ? error.message : 'Failed to create area')
setErrorMessage(error instanceof Error ? error.message : 'Het gebied kon niet worden aangemaakt')
}
}
const archiveProject = async (projectId: string) => {
setArchivingProjectId(projectId)
setErrorMessage(null)
try {
await projectsApi.update(projectId, { status: 'archived' })
if (selectedProjectId === projectId) {
setSelectedProjectId(null)
resetProjectData()
}
await loadProjects()
} catch (error) {
setErrorMessage(error instanceof Error ? error.message : 'De werkruimte kon niet worden gearchiveerd')
} finally {
setArchivingProjectId(null)
}
}
@@ -252,6 +270,7 @@ export function useProjectWorkspace() {
loadingProjects,
loadingAreas,
loadingDatasets,
archivingProjectId,
errorMessage,
projectForm,
areaForm,
@@ -259,6 +278,7 @@ export function useProjectWorkspace() {
loadProjectData,
createProject,
createArea,
archiveProject,
resetProjectData,
setSelectedProjectId,
setErrorMessage,