From a0dcec6e15526446bb9145749960f63b715d3c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Mu=C3=B1oz=20Paredes?= Date: Sun, 13 Jul 2025 16:49:28 +0000 Subject: [PATCH 1/2] fix: default slug if generated is empty --- mealie/schema/recipe/recipe.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mealie/schema/recipe/recipe.py b/mealie/schema/recipe/recipe.py index b6c96e098..74cad2c17 100644 --- a/mealie/schema/recipe/recipe.py +++ b/mealie/schema/recipe/recipe.py @@ -47,6 +47,8 @@ def create_recipe_slug(name: str, max_length: int = 250) -> str: A truncated slug string """ generated_slug = slugify(name) + if not generated_slug: + generated_slug = "untitled" if len(generated_slug) > max_length: generated_slug = generated_slug[:max_length] return generated_slug From 3726dfd92e323ead2506ba5e5d7d04c70650fe57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Mu=C3=B1oz=20Paredes?= Date: Sun, 13 Jul 2025 16:50:01 +0000 Subject: [PATCH 2/2] fix: check if slug is empty to show alert --- frontend/pages/g/[groupSlug]/r/create/new.vue | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/frontend/pages/g/[groupSlug]/r/create/new.vue b/frontend/pages/g/[groupSlug]/r/create/new.vue index 29948d304..2c9f50f8f 100644 --- a/frontend/pages/g/[groupSlug]/r/create/new.vue +++ b/frontend/pages/g/[groupSlug]/r/create/new.vue @@ -46,6 +46,7 @@ import type { AxiosResponse } from "axios"; import { useUserApi } from "~/composables/api"; import { validators } from "~/composables/use-validators"; import type { VForm } from "~/types/auto-forms"; +import { alert } from "~/composables/use-toast"; export default defineNuxtComponent({ setup() { @@ -59,6 +60,7 @@ export default defineNuxtComponent({ const api = useUserApi(); const router = useRouter(); + const i18n = useI18n(); function handleResponse(response: AxiosResponse | null, edit = false) { if (response?.status !== 201) { @@ -71,11 +73,25 @@ export default defineNuxtComponent({ const newRecipeName = ref(""); const domCreateByName = ref(null); + function createRecipeSlug(str: string): string { + return str + .toLowerCase() + .normalize("NFD") + .replace(/\p{Diacritic}/gu, "") + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, "") + .replace(/-+/g, "-"); + } async function createByName(name: string) { if (!domCreateByName.value?.validate() || name === "") { return; } + const recipeSlug = createRecipeSlug(name); + if (!recipeSlug) { + alert.error(i18n.t("recipe.recipe-creation-failed") as string); + return; + } const { response } = await api.recipes.createOne({ name }); handleResponse(response as any, true); }