diff --git a/src/components/ClientManagement.tsx b/src/components/ClientManagement.tsx index 4e16c5f..fe7dbe3 100644 --- a/src/components/ClientManagement.tsx +++ b/src/components/ClientManagement.tsx @@ -8,13 +8,18 @@ import { Check, X, ExternalLink, - ShieldCheck, Building2, Mail, Lock, Sparkles, Loader2, - CheckCircle2 + CheckCircle2, + Eye, + EyeOff, + User, + Users, + Shield, + Globe } from 'lucide-react'; interface Tenant { @@ -28,6 +33,30 @@ interface ClientManagementProps { initialTenants: Tenant[]; } +const ROLES = [ + { + id: 'client', + label: 'Cliente', + badge: 'Recomendado', + desc: 'Acceso exclusivo al portal y métricas de su empresa', + icon: User, + }, + { + id: 'team', + label: 'Equipo Agencia', + badge: 'Colaborador', + desc: 'Acceso a toda la cartera de clientes de 4Ventures', + icon: Users, + }, + { + id: 'admin', + label: 'Administrador', + badge: 'Control Total', + desc: 'Permisos completos de configuración y altas', + icon: Shield, + }, +] as const; + export default function ClientManagement({ initialTenants }: ClientManagementProps) { const [tenants, setTenants] = useState(initialTenants); const [isOpen, setIsOpen] = useState(false); @@ -41,6 +70,7 @@ export default function ClientManagement({ initialTenants }: ClientManagementPro const [password, setPassword] = useState(''); const [role, setRole] = useState<'client' | 'team' | 'admin'>('client'); const [autoSlug, setAutoSlug] = useState(true); + const [showPassword, setShowPassword] = useState(true); // Created access card state const [createdClient, setCreatedClient] = useState<{ @@ -149,15 +179,17 @@ Este portal cuenta con aislamiento de datos cifrado y métricas en tiempo real.` }; return ( -
+
{/* Table Header with Action Button */} -
+
-

- +

+
+ +
Cartera de Clientes Activos ({tenants.length})

-

+

Cada cliente cuenta con aislamiento nativo Row Level Security (RLS) en Postgres.

@@ -169,7 +201,7 @@ Este portal cuenta con aislamiento de datos cifrado y métricas en tiempo real.` setErrorMsg(null); generateRandomPassword(); }} - className="inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg bg-gradient-to-r from-brand-500 to-amber-600 hover:from-brand-600 hover:to-amber-700 text-white text-xs font-semibold shadow-lg shadow-brand-500/20 transition-all cursor-pointer" + className="inline-flex items-center justify-center gap-2 px-4 py-2.5 rounded-xl bg-gradient-to-r from-brand-500 via-brand-600 to-amber-600 hover:from-brand-600 hover:to-amber-700 text-white text-xs font-semibold shadow-md shadow-brand-500/20 hover:shadow-lg hover:shadow-brand-500/25 active:scale-[0.99] transition-all cursor-pointer shrink-0" > Dar de Alta Cliente @@ -179,34 +211,34 @@ Este portal cuenta con aislamiento de datos cifrado y métricas en tiempo real.` {/* Tenants Table */}
- + - - - - - + + + + + - + {tenants.map((t) => ( - - + - + @@ -218,22 +250,24 @@ Este portal cuenta con aislamiento de datos cifrado y métricas en tiempo real.` {/* Modal: Onboard New Client */} {isOpen && ( -
-
+
+
{/* Modal Header */} -
-
-
+
+
+
-

Alta de Nuevo Cliente

-

Crea el portal corporativo y activa sus credenciales de acceso

+

Alta de Nuevo Cliente

+

Crea el portal corporativo y activa sus credenciales de acceso

@@ -244,44 +278,51 @@ Este portal cuenta con aislamiento de datos cifrado y métricas en tiempo real.` {createdClient ? ( /* Success Screen with Credentials */
-
- +
+
-

¡Cliente Creado con Éxito!

-

- El tenant ha sido configurado en Postgres con aislamiento RLS y el usuario ya puede iniciar sesión. +

¡Cliente Creado con Éxito!

+

+ El tenant ha sido configurado en Postgres con aislamiento RLS y el usuario ya puede iniciar sesión en su centro de mando.

-
-
- Empresa: +
+
+ Empresa: {createdClient.company}
-
- URL Acceso: - https://app.4ventures.es/login + -
- Email: - {createdClient.email} +
+ Email: + {createdClient.email}
- Contraseña: - + Contraseña: + {createdClient.password}
-
+
@@ -298,125 +339,177 @@ Este portal cuenta con aislamiento de datos cifrado y métricas en tiempo real.`
) : ( /* Creation Form */ -
+ {errorMsg && ( -
- {errorMsg} +
+ + {errorMsg}
)} + {/* Nombre del Cliente */}
-
Nombre del ClienteTenant SlugUUIDAcceso PortalEstadoNombre del ClienteTenant SlugUUIDAcceso PortalEstado
- +
+ {t.name} {t.slug}{t.slug} {t.id} - Abrir Portal + Abrir Portal - + Activo