mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2026-01-01 04:10:06 -05:00
property editor
This commit is contained in:
@@ -747,6 +747,10 @@ class FoodViewSet(LoggingMixin, TreeMixin):
|
|||||||
if properties with a fdc_id already exist they will be overridden, if existing properties don't have a fdc_id they won't be changed
|
if properties with a fdc_id already exist they will be overridden, if existing properties don't have a fdc_id they won't be changed
|
||||||
"""
|
"""
|
||||||
food = self.get_object()
|
food = self.get_object()
|
||||||
|
|
||||||
|
if request.data['fdc_id']:
|
||||||
|
food.fdc_id = request.data['fdc_id']
|
||||||
|
|
||||||
if not food.fdc_id:
|
if not food.fdc_id:
|
||||||
return JsonResponse({'msg': 'Food has no FDC ID associated.'}, status=400, json_dumps_params={'indent': 4})
|
return JsonResponse({'msg': 'Food has no FDC ID associated.'}, status=400, json_dumps_params={'indent': 4})
|
||||||
|
|
||||||
@@ -767,12 +771,17 @@ class FoodViewSet(LoggingMixin, TreeMixin):
|
|||||||
json_dumps_params={'indent': 4})
|
json_dumps_params={'indent': 4})
|
||||||
|
|
||||||
food.properties_food_amount = 100
|
food.properties_food_amount = 100
|
||||||
food.properties_food_unit = Unit.objects.get_or_create(
|
|
||||||
base_unit__iexact='g',
|
|
||||||
space=self.request.space,
|
|
||||||
defaults={'name': 'g', 'base_unit': 'g', 'space': self.request.space}
|
|
||||||
)[0]
|
|
||||||
|
|
||||||
|
standard_unit = Unit.objects.filter(base_unit__iexact='g', space=self.request.space).first()
|
||||||
|
if not standard_unit:
|
||||||
|
standard_unit = Unit.objects.filter(name__iexact='g', space=self.request.space).first()
|
||||||
|
if not standard_unit:
|
||||||
|
standard_unit = Unit.objects.create(name='g', base_unit='g', space=self.request.space)
|
||||||
|
else:
|
||||||
|
standard_unit.base_unit = 'g'
|
||||||
|
standard_unit.save()
|
||||||
|
|
||||||
|
food.properties_food_unit = standard_unit
|
||||||
food.save()
|
food.save()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ const routes = [
|
|||||||
{path: '/edit/:model/:id?', component: () => import("@/pages/ModelListPage.vue"), props: true, name: 'ModelEditPage'},
|
{path: '/edit/:model/:id?', component: () => import("@/pages/ModelListPage.vue"), props: true, name: 'ModelEditPage'},
|
||||||
|
|
||||||
{path: '/ingredient-editor', component: () => import("@/pages/IngredientEditorPage.vue"), name: 'IngredientEditorPage'},
|
{path: '/ingredient-editor', component: () => import("@/pages/IngredientEditorPage.vue"), name: 'IngredientEditorPage'},
|
||||||
|
{path: '/property-editor', component: () => import("@/pages/PropertyEditorPage.vue"), name: 'PropertyEditorPage'},
|
||||||
]
|
]
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
|
|||||||
34
vue3/src/components/display/PropertyView.vue
Normal file
34
vue3/src/components/display/PropertyView.vue
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
{{hasFoodProperties}}
|
||||||
|
{{hasRecipeProperties}}
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
import {computed, PropType} from "vue";
|
||||||
|
import {Recipe} from "@/openapi";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
recipe: {type: {} as PropType<Recipe>, required: true}
|
||||||
|
})
|
||||||
|
|
||||||
|
const hasRecipeProperties = computed(() => {
|
||||||
|
return props.recipe.properties != undefined && props.recipe.properties.length > 0
|
||||||
|
})
|
||||||
|
|
||||||
|
const hasFoodProperties = computed(() => {
|
||||||
|
let propertiesFound = false
|
||||||
|
for (const [key, fp] of Object.entries(props.recipe.foodProperties)) {
|
||||||
|
if (fp.total_value !== 0) {
|
||||||
|
propertiesFound = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return propertiesFound
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -72,10 +72,16 @@
|
|||||||
</v-card>
|
</v-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<v-expansion-panels class="mt-2">
|
<v-expansion-panels class="mt-2">
|
||||||
|
<v-expansion-panel>
|
||||||
|
<v-expansion-panel-title><v-icon icon="$properties" class="me-2"></v-icon> {{ $t('Properties') }}</v-expansion-panel-title>
|
||||||
|
<v-expansion-panel-text>
|
||||||
|
<property-view :recipe="recipe"></property-view>
|
||||||
|
</v-expansion-panel-text>
|
||||||
|
</v-expansion-panel>
|
||||||
|
|
||||||
<v-expansion-panel>
|
<v-expansion-panel>
|
||||||
<v-expansion-panel-title><i class="fa-solid fa-circle-info me-2"></i> {{ $t('Information') }}</v-expansion-panel-title>
|
<v-expansion-panel-title><v-icon icon="fa-solid fa-circle-info" class="me-2"></v-icon> {{ $t('Information') }}</v-expansion-panel-title>
|
||||||
<v-expansion-panel-text>
|
<v-expansion-panel-text>
|
||||||
<v-row>
|
<v-row>
|
||||||
<v-col cols="12" md="3">
|
<v-col cols="12" md="3">
|
||||||
@@ -116,8 +122,11 @@
|
|||||||
</v-expansion-panel-text>
|
</v-expansion-panel-text>
|
||||||
</v-expansion-panel>
|
</v-expansion-panel>
|
||||||
|
|
||||||
|
|
||||||
</v-expansion-panels>
|
</v-expansion-panels>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<recipe-activity :recipe="recipe"></recipe-activity>
|
<recipe-activity :recipe="recipe"></recipe-activity>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
@@ -137,6 +146,7 @@ import {useWakeLock} from "@vueuse/core";
|
|||||||
import StepView from "@/components/display/StepView.vue";
|
import StepView from "@/components/display/StepView.vue";
|
||||||
import IngredientsTable from "@/components/display/IngredientsTable.vue";
|
import IngredientsTable from "@/components/display/IngredientsTable.vue";
|
||||||
import {DateTime} from "luxon";
|
import {DateTime} from "luxon";
|
||||||
|
import PropertyView from "@/components/display/PropertyView.vue";
|
||||||
|
|
||||||
const {request, release} = useWakeLock()
|
const {request, release} = useWakeLock()
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- TODO label is not showing for some reason, for now in placeholder -->
|
<!-- TODO label is not showing for some reason, for now in placeholder -->
|
||||||
<v-input :hint="props.hint" persistent-hint :label="props.label">
|
<v-input :hint="props.hint" persistent-hint :label="props.label" :hide-details="props.hideDetails">
|
||||||
<template #prepend v-if="$slots.prepend">
|
<template #prepend v-if="$slots.prepend">
|
||||||
<slot name="prepend"></slot>
|
<slot name="prepend"></slot>
|
||||||
</template>
|
</template>
|
||||||
@@ -73,13 +73,14 @@ const props = defineProps({
|
|||||||
object: {type: Boolean, default: true},
|
object: {type: Boolean, default: true},
|
||||||
|
|
||||||
allowCreate: {type: Boolean, default: false},
|
allowCreate: {type: Boolean, default: false},
|
||||||
|
|
||||||
placeholder: {type: String, default: undefined},
|
placeholder: {type: String, default: undefined},
|
||||||
|
|
||||||
noOptionsText: {type: String, default: undefined},
|
noOptionsText: {type: String, default: undefined},
|
||||||
noResultsText: {type: String, default: undefined},
|
noResultsText: {type: String, default: undefined},
|
||||||
|
|
||||||
label: {type: String, default: ''},
|
label: {type: String, default: ''},
|
||||||
|
|
||||||
hint: {type: String, default: ''},
|
hint: {type: String, default: ''},
|
||||||
|
hideDetails: {type: Boolean, default: false},
|
||||||
density: {type: String as PropType<'' | 'compact' | 'comfortable'>, default: ''},
|
density: {type: String as PropType<'' | 'compact' | 'comfortable'>, default: ''},
|
||||||
|
|
||||||
searchOnLoad: {type: Boolean, default: false},
|
searchOnLoad: {type: Boolean, default: false},
|
||||||
|
|||||||
@@ -1,25 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-btn v-bind="props" icon="fa-solid fa-ellipsis-v" variant="plain" :size="props.size">
|
<v-btn v-bind="props" icon="fa-solid fa-ellipsis-v" variant="plain" :size="props.size">
|
||||||
<v-icon icon="fa-solid fa-ellipsis-v"></v-icon>
|
<v-icon icon="fa-solid fa-ellipsis-v"></v-icon>
|
||||||
<v-menu activator="parent" close-on-content-click>
|
<v-menu activator="parent" close-on-content-click>
|
||||||
<v-list density="compact" class="pt-1 pb-1">
|
<v-list density="compact" class="pt-1 pb-1">
|
||||||
<v-list-item :to="{ name: 'ModelEditPage', params: {model: 'recipe', id: recipe.id} }" prepend-icon="$edit">
|
<v-list-item :to="{ name: 'ModelEditPage', params: {model: 'recipe', id: recipe.id} }" prepend-icon="$edit">
|
||||||
{{ $t('Edit') }}
|
{{ $t('Edit') }}
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-list-item prepend-icon="$mealplan" link>
|
<v-list-item prepend-icon="$mealplan" link>
|
||||||
{{ $t('Add_to_Plan') }}
|
{{ $t('Add_to_Plan') }}
|
||||||
<model-edit-dialog model="MealPlan" :itemDefaults="{recipe: recipe}"></model-edit-dialog>
|
<model-edit-dialog model="MealPlan" :itemDefaults="{recipe: recipe}"></model-edit-dialog>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-list-item prepend-icon="$shopping" link>
|
<v-list-item prepend-icon="$shopping" link>
|
||||||
{{ $t('Add_to_Shopping') }}
|
{{ $t('Add_to_Shopping') }}
|
||||||
<add-to-shopping-dialog :recipe="props.recipe"></add-to-shopping-dialog>
|
<add-to-shopping-dialog :recipe="props.recipe"></add-to-shopping-dialog>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-list-item prepend-icon="fa-solid fa-share-nodes" link>
|
<v-list-item :to="{ name: 'PropertyEditorPage', query: {recipe: recipe.id} }" prepend-icon="fa-solid fa-table" link>
|
||||||
{{ $t('Share') }}
|
{{ $t('Property_Editor') }}
|
||||||
<recipe-share-dialog :recipe="props.recipe"></recipe-share-dialog>
|
</v-list-item>
|
||||||
</v-list-item>
|
<v-list-item prepend-icon="fa-solid fa-share-nodes" link>
|
||||||
</v-list>
|
{{ $t('Share') }}
|
||||||
</v-menu>
|
<recipe-share-dialog :recipe="props.recipe"></recipe-share-dialog>
|
||||||
|
</v-list-item>
|
||||||
|
</v-list>
|
||||||
|
</v-menu>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<v-text-field :label="$t('Name')" v-model="editingObj.name"></v-text-field>
|
<v-text-field :label="$t('Name')" v-model="editingObj.name"></v-text-field>
|
||||||
<v-textarea :label="$t('Description')" v-model="editingObj.description"></v-textarea>
|
<v-textarea :label="$t('Description')" v-model="editingObj.description"></v-textarea>
|
||||||
<v-text-field :label="$t('Unit')" v-model="editingObj.unit"></v-text-field>
|
<v-text-field :label="$t('Unit')" v-model="editingObj.unit"></v-text-field>
|
||||||
<v-text-field :label="$t('FDC_ID')" :hint="$t('property_type_fdc_hint')" v-model="editingObj.fdcId"></v-text-field>
|
<v-autocomplete :label="$t('FDC_ID')" :hint="$t('property_type_fdc_hint')" v-model="editingObj.fdcId" :items="FDC_PROPERTY_TYPES" item-title="text"></v-autocomplete>
|
||||||
<v-number-input :label="$t('Order')" :step="10" v-model="editingObj.order" :hint="$t('OrderInformation')" control-variant="stacked"></v-number-input>
|
<v-number-input :label="$t('Order')" :step="10" v-model="editingObj.order" :hint="$t('OrderInformation')" control-variant="stacked"></v-number-input>
|
||||||
<v-text-field :label="$t('Open_Data_Slug')" :hint="$t('open_data_help_text')" persistent-hint v-model="editingObj.openDataSlug" disabled></v-text-field>
|
<v-text-field :label="$t('Open_Data_Slug')" :hint="$t('open_data_help_text')" persistent-hint v-model="editingObj.openDataSlug" disabled></v-text-field>
|
||||||
|
|
||||||
@@ -27,11 +27,12 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|
||||||
import {onMounted, PropType} from "vue";
|
import {onMounted, PropType, ref} from "vue";
|
||||||
import {PropertyType} from "@/openapi";
|
import {PropertyType} 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 {VNumberInput} from "vuetify/labs/VNumberInput";
|
import {VNumberInput} from "vuetify/labs/VNumberInput";
|
||||||
|
import {FDC_PROPERTY_TYPES} from "@/utils/fdc";
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
item: {type: {} as PropType<PropertyType>, required: false, default: null},
|
item: {type: {} as PropType<PropertyType>, required: false, default: null},
|
||||||
@@ -41,7 +42,17 @@ const props = defineProps({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['create', 'save', 'delete', 'close'])
|
const emit = defineEmits(['create', 'save', 'delete', 'close'])
|
||||||
const {setupState, deleteObject, saveObject, isUpdate, editingObjName, loading, editingObj, editingObjChanged, modelClass} = useModelEditorFunctions<PropertyType>('PropertyType', emit)
|
const {
|
||||||
|
setupState,
|
||||||
|
deleteObject,
|
||||||
|
saveObject,
|
||||||
|
isUpdate,
|
||||||
|
editingObjName,
|
||||||
|
loading,
|
||||||
|
editingObj,
|
||||||
|
editingObjChanged,
|
||||||
|
modelClass
|
||||||
|
} = useModelEditorFunctions<PropertyType>('PropertyType', emit)
|
||||||
|
|
||||||
// object specific data (for selects/display)
|
// object specific data (for selects/display)
|
||||||
|
|
||||||
|
|||||||
@@ -263,6 +263,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "",
|
"Protected": "",
|
||||||
"Proteins": "",
|
"Proteins": "",
|
||||||
"Quick actions": "",
|
"Quick actions": "",
|
||||||
@@ -370,6 +371,7 @@
|
|||||||
"Units": "",
|
"Units": "",
|
||||||
"Unrated": "",
|
"Unrated": "",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "",
|
"Url_Import": "",
|
||||||
|
|||||||
@@ -256,6 +256,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Защитен",
|
"Protected": "Защитен",
|
||||||
"Proteins": "Протеини (белтъчини)",
|
"Proteins": "Протеини (белтъчини)",
|
||||||
"Quick actions": "Бързи действия",
|
"Quick actions": "Бързи действия",
|
||||||
@@ -363,6 +364,7 @@
|
|||||||
"Units": "Единици",
|
"Units": "Единици",
|
||||||
"Unrated": "Без оценка",
|
"Unrated": "Без оценка",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "Импортиране на URL адрес",
|
"Url_Import": "Импортиране на URL адрес",
|
||||||
|
|||||||
@@ -459,6 +459,7 @@
|
|||||||
"UnpinnedConfirmation": "",
|
"UnpinnedConfirmation": "",
|
||||||
"Unrated": "",
|
"Unrated": "",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "",
|
"Update_Existing_Data": "",
|
||||||
"Updated": "",
|
"Updated": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -453,6 +453,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} byl odepnut.",
|
"UnpinnedConfirmation": "{recipe} byl odepnut.",
|
||||||
"Unrated": "Nehodnocené",
|
"Unrated": "Nehodnocené",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Aktualizovat existující data",
|
"Update_Existing_Data": "Aktualizovat existující data",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -313,6 +313,7 @@
|
|||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"Property": "Egenskab",
|
"Property": "Egenskab",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Beskyttet",
|
"Protected": "Beskyttet",
|
||||||
"Proteins": "Proteiner",
|
"Proteins": "Proteiner",
|
||||||
"Quick actions": "Hurtige handlinger",
|
"Quick actions": "Hurtige handlinger",
|
||||||
@@ -431,6 +432,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} er frigjort.",
|
"UnpinnedConfirmation": "{recipe} er frigjort.",
|
||||||
"Unrated": "Ikke bedømt",
|
"Unrated": "Ikke bedømt",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Opdaterer eksisterende data",
|
"Update_Existing_Data": "Opdaterer eksisterende data",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -336,7 +336,7 @@
|
|||||||
"Properties_Food_Unit": "Nährwert Einheit",
|
"Properties_Food_Unit": "Nährwert Einheit",
|
||||||
"Property": "Eigenschaft",
|
"Property": "Eigenschaft",
|
||||||
"PropertyType": "Eigenschafts Typ",
|
"PropertyType": "Eigenschafts Typ",
|
||||||
"Property_Editor": "Nährwerte bearbeiten",
|
"Property_Editor": "Eigenschaften bearbeiten",
|
||||||
"Protected": "Geschützt",
|
"Protected": "Geschützt",
|
||||||
"Proteins": "Proteine",
|
"Proteins": "Proteine",
|
||||||
"Quick actions": "Schnellbefehle",
|
"Quick actions": "Schnellbefehle",
|
||||||
@@ -463,6 +463,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} wurde gelöst.",
|
"UnpinnedConfirmation": "{recipe} wurde gelöst.",
|
||||||
"Unrated": "Unbewertet",
|
"Unrated": "Unbewertet",
|
||||||
"Up": "Hoch",
|
"Up": "Hoch",
|
||||||
|
"Update": "Aktualisieren",
|
||||||
"Update_Existing_Data": "Vorhandene Daten aktualisieren",
|
"Update_Existing_Data": "Vorhandene Daten aktualisieren",
|
||||||
"Updated": "Aktualisiert",
|
"Updated": "Aktualisiert",
|
||||||
"UpgradeNow": "Jetzt Upgraden",
|
"UpgradeNow": "Jetzt Upgraden",
|
||||||
|
|||||||
@@ -305,6 +305,7 @@
|
|||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"Property": "Ιδιότητα",
|
"Property": "Ιδιότητα",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Προστατευμένο",
|
"Protected": "Προστατευμένο",
|
||||||
"Proteins": "Πρωτεΐνες",
|
"Proteins": "Πρωτεΐνες",
|
||||||
"Quick actions": "Γρήγηορες δράσεις",
|
"Quick actions": "Γρήγηορες δράσεις",
|
||||||
@@ -420,6 +421,7 @@
|
|||||||
"UnpinnedConfirmation": "Η συνταγή {recipe} αφαιρέθηκε από τις καρφιτσωμένες.",
|
"UnpinnedConfirmation": "Η συνταγή {recipe} αφαιρέθηκε από τις καρφιτσωμένες.",
|
||||||
"Unrated": "Χωρίς βαθμολογία",
|
"Unrated": "Χωρίς βαθμολογία",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Ενημέρωση υπαρχόντων δεδομένων",
|
"Update_Existing_Data": "Ενημέρωση υπαρχόντων δεδομένων",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -461,6 +461,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} has been unpinned.",
|
"UnpinnedConfirmation": "{recipe} has been unpinned.",
|
||||||
"Unrated": "Unrated",
|
"Unrated": "Unrated",
|
||||||
"Up": "Up",
|
"Up": "Up",
|
||||||
|
"Update": "Update",
|
||||||
"Update_Existing_Data": "Update Existing Data",
|
"Update_Existing_Data": "Update Existing Data",
|
||||||
"Updated": "Updated",
|
"Updated": "Updated",
|
||||||
"UpgradeNow": "Upgrade now",
|
"UpgradeNow": "Upgrade now",
|
||||||
|
|||||||
@@ -458,6 +458,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} ha sido desanclada.",
|
"UnpinnedConfirmation": "{recipe} ha sido desanclada.",
|
||||||
"Unrated": "Sin puntuar",
|
"Unrated": "Sin puntuar",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Actualizar Datos Existentes",
|
"Update_Existing_Data": "Actualizar Datos Existentes",
|
||||||
"Updated": "Actualizada",
|
"Updated": "Actualizada",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -198,6 +198,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Proteins": "Proteiinit",
|
"Proteins": "Proteiinit",
|
||||||
"Rating": "Luokitus",
|
"Rating": "Luokitus",
|
||||||
"Recently_Viewed": "Äskettäin katsotut",
|
"Recently_Viewed": "Äskettäin katsotut",
|
||||||
@@ -284,6 +285,7 @@
|
|||||||
"Unit_Alias": "Yksikköalias",
|
"Unit_Alias": "Yksikköalias",
|
||||||
"Unrated": "Luokittelematon",
|
"Unrated": "Luokittelematon",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "URL Tuonti",
|
"Url_Import": "URL Tuonti",
|
||||||
|
|||||||
@@ -458,6 +458,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} a été désépinglée.",
|
"UnpinnedConfirmation": "{recipe} a été désépinglée.",
|
||||||
"Unrated": "Non évalué",
|
"Unrated": "Non évalué",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Mettre à jour les données existantes",
|
"Update_Existing_Data": "Mettre à jour les données existantes",
|
||||||
"Updated": "Mis à jour",
|
"Updated": "Mis à jour",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -460,6 +460,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} שוחרר מנעיצה.",
|
"UnpinnedConfirmation": "{recipe} שוחרר מנעיצה.",
|
||||||
"Unrated": "בלתי מדורג",
|
"Unrated": "בלתי מדורג",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "עדכון מידע קיים",
|
"Update_Existing_Data": "עדכון מידע קיים",
|
||||||
"Updated": "עודכן",
|
"Updated": "עודכן",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -307,6 +307,7 @@
|
|||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"Property": "Tulajdonság",
|
"Property": "Tulajdonság",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Védett",
|
"Protected": "Védett",
|
||||||
"Proteins": "Fehérjék",
|
"Proteins": "Fehérjék",
|
||||||
"Quick actions": "Gyors parancsok",
|
"Quick actions": "Gyors parancsok",
|
||||||
@@ -422,6 +423,7 @@
|
|||||||
"Unpin": "Levétel",
|
"Unpin": "Levétel",
|
||||||
"Unrated": "Nem értékelt",
|
"Unrated": "Nem értékelt",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Meglévő adatok frissítése",
|
"Update_Existing_Data": "Meglévő adatok frissítése",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -144,6 +144,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Proteins": "",
|
"Proteins": "",
|
||||||
"Rating": "",
|
"Rating": "",
|
||||||
"Recently_Viewed": "Վերջերս դիտած",
|
"Recently_Viewed": "Վերջերս դիտած",
|
||||||
@@ -214,6 +215,7 @@
|
|||||||
"Tuesday": "",
|
"Tuesday": "",
|
||||||
"UnitConversion": "",
|
"UnitConversion": "",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "URL ներմուծում",
|
"Url_Import": "URL ներմուծում",
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Terlindung",
|
"Protected": "Terlindung",
|
||||||
"Proteins": "Protein",
|
"Proteins": "Protein",
|
||||||
"Quick actions": "",
|
"Quick actions": "",
|
||||||
@@ -395,6 +396,7 @@
|
|||||||
"Units": "",
|
"Units": "",
|
||||||
"Unrated": "",
|
"Unrated": "",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "Impor Url",
|
"Url_Import": "Impor Url",
|
||||||
|
|||||||
@@ -458,6 +458,7 @@
|
|||||||
"UnpinnedConfirmation": "",
|
"UnpinnedConfirmation": "",
|
||||||
"Unrated": "",
|
"Unrated": "",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "",
|
"Update_Existing_Data": "",
|
||||||
"Updated": "",
|
"Updated": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -291,6 +291,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Protetto",
|
"Protected": "Protetto",
|
||||||
"Proteins": "Proteine",
|
"Proteins": "Proteine",
|
||||||
"Quick actions": "Azioni rapide",
|
"Quick actions": "Azioni rapide",
|
||||||
@@ -406,6 +407,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} non è più fissata.",
|
"UnpinnedConfirmation": "{recipe} non è più fissata.",
|
||||||
"Unrated": "Senza valutazione",
|
"Unrated": "Senza valutazione",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "Importa da URL",
|
"Url_Import": "Importa da URL",
|
||||||
|
|||||||
@@ -311,6 +311,7 @@
|
|||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"Property": "",
|
"Property": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "",
|
"Protected": "",
|
||||||
"Proteins": "",
|
"Proteins": "",
|
||||||
"Quick actions": "",
|
"Quick actions": "",
|
||||||
@@ -429,6 +430,7 @@
|
|||||||
"UnpinnedConfirmation": "",
|
"UnpinnedConfirmation": "",
|
||||||
"Unrated": "",
|
"Unrated": "",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "",
|
"Update_Existing_Data": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -303,6 +303,7 @@
|
|||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"Property": "Egenskap",
|
"Property": "Egenskap",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Beskyttet",
|
"Protected": "Beskyttet",
|
||||||
"Proteins": "Protein",
|
"Proteins": "Protein",
|
||||||
"Quick actions": "",
|
"Quick actions": "",
|
||||||
@@ -418,6 +419,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} har blitt løsnet.",
|
"UnpinnedConfirmation": "{recipe} har blitt løsnet.",
|
||||||
"Unrated": "Urangert",
|
"Unrated": "Urangert",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Oppdater eksisterende data",
|
"Update_Existing_Data": "Oppdater eksisterende data",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -307,6 +307,7 @@
|
|||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"Property": "Eigenschap",
|
"Property": "Eigenschap",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Beschermd",
|
"Protected": "Beschermd",
|
||||||
"Proteins": "Eiwitten",
|
"Proteins": "Eiwitten",
|
||||||
"Quick actions": "Snelle acties",
|
"Quick actions": "Snelle acties",
|
||||||
@@ -422,6 +423,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} is losgemaakt.",
|
"UnpinnedConfirmation": "{recipe} is losgemaakt.",
|
||||||
"Unrated": "Niet beoordeeld",
|
"Unrated": "Niet beoordeeld",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Bestaande gegevens bijwerken",
|
"Update_Existing_Data": "Bestaande gegevens bijwerken",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -461,6 +461,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} została odpięta.",
|
"UnpinnedConfirmation": "{recipe} została odpięta.",
|
||||||
"Unrated": "Nieoceniony",
|
"Unrated": "Nieoceniony",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Zaktualizuj istniejące dane",
|
"Update_Existing_Data": "Zaktualizuj istniejące dane",
|
||||||
"Updated": "Zaktualizowano",
|
"Updated": "Zaktualizowano",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -253,6 +253,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Protegido",
|
"Protected": "Protegido",
|
||||||
"Proteins": "Proteínas",
|
"Proteins": "Proteínas",
|
||||||
"Quick actions": "Acções Rápidas",
|
"Quick actions": "Acções Rápidas",
|
||||||
@@ -357,6 +358,7 @@
|
|||||||
"Units": "Unidades",
|
"Units": "Unidades",
|
||||||
"Unrated": "Sem classificação",
|
"Unrated": "Sem classificação",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "Importação de URL",
|
"Url_Import": "Importação de URL",
|
||||||
|
|||||||
@@ -438,6 +438,7 @@
|
|||||||
"Units": "Unidades",
|
"Units": "Unidades",
|
||||||
"Unrated": "Não classificado",
|
"Unrated": "Não classificado",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Atualizar Dados Existentes",
|
"Update_Existing_Data": "Atualizar Dados Existentes",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -295,6 +295,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Protejat",
|
"Protected": "Protejat",
|
||||||
"Proteins": "Proteine",
|
"Proteins": "Proteine",
|
||||||
"Quick actions": "Acțiuni rapide",
|
"Quick actions": "Acțiuni rapide",
|
||||||
@@ -410,6 +411,7 @@
|
|||||||
"UnpinnedConfirmation": "Fixarea {recipe} a fost anulată.",
|
"UnpinnedConfirmation": "Fixarea {recipe} a fost anulată.",
|
||||||
"Unrated": "Neevaluat",
|
"Unrated": "Neevaluat",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "Importă URL",
|
"Url_Import": "Importă URL",
|
||||||
|
|||||||
@@ -239,6 +239,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Защищено",
|
"Protected": "Защищено",
|
||||||
"Proteins": "Белки",
|
"Proteins": "Белки",
|
||||||
"Quick actions": "Быстрые действия",
|
"Quick actions": "Быстрые действия",
|
||||||
@@ -338,6 +339,7 @@
|
|||||||
"Units": "Единицы",
|
"Units": "Единицы",
|
||||||
"Unrated": "Без рейтинга",
|
"Unrated": "Без рейтинга",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "Импорт гиперссылки",
|
"Url_Import": "Импорт гиперссылки",
|
||||||
|
|||||||
@@ -234,6 +234,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Proteins": "Beljakovine",
|
"Proteins": "Beljakovine",
|
||||||
"QuickEntry": "Hitri vnos",
|
"QuickEntry": "Hitri vnos",
|
||||||
"Rating": "Ocena",
|
"Rating": "Ocena",
|
||||||
@@ -328,6 +329,7 @@
|
|||||||
"Unit_Alias": "Vzdevek enote",
|
"Unit_Alias": "Vzdevek enote",
|
||||||
"Unrated": "Neocenjeno",
|
"Unrated": "Neocenjeno",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Posodobitev Obstoječih Podatkov",
|
"Update_Existing_Data": "Posodobitev Obstoječih Podatkov",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -461,6 +461,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} har lossats.",
|
"UnpinnedConfirmation": "{recipe} har lossats.",
|
||||||
"Unrated": "Ej betygsatt",
|
"Unrated": "Ej betygsatt",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Uppdatera existerande data",
|
"Update_Existing_Data": "Uppdatera existerande data",
|
||||||
"Updated": "Uppdaterad",
|
"Updated": "Uppdaterad",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -460,6 +460,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} sabitlemesi kaldırıldı.",
|
"UnpinnedConfirmation": "{recipe} sabitlemesi kaldırıldı.",
|
||||||
"Unrated": "Derecelendirilmemiş",
|
"Unrated": "Derecelendirilmemiş",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "Mevcut Verileri Güncelleyin",
|
"Update_Existing_Data": "Mevcut Verileri Güncelleyin",
|
||||||
"Updated": "Güncellendi",
|
"Updated": "Güncellendi",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
|
|||||||
@@ -271,6 +271,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Protected": "Захищено",
|
"Protected": "Захищено",
|
||||||
"Proteins": "Білки",
|
"Proteins": "Білки",
|
||||||
"Quick actions": "",
|
"Quick actions": "",
|
||||||
@@ -379,6 +380,7 @@
|
|||||||
"Units": "",
|
"Units": "",
|
||||||
"Unrated": "Без рейтингу",
|
"Unrated": "Без рейтингу",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "Імпорт за посиланням",
|
"Url_Import": "Імпорт за посиланням",
|
||||||
|
|||||||
@@ -452,6 +452,7 @@
|
|||||||
"UnpinnedConfirmation": "{recipe} 已取消固定。",
|
"UnpinnedConfirmation": "{recipe} 已取消固定。",
|
||||||
"Unrated": "未评分",
|
"Unrated": "未评分",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"Update_Existing_Data": "更新现有数据",
|
"Update_Existing_Data": "更新现有数据",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
|
|||||||
@@ -119,6 +119,7 @@
|
|||||||
"Profile": "",
|
"Profile": "",
|
||||||
"PropertiesFoodHelp": "",
|
"PropertiesFoodHelp": "",
|
||||||
"PropertyType": "",
|
"PropertyType": "",
|
||||||
|
"Property_Editor": "",
|
||||||
"Proteins": "",
|
"Proteins": "",
|
||||||
"Rating": "",
|
"Rating": "",
|
||||||
"Recently_Viewed": "",
|
"Recently_Viewed": "",
|
||||||
@@ -184,6 +185,7 @@
|
|||||||
"Tuesday": "",
|
"Tuesday": "",
|
||||||
"UnitConversion": "",
|
"UnitConversion": "",
|
||||||
"Up": "",
|
"Up": "",
|
||||||
|
"Update": "",
|
||||||
"UpgradeNow": "",
|
"UpgradeNow": "",
|
||||||
"UrlImportSubtitle": "",
|
"UrlImportSubtitle": "",
|
||||||
"Url_Import": "",
|
"Url_Import": "",
|
||||||
|
|||||||
272
vue3/src/pages/PropertyEditorPage.vue
Normal file
272
vue3/src/pages/PropertyEditorPage.vue
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
<template>
|
||||||
|
<v-container>
|
||||||
|
<v-card :loading="recipeLoading || propertyTypesLoading">
|
||||||
|
<v-card-title>{{ $t('Property_Editor') }}</v-card-title>
|
||||||
|
<v-card-text>
|
||||||
|
<model-select append-to-body model="Recipe" v-model="recipe" @update:model-value="loadRecipe(recipe.id!)"></model-select>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
|
||||||
|
<v-table class="mt-2">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{{ $t('Food') }}</th>
|
||||||
|
<th>
|
||||||
|
<v-btn variant="outlined" block href="https://fdc.nal.usda.gov/food-search" target="_blank" prepend-icon="$search" stacked>{{ $t('FDC_ID') }}</v-btn>
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<v-btn variant="outlined" @click="dialog = true" block stacked>{{ $t('Amount') }}</v-btn>
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<v-btn variant="outlined" @click="dialog = true" block stacked>{{ $t('Properties_Food_Unit') }}</v-btn>
|
||||||
|
</th>
|
||||||
|
<th v-for="pt in propertyTypes" :key="pt.id!">
|
||||||
|
<v-btn stacked block variant="outlined" class="mt-2 mb-2">
|
||||||
|
<span>{{ pt.name }}</span>
|
||||||
|
<span>
|
||||||
|
<v-chip color="info" size="x-small"><v-icon icon="fa-solid fa-arrow-down-1-9"></v-icon>{{ pt.order }}</v-chip>
|
||||||
|
<v-chip color="success" size="x-small" v-if="pt.fdcId"><v-icon icon="fa-solid fa-check"></v-icon>FDC</v-chip>
|
||||||
|
<v-chip color="error" size="x-small" v-if="!pt.fdcId"><v-icon icon="fa-solid fa-times"></v-icon>FDC</v-chip>
|
||||||
|
</span>
|
||||||
|
<model-edit-dialog model="PropertyType" :item="pt"></model-edit-dialog>
|
||||||
|
</v-btn>
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<v-btn color="create" class="mt-1 float-right">
|
||||||
|
<v-icon icon="$create"></v-icon>
|
||||||
|
<model-edit-dialog model="PropertyType" @create="(pt:PropertyType) => propertyTypes.push(pt)"></model-edit-dialog>
|
||||||
|
</v-btn>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="[i, food] in foods.entries()">
|
||||||
|
<td>{{ food.name }}</td>
|
||||||
|
<td>
|
||||||
|
<v-text-field type="number" v-model="food.fdcId" density="compact" hide-details @change="updateFood(food)" style="min-width: 180px" :loading="food.loading">
|
||||||
|
<template #append-inner>
|
||||||
|
<v-btn @click="updateFoodFdcData(food)" icon="fa-solid fa-arrows-rotate" size="small" density="compact" variant="plain" v-if="food.fdcId"></v-btn>
|
||||||
|
<v-btn :href="`https://fdc.nal.usda.gov/food-details/${food.fdcId}/nutrients`" target="_blank" icon="fa-solid fa-arrow-up-right-from-square"
|
||||||
|
size="small" variant="plain" v-if="food.fdcId"></v-btn>
|
||||||
|
</template>
|
||||||
|
</v-text-field>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<v-text-field type="number" v-model="food.propertiesFoodAmount" density="compact" hide-details @change="updateFood(food)"
|
||||||
|
:loading="food.loading"></v-text-field>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<model-select model="Unit" density="compact" v-model="food.propertiesFoodUnit" hide-details @update:model-value="updateFood(food)"
|
||||||
|
:loading="food.loading"></model-select>
|
||||||
|
</td>
|
||||||
|
<td v-for="p in food.properties" v-bind:key="`${food.id}_${p.propertyType.id}`">
|
||||||
|
<v-text-field type="number" v-model="p.propertyAmount" density="compact" hide-details v-if="p.propertyAmount != null" @change="updateFood(food)"
|
||||||
|
:loading="food.loading"></v-text-field>
|
||||||
|
<v-btn variant="outlined" color="create" block v-if="p.propertyAmount == null" @click="p.propertyAmount = 0">
|
||||||
|
<v-icon icon="$create"></v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</v-table>
|
||||||
|
</v-container>
|
||||||
|
|
||||||
|
<v-dialog v-model="dialog" max-width="600">
|
||||||
|
<v-card>
|
||||||
|
<v-closable-card-title v-model="dialog" :title="$t('Update')"></v-closable-card-title>
|
||||||
|
<v-card-text>
|
||||||
|
<p>{{ $t('Update_Existing_Data') }}</p>
|
||||||
|
|
||||||
|
<model-select model="Unit" :label="$t('Properties_Food_Unit')" v-model="dialogUnit">
|
||||||
|
<template v-slot:append>
|
||||||
|
<v-btn @click="changeAllUnits(dialogUnit)" icon="$save" color="save" :disabled="dialogUnit == undefined"></v-btn>
|
||||||
|
</template>
|
||||||
|
</model-select>
|
||||||
|
|
||||||
|
<v-text-field type="number" :label="$t('Properties_Food_Amount')" v-model="dialogAmount">
|
||||||
|
<template v-slot:append>
|
||||||
|
<v-btn @click="changeAllPropertyFoodAmounts(dialogAmount)" icon="$save" color="save"></v-btn>
|
||||||
|
</template>
|
||||||
|
</v-text-field>
|
||||||
|
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
</v-dialog>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
import {onMounted, ref} from "vue";
|
||||||
|
import {ApiApi, Food, Property, PropertyType, Recipe, Unit} from "@/openapi";
|
||||||
|
import ModelSelect from "@/components/inputs/ModelSelect.vue";
|
||||||
|
import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore";
|
||||||
|
import ModelEditDialog from "@/components/dialogs/ModelEditDialog.vue";
|
||||||
|
import VClosableCardTitle from "@/components/dialogs/VClosableCardTitle.vue";
|
||||||
|
import {useUrlSearchParams} from "@vueuse/core";
|
||||||
|
|
||||||
|
const params = useUrlSearchParams('history', {})
|
||||||
|
|
||||||
|
const dialog = ref(false)
|
||||||
|
const dialogAmount = ref(100)
|
||||||
|
const dialogUnit = ref<undefined | Unit>(undefined)
|
||||||
|
|
||||||
|
const recipe = ref<undefined | Recipe>()
|
||||||
|
const propertyTypes = ref([] as PropertyType[])
|
||||||
|
const foods = ref(new Map<number, Food & { loading?: boolean }>())
|
||||||
|
|
||||||
|
const recipeLoading = ref(false)
|
||||||
|
const propertyTypesLoading = ref(false)
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
loadPropertyTypes()
|
||||||
|
|
||||||
|
if (params.recipe && typeof params.recipe == "string" && !isNaN(parseInt(params.recipe))) {
|
||||||
|
loadRecipe(parseInt(params.recipe))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* select or query param only load limited recipe data
|
||||||
|
* function to retrieve recipe with all data
|
||||||
|
* if successful trigger building of food map
|
||||||
|
* @param id recipe id
|
||||||
|
*/
|
||||||
|
function loadRecipe(id: number) {
|
||||||
|
let api = new ApiApi()
|
||||||
|
recipeLoading.value = true
|
||||||
|
api.apiRecipeRetrieve({id: id}).then(r => {
|
||||||
|
recipe.value = r
|
||||||
|
buildFoodMap()
|
||||||
|
}).catch(err => {
|
||||||
|
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||||
|
}).finally(() => {
|
||||||
|
recipeLoading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* load property types from server, if successful trigger building of food map
|
||||||
|
*/
|
||||||
|
function loadPropertyTypes() {
|
||||||
|
let api = new ApiApi()
|
||||||
|
propertyTypesLoading.value = true
|
||||||
|
api.apiPropertyTypeList().then(r => {
|
||||||
|
propertyTypes.value = r.results
|
||||||
|
buildFoodMap()
|
||||||
|
}).catch(err => {
|
||||||
|
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||||
|
}).finally(() => {
|
||||||
|
propertyTypesLoading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* build map structure with foods and properties
|
||||||
|
* add properties if a food is missing any
|
||||||
|
* set null to indicate missing property, 0 for properties with the actual value 0
|
||||||
|
*/
|
||||||
|
function buildFoodMap() {
|
||||||
|
foods.value = new Map<number, Food & { loading?: boolean }>()
|
||||||
|
|
||||||
|
if (recipe.value != undefined) {
|
||||||
|
recipe.value.steps.forEach(step => {
|
||||||
|
step.ingredients.forEach(ingredient => {
|
||||||
|
if (ingredient.food && !foods.value.has(ingredient.food.id!)) {
|
||||||
|
let food: Food & { loading?: boolean } = buildFoodProperties(ingredient.food)
|
||||||
|
food.loading = false
|
||||||
|
foods.value.set(food.id!, food)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add all property types to food in the correct order
|
||||||
|
* add null if no data exists for a property type to indicate a missing property
|
||||||
|
* @param food
|
||||||
|
*/
|
||||||
|
function buildFoodProperties(food: Food) {
|
||||||
|
let existingProperties = new Map<number, Property>()
|
||||||
|
food.properties!.forEach(fp => {
|
||||||
|
existingProperties.set(fp.propertyType.id!, fp)
|
||||||
|
})
|
||||||
|
|
||||||
|
food.properties = [] as Property[]
|
||||||
|
|
||||||
|
propertyTypes.value.forEach(pt => {
|
||||||
|
if (existingProperties.has(pt.id!)) {
|
||||||
|
food.properties!.push(existingProperties.get(pt.id!))
|
||||||
|
} else {
|
||||||
|
food.properties!.push({propertyType: pt, propertyAmount: null} as Property)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return food
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update food
|
||||||
|
* @param food
|
||||||
|
*/
|
||||||
|
function updateFood(food: Food & { loading?: boolean }) {
|
||||||
|
let api = new ApiApi()
|
||||||
|
food.loading = true
|
||||||
|
api.apiFoodPartialUpdate({id: food.id!, patchedFood: food}).then(r => {
|
||||||
|
|
||||||
|
}).catch(err => {
|
||||||
|
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
|
||||||
|
}).finally(() => {
|
||||||
|
food.loading = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the food FDC data on the server and put the updated food into the food map
|
||||||
|
* @param food
|
||||||
|
*/
|
||||||
|
function updateFoodFdcData(food: Food & { loading?: boolean }) {
|
||||||
|
let api = new ApiApi()
|
||||||
|
food.loading = true
|
||||||
|
if (food.fdcId) {
|
||||||
|
api.apiFoodFdcCreate({id: food.id!, food: food}).then(r => {
|
||||||
|
foods.value.set(r.id!, buildFoodProperties(r))
|
||||||
|
}).catch(err => {
|
||||||
|
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
|
||||||
|
}).finally(() => {
|
||||||
|
food.loading = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update all foods with the given unit
|
||||||
|
* @param unit
|
||||||
|
*/
|
||||||
|
function changeAllUnits(unit: Unit) {
|
||||||
|
foods.value.forEach(food => {
|
||||||
|
food.propertiesFoodUnit = unit
|
||||||
|
updateFood(food)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update all foods with the given amount
|
||||||
|
* @param amount
|
||||||
|
*/
|
||||||
|
function changeAllPropertyFoodAmounts(amount: number) {
|
||||||
|
foods.value.forEach(food => {
|
||||||
|
food.propertiesFoodAmount = amount
|
||||||
|
updateFood(food)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
230
vue3/src/utils/fdc.ts
Normal file
230
vue3/src/utils/fdc.ts
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
|
||||||
|
export const FDC_PROPERTY_TYPES = [
|
||||||
|
{value: 1002, text: "Nitrogen [g] (1002)"},
|
||||||
|
{value: 1003, text: "Protein [g] (1003)"},
|
||||||
|
{value: 1004, text: "Total lipid (fat) [g] (1004)"},
|
||||||
|
{value: 1005, text: "Carbohydrate, by difference [g] (1005)"},
|
||||||
|
{value: 1007, text: "Ash [g] (1007)"},
|
||||||
|
{value: 1008, text: "Energy [kcal] (1008)"},
|
||||||
|
{value: 1009, text: "Starch [g] (1009)"},
|
||||||
|
{value: 1010, text: "Sucrose [g] (1010)"},
|
||||||
|
{value: 1011, text: "Glucose [g] (1011)"},
|
||||||
|
{value: 1012, text: "Fructose [g] (1012)"},
|
||||||
|
{value: 1013, text: "Lactose [g] (1013)"},
|
||||||
|
{value: 1014, text: "Maltose [g] (1014)"},
|
||||||
|
{value: 1024, text: "Specific Gravity [sp gr] (1024)"},
|
||||||
|
{value: 1032, text: "Citric acid [mg] (1032)"},
|
||||||
|
{value: 1039, text: "Malic acid [mg] (1039)"},
|
||||||
|
{value: 1041, text: "Oxalic acid [mg] (1041)"},
|
||||||
|
{value: 1043, text: "Pyruvic acid [mg] (1043)"},
|
||||||
|
{value: 1044, text: "Quinic acid [mg] (1044)"},
|
||||||
|
{value: 1050, text: "Carbohydrate, by summation [g] (1050)"},
|
||||||
|
{value: 1051, text: "Water [g] (1051)"},
|
||||||
|
{value: 1062, text: "Energy [kJ] (1062)"},
|
||||||
|
{value: 1063, text: "Sugars, Total [g] (1063)"},
|
||||||
|
{value: 1075, text: "Galactose [g] (1075)"},
|
||||||
|
{value: 1076, text: "Raffinose [g] (1076)"},
|
||||||
|
{value: 1077, text: "Stachyose [g] (1077)"},
|
||||||
|
{value: 1079, text: "Fiber, total dietary [g] (1079)"},
|
||||||
|
{value: 1082, text: "Fiber, soluble [g] (1082)"},
|
||||||
|
{value: 1084, text: "Fiber, insoluble [g] (1084)"},
|
||||||
|
{value: 1085, text: "Total fat (NLEA) [g] (1085)"},
|
||||||
|
{value: 1087, text: "Calcium, Ca [mg] (1087)"},
|
||||||
|
{value: 1089, text: "Iron, Fe [mg] (1089)"},
|
||||||
|
{value: 1090, text: "Magnesium, Mg [mg] (1090)"},
|
||||||
|
{value: 1091, text: "Phosphorus, P [mg] (1091)"},
|
||||||
|
{value: 1092, text: "Potassium, K [mg] (1092)"},
|
||||||
|
{value: 1093, text: "Sodium, Na [mg] (1093)"},
|
||||||
|
{value: 1094, text: "Sulfur, S [mg] (1094)"},
|
||||||
|
{value: 1095, text: "Zinc, Zn [mg] (1095)"},
|
||||||
|
{value: 1097, text: "Cobalt, Co [µg] (1097)"},
|
||||||
|
{value: 1098, text: "Copper, Cu [mg] (1098)"},
|
||||||
|
{value: 1100, text: "Iodine, I [µg] (1100)"},
|
||||||
|
{value: 1101, text: "Manganese, Mn [mg] (1101)"},
|
||||||
|
{value: 1102, text: "Molybdenum, Mo [µg] (1102)"},
|
||||||
|
{value: 1103, text: "Selenium, Se [µg] (1103)"},
|
||||||
|
{value: 1105, text: "Retinol [µg] (1105)"},
|
||||||
|
{value: 1106, text: "Vitamin A, RAE [µg] (1106)"},
|
||||||
|
{value: 1107, text: "Carotene, beta [µg] (1107)"},
|
||||||
|
{value: 1108, text: "Carotene, alpha [µg] (1108)"},
|
||||||
|
{value: 1109, text: "Vitamin E (alpha-tocopherol) [mg] (1109)"},
|
||||||
|
{value: 1110, text: "Vitamin D (D2 + D3), International Units [IU] (1110)"},
|
||||||
|
{value: 1111, text: "Vitamin D2 (ergocalciferol) [µg] (1111)"},
|
||||||
|
{value: 1112, text: "Vitamin D3 (cholecalciferol) [µg] (1112)"},
|
||||||
|
{value: 1113, text: "25-hydroxycholecalciferol [µg] (1113)"},
|
||||||
|
{value: 1114, text: "Vitamin D (D2 + D3) [µg] (1114)"},
|
||||||
|
{value: 1116, text: "Phytoene [µg] (1116)"},
|
||||||
|
{value: 1117, text: "Phytofluene [µg] (1117)"},
|
||||||
|
{value: 1118, text: "Carotene, gamma [µg] (1118)"},
|
||||||
|
{value: 1119, text: "Zeaxanthin [µg] (1119)"},
|
||||||
|
{value: 1120, text: "Cryptoxanthin, beta [µg] (1120)"},
|
||||||
|
{value: 1121, text: "Lutein [µg] (1121)"},
|
||||||
|
{value: 1122, text: "Lycopene [µg] (1122)"},
|
||||||
|
{value: 1123, text: "Lutein + zeaxanthin [µg] (1123)"},
|
||||||
|
{value: 1125, text: "Tocopherol, beta [mg] (1125)"},
|
||||||
|
{value: 1126, text: "Tocopherol, gamma [mg] (1126)"},
|
||||||
|
{value: 1127, text: "Tocopherol, delta [mg] (1127)"},
|
||||||
|
{value: 1128, text: "Tocotrienol, alpha [mg] (1128)"},
|
||||||
|
{value: 1129, text: "Tocotrienol, beta [mg] (1129)"},
|
||||||
|
{value: 1130, text: "Tocotrienol, gamma [mg] (1130)"},
|
||||||
|
{value: 1131, text: "Tocotrienol, delta [mg] (1131)"},
|
||||||
|
{value: 1137, text: "Boron, B [µg] (1137)"},
|
||||||
|
{value: 1146, text: "Nickel, Ni [µg] (1146)"},
|
||||||
|
{value: 1159, text: "cis-beta-Carotene [µg] (1159)"},
|
||||||
|
{value: 1160, text: "cis-Lycopene [µg] (1160)"},
|
||||||
|
{value: 1161, text: "cis-Lutein/Zeaxanthin [µg] (1161)"},
|
||||||
|
{value: 1162, text: "Vitamin C, total ascorbic acid [mg] (1162)"},
|
||||||
|
{value: 1165, text: "Thiamin [mg] (1165)"},
|
||||||
|
{value: 1166, text: "Riboflavin [mg] (1166)"},
|
||||||
|
{value: 1167, text: "Niacin [mg] (1167)"},
|
||||||
|
{value: 1170, text: "Pantothenic acid [mg] (1170)"},
|
||||||
|
{value: 1175, text: "Vitamin B-6 [mg] (1175)"},
|
||||||
|
{value: 1176, text: "Biotin [µg] (1176)"},
|
||||||
|
{value: 1177, text: "Folate, total [µg] (1177)"},
|
||||||
|
{value: 1178, text: "Vitamin B-12 [µg] (1178)"},
|
||||||
|
{value: 1180, text: "Choline, total [mg] (1180)"},
|
||||||
|
{value: 1183, text: "Vitamin K (Menaquinone-4) [µg] (1183)"},
|
||||||
|
{value: 1184, text: "Vitamin K (Dihydrophylloquinone) [µg] (1184)"},
|
||||||
|
{value: 1185, text: "Vitamin K (phylloquinone) [µg] (1185)"},
|
||||||
|
{value: 1188, text: "5-methyl tetrahydrofolate (5-MTHF) [µg] (1188)"},
|
||||||
|
{value: 1191, text: "10-Formyl folic acid (10HCOFA) [µg] (1191)"},
|
||||||
|
{value: 1192, text: "5-Formyltetrahydrofolic acid (5-HCOH4 [µg] (1192)"},
|
||||||
|
{value: 1194, text: "Choline, free [mg] (1194)"},
|
||||||
|
{value: 1195, text: "Choline, from phosphocholine [mg] (1195)"},
|
||||||
|
{value: 1196, text: "Choline, from phosphotidyl choline [mg] (1196)"},
|
||||||
|
{value: 1197, text: "Choline, from glycerophosphocholine [mg] (1197)"},
|
||||||
|
{value: 1198, text: "Betaine [mg] (1198)"},
|
||||||
|
{value: 1199, text: "Choline, from sphingomyelin [mg] (1199)"},
|
||||||
|
{value: 1210, text: "Tryptophan [g] (1210)"},
|
||||||
|
{value: 1211, text: "Threonine [g] (1211)"},
|
||||||
|
{value: 1212, text: "Isoleucine [g] (1212)"},
|
||||||
|
{value: 1213, text: "Leucine [g] (1213)"},
|
||||||
|
{value: 1214, text: "Lysine [g] (1214)"},
|
||||||
|
{value: 1215, text: "Methionine [g] (1215)"},
|
||||||
|
{value: 1216, text: "Cystine [g] (1216)"},
|
||||||
|
{value: 1217, text: "Phenylalanine [g] (1217)"},
|
||||||
|
{value: 1218, text: "Tyrosine [g] (1218)"},
|
||||||
|
{value: 1219, text: "Valine [g] (1219)"},
|
||||||
|
{value: 1220, text: "Arginine [g] (1220)"},
|
||||||
|
{value: 1221, text: "Histidine [g] (1221)"},
|
||||||
|
{value: 1222, text: "Alanine [g] (1222)"},
|
||||||
|
{value: 1223, text: "Aspartic acid [g] (1223)"},
|
||||||
|
{value: 1224, text: "Glutamic acid [g] (1224)"},
|
||||||
|
{value: 1225, text: "Glycine [g] (1225)"},
|
||||||
|
{value: 1226, text: "Proline [g] (1226)"},
|
||||||
|
{value: 1227, text: "Serine [g] (1227)"},
|
||||||
|
{value: 1228, text: "Hydroxyproline [g] (1228)"},
|
||||||
|
{value: 1232, text: "Cysteine [g] (1232)"},
|
||||||
|
{value: 1253, text: "Cholesterol [mg] (1253)"},
|
||||||
|
{value: 1257, text: "Fatty acids, total trans [g] (1257)"},
|
||||||
|
{value: 1258, text: "Fatty acids, total saturated [g] (1258)"},
|
||||||
|
{value: 1259, text: "SFA 4:0 [g] (1259)"},
|
||||||
|
{value: 1260, text: "SFA 6:0 [g] (1260)"},
|
||||||
|
{value: 1261, text: "SFA 8:0 [g] (1261)"},
|
||||||
|
{value: 1262, text: "SFA 10:0 [g] (1262)"},
|
||||||
|
{value: 1263, text: "SFA 12:0 [g] (1263)"},
|
||||||
|
{value: 1264, text: "SFA 14:0 [g] (1264)"},
|
||||||
|
{value: 1265, text: "SFA 16:0 [g] (1265)"},
|
||||||
|
{value: 1266, text: "SFA 18:0 [g] (1266)"},
|
||||||
|
{value: 1267, text: "SFA 20:0 [g] (1267)"},
|
||||||
|
{value: 1268, text: "MUFA 18:1 [g] (1268)"},
|
||||||
|
{value: 1269, text: "PUFA 18:2 [g] (1269)"},
|
||||||
|
{value: 1270, text: "PUFA 18:3 [g] (1270)"},
|
||||||
|
{value: 1271, text: "PUFA 20:4 [g] (1271)"},
|
||||||
|
{value: 1272, text: "PUFA 22:6 n-3 (DHA) [g] (1272)"},
|
||||||
|
{value: 1273, text: "SFA 22:0 [g] (1273)"},
|
||||||
|
{value: 1276, text: "PUFA 18:4 [g] (1276)"},
|
||||||
|
{value: 1277, text: "MUFA 20:1 [g] (1277)"},
|
||||||
|
{value: 1278, text: "PUFA 20:5 n-3 (EPA) [g] (1278)"},
|
||||||
|
{value: 1279, text: "MUFA 22:1 [g] (1279)"},
|
||||||
|
{value: 1280, text: "PUFA 22:5 n-3 (DPA) [g] (1280)"},
|
||||||
|
{value: 1281, text: "TFA 14:1 t [g] (1281)"},
|
||||||
|
{value: 1284, text: "Ergosterol [mg] (1284)"},
|
||||||
|
{value: 1285, text: "Stigmasterol [mg] (1285)"},
|
||||||
|
{value: 1286, text: "Campesterol [mg] (1286)"},
|
||||||
|
{value: 1287, text: "Brassicasterol [mg] (1287)"},
|
||||||
|
{value: 1288, text: "Beta-sitosterol [mg] (1288)"},
|
||||||
|
{value: 1289, text: "Campestanol [mg] (1289)"},
|
||||||
|
{value: 1292, text: "Fatty acids, total monounsaturated [g] (1292)"},
|
||||||
|
{value: 1293, text: "Fatty acids, total polyunsaturated [g] (1293)"},
|
||||||
|
{value: 1294, text: "Beta-sitostanol [mg] (1294)"},
|
||||||
|
{value: 1296, text: "Delta-5-avenasterol [mg] (1296)"},
|
||||||
|
{value: 1298, text: "Phytosterols, other [mg] (1298)"},
|
||||||
|
{value: 1299, text: "SFA 15:0 [g] (1299)"},
|
||||||
|
{value: 1300, text: "SFA 17:0 [g] (1300)"},
|
||||||
|
{value: 1301, text: "SFA 24:0 [g] (1301)"},
|
||||||
|
{value: 1303, text: "TFA 16:1 t [g] (1303)"},
|
||||||
|
{value: 1304, text: "TFA 18:1 t [g] (1304)"},
|
||||||
|
{value: 1305, text: "TFA 22:1 t [g] (1305)"},
|
||||||
|
{value: 1306, text: "TFA 18:2 t not further defined [g] (1306)"},
|
||||||
|
{value: 1311, text: "PUFA 18:2 CLAs [g] (1311)"},
|
||||||
|
{value: 1312, text: "MUFA 24:1 c [g] (1312)"},
|
||||||
|
{value: 1313, text: "PUFA 20:2 n-6 c,c [g] (1313)"},
|
||||||
|
{value: 1314, text: "MUFA 16:1 c [g] (1314)"},
|
||||||
|
{value: 1315, text: "MUFA 18:1 c [g] (1315)"},
|
||||||
|
{value: 1316, text: "PUFA 18:2 n-6 c,c [g] (1316)"},
|
||||||
|
{value: 1317, text: "MUFA 22:1 c [g] (1317)"},
|
||||||
|
{value: 1321, text: "PUFA 18:3 n-6 c,c,c [g] (1321)"},
|
||||||
|
{value: 1323, text: "MUFA 17:1 [g] (1323)"},
|
||||||
|
{value: 1325, text: "PUFA 20:3 [g] (1325)"},
|
||||||
|
{value: 1329, text: "Fatty acids, total trans-monoenoic [g] (1329)"},
|
||||||
|
{value: 1330, text: "Fatty acids, total trans-dienoic [g] (1330)"},
|
||||||
|
{value: 1331, text: "Fatty acids, total trans-polyenoic [g] (1331)"},
|
||||||
|
{value: 1333, text: "MUFA 15:1 [g] (1333)"},
|
||||||
|
{value: 1334, text: "PUFA 22:2 [g] (1334)"},
|
||||||
|
{value: 1335, text: "SFA 11:0 [g] (1335)"},
|
||||||
|
{value: 1340, text: "Daidzein [mg] (1340)"},
|
||||||
|
{value: 1341, text: "Genistein [mg] (1341)"},
|
||||||
|
{value: 1404, text: "PUFA 18:3 n-3 c,c,c (ALA) [g] (1404)"},
|
||||||
|
{value: 1405, text: "PUFA 20:3 n-3 [g] (1405)"},
|
||||||
|
{value: 1406, text: "PUFA 20:3 n-6 [g] (1406)"},
|
||||||
|
{value: 1409, text: "PUFA 18:3i [g] (1409)"},
|
||||||
|
{value: 1411, text: "PUFA 22:4 [g] (1411)"},
|
||||||
|
{value: 1414, text: "PUFA 20:3 n-9 [g] (1414)"},
|
||||||
|
{value: 2000, text: "Sugars, total including NLEA [g] (2000)"},
|
||||||
|
{value: 2003, text: "SFA 5:0 [g] (2003)"},
|
||||||
|
{value: 2004, text: "SFA 7:0 [g] (2004)"},
|
||||||
|
{value: 2005, text: "SFA 9:0 [g] (2005)"},
|
||||||
|
{value: 2006, text: "SFA 21:0 [g] (2006)"},
|
||||||
|
{value: 2007, text: "SFA 23:0 [g] (2007)"},
|
||||||
|
{value: 2008, text: "MUFA 12:1 [g] (2008)"},
|
||||||
|
{value: 2009, text: "MUFA 14:1 c [g] (2009)"},
|
||||||
|
{value: 2010, text: "MUFA 17:1 c [g] (2010)"},
|
||||||
|
{value: 2012, text: "MUFA 20:1 c [g] (2012)"},
|
||||||
|
{value: 2013, text: "TFA 20:1 t [g] (2013)"},
|
||||||
|
{value: 2014, text: "MUFA 22:1 n-9 [g] (2014)"},
|
||||||
|
{value: 2015, text: "MUFA 22:1 n-11 [g] (2015)"},
|
||||||
|
{value: 2016, text: "PUFA 18:2 c [g] (2016)"},
|
||||||
|
{value: 2017, text: "TFA 18:2 t [g] (2017)"},
|
||||||
|
{value: 2018, text: "PUFA 18:3 c [g] (2018)"},
|
||||||
|
{value: 2019, text: "TFA 18:3 t [g] (2019)"},
|
||||||
|
{value: 2020, text: "PUFA 20:3 c [g] (2020)"},
|
||||||
|
{value: 2021, text: "PUFA 22:3 [g] (2021)"},
|
||||||
|
{value: 2022, text: "PUFA 20:4c [g] (2022)"},
|
||||||
|
{value: 2023, text: "PUFA 20:5c [g] (2023)"},
|
||||||
|
{value: 2024, text: "PUFA 22:5 c [g] (2024)"},
|
||||||
|
{value: 2025, text: "PUFA 22:6 c [g] (2025)"},
|
||||||
|
{value: 2026, text: "PUFA 20:2 c [g] (2026)"},
|
||||||
|
{value: 2028, text: "trans-beta-Carotene [µg] (2028)"},
|
||||||
|
{value: 2029, text: "trans-Lycopene [µg] (2029)"},
|
||||||
|
{value: 2032, text: "Cryptoxanthin, alpha [µg] (2032)"},
|
||||||
|
{value: 2033, text: "Total dietary fiber (AOAC 2011.25) [g] (2033)"},
|
||||||
|
{value: 2038, text: "High Molecular Weight Dietary Fiber (HMWDF) [g] (2038)"},
|
||||||
|
{value: 2047, text: "Energy (Atwater General Factors) [kcal] (2047)"},
|
||||||
|
{value: 2048, text: "Energy (Atwater Specific Factors) [kcal] (2048)"},
|
||||||
|
{value: 2049, text: "Daidzin [mg] (2049)"},
|
||||||
|
{value: 2050, text: "Genistin [mg] (2050)"},
|
||||||
|
{value: 2051, text: "Glycitin [mg] (2051)"},
|
||||||
|
{value: 2052, text: "Delta-7-Stigmastenol [mg] (2052)"},
|
||||||
|
{value: 2053, text: "Stigmastadiene [mg] (2053)"},
|
||||||
|
{value: 2057, text: "Ergothioneine [mg] (2057)"},
|
||||||
|
{value: 2058, text: "Beta-glucan [g] (2058)"},
|
||||||
|
{value: 2059, text: "Vitamin D4 [µg] (2059)"},
|
||||||
|
{value: 2060, text: "Ergosta-7-enol [mg] (2060)"},
|
||||||
|
{value: 2061, text: " Ergosta-7,22-dienol [mg] (2061)"},
|
||||||
|
{value: 2062, text: " Ergosta-5,7-dienol [mg] (2062)"},
|
||||||
|
{value: 2063, text: "Verbascose [g] (2063)"},
|
||||||
|
{value: 2065, text: "Low Molecular Weight Dietary Fiber (LMWDF) [g] (2065)"},
|
||||||
|
{value: 2066, text: "Vitamin A [mg] (2066)"},
|
||||||
|
{value: 2069, text: "Glutathione [mg] (2069)"},
|
||||||
|
]
|
||||||
@@ -84,6 +84,7 @@ export default createVuetify({
|
|||||||
books: 'fa-solid fa-book-bookmark',
|
books: 'fa-solid fa-book-bookmark',
|
||||||
menu: 'fa-solid fa-ellipsis-vertical',
|
menu: 'fa-solid fa-ellipsis-vertical',
|
||||||
import: 'fa-solid fa-globe',
|
import: 'fa-solid fa-globe',
|
||||||
|
properties: 'fa-solid fa-database',
|
||||||
ai: 'fa-solid fa-wand-magic-sparkles'
|
ai: 'fa-solid fa-wand-magic-sparkles'
|
||||||
},
|
},
|
||||||
sets: {
|
sets: {
|
||||||
|
|||||||
Reference in New Issue
Block a user