fix(f4): hide SMTP controls outside system admin
This commit is contained in:
@@ -41,8 +41,9 @@ function defaultPort(mode: SmtpSecurityMode): number {
|
||||
}
|
||||
|
||||
export function DocumentDeliveryPage() {
|
||||
const { hasPermission } = useAuth();
|
||||
const { hasPermission, user } = useAuth();
|
||||
const canManage = hasPermission('document_delivery.manage');
|
||||
const canSmtpAdmin = Boolean(user?.roles.includes('admin'));
|
||||
const [settings, setSettings] = useState<DocumentDeliverySettingsF4 | null>(null);
|
||||
const [smtp, setSmtp] = useState<PublicSmtpSettings | null>(null);
|
||||
const [items, setItems] = useState<DocumentDeliveryItemF4[]>([]);
|
||||
@@ -79,7 +80,7 @@ export function DocumentDeliveryPage() {
|
||||
const [currentSettings, outbox, smtpSettings] = await Promise.all([
|
||||
getDocumentDeliverySettingsF4(),
|
||||
listDocumentDeliveriesF4(),
|
||||
canManage ? getSmtpSettings() : Promise.resolve(null),
|
||||
canSmtpAdmin ? getSmtpSettings() : Promise.resolve(null),
|
||||
]);
|
||||
setSettings(currentSettings);
|
||||
setOfficeEmail(currentSettings.officeEmail ?? '');
|
||||
@@ -89,7 +90,7 @@ export function DocumentDeliveryPage() {
|
||||
|
||||
useEffect(() => {
|
||||
load().catch((requestError) => setError(errorMessage(requestError))).finally(() => setLoading(false));
|
||||
}, [canManage]);
|
||||
}, [canSmtpAdmin]);
|
||||
|
||||
const saveOffice = async (event: FormEvent) => {
|
||||
event.preventDefault();
|
||||
@@ -104,7 +105,7 @@ export function DocumentDeliveryPage() {
|
||||
|
||||
const saveSmtp = async (event: FormEvent) => {
|
||||
event.preventDefault();
|
||||
if (!host.trim() || !fromName.trim() || !fromEmail.trim()) return;
|
||||
if (!canSmtpAdmin || !host.trim() || !fromName.trim() || !fromEmail.trim()) return;
|
||||
setSaving(true); setError(''); setSuccess('');
|
||||
try {
|
||||
const input: Parameters<typeof saveSmtpSettings>[0] = {
|
||||
@@ -129,7 +130,7 @@ export function DocumentDeliveryPage() {
|
||||
|
||||
const sendTest = async (event: FormEvent) => {
|
||||
event.preventDefault();
|
||||
if (!testEmail.trim()) return;
|
||||
if (!canSmtpAdmin || !testEmail.trim()) return;
|
||||
setSaving(true); setError(''); setSuccess('');
|
||||
try {
|
||||
const result = await testSmtpSettings(testEmail.trim());
|
||||
@@ -151,7 +152,7 @@ export function DocumentDeliveryPage() {
|
||||
if (loading) return <LoadingBlock label="Cargando entrega documental…" />;
|
||||
|
||||
return <section className="narrow-section">
|
||||
<div className="page-heading"><div><span className="eyebrow">SUPERADMIN · CORREO</span><h1>Entrega documental</h1><p>Configuración institucional de SMTP, destinatarios y trazabilidad de los envíos automáticos.</p></div>{canManage && <button className="button secondary" onClick={retryAll} disabled={saving}><Icon name="history" />Reintentar pendientes</button>}</div>
|
||||
<div className="page-heading"><div><span className="eyebrow">ENTREGA DOCUMENTAL</span><h1>Correo y envíos</h1><p>Destinatarios institucionales, trazabilidad de envíos y configuración técnica de correo reservada al Superadmin.</p></div>{canManage && <button className="button secondary" onClick={retryAll} disabled={saving}><Icon name="history" />Reintentar pendientes</button>}</div>
|
||||
{error && <Alert>{error}</Alert>}{success && <Alert type="success">{success}</Alert>}
|
||||
|
||||
<form className="panel form-panel" onSubmit={saveOffice}>
|
||||
@@ -163,9 +164,9 @@ export function DocumentDeliveryPage() {
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{canManage && <form className="panel form-panel" onSubmit={saveSmtp}>
|
||||
{canSmtpAdmin && <form className="panel form-panel" onSubmit={saveSmtp}>
|
||||
<div className="form-section">
|
||||
<div><span className="eyebrow">SALIDA DE EMAIL</span><h2>Servidor SMTP</h2><p className="section-copy">La contraseña se cifra en el servidor con AES-256-GCM. Al volver a esta pantalla sólo se informa si existe una clave guardada; nunca se devuelve su contenido.</p></div>
|
||||
<div><span className="eyebrow">SUPERADMIN · SALIDA DE EMAIL</span><h2>Servidor SMTP</h2><p className="section-copy">La contraseña se cifra en el servidor con AES-256-GCM. Al volver a esta pantalla sólo se informa si existe una clave guardada; nunca se devuelve su contenido.</p></div>
|
||||
{smtp?.source === 'ENVIRONMENT' && <Alert type="info">Actualmente se está usando la configuración del servidor. Al guardar este formulario, la configuración de base de datos administrable pasará a tener prioridad.</Alert>}
|
||||
<div className="form-grid">
|
||||
<label className="field"><span>Host SMTP</span><input value={host} onChange={(event) => setHost(event.target.value)} required maxLength={255} placeholder="smtp.ejemplo.com" /></label>
|
||||
@@ -182,7 +183,9 @@ export function DocumentDeliveryPage() {
|
||||
</div>
|
||||
</form>}
|
||||
|
||||
{canManage && <form className="panel form-panel" onSubmit={sendTest}><div className="form-section"><div><h2>Probar configuración</h2><p className="section-copy">Envía un correo real con un archivo de prueba usando exactamente la configuración activa.</p></div><div className="form-grid"><label className="field"><span>Email de prueba</span><input type="email" value={testEmail} onChange={(event) => setTestEmail(event.target.value)} required placeholder="tu@email.com" /></label></div><div className="form-actions"><button className="button secondary" disabled={saving || !testEmail.trim()}>Enviar prueba</button></div></div></form>}
|
||||
{canSmtpAdmin && <form className="panel form-panel" onSubmit={sendTest}><div className="form-section"><div><h2>Probar configuración</h2><p className="section-copy">Envía un correo real con un archivo de prueba usando exactamente la configuración activa.</p></div><div className="form-grid"><label className="field"><span>Email de prueba</span><input type="email" value={testEmail} onChange={(event) => setTestEmail(event.target.value)} required placeholder="tu@email.com" /></label></div><div className="form-actions"><button className="button secondary" disabled={saving || !testEmail.trim()}>Enviar prueba</button></div></div></form>}
|
||||
|
||||
{!canSmtpAdmin && <div className="temporal-notice"><Icon name="lock" /><p><strong>SMTP reservado al Superadmin.</strong> Los usuarios operativos pueden consultar la trazabilidad y, según permisos, gestionar entregas, pero no ver ni modificar credenciales de correo.</p></div>}
|
||||
|
||||
<article className="panel">
|
||||
<div className="panel-heading"><div><span className="eyebrow">TRAZABILIDAD</span><h2>Últimas entregas</h2><p className="section-copy">Actas PDF a Empresa/Oficina/Inspector e INF Word editable al Inspector responsable.</p></div><span className="count-pill">{items.length}</span></div>
|
||||
|
||||
Reference in New Issue
Block a user