feat: simplify regional end user workbench
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-14 21:40:32 +02:00
parent 1693e4ca1f
commit b5bcd9b041
52 changed files with 1183 additions and 617 deletions
@@ -7,6 +7,23 @@ interface ProviderPanelProps {
onRefresh: () => void
}
function providerStatusLabel(provider: ProviderCapability): string {
if (provider.configured) {
return 'Beschikbaar'
}
return 'Live koppeling uit'
}
function authorityLabel(value: string): string {
const labels: Record<string, string> = {
authoritative: 'Officieel',
contextual: 'Aanvullend',
manual: 'Eigen upload',
fixture: 'Testgegevens',
}
return labels[value] ?? value
}
export function ProviderPanel({
providers,
loadingCapabilities,
@@ -18,40 +35,40 @@ export function ProviderPanel({
<div className="system-provider-shell">
<div className="panel-title-row">
<div>
<h2>Provider Capabilities</h2>
<p className="muted">Review configured local providers and honest not-configured external sources.</p>
<h2>Databronnen</h2>
<p className="muted">Beschikbaarheid en herkomst van officiële, aanvullende en eigen bronnen.</p>
</div>
<button type="button" className="secondary-action" onClick={onRefresh} disabled={loadingCapabilities}>
Refresh providers
Status vernieuwen
</button>
</div>
<div className="system-provider-state-stack">
{loadingCapabilities ? (
<div className="result-state result-state-loading">
<strong>Loading provider capabilities.</strong>
<p>Checking local, fixture and external provider registry states.</p>
<strong>Databronnen laden.</strong>
<p>De lokale en externe bronstatus wordt gecontroleerd.</p>
</div>
) : null}
{capabilitiesError ? (
<div className="result-state result-state-error">
<strong>Provider registry unavailable.</strong>
<strong>Bronregister niet bereikbaar.</strong>
<p>{capabilitiesError}</p>
</div>
) : null}
{providers.length === 0 && !loadingCapabilities ? (
<div className="result-state result-state-empty">
<strong>No providers reported by backend.</strong>
<p>Refresh provider capabilities after the backend is reachable.</p>
<strong>Geen databronnen gemeld.</strong>
<p>Vernieuw de status zodra de backend bereikbaar is.</p>
</div>
) : null}
</div>
<div className="system-provider-capability-surface" aria-label="Provider capability registry">
<div className="provider-detail-stack">
<strong>Official reference sources</strong>
<strong>Officiële referentiebronnen</strong>
<div>
GRB and OSM are reference-data provider capabilities, not AI model choices. Manual upload is the configured path for real reference datasets today; fixtures remain test/demo only.
Reeds ingeladen GRB-lagen blijven lokaal beschikbaar. De live GRB- en OSM-koppelingen staan uit en halen dus niet ongemerkt externe gegevens op.
</div>
</div>
<ul className="system-provider-list">
@@ -62,24 +79,16 @@ export function ProviderPanel({
<strong>{provider.display_name}</strong>
<span>{provider.provider_name}</span>
</div>
<span className={provider.configured ? 'status-badge status-badge-ready' : 'status-badge'}>{provider.status}</span>
<span className={provider.configured ? 'status-badge status-badge-ready' : 'status-badge'}>{providerStatusLabel(provider)}</span>
</div>
<div className="system-provider-grid">
<div>
<span>Authority</span>
<strong>{provider.authority_level}</strong>
<span>Herkomst</span>
<strong>{authorityLabel(provider.authority_level)}</strong>
</div>
<div>
<span>Configured</span>
<strong>{provider.configured ? 'yes' : 'no'}</strong>
</div>
<div>
<span>Geometry</span>
<strong>{provider.supported_geometry_types.join(', ')}</strong>
</div>
<div>
<span>Query modes</span>
<strong>{provider.supported_query_modes.join(', ')}</strong>
<span>Status</span>
<strong>{providerStatusLabel(provider)}</strong>
</div>
</div>
<div className="provider-layer-list" aria-label={`${provider.provider_name} supported layers`}>
@@ -89,22 +98,29 @@ export function ProviderPanel({
</span>
))}
</div>
<div className="provider-detail-stack">
<div>limitation: {provider.limitation_message}</div>
{!provider.configured && provider.not_configured_reason ? (
<div>reason: {provider.not_configured_reason}</div>
) : null}
</div>
<div className="provider-provenance-grid">
<div className="provider-provenance-card">
<span>Attribution</span>
<strong>{provider.attribution}</strong>
<details className="provider-technical-details">
<summary>Herkomst en technische mogelijkheden</summary>
<div className="provider-detail-stack">
<div>{provider.limitation_message}</div>
{!provider.configured && provider.not_configured_reason ? (
<div>{provider.not_configured_reason}</div>
) : null}
</div>
<div className="provider-provenance-card">
<span>License</span>
<strong>{provider.license_note}</strong>
<div className="provider-provenance-grid">
<div className="provider-provenance-card">
<span>Naamsvermelding</span>
<strong>{provider.attribution}</strong>
</div>
<div className="provider-provenance-card">
<span>Licentie</span>
<strong>{provider.license_note}</strong>
</div>
</div>
</div>
<div className="entity-meta">
<span>Geometrie: {provider.supported_geometry_types.join(', ')}</span>
<span>Zoekwijzen: {provider.supported_query_modes.join(', ')}</span>
</div>
</details>
</li>
))}
</ul>