Translation of the recipe edit page

This commit is contained in:
Greg Burri 2025-01-06 19:51:19 +01:00
parent f059d3c61f
commit 8b4b788562
7 changed files with 112 additions and 53 deletions

View file

@ -7,7 +7,6 @@ use crate::{
consts, consts,
data::model, data::model,
hash::{hash, verify_password}, hash::{hash, verify_password},
services::user,
}; };
#[derive(Debug)] #[derive(Debug)]

View file

@ -10,14 +10,14 @@ pub struct User {
pub lang: String, pub lang: String,
} }
#[derive(FromRow)] #[derive(Debug, FromRow)]
pub struct UserLoginInfo { pub struct UserLoginInfo {
pub last_login_datetime: DateTime<Utc>, pub last_login_datetime: DateTime<Utc>,
pub ip: String, pub ip: String,
pub user_agent: String, pub user_agent: String,
} }
#[derive(FromRow)] #[derive(Debug, FromRow)]
pub struct Recipe { pub struct Recipe {
pub id: i64, pub id: i64,
pub user_id: i64, pub user_id: i64,
@ -36,7 +36,7 @@ pub struct Recipe {
pub groups: Vec<Group>, pub groups: Vec<Group>,
} }
#[derive(FromRow)] #[derive(Debug, FromRow)]
pub struct Group { pub struct Group {
pub id: i64, pub id: i64,
pub name: String, pub name: String,
@ -46,7 +46,7 @@ pub struct Group {
pub steps: Vec<Step>, pub steps: Vec<Step>,
} }
#[derive(FromRow)] #[derive(Debug, FromRow)]
pub struct Step { pub struct Step {
pub id: i64, pub id: i64,
pub action: String, pub action: String,
@ -55,7 +55,7 @@ pub struct Step {
pub ingredients: Vec<Ingredient>, pub ingredients: Vec<Ingredient>,
} }
#[derive(FromRow)] #[derive(Debug, FromRow)]
pub struct Ingredient { pub struct Ingredient {
pub id: i64, pub id: i64,
pub name: String, pub name: String,

View file

@ -44,6 +44,8 @@ pub async fn edit_recipe(
current_id: Some(recipe_id), current_id: Some(recipe_id),
}; };
dbg!(&recipe);
Ok(RecipeEditTemplate { Ok(RecipeEditTemplate {
user: Some(user), user: Some(user),
tr, tr,

View file

@ -80,6 +80,31 @@ pub enum Sentence {
RecipeNotAllowedToEdit, RecipeNotAllowedToEdit,
RecipeNotAllowedToView, RecipeNotAllowedToView,
RecipeNotFound, RecipeNotFound,
RecipeTitle,
RecipeDescription,
RecipeServings,
RecipeEstimatedTime,
RecipeDifficulty,
RecipeDifficultyEasy,
RecipeDifficultyMedium,
RecipeDifficultyHard,
RecipeTags,
RecipeLanguage,
RecipeIsPublished,
RecipeDelete,
RecipeAddAGroup,
RecipeRemoveGroup,
RecipeGroupName,
RecipeGroupComment,
RecipeAddAStep,
RecipeRemoveStep,
RecipeStepAction,
RecipeAddAnIngredient,
RecipeRemoveIngredient,
RecipeIngredientName,
RecipeIngredientQuantity,
RecipeIngredientUnit,
RecipeIngredientComment,
} }
#[derive(Clone)] #[derive(Clone)]

View file

@ -9,64 +9,47 @@
{% block content %} {% block content %}
<div class="content" id="recipe-edit"> <div class="content" id="recipe-edit">
<label for="input-title">Title</label> <label for="input-title">{{ tr.t(Sentence::RecipeTitle) }}</label>
<input <input
id="input-title" id="input-title"
type="text" type="text"
value="{{ recipe.title }}" value="{{ recipe.title }}"
autofocus="true" /> autofocus="true" />
<label for="text-area-description">Description</label> <label for="text-area-description">{{ tr.t(Sentence::RecipeDescription) }}</label>
<textarea <textarea
id="text-area-description">{{ recipe.description }}</textarea> id="text-area-description">{{ recipe.description }}</textarea>
<label for="input-servings">Servings</label> <label for="input-servings">{{ tr.t(Sentence::RecipeServings) }}</label>
<input <input
id="input-servings" id="input-servings"
type="number" type="number"
step="1" min="1" max="100" step="1" min="1" max="100"
value=" value="
{% match recipe.servings %} {% if let Some(s) = recipe.servings %}
{% when Some with (s) %}
{{ s }} {{ s }}
{% when None %} {% endif %}"/>
{% endmatch %}"/> <label for="input-estimated-time">{{ tr.t(Sentence::RecipeEstimatedTime) }}</label>
<label for="input-estimated-time">Estimated time [min]</label>
<input <input
id="input-estimated-time" id="input-estimated-time"
type="number" type="number"
step="1" min="0" max="1000" step="10" min="0" max="1000"
value=" value="
{% match recipe.estimated_time %} {% if let Some(t) = recipe.estimated_time %}
{% when Some with (t) %}
{{ t }} {{ t }}
{% when None %} {% endif %}"/>
{% endmatch %}"/> <label for="select-difficulty">{{ tr.t(Sentence::RecipeDifficulty) }}</label>
<label for="select-difficulty">Difficulty</label>
<select id="select-difficulty"> <select id="select-difficulty">
<option value="0" {%+ call is_difficulty(common::ron_api::Difficulty::Unknown) %}> - </option> <option value="0" {%+ call is_difficulty(common::ron_api::Difficulty::Unknown) %}> - </option>
<option value="1" {%+ call is_difficulty(common::ron_api::Difficulty::Easy) %}>Easy</option> <option value="1" {%+ call is_difficulty(common::ron_api::Difficulty::Easy) %}>{{ tr.t(Sentence::RecipeDifficultyEasy) }}</option>
<option value="2" {%+ call is_difficulty(common::ron_api::Difficulty::Medium) %}>Medium</option> <option value="2" {%+ call is_difficulty(common::ron_api::Difficulty::Medium) %}>{{ tr.t(Sentence::RecipeDifficultyMedium) }}</option>
<option value="3" {%+ call is_difficulty(common::ron_api::Difficulty::Hard) %}>Hard</option> <option value="3" {%+ call is_difficulty(common::ron_api::Difficulty::Hard) %}>{{ tr.t(Sentence::RecipeDifficultyHard) }}</option>
</select> </select>
<!--
* Event on 'input':
* Trim left
* for all w in "<word> ":
* Call recipe/add_tags with all w
* Add all w to tag list (DOM)
* Event on 'click' on del tag button:
* Call recipe/rm_tags
* Remove the tag to the html list (DOM)
* 'enter' key to add the current tag
-->
<div id="container-tags"> <div id="container-tags">
<label for="input-tags" >Tags</label> <label for="input-tags" >{{ tr.t(Sentence::RecipeTags) }}</label>
<span class="tags"></span> <span class="tags"></span>
<input <input
id="input-tags" id="input-tags"
@ -74,7 +57,7 @@
value="" /> value="" />
</div> </div>
<label for="select-language">Language</label> <label for="select-language">{{ tr.t(Sentence::RecipeLanguage) }}</label>
<select id="select-language"> <select id="select-language">
{% for lang in languages %} {% for lang in languages %}
<option value="{{ lang.1 }}" <option value="{{ lang.1 }}"
@ -92,55 +75,55 @@
checked checked
{% endif %} {% endif %}
> >
<label for="input-is-published">Is published</label> <label for="input-is-published">{{ tr.t(Sentence::RecipeIsPublished) }}</label>
<input id="input-delete" type="button" value="Delete recipe" /> <input id="input-delete" type="button" value="{{ tr.t(Sentence::RecipeDelete) }}" />
<div id="groups-container"> <div id="groups-container">
</div> </div>
<input id="input-add-group" type="button" value="Add a group" /> <input id="input-add-group" type="button" value="{{ tr.t(Sentence::RecipeAddAGroup) }}" />
<div id="hidden-templates"> <div id="hidden-templates">
<div class="group"> <div class="group">
<label for="input-group-name">Name</label> <label for="input-group-name">{{ tr.t(Sentence::RecipeGroupName) }}</label>
<input class="input-group-name" type="text" /> <input class="input-group-name" type="text" />
<label for="input-group-comment">Comment</label> <label for="input-group-comment">{{ tr.t(Sentence::RecipeGroupComment) }}</label>
<input class="input-group-comment" type="text" /> <input class="input-group-comment" type="text" />
<input class="input-group-delete" type="button" value="Remove group" /> <input class="input-group-delete" type="button" value="{{ tr.t(Sentence::RecipeRemoveGroup) }}" />
<div class="steps"></div> <div class="steps"></div>
<input class="input-add-step" type="button" value="Add a step" /> <input class="input-add-step" type="button" value="{{ tr.t(Sentence::RecipeAddAStep) }}" />
</div> </div>
<div class="step"> <div class="step">
<label for="text-area-step-action">Action</label> <label for="text-area-step-action">{{ tr.t(Sentence::RecipeStepAction) }}</label>
<textarea class="text-area-step-action"></textarea> <textarea class="text-area-step-action"></textarea>
<input class="input-step-delete" type="button" value="Remove step" /> <input class="input-step-delete" type="button" value="{{ tr.t(Sentence::RecipeRemoveStep) }}" />
<div class="ingredients"></div> <div class="ingredients"></div>
<input class="input-add-ingredient" type="button" value="Add an ingredient"/> <input class="input-add-ingredient" type="button" value="{{ tr.t(Sentence::RecipeAddAnIngredient) }}"/>
</div> </div>
<div class="ingredient"> <div class="ingredient">
<label for="input-ingredient-name">Name</label> <label for="input-ingredient-name">{{ tr.t(Sentence::RecipeIngredientName) }}</label>
<input class="input-ingredient-name" type="text" /> <input class="input-ingredient-name" type="text" />
<label for="input-ingredient-quantity">Quantity</label> <label for="input-ingredient-quantity">{{ tr.t(Sentence::RecipeIngredientQuantity) }}</label>
<input class="input-ingredient-quantity" type="number" step="0.1" min="0" max="10000" /> <input class="input-ingredient-quantity" type="number" step="0.1" min="0" max="10000" />
<label for="input-ingredient-unit">Unit</label> <label for="input-ingredient-unit">{{ tr.t(Sentence::RecipeIngredientUnit) }}</label>
<input class="input-ingredient-unit" type="text" /> <input class="input-ingredient-unit" type="text" />
<label for="input-ingredient-comment">Comment</label> <label for="input-ingredient-comment">{{ tr.t(Sentence::RecipeIngredientComment) }}</label>
<input class="input-ingredient-comment" type="text" /> <input class="input-ingredient-comment" type="text" />
<input class="input-ingredient-delete" type="button" value="Remove ingredient" /> <input class="input-ingredient-delete" type="button" value="{{ tr.t(Sentence::RecipeRemoveIngredient) }}" />
</div> </div>
</div> </div>
</div> </div>

View file

@ -68,6 +68,31 @@
RecipeNotAllowedToEdit: "Not allowed to edit this recipe", RecipeNotAllowedToEdit: "Not allowed to edit this recipe",
RecipeNotAllowedToView: "Not allowed the view the recipe {}", RecipeNotAllowedToView: "Not allowed the view the recipe {}",
RecipeNotFound: "Recipe not found", RecipeNotFound: "Recipe not found",
RecipeTitle : "Title",
RecipeDescription : "Description",
RecipeServings : "Servings",
RecipeEstimatedTime : "Estimated time [min]",
RecipeDifficulty : "Difficulty",
RecipeDifficultyEasy : "Easy",
RecipeDifficultyMedium : "Medium",
RecipeDifficultyHard : "Hard",
RecipeTags : "Tags",
RecipeLanguage : "Language",
RecipeIsPublished : "Is published",
RecipeDelete : "Delete recipe",
RecipeAddAGroup : "Add a group",
RecipeRemoveGroup : "Remove group",
RecipeGroupName : "Name",
RecipeGroupComment : "Comment",
RecipeAddAStep : "Add a step",
RecipeRemoveStep : "Remove step",
RecipeStepAction : "Action",
RecipeAddAnIngredient : "Add an ingredient",
RecipeRemoveIngredient : "Remove ingredient",
RecipeIngredientName : "Name",
RecipeIngredientQuantity : "Quantity",
RecipeIngredientUnit : "Unit",
RecipeIngredientComment : "Comment",
} }
), ),
( (
@ -139,6 +164,31 @@
RecipeNotAllowedToEdit: "Vous n'êtes pas autorisé à éditer cette recette", RecipeNotAllowedToEdit: "Vous n'êtes pas autorisé à éditer cette recette",
RecipeNotAllowedToView: "Vous n'êtes pas autorisé à voir la recette {}", RecipeNotAllowedToView: "Vous n'êtes pas autorisé à voir la recette {}",
RecipeNotFound: "Recette non-trouvée", RecipeNotFound: "Recette non-trouvée",
RecipeTitle : "Titre",
RecipeDescription : "Description",
RecipeServings : "Nombre de personnes",
RecipeEstimatedTime : "Temps estimé",
RecipeDifficulty : "Difficulté",
RecipeDifficultyEasy : "Facile",
RecipeDifficultyMedium : "Moyen",
RecipeDifficultyHard : "Difficile",
RecipeTags : "Tags",
RecipeLanguage : "Langue",
RecipeIsPublished : "Est publié",
RecipeDelete : "Supprimer la recette",
RecipeAddAGroup : "Ajouter un groupe",
RecipeRemoveGroup : "Supprimer le groupe",
RecipeGroupName : "Nom",
RecipeGroupComment : "Commentaire",
RecipeAddAStep : "Ajouter une étape",
RecipeRemoveStep : "Supprimer l'étape",
RecipeStepAction : "Action",
RecipeAddAnIngredient : "Ajouter un ingrédient",
RecipeRemoveIngredient : "Supprimer l'ingrédient",
RecipeIngredientName : "Nom",
RecipeIngredientQuantity : "Quantité",
RecipeIngredientUnit : "Unité",
RecipeIngredientComment : "Commentaire",
} }
) )
] ]