mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-11-03 02:33:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			187 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <v-container class="md-container">
 | 
						|
    <BasePageTitle divider>
 | 
						|
      <template #header>
 | 
						|
        <v-img max-height="100" max-width="100" :src="require('~/static/svgs/manage-cookbooks.svg')"></v-img>
 | 
						|
      </template>
 | 
						|
      <template #title> {{ $t('meal-plan.meal-plan-rules') }} </template>
 | 
						|
      {{ $t('meal-plan.meal-plan-rules-description') }}
 | 
						|
    </BasePageTitle>
 | 
						|
 | 
						|
    <v-card>
 | 
						|
      <v-card-title class="headline"> {{ $t('meal-plan.new-rule') }} </v-card-title>
 | 
						|
      <v-divider class="mx-2"></v-divider>
 | 
						|
      <v-card-text>
 | 
						|
        {{ $t('meal-plan.new-rule-description') }}
 | 
						|
 | 
						|
        <GroupMealPlanRuleForm
 | 
						|
          class="mt-2"
 | 
						|
          :day.sync="createData.day"
 | 
						|
          :entry-type.sync="createData.entryType"
 | 
						|
          :categories.sync="createData.categories"
 | 
						|
          :tags.sync="createData.tags"
 | 
						|
        />
 | 
						|
      </v-card-text>
 | 
						|
      <v-card-actions class="justify-end">
 | 
						|
        <BaseButton create @click="createRule" />
 | 
						|
      </v-card-actions>
 | 
						|
    </v-card>
 | 
						|
 | 
						|
    <section>
 | 
						|
      <BaseCardSectionTitle class="mt-10" :title="$tc('meal-plan.recipe-rules')" />
 | 
						|
      <div>
 | 
						|
        <div v-for="(rule, idx) in allRules" :key="rule.id">
 | 
						|
          <v-card class="my-2 left-border">
 | 
						|
            <v-card-title class="headline pb-1">
 | 
						|
              {{ rule.day === "unset" ? $t('meal-plan.applies-to-all-days') : $t('meal-plan.applies-on-days', [rule.day]) }}
 | 
						|
              {{ rule.entryType === "unset" ? $t('meal-plan.for-all-meal-types') : $t('meal-plan.for-type-meal-types', [rule.entryType]) }}
 | 
						|
              <span class="ml-auto">
 | 
						|
                <BaseButtonGroup
 | 
						|
                  :buttons="[
 | 
						|
                    {
 | 
						|
                      icon: $globals.icons.edit,
 | 
						|
                      text: $tc('general.edit'),
 | 
						|
                      event: 'edit',
 | 
						|
                    },
 | 
						|
                    {
 | 
						|
                      icon: $globals.icons.delete,
 | 
						|
                      text: $tc('general.delete'),
 | 
						|
                      event: 'delete',
 | 
						|
                    },
 | 
						|
                  ]"
 | 
						|
                  @delete="deleteRule(rule.id)"
 | 
						|
                  @edit="toggleEditState(rule.id)"
 | 
						|
                />
 | 
						|
              </span>
 | 
						|
            </v-card-title>
 | 
						|
            <v-card-text>
 | 
						|
              <template v-if="!editState[rule.id]">
 | 
						|
                <div v-if="rule.categories">
 | 
						|
                  <h4 class="py-1">{{ $t("category.categories") }}:</h4>
 | 
						|
                  <RecipeChips :items="rule.categories" small />
 | 
						|
                </div>
 | 
						|
 | 
						|
                <div v-if="rule.tags">
 | 
						|
                  <h4 class="py-1">{{ $t("tag.tags") }}:</h4>
 | 
						|
                  <RecipeChips :items="rule.tags" url-prefix="tags" small />
 | 
						|
                </div>
 | 
						|
              </template>
 | 
						|
              <template v-else>
 | 
						|
                <GroupMealPlanRuleForm
 | 
						|
                  :day.sync="allRules[idx].day"
 | 
						|
                  :entry-type.sync="allRules[idx].entryType"
 | 
						|
                  :categories.sync="allRules[idx].categories"
 | 
						|
                  :tags.sync="allRules[idx].tags"
 | 
						|
                />
 | 
						|
                <div class="d-flex justify-end">
 | 
						|
                  <BaseButton update @click="updateRule(rule)" />
 | 
						|
                </div>
 | 
						|
              </template>
 | 
						|
            </v-card-text>
 | 
						|
          </v-card>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    </section>
 | 
						|
  </v-container>
 | 
						|
</template>
 | 
						|
 | 
						|
<script lang="ts">
 | 
						|
import { defineComponent, ref, useAsync } from "@nuxtjs/composition-api";
 | 
						|
import { useUserApi } from "~/composables/api";
 | 
						|
import { PlanRulesCreate, PlanRulesOut } from "~/lib/api/types/meal-plan";
 | 
						|
import GroupMealPlanRuleForm from "~/components/Domain/Group/GroupMealPlanRuleForm.vue";
 | 
						|
import { useAsyncKey } from "~/composables/use-utils";
 | 
						|
import RecipeChips from "~/components/Domain/Recipe/RecipeChips.vue";
 | 
						|
 | 
						|
export default defineComponent({
 | 
						|
  components: {
 | 
						|
    GroupMealPlanRuleForm,
 | 
						|
    RecipeChips,
 | 
						|
  },
 | 
						|
  props: {
 | 
						|
    value: {
 | 
						|
      type: Boolean,
 | 
						|
      default: false,
 | 
						|
    },
 | 
						|
  },
 | 
						|
  setup() {
 | 
						|
    const api = useUserApi();
 | 
						|
 | 
						|
    // ======================================================
 | 
						|
    // Manage All
 | 
						|
    const editState = ref<{ [key: string]: boolean }>({});
 | 
						|
    const allRules = ref<PlanRulesOut[]>([]);
 | 
						|
 | 
						|
    function toggleEditState(id: string) {
 | 
						|
      editState.value[id] = !editState.value[id];
 | 
						|
      editState.value = { ...editState.value };
 | 
						|
    }
 | 
						|
 | 
						|
    async function refreshAll() {
 | 
						|
      const { data } = await api.mealplanRules.getAll();
 | 
						|
 | 
						|
      if (data) {
 | 
						|
        allRules.value = data.items ?? [];
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    useAsync(async () => {
 | 
						|
      await refreshAll();
 | 
						|
    }, useAsyncKey());
 | 
						|
 | 
						|
    // ======================================================
 | 
						|
    // Creating Rules
 | 
						|
 | 
						|
    const createData = ref<PlanRulesCreate>({
 | 
						|
      entryType: "unset",
 | 
						|
      day: "unset",
 | 
						|
      categories: [],
 | 
						|
      tags: [],
 | 
						|
    });
 | 
						|
 | 
						|
    async function createRule() {
 | 
						|
      const { data } = await api.mealplanRules.createOne(createData.value);
 | 
						|
      if (data) {
 | 
						|
        refreshAll();
 | 
						|
        createData.value = {
 | 
						|
          entryType: "unset",
 | 
						|
          day: "unset",
 | 
						|
          categories: [],
 | 
						|
          tags: [],
 | 
						|
        };
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    async function deleteRule(ruleId: string) {
 | 
						|
      const { data } = await api.mealplanRules.deleteOne(ruleId);
 | 
						|
      if (data) {
 | 
						|
        refreshAll();
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    async function updateRule(rule: PlanRulesOut) {
 | 
						|
      const { data } = await api.mealplanRules.updateOne(rule.id, rule);
 | 
						|
      if (data) {
 | 
						|
        refreshAll();
 | 
						|
        toggleEditState(rule.id);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    return {
 | 
						|
      allRules,
 | 
						|
      createData,
 | 
						|
      createRule,
 | 
						|
      deleteRule,
 | 
						|
      editState,
 | 
						|
      updateRule,
 | 
						|
      toggleEditState,
 | 
						|
    };
 | 
						|
  },
 | 
						|
  head() {
 | 
						|
    return {
 | 
						|
      title: this.$tc("meal-plan.meal-plan-settings"),
 | 
						|
    };
 | 
						|
  },
 | 
						|
});
 | 
						|
</script>
 |