122 lines
4.8 KiB
TypeScript
122 lines
4.8 KiB
TypeScript
import InteractiveInvestmentMap from './interactive-investment-map';
|
|
import {
|
|
useTerritoryGeometry,
|
|
type TerritoryGeometryContext,
|
|
} from './use-territory-geometry';
|
|
|
|
const noPoints: [] = [];
|
|
export default function TerritoryGeometryPreview({
|
|
territoryId,
|
|
management = false,
|
|
endpoint: suppliedEndpoint,
|
|
label = 'Cobertura cartográfica da seleção',
|
|
}: {
|
|
territoryId?: string;
|
|
management?: boolean;
|
|
endpoint?: string;
|
|
label?: string;
|
|
}) {
|
|
const { context, error } = useTerritoryGeometry(
|
|
territoryId,
|
|
suppliedEndpoint ??
|
|
(management
|
|
? '/management/territory-geometries'
|
|
: '/api/v1/investment/territory-geometries'),
|
|
);
|
|
if (!territoryId) return null;
|
|
return (
|
|
<TerritoryGeometryDetails
|
|
context={context}
|
|
error={error}
|
|
label={label}
|
|
renderMap
|
|
/>
|
|
);
|
|
}
|
|
|
|
export function TerritoryGeometryDetails({
|
|
context,
|
|
error,
|
|
label = 'Cobertura cartográfica da selecção',
|
|
renderMap = false,
|
|
showSources = true,
|
|
}: {
|
|
context: TerritoryGeometryContext | null;
|
|
error: string;
|
|
label?: string;
|
|
renderMap?: boolean;
|
|
showSources?: boolean;
|
|
}) {
|
|
return (
|
|
<section className="space-y-2 md:col-span-full" aria-label={label}>
|
|
<p>Território selecionado no cadastro.</p>
|
|
{error && <p role="alert">{error}</p>}
|
|
{!context && !error && <p role="status">A consultar geometria…</p>}
|
|
{context && (
|
|
<>
|
|
<p role="status">
|
|
{context.selected_geometry_available
|
|
? 'Limite administrativo disponível para este território.'
|
|
: 'Sem limite administrativo acessível para este território neste perfil.'}
|
|
</p>
|
|
{!context.selected_geometry_available &&
|
|
context.areas.length > 0 && (
|
|
<p role="note">
|
|
O mapa mostra outros limites da hierarquia como
|
|
contexto. Estes limites não representam o
|
|
território seleccionado.
|
|
</p>
|
|
)}
|
|
<p>
|
|
{context.context_geometry_count} limites disponíveis na
|
|
hierarquia consultada. São contexto administrativo, não
|
|
perímetro nem disponibilidade de investimento. A edição
|
|
e a atualidade jurídica são informações distintas.
|
|
</p>
|
|
{context.child_coverage?.location_type && (
|
|
<p role="status">
|
|
Subdivisões do nível imediatamente inferior com
|
|
limite nesta resposta:{' '}
|
|
{context.child_coverage.represented_count} de{' '}
|
|
{context.child_coverage.registered_count}{' '}
|
|
referências acessíveis. As restantes não têm limite
|
|
apresentado nesta consulta; isso não significa
|
|
inexistência do território.
|
|
</p>
|
|
)}
|
|
{context.truncated && (
|
|
<p role="alert">
|
|
Consulta limitada a 100 geometrias e 500
|
|
subdivisões; cobertura incompleta.
|
|
</p>
|
|
)}
|
|
{renderMap && context.areas.length > 0 && (
|
|
<InteractiveInvestmentMap
|
|
points={noPoints}
|
|
areas={context.areas}
|
|
contextOnly
|
|
/>
|
|
)}
|
|
{showSources && (
|
|
<ul>
|
|
{context.areas.map((area, index) => (
|
|
<li key={index}>
|
|
{area.title} ·{' '}
|
|
{area.selected_territory
|
|
? 'Território seleccionado'
|
|
: area.child_territory
|
|
? 'Subdivisão do território seleccionado'
|
|
: 'Contexto de nível superior'}{' '}
|
|
· Fonte:{' '}
|
|
{area.source_reference ?? 'Não indicada'} ·
|
|
Edição: {area.source_date ?? 'Não indicada'}
|
|
</li>
|
|
))}
|
|
</ul>
|
|
)}
|
|
</>
|
|
)}
|
|
</section>
|
|
);
|
|
}
|