diff --git a/client/templates/components/navbar.html b/client/templates/components/navbar.html index 4e52d62..548b329 100644 --- a/client/templates/components/navbar.html +++ b/client/templates/components/navbar.html @@ -15,6 +15,9 @@ alt="TieMeasureFlow" class="h-8 w-auto"> {% endif %} + @@ -35,7 +38,7 @@ - Misure + {{ _('Misure') }} {% endif %} @@ -52,7 +55,7 @@ - Ricette + {{ _('Ricette') }} {% endif %} @@ -69,7 +72,7 @@ - Statistiche + {{ _('Statistiche') }} {% endif %} @@ -86,7 +89,7 @@ - Admin + {{ _('Admin') }} @@ -108,14 +111,14 @@ - Utenti + {{ _('Utenti') }} - Impostazioni + {{ _('Impostazioni') }} @@ -211,7 +214,7 @@ - Profilo + {{ _('Profilo') }}
@@ -222,7 +225,7 @@ - Logout + {{ _('Logout') }} @@ -267,7 +270,7 @@ - Misure + {{ _('Misure') }} {% endif %} @@ -279,7 +282,7 @@ - Ricette + {{ _('Ricette') }} {% endif %} @@ -291,13 +294,13 @@ - Statistiche + {{ _('Statistiche') }} {% endif %} {% if current_user.get('is_admin') %}
-

Admin

+

{{ _('Admin') }}

- Utenti + {{ _('Utenti') }} - Impostazioni + {{ _('Impostazioni') }} {% endif %} diff --git a/client/templates/maker/recipe_editor.html b/client/templates/maker/recipe_editor.html index e110302..0d30c8a 100644 --- a/client/templates/maker/recipe_editor.html +++ b/client/templates/maker/recipe_editor.html @@ -585,8 +585,8 @@ function recipeEditor() { return { // ---- Mode ---- - isNew: {{ 'true' if is_new else 'false' }}, - recipeId: {{ recipe_id|tojson if recipe_id else 'null' }}, + isNew: {{ 'true' if recipe is none else 'false' }}, + recipeId: {{ recipe.id|tojson if recipe else 'null' }}, // ---- Form data ---- code: {{ (recipe.code if recipe else '')|tojson }}, @@ -595,12 +595,12 @@ function recipeEditor() { changeNotes: '', // ---- File upload ---- - currentFilePath: {{ (current_version.tasks[0].file_path if current_version and current_version.tasks and current_version.tasks|length > 0 else None)|tojson }}, + currentFilePath: {{ (recipe.current_version.tasks[0].file_path if recipe and recipe.current_version and recipe.current_version.tasks and recipe.current_version.tasks|length > 0 else None)|tojson }}, uploadingFile: false, dragOver: false, // ---- Annotation state (managed by annotation-editor.js) ---- - annotationsJson: {{ (current_version.tasks[0].annotations_json if current_version and current_version.tasks and current_version.tasks|length > 0 and current_version.tasks[0].annotations_json else None)|tojson }}, + annotationsJson: {{ (recipe.current_version.tasks[0].annotations_json if recipe and recipe.current_version and recipe.current_version.tasks and recipe.current_version.tasks|length > 0 and recipe.current_version.tasks[0].annotations_json else None)|tojson }}, annoTool: 'select', annoSelected: false, @@ -610,8 +610,8 @@ function recipeEditor() { errorMessage: '', // ---- Versioning ---- - versions: {{ versions|tojson }}, - currentVersion: {{ (current_version.version_number if current_version else 0)|tojson }}, + versions: {{ (recipe.versions if recipe and recipe.versions else [])|tojson }}, + currentVersion: {{ (recipe.current_version.version_number if recipe and recipe.current_version else 0)|tojson }}, // ============================================================ // Init diff --git a/client/templates/maker/task_editor.html b/client/templates/maker/task_editor.html index dddd550..655eee9 100644 --- a/client/templates/maker/task_editor.html +++ b/client/templates/maker/task_editor.html @@ -1227,7 +1227,7 @@ function taskEditor() { this.successMessage = '{{ _("Task eliminato") }}'; } else { const data = await resp.json(); - this.errorMessage = data.detail || '{{ _("Errore nell\'eliminazione del task") }}'; + this.errorMessage = data.detail || {{ _("Errore nell'eliminazione del task")|tojson }}; } } catch (err) { console.error('deleteTask error:', err); @@ -1510,7 +1510,7 @@ function taskEditor() { this.successMessage = '{{ _("Misurazione eliminata") }}'; } else { const data = await resp.json(); - this.errorMessage = data.detail || '{{ _("Errore nell\'eliminazione della misurazione") }}'; + this.errorMessage = data.detail || {{ _("Errore nell'eliminazione della misurazione")|tojson }}; } } catch (err) { console.error('deleteSubtask error:', err); diff --git a/client/templates/measure/select_recipe.html b/client/templates/measure/select_recipe.html index 476f2a1..2d3aaf0 100644 --- a/client/templates/measure/select_recipe.html +++ b/client/templates/measure/select_recipe.html @@ -150,7 +150,7 @@ + x-text="'v' + (recipe.current_version ? recipe.current_version.version_number : (recipe.version || ''))"> diff --git a/client/templates/measure/task_complete.html b/client/templates/measure/task_complete.html index 2b2ef9a..54464b2 100644 --- a/client/templates/measure/task_complete.html +++ b/client/templates/measure/task_complete.html @@ -55,7 +55,7 @@

{{ _('Versione') }}

-

{{ recipe.current_version or recipe.version }}

+

{{ recipe.current_version.version_number if recipe.current_version else recipe.version }}

{{ _('Lotto') }}

@@ -299,7 +299,7 @@ window.CSV_I18N = { window.measurementData = { recipeName: {{ recipe.name|tojson }}, recipeCode: {{ recipe.code|tojson }}, - version: {{ (recipe.current_version or recipe.version)|tojson }}, + version: {{ (recipe.current_version.version_number if recipe.current_version else recipe.version)|tojson }}, lotNumber: {{ (lot_number or '')|tojson }}, serialNumber: {{ (serial_number or '')|tojson }}, measurements: {{ measurements|tojson }} diff --git a/client/templates/measure/task_list.html b/client/templates/measure/task_list.html index d230377..095a2ff 100644 --- a/client/templates/measure/task_list.html +++ b/client/templates/measure/task_list.html @@ -44,7 +44,7 @@ {% if recipe.current_version or recipe.version %} - v{{ recipe.current_version or recipe.version }} + v{{ recipe.current_version.version_number if recipe.current_version else recipe.version }} {% endif %}
diff --git a/server/routers/tasks.py b/server/routers/tasks.py index 4ee0f2b..8204f29 100644 --- a/server/routers/tasks.py +++ b/server/routers/tasks.py @@ -112,6 +112,17 @@ async def list_tasks( return [TaskResponse.model_validate(t) for t in tasks] +@router.get("/api/tasks/{task_id}", response_model=TaskResponse) +async def get_task( + task_id: int, + _user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +): + """Get a single task with its subtasks. All authenticated users.""" + task = await _get_task_or_404(db, task_id) + return TaskResponse.model_validate(task) + + @router.post( "/api/recipes/{recipe_id}/tasks", response_model=TaskResponse,