Compare commits

...

10 Commits

Author SHA1 Message Date
github-actions[bot]
9ec1599427 chore: automatic locale sync (#5705)
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-07-13 14:36:47 +00:00
Kuchenpirat
9cfc54b1f5 fix: user & household creation (#5699) 2025-07-13 13:57:28 +00:00
Hayden
40d2ac9a6b chore(l10n): New Crowdin updates (#5706) 2025-07-13 12:05:51 +02:00
Hayden
44db525049 chore(l10n): New Crowdin updates (#5701) 2025-07-12 21:41:46 +00:00
Kuchenpirat
d737cb3e14 fix: set correct github tag in init py (#5693) 2025-07-12 08:54:14 -05:00
Hayden
1034d87a99 chore(l10n): New Crowdin updates (#5691) 2025-07-12 12:30:57 +02:00
Kuchenpirat
1243e6804c fix: crud table bulk actions (#5686) 2025-07-12 00:47:54 +00:00
Hayden
8b9e80358b chore(l10n): New Crowdin updates (#5682) 2025-07-11 21:18:48 +00:00
github-actions[bot]
2bae6e9d02 docs(auto): Update image tag, for release v3.0.0 (#5675)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-07-11 22:38:46 +02:00
renovate[bot]
6b98a7cd74 fix(deps): update dependency openai to v1.95.0 (#5671)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-11 19:22:03 +02:00
21 changed files with 1614 additions and 1689 deletions

View File

@@ -17,7 +17,7 @@ jobs:
name: Build Package name: Build Package
uses: ./.github/workflows/build-package.yml uses: ./.github/workflows/build-package.yml
with: with:
tag: release tag: ${{ github.event.release.tag_name }}
publish: publish:
permissions: permissions:

View File

@@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do: We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
1. Take a backup just in case! 1. Take a backup just in case!
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v2.8.0` 2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.0.0`
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access. 3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
4. Restart the container 4. Restart the container

View File

@@ -7,7 +7,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
```yaml ```yaml
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v2.8.0 # (3) image: ghcr.io/mealie-recipes/mealie:v3.0.0 # (3)
container_name: mealie container_name: mealie
restart: always restart: always
ports: ports:

View File

@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
```yaml ```yaml
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v2.8.0 # (3) image: ghcr.io/mealie-recipes/mealie:v3.0.0 # (3)
container_name: mealie container_name: mealie
restart: always restart: always
ports: ports:

View File

@@ -42,7 +42,7 @@
color="info" color="info"
variant="elevated" variant="elevated"
:items="bulkActions" :items="bulkActions"
v-bind="bulkActionListener" v-on="bulkActionListener"
/> />
<slot name="button-row" /> <slot name="button-row" />
</v-card-actions> </v-card-actions>
@@ -55,7 +55,7 @@
</div> </div>
<v-data-table <v-data-table
v-model="selected" v-model="selected"
item-key="id" return-object
:headers="activeHeaders" :headers="activeHeaders"
:show-select="bulkActions.length > 0" :show-select="bulkActions.length > 0"
:sort-by="sortBy" :sort-by="sortBy"

View File

@@ -45,28 +45,11 @@ export const useGroupSelf = function () {
export const useGroups = function () { export const useGroups = function () {
const api = useUserApi(); const api = useUserApi();
const loading = ref(false); const loading = ref(false);
const groups = ref<GroupSummary[] | null>(null);
function getAllGroups() { async function getAllGroups() {
loading.value = true; loading.value = true;
const asyncKey = String(Date.now()); const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
const { data: groups } = useAsyncData(asyncKey, async () => {
const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" }); ;
if (data) {
return data.items;
}
else {
return null;
}
});
loading.value = false;
return groups;
}
async function refreshAllGroups() {
loading.value = true;
const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" }); ;
if (data) { if (data) {
groups.value = data.items; groups.value = data.items;
@@ -78,11 +61,15 @@ export const useGroups = function () {
loading.value = false; loading.value = false;
} }
async function refreshAllGroups() {
await getAllGroups();
}
async function deleteGroup(id: string | number) { async function deleteGroup(id: string | number) {
loading.value = true; loading.value = true;
const { data } = await api.groups.deleteOne(id); const { data } = await api.groups.deleteOne(id);
loading.value = false; loading.value = false;
refreshAllGroups(); await refreshAllGroups();
return data; return data;
} }
@@ -93,9 +80,13 @@ export const useGroups = function () {
if (data && groups.value) { if (data && groups.value) {
groups.value.push(data); groups.value.push(data);
} }
loading.value = false;
} }
const groups = getAllGroups(); // Initialize data on first call
if (!groups.value) {
getAllGroups();
}
return { groups, getAllGroups, refreshAllGroups, deleteGroup, createGroup }; return { groups, getAllGroups, refreshAllGroups, deleteGroup, createGroup };
}; };

View File

@@ -48,29 +48,12 @@ export const useHouseholdSelf = function () {
export const useAdminHouseholds = function () { export const useAdminHouseholds = function () {
const api = useAdminApi(); const api = useAdminApi();
const loading = ref(false); const loading = ref(false);
const households = ref<HouseholdInDB[] | null>(null);
function getAllHouseholds() { async function getAllHouseholds() {
loading.value = true; loading.value = true;
const asyncKey = String(Date.now());
const { data: households } = useAsyncData(asyncKey, async () => {
const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" }); const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" });
if (data) {
return data.items;
}
else {
return null;
}
});
loading.value = false;
return households;
}
async function refreshAllHouseholds() {
loading.value = true;
const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" }); ;
if (data) { if (data) {
households.value = data.items; households.value = data.items;
} }
@@ -81,11 +64,15 @@ export const useAdminHouseholds = function () {
loading.value = false; loading.value = false;
} }
async function refreshAllHouseholds() {
await getAllHouseholds();
}
async function deleteHousehold(id: string | number) { async function deleteHousehold(id: string | number) {
loading.value = true; loading.value = true;
const { data } = await api.households.deleteOne(id); const { data } = await api.households.deleteOne(id);
loading.value = false; loading.value = false;
refreshAllHouseholds(); await refreshAllHouseholds();
return data; return data;
} }
@@ -96,9 +83,9 @@ export const useAdminHouseholds = function () {
if (data && households.value) { if (data && households.value) {
households.value.push(data); households.value.push(data);
} }
loading.value = false;
} }
const households = getAllHouseholds();
function useHouseholdsInGroup(groupIdRef: Ref<string>) { function useHouseholdsInGroup(groupIdRef: Ref<string>) {
return computed( return computed(
() => { () => {
@@ -109,6 +96,10 @@ export const useAdminHouseholds = function () {
); );
} }
if (!households.value) {
getAllHouseholds();
}
return { return {
households, households,
useHouseholdsInGroup, useHouseholdsInGroup,

View File

@@ -93,7 +93,7 @@ export const LOCALES = [
{ {
name: "Nederlands (Dutch)", name: "Nederlands (Dutch)",
value: "nl-NL", value: "nl-NL",
progress: 39, progress: 42,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -135,7 +135,7 @@ export const LOCALES = [
{ {
name: "Magyar (Hungarian)", name: "Magyar (Hungarian)",
value: "hu-HU", value: "hu-HU",
progress: 38, progress: 39,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -213,7 +213,7 @@ export const LOCALES = [
{ {
name: "Deutsch (German)", name: "Deutsch (German)",
value: "de-DE", value: "de-DE",
progress: 46, progress: 55,
dir: "ltr", dir: "ltr",
}, },
{ {

View File

@@ -1,47 +1,47 @@
/* eslint-disable @typescript-eslint/no-require-imports */ /* eslint-disable @typescript-eslint/no-require-imports */
const datetimeFormats = { const datetimeFormats = {
// CODE_GEN_ID: DATE_LOCALES // CODE_GEN_ID: DATE_LOCALES
"hu-HU": require("./lang/dateTimeFormats/hu-HU.json"),
"no-NO": require("./lang/dateTimeFormats/no-NO.json"),
"nl-NL": require("./lang/dateTimeFormats/nl-NL.json"),
"pl-PL": require("./lang/dateTimeFormats/pl-PL.json"),
"da-DK": require("./lang/dateTimeFormats/da-DK.json"),
"fr-CA": require("./lang/dateTimeFormats/fr-CA.json"),
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
"it-IT": require("./lang/dateTimeFormats/it-IT.json"),
"sl-SI": require("./lang/dateTimeFormats/sl-SI.json"),
"sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
"ja-JP": require("./lang/dateTimeFormats/ja-JP.json"),
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
"ca-ES": require("./lang/dateTimeFormats/ca-ES.json"),
"tr-TR": require("./lang/dateTimeFormats/tr-TR.json"), "tr-TR": require("./lang/dateTimeFormats/tr-TR.json"),
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
"hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
"pt-BR": require("./lang/dateTimeFormats/pt-BR.json"),
"sk-SK": require("./lang/dateTimeFormats/sk-SK.json"),
"zh-CN": require("./lang/dateTimeFormats/zh-CN.json"), "zh-CN": require("./lang/dateTimeFormats/zh-CN.json"),
"pt-PT": require("./lang/dateTimeFormats/pt-PT.json"), "ja-JP": require("./lang/dateTimeFormats/ja-JP.json"),
"en-GB": require("./lang/dateTimeFormats/en-GB.json"), "en-GB": require("./lang/dateTimeFormats/en-GB.json"),
"ca-ES": require("./lang/dateTimeFormats/ca-ES.json"),
"it-IT": require("./lang/dateTimeFormats/it-IT.json"),
"pl-PL": require("./lang/dateTimeFormats/pl-PL.json"),
"pt-PT": require("./lang/dateTimeFormats/pt-PT.json"),
"ro-RO": require("./lang/dateTimeFormats/ro-RO.json"), "ro-RO": require("./lang/dateTimeFormats/ro-RO.json"),
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"), "sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
"en-US": require("./lang/dateTimeFormats/en-US.json"), "hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
"ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
"bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
"de-DE": require("./lang/dateTimeFormats/de-DE.json"), "de-DE": require("./lang/dateTimeFormats/de-DE.json"),
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
"ru-RU": require("./lang/dateTimeFormats/ru-RU.json"),
"he-IL": require("./lang/dateTimeFormats/he-IL.json"),
"el-GR": require("./lang/dateTimeFormats/el-GR.json"),
"zh-TW": require("./lang/dateTimeFormats/zh-TW.json"), "zh-TW": require("./lang/dateTimeFormats/zh-TW.json"),
"af-ZA": require("./lang/dateTimeFormats/af-ZA.json"), "af-ZA": require("./lang/dateTimeFormats/af-ZA.json"),
"fr-CA": require("./lang/dateTimeFormats/fr-CA.json"),
"he-IL": require("./lang/dateTimeFormats/he-IL.json"),
"pt-BR": require("./lang/dateTimeFormats/pt-BR.json"),
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"),
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
"ru-RU": require("./lang/dateTimeFormats/ru-RU.json"),
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
"sk-SK": require("./lang/dateTimeFormats/sk-SK.json"),
"el-GR": require("./lang/dateTimeFormats/el-GR.json"),
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
"da-DK": require("./lang/dateTimeFormats/da-DK.json"),
"hu-HU": require("./lang/dateTimeFormats/hu-HU.json"),
"es-ES": require("./lang/dateTimeFormats/es-ES.json"), "es-ES": require("./lang/dateTimeFormats/es-ES.json"),
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
"no-NO": require("./lang/dateTimeFormats/no-NO.json"),
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
"en-US": require("./lang/dateTimeFormats/en-US.json"),
"sv-SE": require("./lang/dateTimeFormats/sv-SE.json"), "sv-SE": require("./lang/dateTimeFormats/sv-SE.json"),
"ar-SA": require("./lang/dateTimeFormats/ar-SA.json"), "ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"), "bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
"sl-SI": require("./lang/dateTimeFormats/sl-SI.json"),
"uk-UA": require("./lang/dateTimeFormats/uk-UA.json"), "uk-UA": require("./lang/dateTimeFormats/uk-UA.json"),
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
"ar-SA": require("./lang/dateTimeFormats/ar-SA.json"),
"nl-NL": require("./lang/dateTimeFormats/nl-NL.json"),
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"),
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
// END: DATE_LOCALES // END: DATE_LOCALES
}; };

View File

@@ -599,7 +599,7 @@
"create-recipe-from-an-image": "Créer une recette à partir dune image", "create-recipe-from-an-image": "Créer une recette à partir dune image",
"create-recipe-from-an-image-description": "Créez une recette en téléchargeant une image de celle-ci. Mealie utilisera lIA pour tenter dextraire le texte et de créer une recette.", "create-recipe-from-an-image-description": "Créez une recette en téléchargeant une image de celle-ci. Mealie utilisera lIA pour tenter dextraire le texte et de créer une recette.",
"crop-and-rotate-the-image": "Rogner et pivoter limage pour que seul le texte soit visible, et quil soit dans la bonne orientation.", "crop-and-rotate-the-image": "Rogner et pivoter limage pour que seul le texte soit visible, et quil soit dans la bonne orientation.",
"create-from-images": "Create from Images", "create-from-images": "Créer à partir dimages",
"should-translate-description": "Traduire la recette dans ma langue", "should-translate-description": "Traduire la recette dans ma langue",
"please-wait-image-procesing": "Veuillez patienter, limage est en cours de traitement. Cela peut prendre du temps.", "please-wait-image-procesing": "Veuillez patienter, limage est en cours de traitement. Cela peut prendre du temps.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.", "please-wait-images-processing": "Please wait, the images are processing. This may take some time.",

View File

@@ -288,7 +288,7 @@
"household-group": "Группа домохозяйства", "household-group": "Группа домохозяйства",
"household-management": "Управление домохозяйствами", "household-management": "Управление домохозяйствами",
"manage-households": "Управление Домами", "manage-households": "Управление Домами",
"admin-household-management": "Admin Household Management", "admin-household-management": "Управление Домохозяйством",
"admin-household-management-text": "Изменения в данном домохозяйстве будут отражены немедленно.", "admin-household-management-text": "Изменения в данном домохозяйстве будут отражены немедленно.",
"household-id-value": "Id домохозяйства: {0}", "household-id-value": "Id домохозяйства: {0}",
"private-household": "Частное домохозяйство", "private-household": "Частное домохозяйство",
@@ -298,7 +298,7 @@
"household-recipe-preferences": "Предпочтения для рецептов домашнего хозяйства", "household-recipe-preferences": "Предпочтения для рецептов домашнего хозяйства",
"default-recipe-preferences-description": "Это настройки по умолчанию, когда в вашем домашнем хозяйстве создается новый рецепт. Они могут быть изменены для отдельных рецептов в меню настроек рецепта.", "default-recipe-preferences-description": "Это настройки по умолчанию, когда в вашем домашнем хозяйстве создается новый рецепт. Они могут быть изменены для отдельных рецептов в меню настроек рецепта.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Разрешить пользователям вне вашего домохозяйства видеть ваши рецепты", "allow-users-outside-of-your-household-to-see-your-recipes": "Разрешить пользователям вне вашего домохозяйства видеть ваши рецепты",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link", "allow-users-outside-of-your-household-to-see-your-recipes-description": "При включении данной функции, вы можете делиться публичной ссылкой на данный рецепт, чтобы поделиться им с людьми без аккаунта. Если функция выключена — поделиться рецептом можно только с пользователями внутри вашего домохозяйства или по предварительно сгенерированной приватной ссылке",
"household-preferences": "Параметры домохозяйства" "household-preferences": "Параметры домохозяйства"
}, },
"meal-plan": { "meal-plan": {

View File

@@ -241,48 +241,48 @@ export default defineNuxtConfig({
i18n: { i18n: {
locales: [ locales: [
// CODE_GEN_ID: MESSAGE_LOCALES // CODE_GEN_ID: MESSAGE_LOCALES
{ code: "hu-HU", file: "hu-HU.ts" },
{ code: "no-NO", file: "no-NO.ts" },
{ code: "nl-NL", file: "nl-NL.ts" },
{ code: "pl-PL", file: "pl-PL.ts" },
{ code: "da-DK", file: "da-DK.ts" },
{ code: "fr-CA", file: "fr-CA.ts" },
{ code: "fr-BE", file: "fr-BE.ts" },
{ code: "it-IT", file: "it-IT.ts" },
{ code: "sl-SI", file: "sl-SI.ts" },
{ code: "sr-SP", file: "sr-SP.ts" },
{ code: "is-IS", file: "is-IS.ts" },
{ code: "ja-JP", file: "ja-JP.ts" },
{ code: "fr-FR", file: "fr-FR.ts" },
{ code: "ca-ES", file: "ca-ES.ts" },
{ code: "tr-TR", file: "tr-TR.ts" }, { code: "tr-TR", file: "tr-TR.ts" },
{ code: "fi-FI", file: "fi-FI.ts" },
{ code: "hr-HR", file: "hr-HR.ts" },
{ code: "pt-BR", file: "pt-BR.ts" },
{ code: "sk-SK", file: "sk-SK.ts" },
{ code: "zh-CN", file: "zh-CN.ts" }, { code: "zh-CN", file: "zh-CN.ts" },
{ code: "pt-PT", file: "pt-PT.ts" }, { code: "ja-JP", file: "ja-JP.ts" },
{ code: "en-GB", file: "en-GB.ts" }, { code: "en-GB", file: "en-GB.ts" },
{ code: "ca-ES", file: "ca-ES.ts" },
{ code: "it-IT", file: "it-IT.ts" },
{ code: "pl-PL", file: "pl-PL.ts" },
{ code: "pt-PT", file: "pt-PT.ts" },
{ code: "ro-RO", file: "ro-RO.ts" }, { code: "ro-RO", file: "ro-RO.ts" },
{ code: "cs-CZ", file: "cs-CZ.ts" }, { code: "sr-SP", file: "sr-SP.ts" },
{ code: "et-EE", file: "et-EE.ts" }, { code: "hr-HR", file: "hr-HR.ts" },
{ code: "en-US", file: "en-US.ts" },
{ code: "lv-LV", file: "lv-LV.ts" },
{ code: "ko-KR", file: "ko-KR.ts" },
{ code: "bg-BG", file: "bg-BG.ts" },
{ code: "gl-ES", file: "gl-ES.ts" },
{ code: "de-DE", file: "de-DE.ts" }, { code: "de-DE", file: "de-DE.ts" },
{ code: "lt-LT", file: "lt-LT.ts" },
{ code: "ru-RU", file: "ru-RU.ts" },
{ code: "he-IL", file: "he-IL.ts" },
{ code: "el-GR", file: "el-GR.ts" },
{ code: "zh-TW", file: "zh-TW.ts" }, { code: "zh-TW", file: "zh-TW.ts" },
{ code: "af-ZA", file: "af-ZA.ts" }, { code: "af-ZA", file: "af-ZA.ts" },
{ code: "fr-CA", file: "fr-CA.ts" },
{ code: "he-IL", file: "he-IL.ts" },
{ code: "pt-BR", file: "pt-BR.ts" },
{ code: "cs-CZ", file: "cs-CZ.ts" },
{ code: "fr-FR", file: "fr-FR.ts" },
{ code: "ru-RU", file: "ru-RU.ts" },
{ code: "is-IS", file: "is-IS.ts" },
{ code: "sk-SK", file: "sk-SK.ts" },
{ code: "el-GR", file: "el-GR.ts" },
{ code: "fr-BE", file: "fr-BE.ts" },
{ code: "da-DK", file: "da-DK.ts" },
{ code: "hu-HU", file: "hu-HU.ts" },
{ code: "es-ES", file: "es-ES.ts" }, { code: "es-ES", file: "es-ES.ts" },
{ code: "gl-ES", file: "gl-ES.ts" },
{ code: "no-NO", file: "no-NO.ts" },
{ code: "lt-LT", file: "lt-LT.ts" },
{ code: "en-US", file: "en-US.ts" },
{ code: "sv-SE", file: "sv-SE.ts" }, { code: "sv-SE", file: "sv-SE.ts" },
{ code: "ar-SA", file: "ar-SA.ts" }, { code: "ko-KR", file: "ko-KR.ts" },
{ code: "vi-VN", file: "vi-VN.ts" }, { code: "bg-BG", file: "bg-BG.ts" },
{ code: "sl-SI", file: "sl-SI.ts" },
{ code: "uk-UA", file: "uk-UA.ts" }, { code: "uk-UA", file: "uk-UA.ts" },
{ code: "et-EE", file: "et-EE.ts" },
{ code: "lv-LV", file: "lv-LV.ts" },
{ code: "ar-SA", file: "ar-SA.ts" },
{ code: "nl-NL", file: "nl-NL.ts" },
{ code: "vi-VN", file: "vi-VN.ts" },
{ code: "fi-FI", file: "fi-FI.ts" },
// END: MESSAGE_LOCALES // END: MESSAGE_LOCALES
], ],
strategy: "no_prefix", strategy: "no_prefix",

View File

@@ -1,6 +1,6 @@
{ {
"name": "mealie", "name": "mealie",
"version": "2.8.0", "version": "3.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "nuxt dev", "dev": "nuxt dev",

View File

@@ -14,7 +14,6 @@
:items="groups" :items="groups"
item-title="name" item-title="name"
item-value="id" item-value="id"
:return-object="false"
variant="filled" variant="filled"
:label="$t('household.household-group')" :label="$t('household.household-group')"
:rules="[validators.required]" :rules="[validators.required]"
@@ -94,10 +93,7 @@
icon icon
color="error" color="error"
variant="text" variant="text"
@click.stop=" @click.stop="confirmDialog = true; deleteTarget = item.id"
confirmDialog = true;
deleteTarget = +item.id;
"
> >
<v-icon> <v-icon>
{{ $globals.icons.delete }} {{ $globals.icons.delete }}
@@ -114,7 +110,7 @@
</v-container> </v-container>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { fieldTypes } from "~/composables/forms"; import { fieldTypes } from "~/composables/forms";
import { useGroups } from "~/composables/use-groups"; import { useGroups } from "~/composables/use-groups";
import { useAdminHouseholds } from "~/composables/use-households"; import { useAdminHouseholds } from "~/composables/use-households";
@@ -122,30 +118,28 @@ import { validators } from "~/composables/use-validators";
import type { HouseholdInDB } from "~/lib/api/types/household"; import type { HouseholdInDB } from "~/lib/api/types/household";
import type { VForm } from "~/types/auto-forms"; import type { VForm } from "~/types/auto-forms";
export default defineNuxtComponent({ definePageMeta({
setup() {
definePageMeta({
layout: "admin", layout: "admin",
}); });
const i18n = useI18n(); const i18n = useI18n();
// Set page title useSeoMeta({
useSeoMeta({
title: i18n.t("household.manage-households"), title: i18n.t("household.manage-households"),
}); });
const { groups } = useGroups(); const { groups } = useGroups();
const { households, refreshAllHouseholds, deleteHousehold, createHousehold } = useAdminHouseholds(); const { households, deleteHousehold, createHousehold } = useAdminHouseholds();
const refNewHouseholdForm = ref<VForm | null>(null);
const state = reactive({ const refNewHouseholdForm = ref<VForm | null>(null);
createDialog: false,
confirmDialog: false, const createDialog = ref(false);
loading: false, const confirmDialog = ref(false);
deleteTarget: 0, const deleteTarget = ref<string>("");
search: "", const search = ref("");
headers: [ const updateMode = ref(false);
const headers = [
{ {
title: i18n.t("household.household"), title: i18n.t("household.household"),
align: "start", align: "start",
@@ -157,9 +151,9 @@ export default defineNuxtComponent({
{ title: i18n.t("user.total-users"), value: "users" }, { title: i18n.t("user.total-users"), value: "users" },
{ title: i18n.t("user.webhooks-enabled"), value: "webhookEnable" }, { title: i18n.t("user.webhooks-enabled"), value: "webhookEnable" },
{ title: i18n.t("general.delete"), value: "actions" }, { title: i18n.t("general.delete"), value: "actions" },
], ];
updateMode: false,
createHouseholdForm: { const createHouseholdForm = reactive({
items: [ items: [
{ {
label: i18n.t("household.household-name"), label: i18n.t("household.household-name"),
@@ -172,42 +166,25 @@ export default defineNuxtComponent({
groupId: "", groupId: "",
name: "", name: "",
}, },
}, });
});
function openDialog() { function openDialog() {
state.createDialog = true; createDialog.value = true;
state.createHouseholdForm.data.name = ""; createHouseholdForm.data.name = "";
state.createHouseholdForm.data.groupId = ""; createHouseholdForm.data.groupId = "";
} }
const router = useRouter(); const router = useRouter();
function handleRowClick(item: HouseholdInDB) { function handleRowClick(item: HouseholdInDB) {
router.push(`/admin/manage/households/${item.id}`); router.push(`/admin/manage/households/${item.id}`);
} }
async function handleCreateSubmit() { async function handleCreateSubmit() {
if (!refNewHouseholdForm.value?.validate()) { if (!refNewHouseholdForm.value?.validate()) {
return; return;
} }
createDialog.value = false;
state.createDialog = false; await createHousehold(createHouseholdForm.data);
await createHousehold(state.createHouseholdForm.data); }
}
return {
...toRefs(state),
refNewHouseholdForm,
groups,
households,
validators,
refreshAllHouseholds,
deleteHousehold,
handleCreateSubmit,
openDialog,
handleRowClick,
};
},
});
</script> </script>

View File

@@ -21,26 +21,23 @@
<v-card variant="outlined"> <v-card variant="outlined">
<v-card-text> <v-card-text>
<v-select <v-select
v-if="groups" v-model="selectedGroup"
v-model="selectedGroupId" :items="groups || []"
:items="groups"
item-title="name" item-title="name"
item-value="id" return-object
:return-object="false"
variant="filled" variant="filled"
:label="$t('group.user-group')" :label="$t('group.user-group')"
:rules="[validators.required]" :rules="[validators.required]"
/> />
<v-select <v-select
v-model="newUserData.household" v-model="newUserData.household"
:disabled="!selectedGroupId" :disabled="!selectedGroup"
:items="households" :items="households"
item-title="name" item-title="name"
item-value="name" item-value="name"
:return-object="false"
variant="filled" variant="filled"
:label="$t('household.user-household')" :label="$t('household.user-household')"
:hint="selectedGroupId ? '' : $t('group.you-must-select-a-group-before-selecting-a-household')" :hint="selectedGroup ? '' : $t('group.you-must-select-a-group-before-selecting-a-household')"
persistent-hint persistent-hint
:rules="[validators.required]" :rules="[validators.required]"
/> />
@@ -60,46 +57,33 @@
</v-container> </v-container>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { useAdminApi } from "~/composables/api"; import { useAdminApi } from "~/composables/api";
import { useGroups } from "~/composables/use-groups"; import { useGroups } from "~/composables/use-groups";
import { useAdminHouseholds } from "~/composables/use-households";
import { useUserForm } from "~/composables/use-users"; import { useUserForm } from "~/composables/use-users";
import { validators } from "~/composables/use-validators"; import { validators } from "~/composables/use-validators";
import type { UserIn } from "~/lib/api/types/user"; import type { GroupInDB, UserIn } from "~/lib/api/types/user";
import type { VForm } from "~/types/auto-forms"; import type { VForm } from "~/types/auto-forms";
export default defineNuxtComponent({ definePageMeta({
setup() {
definePageMeta({
layout: "admin", layout: "admin",
}); });
const { userForm } = useUserForm();
const { groups } = useGroups();
const router = useRouter();
const { userForm } = useUserForm(); const refNewUserForm = ref<VForm | null>(null);
const { groups } = useGroups(); const adminApi = useAdminApi();
const { useHouseholdsInGroup } = useAdminHouseholds();
const router = useRouter();
// ============================================== const selectedGroup = ref<GroupInDB | undefined>(undefined);
// New User Form const households = computed(() => selectedGroup.value?.households || []);
const refNewUserForm = ref<VForm | null>(null); const newUserData = ref({
const adminApi = useAdminApi();
const selectedGroupId = ref<string>("");
const households = useHouseholdsInGroup(selectedGroupId);
const selectedGroup = computed(() => {
return groups.value?.find(group => group.id === selectedGroupId.value);
});
const state = reactive({
newUserData: {
username: "", username: "",
fullName: "", fullName: "",
email: "", email: "",
admin: false, admin: false,
group: selectedGroup.value?.name || "", group: computed(() => selectedGroup.value?.name || ""),
household: "", household: "",
advanced: false, advanced: false,
canInvite: false, canInvite: false,
@@ -107,35 +91,17 @@ export default defineNuxtComponent({
canOrganize: false, canOrganize: false,
password: "", password: "",
authMethod: "Mealie", authMethod: "Mealie",
}, });
});
watch(selectedGroup, (newGroup) => {
state.newUserData.group = newGroup?.name || "";
state.newUserData.household = "";
});
async function handleSubmit() { async function handleSubmit() {
if (!refNewUserForm.value?.validate()) return; if (!refNewUserForm.value?.validate()) return;
const { response } = await adminApi.users.createOne(state.newUserData as UserIn); const { response } = await adminApi.users.createOne(newUserData.value as UserIn);
if (response?.status === 201) { if (response?.status === 201) {
router.push("/admin/manage/users"); router.push("/admin/manage/users");
} }
} }
return {
...toRefs(state),
userForm,
refNewUserForm,
handleSubmit,
groups,
selectedGroupId,
households,
validators,
};
},
});
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

File diff suppressed because it is too large Load Diff

View File

@@ -4,31 +4,31 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "fokhagyma",
"plural_name": "garlics" "plural_name": "fokhagyma"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "hagyma",
"plural_name": "onions" "plural_name": "hagyma"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "kaliforniai paprika",
"plural_name": "bell peppers" "plural_name": "kaliforniai paprika"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "sárgarépa",
"plural_name": "carrots" "plural_name": "sárgarépa"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "újhagyma",
"plural_name": "zöldhagyma" "plural_name": "zöldhagyma"
}, },
"zucchini": { "zucchini": {
@@ -52,8 +52,8 @@
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yellow onion", "name": "vöröshagyma",
"plural_name": "yellow onions" "plural_name": "vöröshagyma"
}, },
"celery": { "celery": {
"aliases": [], "aliases": [],
@@ -82,8 +82,8 @@
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry tomato", "name": "koktélparadicsom",
"plural_name": "cherry tomatoes" "plural_name": "koktélparadicsom"
}, },
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
@@ -105,11 +105,11 @@
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
"capsicum" "kaliforniai paprika"
], ],
"description": "", "description": "",
"name": "chile pepper", "name": "chili paprika",
"plural_name": "chile peppers" "plural_name": "chili paprika"
}, },
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
@@ -126,20 +126,20 @@
"heart of palm": { "heart of palm": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "heart of palm", "name": "pálmarügy",
"plural_name": "heart of palms" "plural_name": "pálmarügy"
}, },
"baby green": { "baby green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby green", "name": "salátakeverék",
"plural_name": "baby greens" "plural_name": "salátakeverék"
}, },
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin", "name": "sütőtök",
"plural_name": "pumpkins" "plural_name": "sütőtök"
}, },
"cauliflower": { "cauliflower": {
"aliases": [], "aliases": [],
@@ -151,258 +151,258 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "káposzta", "name": "káposzta",
"plural_name": "cabbages" "plural_name": "fejes káposzta"
}, },
"asparagu": { "asparagu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asparagu", "name": "spárga",
"plural_name": "asparagus" "plural_name": "spárga"
}, },
"kale": { "kale": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kale", "name": "kelkáposzta",
"plural_name": "kales" "plural_name": "kelkáposzta"
}, },
"arugula": { "arugula": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arugula", "name": "rukkola",
"plural_name": "arugulas" "plural_name": "rukkola"
}, },
"leek": { "leek": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leek", "name": "póréhagyma",
"plural_name": "leeks" "plural_name": "póréhagyma"
}, },
"eggplant": { "eggplant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "eggplant", "name": "padlizsán",
"plural_name": "eggplants" "plural_name": "padlizsán"
}, },
"lettuce": { "lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lettuce", "name": "saláta",
"plural_name": "lettuces" "plural_name": "saláta"
}, },
"butternut squash": { "butternut squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butternut squash", "name": "kanadai sütőtök",
"plural_name": "butternut squashes" "plural_name": "kanadai sütőtök"
}, },
"romaine": { "romaine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "romaine", "name": "római saláta",
"plural_name": "romaines" "plural_name": "római saláta"
}, },
"beetroot": { "beetroot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "beetroot", "name": "cékla",
"plural_name": "beetroots" "plural_name": "cékla"
}, },
"brussels sprout": { "brussels sprout": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "brussels sprout", "name": "kelbimbó",
"plural_name": "brussels sprouts" "plural_name": "kelbimbó"
}, },
"fennel": { "fennel": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fennel", "name": "édeskömény",
"plural_name": "fennels" "plural_name": "édeskömény"
}, },
"sun dried tomato": { "sun dried tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sun dried tomato", "name": "szárított paradicsom",
"plural_name": "sun dried tomatoes" "plural_name": "szárított paradicsom"
}, },
"radish": { "radish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radish", "name": "retek",
"plural_name": "radishes" "plural_name": "retkek"
}, },
"red cabbage": { "red cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red cabbage", "name": "vöröskáposzta",
"plural_name": "red cabbages" "plural_name": "vöröskáposzta"
}, },
"artichoke": { "artichoke": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "artichoke", "name": "articsóka",
"plural_name": "artichokes" "plural_name": "articsóka"
}, },
"new potato": { "new potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "new potato", "name": "újburgonya",
"plural_name": "new potatoes" "plural_name": "újburgonya"
}, },
"summer squash": { "summer squash": {
"aliases": [ "aliases": [
"courgette", "cukkini",
"gem squash" "kis tök"
], ],
"description": "", "description": "",
"name": "summer squash", "name": "főzőtök",
"plural_name": "summer squashes" "plural_name": "főzőtök"
}, },
"mixed green": { "mixed green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed green", "name": "salátakeverék",
"plural_name": "mixed greens" "plural_name": "salátakeverék"
}, },
"parsnip": { "parsnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "parsnip", "name": "paszternák",
"plural_name": "parsnips" "plural_name": "paszternák"
}, },
"baby carrot": { "baby carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby carrot", "name": "bébirépa",
"plural_name": "baby carrots" "plural_name": "bébirépa"
}, },
"mixed vegetable": { "mixed vegetable": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed vegetable", "name": "zöldségkeverék",
"plural_name": "mixed vegetables" "plural_name": "zöldségkeverék"
}, },
"poblano pepper": { "poblano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "poblano pepper", "name": "poblano paprika",
"plural_name": "poblano peppers" "plural_name": "poblano paprika"
}, },
"sweet pepper": { "sweet pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet pepper", "name": "édes paprika",
"plural_name": "sweet peppers" "plural_name": "édes paprika"
}, },
"serrano pepper": { "serrano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "serrano pepper", "name": "serrano paprika",
"plural_name": "serrano peppers" "plural_name": "serrano paprika"
}, },
"cayenne pepper": { "cayenne pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cayenne pepper", "name": "cayenne bors",
"plural_name": "cayenne peppers" "plural_name": "cayenne bors"
}, },
"green tomato": { "green tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green tomato", "name": "zöld paradicsom",
"plural_name": "green tomatoes" "plural_name": "zöld paradicsom"
}, },
"watercress": { "watercress": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watercress", "name": "vízitorma",
"plural_name": "watercress" "plural_name": "vízitorma"
}, },
"iceberg": { "iceberg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "iceberg", "name": "jégsaláta",
"plural_name": "icebergs" "plural_name": "jégsaláta"
}, },
"mashed potato": { "mashed potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mashed potato", "name": "burgonyapüré",
"plural_name": "mashed potatoes" "plural_name": "burgonyapüré"
}, },
"horseradish": { "horseradish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "horseradish", "name": "torma",
"plural_name": "horseradishes" "plural_name": "torma"
}, },
"chard": { "chard": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chard", "name": "mángold",
"plural_name": "chards" "plural_name": "mángold"
}, },
"pimiento": { "pimiento": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pimiento", "name": "kápia paprika",
"plural_name": "pimientoes" "plural_name": "kápia paprika"
}, },
"spaghetti squash": { "spaghetti squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spaghetti squash", "name": "spagettitök",
"plural_name": "spaghetti squashes" "plural_name": "spagettitök"
}, },
"butter lettuce": { "butter lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butter lettuce", "name": "fejes saláta",
"plural_name": "butter lettuces" "plural_name": "fejes saláta"
}, },
"hash brown": { "hash brown": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hash brown", "name": "tócsni",
"plural_name": "hash browns" "plural_name": "tócsni"
}, },
"napa cabbage": { "napa cabbage": {
"aliases": [ "aliases": [
"chinese leaves" "kínai kel"
], ],
"description": "", "description": "",
"name": "napa cabbage", "name": "kínai kel",
"plural_name": "napa cabbages" "plural_name": "kínai kel"
}, },
"celeriac": { "celeriac": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celeriac", "name": "zeller",
"plural_name": "celeriacs" "plural_name": "zeller"
}, },
"water chestnut": { "water chestnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "water chestnut", "name": "vízigesztenye",
"plural_name": "water chestnuts" "plural_name": "vízigesztenye"
}, },
"turnip": { "turnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turnip", "name": "tarlórépa",
"plural_name": "turnips" "plural_name": "tarlórépa"
}, },
"thai chile pepper": { "thai chile pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "thai chile pepper", "name": "thai csili paprika",
"plural_name": "thai chile peppers" "plural_name": "thai csili paprika"
}, },
"bok choy": { "bok choy": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bok choy", "name": "bordáskel",
"plural_name": "bok choy" "plural_name": "bordáskel"
}, },
"okra": { "okra": {
"aliases": [], "aliases": [],
@@ -413,44 +413,44 @@
"acorn squash": { "acorn squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "acorn squash", "name": "makktök",
"plural_name": "acorn squashes" "plural_name": "makktök"
}, },
"corn cob": { "corn cob": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "corn cob", "name": "kukoricacső",
"plural_name": "corn cobs" "plural_name": "kukoricacső"
}, },
"radicchio": { "radicchio": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radicchio", "name": "vörös cikória",
"plural_name": "radicchio" "plural_name": "vörös cikória"
}, },
"pearl onion": { "pearl onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pearl onion", "name": "gyöngyhagyma",
"plural_name": "pearl onions" "plural_name": "gyöngyhagyma"
}, },
"tenderstem broccoli": { "tenderstem broccoli": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "tenderstem broccoli", "name": "brokkolini",
"plural_name": "tenderstem broccolis" "plural_name": "brokkolini"
}, },
"plantain": { "plantain": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "plantain", "name": "főzőbanán",
"plural_name": "plantains" "plural_name": "főzőbanán"
}, },
"leaf lettuce": { "leaf lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leaf lettuce", "name": "saláta",
"plural_name": "leaf lettuces" "plural_name": "saláta"
}, },
"pepperoncini": { "pepperoncini": {
"aliases": [], "aliases": [],
@@ -602,25 +602,25 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arbol chile pepper", "name": "arbol chile pepper",
"plural_name": "arbol chile peppers" "plural_name": "arbol csili paprika"
}, },
"golden beet": { "golden beet": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "golden beet", "name": "sárga cékla",
"plural_name": "golden beets" "plural_name": "sárga cékla"
}, },
"pea shoot": { "pea shoot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pea shoot", "name": "borsócsíra",
"plural_name": "pea shoots" "plural_name": "borsócsíra"
}, },
"alfalfa": { "alfalfa": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "alfalfa", "name": "lucernacsíra",
"plural_name": "alfalfas" "plural_name": "lucernacsíra"
} }
} }
}, },
@@ -628,129 +628,129 @@
"foods": { "foods": {
"tomato": { "tomato": {
"aliases": [], "aliases": [],
"description": "Yes they are a fruit", "description": "Igen, gyümölcs",
"name": "tomato", "name": "paradicsom",
"plural_name": "tomatoes" "plural_name": "paradicsom"
}, },
"lemon": { "lemon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lemon", "name": "citrom",
"plural_name": "lemons" "plural_name": "citrom"
}, },
"lime": { "lime": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lime", "name": "zöldcitrom",
"plural_name": "limes" "plural_name": "zöldcitrom"
}, },
"apple": { "apple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apple", "name": "alma",
"plural_name": "apples" "plural_name": "alma"
}, },
"banana": { "banana": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "banana", "name": "banán",
"plural_name": "bananas" "plural_name": "banán"
}, },
"orange": { "orange": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "orange", "name": "narancs",
"plural_name": "oranges" "plural_name": "narancs"
}, },
"raisin": { "raisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "raisin", "name": "mazsola",
"plural_name": "raisins" "plural_name": "mazsola"
}, },
"pineapple": { "pineapple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pineapple", "name": "ananász",
"plural_name": "pineapples" "plural_name": "ananász"
}, },
"mango": { "mango": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mango", "name": "mangó",
"plural_name": "mangoes" "plural_name": "mangó"
}, },
"peach": { "peach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "peach", "name": "őszibarack",
"plural_name": "peaches" "plural_name": "őszibarack"
}, },
"date": { "date": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "date", "name": "datolya",
"plural_name": "dates" "plural_name": "datolya"
}, },
"coconut": { "coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut", "name": "kókuszdió",
"plural_name": "coconuts" "plural_name": "kókuszdió"
}, },
"craisin": { "craisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "craisin", "name": "aszalt vörösáfonya",
"plural_name": "craisins" "plural_name": "aszalt vörösáfonya"
}, },
"pear": { "pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pear", "name": "körte",
"plural_name": "pears" "plural_name": "körte"
}, },
"grape": { "grape": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grape", "name": "szőlő",
"plural_name": "grapes" "plural_name": "szőlő"
}, },
"pomegranate": { "pomegranate": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pomegranate", "name": "gránátalma",
"plural_name": "pomegranates" "plural_name": "gránátalma"
}, },
"watermelon": { "watermelon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watermelon", "name": "görögdinnye",
"plural_name": "watermelons" "plural_name": "görögdinnye"
}, },
"rhubarb": { "rhubarb": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rhubarb", "name": "rebarbara",
"plural_name": "rhubarbs" "plural_name": "rebarbara"
}, },
"dried apricot": { "dried apricot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried apricot", "name": "aszalt sárgabarack",
"plural_name": "dried apricots" "plural_name": "aszalt sárgabarack"
}, },
"kiwi": { "kiwi": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kiwi", "name": "kivi",
"plural_name": "kiwis" "plural_name": "kivi"
}, },
"grapefruit": { "grapefruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grapefruit", "name": "grapefruit",
"plural_name": "grapefruits" "plural_name": "grapefruit"
}, },
"plum": { "plum": {
"aliases": [], "aliases": [],
@@ -905,86 +905,86 @@
"banana chip": { "banana chip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "banana chip", "name": "banánchips",
"plural_name": "banana chips" "plural_name": "banánchips"
}, },
"kumquat": { "kumquat": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kumquat", "name": "törpemandarin",
"plural_name": "kumquats" "plural_name": "törpemandarin"
}, },
"jackfruit": { "jackfruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jackfruit", "name": "jackfruit",
"plural_name": "jackfruits" "plural_name": "jackfruit"
}, },
"dragon fruit": { "dragon fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dragon fruit", "name": "sárkánygyümölcs",
"plural_name": "dragon fruits" "plural_name": "sárkánygyümölcs"
}, },
"mixed fruit": { "mixed fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed fruit", "name": "vegyes gyümölcs",
"plural_name": "mixed fruits" "plural_name": "vegyes gyümölcs"
}, },
"asian pear": { "asian pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asian pear", "name": "japán körte",
"plural_name": "asian pears" "plural_name": "japán körte"
}, },
"lychee": { "lychee": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lychee", "name": "licsi",
"plural_name": "lychees" "plural_name": "licsi"
}, },
"young coconut": { "young coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "young coconut", "name": "zsenge kókuszdió",
"plural_name": "young coconuts" "plural_name": "zsenge kókuszdió"
}, },
"kaffir lime": { "kaffir lime": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kaffir lime", "name": "kaffir lime",
"plural_name": "kaffir limes" "plural_name": "kaffir lime"
}, },
"star fruit": { "star fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "star fruit", "name": "csillaggyümölcs",
"plural_name": "star fruits" "plural_name": "csillaggyümölcs"
}, },
"green papaya": { "green papaya": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green papaya", "name": "zöld papaya",
"plural_name": "green papayas" "plural_name": "zöld papaya"
}, },
"pomelo": { "pomelo": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pomelo", "name": "pomelo",
"plural_name": "pomeloes" "plural_name": "pomelo"
}, },
"chestnut puree": { "chestnut puree": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chestnut puree", "name": "gesztenyepüré",
"plural_name": "chestnut purees" "plural_name": "gesztenyepüré"
}, },
"prickly pear": { "prickly pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "prickly pear", "name": "kaktuszfüge",
"plural_name": "prickly pears" "plural_name": "kaktuszfüge"
}, },
"calamansi": { "calamansi": {
"aliases": [], "aliases": [],

File diff suppressed because it is too large Load Diff

View File

@@ -34,7 +34,7 @@
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zucchini", "name": "цукини",
"plural_name": "zucchinis" "plural_name": "zucchinis"
}, },
"potato": { "potato": {

6
poetry.lock generated
View File

@@ -1816,14 +1816,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]] [[package]]
name = "openai" name = "openai"
version = "1.94.0" version = "1.95.0"
description = "The official Python library for the openai API" description = "The official Python library for the openai API"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "openai-1.94.0-py3-none-any.whl", hash = "sha256:159c43b811669abe9bb4aafdc57a049966dfde2eac94b151aac3eb63bf9825b4"}, {file = "openai-1.95.0-py3-none-any.whl", hash = "sha256:a7afc9dca7e7d616371842af8ea6dbfbcb739a85d183f5f664ab1cc311b9ef18"},
{file = "openai-1.94.0.tar.gz", hash = "sha256:31c6c213cc80365d54632296c4aef7cda1800003ca5c784ac50a05d6bc05c197"}, {file = "openai-1.95.0.tar.gz", hash = "sha256:54bc42df9f7142312647dd485d34cca5df20af825fa64a30ca55164be2cf4cc9"},
] ]
[package.dependencies] [package.dependencies]

View File

@@ -3,7 +3,7 @@ authors = ["Hayden <hay-kot@pm.me>"]
description = "A Recipe Manager" description = "A Recipe Manager"
license = "AGPL" license = "AGPL"
name = "mealie" name = "mealie"
version = "2.8.0" version = "3.0.0"
include = [ include = [
# Explicit include to override .gitignore when packaging the frontend # Explicit include to override .gitignore when packaging the frontend
{ path = "mealie/frontend/**/*", format = ["sdist", "wheel"] } { path = "mealie/frontend/**/*", format = ["sdist", "wheel"] }