Files
quality_recticel/py_app/app/templates/settings.html
Quality System Admin 1afd09b88b updated settings page
2025-10-22 21:39:21 +03:00

320 lines
9.9 KiB
HTML
Executable File

{% extends "base.html" %}
{% block title %}Settings{% endblock %}
{% block content %}
<div class="settings-layout">
<!-- First Column - Users Card -->
<div class="settings-column-1">
<div class="card">
<h3>👥 Current Users</h3>
<div class="users-grid">
{% for user in users %}
<div class="user-card">
<div class="user-header">
<div class="user-avatar">
{% if user.role == 'superadmin' %}
👑
{% elif user.role == 'admin' %}
🛡️
{% elif user.role == 'manager' %}
🎯
{% else %}
👤
{% endif %}
</div>
<div class="user-info">
<div class="user-name">{{ user.username }}</div>
<div class="user-role-badge role-{{ user.role }}">
{{ user.role.title() }}
</div>
</div>
</div>
<div class="user-modules">
<div class="modules-section">
<strong>Modules:</strong>
{% if user.role in ['superadmin', 'admin'] %}
<div class="module-tags">
<span class="module-tag all-modules">All Modules</span>
</div>
{% elif user.modules %}
<div class="module-tags">
{% for module in user.get_modules() %}
<span class="module-tag module-{{ module }}">{{ module.title() }}</span>
{% endfor %}
</div>
{% else %}
<div class="module-tags">
<span class="module-tag no-modules">No modules assigned</span>
</div>
{% endif %}
</div>
<div class="access-level-section">
<strong>Access Level:</strong>
<div class="access-description">
{% if user.role == 'superadmin' %}
Full system access
{% elif user.role == 'admin' %}
Full app access
{% elif user.role == 'manager' %}
Full module access + reports
{% elif user.role == 'worker' %}
Basic operations only (no reports) - Can have multiple modules
{% endif %}
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<style>
.users-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 15px;
margin-top: 15px;
}
.user-card {
background: var(--card-bg, #fff);
border: 1px solid var(--border-color, #ddd);
border-radius: 8px;
padding: 15px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.user-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
}
.user-header {
display: flex;
align-items: center;
margin-bottom: 12px;
}
.user-avatar {
font-size: 24px;
margin-right: 12px;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
background: var(--avatar-bg, #f0f0f0);
border-radius: 50%;
}
.user-info {
flex: 1;
}
.user-name {
font-size: 16px;
font-weight: bold;
color: var(--text-color, #333);
margin-bottom: 4px;
}
.user-role-badge {
padding: 4px 8px;
border-radius: 12px;
font-size: 12px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.role-superadmin {
background-color: #dc3545;
color: white;
}
.role-admin {
background-color: #fd7e14;
color: white;
}
.role-manager {
background-color: #0d6efd;
color: white;
}
.role-worker {
background-color: #198754;
color: white;
}
.user-modules {
font-size: 14px;
color: var(--text-color, #555);
}
.modules-section {
margin-bottom: 12px;
}
.access-level-section {
padding-top: 8px;
border-top: 1px solid var(--border-color, #eee);
}
.access-description {
margin-top: 4px;
font-size: 13px;
color: var(--muted-text, #666);
font-style: italic;
line-height: 1.3;
}
.module-tags {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 6px;
}
.module-tag {
padding: 3px 8px;
border-radius: 10px;
font-size: 11px;
font-weight: 500;
text-transform: capitalize;
}
.all-modules {
background-color: #6c757d;
color: white;
}
.module-quality {
background-color: #0dcaf0;
color: #000;
}
.module-warehouse {
background-color: #ffc107;
color: #000;
}
.module-labels {
background-color: #20c997;
color: white;
}
.no-modules {
background-color: #e9ecef;
color: #6c757d;
font-style: italic;
}
/* Dark mode support */
body.dark-mode .user-card {
background: #2a2a2a;
border-color: #444;
color: #fff;
}
body.dark-mode .user-name {
color: #fff;
}
body.dark-mode .user-modules {
color: #ccc;
}
body.dark-mode .access-level-section {
border-top-color: #555;
}
body.dark-mode .access-description {
color: #aaa;
}
body.dark-mode .user-avatar {
background: #404040;
}
body.dark-mode .user-card:hover {
box-shadow: 0 4px 8px rgba(255, 255, 255, 0.1);
}
/* Responsive design */
@media (max-width: 768px) {
.users-grid {
grid-template-columns: 1fr;
}
}
/* Layout Styles for 2-column structure */
.settings-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 30px;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.settings-column-1 {
min-height: fit-content;
}
.settings-column-2 {
display: flex;
flex-direction: column;
gap: 20px;
}
/* Responsive design */
@media (max-width: 1024px) {
.settings-layout {
grid-template-columns: 1fr;
gap: 20px;
}
}
</style>
</div>
<!-- Second Column - Management and Settings Cards -->
<div class="settings-column-2">
<div class="card">
<h3>🎯 User & Permissions Management</h3>
<p><strong>Simplified 4-Tier System:</strong> Superadmin → Admin → Manager → Worker</p>
<p>Streamlined interface with module-based permissions (Quality, Warehouse, Labels)</p>
<div style="margin-top: 15px;">
<a href="{{ url_for('main.user_management_simple') }}" class="btn" style="background-color: #2196f3; color: white; margin-right: 10px;">
🎯 Manage Users (Simplified)
</a>
</div>
<small style="display: block; margin-top: 10px; color: #666;">
Recommended: Use the simplified user management for easier administration
</small>
</div>
<div class="card">
<h3>External Server Settings</h3>
<form method="POST" action="{{ url_for('main.save_external_db') }}" class="form-centered">
<label for="server_domain">Server Domain/IP Address:</label>
<input type="text" id="server_domain" name="server_domain" value="{{ external_settings.get('server_domain', '') }}" required>
<label for="port">Port:</label>
<input type="number" id="port" name="port" value="{{ external_settings.get('port', '') }}" required>
<label for="database_name">Database Name:</label>
<input type="text" id="database_name" name="database_name" value="{{ external_settings.get('database_name', '') }}" required>
<label for="username">Username:</label>
<input type="text" id="username" name="username" value="{{ external_settings.get('username', '') }}" required>
<label for="password">Password:</label>
<input type="password" id="password" name="password" value="{{ external_settings.get('password', '') }}" required>
<button type="submit" class="btn">Save/Update External Database Info Settings</button>
</form>
</div>
</div>
</div>
{% endblock %}