fix(catalogue): keep filtered investment results separate from educational guides
This commit is contained in:
@@ -1769,3 +1769,14 @@ Relatório: `catalogue-province-coverage-qa-20261028.json`. Instalação pelo pr
|
|||||||
Pedido expresso da Tempo: o dropdown deve abrir em «Pesquisar província», sem um segundo controlo «Seleccione». `ProvinceSelect` e `TerritoryLevel` passam a usar o mesmo combobox, aplicado a província, distrito, posto administrativo e localidade. Pesquisar e escolher fica num único campo; a paginação permanece na lista. Escrever ou sair com Escape não substitui a selecção guardada; escolher e limpar são acções expressas. Mantêm-se a hierarquia, os endpoints existentes e os controlos de acesso, sem novos dados ou publicações.
|
Pedido expresso da Tempo: o dropdown deve abrir em «Pesquisar província», sem um segundo controlo «Seleccione». `ProvinceSelect` e `TerritoryLevel` passam a usar o mesmo combobox, aplicado a província, distrito, posto administrativo e localidade. Pesquisar e escolher fica num único campo; a paginação permanece na lista. Escrever ou sair com Escape não substitui a selecção guardada; escolher e limpar são acções expressas. Mantêm-se a hierarquia, os endpoints existentes e os controlos de acesso, sem novos dados ou publicações.
|
||||||
|
|
||||||
Quatro testes do contrato de eventos/estado passaram: abertura/escolha, preservação ao escrever/Escape, teclado e bloqueio de resultado antigo durante carregamento, limpeza e dependência do nível anterior. Tipos e compilação QA passaram. As 6 provas nacionais/617 verificações são reutilizadas porque o PHP territorial não mudou. Este delta continua em QA e não comprova apresentação ou sessão real no navegador. Será agrupado com a correcção provincial; falta autenticação SSH antes da entrega, sem nova aprovação organizacional.
|
Quatro testes do contrato de eventos/estado passaram: abertura/escolha, preservação ao escrever/Escape, teclado e bloqueio de resultado antigo durante carregamento, limpeza e dependência do nível anterior. Tipos e compilação QA passaram. As 6 provas nacionais/617 verificações são reutilizadas porque o PHP territorial não mudou. Este delta continua em QA e não comprova apresentação ou sessão real no navegador. Será agrupado com a correcção provincial; falta autenticação SSH antes da entrega, sem nova aprovação organizacional.
|
||||||
|
|
||||||
|
|
||||||
|
28/10 - Before catalogue presentation checks: accepted province QA6/617 and unified selector QA4 remain preserved and uninstalled. Tempo reports Tourism/Cabo Delgado shows educational text and broad sector links. Read-only public API confirmed zero filtered records;unfiltered tourism returns16 records,all declared in Inhambane. This does not establish absence of tourism supply in Cabo Delgado. Correct presentation to retain filters and expose guides only as optional links;do not republish or reassign opportunities to manufacture results.
|
||||||
|
|
||||||
|
## 28/10/2026 — resultados do catálogo separados do apoio educativo, QA
|
||||||
|
|
||||||
|
A Tempo esclareceu que a combinação província/sector deve apresentar as oportunidades correspondentes, sem texto educativo ou atalhos que troquem a consulta por todas as oportunidades do sector. A consulta pública anónima conferiu Turismo/Cabo Delgado = zero oportunidades cadastradas; Turismo sem localização = 16, todas declaradas em Inhambane. Este snapshot não prova ausência de oferta turística em Cabo Delgado e não substitui inventário de fontes ou consulta autenticada.
|
||||||
|
|
||||||
|
Correcção de apresentação em QA: título dos resultados explicita sector e hierarquia escolhidos; removidos os cartões educativos e o botão sectorial sem localização da área de resultados. Os guias mantêm-se como títulos ligados em apoio opcional fechado por defeito. A remoção da localização é uma acção expressamente identificada como pesquisa noutras províncias. O estado vazio refere o cadastro consultado e a cobertura incompleta, sem fabricar oportunidades nem alargar automaticamente filtros.
|
||||||
|
|
||||||
|
Dois testes SSR do novo apoio opcional passaram, bem como tipos e compilação. As provas territoriais nacionais 6/617 e os quatro testes do selector são reutilizados; não mudou a consulta PHP ou o controlo territorial neste delta. Mantêm-se histórico, publicações, permissões, fontes e base interna. Este candidato continua sem instalação, dependente de autenticação SSH; a sessão real permanece sem prova visual. Relatório existente: `catalogue-province-coverage-qa-20261028.json`, campo `catalogue_result_presentation`. Requisitos V2-07/V2-10 actualizados na mesma matriz; L8 permanece parcial.
|
||||||
|
|||||||
@@ -86,5 +86,46 @@
|
|||||||
"publication_data_permissions_and_territory_rules": "unchanged",
|
"publication_data_permissions_and_territory_rules": "unchanged",
|
||||||
"national_province_evidence": "6 tests/617 assertions reused;unchanged PHP runtime",
|
"national_province_evidence": "6 tests/617 assertions reused;unchanged PHP runtime",
|
||||||
"status": "QA_not_installed"
|
"status": "QA_not_installed"
|
||||||
|
},
|
||||||
|
"catalogue_result_presentation": {
|
||||||
|
"Tempo_request": "Province+sector must show matching opportunities,not educational text and unfiltered national sector shortcuts",
|
||||||
|
"public_read_snapshot": {
|
||||||
|
"filtered": {
|
||||||
|
"total": 0,
|
||||||
|
"province": "Cabo Delgado",
|
||||||
|
"sector": "turismo",
|
||||||
|
"province_id": "059b02ca-7095-577a-8705-4d4c46896747"
|
||||||
|
},
|
||||||
|
"active_writes": 0,
|
||||||
|
"sector_only": {
|
||||||
|
"total": 16,
|
||||||
|
"declared_provinces": [
|
||||||
|
"Inhambane"
|
||||||
|
],
|
||||||
|
"sector": "turismo"
|
||||||
|
},
|
||||||
|
"method": "anonymous public API read; no authenticated session claimed",
|
||||||
|
"meaning": "public catalogue snapshot;not evidence of absence of market supply",
|
||||||
|
"checked_at": "2026-10-28T19:03:36.8285860Z",
|
||||||
|
"target": "https://teste-investidor.tempo.co.mz/"
|
||||||
|
},
|
||||||
|
"UI_changes": [
|
||||||
|
"Heading identifies applied sector and territorial path",
|
||||||
|
"Educational cards and their broad sector opportunity button removed from catalogue results",
|
||||||
|
"Guide titles remain available only inside closed optional support details",
|
||||||
|
"Removing location is explicitly labelled as searching other provinces",
|
||||||
|
"Empty state is limited to published records in the consulted catalogue;not absence of market supply"
|
||||||
|
],
|
||||||
|
"QA": {
|
||||||
|
"new_component_SSR_tests": 2,
|
||||||
|
"failures": 0,
|
||||||
|
"types": "passed",
|
||||||
|
"build": "passed",
|
||||||
|
"accepted_national_and_selector_proofs": "reused;backend and selector unchanged"
|
||||||
|
},
|
||||||
|
"status": "QA_not_installed",
|
||||||
|
"authenticated_visual_validation": "pending;public API read does not prove real session behaviour",
|
||||||
|
"active_writes": 0,
|
||||||
|
"new_publications": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7327,3 +7327,14 @@ Relatório: `catalogue-province-coverage-qa-20261028.json`. Instalação pelo pr
|
|||||||
Pedido expresso da Tempo: o dropdown deve abrir em «Pesquisar província», sem um segundo controlo «Seleccione». `ProvinceSelect` e `TerritoryLevel` passam a usar o mesmo combobox, aplicado a província, distrito, posto administrativo e localidade. Pesquisar e escolher fica num único campo; a paginação permanece na lista. Escrever ou sair com Escape não substitui a selecção guardada; escolher e limpar são acções expressas. Mantêm-se a hierarquia, os endpoints existentes e os controlos de acesso, sem novos dados ou publicações.
|
Pedido expresso da Tempo: o dropdown deve abrir em «Pesquisar província», sem um segundo controlo «Seleccione». `ProvinceSelect` e `TerritoryLevel` passam a usar o mesmo combobox, aplicado a província, distrito, posto administrativo e localidade. Pesquisar e escolher fica num único campo; a paginação permanece na lista. Escrever ou sair com Escape não substitui a selecção guardada; escolher e limpar são acções expressas. Mantêm-se a hierarquia, os endpoints existentes e os controlos de acesso, sem novos dados ou publicações.
|
||||||
|
|
||||||
Quatro testes do contrato de eventos/estado passaram: abertura/escolha, preservação ao escrever/Escape, teclado e bloqueio de resultado antigo durante carregamento, limpeza e dependência do nível anterior. Tipos e compilação QA passaram. As 6 provas nacionais/617 verificações são reutilizadas porque o PHP territorial não mudou. Este delta continua em QA e não comprova apresentação ou sessão real no navegador. Será agrupado com a correcção provincial; falta autenticação SSH antes da entrega, sem nova aprovação organizacional.
|
Quatro testes do contrato de eventos/estado passaram: abertura/escolha, preservação ao escrever/Escape, teclado e bloqueio de resultado antigo durante carregamento, limpeza e dependência do nível anterior. Tipos e compilação QA passaram. As 6 provas nacionais/617 verificações são reutilizadas porque o PHP territorial não mudou. Este delta continua em QA e não comprova apresentação ou sessão real no navegador. Será agrupado com a correcção provincial; falta autenticação SSH antes da entrega, sem nova aprovação organizacional.
|
||||||
|
|
||||||
|
|
||||||
|
28/10 - Before catalogue presentation checks: accepted province QA6/617 and unified selector QA4 remain preserved and uninstalled. Tempo reports Tourism/Cabo Delgado shows educational text and broad sector links. Read-only public API confirmed zero filtered records;unfiltered tourism returns16 records,all declared in Inhambane. This does not establish absence of tourism supply in Cabo Delgado. Correct presentation to retain filters and expose guides only as optional links;do not republish or reassign opportunities to manufacture results.
|
||||||
|
|
||||||
|
## 28/10/2026 — resultados do catálogo separados do apoio educativo, QA
|
||||||
|
|
||||||
|
A Tempo esclareceu que a combinação província/sector deve apresentar as oportunidades correspondentes, sem texto educativo ou atalhos que troquem a consulta por todas as oportunidades do sector. A consulta pública anónima conferiu Turismo/Cabo Delgado = zero oportunidades cadastradas; Turismo sem localização = 16, todas declaradas em Inhambane. Este snapshot não prova ausência de oferta turística em Cabo Delgado e não substitui inventário de fontes ou consulta autenticada.
|
||||||
|
|
||||||
|
Correcção de apresentação em QA: título dos resultados explicita sector e hierarquia escolhidos; removidos os cartões educativos e o botão sectorial sem localização da área de resultados. Os guias mantêm-se como títulos ligados em apoio opcional fechado por defeito. A remoção da localização é uma acção expressamente identificada como pesquisa noutras províncias. O estado vazio refere o cadastro consultado e a cobertura incompleta, sem fabricar oportunidades nem alargar automaticamente filtros.
|
||||||
|
|
||||||
|
Dois testes SSR do novo apoio opcional passaram, bem como tipos e compilação. As provas territoriais nacionais 6/617 e os quatro testes do selector são reutilizados; não mudou a consulta PHP ou o controlo territorial neste delta. Mantêm-se histórico, publicações, permissões, fontes e base interna. Este candidato continua sem instalação, dependente de autenticação SSH; a sessão real permanece sem prova visual. Relatório existente: `catalogue-province-coverage-qa-20261028.json`, campo `catalogue_result_presentation`. Requisitos V2-07/V2-10 actualizados na mesma matriz; L8 permanece parcial.
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,15 @@
|
|||||||
|
import { Link } from '@inertiajs/react';
|
||||||
|
import type { EducationalArticle } from './educational-article-card';
|
||||||
|
|
||||||
|
/** Guides remain available on request; they are not matching investment results. */
|
||||||
|
export default function CatalogueGuideLinks({ articles }: { articles: EducationalArticle[] }) {
|
||||||
|
if (!articles.length) return null;
|
||||||
|
return <details className="rounded border p-3">
|
||||||
|
<summary className="cursor-pointer font-medium">Guias do sector — apoio opcional</summary>
|
||||||
|
<ul className="mt-3 space-y-2">
|
||||||
|
{articles.map((article) => <li key={article.href}>
|
||||||
|
<Link className="underline" href={article.href}>Ler guia: {article.title}</Link>
|
||||||
|
</li>)}
|
||||||
|
</ul>
|
||||||
|
</details>;
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import EducationalGuides from '@/components/educational-guides';
|
import CatalogueGuideLinks from '@/components/catalogue-guide-links';
|
||||||
import OpportunityCorridorGroups, { type CorridorGroup } from '@/components/opportunity-corridor-groups';
|
import OpportunityCorridorGroups, { type CorridorGroup } from '@/components/opportunity-corridor-groups';
|
||||||
import { searchTerritoryHref } from '@/lib/search-territory';
|
import { searchTerritoryHref } from '@/lib/search-territory';
|
||||||
import type { EducationalArticle } from '@/components/educational-article-card';
|
import type { EducationalArticle } from '@/components/educational-article-card';
|
||||||
@@ -381,6 +381,11 @@ export default function Catalogue({
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
<h2 className="text-xl font-semibold">
|
||||||
|
Oportunidades publicadas
|
||||||
|
{filters.sector && ` · ${references.sectors.find((sector) => sector.slug === filters.sector)?.name ?? filters.sector}`}
|
||||||
|
{territorySelection.length > 0 && ` · ${territorySelection.map((territory) => territory.name).join(' / ')}`}
|
||||||
|
</h2>
|
||||||
<SearchState
|
<SearchState
|
||||||
loading={searchLoading}
|
loading={searchLoading}
|
||||||
error={searchError}
|
error={searchError}
|
||||||
@@ -423,7 +428,7 @@ export default function Catalogue({
|
|||||||
}));
|
}));
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Alargar pesquisa (remover localização)
|
Pesquisar noutras províncias (remover localização)
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{['grid', 'list', 'map', 'combined', 'corridors'].map((value, i) => (
|
{['grid', 'list', 'map', 'combined', 'corridors'].map((value, i) => (
|
||||||
@@ -646,10 +651,10 @@ export default function Catalogue({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{!results.total && (
|
{!searchLoading && !searchError && !results.total && (
|
||||||
<p className={card}>
|
<p className={card}>
|
||||||
Sem oportunidades com estes filtros. Explore as fichas
|
Não há oportunidades publicadas com estes filtros no cadastro consultado.
|
||||||
territoriais ou{' '}
|
A informação disponível pode ser incompleta. Pode{' '}
|
||||||
<Link href="/apoio" className="underline">
|
<Link href="/apoio" className="underline">
|
||||||
peça apoio
|
peça apoio
|
||||||
</Link>
|
</Link>
|
||||||
@@ -757,7 +762,7 @@ export default function Catalogue({
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
<EducationalGuides articles={guides} />
|
<CatalogueGuideLinks articles={guides} />
|
||||||
</Frame>
|
</Frame>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import test from 'node:test';
|
||||||
|
import fs from 'node:fs';
|
||||||
|
import {createRequire} from 'node:module';
|
||||||
|
import React from 'react';
|
||||||
|
import {renderToStaticMarkup} from 'react-dom/server';
|
||||||
|
import ts from 'typescript';
|
||||||
|
const require=createRequire(import.meta.url);
|
||||||
|
const source=fs.readFileSync(new URL('../../resources/js/components/catalogue-guide-links.tsx',import.meta.url),'utf8');
|
||||||
|
const compiled=ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022,jsx:ts.JsxEmit.ReactJSX}}).outputText;
|
||||||
|
const module={exports:{}};
|
||||||
|
new Function('require','module','exports',compiled)(name=>name==='@inertiajs/react'?{Link:({href,children,...props})=>React.createElement('a',{href,...props},children)}:require(name),module,module.exports);
|
||||||
|
const render=articles=>renderToStaticMarkup(React.createElement(module.exports.default,{articles}));
|
||||||
|
test('catalogue guides are closed optional links, not educational bodies or nationwide opportunity shortcuts',()=>{
|
||||||
|
const html=render([{title:'Turismo',href:'/artigos/turismo',summary:'EDUCATIONAL-BODY-NOT-A-RESULT',image:{href:'/photo.jpg',alt:'ILLUSTRATION'},opportunities_href:'/oportunidades?sector=turismo',opportunities_label:'ALL-NATIONAL-OPPORTUNITIES',has_opportunities:true}]);
|
||||||
|
assert.match(html,/<details\b/);assert.doesNotMatch(html,/<details[^>]*\bopen\b/);
|
||||||
|
assert.match(html,/apoio opcional/);assert.match(html,/href="\/artigos\/turismo"/);
|
||||||
|
for(const forbidden of ['EDUCATIONAL-BODY-NOT-A-RESULT','ALL-NATIONAL-OPPORTUNITIES','/oportunidades?sector=turismo','photo.jpg','<img'])assert.ok(!html.includes(forbidden),forbidden);
|
||||||
|
});
|
||||||
|
test('no educational substitute is rendered when no guides are available',()=>{
|
||||||
|
assert.equal(render([]),'');
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user