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
@@ -4,6 +4,7 @@ import type { ProjectCreate, ProjectRead } from '../../types'
const TECHNICAL_PROJECT_PATTERN = /^(GeoIntel Detection Quality Matrix|GeoIntel hard-negative|GeoIntel training|Mol Building QA)/i
const REGIONAL_PROJECT_NAME = 'Kempen Regional Workbench'
const LEGACY_MOL_PROJECT_NAME = 'Mol Municipality Workbench'
const PROTECTED_PROJECT_NAMES = new Set([REGIONAL_PROJECT_NAME, LEGACY_MOL_PROJECT_NAME])
function isTechnicalProject(project: ProjectRead): boolean {
return TECHNICAL_PROJECT_PATTERN.test(project.name)
@@ -27,12 +28,14 @@ interface ProjectPanelProps {
projects: ProjectRead[]
selectedProjectId: string | null
loadingProjects: boolean
archivingProjectId: string | null
projectForm: ProjectCreate
loadingDemoWorkflow: boolean
demoWorkflowMessage: string | null
onCreateProject: (event: FormEvent<HTMLFormElement>) => void
onUpdateProjectForm: (projectForm: ProjectCreate) => void
onSelectProject: (projectId: string) => void
onArchiveProject: (projectId: string) => Promise<void>
onLoadDemoWorkflow: () => void
}
@@ -40,12 +43,14 @@ export function ProjectPanel({
projects,
selectedProjectId,
loadingProjects,
archivingProjectId,
projectForm,
loadingDemoWorkflow,
demoWorkflowMessage,
onCreateProject,
onUpdateProjectForm,
onSelectProject,
onArchiveProject,
onLoadDemoWorkflow,
}: ProjectPanelProps): JSX.Element {
const selectedProject = projects.find((project) => project.id === selectedProjectId)
@@ -134,6 +139,28 @@ export function ProjectPanel({
</button>
{demoWorkflowMessage ? <p>{demoWorkflowMessage}</p> : null}
</div>
{selectedProject && !PROTECTED_PROJECT_NAMES.has(selectedProject.name) ? (
<div className="project-lifecycle-actions">
<div>
<strong>Actieve werkruimte opruimen</strong>
<p className="muted">
Archiveren verbergt deze werkruimte uit de standaardlijst. Databronnen en analyseresultaten blijven bewaard.
</p>
</div>
<button
className="secondary-action"
type="button"
disabled={archivingProjectId === selectedProject.id}
onClick={() => {
if (window.confirm(`Werkruimte "${projectDisplayName(selectedProject)}" archiveren?`)) {
void onArchiveProject(selectedProject.id)
}
}}
>
{archivingProjectId === selectedProject.id ? 'Archiveren...' : 'Werkruimte archiveren'}
</button>
</div>
) : null}
{advancedProjects.length > 0 ? (
<details className="technical-run-list">
<summary>{advancedProjects.length} alternatieve en technische werkruimtes</summary>