import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { X, Plus, Loader2, Users as UsersIcon } from 'lucide-react'; import { Card, CardContent, CardHeader } from './Card'; import { Button } from './Button'; import { LdapUserPicker } from './LdapUserPicker'; import type { Group, UserCreate, UserResponse } from '../api/client'; interface AdvancedAuthFormData extends UserCreate { group_ids: number[]; confirmPassword: string; email?: string; } interface CreateUserAdvancedAuthModalProps { formData: AdvancedAuthFormData; setFormData: (data: AdvancedAuthFormData) => void; groups: Group[]; onClose: () => void; onCreate: () => void; isCreating: boolean; isCreateButtonDisabled: boolean; // When LDAP is enabled in settings, the modal shows a "LDAP" tab beside // "Local"; the picker handles its own provision call and reports success // back through onLdapProvisioned. ldapEnabled?: boolean; onLdapProvisioned?: (user: UserResponse) => void; } type Tab = 'local' | 'ldap'; export function CreateUserAdvancedAuthModal({ formData, setFormData, groups, onClose, onCreate, isCreating, isCreateButtonDisabled, ldapEnabled = false, onLdapProvisioned, }: CreateUserAdvancedAuthModalProps) { const { t } = useTranslation(); const [tab, setTab] = useState('local'); // Close modal on Escape key useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { onClose(); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [onClose]); const toggleGroup = (groupId: number) => { setFormData({ ...formData, group_ids: formData.group_ids.includes(groupId) ? formData.group_ids.filter(id => id !== groupId) : [...formData.group_ids, groupId], }); }; return (
e.stopPropagation()} >

{t('users.modal.createUser')}

{t('users.modal.advancedAuthSubtitle') || 'with Advanced Authentication'}

{ldapEnabled && (
)} {tab === 'ldap' && ldapEnabled ? ( { onLdapProvisioned?.(user); }} /> ) : (
{/* Username Field */}
setFormData({ ...formData, username: e.target.value })} className="w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors" placeholder={t('users.form.usernamePlaceholder')} autoComplete="username" required />
{/* Email Field */}
setFormData({ ...formData, email: e.target.value })} className="w-full px-4 py-3 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:outline-none focus:ring-2 focus:ring-bambu-green/50 focus:border-bambu-green transition-colors" placeholder={t('users.form.emailPlaceholder') || 'user@example.com'} required />
{/* Info box about auto-generated password */}

{t('users.form.autoGeneratedPassword') || 'A secure password will be automatically generated and emailed to the user.'}

{/* Groups Field */}
{groups.map(group => ( ))} {groups.length === 0 && (

{t('users.noGroupsAvailable')}

)}
)} {/* Action Buttons — Cancel always shown; Create only on local tab (LDAP picker has its own submit). */}
{tab === 'local' && ( )}
); }