220 lines
6.8 KiB
Vue
220 lines
6.8 KiB
Vue
|
<template>
|
||
|
<div class="full-width">
|
||
|
<div
|
||
|
v-for="ingredient in ingredients"
|
||
|
:key="`volume:${volume.id},ingredient:${ingredient.id}`"
|
||
|
class="full-width row justify-evenly q-py-xs"
|
||
|
>
|
||
|
<div class="full-width row justify-evenly">
|
||
|
<div class="col" v-if="ingredient.drink_ingredient">
|
||
|
<div class="full-width row justify-evenly q-py-xs">
|
||
|
<div class="col">
|
||
|
{{ ingredient.drink_ingredient.drink_ingredient.name }}
|
||
|
<q-popup-edit
|
||
|
buttons
|
||
|
label-cancel="Abbrechen"
|
||
|
label-set="Speichern"
|
||
|
v-model="ingredient.drink_ingredient.drink_ingredient"
|
||
|
@save="updateIngredient(ingredient, volume)"
|
||
|
>
|
||
|
<q-select
|
||
|
class="col q-px-sm"
|
||
|
label="Getränk"
|
||
|
filled
|
||
|
dense
|
||
|
:options="drinks"
|
||
|
option-label="name"
|
||
|
v-model="ingredient.drink_ingredient.drink_ingredient"
|
||
|
/>
|
||
|
</q-popup-edit>
|
||
|
</div>
|
||
|
<div class="col">
|
||
|
{{ ingredient.drink_ingredient.volume.toFixed(3) }}L
|
||
|
<q-popup-edit
|
||
|
buttons
|
||
|
label-cancel="Abbrechen"
|
||
|
label-set="Speichern"
|
||
|
v-model="ingredient.drink_ingredient.volume"
|
||
|
@save="updateIngredient(ingredient, volume)"
|
||
|
>
|
||
|
<q-input
|
||
|
class="col q-px-sm"
|
||
|
label="Volume"
|
||
|
type="number"
|
||
|
filled
|
||
|
dense
|
||
|
suffix="L"
|
||
|
v-model.number="ingredient.drink_ingredient.volume"
|
||
|
step="0.01"
|
||
|
min="0"
|
||
|
/>
|
||
|
</q-popup-edit>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div v-else-if="ingredient.extra_ingredient" class="col">
|
||
|
<div class="full-width row justify-evenly q-py-xs">
|
||
|
<div class="col">
|
||
|
{{ ingredient.extra_ingredient.name }}
|
||
|
</div>
|
||
|
<div class="col">{{ ingredient.extra_ingredient.price.toFixed(3) }}€</div>
|
||
|
</div>
|
||
|
<q-popup-edit
|
||
|
v-model="ingredient.extra_ingredient"
|
||
|
buttons
|
||
|
label-cancel="Abbrechen"
|
||
|
label-set="Speichern"
|
||
|
@save="updateIngredient(ingredient, volume)"
|
||
|
>
|
||
|
<q-select
|
||
|
filled
|
||
|
dense
|
||
|
v-model="ingredient.extra_ingredient"
|
||
|
:options="extra_ingredients"
|
||
|
option-label="name"
|
||
|
/>
|
||
|
</q-popup-edit>
|
||
|
</div>
|
||
|
<div class="col-1 row justify-end q-pa-xs">
|
||
|
<q-btn
|
||
|
icon="mdi-delete"
|
||
|
round
|
||
|
size="xs"
|
||
|
color="negative"
|
||
|
@click="deleteIngredient(ingredient, volume)"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
<q-separator />
|
||
|
</div>
|
||
|
<div class="full-width row justify-end q-py-xs">
|
||
|
<q-btn size="sm" icon-right="add" color="positive" label="Zutat hinzufügen">
|
||
|
<q-menu anchor="center middle" self="center middle">
|
||
|
<div class="full-width row justify-around q-gutter-sm q-pa-sm">
|
||
|
<div class="col">
|
||
|
<q-select
|
||
|
filled
|
||
|
dense
|
||
|
label="Zutat"
|
||
|
:options="[...drinks, ...extra_ingredients]"
|
||
|
option-label="name"
|
||
|
v-model="newIngredient"
|
||
|
/>
|
||
|
</div>
|
||
|
<div class="col">
|
||
|
<q-input
|
||
|
filled
|
||
|
dense
|
||
|
label="Volume"
|
||
|
type="number"
|
||
|
steps="0.1"
|
||
|
v-model.number="newIngredientVolume"
|
||
|
v-if="newIngredient && newIngredient.volume"
|
||
|
/>
|
||
|
<q-input
|
||
|
v-else-if="newIngredient && newIngredient.price"
|
||
|
filled
|
||
|
dense
|
||
|
label="Preis"
|
||
|
disable
|
||
|
:value="newIngredient.price.toFixed(3)"
|
||
|
suffix="€"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="full-width row jusitfy-between q-gutter-sm q-pa-sm">
|
||
|
<q-btn label="Abbrechen" @click="cancelAddIngredient" v-close-popup />
|
||
|
<q-btn
|
||
|
label="Speichern"
|
||
|
color="positive"
|
||
|
@click="addIngredient(volume)"
|
||
|
v-close-popup
|
||
|
/>
|
||
|
</div>
|
||
|
</q-menu>
|
||
|
</q-btn>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script lang="ts">
|
||
|
import { computed, defineComponent, ref } from '@vue/composition-api';
|
||
|
import store, { DrinkPriceVolume } from '../../store/altStore';
|
||
|
export default defineComponent({
|
||
|
name: 'Ingredients',
|
||
|
props: {
|
||
|
ingredients: {
|
||
|
type: Array as () => Array<FG.Ingredient>,
|
||
|
required: true
|
||
|
},
|
||
|
volume: {
|
||
|
type: Object as () => DrinkPriceVolume,
|
||
|
required: true
|
||
|
}
|
||
|
},
|
||
|
setup() {
|
||
|
const emptyIngredient: FG.Ingredient = {
|
||
|
id: -1,
|
||
|
drink_ingredient: null,
|
||
|
extra_ingredient: null
|
||
|
};
|
||
|
const newIngredient = ref<FG.Drink | FG.ExtraIngredient>();
|
||
|
const newIngredientVolume = ref<number>(0);
|
||
|
function addIngredient(volume: DrinkPriceVolume) {
|
||
|
if ((<FG.Drink>newIngredient.value)?.volume) {
|
||
|
store.actions.setIngredient(
|
||
|
{
|
||
|
id: -1,
|
||
|
drink_ingredient: {
|
||
|
id: -1,
|
||
|
drink_ingredient: <FG.Drink>newIngredient.value,
|
||
|
volume: newIngredientVolume.value
|
||
|
},
|
||
|
extra_ingredient: null
|
||
|
},
|
||
|
volume
|
||
|
);
|
||
|
} else if (newIngredient) {
|
||
|
store.actions.setIngredient(
|
||
|
{
|
||
|
id: -1,
|
||
|
drink_ingredient: null,
|
||
|
extra_ingredient: <FG.ExtraIngredient>newIngredient.value
|
||
|
},
|
||
|
volume
|
||
|
);
|
||
|
}
|
||
|
cancelAddIngredient();
|
||
|
}
|
||
|
function cancelAddIngredient() {
|
||
|
setTimeout(() => {
|
||
|
(newIngredient.value = undefined), (newIngredientVolume.value = 0);
|
||
|
}, 200);
|
||
|
}
|
||
|
function updateIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
||
|
store.actions.updateIngredient(ingredient, volume);
|
||
|
}
|
||
|
function deleteIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
||
|
store.actions.deleteIngredient(ingredient, volume);
|
||
|
}
|
||
|
const drinks = computed(() =>
|
||
|
store.state.drinks.filter(drink => !!drink.cost_price_pro_volume)
|
||
|
);
|
||
|
const extra_ingredients = computed(() => store.state.extraIngredients);
|
||
|
|
||
|
return {
|
||
|
addIngredient,
|
||
|
drinks,
|
||
|
extra_ingredients,
|
||
|
newIngredient,
|
||
|
newIngredientVolume,
|
||
|
cancelAddIngredient,
|
||
|
updateIngredient,
|
||
|
deleteIngredient
|
||
|
};
|
||
|
}
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
<style scoped></style>
|