+ {analysis.draft.sector} · {analysis.draft.region} · Versão + aprovada {analysis.version} · {analysis.at} +
++ Apreciação qualitativa fundamentada nas fontes e períodos + indicados. Não representa garantia de procura ou viabilidade. +
+ {forces.map((force) => { + const row = analysis.draft.forces[force]; + return ( +Fonte: {record.source}
+ {competitiveness &&- Rascunho nesta página: transfira o ficheiro antes de sair. Não é - gravado no servidor nem publicado. A classificação representa a + Guarde o rascunho para o recuperar no servidor. A publicação + exige aprovação expressa; a classificação representa a apreciação do autor.
- - {draft.sector !== sector && ( -- O sector da análise difere do sector actual do cluster ( - {sector}). Confira o âmbito antes de reutilizar conclusões. -
- )} -- {diagnosticReady(draft) - ? 'Cinco forças preenchidas para revisão; fontes e conclusões requerem leitura do autor.' - : 'Diagnóstico incompleto: indique o âmbito e complete as evidências das cinco forças.'} + Versão no servidor: {server.version}.{' '} + {dirty + ? 'Existem alterações por guardar.' + : 'Campos correspondem à versão recuperada.'}{' '} + {server.approved + ? `Consulta pública: versão aprovada ${server.approved.version}; novas edições conservam essa versão até outra aprovação.` + : 'Sem análise aprovada para consulta pública.'}
- {forces.map((force) => ( -- Recuperar análise de{' '} - {pending.sector || 'sector não indicado'} em{' '} - {pending.region || 'região não indicada'}? Os campos - actuais serão substituídos. Transfira primeiro o - rascunho actual se o quiser conservar. -
+ setMessage( + 'Ficheiro lido. Confira o âmbito e confirme a substituição dos campos actuais.', + ); + } catch (error) { + setMessage( + error instanceof Error + ? error.message + : 'Não foi possível ler o ficheiro.', + ); + } + }} + /> + + {pending && ( ++ Recuperar análise de{' '} + {pending.sector || 'sector não indicado'} em{' '} + {pending.region || 'região não indicada'}? Os campos + actuais serão substituídos. Transfira primeiro o + rascunho actual se o quiser conservar. +
+ {' '} + +{message}
} ++ Versão {serverPending.version}:{' '} + {serverPending.draft?.sector || + 'Sector não indicado'}{' '} + /{' '} + {serverPending.draft?.region || + 'Região não indicada'} + . Recuperar substitui os campos actuais. Transfira + primeiro alterações que queira conservar. +
+ {' '} + +Ainda não existem gravações.
+ )} + {server.history.map((entry) => ( ++ Versão {entry.version} ·{' '} + {actions[entry.action] ?? entry.action} · {entry.at}{' '} + · Utilizador {entry.actor}{' '} + +
+ ))} + {restoreVersion !== null && ( ++ Recuperar a versão {restoreVersion} cria uma + nova versão no servidor e substitui os campos + actuais. A versão pública aprovada mantém-se. + Transfira primeiro alterações por guardar. +
+ {' '} + ++ Aprovar torna a versão guardada consultável na ficha + pública deste cluster, quando essa ficha estiver + publicada. Guardar um rascunho não o publica. A + evidência de aprovação e as identidades do histórico + ficam na gestão. +
+{message}
} + {dirty && ( ++ Guarde primeiro as alterações ou recupere a versão + pretendida antes de decidir a aprovação. +
+ )} + + ); } diff --git a/resources/js/pages/structures/editor.tsx b/resources/js/pages/structures/editor.tsx index fd58671e..38960f0b 100644 --- a/resources/js/pages/structures/editor.tsx +++ b/resources/js/pages/structures/editor.tsx @@ -7,6 +7,7 @@ import { titles, statuses, stages, roles } from './types'; import type { Structure, StructureRecord, Chain } from './types'; import ValueNetwork from './value-network'; import Competitiveness from './competitiveness'; +import type { CompetitivenessState } from './competitiveness'; import type { ChainLink, Gap } from './value-network'; function ChainForm({ clusterId, chain }: { clusterId: string; chain?: Chain }) { @@ -76,6 +77,7 @@ export default function Editor({ memberships, chainLinks, gaps, + competitiveness, }: { structure: Structure; record: StructureRecord | null; @@ -84,6 +86,7 @@ export default function Editor({ chains: Chain[]; chainLinks: ChainLink[]; gaps: Gap[]; + competitiveness?: CompetitivenessState | null; memberships: { id: string; project_id: string; @@ -299,7 +302,12 @@ export default function Editor({ {isCluster && record && ( <> -