food editor WIP

This commit is contained in:
vabene1111
2024-09-22 12:31:59 +02:00
parent a173e66a59
commit 73e4f22256
40 changed files with 523 additions and 147 deletions

View File

@@ -4,6 +4,7 @@
<invite-link-editor :item="item" @create="createEvent" @save="saveEvent" @delete="deleteEvent" dialog @close="dialog = false" v-if="model == SupportedModels.InviteLink"></invite-link-editor>
<user-space-editor :item="item" @create="createEvent" @save="saveEvent" @delete="deleteEvent" dialog @close="dialog = false" v-if="model == SupportedModels.UserSpace"></user-space-editor>
<meal-type-editor :item="item" @create="createEvent" @save="saveEvent" @delete="deleteEvent" dialog @close="dialog = false" v-if="model == SupportedModels.MealType"></meal-type-editor>
<property-editor :item="item" @create="createEvent" @save="saveEvent" @delete="deleteEvent" dialog @close="dialog = false" v-if="model == SupportedModels.Property"></property-editor>
</v-dialog>
</template>
@@ -16,12 +17,14 @@ import {AccessToken, Food} from "@/openapi";
import InviteLinkEditor from "@/components/model_editors/InviteLinkEditor.vue";
import UserSpaceEditor from "@/components/model_editors/UserSpaceEditor.vue";
import MealTypeEditor from "@/components/model_editors/MealTypeEditor.vue";
import PropertyEditor from "@/components/model_editors/PropertyEditor.vue";
enum SupportedModels {
AccessToken = 'AccessToken',
InviteLink = 'InviteLink',
UserSpace = 'UserSpace',
MealType = 'MealType',
Property = 'Property',
}
const emit = defineEmits(['create', 'save', 'delete'])

View File

@@ -1,9 +1,10 @@
<template>
<v-input :hint="hint" persistent-hint :label="label">
<!-- TODO label is not showing for some reason, for now in placeholder -->
<!-- TODO support density prop -->
<v-input :hint="hint" persistent-hint :label="label" class="">
<!-- TODO resolve-on-load false for now, race condition with model class, make prop once better solution is found -->
<!-- TODO strange behavior/layering issues with appendTo body, find solution to make it work -->
<!-- TODO label is not showing for some reason -->
<Multiselect
:id="id"
@@ -24,7 +25,7 @@
:can-clear="canClear"
:can-deselect="canClear"
:limit="limit"
:placeholder="$t('Search')"
:placeholder="label"
:noOptionsText="$t('No_Results')"
:noResultsText="$t('No_Results')"
/>

View File

@@ -1,13 +1,77 @@
<template>
<v-card>
<v-card-title>
{{ $t(OBJ_LOCALIZATION_KEY) }}
{{ $t(OBJ_LOCALIZATION_KEY) }} <span class="text-disabled">{{ editingObj.name }}</span>
<v-btn class="float-right" icon="$close" variant="plain" @click="emit('close')" v-if="dialog"></v-btn>
</v-card-title>
<v-tabs v-model="tab">
<v-tab value="food">{{ $t('Food') }}</v-tab>
<v-tab value="properties">{{ $t('Properties') }}</v-tab>
<v-tab value="conversions">{{ $t('Conversion') }}</v-tab>
<v-tab value="misc">{{ $t('Miscellaneous') }}</v-tab>
</v-tabs>
<v-card-text>
<v-form>
<v-text-field v-model="editingObj.name"></v-text-field>
</v-form>
<v-tabs-window v-model="tab">
<v-tabs-window-item value="food">
<v-form>
<v-text-field :label="$t('Name')" v-model="editingObj.name"></v-text-field>
<v-text-field :label="$t('Plural')" v-model="editingObj.pluralName"></v-text-field>
<v-textarea :label="$t('Description')" v-model="editingObj.description"></v-textarea>
<!-- TODO fix card overflow invisible, overflow-visible class is not working -->
<model-select :label="$t('Category')" v-model="editingObj.supermarketCategory" model="SupermarketCategory"></model-select>
</v-form>
</v-tabs-window-item>
<v-tabs-window-item value="properties">
<v-alert icon="$help">{{ $t('PropertiesFoodHelp') }}</v-alert>
<v-form class="mt-5">
<v-number-input :label="$t('Properties_Food_Amount')" v-model="editingObj.propertiesFoodAmount"></v-number-input>
<model-select :label="$t('Properties_Food_Unit')" v-model="editingObj.propertiesFoodUnit" model="Unit"></model-select>
<v-btn-group density="compact">
<v-btn color="create" @click="editingObj.properties.push({} as Property)" prepend-icon="$create">{{ $t('Add') }}</v-btn>
<v-btn color="secondary" @click="addAllProperties" prepend-icon="fa-solid fa-list">{{ $t('AddAll') }}</v-btn>
</v-btn-group>
<v-row class="mt-2" v-for="p in editingObj.properties" dense>
<v-col cols="0" md="5">
<v-number-input :step="10" v-model="p.propertyAmount" control-variant="stacked">
<template #append-inner v-if="p.propertyType">
<v-chip class="me-4">{{ p.propertyType.unit }} / {{ editingObj.propertiesFoodAmount }} <span v-if="editingObj.propertiesFoodUnit">&nbsp;{{
editingObj.propertiesFoodUnit.name
}}</span>
</v-chip>
</template>
</v-number-input>
</v-col>
<v-col cols="0" md="6">
<!-- TODO fix card overflow invisible, overflow-visible class is not working -->
<model-select :label="$t('Property')" v-model="p.propertyType" model="PropertyType"></model-select>
</v-col>
<v-col cols="0" md="1">
<v-btn color="delete" @click="deleteFoodProperty(p)">
<v-icon icon="$delete"></v-icon>
</v-btn>
</v-col>
</v-row>
<v-list >
<v-list-item v-for="p in editingObj.properties" border>
<span v-if="p.propertyType">{{ p.propertyAmount }} {{p.propertyType.unit}} {{p.propertyType.name}}
<span v-if="editingObj.propertiesFoodUnit"> / {{ editingObj.propertiesFoodAmount }} {{ editingObj.propertiesFoodUnit.name }}</span>
</span>
<span v-else><i><{{$t('New')}}></i></span>
<template #append>
<v-btn color="edit"><v-icon icon="$edit"></v-icon>
<model-editor-dialog model="Property" :item="p"></model-editor-dialog>
</v-btn>
</template>
</v-list-item>
</v-list>
</v-form>
</v-tabs-window-item>
</v-tabs-window>
</v-card-text>
<v-card-actions>
<v-btn color="delete" prepend-icon="$delete" v-if="isUpdate">{{ $t('Delete') }}
@@ -20,11 +84,14 @@
<script setup lang="ts">
import {computed, onMounted, ref} from "vue";
import {ApiApi, Food} from "@/openapi";
import {computed, onMounted, Prop, ref} from "vue";
import {ApiApi, Food, Property, Unit} from "@/openapi";
import DeleteConfirmDialog from "@/components/dialogs/DeleteConfirmDialog.vue";
import {useI18n} from "vue-i18n";
import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/MessageStore";
import ModelSelect from "@/components/inputs/ModelSelect.vue";
import {VNumberInput} from 'vuetify/labs/VNumberInput'
import ModelEditorDialog from "@/components/dialogs/ModelEditorDialog.vue"; //TODO remove once component is out of labs
const {t} = useI18n()
@@ -40,6 +107,14 @@ const OBJ_LOCALIZATION_KEY = 'Food'
const editingObj = ref({} as Food)
const loading = ref(false)
// object specific data (for selects/display)
const tab = ref("properties")
const propertyTableHeaders = ref([
{title: t('Amount'), key: 'propertyAmount'},
{title: t('Type'), key: 'propertyType'},
{title: t('Delete'), key: 'action', align: 'end'},
])
/**
* checks if given object has ID property to determine if it needs to be updated or created
*/
@@ -57,7 +132,7 @@ const objectName = computed(() => {
onMounted(() => {
if (props.item != null) {
editingObj.value = props.item
} else if(props.itemId != null){
} else if (props.itemId != null) {
const api = new ApiApi()
api.apiFoodRetrieve({id: props.itemId}).then(r => {
editingObj.value = r
@@ -66,7 +141,8 @@ onMounted(() => {
})
} else {
// functions to populate defaults for new item
editingObj.value.propertiesFoodAmount = 100
editingObj.value.propertiesFoodUnit = {name: 'g'} as Unit // TODO properly fetch default unit
}
})
@@ -76,7 +152,7 @@ onMounted(() => {
async function saveObject() {
let api = new ApiApi()
if (isUpdate.value) {
api.apiFoodUpdate({id: editingObj.value.id, accessToken: editingObj.value}).then(r => {
api.apiFoodUpdate({id: editingObj.value.id, food: editingObj.value}).then(r => {
editingObj.value = r
emit('save', r)
useMessageStore().addPreparedMessage(PreparedMessage.UPDATE_SUCCESS)
@@ -84,7 +160,7 @@ async function saveObject() {
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
})
} else {
api.apiFoodCreate({accessToken: editingObj.value}).then(r => {
api.apiFoodCreate({food: editingObj.value}).then(r => {
editingObj.value = r
emit('create', r)
useMessageStore().addPreparedMessage(PreparedMessage.CREATE_SUCCESS)
@@ -107,6 +183,34 @@ async function deleteObject() {
})
}
// ------------------------------------------------------
// object specific functions
// ------------------------------------------------------
/**
* load list of property types from server and add all types that are not yet linked
* to the given food to its properties
*/
function addAllProperties() {
const api = new ApiApi()
api.apiPropertyTypeList().then(r => {
r.results.forEach(pt => {
if (editingObj.value.properties.findIndex(x => x.propertyType.name == pt.name) == -1) {
editingObj.value.properties.push({propertyAmount: 0, propertyType: pt} as Property)
}
})
})
}
/**
* remove property from food
* //TODO also delete relation in database
* @param property property to delete
*/
function deleteFoodProperty(property: Property) {
editingObj.value.properties = editingObj.value.properties.filter(p => p !== property)
}
</script>
<style scoped>

View File

@@ -0,0 +1,133 @@
<template>
<v-card>
<v-card-title>
{{ $t(OBJ_LOCALIZATION_KEY) }}
<v-btn class="float-right" icon="$close" variant="plain" @click="emit('close')" v-if="dialog"></v-btn>
</v-card-title>
<v-card-text>
<v-form>
<v-number-input :step="10" v-model="editingObj.propertyAmount" control-variant="stacked">
<template #append-inner v-if="editingObj.propertyType">
<v-chip class="me-4">{{ editingObj.propertyType.unit }}</v-chip>
</template>
</v-number-input>
<model-select :label="$t('Property')" v-model="editingObj.propertyType" model="PropertyType"></model-select>
</v-form>
</v-card-text>
<v-card-actions>
<v-btn color="delete" prepend-icon="$delete" v-if="isUpdate">{{ $t('Delete') }}
<delete-confirm-dialog :object-name="objectName" @delete="deleteObject"></delete-confirm-dialog>
</v-btn>
<v-btn color="save" prepend-icon="$save" @click="saveObject">{{ isUpdate ? $t('Save') : $t('Create') }}</v-btn>
</v-card-actions>
</v-card>
</template>
<script setup lang="ts">
import {computed, onMounted, ref} from "vue";
import {ApiApi, Property} from "@/openapi";
import DeleteConfirmDialog from "@/components/dialogs/DeleteConfirmDialog.vue";
import {useI18n} from "vue-i18n";
import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/MessageStore";
import ModelSelect from "@/components/inputs/ModelSelect.vue";
import {VNumberInput} from 'vuetify/labs/VNumberInput' //TODO remove once component is out of labs
const {t} = useI18n()
const emit = defineEmits(['create', 'save', 'delete', 'close'])
const props = defineProps({
item: {type: {} as Property, required: false},
itemId: {type: String, required: false},
dialog: {type: Boolean, default: false}
})
const OBJ_LOCALIZATION_KEY = 'Food'
const editingObj = ref({} as Property)
const loading = ref(false)
// object specific data (for selects/display)
/**
* checks if given object has ID property to determine if it needs to be updated or created
*/
const isUpdate = computed(() => {
return Object.keys(editingObj.value).length > 0
})
/**
* display name for object in headers/delete dialog/...
*/
const objectName = computed(() => {
return isUpdate ? `${t(OBJ_LOCALIZATION_KEY)} ${editingObj.value.token}` : `${t(OBJ_LOCALIZATION_KEY)} (${t('New')})`
})
onMounted(() => {
if (props.item != null) {
editingObj.value = props.item
} else if (props.itemId != null) {
const api = new ApiApi()
api.apiPropertyRetrieve({id: props.itemId}).then(r => {
editingObj.value = r
}).catch(err => {
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
})
} else {
// functions to populate defaults for new item
}
})
/**
* saves the edited object in the database
*/
async function saveObject() {
let api = new ApiApi()
if (isUpdate.value) {
api.apiPropertyUpdate({id: editingObj.value.id, property: editingObj.value}).then(r => {
editingObj.value = r
emit('save', r)
useMessageStore().addPreparedMessage(PreparedMessage.UPDATE_SUCCESS)
}).catch(err => {
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
})
} else {
api.apiPropertyCreate({property: editingObj.value}).then(r => {
editingObj.value = r
emit('create', r)
useMessageStore().addPreparedMessage(PreparedMessage.CREATE_SUCCESS)
}).catch(err => {
useMessageStore().addError(ErrorMessageType.CREATE_ERROR, err)
})
}
}
/**
* deletes the editing object from the database
*/
async function deleteObject() {
if (editingObj.value.id !== undefined) {
let api = new ApiApi()
api.apiPropertyDestroy({id: editingObj.value.id}).then(r => {
editingObj.value = {} as Property
emit('delete', editingObj.value)
}).catch(err => {
useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err)
})
} else {
editingObj.value = {} as Property
emit('delete', editingObj.value)
}
}
// ------------------------------------------------------
// object specific functions
// ------------------------------------------------------
</script>
<style scoped>
</style>

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "",
"AddAll": "",
"AddFoodToShopping": "",
"AddToShopping": "",
"Add_Servings_to_Shopping": "",
@@ -147,6 +148,7 @@
"Merge": "",
"Merge_Keyword": "",
"Message": "",
"Miscellaneous": "",
"Monday": "",
"Month": "",
"Move": "",
@@ -201,6 +203,7 @@
"Previous_Period": "",
"Print": "",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "",
"Proteins": "",
"Quick actions": "",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "Добави",
"AddAll": "",
"AddFoodToShopping": "Добавете {food} към списъка си за пазаруване",
"AddToShopping": "Добавяне към списъка за пазаруване",
"Add_Servings_to_Shopping": "Добавете {servings} порции към Пазаруване",
@@ -141,6 +142,7 @@
"Meal_Types": "Видове хранене",
"Merge": "Обединяване",
"Merge_Keyword": "Обединяване на ключова дума",
"Miscellaneous": "",
"Monday": "",
"Month": "Месец",
"Move": "Премести",
@@ -194,6 +196,7 @@
"Previous_Period": "Предишен период",
"Print": "Печат",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "Защитен",
"Proteins": "Протеини (белтъчини)",
"Quick actions": "Бързи действия",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "",
"Add": "",
"AddAll": "",
"AddFoodToShopping": "",
"AddToShopping": "",
"Add_Servings_to_Shopping": "",
@@ -197,6 +198,7 @@
"Merge": "",
"Merge_Keyword": "Fusioneu paraula clau",
"Message": "",
"Miscellaneous": "",
"Monday": "",
"Month": "",
"Move": "",
@@ -267,6 +269,7 @@
"Private_Recipe_Help": "Només tu i la gent amb qui l'has compartit podran veure aquesta recepta.",
"Profile": "",
"Properties": "",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "",
"Properties_Food_Unit": "",
"Property": "",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Účet",
"Add": "Přidat",
"AddAll": "",
"AddFoodToShopping": "Přidat {food} na váš nákupní seznam",
"AddToShopping": "Přidat do nákupního seznamu",
"Add_Servings_to_Shopping": "Přidat {servings} porce na nákupní seznam",
@@ -196,6 +197,7 @@
"Merge": "Spojit",
"Merge_Keyword": "Sloučit štítek",
"Message": "Zpráva",
"Miscellaneous": "",
"Monday": "",
"Month": "Měsíc",
"Move": "Přesunout",
@@ -265,6 +267,7 @@
"Private_Recipe_Help": "Recept můžete zobrazit pouze vy a lidé, se kterými jej sdílíte.",
"Profile": "",
"Properties": "Nutriční vlastnosti",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "Množství nutriční vlastnosti",
"Properties_Food_Unit": "Jednotka nutriční vlastnosti",
"Property": "Nutriční vlastnost",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Bruger",
"Add": "Tilføj",
"AddAll": "",
"AddFoodToShopping": "Tilføj {food} til indkøbsliste",
"AddToShopping": "Tilføj til indkøbsliste",
"Add_Servings_to_Shopping": "Tilføj {servings} serveringer til indkøb",
@@ -183,6 +184,7 @@
"Merge": "Sammenflet",
"Merge_Keyword": "Sammenflet nøgleord",
"Message": "Besked",
"Miscellaneous": "",
"Monday": "",
"Month": "Måned",
"Move": "Flyt",
@@ -250,6 +252,7 @@
"Private_Recipe_Help": "Opskriften er kun synlig for dig, og dem som den er delt med.",
"Profile": "",
"Properties": "Egenskaber",
"PropertiesFoodHelp": "",
"Property": "Egenskab",
"Protected": "Beskyttet",
"Proteins": "Proteiner",

View File

@@ -3,6 +3,7 @@
"Access_Token": "Zugriffstoken",
"Account": "Konto",
"Add": "Hinzufügen",
"AddAll": "Alle Hinzufügen",
"AddFoodToShopping": "Fügen Sie {food} zur Einkaufsliste hinzu",
"AddToShopping": "Zur Einkaufsliste hinzufügen",
"Add_Servings_to_Shopping": "{servings} Portionen zum Einkauf hinzufügen",
@@ -199,6 +200,7 @@
"Merge": "Zusammenführen",
"Merge_Keyword": "Schlagworte zusammenführen",
"Message": "Nachricht",
"Miscellaneous": "Sonstige",
"Monday": "Montag",
"Month": "Monat",
"Move": "Verschieben",
@@ -269,6 +271,7 @@
"Private_Recipe_Help": "Dieses Rezept ist nur für dich und Personen mit denen du es geteilt hast sichtbar.",
"Profile": "Profil",
"Properties": "Eigenschaften",
"PropertiesFoodHelp": "Jedes Lebensmittel kann Eigenschaften zugeordnet bekommen. Rezepte berechnen die Summe der Eigenschaften basierend auf den verwendeten Lebensmitteln und Ihren Mengen.",
"Properties_Food_Amount": "Eigenschaften: Lebensmittelmenge",
"Properties_Food_Unit": "Nährwert Einheit",
"Property": "Eigenschaft",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Λογαριασμός",
"Add": "Προσθήκη",
"AddAll": "",
"AddFoodToShopping": "Προσθήκη του φαγητού {food} στη λίστα αγορών σας",
"AddToShopping": "Προσθήκη στη λίστα αγορών",
"Add_Servings_to_Shopping": "Προσθήκη {servings} μερίδων στις αγορές",
@@ -178,6 +179,7 @@
"Merge": "Συγχώνευση",
"Merge_Keyword": "Συγχώνευση λέξης-κλειδί",
"Message": "Μήνυμα",
"Miscellaneous": "",
"Monday": "",
"Month": "Μήνας",
"Move": "Μετακίνηση",
@@ -242,6 +244,7 @@
"Private_Recipe_Help": "Η συνταγή είναι ορατή μόνο σε εσάς και στα άτομα με τα οποία την μοιράζεστε.",
"Profile": "",
"Properties": "Ιδιότητες",
"PropertiesFoodHelp": "",
"Property": "Ιδιότητα",
"Protected": "Προστατευμένο",
"Proteins": "Πρωτεΐνες",

View File

@@ -3,6 +3,7 @@
"Access_Token": "Access Token",
"Account": "Account",
"Add": "Add",
"AddAll": "Add all",
"AddFoodToShopping": "Add {food} to your shopping list",
"AddToShopping": "Add to shopping list",
"Add_Servings_to_Shopping": "Add {servings} Servings to Shopping",
@@ -199,6 +200,7 @@
"Merge": "Merge",
"Merge_Keyword": "Merge Keyword",
"Message": "Message",
"Miscellaneous": "Miscellaneous",
"Monday": "Monday",
"Month": "Month",
"Move": "Move",
@@ -270,6 +272,7 @@
"Private_Recipe_Help": "Recipe is only shown to you and people its shared with.",
"Profile": "Profile",
"Properties": "Properties",
"PropertiesFoodHelp": "Every food can have properties. Recipes calculate the properties automatically, based on the properties of their foods and the amount given in the ingredients.",
"Properties_Food_Amount": "Properties Food Amount",
"Properties_Food_Unit": "Properties Food Unit",
"Property": "Property",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Cuenta",
"Add": "Añadir",
"AddAll": "",
"AddFoodToShopping": "Añadir {food} a la lista de la compra",
"AddToShopping": "Añadir a la lista de la compra",
"Add_Servings_to_Shopping": "Añadir {servings} raciones a la compra",
@@ -198,6 +199,7 @@
"Merge": "Unificar",
"Merge_Keyword": "Fusionar palabra clave",
"Message": "Mensaje",
"Miscellaneous": "",
"Monday": "",
"Month": "Mes",
"Move": "Mover",
@@ -268,6 +270,7 @@
"Private_Recipe_Help": "La receta solo podrás verla tu y la gente con la que esta compartida.",
"Profile": "",
"Properties": "Propiedades",
"PropertiesFoodHelp": "",
"Property": "Propiedad",
"Property_Editor": "Editor de Propiedades",
"Protected": "Protegido",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "Lisää",
"AddAll": "",
"Add_Step": "Lisää Vaihe",
"Add_nutrition_recipe": "Lisää ravintoaine reseptiin",
"Add_to_Plan": "Lisää suunnitelmaan",
@@ -96,6 +97,7 @@
"Meal_Types": "Ateriatyypit",
"Merge": "Yhdistä",
"Merge_Keyword": "Yhdistä Avainsana",
"Miscellaneous": "",
"Monday": "",
"Month": "Kuukausi",
"Move": "Siirry",
@@ -135,6 +137,7 @@
"Previous_Period": "Edellinen Jakso",
"Print": "Tulosta",
"Profile": "",
"PropertiesFoodHelp": "",
"Proteins": "Proteiinit",
"Rating": "Luokitus",
"Recently_Viewed": "Äskettäin katsotut",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Compte",
"Add": "Ajouter",
"AddAll": "",
"AddFoodToShopping": "Ajouter laliment {food} à votre liste de courses",
"AddToShopping": "Ajouter à la liste de courses",
"Add_Servings_to_Shopping": "Ajouter {servings} portions aux courses",
@@ -197,6 +198,7 @@
"Merge": "Fusionner",
"Merge_Keyword": "Fusionner le mot-clé",
"Message": "Message",
"Miscellaneous": "",
"Monday": "",
"Month": "Mois",
"Move": "Déplacer",
@@ -267,6 +269,7 @@
"Private_Recipe_Help": "La recette est uniquement visible par vous et les gens avec qui elle est partagée.",
"Profile": "",
"Properties": "Propriétés",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "Propriété Quantité de nourriture",
"Properties_Food_Unit": "Propriété Unité de nourriture",
"Property": "Propriété",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "חשבון",
"Add": "הוספה",
"AddAll": "",
"AddFoodToShopping": "הוסף {מזון} לרשימת הקניות",
"AddToShopping": "הוסף לרשימת קניות",
"Add_Servings_to_Shopping": "הוסף{מנה}מנות לקנייה",
@@ -198,6 +199,7 @@
"Merge": "איחוד",
"Merge_Keyword": "איחוד מילת מפתח",
"Message": "הודעה",
"Miscellaneous": "",
"Monday": "",
"Month": "חודש",
"Move": "העברה",
@@ -268,6 +270,7 @@
"Private_Recipe_Help": "המתכון מוצג רק לך ולאנשים ששותפו.",
"Profile": "",
"Properties": "ערכים",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "הגדרות כמות אוכל",
"Properties_Food_Unit": "הגדרות יחידת אוכל",
"Property": "נכס",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Fiók",
"Add": "Hozzáadás",
"AddAll": "",
"AddFoodToShopping": "{food} hozzáadása bevásárlólistához",
"AddToShopping": "Hozzáadás a bevásárlólistához",
"Add_Servings_to_Shopping": "",
@@ -179,6 +180,7 @@
"Merge": "Összefűzés",
"Merge_Keyword": "Kulcsszó összevonása",
"Message": "Üzenet",
"Miscellaneous": "",
"Monday": "",
"Month": "Hónap",
"Move": "Mozgatás",
@@ -244,6 +246,7 @@
"Private_Recipe_Help": "A recept csak Önnek és azoknak az embereknek jelenik meg, akikkel megosztotta.",
"Profile": "",
"Properties": "Tulajdonságok",
"PropertiesFoodHelp": "",
"Property": "Tulajdonság",
"Protected": "Védett",
"Proteins": "Fehérjék",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "",
"AddAll": "",
"Add_nutrition_recipe": "Ավելացնել սննդայնություն բաղադրատոմսին",
"Add_to_Book": "",
"Add_to_Plan": "Ավելացնել պլանին",
@@ -61,6 +62,7 @@
"Meal_Plan": "Ճաշացուցակ",
"Merge": "Միացնել",
"Merge_Keyword": "Միացնել բանալի բառը",
"Miscellaneous": "",
"Monday": "",
"Move": "Տեղափոխել",
"Move_Food": "Տեղափոխել սննդամթերքը",
@@ -81,6 +83,7 @@
"Preparation": "",
"Print": "Տպել",
"Profile": "",
"PropertiesFoodHelp": "",
"Proteins": "",
"Rating": "",
"Recently_Viewed": "Վերջերս դիտած",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "",
"Add": "Tambahkan",
"AddAll": "",
"AddFoodToShopping": "",
"AddToShopping": "",
"Add_Servings_to_Shopping": "",
@@ -164,6 +165,7 @@
"Merge": "Menggabungkan",
"Merge_Keyword": "Gabungkan Kata Kunci",
"Message": "",
"Miscellaneous": "",
"Monday": "",
"Month": "",
"Move": "Bergerak",
@@ -221,6 +223,7 @@
"Private_Recipe": "Resep Pribadi",
"Private_Recipe_Help": "Resep hanya diperlihatkan kepada Anda dan orang-orang yang dibagikan resep tersebut.",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "Terlindung",
"Proteins": "Protein",
"Quick actions": "",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "",
"Add": "",
"AddAll": "",
"AddFoodToShopping": "",
"AddToShopping": "",
"Add_Servings_to_Shopping": "",
@@ -197,6 +198,7 @@
"Merge": "",
"Merge_Keyword": "",
"Message": "",
"Miscellaneous": "",
"Monday": "",
"Month": "",
"Move": "",
@@ -267,6 +269,7 @@
"Private_Recipe_Help": "",
"Profile": "",
"Properties": "",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "",
"Properties_Food_Unit": "",
"Property": "",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Account",
"Add": "Aggiungi",
"AddAll": "",
"AddFoodToShopping": "Aggiungi {food} alla tua lista della spesa",
"AddToShopping": "Aggiungi a lista della spesa",
"Add_Servings_to_Shopping": "Aggiungi {servings} porzioni alla spesa",
@@ -169,6 +170,7 @@
"Merge": "Unisci",
"Merge_Keyword": "Unisci parola chiave",
"Message": "Messaggio",
"Miscellaneous": "",
"Monday": "",
"Month": "Mese",
"Move": "Sposta",
@@ -229,6 +231,7 @@
"Private_Recipe": "Ricetta privata",
"Private_Recipe_Help": "La ricetta viene mostrata solo a te e a chi l'hai condivisa.",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "Protetto",
"Proteins": "Proteine",
"Quick actions": "Azioni rapide",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "",
"Add": "",
"AddAll": "",
"AddFoodToShopping": "",
"AddToShopping": "",
"Add_Servings_to_Shopping": "",
@@ -181,6 +182,7 @@
"Merge": "",
"Merge_Keyword": "Sujungti raktažodį",
"Message": "",
"Miscellaneous": "",
"Monday": "",
"Month": "",
"Move": "",
@@ -248,6 +250,7 @@
"Private_Recipe_Help": "",
"Profile": "",
"Properties": "",
"PropertiesFoodHelp": "",
"Property": "",
"Protected": "",
"Proteins": "",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "",
"Add": "Legg til",
"AddAll": "",
"AddFoodToShopping": "Legg til {food] i handlelisten din",
"AddToShopping": "Legg til i handleliste",
"Add_Servings_to_Shopping": "Legg til {servings} serveringer i handlelisten",
@@ -176,6 +177,7 @@
"Merge": "Slå sammen",
"Merge_Keyword": "Slå sammen nøkkelord",
"Message": "Melding",
"Miscellaneous": "",
"Monday": "",
"Month": "Måned",
"Move": "Flytt",
@@ -240,6 +242,7 @@
"Private_Recipe_Help": "Oppskriften er bare vist til deg og dem du har delt den med.",
"Profile": "",
"Properties": "Egenskaper",
"PropertiesFoodHelp": "",
"Property": "Egenskap",
"Protected": "Beskyttet",
"Proteins": "Protein",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Account",
"Add": "Voeg toe",
"AddAll": "",
"AddFoodToShopping": "Voeg {food} toe aan je boodschappenlijst",
"AddToShopping": "Voeg toe aan boodschappenlijst",
"Add_Servings_to_Shopping": "Voeg {servings} porties toe aan Winkelen",
@@ -180,6 +181,7 @@
"Merge": "Samenvoegen",
"Merge_Keyword": "Voeg Etiket samen",
"Message": "Bericht",
"Miscellaneous": "",
"Monday": "",
"Month": "Maand",
"Move": "Verplaats",
@@ -244,6 +246,7 @@
"Private_Recipe_Help": "Recept is alleen zichtbaar voor jou en de mensen waar je het mee gedeeld hebt.",
"Profile": "",
"Properties": "Eigenschappen",
"PropertiesFoodHelp": "",
"Property": "Eigenschap",
"Protected": "Beschermd",
"Proteins": "Eiwitten",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Konto",
"Add": "Dodaj",
"AddAll": "",
"AddFoodToShopping": "Dodaj {food} do swojej listy zakupów",
"AddToShopping": "Dodaj do listy zakupów",
"Add_Servings_to_Shopping": "Dodaj {servings} porcje do zakupów",
@@ -199,6 +200,7 @@
"Merge": "Scal",
"Merge_Keyword": "Scal słowa kluczowe",
"Message": "Wiadomość",
"Miscellaneous": "",
"Monday": "",
"Month": "Miesiąc",
"Move": "Przenieś",
@@ -269,6 +271,7 @@
"Private_Recipe_Help": "Przepis jest widoczny tylko dla Ciebie i dla osób, którym jest udostępniany.",
"Profile": "",
"Properties": "Właściwości",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "Właściwości ilości żywności",
"Properties_Food_Unit": "Właściwości jednostek żywności",
"Property": "Właściwość",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "Adicionar",
"AddAll": "",
"AddFoodToShopping": "Adicionar {food} à sua lista de compras",
"AddToShopping": "Adicionar á lista de compras",
"Add_Servings_to_Shopping": "Adicionar {servings} doses ás compras",
@@ -138,6 +139,7 @@
"Meal_Types": "Tipos de refeições",
"Merge": "Juntar",
"Merge_Keyword": "Unir palavra-chave",
"Miscellaneous": "",
"Monday": "",
"Month": "Mês",
"Move": "Mover",
@@ -191,6 +193,7 @@
"Private_Recipe": "Receita Privada",
"Private_Recipe_Help": "A receita só é mostrada ás pessoas com que foi partilhada.",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "Protegido",
"Proteins": "Proteínas",
"Quick actions": "Acções Rápidas",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Conta",
"Add": "Adicionar",
"AddAll": "",
"AddFoodToShopping": "Incluir {food} na sua lista de compras",
"AddToShopping": "Incluir na Lista de Compras",
"Add_Servings_to_Shopping": "Adicionar {servings} porções às compras",
@@ -191,6 +192,7 @@
"Merge": "Mesclar",
"Merge_Keyword": "Mesclar palavra-chave",
"Message": "Mensagem",
"Miscellaneous": "",
"Monday": "",
"Month": "Mês",
"Move": "Mover",
@@ -256,6 +258,7 @@
"Private_Recipe_Help": "Receita é visível somente para você e para pessoas compartilhadas.",
"Profile": "",
"Properties": "Propriedades",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "Quantidade de Alimento das Propriedades",
"Properties_Food_Unit": "Unidade de Alimento das Propriedades",
"Property": "Propriedade",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Cont",
"Add": "Adaugă",
"AddAll": "",
"AddFoodToShopping": "Adăugă {food} în lista de cumpărături",
"AddToShopping": "Adaugă la lista de cumpărături",
"Add_Servings_to_Shopping": "Adăugă {servings} porții la cumpărături",
@@ -173,6 +174,7 @@
"Merge": "Unire",
"Merge_Keyword": "Unește cuvânt cheie",
"Message": "Mesaj",
"Miscellaneous": "",
"Monday": "",
"Month": "Lună",
"Move": "Mută",
@@ -233,6 +235,7 @@
"Private_Recipe": "Rețetă privată",
"Private_Recipe_Help": "Rețeta este arătată doar ție și oamenilor cu care este împărtășită.",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "Protejat",
"Proteins": "Proteine",
"Quick actions": "Acțiuni rapide",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "Добавить",
"AddAll": "",
"AddFoodToShopping": "Добавить {food} в ваш список покупок",
"AddToShopping": "Добавить в лист покупок",
"Add_Servings_to_Shopping": "Добавить {servings} порции в список покупок",
@@ -127,6 +128,7 @@
"Meal_Types": "Типы питания",
"Merge": "Объединить",
"Merge_Keyword": "Объеденить ключевые слова",
"Miscellaneous": "",
"Monday": "",
"Month": "Месяц",
"Move": "Переместить",
@@ -177,6 +179,7 @@
"Previous_Period": "Предыдущий период",
"Print": "Распечатать",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "Защищено",
"Proteins": "Белки",
"Quick actions": "Быстрые действия",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "Dodaj",
"AddAll": "",
"AddFoodToShopping": "Dodaj {food} v nakupovalni listek",
"AddToShopping": "Dodaj nakupovlanemu listku",
"Add_Step": "Dodaj korak",
@@ -123,6 +124,7 @@
"Meal_Types": "Tipi obroka",
"Merge": "Združi",
"Merge_Keyword": "Združi ključno besedo",
"Miscellaneous": "",
"Monday": "",
"Month": "Mesec",
"Move": "Premakni",
@@ -172,6 +174,7 @@
"Private_Recipe": "Zasebni Recept",
"Private_Recipe_Help": "Recept je prikazan samo vam in osebam, s katerimi ga delite.",
"Profile": "",
"PropertiesFoodHelp": "",
"Proteins": "Beljakovine",
"QuickEntry": "Hitri vnos",
"Rating": "Ocena",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Konto",
"Add": "Lägg till",
"AddAll": "",
"AddFoodToShopping": "Lägg till {food} på din inköpslista",
"AddToShopping": "Lägg till i inköpslista",
"Add_Servings_to_Shopping": "Lägg till {servings} portioner till inköp",
@@ -199,6 +200,7 @@
"Merge": "Slå samman",
"Merge_Keyword": "Slå samman nyckelord",
"Message": "Meddelande",
"Miscellaneous": "",
"Monday": "",
"Month": "Månad",
"Move": "Flytta",
@@ -269,6 +271,7 @@
"Private_Recipe_Help": "Receptet visas bara för dig och personer som det delas med.",
"Profile": "",
"Properties": "Egenskaper",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "Egenskaper Livsmedel Mängd",
"Properties_Food_Unit": "Egenskaper Livsmedel Enhet",
"Property": "Egendom",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "Hesap",
"Add": "Ekle",
"AddAll": "",
"AddFoodToShopping": "{food}'ı alışveriş listenize ekleyin",
"AddToShopping": "Alışveriş listesine ekle",
"Add_Servings_to_Shopping": "Alışverişe {servings} Porsiyon Ekle",
@@ -198,6 +199,7 @@
"Merge": "Birleştir",
"Merge_Keyword": "Anahtar Kelimeyi Birleştir",
"Message": "Mesaj",
"Miscellaneous": "",
"Monday": "",
"Month": "Ay",
"Move": "Taşı",
@@ -268,6 +270,7 @@
"Private_Recipe_Help": "Tarif yalnızca size ve paylaştığınız kişilere gösterilir.",
"Profile": "",
"Properties": "Özellikler",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "Özellikler Yiyecek Miktar",
"Properties_Food_Unit": "Özellikler Yiyecek Birim",
"Property": "Özellik",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "Додати",
"AddAll": "",
"AddFoodToShopping": "Додати {food} до вашого списку покупок",
"AddToShopping": "Додати до списку покупок",
"Add_Servings_to_Shopping": "Додати {servings} Порції до Покупок",
@@ -152,6 +153,7 @@
"Meal_Types": "Типи страви",
"Merge": "Об'єднати",
"Merge_Keyword": "Об'єднати Ключове слово",
"Miscellaneous": "",
"Monday": "",
"Month": "Місяць",
"Move": "Перемістити",
@@ -209,6 +211,7 @@
"Private_Recipe": "Приватний Рецепт",
"Private_Recipe_Help": "Рецепт показаний тільки Вам і тими з ким ви поділилися їм.",
"Profile": "",
"PropertiesFoodHelp": "",
"Protected": "Захищено",
"Proteins": "Білки",
"Quick actions": "",

View File

@@ -3,6 +3,7 @@
"Access_Token": "",
"Account": "账户",
"Add": "添加",
"AddAll": "",
"AddFoodToShopping": "添加 {food} 到购物清单",
"AddToShopping": "添加到购物清单",
"Add_Servings_to_Shopping": "添加 {servings} 份到购物",
@@ -194,6 +195,7 @@
"Merge": "合并",
"Merge_Keyword": "合并关键词",
"Message": "信息",
"Miscellaneous": "",
"Monday": "",
"Month": "月份",
"Move": "移动",
@@ -263,6 +265,7 @@
"Private_Recipe_Help": "食谱只有你和共享的人会显示。",
"Profile": "",
"Properties": "属性",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "食物数量属性",
"Properties_Food_Unit": "食品单位属性",
"Property": "属性",

View File

@@ -1,6 +1,7 @@
{
"Access_Token": "",
"Add": "",
"AddAll": "",
"Add_nutrition_recipe": "為食譜添加營養資訊",
"Add_to_Plan": "加入計劃",
"Add_to_Shopping": "加入購物清單",
@@ -44,6 +45,7 @@
"ManageSubscription": "",
"Manage_Books": "管理書籍",
"Meal_Plan": "膳食計劃",
"Miscellaneous": "",
"Monday": "",
"New": "",
"New_Recipe": "",
@@ -56,6 +58,7 @@
"Preparation": "",
"Print": "",
"Profile": "",
"PropertiesFoodHelp": "",
"Proteins": "",
"Rating": "",
"Recently_Viewed": "",

View File

@@ -8,6 +8,8 @@ import {
MealType as IMealType,
User as IUser,
FoodInheritField as IFoodInheritField,
SupermarketCategory as ISupermarketCategory,
PropertyType as IPropertyType,
} from "@/openapi";
export function getModelFromStr(model_name: String) {
@@ -33,6 +35,12 @@ export function getModelFromStr(model_name: String) {
case 'foodinheritfield': {
return new FoodInheritField
}
case 'supermarketcategory': {
return new SupermarketCategory
}
case 'propertytype': {
return new PropertyType
}
default: {
throw Error(`Invalid Model ${model_name}, did you forget to register it in Models.ts?`)
}
@@ -152,7 +160,7 @@ export class MealType extends GenericModel<IMealType> {
create(name: string) {
const api = new ApiApi()
return api.apiMealTypeCreate({mealType: {name: name} as IMealType}).then(r => {
return r as unknown as IRecipeOverview
return r as unknown as IMealType
})
}
@@ -202,4 +210,46 @@ export class FoodInheritField extends GenericModel<IFoodInheritField> {
}
})
}
}
export class SupermarketCategory extends GenericModel<ISupermarketCategory> {
create(name: string) {
const api = new ApiApi()
return api.apiSupermarketCategoryCreate({supermarketCategory: {name: name} as ISupermarketCategory}).then(r => {
return r as unknown as ISupermarketCategory
})
}
list(query: string) {
const api = new ApiApi()
return api.apiSupermarketCategoryList({query: query}).then(r => {
if (r.results) {
return r.results
} else {
return []
}
})
}
}
export class PropertyType extends GenericModel<IPropertyType> {
create(name: string) {
const api = new ApiApi()
return api.apiPropertyTypeCreate({propertyType: {name: name} as IPropertyType}).then(r => {
return r as unknown as IPropertyType
})
}
list(query: string) {
const api = new ApiApi()
return api.apiPropertyTypeList({query: query}).then(r => {
if (r.results) {
return r.results
} else {
return []
}
})
}
}

View File

@@ -64,6 +64,7 @@ export default createVuetify({
search: 'fa-solid fa-magnifying-glass',
copy: 'fa-solid fa-copy',
close: 'fa-solid fa-xmark',
help: 'fa-solid fa-info',
settings: 'fa-solid fa-sliders',
spaces: 'fa-solid fa-database',
shopping: 'fa-solid fa-cart-shopping',