meal plan and recipe editor improvements

This commit is contained in:
vabene1111
2024-12-28 12:55:20 +01:00
parent ea1e47e579
commit cde632241b
42 changed files with 358 additions and 70 deletions

View File

@@ -1104,7 +1104,7 @@ class MealPlanSerializer(SpacedModelSerializer, WritableNestedModelSerializer):
servings = CustomDecimalField() servings = CustomDecimalField()
shared = UserSerializer(many=True, required=False, allow_null=True) shared = UserSerializer(many=True, required=False, allow_null=True)
shopping = serializers.SerializerMethodField('in_shopping') shopping = serializers.SerializerMethodField('in_shopping')
addshopping = serializers.BooleanField(write_only=True) addshopping = serializers.BooleanField(write_only=True, required=False)
to_date = serializers.DateTimeField(required=False) to_date = serializers.DateTimeField(required=False)

View File

@@ -0,0 +1,59 @@
<template>
<v-alert :title="props.title" closable @click:close="closeAlert()" v-if="showAlert">
<template #prepend>
<v-icon icon="$help"></v-icon>
</template>
<p>
{{ props.text}}
<v-btn color="success" class="float-right" v-if="props.actionText != ''" @click="emit('click')">{{ actionText}}</v-btn>
</p>
</v-alert>
</template>
<script setup lang="ts">
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import {MessageType, useMessageStore} from "@/stores/MessageStore";
import {computed} from "vue";
// emit click if action is clicked, actual effect must come from parent component
const emit = defineEmits(['click'])
const props = defineProps({
title: {type: String, required: false,},
text: {type: String, required: true},
// show an action button if any text is given and emit click event if button is pressed
actionText: {type: String, required: false,},
})
/**
* somewhat unique hash of the given text to save which alerts have already been closed
*/
const alertHash = computed(() => {
return props.text.split('').reduce((prevHash, currVal) => (((prevHash << 5) - prevHash) + currVal.charCodeAt(0))|0, 0).toString()
})
/**
* only show the alert if it hasn't been closed on that device before
*/
const showAlert = computed(() => {
return !useUserPreferenceStore().deviceSettings.general_closedHelpAlerts.includes(alertHash.value)
})
/**
* called when alert is closed to save this alert into the list of closed alerts
*/
function closeAlert() {
if (!useUserPreferenceStore().deviceSettings.general_closedHelpAlerts.includes(alertHash.value)) {
useUserPreferenceStore().deviceSettings.general_closedHelpAlerts.push(alertHash.value)
} else {
useMessageStore().addMessage(MessageType.ERROR, 'Trying to close already closed alert', 0, props.text)
}
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,22 @@
<template>
<span v-if="ingredient.amount && !Number.isNaN(ingredient.amount)">{{$n(ingredient.amount)}}</span>
<span class="ms-1" v-if="ingredient.unit">{{ ingredient.unit.name}}</span>
<span class="ms-1" v-if="ingredient.food">{{ ingredient.food.name}}</span>
</template>
<script setup lang="ts">
import {Ingredient} from "@/openapi";
import {PropType} from "vue";
const props = defineProps({
ingredient: {type: {} as PropType<Ingredient>, required: true}
})
</script>
<style scoped>
</style>

View File

@@ -1,7 +1,9 @@
<template> <template>
<v-row class="h-100"> <v-row class="h-100">
<v-col> <v-col class="pb-0">
<v-card class="h-100" :loading="useMealPlanStore().loading">
<!-- TODO add hint about CTRL key while drag/drop --> <!-- TODO add hint about CTRL key while drag/drop -->
<!-- TODO multi selection? date range selection ? -->
<calendar-view <calendar-view
:show-date="calendarDate" :show-date="calendarDate"
:items="planItems" :items="planItems"
@@ -29,6 +31,8 @@
></meal-plan-calendar-item> ></meal-plan-calendar-item>
</template> </template>
</calendar-view> </calendar-view>
</v-card>
<model-edit-dialog model="MealPlan" v-model="newPlanDialog" :itemDefaults="newPlanDialogDefaultItem" <model-edit-dialog model="MealPlan" v-model="newPlanDialog" :itemDefaults="newPlanDialogDefaultItem"
@create="(arg: any) => useMealPlanStore().plans.set(arg.id, arg)"></model-edit-dialog> @create="(arg: any) => useMealPlanStore().plans.set(arg.id, arg)"></model-edit-dialog>
@@ -44,8 +48,8 @@ import "vue-simple-calendar/dist/css/default.css"
import MealPlanCalendarItem from "@/components/display/MealPlanCalendarItem.vue"; import MealPlanCalendarItem from "@/components/display/MealPlanCalendarItem.vue";
import {IMealPlanCalendarItem, IMealPlanNormalizedCalendarItem} from "@/types/MealPlan"; import {IMealPlanCalendarItem, IMealPlanNormalizedCalendarItem} from "@/types/MealPlan";
import {computed, onMounted, ref} from "vue"; import {computed, onMounted, ref, watch} from "vue";
import {DateTime} from "luxon"; import {DateTime, Duration} from "luxon";
import {useDisplay} from "vuetify"; import {useDisplay} from "vuetify";
import {useMealPlanStore} from "@/stores/MealPlanStore"; import {useMealPlanStore} from "@/stores/MealPlanStore";
import ModelEditDialog from "@/components/dialogs/ModelEditDialog.vue"; import ModelEditDialog from "@/components/dialogs/ModelEditDialog.vue";
@@ -89,22 +93,47 @@ const calendarItemHeight = computed(() => {
} }
}) })
onMounted(() => { /**
useMealPlanStore().refreshFromAPI() //TODO filter to visible date * watch calendar date and load entries accordingly
*/
watch(calendarDate, () => {
let daysInPeriod = 7
if (useUserPreferenceStore().deviceSettings.mealplan_displayPeriod == 'month') {
daysInPeriod = 31
} else if (useUserPreferenceStore().deviceSettings.mealplan_displayPeriod == 'year') {
daysInPeriod = 365
}
let days = useUserPreferenceStore().deviceSettings.mealplan_displayPeriodCount * daysInPeriod
useMealPlanStore().refreshFromAPI(calendarDate.value, DateTime.now().plus({days: days}).toJSDate())
}) })
onMounted(() => {
// initial load for next 30 days
useMealPlanStore().refreshFromAPI(calendarDate.value, DateTime.now().plus({days: 30}).toJSDate())
})
/**
* handle drop event for calendar items on fields
* @param undefinedItem
* @param targetDate
* @param event
*/
function dropCalendarItemOnDate(undefinedItem: IMealPlanNormalizedCalendarItem, targetDate: Date, event: DragEvent) { function dropCalendarItemOnDate(undefinedItem: IMealPlanNormalizedCalendarItem, targetDate: Date, event: DragEvent) {
//The item argument (first) is undefined because our custom calendar item cannot manipulate the calendar state so the item is unknown to the calendar (probably fixable by somehow binding state to the item) //The item argument (first) is undefined because our custom calendar item cannot manipulate the calendar state so the item is unknown to the calendar (probably fixable by somehow binding state to the item)
if (currentlyDraggedMealplan.value.originalItem.mealPlan.id != undefined) { if (currentlyDraggedMealplan.value.originalItem.mealPlan.id != undefined) {
let mealPlan = useMealPlanStore().plans.get(currentlyDraggedMealplan.value.originalItem.mealPlan.id) let mealPlan = useMealPlanStore().plans.get(currentlyDraggedMealplan.value.originalItem.mealPlan.id)
if (mealPlan != undefined) { if (mealPlan != undefined) {
let fromToDiff = DateTime.fromJSDate(mealPlan.toDate).diff(DateTime.fromJSDate(mealPlan.fromDate), 'days') let fromToDiff = {days: 1}
if (mealPlan.toDate) {
fromToDiff = DateTime.fromJSDate(mealPlan.toDate).diff(DateTime.fromJSDate(mealPlan.fromDate), 'days')
}
// create copy of item if control is pressed
if (event.ctrlKey) { if (event.ctrlKey) {
let new_entry = Object.assign({}, mealPlan) let new_entry = Object.assign({}, mealPlan)
new_entry.fromDate = targetDate new_entry.fromDate = targetDate
new_entry.toDate = DateTime.fromJSDate(targetDate).plus(fromToDiff).toJSDate() new_entry.toDate = DateTime.fromJSDate(targetDate).plus(fromToDiff).toJSDate()
useMealPlanStore().createObject(new_entry) useMealPlanStore().createObject(new_entry)
} else { } else {
mealPlan.fromDate = targetDate mealPlan.fromDate = targetDate
mealPlan.toDate = DateTime.fromJSDate(targetDate).plus(fromToDiff).toJSDate() mealPlan.toDate = DateTime.fromJSDate(targetDate).plus(fromToDiff).toJSDate()

View File

@@ -4,7 +4,6 @@
<v-input :hint="props.hint" persistent-hint :label="props.label" class="" > <v-input :hint="props.hint" persistent-hint :label="props.label" class="" >
<!-- TODO resolve-on-load false for now, race condition with model class, make prop once better solution is found --> <!-- TODO resolve-on-load false for now, race condition with model class, make prop once better solution is found -->
<Multiselect <Multiselect
:ref="`ref_${props.id}`" :ref="`ref_${props.id}`"

View File

@@ -14,11 +14,15 @@
<v-icon icon="fas fa-sliders-h"></v-icon> <v-icon icon="fas fa-sliders-h"></v-icon>
<v-menu activator="parent"> <v-menu activator="parent">
<v-list> <v-list>
<v-list-item prepend-icon="fas fa-plus-circle" @click="showName = true" v-if="!showName && (step.name == null || step.name == '')">{{
$t('Name')
}}
</v-list-item>
<v-list-item prepend-icon="fas fa-plus-circle" @click="showTime = true" v-if="!showTime && step.time == 0">{{ $t('Time') }}</v-list-item> <v-list-item prepend-icon="fas fa-plus-circle" @click="showTime = true" v-if="!showTime && step.time == 0">{{ $t('Time') }}</v-list-item>
<v-list-item prepend-icon="fas fa-plus-circle" @click="showFile = true" v-if="!showFile && step.file == null">{{ $t('File') }}</v-list-item> <v-list-item prepend-icon="fas fa-plus-circle" @click="showFile = true" v-if="!showFile && step.file == null">{{ $t('File') }}</v-list-item>
<v-list-item prepend-icon="fas fa-plus-circle" @click="showRecipe = true" v-if="!showRecipe && step.stepRecipe == null">{{ $t('Recipe') }}</v-list-item> <v-list-item prepend-icon="fas fa-plus-circle" @click="showRecipe = true" v-if="!showRecipe && step.stepRecipe == null">{{ $t('Recipe') }}</v-list-item>
<v-list-item prepend-icon="$delete">{{ $t('Delete') }}</v-list-item> <v-list-item prepend-icon="$delete" @click="emit('delete')">{{ $t('Delete') }}</v-list-item>
</v-list> </v-list>
</v-menu> </v-menu>
</v-btn> </v-btn>
@@ -27,7 +31,8 @@
<v-card-text> <v-card-text>
<v-text-field <v-text-field
v-model="step.name" v-model="step.name"
label="Step Name" :label="$t('Name')"
v-if="showName || (step.name != null && step.name != '')"
></v-text-field> ></v-text-field>
<v-row> <v-row>
@@ -46,20 +51,21 @@
<v-col cols="12"> <v-col cols="12">
<v-label>{{ $t('Ingredients') }}</v-label> <v-label>{{ $t('Ingredients') }}</v-label>
<vue-draggable v-model="step.ingredients" handle=".drag-handle" :on-sort="sortIngredients"> <vue-draggable v-model="step.ingredients" handle=".drag-handle" :on-sort="sortIngredients" v-if="!mobile">
<v-row v-for="(ingredient, index) in step.ingredients" dense> <v-row v-for="(ingredient, index) in step.ingredients" dense>
<v-col cols="2"> <v-col cols="2">
<v-number-input :id="`id_input_amount_${step.id}_${index}`" :label="$t('Amount')" v-model="ingredient.amount" inset control-variant="stacked" <v-number-input :id="`id_input_amount_${step.id}_${index}`" :label="$t('Amount')" v-model="ingredient.amount" inset control-variant="stacked"
hide-details
:min="0"></v-number-input> :min="0"></v-number-input>
</v-col> </v-col>
<v-col cols="3"> <v-col cols="3">
<model-select model="Unit" v-model="ingredient.unit"></model-select> <model-select model="Unit" v-model="ingredient.unit" hide-details></model-select>
</v-col> </v-col>
<v-col cols="3"> <v-col cols="3">
<model-select model="Food" v-model="ingredient.food"></model-select> <model-select model="Food" v-model="ingredient.food" hide-details></model-select>
</v-col> </v-col>
<v-col cols="3" @keydown.tab="event => handleIngredientNoteTab(event, index)"> <v-col cols="3" @keydown.tab="event => handleIngredientNoteTab(event, index)">
<v-text-field :label="$t('Note')" v-model="ingredient.note"></v-text-field> <v-text-field :label="$t('Note')" v-model="ingredient.note" hide-details></v-text-field>
</v-col> </v-col>
<v-col cols="1"> <v-col cols="1">
<v-btn variant="plain" icon> <v-btn variant="plain" icon>
@@ -74,15 +80,36 @@
</v-col> </v-col>
</v-row> </v-row>
</vue-draggable> </vue-draggable>
<v-btn-group density="compact">
<v-list v-if="mobile">
<vue-draggable v-model="step.ingredients" handle=".drag-handle" :on-sort="sortIngredients">
<v-list-item v-for="(ingredient, index) in step.ingredients" border @click="editingIngredientIndex = index; dialogIngredientEditor = true">
<ingredient-string :ingredient="ingredient"></ingredient-string>
<template #append>
<v-icon icon="$dragHandle" class="drag-handle"></v-icon>
</template>
</v-list-item>
</vue-draggable>
</v-list>
<v-btn-group density="compact" class="mt-1">
<v-btn color="success" @click="insertAndFocusIngredient()" prepend-icon="$add">{{ $t('Add') }}</v-btn> <v-btn color="success" @click="insertAndFocusIngredient()" prepend-icon="$add">{{ $t('Add') }}</v-btn>
<v-btn color="warning" @click="dialogIngredientParser = true"><v-icon icon="$add"></v-icon> <v-icon icon="$add"></v-icon></v-btn> <v-btn color="warning" @click="dialogIngredientParser = true">
<v-icon icon="$add"></v-icon>
<v-icon icon="$add"></v-icon>
</v-btn>
</v-btn-group> </v-btn-group>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12">
<v-label>{{ $t('Instructions') }}</v-label> <v-label>{{ $t('Instructions') }}</v-label>
<v-alert @click="dialogMarkdownEdit = true" class="mt-2 cursor-text" min-height="52px"> <v-alert @click="dialogMarkdownEditor = true" class="mt-2 cursor-pointer" min-height="52px">
<template v-if="step.instruction != '' && step.instruction != null">
{{ step.instruction }} {{ step.instruction }}
</template>
<template v-else>
<i> {{ $t('InstructionsEditHelp') }} </i>
</template>
</v-alert> </v-alert>
</v-col> </v-col>
</v-row> </v-row>
@@ -92,12 +119,15 @@
</v-card> </v-card>
<v-dialog <v-dialog
v-model="dialogMarkdownEdit" v-model="dialogMarkdownEditor"
:max-width="(mobile) ? '100vw': '75vw'" :max-width="(mobile) ? '100vw': '75vw'"
:fullscreen="mobile"> :fullscreen="mobile">
<v-card> <v-card>
<v-closable-card-title :title="$t('Instructions')" v-model="dialogMarkdownEdit"></v-closable-card-title> <v-closable-card-title :title="$t('Instructions')" v-model="dialogMarkdownEditor"></v-closable-card-title>
<step-markdown-editor class="h-100" v-model="step"></step-markdown-editor> <step-markdown-editor class="h-100" v-model="step"></step-markdown-editor>
<v-card-actions v-if="!mobile">
<v-btn @click="dialogMarkdownEditor = false">{{ $t('Close') }}</v-btn>
</v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@@ -115,34 +145,59 @@
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
<v-dialog
v-model="dialogIngredientEditor"
:max-width="(mobile) ? '100vw': '75vw'"
:fullscreen="mobile">
<v-card>
<v-closable-card-title :title="$t('Ingredient Editor')" v-model="dialogIngredientEditor"></v-closable-card-title>
<v-card-text>
<v-form>
<v-number-input v-model="step.ingredients[editingIngredientIndex].amount" inset control-variant="stacked" :label="$t('Amount')"
:min="0"></v-number-input>
<model-select model="Unit" v-model="step.ingredients[editingIngredientIndex].unit" :label="$t('Unit')"></model-select>
<model-select model="Food" v-model="step.ingredients[editingIngredientIndex].food" :label="$t('Food')"></model-select>
<v-text-field :label="$t('Note')" v-model="step.ingredients[editingIngredientIndex].note" ></v-text-field>
</v-form>
</v-card-text>
<v-card-actions>
<v-btn @click="dialogIngredientEditor = false">{{ $t('Close') }}</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {nextTick, ref} from 'vue' import {nextTick, ref} from 'vue'
import {ApiApi, Food, Ingredient, ParsedIngredient, Step} from "@/openapi"; import {ApiApi, Ingredient, ParsedIngredient, Step} from "@/openapi";
import StepMarkdownEditor from "@/components/inputs/StepMarkdownEditor.vue"; import StepMarkdownEditor from "@/components/inputs/StepMarkdownEditor.vue";
import {VNumberInput} from 'vuetify/labs/VNumberInput' //TODO remove once component is out of labs import {VNumberInput} from 'vuetify/labs/VNumberInput'
import IngredientsTableRow from "@/components/display/IngredientsTableRow.vue";
import ModelSelect from "@/components/inputs/ModelSelect.vue"; import ModelSelect from "@/components/inputs/ModelSelect.vue";
import {useDisplay} from "vuetify"; import {useDisplay} from "vuetify";
import {VueDraggable} from "vue-draggable-plus"; import {VueDraggable} from "vue-draggable-plus";
import VClosableCardTitle from "@/components/dialogs/VClosableCardTitle.vue"; import VClosableCardTitle from "@/components/dialogs/VClosableCardTitle.vue";
import IngredientString from "@/components/display/IngredientString.vue";
const emit = defineEmits(['delete'])
const step = defineModel<Step>({required: true}) const step = defineModel<Step>({required: true})
const props = defineProps({ const props = defineProps({
stepIndex: {type: Number, required: true}, stepIndex: {type: Number, required: true},
}) })
const {mobile} = useDisplay() const {mobile} = useDisplay()
const showName = ref(false)
const showTime = ref(false) const showTime = ref(false)
const showRecipe = ref(false) const showRecipe = ref(false)
const showFile = ref(false) const showFile = ref(false)
const dialogMarkdownEdit = ref(false) const dialogMarkdownEditor = ref(false)
const dialogIngredientEditor = ref(false)
const dialogIngredientParser = ref(false) const dialogIngredientParser = ref(false)
const editingIngredientIndex = ref({} as Ingredient)
const ingredientTextInput = ref("") const ingredientTextInput = ref("")
/** /**

View File

@@ -57,6 +57,7 @@
</v-col> </v-col>
</v-row> </v-row>
<closable-help-alert :text="$t('RecipeStepsHelp')" :action-text="$t('Steps')" @click="tab='steps'"></closable-help-alert>
</v-form> </v-form>
</v-tabs-window-item> </v-tabs-window-item>
@@ -64,13 +65,13 @@
<v-form :disabled="loading || fileApiLoading"> <v-form :disabled="loading || fileApiLoading">
<v-row v-for="(s,i ) in editingObj.steps" :key="s.id"> <v-row v-for="(s,i ) in editingObj.steps" :key="s.id">
<v-col> <v-col>
<step-editor v-model="editingObj.steps[i]" :step-index="i"></step-editor> <step-editor v-model="editingObj.steps[i]" :step-index="i" @delete="deleteStepAtIndex(i)"></step-editor>
</v-col> </v-col>
</v-row> </v-row>
<v-row> <v-row>
<v-col class="text-center"> <v-col class="text-center">
<v-btn-group density="compact"> <v-btn-group density="compact">
<v-btn color="success" prepend-icon="fa-solid fa-plus">{{ $t('Add_Step') }}</v-btn> <v-btn color="success" prepend-icon="fa-solid fa-plus" @click="addStep()">{{ $t('Add_Step') }}</v-btn>
<v-btn color="warning" @click="dialogStepManager = true"> <v-btn color="warning" @click="dialogStepManager = true">
<v-icon icon="fa-solid fa-arrow-down-1-9"></v-icon> <v-icon icon="fa-solid fa-arrow-down-1-9"></v-icon>
</v-btn> </v-btn>
@@ -124,7 +125,7 @@
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, PropType, ref, shallowRef} from "vue"; import {onMounted, PropType, ref, shallowRef} from "vue";
import {Recipe, Step} from "@/openapi"; import {Ingredient, Recipe, Step} from "@/openapi";
import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue";
import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions"; import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions";
import {useI18n} from "vue-i18n"; import {useI18n} from "vue-i18n";
@@ -134,6 +135,7 @@ import {VueDraggable} from "vue-draggable-plus";
import PropertiesEditor from "@/components/inputs/PropertiesEditor.vue"; import PropertiesEditor from "@/components/inputs/PropertiesEditor.vue";
import {useFileApi} from "@/composables/useFileApi"; import {useFileApi} from "@/composables/useFileApi";
import {VFileUpload} from 'vuetify/labs/VFileUpload' import {VFileUpload} from 'vuetify/labs/VFileUpload'
import ClosableHelpAlert from "@/components/display/ClosableHelpAlert.vue";
const props = defineProps({ const props = defineProps({
@@ -183,6 +185,16 @@ function deleteImage() {
}) })
} }
/**
* add a new step to the recipe
*/
function addStep(){
editingObj.value.steps.push({
ingredients: [] as Ingredient[],
time: 0,
} as Step)
}
/** /**
* called by draggable in step manager dialog when steps are sorted * called by draggable in step manager dialog when steps are sorted
*/ */
@@ -192,6 +204,14 @@ function sortSteps() {
}) })
} }
/**
* delete a step at the given index of the steps array of the editingObject
* @param index index to delete at
*/
function deleteStepAtIndex(index: number){
editingObj.value.steps.splice(index, 1)
}
</script> </script>
<style scoped> <style scoped>

View File

@@ -23,7 +23,8 @@
<p class="text-h6 mt-3">{{ $t('DeviceSettings') }}</p> <p class="text-h6 mt-3">{{ $t('DeviceSettings') }}</p>
<p class="text-disabled">{{ $t('DeviceSettingsHelp') }}</p> <p class="text-disabled">{{ $t('DeviceSettingsHelp') }}</p>
<v-btn @click="useUserPreferenceStore().resetDeviceSettings()">{{$t('Reset')}}</v-btn> <v-btn @click="useUserPreferenceStore().resetDeviceSettings()" color="warning">{{ $t('Reset') }}</v-btn> <br/>
<v-btn @click="useUserPreferenceStore().deviceSettings.general_closedHelpAlerts = []" color="warning" class="mt-1">{{ $t('ResetHelp') }}</v-btn>
</v-form> </v-form>
</template> </template>

View File

@@ -147,6 +147,7 @@
"InheritFields_help": "", "InheritFields_help": "",
"InheritWarning": "", "InheritWarning": "",
"Instructions": "", "Instructions": "",
"InstructionsEditHelp": "",
"Internal": "", "Internal": "",
"Invite_Link": "", "Invite_Link": "",
"Invites": "", "Invites": "",
@@ -246,6 +247,7 @@
"Ratings": "", "Ratings": "",
"Recently_Viewed": "", "Recently_Viewed": "",
"Recipe": "", "Recipe": "",
"RecipeStepsHelp": "",
"Recipe_Book": "", "Recipe_Book": "",
"Recipe_Image": "", "Recipe_Image": "",
"Recipes": "", "Recipes": "",
@@ -255,6 +257,7 @@
"RemoveFoodFromShopping": "", "RemoveFoodFromShopping": "",
"Remove_nutrition_recipe": "", "Remove_nutrition_recipe": "",
"Reset": "", "Reset": "",
"ResetHelp": "",
"Reset_Search": "", "Reset_Search": "",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -143,6 +143,7 @@
"InheritFields_help": "Стойностите на тези полета ще бъдат наследени от родител (Изключение: празни категории за пазаруване не се наследяват)", "InheritFields_help": "Стойностите на тези полета ще бъдат наследени от родител (Изключение: празни категории за пазаруване не се наследяват)",
"InheritWarning": "{food} е настроен да наследява, промените може да не продължат.", "InheritWarning": "{food} е настроен да наследява, промените може да не продължат.",
"Instructions": "Инструкции", "Instructions": "Инструкции",
"InstructionsEditHelp": "",
"Internal": "Вътрешен", "Internal": "Вътрешен",
"Invite_Link": "", "Invite_Link": "",
"Key_Ctrl": "Контрол", "Key_Ctrl": "Контрол",
@@ -239,6 +240,7 @@
"Ratings": "Рейтинги", "Ratings": "Рейтинги",
"Recently_Viewed": "Наскоро разгледани", "Recently_Viewed": "Наскоро разгледани",
"Recipe": "Рецепта", "Recipe": "Рецепта",
"RecipeStepsHelp": "",
"Recipe_Book": "Книга с рецепти", "Recipe_Book": "Книга с рецепти",
"Recipe_Image": "Изображение на рецептата", "Recipe_Image": "Изображение на рецептата",
"Recipes": "Рецепти", "Recipes": "Рецепти",
@@ -248,6 +250,7 @@
"RemoveFoodFromShopping": "Премахнете {food} от списъка си за пазаруване", "RemoveFoodFromShopping": "Премахнете {food} от списъка си за пазаруване",
"Remove_nutrition_recipe": "Изтрийте хранителните стойности от рецептата", "Remove_nutrition_recipe": "Изтрийте хранителните стойности от рецептата",
"Reset": "Нулиране", "Reset": "Нулиране",
"ResetHelp": "",
"Reset_Search": "Нулиране на търсенето", "Reset_Search": "Нулиране на търсенето",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -192,6 +192,7 @@
"Input": "", "Input": "",
"Instruction_Replace": "Substituïu instrucció", "Instruction_Replace": "Substituïu instrucció",
"Instructions": "", "Instructions": "",
"InstructionsEditHelp": "",
"Internal": "", "Internal": "",
"Invite_Link": "", "Invite_Link": "",
"Invites": "", "Invites": "",
@@ -316,6 +317,7 @@
"Ratings": "", "Ratings": "",
"Recently_Viewed": "Vistos recentment", "Recently_Viewed": "Vistos recentment",
"Recipe": "", "Recipe": "",
"RecipeStepsHelp": "",
"Recipe_Book": "", "Recipe_Book": "",
"Recipe_Image": "Imatge de la recepta", "Recipe_Image": "Imatge de la recepta",
"Recipes": "", "Recipes": "",
@@ -325,6 +327,7 @@
"RemoveFoodFromShopping": "", "RemoveFoodFromShopping": "",
"Remove_nutrition_recipe": "Esborreu nutrició de la recepta", "Remove_nutrition_recipe": "Esborreu nutrició de la recepta",
"Reset": "", "Reset": "",
"ResetHelp": "",
"Reset_Search": "Reinicieu la cerca", "Reset_Search": "Reinicieu la cerca",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -191,6 +191,7 @@
"InheritWarning": "{food} se propisuje, změny nemusí setrvat.", "InheritWarning": "{food} se propisuje, změny nemusí setrvat.",
"Instruction_Replace": "Nahraď instrukce", "Instruction_Replace": "Nahraď instrukce",
"Instructions": "Instrukce", "Instructions": "Instrukce",
"InstructionsEditHelp": "",
"Internal": "Interní", "Internal": "Interní",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Pozvánky", "Invites": "Pozvánky",
@@ -314,6 +315,7 @@
"Ratings": "Hodnocení", "Ratings": "Hodnocení",
"Recently_Viewed": "Naposledy prohlížené", "Recently_Viewed": "Naposledy prohlížené",
"Recipe": "Recept", "Recipe": "Recept",
"RecipeStepsHelp": "",
"Recipe_Book": "Kuchařka", "Recipe_Book": "Kuchařka",
"Recipe_Image": "Obrázek k receptu", "Recipe_Image": "Obrázek k receptu",
"Recipes": "Recepty", "Recipes": "Recepty",
@@ -323,6 +325,7 @@
"RemoveFoodFromShopping": "Odstranit {food} z nákupního seznamu", "RemoveFoodFromShopping": "Odstranit {food} z nákupního seznamu",
"Remove_nutrition_recipe": "Smazat nutriční hodnoty", "Remove_nutrition_recipe": "Smazat nutriční hodnoty",
"Reset": "Resetovat", "Reset": "Resetovat",
"ResetHelp": "",
"Reset_Search": "Zrušit filtry vyhledávání", "Reset_Search": "Zrušit filtry vyhledávání",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -179,6 +179,7 @@
"InheritWarning": "{food} er sat til at nedarve, ændringer bliver måske ikke gemt.", "InheritWarning": "{food} er sat til at nedarve, ændringer bliver måske ikke gemt.",
"Instruction_Replace": "Erstat instruktion", "Instruction_Replace": "Erstat instruktion",
"Instructions": "Instruktioner", "Instructions": "Instruktioner",
"InstructionsEditHelp": "",
"Internal": "Interne", "Internal": "Interne",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Invitationer", "Invites": "Invitationer",
@@ -296,6 +297,7 @@
"Ratings": "Bedømmelser", "Ratings": "Bedømmelser",
"Recently_Viewed": "Vist for nylig", "Recently_Viewed": "Vist for nylig",
"Recipe": "Opskrift", "Recipe": "Opskrift",
"RecipeStepsHelp": "",
"Recipe_Book": "Opskriftsbog", "Recipe_Book": "Opskriftsbog",
"Recipe_Image": "Opskriftsbillede", "Recipe_Image": "Opskriftsbillede",
"Recipes": "Opskrifter", "Recipes": "Opskrifter",
@@ -305,6 +307,7 @@
"RemoveFoodFromShopping": "Fjern {food} fra indkøbsliste", "RemoveFoodFromShopping": "Fjern {food} fra indkøbsliste",
"Remove_nutrition_recipe": "Fjern næringsindhold fra opskrift", "Remove_nutrition_recipe": "Fjern næringsindhold fra opskrift",
"Reset": "Nulstil", "Reset": "Nulstil",
"ResetHelp": "",
"Reset_Search": "Nulstil søgning", "Reset_Search": "Nulstil søgning",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -194,6 +194,7 @@
"Input": "Eingabe", "Input": "Eingabe",
"Instruction_Replace": "Anleitung ersetzen", "Instruction_Replace": "Anleitung ersetzen",
"Instructions": "Anleitung", "Instructions": "Anleitung",
"InstructionsEditHelp": "Hier klicken um eine Anleitung hinzuzufügen.",
"Internal": "Intern", "Internal": "Intern",
"Invite_Link": "Einladungs Link", "Invite_Link": "Einladungs Link",
"Invites": "Einladungen", "Invites": "Einladungen",
@@ -319,6 +320,7 @@
"Ratings": "Bewertungen", "Ratings": "Bewertungen",
"Recently_Viewed": "Kürzlich angesehen", "Recently_Viewed": "Kürzlich angesehen",
"Recipe": "Rezept", "Recipe": "Rezept",
"RecipeStepsHelp": "Zutaten, Anleitungen und mehr können unter dem Tab Schritte hinzugefügt werden.",
"Recipe_Book": "Kochbuch", "Recipe_Book": "Kochbuch",
"Recipe_Image": "Rezeptbild", "Recipe_Image": "Rezeptbild",
"Recipes": "Rezepte", "Recipes": "Rezepte",
@@ -328,6 +330,7 @@
"RemoveFoodFromShopping": "{food} von der Einkaufsliste löschen", "RemoveFoodFromShopping": "{food} von der Einkaufsliste löschen",
"Remove_nutrition_recipe": "Nährwerte aus Rezept löschen", "Remove_nutrition_recipe": "Nährwerte aus Rezept löschen",
"Reset": "Zurücksetzen", "Reset": "Zurücksetzen",
"ResetHelp": "Hilfe Zurücksetzen",
"Reset_Search": "Suche zurücksetzen", "Reset_Search": "Suche zurücksetzen",
"Reusable": "Wiederverwendbar", "Reusable": "Wiederverwendbar",
"Role": "Rolle", "Role": "Rolle",

View File

@@ -174,6 +174,7 @@
"InheritWarning": "To φαγητό {food} έχει ρυθμιστεί να κληρονομεί, οι αλλαγές μπορεί να μην διατηρηθούν.", "InheritWarning": "To φαγητό {food} έχει ρυθμιστεί να κληρονομεί, οι αλλαγές μπορεί να μην διατηρηθούν.",
"Instruction_Replace": "Αλλαγή οδηγίας", "Instruction_Replace": "Αλλαγή οδηγίας",
"Instructions": "Οδηγίες", "Instructions": "Οδηγίες",
"InstructionsEditHelp": "",
"Internal": "Εσωτερική", "Internal": "Εσωτερική",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Προσκλήσεις", "Invites": "Προσκλήσεις",
@@ -288,6 +289,7 @@
"Ratings": "Βαθμολογίες", "Ratings": "Βαθμολογίες",
"Recently_Viewed": "Προβλήθηκαν πρόσφατα", "Recently_Viewed": "Προβλήθηκαν πρόσφατα",
"Recipe": "Συνταγή", "Recipe": "Συνταγή",
"RecipeStepsHelp": "",
"Recipe_Book": "Βιβλίο συνταγών", "Recipe_Book": "Βιβλίο συνταγών",
"Recipe_Image": "Εικόνα συνταγής", "Recipe_Image": "Εικόνα συνταγής",
"Recipes": "Συνταγές", "Recipes": "Συνταγές",
@@ -297,6 +299,7 @@
"RemoveFoodFromShopping": "Αφαίρεση του φαγητού {food} από τη λίστα αγορών σας", "RemoveFoodFromShopping": "Αφαίρεση του φαγητού {food} από τη λίστα αγορών σας",
"Remove_nutrition_recipe": "Αφαίρεση διατροφικής αξίας από τη συνταγή", "Remove_nutrition_recipe": "Αφαίρεση διατροφικής αξίας από τη συνταγή",
"Reset": "Επαναφορά", "Reset": "Επαναφορά",
"ResetHelp": "",
"Reset_Search": "Επαναφορά αναζήτησης", "Reset_Search": "Επαναφορά αναζήτησης",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -193,6 +193,7 @@
"Input": "Input", "Input": "Input",
"Instruction_Replace": "Instruction Replace", "Instruction_Replace": "Instruction Replace",
"Instructions": "Instructions", "Instructions": "Instructions",
"InstructionsEditHelp": "Click here to add instructions. ",
"Internal": "Internal", "Internal": "Internal",
"Invite_Link": "Invite Link", "Invite_Link": "Invite Link",
"Invites": "Invites", "Invites": "Invites",
@@ -318,6 +319,7 @@
"Ratings": "Ratings", "Ratings": "Ratings",
"Recently_Viewed": "Recently Viewed", "Recently_Viewed": "Recently Viewed",
"Recipe": "Recipe", "Recipe": "Recipe",
"RecipeStepsHelp": "Ingredients, Instructions and more can be edited in the tab Steps.",
"Recipe_Book": "Recipe Book", "Recipe_Book": "Recipe Book",
"Recipe_Image": "Recipe Image", "Recipe_Image": "Recipe Image",
"Recipes": "Recipes", "Recipes": "Recipes",
@@ -327,6 +329,7 @@
"RemoveFoodFromShopping": "Remove {food} from your shopping list", "RemoveFoodFromShopping": "Remove {food} from your shopping list",
"Remove_nutrition_recipe": "Delete nutrition from recipe", "Remove_nutrition_recipe": "Delete nutrition from recipe",
"Reset": "Reset", "Reset": "Reset",
"ResetHelp": "Reset Help",
"Reset_Search": "Reset Search", "Reset_Search": "Reset Search",
"Reusable": "Reusable", "Reusable": "Reusable",
"Role": "Role", "Role": "Role",

View File

@@ -193,6 +193,7 @@
"Input": "Entrada", "Input": "Entrada",
"Instruction_Replace": "Reemplazar Instrucción", "Instruction_Replace": "Reemplazar Instrucción",
"Instructions": "Instrucciones", "Instructions": "Instrucciones",
"InstructionsEditHelp": "",
"Internal": "Interno", "Internal": "Interno",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Invitaciones", "Invites": "Invitaciones",
@@ -315,6 +316,7 @@
"Ratings": "Calificaciones", "Ratings": "Calificaciones",
"Recently_Viewed": "Visto recientemente", "Recently_Viewed": "Visto recientemente",
"Recipe": "Receta", "Recipe": "Receta",
"RecipeStepsHelp": "",
"Recipe_Book": "Libro de recetas", "Recipe_Book": "Libro de recetas",
"Recipe_Image": "Imagen de la receta", "Recipe_Image": "Imagen de la receta",
"Recipes": "Recetas", "Recipes": "Recetas",
@@ -324,6 +326,7 @@
"RemoveFoodFromShopping": "Eliminar {food} de la lista de la compra", "RemoveFoodFromShopping": "Eliminar {food} de la lista de la compra",
"Remove_nutrition_recipe": "Borrar nutrición de la canasta", "Remove_nutrition_recipe": "Borrar nutrición de la canasta",
"Reset": "Restablecer", "Reset": "Restablecer",
"ResetHelp": "",
"Reset_Search": "Resetear busqueda", "Reset_Search": "Resetear busqueda",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -100,6 +100,7 @@
"Information": "Tiedot", "Information": "Tiedot",
"Ingredients": "Ainesosat", "Ingredients": "Ainesosat",
"Instructions": "Ohjeet", "Instructions": "Ohjeet",
"InstructionsEditHelp": "",
"Invite_Link": "", "Invite_Link": "",
"Key_Ctrl": "Ctrl", "Key_Ctrl": "Ctrl",
"Key_Shift": "Shift", "Key_Shift": "Shift",
@@ -176,12 +177,14 @@
"Rating": "Luokitus", "Rating": "Luokitus",
"Recently_Viewed": "Äskettäin katsotut", "Recently_Viewed": "Äskettäin katsotut",
"Recipe": "Resepti", "Recipe": "Resepti",
"RecipeStepsHelp": "",
"Recipe_Book": "Keittokirja", "Recipe_Book": "Keittokirja",
"Recipe_Image": "Reseptin Kuva", "Recipe_Image": "Reseptin Kuva",
"Recipes": "Reseptit", "Recipes": "Reseptit",
"Recipes_per_page": "Reseptejä sivulla", "Recipes_per_page": "Reseptejä sivulla",
"Remove": "", "Remove": "",
"Remove_nutrition_recipe": "Poista ravintoaine reseptistä", "Remove_nutrition_recipe": "Poista ravintoaine reseptistä",
"ResetHelp": "",
"Reset_Search": "Nollaa haku", "Reset_Search": "Nollaa haku",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -192,6 +192,7 @@
"Input": "Entrée", "Input": "Entrée",
"Instruction_Replace": "Instruction Remplacer", "Instruction_Replace": "Instruction Remplacer",
"Instructions": "Instructions", "Instructions": "Instructions",
"InstructionsEditHelp": "",
"Internal": "Interne", "Internal": "Interne",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Invitations", "Invites": "Invitations",
@@ -316,6 +317,7 @@
"Ratings": "Notes", "Ratings": "Notes",
"Recently_Viewed": "Vu récemment", "Recently_Viewed": "Vu récemment",
"Recipe": "Recette", "Recipe": "Recette",
"RecipeStepsHelp": "",
"Recipe_Book": "Livre de recettes", "Recipe_Book": "Livre de recettes",
"Recipe_Image": "Image de la recette", "Recipe_Image": "Image de la recette",
"Recipes": "Recettes", "Recipes": "Recettes",
@@ -325,6 +327,7 @@
"RemoveFoodFromShopping": "Supprimer laliment {food} de votre liste de courses", "RemoveFoodFromShopping": "Supprimer laliment {food} de votre liste de courses",
"Remove_nutrition_recipe": "Supprimer les valeurs nutritionelles de la recette", "Remove_nutrition_recipe": "Supprimer les valeurs nutritionelles de la recette",
"Reset": "Réinitialiser", "Reset": "Réinitialiser",
"ResetHelp": "",
"Reset_Search": "Réinitialiser la recherche", "Reset_Search": "Réinitialiser la recherche",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -193,6 +193,7 @@
"Input": "קלט", "Input": "קלט",
"Instruction_Replace": "החלפת הוראות", "Instruction_Replace": "החלפת הוראות",
"Instructions": "הוראות", "Instructions": "הוראות",
"InstructionsEditHelp": "",
"Internal": "פנימי", "Internal": "פנימי",
"Invite_Link": "", "Invite_Link": "",
"Invites": "הזמנות", "Invites": "הזמנות",
@@ -317,6 +318,7 @@
"Ratings": "דירוג", "Ratings": "דירוג",
"Recently_Viewed": "נצפו לאחרונה", "Recently_Viewed": "נצפו לאחרונה",
"Recipe": "מתכון", "Recipe": "מתכון",
"RecipeStepsHelp": "",
"Recipe_Book": "ספר מתכון", "Recipe_Book": "ספר מתכון",
"Recipe_Image": "תמונת מתכון", "Recipe_Image": "תמונת מתכון",
"Recipes": "מתכונים", "Recipes": "מתכונים",
@@ -326,6 +328,7 @@
"RemoveFoodFromShopping": "הסר {מזון} מרשימת הקניות", "RemoveFoodFromShopping": "הסר {מזון} מרשימת הקניות",
"Remove_nutrition_recipe": "מחר ערכים תזונתיים מהמתכון", "Remove_nutrition_recipe": "מחר ערכים תזונתיים מהמתכון",
"Reset": "אפס", "Reset": "אפס",
"ResetHelp": "",
"Reset_Search": "אפס חיפוש", "Reset_Search": "אפס חיפוש",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -175,6 +175,7 @@
"InheritWarning": "", "InheritWarning": "",
"Instruction_Replace": "Elkészítési leírás cseréje", "Instruction_Replace": "Elkészítési leírás cseréje",
"Instructions": "Elkészítés", "Instructions": "Elkészítés",
"InstructionsEditHelp": "",
"Internal": "Belső", "Internal": "Belső",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Meghívók", "Invites": "Meghívók",
@@ -290,6 +291,7 @@
"Ratings": "Értékelések", "Ratings": "Értékelések",
"Recently_Viewed": "Nemrég megtekintett", "Recently_Viewed": "Nemrég megtekintett",
"Recipe": "Recept", "Recipe": "Recept",
"RecipeStepsHelp": "",
"Recipe_Book": "Szakácskönyv", "Recipe_Book": "Szakácskönyv",
"Recipe_Image": "Receptkép", "Recipe_Image": "Receptkép",
"Recipes": "Receptek", "Recipes": "Receptek",
@@ -299,6 +301,7 @@
"RemoveFoodFromShopping": "{food} eltávolítása bevásárlólistáról", "RemoveFoodFromShopping": "{food} eltávolítása bevásárlólistáról",
"Remove_nutrition_recipe": "Tápértékadatok törlése a receptből", "Remove_nutrition_recipe": "Tápértékadatok törlése a receptből",
"Reset": "Visszaállítás", "Reset": "Visszaállítás",
"ResetHelp": "",
"Reset_Search": "Keresés alaphelyzetbe állítása", "Reset_Search": "Keresés alaphelyzetbe állítása",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -74,6 +74,7 @@
"Import_finished": "Ներմուծումն ավարտված է", "Import_finished": "Ներմուծումն ավարտված է",
"Information": "Տեղեկություն", "Information": "Տեղեկություն",
"Ingredients": "", "Ingredients": "",
"InstructionsEditHelp": "",
"Invite_Link": "", "Invite_Link": "",
"Keywords": "", "Keywords": "",
"Link": "", "Link": "",
@@ -122,12 +123,14 @@
"Rating": "", "Rating": "",
"Recently_Viewed": "Վերջերս դիտած", "Recently_Viewed": "Վերջերս դիտած",
"Recipe": "Բաղադրատոմս", "Recipe": "Բաղադրատոմս",
"RecipeStepsHelp": "",
"Recipe_Book": "Բաղադրատոմսերի գիրք", "Recipe_Book": "Բաղադրատոմսերի գիրք",
"Recipe_Image": "Բաղադրատոմսի նկար", "Recipe_Image": "Բաղադրատոմսի նկար",
"Recipes": "Բաղադրատոմսեր", "Recipes": "Բաղադրատոմսեր",
"Recipes_per_page": "Բաղադրատոմս էջում", "Recipes_per_page": "Բաղադրատոմս էջում",
"Remove": "", "Remove": "",
"Remove_nutrition_recipe": "Հեռացնել բաղադրատոմսի սննդայնությունը", "Remove_nutrition_recipe": "Հեռացնել բաղադրատոմսի սննդայնությունը",
"ResetHelp": "",
"Reset_Search": "Զրոյացնել որոնումը", "Reset_Search": "Զրոյացնել որոնումը",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -161,6 +161,7 @@
"InheritFields_help": "", "InheritFields_help": "",
"InheritWarning": "", "InheritWarning": "",
"Instructions": "", "Instructions": "",
"InstructionsEditHelp": "",
"Internal": "", "Internal": "",
"Invite_Link": "", "Invite_Link": "",
"Invites": "", "Invites": "",
@@ -266,6 +267,7 @@
"Ratings": "", "Ratings": "",
"Recently_Viewed": "baru saja dilihat", "Recently_Viewed": "baru saja dilihat",
"Recipe": "", "Recipe": "",
"RecipeStepsHelp": "",
"Recipe_Book": "", "Recipe_Book": "",
"Recipe_Image": "Gambar Resep", "Recipe_Image": "Gambar Resep",
"Recipes": "Resep", "Recipes": "Resep",
@@ -275,6 +277,7 @@
"RemoveFoodFromShopping": "", "RemoveFoodFromShopping": "",
"Remove_nutrition_recipe": "Hapus nutrisi dari resep", "Remove_nutrition_recipe": "Hapus nutrisi dari resep",
"Reset": "", "Reset": "",
"ResetHelp": "",
"Reset_Search": "Setel Ulang Pencarian", "Reset_Search": "Setel Ulang Pencarian",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -192,6 +192,7 @@
"Input": "", "Input": "",
"Instruction_Replace": "", "Instruction_Replace": "",
"Instructions": "", "Instructions": "",
"InstructionsEditHelp": "",
"Internal": "", "Internal": "",
"Invite_Link": "", "Invite_Link": "",
"Invites": "", "Invites": "",
@@ -316,6 +317,7 @@
"Ratings": "", "Ratings": "",
"Recently_Viewed": "", "Recently_Viewed": "",
"Recipe": "", "Recipe": "",
"RecipeStepsHelp": "",
"Recipe_Book": "", "Recipe_Book": "",
"Recipe_Image": "", "Recipe_Image": "",
"Recipes": "", "Recipes": "",
@@ -325,6 +327,7 @@
"RemoveFoodFromShopping": "", "RemoveFoodFromShopping": "",
"Remove_nutrition_recipe": "", "Remove_nutrition_recipe": "",
"Reset": "", "Reset": "",
"ResetHelp": "",
"Reset_Search": "", "Reset_Search": "",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -166,6 +166,7 @@
"InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.", "InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.",
"Instruction_Replace": "Sostituisci istruzioni", "Instruction_Replace": "Sostituisci istruzioni",
"Instructions": "Istruzioni", "Instructions": "Istruzioni",
"InstructionsEditHelp": "",
"Internal": "Interno", "Internal": "Interno",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Inviti", "Invites": "Inviti",
@@ -274,6 +275,7 @@
"Ratings": "Valutazioni", "Ratings": "Valutazioni",
"Recently_Viewed": "Visualizzato di recente", "Recently_Viewed": "Visualizzato di recente",
"Recipe": "Ricetta", "Recipe": "Ricetta",
"RecipeStepsHelp": "",
"Recipe_Book": "Libro di Ricette", "Recipe_Book": "Libro di Ricette",
"Recipe_Image": "Immagine ricetta", "Recipe_Image": "Immagine ricetta",
"Recipes": "Ricette", "Recipes": "Ricette",
@@ -283,6 +285,7 @@
"RemoveFoodFromShopping": "Rimuovi {food} dalla tua lista della spesa", "RemoveFoodFromShopping": "Rimuovi {food} dalla tua lista della spesa",
"Remove_nutrition_recipe": "Elimina nutrienti dalla ricetta", "Remove_nutrition_recipe": "Elimina nutrienti dalla ricetta",
"Reset": "Azzera", "Reset": "Azzera",
"ResetHelp": "",
"Reset_Search": "Ripristina Ricerca", "Reset_Search": "Ripristina Ricerca",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -177,6 +177,7 @@
"InheritWarning": "", "InheritWarning": "",
"Instruction_Replace": "", "Instruction_Replace": "",
"Instructions": "", "Instructions": "",
"InstructionsEditHelp": "",
"Internal": "", "Internal": "",
"Invite_Link": "", "Invite_Link": "",
"Invites": "", "Invites": "",
@@ -294,6 +295,7 @@
"Ratings": "", "Ratings": "",
"Recently_Viewed": "Neseniai Žiūrėta", "Recently_Viewed": "Neseniai Žiūrėta",
"Recipe": "", "Recipe": "",
"RecipeStepsHelp": "",
"Recipe_Book": "", "Recipe_Book": "",
"Recipe_Image": "Recepto nuotrauka", "Recipe_Image": "Recepto nuotrauka",
"Recipes": "", "Recipes": "",
@@ -303,6 +305,7 @@
"RemoveFoodFromShopping": "", "RemoveFoodFromShopping": "",
"Remove_nutrition_recipe": "Ištrinti mitybos informaciją iš recepto", "Remove_nutrition_recipe": "Ištrinti mitybos informaciją iš recepto",
"Reset": "", "Reset": "",
"ResetHelp": "",
"Reset_Search": "Iš naujo nustatyti paiešką", "Reset_Search": "Iš naujo nustatyti paiešką",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -172,6 +172,7 @@
"InheritWarning": "", "InheritWarning": "",
"Instruction_Replace": "Erstatt instruksjoner", "Instruction_Replace": "Erstatt instruksjoner",
"Instructions": "Instruksjoner", "Instructions": "Instruksjoner",
"InstructionsEditHelp": "",
"Internal": "", "Internal": "",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Invitasjoner", "Invites": "Invitasjoner",
@@ -286,6 +287,7 @@
"Ratings": "", "Ratings": "",
"Recently_Viewed": "Nylig vist", "Recently_Viewed": "Nylig vist",
"Recipe": "Oppskrift", "Recipe": "Oppskrift",
"RecipeStepsHelp": "",
"Recipe_Book": "Oppskriftsbok", "Recipe_Book": "Oppskriftsbok",
"Recipe_Image": "Oppskriftsbilde", "Recipe_Image": "Oppskriftsbilde",
"Recipes": "Oppskrift", "Recipes": "Oppskrift",
@@ -295,6 +297,7 @@
"RemoveFoodFromShopping": "Fjern {food} fra handelisten din", "RemoveFoodFromShopping": "Fjern {food} fra handelisten din",
"Remove_nutrition_recipe": "Fjern næringsinnhold fra oppskrift", "Remove_nutrition_recipe": "Fjern næringsinnhold fra oppskrift",
"Reset": "", "Reset": "",
"ResetHelp": "",
"Reset_Search": "Nullstill søk", "Reset_Search": "Nullstill søk",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -176,6 +176,7 @@
"InheritWarning": "{food} erft informatie, wijzigingen zijn mogelijk niet blijvend.", "InheritWarning": "{food} erft informatie, wijzigingen zijn mogelijk niet blijvend.",
"Instruction_Replace": "Vervang instructie", "Instruction_Replace": "Vervang instructie",
"Instructions": "Instructies", "Instructions": "Instructies",
"InstructionsEditHelp": "",
"Internal": "Interne", "Internal": "Interne",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Uitnodigingen", "Invites": "Uitnodigingen",
@@ -290,6 +291,7 @@
"Ratings": "Waardering", "Ratings": "Waardering",
"Recently_Viewed": "Recent bekeken", "Recently_Viewed": "Recent bekeken",
"Recipe": "Recept", "Recipe": "Recept",
"RecipeStepsHelp": "",
"Recipe_Book": "Kookboek", "Recipe_Book": "Kookboek",
"Recipe_Image": "Afbeelding Recept", "Recipe_Image": "Afbeelding Recept",
"Recipes": "Recepten", "Recipes": "Recepten",
@@ -299,6 +301,7 @@
"RemoveFoodFromShopping": "Verwijder {food} van je boodschappenlijst", "RemoveFoodFromShopping": "Verwijder {food} van je boodschappenlijst",
"Remove_nutrition_recipe": "Verwijder voedingswaarde van recept", "Remove_nutrition_recipe": "Verwijder voedingswaarde van recept",
"Reset": "Herstel", "Reset": "Herstel",
"ResetHelp": "",
"Reset_Search": "Zoeken resetten", "Reset_Search": "Zoeken resetten",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -194,6 +194,7 @@
"Input": "Wprowadź", "Input": "Wprowadź",
"Instruction_Replace": "Zmień instrukcję", "Instruction_Replace": "Zmień instrukcję",
"Instructions": "Instrukcje", "Instructions": "Instrukcje",
"InstructionsEditHelp": "",
"Internal": "Wewnętrzne", "Internal": "Wewnętrzne",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Zaprasza", "Invites": "Zaprasza",
@@ -318,6 +319,7 @@
"Ratings": "Oceny", "Ratings": "Oceny",
"Recently_Viewed": "Ostatnio oglądane", "Recently_Viewed": "Ostatnio oglądane",
"Recipe": "Przepis", "Recipe": "Przepis",
"RecipeStepsHelp": "",
"Recipe_Book": "Książka z przepisami", "Recipe_Book": "Książka z przepisami",
"Recipe_Image": "Obrazek dla przepisu", "Recipe_Image": "Obrazek dla przepisu",
"Recipes": "Przepisy", "Recipes": "Przepisy",
@@ -327,6 +329,7 @@
"RemoveFoodFromShopping": "Usuń {food} z listy zakupów", "RemoveFoodFromShopping": "Usuń {food} z listy zakupów",
"Remove_nutrition_recipe": "Usuń wartości odżywcze z przepisu", "Remove_nutrition_recipe": "Usuń wartości odżywcze z przepisu",
"Reset": "Resetowanie", "Reset": "Resetowanie",
"ResetHelp": "",
"Reset_Search": "Resetuj wyszukiwanie", "Reset_Search": "Resetuj wyszukiwanie",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -139,6 +139,7 @@
"InheritWarning": "{food} esta definida para herdar, alterações podem não persistir.", "InheritWarning": "{food} esta definida para herdar, alterações podem não persistir.",
"Instruction_Replace": "Substituir Instrução", "Instruction_Replace": "Substituir Instrução",
"Instructions": "Instruções", "Instructions": "Instruções",
"InstructionsEditHelp": "",
"Internal": "Interno", "Internal": "Interno",
"Invite_Link": "", "Invite_Link": "",
"Key_Ctrl": "Ctrl", "Key_Ctrl": "Ctrl",
@@ -236,6 +237,7 @@
"Ratings": "Avaliações", "Ratings": "Avaliações",
"Recently_Viewed": "Vistos Recentemente", "Recently_Viewed": "Vistos Recentemente",
"Recipe": "Receita", "Recipe": "Receita",
"RecipeStepsHelp": "",
"Recipe_Book": "Livro de Receitas", "Recipe_Book": "Livro de Receitas",
"Recipe_Image": "Imagem da Receita", "Recipe_Image": "Imagem da Receita",
"Recipes": "Receitas", "Recipes": "Receitas",
@@ -244,6 +246,7 @@
"RemoveFoodFromShopping": "Remover {food} da sua lista de compras", "RemoveFoodFromShopping": "Remover {food} da sua lista de compras",
"Remove_nutrition_recipe": "Remover valor nutricional da receita", "Remove_nutrition_recipe": "Remover valor nutricional da receita",
"Reset": "Reiniciar", "Reset": "Reiniciar",
"ResetHelp": "",
"Reset_Search": "Repor Pesquisa", "Reset_Search": "Repor Pesquisa",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -187,6 +187,7 @@
"Input": "Entrada", "Input": "Entrada",
"Instruction_Replace": "Substituir Instrução", "Instruction_Replace": "Substituir Instrução",
"Instructions": "Instruções", "Instructions": "Instruções",
"InstructionsEditHelp": "",
"Internal": "Interno", "Internal": "Interno",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Convites", "Invites": "Convites",
@@ -305,6 +306,7 @@
"Ratings": "Classificações", "Ratings": "Classificações",
"Recently_Viewed": "Visto recentemente", "Recently_Viewed": "Visto recentemente",
"Recipe": "Receita", "Recipe": "Receita",
"RecipeStepsHelp": "",
"Recipe_Book": "Livro de Receitas", "Recipe_Book": "Livro de Receitas",
"Recipe_Image": "Imagem da receita", "Recipe_Image": "Imagem da receita",
"Recipes": "Receitas", "Recipes": "Receitas",
@@ -314,6 +316,7 @@
"RemoveFoodFromShopping": "Remover {food} da sua lista de compras", "RemoveFoodFromShopping": "Remover {food} da sua lista de compras",
"Remove_nutrition_recipe": "Deletar dados nutricionais da receita", "Remove_nutrition_recipe": "Deletar dados nutricionais da receita",
"Reset": "Reiniciar", "Reset": "Reiniciar",
"ResetHelp": "",
"Reset_Search": "Resetar Busca", "Reset_Search": "Resetar Busca",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -170,6 +170,7 @@
"InheritWarning": "{food} este setat să moștenească, este posibil ca modificările să nu persiste.", "InheritWarning": "{food} este setat să moștenească, este posibil ca modificările să nu persiste.",
"Instruction_Replace": "Înlocuire instrucții", "Instruction_Replace": "Înlocuire instrucții",
"Instructions": "Instrucțiuni", "Instructions": "Instrucțiuni",
"InstructionsEditHelp": "",
"Internal": "Intern", "Internal": "Intern",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Invită", "Invites": "Invită",
@@ -278,6 +279,7 @@
"Ratings": "Evaluări", "Ratings": "Evaluări",
"Recently_Viewed": "Vizualizate recent", "Recently_Viewed": "Vizualizate recent",
"Recipe": "Rețetă", "Recipe": "Rețetă",
"RecipeStepsHelp": "",
"Recipe_Book": "Carte de rețete", "Recipe_Book": "Carte de rețete",
"Recipe_Image": "Imagine a rețetei", "Recipe_Image": "Imagine a rețetei",
"Recipes": "Rețete", "Recipes": "Rețete",
@@ -287,6 +289,7 @@
"RemoveFoodFromShopping": "Șterge {food} din lista de cumpărături", "RemoveFoodFromShopping": "Șterge {food} din lista de cumpărături",
"Remove_nutrition_recipe": "Ștergere a nutriției din rețetă", "Remove_nutrition_recipe": "Ștergere a nutriției din rețetă",
"Reset": "Resetare", "Reset": "Resetare",
"ResetHelp": "",
"Reset_Search": "Resetarea căutării", "Reset_Search": "Resetarea căutării",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -129,6 +129,7 @@
"InheritFields": "Наследование значений полей", "InheritFields": "Наследование значений полей",
"InheritWarning": "{food} примет предыдущие настройки, изменения не будут приняты.", "InheritWarning": "{food} примет предыдущие настройки, изменения не будут приняты.",
"Instructions": "Инструкции", "Instructions": "Инструкции",
"InstructionsEditHelp": "",
"Internal": "Внутренний", "Internal": "Внутренний",
"Invite_Link": "", "Invite_Link": "",
"Key_Ctrl": "Ctrl", "Key_Ctrl": "Ctrl",
@@ -221,6 +222,7 @@
"Ratings": "Рейтинги", "Ratings": "Рейтинги",
"Recently_Viewed": "Недавно просмотренные", "Recently_Viewed": "Недавно просмотренные",
"Recipe": "Рецепт", "Recipe": "Рецепт",
"RecipeStepsHelp": "",
"Recipe_Book": "Книга рецептов", "Recipe_Book": "Книга рецептов",
"Recipe_Image": "Изображение рецепта", "Recipe_Image": "Изображение рецепта",
"Recipes": "Рецепты", "Recipes": "Рецепты",
@@ -229,6 +231,7 @@
"RemoveFoodFromShopping": "Удалить {food} из вашего списка покупок", "RemoveFoodFromShopping": "Удалить {food} из вашего списка покупок",
"Remove_nutrition_recipe": "Уберите питательные вещества из рецепта", "Remove_nutrition_recipe": "Уберите питательные вещества из рецепта",
"Reset": "Сбросить", "Reset": "Сбросить",
"ResetHelp": "",
"Reset_Search": "Очистить строку поиска", "Reset_Search": "Очистить строку поиска",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -126,6 +126,7 @@
"InheritWarning": "{food} je nastavljena na dedovanje, spremembe morda ne bodo trajale.", "InheritWarning": "{food} je nastavljena na dedovanje, spremembe morda ne bodo trajale.",
"Instruction_Replace": "Zamenjaj Navodila", "Instruction_Replace": "Zamenjaj Navodila",
"Instructions": "Navodila", "Instructions": "Navodila",
"InstructionsEditHelp": "",
"Invite_Link": "", "Invite_Link": "",
"Key_Ctrl": "Ctrl", "Key_Ctrl": "Ctrl",
"Key_Shift": "Shift", "Key_Shift": "Shift",
@@ -213,6 +214,7 @@
"Rating": "Ocena", "Rating": "Ocena",
"Recently_Viewed": "Nazadnje videno", "Recently_Viewed": "Nazadnje videno",
"Recipe": "Recept", "Recipe": "Recept",
"RecipeStepsHelp": "",
"Recipe_Book": "Knjiga receptov", "Recipe_Book": "Knjiga receptov",
"Recipe_Image": "Slika recepta", "Recipe_Image": "Slika recepta",
"Recipes": "Recepti", "Recipes": "Recepti",
@@ -220,6 +222,7 @@
"Remove": "", "Remove": "",
"RemoveFoodFromShopping": "Odstrani {food} iz nakupovalnega listka", "RemoveFoodFromShopping": "Odstrani {food} iz nakupovalnega listka",
"Remove_nutrition_recipe": "Receptu izbriši hranilno vrednost", "Remove_nutrition_recipe": "Receptu izbriši hranilno vrednost",
"ResetHelp": "",
"Reset_Search": "Ponastavi iskalnik", "Reset_Search": "Ponastavi iskalnik",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -194,6 +194,7 @@
"Input": "Inmatning", "Input": "Inmatning",
"Instruction_Replace": "Ersätt instruktion", "Instruction_Replace": "Ersätt instruktion",
"Instructions": "Instruktioner", "Instructions": "Instruktioner",
"InstructionsEditHelp": "",
"Internal": "Intern", "Internal": "Intern",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Inbjudningar", "Invites": "Inbjudningar",
@@ -318,6 +319,7 @@
"Ratings": "Betyg", "Ratings": "Betyg",
"Recently_Viewed": "Nyligen visade", "Recently_Viewed": "Nyligen visade",
"Recipe": "Recept", "Recipe": "Recept",
"RecipeStepsHelp": "",
"Recipe_Book": "Receptbok", "Recipe_Book": "Receptbok",
"Recipe_Image": "Receptbild", "Recipe_Image": "Receptbild",
"Recipes": "Recept", "Recipes": "Recept",
@@ -327,6 +329,7 @@
"RemoveFoodFromShopping": "Ta bort {mat} från din inköpslista", "RemoveFoodFromShopping": "Ta bort {mat} från din inköpslista",
"Remove_nutrition_recipe": "Ta bort näring från receptet", "Remove_nutrition_recipe": "Ta bort näring från receptet",
"Reset": "Återställ", "Reset": "Återställ",
"ResetHelp": "",
"Reset_Search": "Rensa sök", "Reset_Search": "Rensa sök",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -193,6 +193,7 @@
"Input": "Giriş", "Input": "Giriş",
"Instruction_Replace": "Talimat Değiştir", "Instruction_Replace": "Talimat Değiştir",
"Instructions": "Talimatlar", "Instructions": "Talimatlar",
"InstructionsEditHelp": "",
"Internal": "Dahili", "Internal": "Dahili",
"Invite_Link": "", "Invite_Link": "",
"Invites": "Davetler", "Invites": "Davetler",
@@ -317,6 +318,7 @@
"Ratings": "Derecelendirmeler", "Ratings": "Derecelendirmeler",
"Recently_Viewed": "Son Görüntülenen", "Recently_Viewed": "Son Görüntülenen",
"Recipe": "Tarif", "Recipe": "Tarif",
"RecipeStepsHelp": "",
"Recipe_Book": "Yemek Tarifi Kitabı", "Recipe_Book": "Yemek Tarifi Kitabı",
"Recipe_Image": "Tarif Resmi", "Recipe_Image": "Tarif Resmi",
"Recipes": "Tarifler", "Recipes": "Tarifler",
@@ -326,6 +328,7 @@
"RemoveFoodFromShopping": "{food}'ı alışveriş listenizden çıkarın", "RemoveFoodFromShopping": "{food}'ı alışveriş listenizden çıkarın",
"Remove_nutrition_recipe": "Tariften besin değeri sil", "Remove_nutrition_recipe": "Tariften besin değeri sil",
"Reset": "Sıfırla", "Reset": "Sıfırla",
"ResetHelp": "",
"Reset_Search": "Aramayı Sıfırla", "Reset_Search": "Aramayı Sıfırla",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -153,6 +153,7 @@
"InheritWarning": "", "InheritWarning": "",
"Instruction_Replace": "Замінити Інструкцію", "Instruction_Replace": "Замінити Інструкцію",
"Instructions": "Інструкції", "Instructions": "Інструкції",
"InstructionsEditHelp": "",
"Internal": "", "Internal": "",
"Invite_Link": "", "Invite_Link": "",
"Key_Ctrl": "Ctrl", "Key_Ctrl": "Ctrl",
@@ -254,6 +255,7 @@
"Ratings": "", "Ratings": "",
"Recently_Viewed": "Нещодавно переглянуті", "Recently_Viewed": "Нещодавно переглянуті",
"Recipe": "Рецепт", "Recipe": "Рецепт",
"RecipeStepsHelp": "",
"Recipe_Book": "Книга Рецептів", "Recipe_Book": "Книга Рецептів",
"Recipe_Image": "Зображення Рецепту", "Recipe_Image": "Зображення Рецепту",
"Recipes": "Рецепти", "Recipes": "Рецепти",
@@ -263,6 +265,7 @@
"RemoveFoodFromShopping": "Видалити {food} з вашого списку покупок", "RemoveFoodFromShopping": "Видалити {food} з вашого списку покупок",
"Remove_nutrition_recipe": "Видалити харчову цінність з рецепта", "Remove_nutrition_recipe": "Видалити харчову цінність з рецепта",
"Reset": "", "Reset": "",
"ResetHelp": "",
"Reset_Search": "Скинути Пошук", "Reset_Search": "Скинути Пошук",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -189,6 +189,7 @@
"Input": "输入", "Input": "输入",
"Instruction_Replace": "替换指令", "Instruction_Replace": "替换指令",
"Instructions": "说明", "Instructions": "说明",
"InstructionsEditHelp": "",
"Internal": "内部", "Internal": "内部",
"Invite_Link": "", "Invite_Link": "",
"Invites": "邀请", "Invites": "邀请",
@@ -312,6 +313,7 @@
"Ratings": "等级", "Ratings": "等级",
"Recently_Viewed": "最近浏览", "Recently_Viewed": "最近浏览",
"Recipe": "食谱", "Recipe": "食谱",
"RecipeStepsHelp": "",
"Recipe_Book": "食谱书", "Recipe_Book": "食谱书",
"Recipe_Image": "食谱图像", "Recipe_Image": "食谱图像",
"Recipes": "食谱", "Recipes": "食谱",
@@ -321,6 +323,7 @@
"RemoveFoodFromShopping": "从购物清单中移除 {food}", "RemoveFoodFromShopping": "从购物清单中移除 {food}",
"Remove_nutrition_recipe": "从食谱中删除营养信息", "Remove_nutrition_recipe": "从食谱中删除营养信息",
"Reset": "重置", "Reset": "重置",
"ResetHelp": "",
"Reset_Search": "重置搜索", "Reset_Search": "重置搜索",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -59,6 +59,7 @@
"Import_finished": "匯入完成", "Import_finished": "匯入完成",
"Information": "", "Information": "",
"Ingredients": "", "Ingredients": "",
"InstructionsEditHelp": "",
"Invite_Link": "", "Invite_Link": "",
"Keywords": "", "Keywords": "",
"Link": "", "Link": "",
@@ -96,10 +97,12 @@
"Proteins": "", "Proteins": "",
"Rating": "", "Rating": "",
"Recently_Viewed": "", "Recently_Viewed": "",
"RecipeStepsHelp": "",
"Recipe_Image": "食譜圖片", "Recipe_Image": "食譜圖片",
"Recipes_per_page": "每頁食譜", "Recipes_per_page": "每頁食譜",
"Remove": "", "Remove": "",
"Remove_nutrition_recipe": "從食譜中刪除營養資訊", "Remove_nutrition_recipe": "從食譜中刪除營養資訊",
"ResetHelp": "",
"Reset_Search": "", "Reset_Search": "",
"Reusable": "", "Reusable": "",
"Role": "", "Role": "",

View File

@@ -1,5 +1,5 @@
<template> <template>
<v-container class="h-100 pt-0 pl-0 pn-0" fluid> <v-container class="h-100 pt-0 pl-0 pb-0" fluid>
<meal-plan-view></meal-plan-view> <meal-plan-view></meal-plan-view>
</v-container> </v-container>

View File

@@ -13,6 +13,7 @@ export const useMealPlanStore = defineStore(_STORE_ID, () => {
let plans = ref(new Map<number, MealPlan>) let plans = ref(new Map<number, MealPlan>)
let currently_updating = ref([new Date(0), new Date(0)]) let currently_updating = ref([new Date(0), new Date(0)])
const loading = ref(false)
let settings = ref({}) let settings = ref({})
const planList = computed(() => { const planList = computed(() => {
@@ -52,15 +53,17 @@ export const useMealPlanStore = defineStore(_STORE_ID, () => {
function refreshFromAPI(from_date: Date, to_date: Date) { function refreshFromAPI(from_date: Date, to_date: Date) {
if (currently_updating.value[0] !== from_date || currently_updating.value[1] !== to_date) { if (currently_updating.value[0] !== from_date || currently_updating.value[1] !== to_date) {
currently_updating.value = [from_date, to_date] // certainly no perfect check but better than nothing currently_updating.value = [from_date, to_date] // certainly no perfect check but better than nothing
loading.value = true
const api = new ApiApi() const api = new ApiApi()
return api.apiMealPlanList({fromDate: DateTime.fromJSDate(from_date).toISODate() as string, toDate: DateTime.fromJSDate(to_date).toISODate() as string}).then(r => { return api.apiMealPlanList({fromDate: DateTime.fromJSDate(from_date).toISODate() as string, toDate: DateTime.fromJSDate(to_date).toISODate() as string, pageSize: 100}).then(r => {
r.results.forEach((p) => { r.results.forEach((p) => {
plans.value.set(p.id, p) plans.value.set(p.id, p)
}) })
currently_updating.value = [new Date(0), new Date(0)] currently_updating.value = [new Date(0), new Date(0)]
}).catch((err) => { }).catch((err) => {
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err) useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
}).finally(() => {
loading.value = false
}) })
} }
return new Promise(() => { return new Promise(() => {
@@ -77,20 +80,23 @@ export const useMealPlanStore = defineStore(_STORE_ID, () => {
function createObject(object: MealPlan) { function createObject(object: MealPlan) {
const api = new ApiApi() const api = new ApiApi()
loading.value = true
return api.apiMealPlanCreate({mealPlan: object}).then((r) => { return api.apiMealPlanCreate({mealPlan: object}).then((r) => {
useMessageStore().addMessage(MessageType.SUCCESS, 'Created successfully', 7000, object) useMessageStore().addMessage(MessageType.SUCCESS, 'Created successfully', 7000, object)
plans.value.set(r.id, r) plans.value.set(r.id!, r)
return r return r
}).catch((err) => { }).catch((err) => {
useMessageStore().addError(ErrorMessageType.CREATE_ERROR, err) useMessageStore().addError(ErrorMessageType.CREATE_ERROR, err)
}).finally(() => {
loading.value = false
}) })
} }
function updateObject(object: MealPlan) { function updateObject(object: MealPlan) {
const api = new ApiApi() const api = new ApiApi()
return api.apiMealPlanUpdate({id: object.id, mealPlan: object}).then((r) => { return api.apiMealPlanUpdate({id: object.id!, mealPlan: object}).then((r) => {
useMessageStore().addMessage(MessageType.SUCCESS, 'Updated successfully', 7000, object) useMessageStore().addMessage(MessageType.SUCCESS, 'Updated successfully', 7000, object)
plans.value.set(r.id, r) plans.value.set(r.id!, r)
}).catch((err) => { }).catch((err) => {
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err) useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
}) })
@@ -98,11 +104,14 @@ export const useMealPlanStore = defineStore(_STORE_ID, () => {
function deleteObject(object: MealPlan) { function deleteObject(object: MealPlan) {
const api = new ApiApi() const api = new ApiApi()
return api.apiMealPlanDestroy({id: object.id}).then((r) => { loading.value = true
return api.apiMealPlanDestroy({id: object.id!}).then((r) => {
useMessageStore().addMessage(MessageType.INFO, 'Deleted successfully', 7000, object) useMessageStore().addMessage(MessageType.INFO, 'Deleted successfully', 7000, object)
plans.value.delete(object.id) plans.value.delete(object.id!)
}).catch((err) => { }).catch((err) => {
useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err) useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err)
}).finally(() => {
loading.value = false
}) })
} }
@@ -124,7 +133,7 @@ export const useMealPlanStore = defineStore(_STORE_ID, () => {
// return JSON.parse(s) // return JSON.parse(s)
// } // }
// } // }
return {plans, currently_updating, planList, refreshFromAPI, createObject, updateObject, deleteObject, createOrUpdate} return {plans, currently_updating, planList, loading, refreshFromAPI, createObject, updateObject, deleteObject, createOrUpdate}
}) })
// enable hot reload for store // enable hot reload for store

View File

@@ -26,6 +26,7 @@ class DeviceSettings {
mealplan_displayWeekNumbers = true mealplan_displayWeekNumbers = true
general_tableItemsPerPage = 10 general_tableItemsPerPage = 10
general_closedHelpAlerts: String[] = []
} }
export const useUserPreferenceStore = defineStore('user_preference_store', () => { export const useUserPreferenceStore = defineStore('user_preference_store', () => {