This commit is contained in:
2025-12-23 07:50:08 +00:00
parent 4c3ea0059d
commit 7826c6ed24
12 changed files with 2008 additions and 98 deletions

View File

@@ -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;
}
}
}