Files
ske087 bff6d70b17 Initial commit: aplicatie de cantarire si etichetare
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
2026-10-18 23:38:45 +03:00

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 &amp; 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 &amp; 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>