147 lines
5.2 KiB
TypeScript
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>
|
|
);
|
|
}
|