diff --git a/cliff.toml b/cliff.toml
index c43520a59..fa5644fe3 100644
--- a/cliff.toml
+++ b/cliff.toml
@@ -35,7 +35,7 @@ conventional_commits = true
filter_unconventional = true
# regex for preprocessing the commit messages
commit_preprocessors = [
- { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/hay-kot/mealie/issues/${2}))"},
+ { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/mealie-recipes/mealie/issues/${2}))"},
]
# regex for parsing and grouping commits
commit_parsers = [
diff --git a/dev/scripts/all_recipes_stress_test.py b/dev/scripts/all_recipes_stress_test.py
index 0ce27cb13..ffdded3a0 100644
--- a/dev/scripts/all_recipes_stress_test.py
+++ b/dev/scripts/all_recipes_stress_test.py
@@ -44,7 +44,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1 cup unsalted butter, cut into cubes",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "ea3b6702-9532-4fbc-a40b-f99917831c26",
@@ -54,7 +53,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1 cup light brown sugar",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "c5bbfefb-1e23-4ffd-af88-c0363a0fae82",
@@ -64,7 +62,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1/2 cup granulated white sugar",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "034f481b-c426-4a17-b983-5aea9be4974b",
@@ -74,7 +71,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "2 large eggs",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "37c1f796-3bdb-4856-859f-dbec90bc27e4",
@@ -84,7 +80,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "2 tsp vanilla extract",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "85561ace-f249-401d-834c-e600a2f6280e",
@@ -94,7 +89,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1/2 cup creamy peanut butter",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "ac91bda0-e8a8-491a-976a-ae4e72418cfd",
@@ -104,7 +98,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1 tsp cornstarch",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "4d1256b3-115e-4475-83cd-464fbc304cb0",
@@ -114,7 +107,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1 tsp baking soda",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "64627441-39f9-4ee3-8494-bafe36451d12",
@@ -124,7 +116,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1/2 tsp salt",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "7ae212d0-3cd1-44b0-899e-ec5bd91fd384",
@@ -134,7 +125,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1 cup cake flour",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "06967994-8548-4952-a8cc-16e8db228ebd",
@@ -144,7 +134,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "2 cups all-purpose flour",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "bdb33b23-c767-4465-acf8-3b8e79eb5691",
@@ -154,7 +143,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "2 cups peanut butter chips",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "12ba0af8-affd-4fb2-9cca-6f1b3e8d3aef",
@@ -164,7 +152,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"note": "1½ cups Reese's Pieces candies",
"unit": None,
"food": None,
- "disableAmount": True,
"quantity": 1,
"originalText": None,
"referenceId": "4bdc0598-a3eb-41ee-8af0-4da9348fbfe2",
@@ -221,7 +208,6 @@ def recipe_data(name: str, slug: str, id: str, userId: str, groupId: str) -> dic
"showAssets": False,
"landscapeView": False,
"disableComments": False,
- "disableAmount": True,
"locked": False,
},
"assets": [],
diff --git a/docs/docs/documentation/community-guide/home-assistant.md b/docs/docs/documentation/community-guide/home-assistant.md
index d11db6a8d..e3a1c4dd0 100644
--- a/docs/docs/documentation/community-guide/home-assistant.md
+++ b/docs/docs/documentation/community-guide/home-assistant.md
@@ -13,14 +13,14 @@ Steps:
#### 1. Get your API Token
-Create an API token from Mealie's User Settings page (https://hay-kot.github.io/mealie/documentation/users-groups/user-settings/#api-key-generation)
+Create an API token from Mealie's User Settings page (https://docs.mealie.io/documentation/getting-started/api-usage/#getting-a-token)
#### 2. Create Home Assistant Sensors
Create REST sensors in home assistant to get the details of today's meal.
We will create sensors to get the name and ID of the first meal in today's meal plan (note that this may not be what is wanted if there is more than one meal planned for the day). We need the ID as well as the name to be able to retrieve the image for the meal.
-Make sure the url and port (`http://mealie:9000` ) matches your installation's address and _API_ port.
+Make sure the url and port (`http://mealie:9000`) matches your installation's address and _API_ port.
```yaml
rest:
diff --git a/docs/docs/documentation/getting-started/roadmap.md b/docs/docs/documentation/getting-started/roadmap.md
index fd4b66876..9cc71fcf4 100644
--- a/docs/docs/documentation/getting-started/roadmap.md
+++ b/docs/docs/documentation/getting-started/roadmap.md
@@ -2,6 +2,3 @@
## Feature Requests
[Please request new features on Github](https://github.com/mealie-recipes/mealie/discussions/new?category=feature-request)
-
-## Progress
-See the [Github Projects page](https://github.com/users/hay-kot/projects/2) to see what is currently being worked on
diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html
index cc74f1312..64a6e5cf4 100644
--- a/docs/docs/overrides/api.html
+++ b/docs/docs/overrides/api.html
@@ -14,7 +14,7 @@
diff --git a/docs/docs/overrides/home.html b/docs/docs/overrides/home.html
index 8112b3153..b5439d0fd 100644
--- a/docs/docs/overrides/home.html
+++ b/docs/docs/overrides/home.html
@@ -351,7 +351,7 @@
@@ -188,7 +191,6 @@ export interface RecipeWithScale extends Recipe {
export interface ShoppingListIngredient {
checked: boolean;
ingredient: RecipeIngredient;
- disableAmount: boolean;
}
export interface ShoppingListIngredientSection {
@@ -290,7 +292,6 @@ async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
return {
checked: !householdsWithFood.includes(userHousehold.value),
ingredient: ing,
- disableAmount: recipe.settings?.disableAmount || false,
};
});
diff --git a/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue b/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue
index 01e1f4084..920641f95 100644
--- a/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue
+++ b/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue
@@ -17,7 +17,6 @@
class="d-flex flex-wrap my-1"
>
-
-
- {{ $globals.icons.arrowUpDown }}
-
-
-
+ />
({ required: true });
defineProps({
- disableAmount: {
- type: Boolean,
- default: false,
- },
unitError: {
type: Boolean,
default: false,
diff --git a/frontend/components/Domain/Recipe/RecipeIngredientListItem.vue b/frontend/components/Domain/Recipe/RecipeIngredientListItem.vue
index bdf2604b6..f4a50e6cb 100644
--- a/frontend/components/Domain/Recipe/RecipeIngredientListItem.vue
+++ b/frontend/components/Domain/Recipe/RecipeIngredientListItem.vue
@@ -34,16 +34,14 @@ import { useParsedIngredientText } from "~/composables/recipes";
interface Props {
ingredient: RecipeIngredient;
- disableAmount?: boolean;
scale?: number;
}
const props = withDefaults(defineProps(), {
- disableAmount: false,
scale: 1,
});
const parsedIng = computed(() => {
- return useParsedIngredientText(props.ingredient, props.disableAmount, props.scale);
+ return useParsedIngredientText(props.ingredient, props.scale);
});
diff --git a/frontend/components/Domain/Recipe/RecipeIngredients.vue b/frontend/components/Domain/Recipe/RecipeIngredients.vue
index 345a6a1de..06ac087ca 100644
--- a/frontend/components/Domain/Recipe/RecipeIngredients.vue
+++ b/frontend/components/Domain/Recipe/RecipeIngredients.vue
@@ -43,7 +43,6 @@
@@ -60,13 +59,11 @@ import type { RecipeIngredient } from "~/lib/api/types/recipe";
interface Props {
value?: RecipeIngredient[];
- disableAmount?: boolean;
scale?: number;
isCookMode?: boolean;
}
const props = withDefaults(defineProps(), {
value: () => [],
- disableAmount: false,
scale: 1,
isCookMode: false,
});
@@ -89,7 +86,7 @@ const ingredientCopyText = computed(() => {
components.push(`[${ingredient.title}]`);
}
- components.push(parseIngredientText(ingredient, props.disableAmount, props.scale, false));
+ components.push(parseIngredientText(ingredient, props.scale, false));
});
return components.join("\n");
diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePage.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePage.vue
index ae59941d5..b55487ed0 100644
--- a/frontend/components/Domain/Recipe/RecipePage/RecipePage.vue
+++ b/frontend/components/Domain/Recipe/RecipePage/RecipePage.vue
@@ -141,7 +141,6 @@
diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientEditor.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientEditor.vue
index 010b1d941..302b16c9d 100644
--- a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientEditor.vue
+++ b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientEditor.vue
@@ -1,9 +1,14 @@
-
- {{ $t("recipe.ingredients") }}
-
+
+
+ {{ $t("recipe.ingredients") }}
+
+
+ {{ $t("recipe.ingredients-not-parsed-description", { parse: $t('recipe.parse') }) }}
+
+
{
});
const parserToolTip = computed(() => {
- if (recipe.value.settings.disableAmount) {
- return i18n.t("recipe.enable-ingredient-amounts-to-use-this-feature");
- }
- else if (hasFoodOrUnit.value) {
+ if (hasFoodOrUnit.value) {
return i18n.t("recipe.recipes-with-units-or-foods-defined-cannot-be-parsed");
}
return i18n.t("recipe.parse-ingredients");
@@ -127,7 +128,6 @@ function addIngredient(ingredients: Array | null = null) {
note: x,
unit: undefined,
food: undefined,
- disableAmount: true,
quantity: 1,
};
});
@@ -146,7 +146,6 @@ function addIngredient(ingredients: Array | null = null) {
unit: undefined,
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
food: undefined,
- disableAmount: true,
quantity: 1,
});
}
@@ -161,7 +160,6 @@ function insertNewIngredient(dest: number) {
unit: undefined,
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
food: undefined,
- disableAmount: true,
quantity: 1,
});
}
diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientToolsView.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientToolsView.vue
index 0c38194fd..ae77cb54e 100644
--- a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientToolsView.vue
+++ b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageIngredientToolsView.vue
@@ -3,7 +3,6 @@
diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue
index fba525a2b..0eb71ceae 100644
--- a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue
+++ b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue
@@ -36,7 +36,7 @@
:value="ing.referenceId"
>
-
+
@@ -51,7 +51,7 @@
:value="ing.referenceId"
>
-
+
@@ -323,7 +323,6 @@
return step.ingredientReferences.map((ref) => ref.referenceId).includes(ing.referenceId || '')
})"
:scale="scale"
- :disable-amount="recipe.settings.disableAmount"
:is-cook-mode="isCookMode"
/>
@@ -552,7 +551,6 @@ function autoSetReferences() {
props.recipe.recipeIngredient,
activeRefs.value,
activeText.value,
- props.recipe.settings.disableAmount,
).forEach((ingredient: string) => activeRefs.value.push(ingredient));
}
@@ -574,7 +572,7 @@ function getIngredientByRefId(refId: string | undefined) {
const ing = ingredientLookup.value[refId];
if (!ing) return "";
- return parseIngredientText(ing, props.recipe.settings.disableAmount, props.scale);
+ return parseIngredientText(ing, props.scale);
}
// ===============================================================
diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageScale.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageScale.vue
index f886effa2..52e4af3c1 100644
--- a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageScale.vue
+++ b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageScale.vue
@@ -4,7 +4,7 @@
v-if="!isEditMode"
v-model.number="scale"
:recipe-servings="recipeServings"
- :edit-scale="!recipe.settings.disableAmount && !isEditMode"
+ :edit-scale="hasFoodOrUnit && !isEditMode"
/>
@@ -24,4 +24,15 @@ const { isEditMode } = usePageState(props.recipe.slug);
const recipeServings = computed(() => {
return props.recipe.recipeServings || props.recipe.recipeYieldQuantity || 1;
});
+
+const hasFoodOrUnit = computed(() => {
+ if (props.recipe.recipeIngredient) {
+ for (const ingredient of props.recipe.recipeIngredient) {
+ if (ingredient.food || ingredient.unit) {
+ return true;
+ }
+ }
+ }
+ return false;
+});
diff --git a/frontend/components/Domain/Recipe/RecipePrintView.vue b/frontend/components/Domain/Recipe/RecipePrintView.vue
index 964256afb..68168dcaa 100644
--- a/frontend/components/Domain/Recipe/RecipePrintView.vue
+++ b/frontend/components/Domain/Recipe/RecipePrintView.vue
@@ -321,7 +321,7 @@ const hasNotes = computed(() => {
});
function parseText(ingredient: RecipeIngredient) {
- return parseIngredientText(ingredient, props.recipe.settings?.disableAmount || false, props.scale);
+ return parseIngredientText(ingredient, props.scale);
}
diff --git a/frontend/components/Domain/Recipe/RecipeSettingsSwitches.vue b/frontend/components/Domain/Recipe/RecipeSettingsSwitches.vue
index 8bfd49852..a2dc3f55a 100644
--- a/frontend/components/Domain/Recipe/RecipeSettingsSwitches.vue
+++ b/frontend/components/Domain/Recipe/RecipeSettingsSwitches.vue
@@ -31,7 +31,6 @@ const labels: Record = {
showAssets: i18n.t("asset.show-assets"),
landscapeView: i18n.t("recipe.landscape-view-coming-soon"),
disableComments: i18n.t("recipe.disable-comments"),
- disableAmount: i18n.t("recipe.disable-amount"),
locked: i18n.t("recipe.locked"),
};
diff --git a/frontend/components/Domain/ShoppingList/ShoppingListItem.vue b/frontend/components/Domain/ShoppingList/ShoppingListItem.vue
index f1cd028c9..fe9d8c52a 100644
--- a/frontend/components/Domain/ShoppingList/ShoppingListItem.vue
+++ b/frontend/components/Domain/ShoppingList/ShoppingListItem.vue
@@ -22,10 +22,7 @@
:class="listItem.checked ? 'strike-through' : ''"
style="min-width: 0;"
>
-
+
@@ -172,7 +169,6 @@
@save="save"
@cancel="toggleEdit(false)"
@delete="$emit('delete')"
- @toggle-foods="localListItem.isFood = !localListItem.isFood"
/>
diff --git a/frontend/components/Domain/ShoppingList/ShoppingListItemEditor.vue b/frontend/components/Domain/ShoppingList/ShoppingListItemEditor.vue
index 8ed581310..e10a70332 100644
--- a/frontend/components/Domain/ShoppingList/ShoppingListItemEditor.vue
+++ b/frontend/components/Domain/ShoppingList/ShoppingListItemEditor.vue
@@ -2,7 +2,7 @@
-
+
-
-
-
diff --git a/frontend/components/Layout/LayoutParts/AppFooter.vue b/frontend/components/Layout/LayoutParts/AppFooter.vue
index 0826afc60..ccbb7987a 100644
--- a/frontend/components/Layout/LayoutParts/AppFooter.vue
+++ b/frontend/components/Layout/LayoutParts/AppFooter.vue
@@ -17,7 +17,7 @@
diff --git a/frontend/composables/recipe-page/use-extract-ingredient-references.ts b/frontend/composables/recipe-page/use-extract-ingredient-references.ts
index 4504bf612..3fa16a674 100644
--- a/frontend/composables/recipe-page/use-extract-ingredient-references.ts
+++ b/frontend/composables/recipe-page/use-extract-ingredient-references.ts
@@ -18,8 +18,8 @@ function removeStartingPunctuation(word: string): string {
return word.replace(punctuationAtBeginning, "");
}
-function ingredientMatchesWord(ingredient: RecipeIngredient, word: string, recipeIngredientAmountsDisabled: boolean) {
- const searchText = parseIngredientText(ingredient, recipeIngredientAmountsDisabled);
+function ingredientMatchesWord(ingredient: RecipeIngredient, word: string) {
+ const searchText = parseIngredientText(ingredient);
return searchText.toLowerCase().includes(word.toLowerCase());
}
@@ -39,7 +39,7 @@ function isBlackListedWord(word: string) {
return blackListedText.includes(word) || word.match(blackListedRegexMatch);
}
-export function useExtractIngredientReferences(recipeIngredients: RecipeIngredient[], activeRefs: string[], text: string, recipeIngredientAmountsDisabled: boolean): Set {
+export function useExtractIngredientReferences(recipeIngredients: RecipeIngredient[], activeRefs: string[], text: string): Set {
const availableIngredients = recipeIngredients
.filter(ingredient => ingredient.referenceId !== undefined)
.filter(ingredient => !activeRefs.includes(ingredient.referenceId as string));
@@ -50,7 +50,7 @@ export function useExtractIngredientReferences(recipeIngredients: RecipeIngredie
.map(normalize)
.filter(word => word.length > 2)
.filter(word => !isBlackListedWord(word))
- .flatMap(word => availableIngredients.filter(ingredient => ingredientMatchesWord(ingredient, word, recipeIngredientAmountsDisabled)))
+ .flatMap(word => availableIngredients.filter(ingredient => ingredientMatchesWord(ingredient, word)))
.map(ingredient => ingredient.referenceId as string);
// deduplicate
diff --git a/frontend/composables/recipes/use-recipe-ingredients.test.ts b/frontend/composables/recipes/use-recipe-ingredients.test.ts
index 52eaa3904..398c42da3 100644
--- a/frontend/composables/recipes/use-recipe-ingredients.test.ts
+++ b/frontend/composables/recipes/use-recipe-ingredients.test.ts
@@ -16,33 +16,27 @@ describe(parseIngredientText.name, () => {
...overrides,
});
- test("uses ingredient note if disableAmount: true", () => {
- const ingredient = createRecipeIngredient({ note: "foo" });
-
- expect(parseIngredientText(ingredient, true)).toEqual("foo");
- });
-
test("adds note section if note present", () => {
const ingredient = createRecipeIngredient({ note: "custom note" });
- expect(parseIngredientText(ingredient, false)).toContain("custom note");
+ expect(parseIngredientText(ingredient)).toContain("custom note");
});
test("ingredient text with fraction", () => {
const ingredient = createRecipeIngredient({ quantity: 1.5, unit: { fraction: true, id: "1", name: "cup" } });
- expect(parseIngredientText(ingredient, false, 1, true)).contain("11").and.to.contain("2");
+ expect(parseIngredientText(ingredient, 1, true)).contain("11").and.to.contain("2");
});
test("ingredient text with fraction when unit is null", () => {
const ingredient = createRecipeIngredient({ quantity: 1.5, unit: undefined });
- expect(parseIngredientText(ingredient, false, 1, true)).contain("11").and.to.contain("2");
+ expect(parseIngredientText(ingredient, 1, true)).contain("11").and.to.contain("2");
});
test("ingredient text with fraction no formatting", () => {
const ingredient = createRecipeIngredient({ quantity: 1.5, unit: { fraction: true, id: "1", name: "cup" } });
- const result = parseIngredientText(ingredient, false, 1, false);
+ const result = parseIngredientText(ingredient, 1, false);
expect(result).not.contain("<");
expect(result).not.contain(">");
@@ -52,7 +46,7 @@ describe(parseIngredientText.name, () => {
test("sanitizes html", () => {
const ingredient = createRecipeIngredient({ note: "" });
- expect(parseIngredientText(ingredient, false)).not.toContain("