diff --git a/src/Mealz/MealBundle/Controller/DishController.php b/src/Mealz/MealBundle/Controller/DishController.php index b0641766a..d9b739d2a 100644 --- a/src/Mealz/MealBundle/Controller/DishController.php +++ b/src/Mealz/MealBundle/Controller/DishController.php @@ -6,6 +6,7 @@ use App\Mealz\MealBundle\Entity\Dish; use App\Mealz\MealBundle\Entity\DishCollection; +use App\Mealz\MealBundle\Enum\Diet; use App\Mealz\MealBundle\Repository\CategoryRepositoryInterface; use App\Mealz\MealBundle\Repository\DishRepositoryInterface; use App\Mealz\MealBundle\Service\ApiService; @@ -88,6 +89,9 @@ public function new(Request $request): JsonResponse if (true === $this->apiService->isParamValid($parameters, 'category', 'integer')) { $dish->setCategory($this->categoryRepository->find($parameters['category'])); } + if (true === $this->apiService->isParamValid($parameters, 'diet', 'string')) { + $dish->setDiet(Diet::tryFrom($parameters['diet'])); + } $this->em->persist($dish); $this->em->flush(); diff --git a/src/Mealz/MealBundle/Service/DishService.php b/src/Mealz/MealBundle/Service/DishService.php index 4c3baa502..fdc38bfc8 100644 --- a/src/Mealz/MealBundle/Service/DishService.php +++ b/src/Mealz/MealBundle/Service/DishService.php @@ -7,6 +7,7 @@ use App\Mealz\MealBundle\Entity\Dish; use App\Mealz\MealBundle\Entity\DishVariation; use App\Mealz\MealBundle\Entity\Meal; +use App\Mealz\MealBundle\Enum\Diet; use App\Mealz\MealBundle\Repository\CategoryRepository; use App\Mealz\MealBundle\Repository\DishRepository; use Exception; @@ -81,6 +82,9 @@ public function updateHelper(Dish $dish, array $parameters): void if (true === $this->apiService->isParamValid($parameters, 'category', 'integer')) { $dish->setCategory($this->categoryRepository->find($parameters['category'])); } + if (true === $this->apiService->isParamValid($parameters, 'diet', 'string')) { + $dish->setDiet(Diet::tryFrom($parameters['diet'])); + } } public function getDishCount(): array diff --git a/src/Resources/src/api/postCreateDish.ts b/src/Resources/src/api/postCreateDish.ts index b6b2afa2a..49b66ec8a 100644 --- a/src/Resources/src/api/postCreateDish.ts +++ b/src/Resources/src/api/postCreateDish.ts @@ -1,5 +1,6 @@ import { IMessage } from '@/interfaces/IMessage'; import useApi from './api'; +import { Diet } from '@/enums/Diet'; export interface CreateDishDTO { titleDe: string; @@ -8,6 +9,7 @@ export interface CreateDishDTO { descriptionDe?: string; descriptionEn?: string; category?: number; + diet?: Diet } /** diff --git a/src/Resources/src/api/postCreateDishVariation.ts b/src/Resources/src/api/postCreateDishVariation.ts index f01916e45..396943e36 100644 --- a/src/Resources/src/api/postCreateDishVariation.ts +++ b/src/Resources/src/api/postCreateDishVariation.ts @@ -1,9 +1,11 @@ import { IMessage } from '@/interfaces/IMessage'; import useApi from './api'; +import { Diet } from '@/enums/Diet'; export interface CreateDishVariationDTO { titleDe?: string; titleEn?: string; + diet?: Diet } /** diff --git a/src/Resources/src/components/categories/CategoriesDropDown.vue b/src/Resources/src/components/categories/CategoriesDropDown.vue index c7b5903c8..8de4dc373 100644 --- a/src/Resources/src/components/categories/CategoriesDropDown.vue +++ b/src/Resources/src/components/categories/CategoriesDropDown.vue @@ -10,7 +10,7 @@ {{ locale === 'en' ? selectedCategory.titleEn : selectedCategory.titleDe }} @@ -21,24 +21,29 @@ aria-hidden="true" /> - - - - {{ locale === 'en' ? category.titleEn : category.titleDe }} - - - + + {{ locale === 'en' ? category.titleEn : category.titleDe }} + + + + diff --git a/src/Resources/src/components/dishes/DishesCreationPanel.vue b/src/Resources/src/components/dishes/DishesCreationPanel.vue index b5fb61ce3..9bc58b95d 100644 --- a/src/Resources/src/components/dishes/DishesCreationPanel.vue +++ b/src/Resources/src/components/dishes/DishesCreationPanel.vue @@ -8,31 +8,31 @@
@@ -43,11 +43,18 @@ :sr="t('dish.popover.oneSizeServing')" :initial="oneSizeServing" class="my-auto ml-4" - @toggle="(value) => setOneSizeServing(value)" + @toggle="(value) => dishInput.oneServingSize = value" />
- + + {{ t('dish.diet.diet') }} + +
@@ -57,12 +64,14 @@ import { useI18n } from 'vue-i18n'; import SubmitButton from '../misc/SubmitButton.vue'; import InputLabel from '../misc/InputLabel.vue'; import { useDishes } from '@/stores/dishesStore'; -import { onMounted, ref } from 'vue'; +import { computed, onMounted, reactive, ref, watch } from 'vue'; import { CreateDishDTO } from '@/api/postCreateDish'; import CategoriesDropDown from '../categories/CategoriesDropDown.vue'; import { useCategories } from '@/stores/categoriesStore'; import Switch from '@/components/misc/Switch.vue'; import { SwitchGroup, SwitchLabel } from '@headlessui/vue'; +import ListOptionsDropDown from '@/components/misc/ListOptionsDropDown.vue'; +import { Diet } from '@/enums/Diet'; const { t } = useI18n(); const { createDish, updateDish } = useDishes(); @@ -76,6 +85,7 @@ const props = withDefaults( descriptionEn?: string | null; categoryId?: number | null; oneSizeServing?: boolean; + diet?: Diet, dishId?: number | null; edit?: boolean; }>(), @@ -86,6 +96,7 @@ const props = withDefaults( descriptionEn: null, categoryId: null, oneSizeServing: false, + diet: Diet.MEAT, dishId: null, edit: false } @@ -97,40 +108,61 @@ onMounted(async () => { await fetchCategories(); }); -const titleDeInput = ref(props.titleDe); -const titleEnInput = ref(props.titleEn); -const descriptionDeInput = ref(props.descriptionDe); -const descriptionEnInput = ref(props.descriptionEn); +const dietOptions = computed(() => { + return [Diet.MEAT, Diet.VEGAN, Diet.VEGETARIAN].map(diet => { + return { + value: diet, + label: getDietOption(diet) + }; + }); +}); +const dietInput = ref({ + value: props.diet, + label: getDietOption(props.diet) +}); + const categoryDropDown = ref | null>(null); -const oneSizeServingInput = ref(props.oneSizeServing); + const required = ref(false); +const dishInput = reactive({ + titleDe: props.titleDe, + titleEn: props.titleEn, + descriptionDe: props.descriptionDe, + descriptionEn: props.descriptionEn, + oneServingSize: props.oneSizeServing, + diet: props.diet, + category: null +}); + +watch( + () => categoryDropDown.value?.selectedCategory.id, + () => { + dishInput.category = categoryDropDown.value?.selectedCategory.id; + } +); + +watch( + () => dietInput.value, + () => { + dishInput.diet = dietInput.value.value + } +); + async function onSubmit() { required.value = true; - if (titleDeInput.value === '' || titleEnInput.value === '') { + if (dishInput.titleDe === '' || dishInput.titleEn === '') { return; } if (props.edit === true) { - await updateDish(props.dishId, createDishDtoObject()); + await updateDish(props.dishId, dishInput); } else { - await createDish(createDishDtoObject()); + await createDish(dishInput); } emit('closePanel'); } -function createDishDtoObject() { - const dish: CreateDishDTO = { - titleDe: titleDeInput.value, - titleEn: titleEnInput.value, - oneServingSize: oneSizeServingInput.value, - descriptionDe: descriptionDeInput.value, - descriptionEn: descriptionEnInput.value, - category: categoryDropDown.value?.selectedCategory.id - }; - return dish; -} - -function setOneSizeServing(state: boolean) { - oneSizeServingInput.value = state; +function getDietOption(diet: Diet): string { + return t(`dish.diet.${diet}`); } diff --git a/src/Resources/src/components/misc/ListOptionsDropDown.vue b/src/Resources/src/components/misc/ListOptionsDropDown.vue new file mode 100644 index 000000000..da787ed0d --- /dev/null +++ b/src/Resources/src/components/misc/ListOptionsDropDown.vue @@ -0,0 +1,77 @@ + + + \ No newline at end of file diff --git a/src/Resources/src/locales/de.json b/src/Resources/src/locales/de.json index 39b24191a..ccce6814e 100644 --- a/src/Resources/src/locales/de.json +++ b/src/Resources/src/locales/de.json @@ -120,6 +120,12 @@ "edit": "Variation editieren", "new": "Variation erstellen" } + }, + "diet": { + "diet": "Ernährungsweise", + "vegan": "Vegan", + "vegetarian": "Vegetarisch", + "meat": "Beinhaltet Fleisch" } }, "event": { diff --git a/src/Resources/src/locales/en.json b/src/Resources/src/locales/en.json index e18ce5f16..c4d4e01ca 100644 --- a/src/Resources/src/locales/en.json +++ b/src/Resources/src/locales/en.json @@ -120,6 +120,12 @@ "edit": "Edit Variation", "new": "Create Variation" } + }, + "diet": { + "diet": "Diet", + "vegan": "Vegan", + "vegetarian": "Vegetarisch", + "meat": "Beinhaltet Fleisch" } }, "event": {