feat: version 2.10.3 -- reenviar correo de invitacion/verificacion desde Usuarios
Nueva opcion "Reenviar correo" en el menu de 3 puntos de Organizacion -> Usuarios, para usuarios en estado 'invited' o 'pending_verification'. Reusa las mismas columnas (verification_token/verification_token_expires) y plantillas que el envio original (inviteUser / auth/service.js#register), solo genera un token nuevo -- el anterior pudo vencer o perderse en spam. De paso se corrige que el estado "invited" no tenia rama propia en el menu de acciones (caia en el branch generico de editar/activar-desactivar, que no aplica a una cuenta placeholder sin clave real todavia) ni traduccion de su badge (user_status_invited faltaba en i18n). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
import { useState } from 'react';
|
||||
import { Plus, Save, UserX, UserCheck, Check, X as XIcon } from 'lucide-react';
|
||||
import { Plus, Save, UserX, UserCheck, Check, X as XIcon, Mail } from 'lucide-react';
|
||||
import { useUi } from '../../context/ui-context.jsx';
|
||||
import { useAuth } from '../../context/auth-context.jsx';
|
||||
import { useAsync, useAction } from '../../hooks/useAsync.js';
|
||||
import { listUsers, listRoles, createUser, updateUser, setUserActive, approveUser, rejectUser } from '../../services/users.js';
|
||||
import { listUsers, listRoles, createUser, updateUser, setUserActive, approveUser, rejectUser, resendUserEmail } from '../../services/users.js';
|
||||
import { listDepartments } from '../../services/departments.js';
|
||||
import { ListView } from '../../components/ListView.jsx';
|
||||
import { SearchInput } from '../../components/SearchInput.jsx';
|
||||
@@ -19,7 +19,7 @@ function flatten(nodes, acc = []) {
|
||||
return acc;
|
||||
}
|
||||
|
||||
const STATUS_COLOR = { pending_verification: 'muted', pending_approval: 'warning', active: 'success' };
|
||||
const STATUS_COLOR = { pending_verification: 'muted', pending_approval: 'warning', active: 'success', invited: 'muted' };
|
||||
const EMPTY_FORM = { name: '', email: '', roleId: '', departmentId: '', position: '', password: '' };
|
||||
|
||||
export default function UsersPanel() {
|
||||
@@ -92,6 +92,13 @@ export default function UsersPanel() {
|
||||
});
|
||||
}
|
||||
|
||||
function resendEmail(user) {
|
||||
runAction(async () => {
|
||||
await resendUserEmail(user.id);
|
||||
pushToast({ tone: 'success', message: t('user_resend_sent') });
|
||||
});
|
||||
}
|
||||
|
||||
function confirmReject(user) {
|
||||
openDialog({
|
||||
tone: 'warning',
|
||||
@@ -140,7 +147,13 @@ export default function UsersPanel() {
|
||||
];
|
||||
}
|
||||
if (u.status === 'pending_verification') {
|
||||
return [{ label: t('user_reject'), icon: XIcon, danger: true, onClick: () => confirmReject(u) }];
|
||||
return [
|
||||
{ label: t('user_resend'), icon: Mail, onClick: () => resendEmail(u) },
|
||||
{ label: t('user_reject'), icon: XIcon, danger: true, onClick: () => confirmReject(u) },
|
||||
];
|
||||
}
|
||||
if (u.status === 'invited') {
|
||||
return [{ label: t('user_resend'), icon: Mail, onClick: () => resendEmail(u) }];
|
||||
}
|
||||
return [
|
||||
{ label: t('common_edit'), onClick: () => startEdit(u) },
|
||||
|
||||
Reference in New Issue
Block a user