Files
Investidor-V2/resources/js/pages/management/opportunity-install.tsx
T

147 lines
5.2 KiB
TypeScript

import { useForm } from '@inertiajs/react';
import { Management, button } from './shared';
export default function Install({
installed,
ready,
target,
hash,
changes,
migration,
backupDate,
rollback,
actionUrl = '/management/opportunity-management-install',
imageProcessingAvailable,
extension = false,
operationKey,
}: {
installed: boolean;
ready: boolean;
target: { database: string; port: number };
hash: string;
changes: string[];
migration: string;
backupDate: string | null;
rollback: string;
actionUrl?: string;
imageProcessingAvailable?: boolean;
extension?: boolean;
operationKey?: string;
}) {
const form = useForm({
hash,
confirm: false,
idempotency_key: operationKey ?? '',
reason: '',
});
return (
<Management
title={
migration.endsWith('extend_organization_country')
? 'Instalação do país de constituição'
: 'Ativação da Gestão de Oportunidades'
}
>
<p>
Base: {target.database}:{target.port} ·{' '}
{installed ? 'Instalado' : 'Ainda não aplicado'}
</p>
<ul>
{changes.map((c) => (
<li key={c}>{c}</li>
))}
</ul>
<p>Migração: {migration}</p>
{imageProcessingAvailable !== undefined && (
<section
className="rounded border border-amber-500 p-3"
aria-label="Limitações dos anexos"
>
<p>
{imageProcessingAvailable
? 'GD/WebP disponível neste servidor; o processamento continua a exigir scan concluído do original.'
: 'GD/WebP indisponível neste servidor: guardar imagens é possível; gerar miniaturas permanece pendente.'}
</p>
<p>
Instalar recursos não confirma scans. Documentos e
imagens com scan pendente ficam sem download ou
pré-visualização; preparação de rascunhos e localizações
continua disponível. ClamD real mantém uma pendência
separada.
</p>
</section>
)}
<p>Backup/restauro: {backupDate ?? 'Prova ainda por preparar'}</p>
<p>{rollback}</p>
<p>
Este plano ativa apenas as alterações acima; workflow completo e
lacunas restantes permanecem no backlog.
</p>
<form
onSubmit={(e) => {
e.preventDefault();
form.post(actionUrl);
}}
>
<label>
<input
type="checkbox"
checked={form.data.confirm}
onChange={(e) =>
form.setData('confirm', e.target.checked)
}
/>{' '}
Confirmo a aplicação deste plano
</label>
{extension && (
<div>
<label htmlFor="installation-reason" className="block">
Fundamentação da instalação
</label>
<textarea
id="installation-reason"
value={form.data.reason}
minLength={20}
maxLength={1000}
required
onChange={(event) =>
form.setData('reason', event.target.value)
}
/>
</div>
)}
<button
className={button}
disabled={
installed ||
!ready ||
!form.data.confirm ||
(extension && !operationKey) ||
form.processing
}
>
{migration.endsWith('extend_organization_country')
? 'Aplicar extensão do país'
: 'Aplicar plano de gestão'}
</button>
{extension && !operationKey && (
<p role="alert">
Atualize a prévia para obter a chave desta operação.
</p>
)}
{!ready && (
<p>
Aplicação indisponível até comprovar QA,
backup/restauro, compatibilidade e reversão da versão
atual.
</p>
)}
{Object.values(form.errors).map((e) => (
<p role="alert" key={e}>
{e}
</p>
))}
</form>
</Management>
);
}