feat: Implement warehouse module roles with auto-schema repair and remove module access section

- Add SchemaVerifier class for automatic database schema verification and repair
- Implement warehouse_manager (Level 75) and warehouse_worker (Level 35) roles
- Add zone-based access control for warehouse workers
- Implement worker-manager binding system with zone filtering
- Add comprehensive database auto-repair on Docker initialization
- Remove Module Access section from user form (role-based access only)
- Add autocomplete attributes to password fields for better UX
- Include detailed documentation for warehouse implementation
- Update initialize_db.py with schema verification as Step 0
This commit is contained in:
Quality App Developer
2026-01-28 00:46:59 +02:00
parent e6ff40184a
commit 8de85ca87f
18 changed files with 4194 additions and 167 deletions

View File

@@ -921,12 +921,58 @@ function showNotification(message, type) {
const notification = document.createElement('div');
notification.className = `notification notification-${type}`;
notification.textContent = message;
notification.style.opacity = '1';
// Apply inline styles to ensure proper positioning and appearance
notification.style.cssText = `
position: fixed;
top: 30px;
right: 30px;
padding: 12px 20px;
border-radius: 6px;
z-index: 9999;
box-shadow: 0 4px 12px rgba(0,0,0,0.25);
font-weight: 600;
font-size: 14px;
white-space: nowrap;
opacity: 1;
animation: slideInRight 0.3s ease-out, slideOutRight 0.3s ease-in 2.7s forwards;
`;
document.body.appendChild(notification);
// Ensure animations exist
if (!document.getElementById('notification-styles')) {
const style = document.createElement('style');
style.id = 'notification-styles';
style.textContent = `
@keyframes slideInRight {
from {
transform: translateX(400px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes slideOutRight {
from {
transform: translateX(0);
opacity: 1;
}
to {
transform: translateX(400px);
opacity: 0;
}
}
`;
document.head.appendChild(style);
}
// Remove notification after animation completes
setTimeout(() => {
notification.style.opacity = '0';
setTimeout(() => notification.remove(), 300);
if (notification.parentNode) {
notification.parentNode.removeChild(notification);
}
}, 3000);
}