50%
This commit is contained in:
@@ -88,7 +88,8 @@
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-slate-300 mb-1">Password *</label>
|
||||
<input type="password" name="password" required class="w-full px-3 py-2 bg-slate-900 border border-slate-700 rounded text-white text-sm focus:outline-none focus:ring-2 focus:ring-blue-600">
|
||||
<input type="password" name="password" required minlength="8" class="w-full px-3 py-2 bg-slate-900 border border-slate-700 rounded text-white text-sm focus:outline-none focus:ring-2 focus:ring-blue-600">
|
||||
<p class="text-xs text-slate-400 mt-1">Minimum 8 characters required</p>
|
||||
</div>
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-slate-300 mb-1">Role *</label>
|
||||
@@ -534,13 +535,50 @@ async function loadUsers(forceRefresh = false) {
|
||||
}
|
||||
|
||||
function showCreateUserModal() {
|
||||
// Reset form when opening modal
|
||||
const form = document.getElementById('create-user-form');
|
||||
if (form) {
|
||||
form.reset();
|
||||
}
|
||||
document.getElementById('create-user-modal').classList.remove('hidden');
|
||||
}
|
||||
|
||||
// Flag to prevent double submission
|
||||
let isCreatingUser = false;
|
||||
|
||||
async function createUser(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// Prevent double submission
|
||||
if (isCreatingUser) {
|
||||
console.log('User creation already in progress, ignoring duplicate submission');
|
||||
return;
|
||||
}
|
||||
|
||||
isCreatingUser = true;
|
||||
const submitButton = e.target.querySelector('button[type="submit"]');
|
||||
const originalButtonText = submitButton ? submitButton.textContent : '';
|
||||
|
||||
// Disable submit button to prevent double clicks
|
||||
if (submitButton) {
|
||||
submitButton.disabled = true;
|
||||
submitButton.textContent = 'Creating...';
|
||||
}
|
||||
|
||||
const formData = new FormData(e.target);
|
||||
|
||||
// Frontend validation
|
||||
const password = formData.get('password');
|
||||
if (password && password.length < 8) {
|
||||
alert('Error: Password must be at least 8 characters long');
|
||||
isCreatingUser = false;
|
||||
if (submitButton) {
|
||||
submitButton.disabled = false;
|
||||
submitButton.textContent = originalButtonText;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await fetch('/api/v1/users', {
|
||||
method: 'POST',
|
||||
@@ -567,18 +605,41 @@ async function createUser(e) {
|
||||
|
||||
if (res.ok || res.status === 201) {
|
||||
console.log('User created successfully, refreshing list...');
|
||||
closeModal('create-user-modal');
|
||||
// Reset form before closing modal
|
||||
e.target.reset();
|
||||
closeModal('create-user-modal');
|
||||
// Force reload users list - add cache busting
|
||||
await loadUsers(true);
|
||||
alert('User created successfully');
|
||||
} else {
|
||||
const errorMsg = (data && data.error) ? data.error : 'Failed to create user';
|
||||
console.error('Create user failed:', errorMsg);
|
||||
// Extract error message from different possible formats
|
||||
let errorMsg = 'Failed to create user';
|
||||
if (data) {
|
||||
// Try structured error format: {code, message, details}
|
||||
if (data.message) {
|
||||
errorMsg = data.message;
|
||||
// Append details if available
|
||||
if (data.details) {
|
||||
errorMsg += ': ' + data.details;
|
||||
}
|
||||
}
|
||||
// Fallback to simple error format: {error}
|
||||
else if (data.error) {
|
||||
errorMsg = data.error;
|
||||
}
|
||||
}
|
||||
console.error('Create user failed:', errorMsg, data);
|
||||
alert(`Error: ${errorMsg}`);
|
||||
}
|
||||
} catch (err) {
|
||||
alert(`Error: ${err.message}`);
|
||||
} finally {
|
||||
// Re-enable submit button
|
||||
isCreatingUser = false;
|
||||
if (submitButton) {
|
||||
submitButton.disabled = false;
|
||||
submitButton.textContent = originalButtonText;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user