bff6d70b17
Aplicatie Flask + SQLite pentru productie alimentara: cantarirea componentelor unui produs finit si tiparirea etichetei prin QZ Tray. - produse finite (retete) formate din componente cantarite - designer vizual de etichete (mm/px, zona sigura, campuri variabile, cod QR cu continut din mai multe bucati) - legare produs finit -> sablon de eticheta - navigare pe doua taburi: Cantarire / Setari - administrare: componente, produse finite, sabloane, campuri, istoric - backup, resetare baza de date, checklist de pregatire, /healthz - CLI de administrare si serviciu systemd pentru productie - vendor/syncpulse-scale-bridge (GPL-3.0-or-later) pentru citirea cantarului
78 lines
3.0 KiB
HTML
78 lines
3.0 KiB
HTML
<!doctype html>
|
|
<html lang="ro">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{% block title %}Cântărire și etichetare{% endblock %}</title>
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/app.css') }}">
|
|
{% block head %}{% endblock %}
|
|
</head>
|
|
<body>
|
|
{% set admin_blueprints = ['history', 'recipes', 'components', 'label_templates', 'fields',
|
|
'monitor'] %}
|
|
{% set in_settings = request.blueprint in admin_blueprints
|
|
or request.endpoint == 'main.settings_page' %}
|
|
<header class="topbar">
|
|
<a class="brand" href="{{ url_for('main.dashboard') }}">
|
|
<span class="brand-mark">CE</span>
|
|
<span class="brand-text">Cântărire & Etichetare</span>
|
|
</a>
|
|
<nav class="nav">
|
|
<a href="{{ url_for('main.dashboard') }}"
|
|
class="{{ 'active' if request.endpoint == 'main.dashboard' }}">Cântărire</a>
|
|
<a href="{{ url_for('main.settings_page') }}"
|
|
class="{{ 'active' if in_settings }}">Setări</a>
|
|
</nav>
|
|
<button class="qz-pill" type="button" data-qz-pill data-qz-connect
|
|
title="Starea conexiunii QZ Tray">
|
|
<span class="qz-dot"></span>
|
|
<span data-qz-status>QZ Tray: se verifică…</span>
|
|
</button>
|
|
</header>
|
|
|
|
{% if in_settings %}
|
|
<nav class="subnav" aria-label="Secțiuni de administrare">
|
|
<div class="subnav-inner">
|
|
<a href="{{ url_for('main.settings_page') }}"
|
|
class="{{ 'active' if request.endpoint == 'main.settings_page' }}">Generale</a>
|
|
<a href="{{ url_for('components.index') }}"
|
|
class="{{ 'active' if request.blueprint == 'components' }}">Componente</a>
|
|
<a href="{{ url_for('recipes.index') }}"
|
|
class="{{ 'active' if request.blueprint == 'recipes' }}">Produse finite</a>
|
|
<a href="{{ url_for('label_templates.index') }}"
|
|
class="{{ 'active' if request.blueprint == 'label_templates' }}">Șabloane</a>
|
|
<a href="{{ url_for('fields.index') }}"
|
|
class="{{ 'active' if request.blueprint == 'fields' }}">Câmpuri</a>
|
|
<a href="{{ url_for('history.index') }}"
|
|
class="{{ 'active' if request.blueprint == 'history' }}">Istoric</a>
|
|
<a href="{{ url_for('monitor.index') }}"
|
|
class="{{ 'active' if request.blueprint == 'monitor' }}">Monitor serial</a>
|
|
</div>
|
|
</nav>
|
|
{% endif %}
|
|
|
|
<main class="container">
|
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
{% if messages %}
|
|
<div class="flash-stack">
|
|
{% for category, message in messages %}
|
|
<div class="flash flash-{{ category }}">{{ message }}</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
{% endwith %}
|
|
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
|
|
<footer class="footer">
|
|
<span>Cântărire & Etichetare v{{ app_version }}</span>
|
|
<span>Produse finite · SyncPulse Scale Bridge · QZ Tray</span>
|
|
</footer>
|
|
|
|
{% block scripts %}{% endblock %}
|
|
<script src="{{ url_for('static', filename='js/vendor/qz-tray.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/qz-print.js') }}"></script>
|
|
</body>
|
|
</html>
|