Implement boxes management module with auto-numbered box creation

- Add boxes_crates database table with BIGINT IDs and 8-digit auto-numbered box_numbers
- Implement boxes CRUD operations (add, edit, update, delete, delete_multiple)
- Create boxes route handlers with POST actions for all operations
- Add boxes.html template with 3-panel layout matching warehouse locations module
- Implement barcode generation and printing with JsBarcode and QZ Tray integration
- Add browser print fallback for when QZ Tray is not available
- Simplify create box form to single button with auto-generation
- Fix JavaScript null reference errors with proper element validation
- Convert tuple data to dictionaries for Jinja2 template compatibility
- Register boxes blueprint in Flask app initialization
This commit is contained in:
Quality App Developer
2026-01-26 22:08:31 +02:00
parent 3c5a273a89
commit e1f3302c6b
37 changed files with 8429 additions and 66 deletions

View File

@@ -13,6 +13,96 @@
</div>
</div>
<!-- App Overview Section -->
<div class="row mb-4">
<div class="col-12">
<h4 class="mb-3"><i class="fas fa-chart-pie"></i> Application Overview</h4>
<div class="row">
<!-- Users Card -->
<div class="col-md-3 col-sm-6 mb-3">
<div class="card shadow-sm h-100">
<div class="card-body text-center">
<div class="display-6 text-primary mb-2">{{ stats.user_count }}</div>
<p class="card-text mb-0">Active Users</p>
</div>
</div>
</div>
<!-- Database Size Card -->
<div class="col-md-3 col-sm-6 mb-3">
<div class="card shadow-sm h-100">
<div class="card-body text-center">
<div class="display-6 text-info mb-2">{{ stats.database_size_mb }} MB</div>
<p class="card-text mb-0">Database Size</p>
</div>
</div>
</div>
<!-- Logs Size Card -->
<div class="col-md-3 col-sm-6 mb-3">
<div class="card shadow-sm h-100">
<div class="card-body text-center">
<div class="display-6 text-warning mb-2">{{ stats.logs_size_mb }} MB</div>
<p class="card-text mb-0">Logs Size</p>
</div>
</div>
</div>
<!-- Database Count Card -->
<div class="col-md-3 col-sm-6 mb-3">
<div class="card shadow-sm h-100">
<div class="card-body text-center">
<div class="display-6 text-secondary mb-2">{{ stats.database_count }}</div>
<p class="card-text mb-0">Databases</p>
</div>
</div>
</div>
</div>
<div class="row">
<!-- Backups Card -->
<div class="col-md-3 col-sm-6 mb-3">
<div class="card shadow-sm h-100">
<div class="card-body text-center">
<div class="display-6 text-success mb-2">{{ stats.backup_count }}</div>
<p class="card-text mb-0">Scheduled Backups</p>
</div>
</div>
</div>
<!-- Printer Keys Card -->
<div class="col-md-3 col-sm-6 mb-3">
<div class="card shadow-sm h-100">
<div class="card-body text-center">
<div class="display-6 text-danger mb-2">{{ stats.printer_keys_count }}</div>
<p class="card-text mb-0">Printer Keys</p>
</div>
</div>
</div>
<!-- App Keys Availability Card -->
<div class="col-md-6 col-sm-6 mb-3">
<div class="card shadow-sm h-100">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<p class="card-text mb-0">App Key Availability</p>
<h5 class="mb-0 mt-2">
{% if stats.app_key_availability.available %}
<span class="badge bg-success"><i class="fas fa-check-circle"></i> {{ stats.app_key_availability.status }}</span>
{% else %}
<span class="badge bg-danger"><i class="fas fa-times-circle"></i> {{ stats.app_key_availability.status }}</span>
{% endif %}
</h5>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-3">
<div class="list-group">
@@ -31,6 +121,9 @@
<a href="{{ url_for('settings.database_settings') }}" class="list-group-item list-group-item-action">
<i class="fas fa-database"></i> Database Info
</a>
<a href="{{ url_for('settings.logs_explorer') }}" class="list-group-item list-group-item-action">
<i class="fas fa-file-alt"></i> Logs Explorer
</a>
</div>
</div>
<div class="col-md-9">