User management and module improvements
- Added daily_mirror module to permissions system - Fixed user module management - updates now work correctly - Implemented dashboard module filtering based on user permissions - Fixed warehouse create_locations page (config parser and delete) - Implemented POST-Redirect-GET pattern to prevent duplicate entries - Added application license system with validation middleware - Cleaned up debug logging code - Improved user module selection with fetch API instead of form submit
This commit is contained in:
@@ -597,7 +597,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in users %}
|
||||
<tr class="user-row" data-user-id="{{ user.id }}" data-username="{{ user.username }}" data-role="{{ user.role }}" data-modules="{{ (user.get_modules() or []) | tojson }}">
|
||||
<tr class="user-row" data-user-id="{{ user.id }}" data-username="{{ user.username }}" data-role="{{ user.role }}" data-modules='{{ (user.get_modules() or []) | tojson }}'>
|
||||
<td>
|
||||
<strong>{{ user.username }}</strong>
|
||||
</td>
|
||||
@@ -638,7 +638,7 @@
|
||||
data-user-id="{{ user.id }}"
|
||||
data-username="{{ user.username }}"
|
||||
data-role="{{ user.role }}"
|
||||
data-modules="{{ (user.get_modules() or []) | tojson }}"
|
||||
data-modules='{{ (user.get_modules() or []) | tojson }}'
|
||||
title="Select for quick edit">
|
||||
📝 Select
|
||||
</button>
|
||||
@@ -646,7 +646,7 @@
|
||||
data-user-id="{{ user.id }}"
|
||||
data-username="{{ user.username }}"
|
||||
data-role="{{ user.role }}"
|
||||
data-modules="{{ (user.get_modules() or []) | tojson }}"
|
||||
data-modules='{{ (user.get_modules() or []) | tojson }}'
|
||||
title="Full edit">
|
||||
⚙️ Edit
|
||||
</button>
|
||||
@@ -798,6 +798,8 @@ function updateEditModuleSelection() {
|
||||
let selectedUser = null;
|
||||
|
||||
function selectUserForQuickEdit(userId, username, role, modules) {
|
||||
console.log('Selecting user:', {userId, username, role, modules});
|
||||
|
||||
selectedUser = {id: userId, username: username, role: role, modules: modules};
|
||||
|
||||
// Update the quick edit panel
|
||||
@@ -806,25 +808,49 @@ function selectUserForQuickEdit(userId, username, role, modules) {
|
||||
|
||||
// Clear all module checkboxes first
|
||||
const checkboxes = document.querySelectorAll('#currentModules input[type="checkbox"]');
|
||||
checkboxes.forEach(cb => cb.checked = false);
|
||||
checkboxes.forEach(cb => {
|
||||
cb.checked = false;
|
||||
console.log('Cleared checkbox:', cb.id);
|
||||
});
|
||||
|
||||
// Check the appropriate modules
|
||||
if (modules && Array.isArray(modules)) {
|
||||
if (modules && Array.isArray(modules) && modules.length > 0) {
|
||||
console.log('User has modules:', modules);
|
||||
modules.forEach(module => {
|
||||
const checkbox = document.getElementById('quick_module_' + module);
|
||||
if (checkbox) checkbox.checked = true;
|
||||
console.log('Looking for checkbox:', 'quick_module_' + module, 'Found:', checkbox);
|
||||
if (checkbox) {
|
||||
checkbox.checked = true;
|
||||
console.log('Checked module:', module);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log('No modules found for user or empty array');
|
||||
}
|
||||
|
||||
// Disable checkboxes for superadmin and admin roles
|
||||
if (role === 'superadmin' || role === 'admin') {
|
||||
checkboxes.forEach(cb => {
|
||||
cb.disabled = true;
|
||||
cb.checked = false;
|
||||
});
|
||||
} else {
|
||||
checkboxes.forEach(cb => {
|
||||
cb.disabled = false;
|
||||
});
|
||||
}
|
||||
|
||||
// Show the quick edit panel
|
||||
document.getElementById('quickModuleEdit').style.display = 'block';
|
||||
document.querySelector('#userRightsPanel .text-center').style.display = 'none';
|
||||
const emptyMessage = document.querySelector('#userRightsPanel .text-center');
|
||||
if (emptyMessage) emptyMessage.style.display = 'none';
|
||||
|
||||
// Highlight selected row
|
||||
document.querySelectorAll('.user-row').forEach(row => {
|
||||
row.classList.remove('table-warning');
|
||||
});
|
||||
document.querySelector(`[data-user-id="${userId}"]`).classList.add('table-warning');
|
||||
const selectedRow = document.querySelector(`[data-user-id="${userId}"]`);
|
||||
if (selectedRow) selectedRow.classList.add('table-warning');
|
||||
}
|
||||
|
||||
function updateUserModules() {
|
||||
@@ -833,39 +859,56 @@ function updateUserModules() {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('updateUserModules called for user:', selectedUser);
|
||||
|
||||
// Get selected modules
|
||||
const checkboxes = document.querySelectorAll('#currentModules input[type="checkbox"]:checked');
|
||||
const modules = Array.from(checkboxes).map(cb => cb.value);
|
||||
|
||||
console.log('Selected modules:', modules);
|
||||
console.log('User role:', selectedUser.role);
|
||||
|
||||
// Validate modules for the role
|
||||
if ((selectedUser.role === 'manager' || selectedUser.role === 'worker') && modules.length === 0) {
|
||||
alert(`${selectedUser.role}s must have at least one module assigned.`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Create and submit form
|
||||
const form = document.createElement('form');
|
||||
form.method = 'POST';
|
||||
form.action = '/quick_update_modules';
|
||||
// Show confirmation
|
||||
const modulesList = modules.length > 0 ? modules.join(', ') : 'None';
|
||||
if (!confirm(`Update modules for user "${selectedUser.username}"?\n\nNew modules: ${modulesList}`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add user ID
|
||||
const userIdInput = document.createElement('input');
|
||||
userIdInput.type = 'hidden';
|
||||
userIdInput.name = 'user_id';
|
||||
userIdInput.value = selectedUser.id;
|
||||
form.appendChild(userIdInput);
|
||||
|
||||
// Add modules
|
||||
// Use fetch to submit and see the response
|
||||
const formData = new FormData();
|
||||
formData.append('user_id', selectedUser.id);
|
||||
modules.forEach(module => {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'hidden';
|
||||
input.name = 'modules';
|
||||
input.value = module;
|
||||
form.appendChild(input);
|
||||
formData.append('modules', module);
|
||||
});
|
||||
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
console.log('Submitting via fetch to /quick_update_modules');
|
||||
console.log('FormData entries:', Array.from(formData.entries()));
|
||||
|
||||
fetch('/quick_update_modules', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
})
|
||||
.then(response => {
|
||||
console.log('Response status:', response.status);
|
||||
console.log('Response headers:', Array.from(response.headers.entries()));
|
||||
return response.text();
|
||||
})
|
||||
.then(html => {
|
||||
console.log('Response HTML length:', html.length);
|
||||
console.log('Response HTML preview:', html.substring(0, 500));
|
||||
// Reload the page to show updated data
|
||||
window.location.reload();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Fetch error:', error);
|
||||
alert('Error updating modules: ' + error.message);
|
||||
});
|
||||
}
|
||||
|
||||
function showFullEditModal() {
|
||||
@@ -956,9 +999,12 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
const role = this.dataset.role;
|
||||
let modules = [];
|
||||
try {
|
||||
modules = JSON.parse(this.dataset.modules) || [];
|
||||
const modulesData = this.dataset.modules;
|
||||
console.log('Raw modules data:', modulesData);
|
||||
modules = JSON.parse(modulesData) || [];
|
||||
console.log('Parsed modules:', modules);
|
||||
} catch (e) {
|
||||
console.log('Error parsing modules for user:', username, e);
|
||||
console.error('Error parsing modules for user:', username, e);
|
||||
modules = [];
|
||||
}
|
||||
selectUserForQuickEdit(userId, username, role, modules);
|
||||
|
||||
Reference in New Issue
Block a user