diff --git a/vue3/src/components/buttons/BtnCopy.vue b/vue3/src/components/buttons/BtnCopy.vue
index b3b88c474..532502590 100644
--- a/vue3/src/components/buttons/BtnCopy.vue
+++ b/vue3/src/components/buttons/BtnCopy.vue
@@ -1,11 +1,13 @@
-
-
+
- Copied!
-
+
+
+ {{$t('Copied')}}!
+
+
diff --git a/vue3/src/components/dialogs/ShoppingExportDialog.vue b/vue3/src/components/dialogs/ShoppingExportDialog.vue
new file mode 100644
index 000000000..5a2f8cebe
--- /dev/null
+++ b/vue3/src/components/dialogs/ShoppingExportDialog.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('Download') }}
+ {{ $t('Copy') }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vue3/src/components/display/ShoppingListView.vue b/vue3/src/components/display/ShoppingListView.vue
index 3888a51cb..4453087a5 100644
--- a/vue3/src/components/display/ShoppingListView.vue
+++ b/vue3/src/components/display/ShoppingListView.vue
@@ -55,7 +55,7 @@
-
+
@@ -65,6 +65,11 @@
+
+
+
+
+
@@ -96,14 +101,14 @@
-
+
{{ $t('NoCategory') }}
{{ category.name }}
-
+
@@ -166,14 +171,14 @@
-
+
{{ r.servings }}
{updateRecipeServings(r, servings)}"
>
-
+
@@ -207,7 +212,7 @@
(useUserPreferenceStore().deviceSettings.shopping_selected_supermarket = args)">
+ @save="(args: Supermarket) => (useUserPreferenceStore().deviceSettings.shopping_selected_supermarket = args)">
@@ -237,6 +242,8 @@ import {DateTime} from "luxon";
import MealPlanEditor from "@/components/model_editors/MealPlanEditor.vue";
import ModelEditDialog from "@/components/dialogs/ModelEditDialog.vue";
import {onBeforeRouteLeave} from "vue-router";
+import {isShoppingCategoryVisible} from "@/utils/logic_utils.ts";
+import ShoppingExportDialog from "@/components/dialogs/ShoppingExportDialog.vue";
const {t} = useI18n()
@@ -274,22 +281,6 @@ onMounted(() => {
}
})
-/**
- * determines if a category as entries that should be visible
- * @param category
- */
-function isCategoryVisible(category: IShoppingListCategory) {
- let entryCount = category.stats.countUnchecked
-
- if (useUserPreferenceStore().deviceSettings.shopping_show_checked_entries) {
- entryCount += category.stats.countChecked
- }
- if (useUserPreferenceStore().deviceSettings.shopping_show_delayed_entries) {
- entryCount += category.stats.countUncheckedDelayed
- }
- return entryCount > 0
-}
-
/**
* update the number of servings for an embedded recipe and with it the ShoppingListEntry amounts
* @param recipe ShoppingListRecipe to update
diff --git a/vue3/src/locales/ar.json b/vue3/src/locales/ar.json
index 6cc2e09bd..55652b22c 100644
--- a/vue3/src/locales/ar.json
+++ b/vue3/src/locales/ar.json
@@ -61,6 +61,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "",
"Copy Link": "",
"Copy Token": "",
diff --git a/vue3/src/locales/bg.json b/vue3/src/locales/bg.json
index d9f872189..e2875547a 100644
--- a/vue3/src/locales/bg.json
+++ b/vue3/src/locales/bg.json
@@ -61,6 +61,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Копиране",
"Copy_template_reference": "Копирайте препратка към шаблона",
"CountMore": "...+{count} още",
diff --git a/vue3/src/locales/ca.json b/vue3/src/locales/ca.json
index 2bf626ed5..dbce49685 100644
--- a/vue3/src/locales/ca.json
+++ b/vue3/src/locales/ca.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "",
"Copy Link": "",
"Copy Token": "",
diff --git a/vue3/src/locales/cs.json b/vue3/src/locales/cs.json
index 9a2143a6a..065f601d1 100644
--- a/vue3/src/locales/cs.json
+++ b/vue3/src/locales/cs.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopírovat",
"Copy Link": "Kopírovat odkaz",
"Copy Token": "Kopírovat token",
diff --git a/vue3/src/locales/da.json b/vue3/src/locales/da.json
index 9c0e71f84..f303f8421 100644
--- a/vue3/src/locales/da.json
+++ b/vue3/src/locales/da.json
@@ -73,6 +73,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopier",
"Copy Link": "Kopier link",
"Copy Token": "Kopier token",
diff --git a/vue3/src/locales/de.json b/vue3/src/locales/de.json
index b5ab67f2c..93b4ea7cf 100644
--- a/vue3/src/locales/de.json
+++ b/vue3/src/locales/de.json
@@ -76,6 +76,7 @@
"ConversionsHelp": "Mit Umrechnungen kann die Menge einens Lebensmittels in verschiedenen Einheiten ausgerechnet werden. Aktuell wird dies nur zur berechnung von Eigenschaften verwendet, später jedoch sollen auch andere Funktionen von Tandoor davon profitieren.",
"CookLog": "Kochprotokoll",
"Cooked": "Gekocht",
+ "Copied": "Kopiert",
"Copy": "Kopieren",
"Copy Link": "Link Kopieren",
"Copy Token": "Kopiere Token",
diff --git a/vue3/src/locales/el.json b/vue3/src/locales/el.json
index e97f525a6..6c0ee1f59 100644
--- a/vue3/src/locales/el.json
+++ b/vue3/src/locales/el.json
@@ -72,6 +72,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Αντιγραφή",
"Copy Link": "Αντιγραφή συνδέσμου",
"Copy Token": "Αντιγραφή token",
diff --git a/vue3/src/locales/en.json b/vue3/src/locales/en.json
index 7396df866..90e45b935 100644
--- a/vue3/src/locales/en.json
+++ b/vue3/src/locales/en.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "With conversions you can calculate the amount of a food in different units. Currently this is only used for property calculation, later it might also be used in other parts of tandoor. ",
"CookLog": "Cook Log",
"Cooked": "Cooked",
+ "Copied": "Copied",
"Copy": "Copy",
"Copy Link": "Copy Link",
"Copy Token": "Copy Token",
diff --git a/vue3/src/locales/es.json b/vue3/src/locales/es.json
index 3fa35815e..df7235aaf 100644
--- a/vue3/src/locales/es.json
+++ b/vue3/src/locales/es.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Copiar",
"Copy Link": "Copiar Enlace",
"Copy Token": "Copiar Token",
diff --git a/vue3/src/locales/fi.json b/vue3/src/locales/fi.json
index fe422bd11..30eb69f84 100644
--- a/vue3/src/locales/fi.json
+++ b/vue3/src/locales/fi.json
@@ -47,6 +47,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopioi",
"Copy_template_reference": "Kopioi malliviittaus",
"Create": "Luo",
diff --git a/vue3/src/locales/fr.json b/vue3/src/locales/fr.json
index 5b97f56a4..4ee9db9d5 100644
--- a/vue3/src/locales/fr.json
+++ b/vue3/src/locales/fr.json
@@ -73,6 +73,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Copier",
"Copy Link": "Copier le lien",
"Copy Token": "Copier le jeton",
diff --git a/vue3/src/locales/he.json b/vue3/src/locales/he.json
index 811ac84c0..8ac803b7b 100644
--- a/vue3/src/locales/he.json
+++ b/vue3/src/locales/he.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "העתקה",
"Copy Link": "העתק קישור",
"Copy Token": "העתק טוקן",
diff --git a/vue3/src/locales/hu.json b/vue3/src/locales/hu.json
index 85ea05caf..9807cd60c 100644
--- a/vue3/src/locales/hu.json
+++ b/vue3/src/locales/hu.json
@@ -73,6 +73,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Másolás",
"Copy Link": "Link másolása",
"Copy Token": "Token másolása",
diff --git a/vue3/src/locales/hy.json b/vue3/src/locales/hy.json
index e4fffa1ab..67ae4f001 100644
--- a/vue3/src/locales/hy.json
+++ b/vue3/src/locales/hy.json
@@ -39,6 +39,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "",
"Create": "Ստեղծել",
"Create_New_Food": "Ավելացնել նոր սննդամթերք",
diff --git a/vue3/src/locales/id.json b/vue3/src/locales/id.json
index abb8f62b6..050c9ac1e 100644
--- a/vue3/src/locales/id.json
+++ b/vue3/src/locales/id.json
@@ -65,6 +65,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Salin",
"Copy Link": "Salin Tautan",
"Copy Token": "Salin Token",
diff --git a/vue3/src/locales/is.json b/vue3/src/locales/is.json
index 67156ba07..f7396c020 100644
--- a/vue3/src/locales/is.json
+++ b/vue3/src/locales/is.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "",
"Copy Link": "",
"Copy Token": "",
diff --git a/vue3/src/locales/it.json b/vue3/src/locales/it.json
index 7de62e8ac..d346ddba3 100644
--- a/vue3/src/locales/it.json
+++ b/vue3/src/locales/it.json
@@ -69,6 +69,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Copia",
"Copy Link": "Copia link",
"Copy Token": "Copia token",
diff --git a/vue3/src/locales/lt.json b/vue3/src/locales/lt.json
index 9c9e47af4..0df25059a 100644
--- a/vue3/src/locales/lt.json
+++ b/vue3/src/locales/lt.json
@@ -73,6 +73,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "",
"Copy Link": "",
"Copy Token": "",
diff --git a/vue3/src/locales/nb_NO.json b/vue3/src/locales/nb_NO.json
index aa51a8236..33635ce30 100644
--- a/vue3/src/locales/nb_NO.json
+++ b/vue3/src/locales/nb_NO.json
@@ -71,6 +71,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopier",
"Copy Link": "Kopier lenke",
"Copy Token": "Kopier Token",
diff --git a/vue3/src/locales/nl.json b/vue3/src/locales/nl.json
index 9d0d28556..65b4f04a5 100644
--- a/vue3/src/locales/nl.json
+++ b/vue3/src/locales/nl.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopie",
"Copy Link": "Kopieer Link",
"Copy Token": "Kopieer Token",
diff --git a/vue3/src/locales/pl.json b/vue3/src/locales/pl.json
index 121fb447c..0074ba2bf 100644
--- a/vue3/src/locales/pl.json
+++ b/vue3/src/locales/pl.json
@@ -75,6 +75,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopiuj",
"Copy Link": "Skopiuj link",
"Copy Token": "Kopiuj Token",
diff --git a/vue3/src/locales/pt.json b/vue3/src/locales/pt.json
index 25e13afe0..3dc12db88 100644
--- a/vue3/src/locales/pt.json
+++ b/vue3/src/locales/pt.json
@@ -60,6 +60,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Copiar",
"Copy Link": "Copiar Ligação",
"Copy Token": "Copiar Chave",
diff --git a/vue3/src/locales/pt_BR.json b/vue3/src/locales/pt_BR.json
index 96324f268..7b21ebb6a 100644
--- a/vue3/src/locales/pt_BR.json
+++ b/vue3/src/locales/pt_BR.json
@@ -73,6 +73,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Copiar",
"Copy Link": "Copiar Link",
"Copy Token": "Copiar Token",
diff --git a/vue3/src/locales/ro.json b/vue3/src/locales/ro.json
index a2c37f9e6..f20af3fc5 100644
--- a/vue3/src/locales/ro.json
+++ b/vue3/src/locales/ro.json
@@ -70,6 +70,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Copie",
"Copy Link": "Copiere link",
"Copy Token": "Copiere token",
diff --git a/vue3/src/locales/ru.json b/vue3/src/locales/ru.json
index 20de89e1c..8d2cc6044 100644
--- a/vue3/src/locales/ru.json
+++ b/vue3/src/locales/ru.json
@@ -55,6 +55,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Копировать",
"Copy_template_reference": "Скопировать ссылку на шаблон",
"CountMore": "...+{count} больше",
diff --git a/vue3/src/locales/sl.json b/vue3/src/locales/sl.json
index 1f9680998..f4502a920 100644
--- a/vue3/src/locales/sl.json
+++ b/vue3/src/locales/sl.json
@@ -56,6 +56,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopiraj",
"Copy_template_reference": "Kopiraj referenco vzorca",
"CountMore": "...+{count} več",
diff --git a/vue3/src/locales/sv.json b/vue3/src/locales/sv.json
index f9c2f2893..a6ce3de0c 100644
--- a/vue3/src/locales/sv.json
+++ b/vue3/src/locales/sv.json
@@ -75,6 +75,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopiera",
"Copy Link": "Kopiera Länk",
"Copy Token": "Kopiera token",
diff --git a/vue3/src/locales/tr.json b/vue3/src/locales/tr.json
index 547a62278..f325e02cd 100644
--- a/vue3/src/locales/tr.json
+++ b/vue3/src/locales/tr.json
@@ -74,6 +74,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Kopyala",
"Copy Link": "Bağlantıyı Kopyala",
"Copy Token": "Anahtarı Kopyala",
diff --git a/vue3/src/locales/uk.json b/vue3/src/locales/uk.json
index d6cc97547..f20dbce33 100644
--- a/vue3/src/locales/uk.json
+++ b/vue3/src/locales/uk.json
@@ -64,6 +64,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "Копіювати",
"Copy Link": "Скопіювати Посилання",
"Copy Token": "Скопіювати Токен",
diff --git a/vue3/src/locales/zh_Hans.json b/vue3/src/locales/zh_Hans.json
index 22045007b..2af19d5dc 100644
--- a/vue3/src/locales/zh_Hans.json
+++ b/vue3/src/locales/zh_Hans.json
@@ -73,6 +73,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "复制",
"Copy Link": "复制链接",
"Copy Token": "复制令牌",
diff --git a/vue3/src/locales/zh_Hant.json b/vue3/src/locales/zh_Hant.json
index d3e638d2e..5d7fe55a3 100644
--- a/vue3/src/locales/zh_Hant.json
+++ b/vue3/src/locales/zh_Hant.json
@@ -36,6 +36,7 @@
"ConversionsHelp": "",
"CookLog": "",
"Cooked": "",
+ "Copied": "",
"Copy": "",
"Copy_template_reference": "複製參考模板",
"Create": "",
diff --git a/vue3/src/pages/RecipeImportPage.vue b/vue3/src/pages/RecipeImportPage.vue
index d5bc62e85..dcfe1a72f 100644
--- a/vue3/src/pages/RecipeImportPage.vue
+++ b/vue3/src/pages/RecipeImportPage.vue
@@ -294,7 +294,7 @@
-
+
{{ i.amount }}
diff --git a/vue3/src/utils/logic_utils.ts b/vue3/src/utils/logic_utils.ts
index 908f554fa..f437a1fa7 100644
--- a/vue3/src/utils/logic_utils.ts
+++ b/vue3/src/utils/logic_utils.ts
@@ -1,6 +1,7 @@
import {ShoppingListEntry, Space} from "@/openapi";
-import {IShoppingListFood} from "@/types/Shopping";
+import {IShoppingListCategory, IShoppingListFood} from "@/types/Shopping";
import {DeviceSettings} from "@/types/settings";
+import {useUserPreferenceStore} from "@/stores/UserPreferenceStore.ts";
// -------------- SHOPPING RELATED ----------------------
@@ -25,7 +26,7 @@ export function isEntryVisible(entry: ShoppingListEntry, deviceSettings: DeviceS
* @param slf shopping list food holder
* @param deviceSettings user device settings based on which entry visibility is controlled
*/
-export function isShoppingListFoodVisible(slf: IShoppingListFood, deviceSettings: DeviceSettings){
+export function isShoppingListFoodVisible(slf: IShoppingListFood, deviceSettings: DeviceSettings) {
let foodVisible = false
slf.entries.forEach(entry => {
foodVisible = foodVisible || isEntryVisible(entry, deviceSettings)
@@ -54,6 +55,23 @@ export function isShoppingListFoodDelayed(slf: IShoppingListFood) {
return hasDelayedEntry
}
+/**
+ * determines if a category has entries that should be visible
+ * @param category
+ */
+export function isShoppingCategoryVisible(category: IShoppingListCategory) {
+ let entryCount = category.stats.countUnchecked
+
+ if (useUserPreferenceStore().deviceSettings.shopping_show_checked_entries) {
+ entryCount += category.stats.countChecked
+ }
+ if (useUserPreferenceStore().deviceSettings.shopping_show_delayed_entries) {
+ entryCount += category.stats.countUncheckedDelayed
+ }
+
+ return entryCount > 0
+}
+
// -------------- SPACE RELATED ----------------------
/**