1a0431366f
Aligns the repo with the python-project-spec-design.md template chosen for V2.0.0. Big move, no logic changes. The 3 pre-existing test failures (test_recipes::test_update_recipe, test_recipes:: test_recipe_versioning, test_tasks::test_reorder_tasks, plus the client test_save_measurement_proxy) survive unchanged. Layout changes - server/ -> src/backend/ - server/middleware/ -> src/backend/api/middleware/ - server/routers/ -> src/backend/api/routers/ - server/models/ -> src/backend/models/orm/ - server/schemas/ -> src/backend/models/api/ - server/uploads/ -> uploads/ (project root, mounted volume) - server/tests/ -> src/backend/tests/ - client/ -> src/frontend/flask_app/ (Flask kept; React deroga is documented in CLAUDE.md, justified by tablet UX, USB caliper/barcode workflow and Fabric.js integration) Tooling - pyproject.toml: monorepo with [project] core deps and optional-dependencies server / client / dev. Replaces both server/requirements.txt and client/requirements.txt. - uv.lock + .python-version (3.11) committed for reproducible builds. - Dockerfile (root, backend) and Dockerfile.frontend rewritten to use uv sync --frozen --no-dev --extra server|client; legacy Dockerfiles preserved as Dockerfile.legacy for reference but excluded from build context via .dockerignore. - docker-compose.dev.yml + docker-compose.yml: build context now ".", dockerfile pointing to the root files. Code adjustments forced by the move - Every "from config|database|models|schemas|services|routers|middleware import ..." rewritten to its src.backend.* equivalent (50+ files including indented inline imports inside test bodies). - src/backend/migrations/env.py: insert project root into sys.path so alembic can resolve src.backend.* imports regardless of cwd. - src/backend/config.py: env_file ../../.env (was ../.env), upload_path resolves project root via parents[2]. - src/backend/tests/conftest.py + tests: import ... from src.backend.* instead of bare names; old per-directory pytest.ini files removed in favor of root pyproject.toml [tool.pytest.ini_options]. - .gitignore: uploads/ at root, src/frontend/flask_app/static/css/ tailwind.css path; .dockerignore tightened. - CLAUDE.md: rewrote sections "Layout del repository", "Comandi di Sviluppo", "Database & Migrations", "Test", "i18n", and all path references throughout the architecture sections. Verified - uv lock resolves 77 packages; uv sync --extra server --extra client --extra dev installs cleanly. - uv run pytest: 171 passed, 4 pre-existing failures. - uv run alembic -c src/backend/migrations/alembic.ini check loads config and metadata (errors only on the absent local MySQL). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
77 lines
3.2 KiB
HTML
77 lines
3.2 KiB
HTML
{# Measurement Feedback Component
|
|
|
|
Mostra feedback visivo in tempo reale della misurazione corrente.
|
|
|
|
Variabili Alpine.js richieste nel parent component:
|
|
- currentValue: float | null - valore corrente misurato
|
|
- nominal: float - valore nominale
|
|
- utl: float - Upper Tolerance Limit
|
|
- uwl: float - Upper Warning Limit
|
|
- lwl: float - Lower Warning Limit
|
|
- ltl: float - Lower Tolerance Limit
|
|
- unit: string - unità di misura (es. "mm")
|
|
- passFailStatus: computed - 'pass' | 'warning' | 'fail'
|
|
- deviation: computed - scostamento dal nominale
|
|
- progressWidth: computed - larghezza barra percentuale
|
|
#}
|
|
|
|
<div class="measurement-feedback" x-show="currentValue !== null">
|
|
<!-- Status bar colorata -->
|
|
<div class="h-3 rounded-full overflow-hidden bg-slate-200 dark:bg-slate-600">
|
|
<div class="h-full rounded-full transition-all duration-300"
|
|
:class="{
|
|
'bg-measure-pass': passFailStatus === 'pass',
|
|
'bg-measure-warning': passFailStatus === 'warning',
|
|
'bg-measure-fail': passFailStatus === 'fail'
|
|
}"
|
|
:style="'width: ' + progressWidth + '%'">
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Status text + deviation -->
|
|
<div class="flex justify-between items-center mt-2">
|
|
<div class="flex items-center gap-2">
|
|
<!-- Icona stato - CONFORME -->
|
|
<template x-if="passFailStatus === 'pass'">
|
|
<span class="flex items-center gap-1 text-measure-pass font-semibold text-sm">
|
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
|
|
</svg>
|
|
{{ _('CONFORME') }}
|
|
</span>
|
|
</template>
|
|
|
|
<!-- Icona stato - ATTENZIONE -->
|
|
<template x-if="passFailStatus === 'warning'">
|
|
<span class="flex items-center gap-1 text-measure-warning font-semibold text-sm">
|
|
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
|
<path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" clip-rule="evenodd"/>
|
|
</svg>
|
|
{{ _('ATTENZIONE') }}
|
|
</span>
|
|
</template>
|
|
|
|
<!-- Icona stato - NON CONFORME -->
|
|
<template x-if="passFailStatus === 'fail'">
|
|
<span class="flex items-center gap-1 text-measure-fail font-semibold text-sm">
|
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M6 18L18 6M6 6l12 12"/>
|
|
</svg>
|
|
{{ _('NON CONFORME') }}
|
|
</span>
|
|
</template>
|
|
</div>
|
|
|
|
<!-- Deviation con segno -->
|
|
<span class="font-mono text-sm font-medium"
|
|
:class="{
|
|
'text-measure-pass': passFailStatus === 'pass',
|
|
'text-measure-warning': passFailStatus === 'warning',
|
|
'text-measure-fail': passFailStatus === 'fail'
|
|
}"
|
|
x-text="deviation !== null ?
|
|
(deviation >= 0 ? '+' : '') + deviation.toFixed(3) + ' ' + unit : ''">
|
|
</span>
|
|
</div>
|
|
</div>
|