Merge branch 'develop' into feature/shopping-ui

This commit is contained in:
vabene1111 2024-01-23 15:52:31 +01:00
commit 43aac60e9c
13 changed files with 284 additions and 265 deletions

View File

@ -96,7 +96,7 @@ Share some information on how you use Tandoor to help me improve the application
Beginning with version 0.10.0 the code in this repository is licensed under the [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.de.html) license with a Beginning with version 0.10.0 the code in this repository is licensed under the [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.de.html) license with a
[common clause](https://commonsclause.com/) selling exception. See [LICENSE.md](https://github.com/vabene1111/recipes/blob/develop/LICENSE.md) for details. [common clause](https://commonsclause.com/) selling exception. See [LICENSE.md](https://github.com/vabene1111/recipes/blob/develop/LICENSE.md) for details.
> NOTE: There appears to be a whole range of legal issues with licensing anything else then the standard completely open licenses. > NOTE: There appears to be a whole range of legal issues with licensing anything other than the standard completely open licenses.
> I am in the process of getting some professional legal advice to sort out these issues. > I am in the process of getting some professional legal advice to sort out these issues.
> Please also see [Issue 238](https://github.com/vabene1111/recipes/issues/238) for some discussion and **reasoning** regarding the topic. > Please also see [Issue 238](https://github.com/vabene1111/recipes/issues/238) for some discussion and **reasoning** regarding the topic.

View File

@ -10,7 +10,7 @@
<title>{% block title %} <title>{% block title %}
{% endblock %}</title> {% endblock %}</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover">
<meta name="robots" content="noindex,nofollow"/> <meta name="robots" content="noindex,nofollow"/>
<link rel="icon" href="{{ theme_values.logo_color_svg }}"> <link rel="icon" href="{{ theme_values.logo_color_svg }}">
@ -481,6 +481,14 @@
overflow-x: hidden; overflow-x: hidden;
} }
} }
#id_base_container {
padding-bottom: env(safe-area-inset-bottom);
}
.fixed-bottom {
padding-bottom: max(0.5rem, calc(env(safe-area-inset-bottom) - 0.5rem)) !important;
}
</style> </style>
</body> </body>

View File

@ -45,7 +45,7 @@ To restore:
cat pgdump.sql | sudo docker exec -i docker_db_recipes_1 psql postgres -U djangouser cat pgdump.sql | sudo docker exec -i docker_db_recipes_1 psql postgres -U djangouser
``` ```
This connects to the postgres table instead of the actual dgangodb table, as the import function needs to delete the table, which can't be dropped off you're connected to it. This connects to the postgres table instead of the actual djangodb table, as the import function needs to delete the table, which can't be dropped off you're connected to it.
## Backup using export and import ## Backup using export and import
You can now export recipes from Tandoor using the export function. This method requires a working web interface. You can now export recipes from Tandoor using the export function. This method requires a working web interface.

View File

@ -81,7 +81,7 @@ sudo mv -R ~/.docker/compose/postgres ~/.docker/compose/postgres.old
``` ```
8. Install postgres extensions 8. Install postgres extensions
``` bash ``` bash
docker exec -it {{database_container}} psql docker exec -it {{database_container}} psql postgres -U {{djangouser}}
``` ```
then then
``` psql ``` psql

View File

@ -14,7 +14,7 @@ bleach==6.0.0
gunicorn==20.1.0 gunicorn==20.1.0
lxml==4.9.3 lxml==4.9.3
Markdown==3.5.1 Markdown==3.5.1
Pillow==10.1.0 Pillow==10.2.0
psycopg2-binary==2.9.5 psycopg2-binary==2.9.5
python-dotenv==1.0.0 python-dotenv==1.0.0
requests==2.31.0 requests==2.31.0

View File

@ -45,7 +45,7 @@
"vue-template-compiler": "2.7.14", "vue-template-compiler": "2.7.14",
"vue2-touch-events": "^3.2.2", "vue2-touch-events": "^3.2.2",
"vuedraggable": "^2.24.3", "vuedraggable": "^2.24.3",
"workbox-webpack-plugin": "^6.5.4", "workbox-webpack-plugin": "^7.0.0",
"workbox-window": "^7.0.0" "workbox-window": "^7.0.0"
}, },
"devDependencies": { "devDependencies": {

View File

@ -1321,3 +1321,9 @@ textarea:not(.form-control) {
border: 0 !important; border: 0 !important;
} }
</style> </style>
<style scoped>
.row.fixed-bottom {
margin: 0;
}
</style>

View File

@ -108,4 +108,4 @@ export default {
-o-transform: translate(-50%, 0); -o-transform: translate(-50%, 0);
transform: translate(-50%, 0); transform: translate(-50%, 0);
} }
</style> </style>

View File

@ -231,7 +231,7 @@ export default {
font-size: 1.25rem; font-size: 1.25rem;
line-height: 1; line-height: 1;
background-color: transparent; background-color: transparent;
border: 1px solid rgba(46, 46, 46, 0.5); border: 1px solid rgba(46, 46, 46, 0.1);
border-radius: 0.1875rem; border-radius: 0.1875rem;
z-index: 1001; z-index: 1001;
} }

View File

@ -2,8 +2,7 @@
<div> <div>
<template v-if="recipe && recipe.loading"> <template v-if="recipe && recipe.loading">
<b-card no-body v-hover style="height: 100%"> <b-card no-body v-hover style="height: 100%">
<b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="placeholder_image" <b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="placeholder_image" v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
<b-card-body class="p-4"> <b-card-body class="p-4">
<h6> <h6>
@ -20,30 +19,32 @@
</template> </template>
<template v-else> <template v-else>
<b-card no-body v-hover v-if="recipe" style="height: 100%"> <b-card no-body v-hover v-if="recipe" style="height: 100%">
<a :href="recipe_link"> <a :href="recipe_link">
<div class="content"> <div class="content">
<div class="content-overlay" v-if="recipe.description !== null && recipe.description !== ''"></div> <div class="content-overlay" v-if="recipe.description !== null && recipe.description !== ''"></div>
<b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="recipe_image" <b-card-img-lazy style="height: 15vh; object-fit: cover" class="" :src="recipe_image" v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
v-bind:alt="$t('Recipe_Image')" top></b-card-img-lazy>
<div class="content-details" > <div class="content-details">
<p class="content-text"> <p class="content-text">
{{ recipe.description }} {{ recipe.description }}
</p> </p>
</div> </div>
<div class="card-img-overlay d-flex flex-column justify-content-left float-left text-left pt-2" style="width:40%" <b-row class="card-img-overlay pt-1">
v-if="recipe.working_time !== 0 || recipe.waiting_time !== 0"> <b-col cols="6">
<b-badge pill variant="light" class="mt-1 font-weight-normal" v-if="recipe.working_time !== 0 && recipe.working_time !== undefined"> <div v-if="recipe.working_time !== 0 || recipe.waiting_time !== 0">
<i <b-badge pill variant="light" class="mt-1 font-weight-normal" v-if="recipe.working_time !== 0 && recipe.working_time !== undefined">
class="fa fa-clock"></i> {{ working_time }} <i class="fa fa-clock"></i> {{ working_time }}
</b-badge> </b-badge>
<b-badge pill variant="secondary" class="mt-1 font-weight-normal" <b-badge pill variant="secondary" class="mt-1 font-weight-normal" v-if="recipe.waiting_time !== 0 && recipe.waiting_time !== undefined">
v-if="recipe.waiting_time !== 0 && recipe.waiting_time !== undefined"> <i class="fa fa-pause"></i> {{ waiting_time }}
<i class="fa fa-pause"></i> {{ waiting_time }} </b-badge>
</b-badge> </div>
</div> </b-col>
<b-col cols="6" class="text-right">
<recipe-rating :recipe="recipe" :pill="true"></recipe-rating>
</b-col>
</b-row>
</div> </div>
</a> </a>
@ -51,18 +52,20 @@
<div class="d-flex flex-row"> <div class="d-flex flex-row">
<div class="flex-grow-1"> <div class="flex-grow-1">
<a :href="recipe_link" class="text-body font-weight-bold two-row-text"> <a :href="recipe_link" class="text-body font-weight-bold two-row-text">
<template v-if="recipe !== null">{{ recipe.name }}</template> <template v-if="recipe !== null">{{ recipe.name }}</template>
<template v-else>{{ meal_plan.title }}</template> <template v-else>{{ meal_plan.title }}</template>
</a> </a>
</div> </div>
<div class="justify-content-end"> <div class="justify-content-end">
<recipe-context-menu :recipe="recipe" class="justify-content-end float-right align-items-end pr-0" <recipe-context-menu
:disabled_options="context_disabled_options" :recipe="recipe"
v-if="recipe !== null && show_context_menu"></recipe-context-menu> class="justify-content-end float-right align-items-end pr-0"
:disabled_options="context_disabled_options"
v-if="recipe !== null && show_context_menu"
></recipe-context-menu>
</div> </div>
</div> </div>
<b-card-text style="text-overflow: ellipsis"> <b-card-text style="text-overflow: ellipsis">
<template v-if="recipe !== null"> <template v-if="recipe !== null">
<div v-if="show_detail"> <div v-if="show_detail">
@ -71,34 +74,29 @@
<p class="mt-1 mb-1"> <p class="mt-1 mb-1">
<last-cooked :recipe="recipe"></last-cooked> <last-cooked :recipe="recipe"></last-cooked>
<keywords-component :recipe="recipe" :limit="3" :enable_keyword_links="enable_keyword_links" <keywords-component
style="margin-top: 4px; position: relative; z-index: 3;"></keywords-component> :recipe="recipe"
:limit="3"
:enable_keyword_links="enable_keyword_links"
style="margin-top: 4px; position: relative; z-index: 3"
></keywords-component>
</p> </p>
<transition name="fade" mode="in-out"> <transition name="fade" mode="in-out">
<div class="row mt-3" v-if="show_detail"> <div class="row mt-3" v-if="show_detail">
<div class="col-md-12"> <div class="col-md-12">
<h6 class="card-title"><i class="fas fa-pepper-hot"></i> {{ $t("Ingredients") }} <h6 class="card-title"><i class="fas fa-pepper-hot"></i> {{ $t("Ingredients") }}</h6>
</h6>
<ingredients-card <ingredients-card :steps="recipe.steps" :header="false" :detailed="false" :servings="recipe.servings" />
:steps="recipe.steps"
:header="false"
:detailed="false"
:servings="recipe.servings"/>
</div> </div>
</div> </div>
</transition> </transition>
<b-badge pill variant="info" v-if="recipe.internal !== undefined && !recipe.internal">{{ $t("External") }}</b-badge> <b-badge pill variant="info" v-if="recipe.internal !== undefined && !recipe.internal">{{ $t("External") }}</b-badge>
</template> </template>
</b-card-text> </b-card-text>
</b-card-body> </b-card-body>
</b-card> </b-card>
</template> </template>
</div> </div>
<!-- <!--
@ -123,14 +121,14 @@
</template> </template>
<script> <script>
import RecipeContextMenu from "@/components/RecipeContextMenu" import IngredientsCard from "@/components/IngredientsCard"
import KeywordsComponent from "@/components/KeywordsComponent" import KeywordsComponent from "@/components/KeywordsComponent"
import {resolveDjangoUrl, ResolveUrlMixin, calculateHourMinuteSplit} from "@/utils/utils" import LastCooked from "@/components/LastCooked"
import RecipeContextMenu from "@/components/RecipeContextMenu"
import RecipeRating from "@/components/RecipeRating" import RecipeRating from "@/components/RecipeRating"
import { ResolveUrlMixin, calculateHourMinuteSplit, resolveDjangoUrl } from "@/utils/utils"
import moment from "moment/moment" import moment from "moment/moment"
import Vue from "vue" import Vue from "vue"
import LastCooked from "@/components/LastCooked"
import IngredientsCard from "@/components/IngredientsCard"
Vue.prototype.moment = moment Vue.prototype.moment = moment
@ -141,19 +139,20 @@ export default {
LastCooked, LastCooked,
KeywordsComponent, KeywordsComponent,
"recipe-context-menu": RecipeContextMenu, "recipe-context-menu": RecipeContextMenu,
IngredientsCard IngredientsCard,
RecipeRating,
}, },
props: { props: {
recipe: Object, recipe: Object,
meal_plan: Object, meal_plan: Object,
use_plural: {type: Boolean, default: false}, use_plural: { type: Boolean, default: false },
footer_text: String, footer_text: String,
footer_icon: String, footer_icon: String,
detailed: {type: Boolean, default: true}, detailed: { type: Boolean, default: true },
show_context_menu: {type: Boolean, default: true}, show_context_menu: { type: Boolean, default: true },
context_disabled_options: Object, context_disabled_options: Object,
open_recipe_on_click: {type: Boolean, default: true}, open_recipe_on_click: { type: Boolean, default: true },
enable_keyword_links: {type: Boolean, default: true}, enable_keyword_links: { type: Boolean, default: true },
}, },
data() { data() {
return { return {
@ -161,8 +160,7 @@ export default {
} }
}, },
mounted() { mounted() {},
},
computed: { computed: {
show_detail: function () { show_detail: function () {
return this.recipe?.steps !== undefined && this.detailed return this.recipe?.steps !== undefined && this.detailed
@ -180,13 +178,13 @@ export default {
waiting_time: function () { waiting_time: function () {
return calculateHourMinuteSplit(this.recipe.waiting_time) return calculateHourMinuteSplit(this.recipe.waiting_time)
}, },
recipe_link: function (){ recipe_link: function () {
if(this.open_recipe_on_click){ if (this.open_recipe_on_click) {
return this.recipe.id !== undefined ? resolveDjangoUrl('view_recipe', this.recipe.id) : null return this.recipe.id !== undefined ? resolveDjangoUrl("view_recipe", this.recipe.id) : null
} else { } else {
return "#" return "#"
} }
} },
}, },
methods: {}, methods: {},
directives: { directives: {
@ -210,8 +208,7 @@ export default {
transition: opacity 0.5s; transition: opacity 0.5s;
} }
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
{
opacity: 0; opacity: 0;
} }
@ -257,9 +254,10 @@ export default {
.content-details { .content-details {
position: absolute; position: absolute;
text-align: center; text-align: center;
padding-left: 1em; padding: 1em 1em 0 1em;
padding-right: 1em;
width: 100%; width: 100%;
max-height: 100%;
overflow-y: scroll;
top: 50%; top: 50%;
left: 50%; left: 50%;
opacity: 0; opacity: 0;

View File

@ -1,36 +1,40 @@
<template> <template>
<div> <div>
<div class="dropdown d-print-none"> <div class="dropdown d-print-none">
<a class="btn shadow-none pr-0 pl-0" href="javascript:void(0);" role="button" id="dropdownMenuLink" <a class="btn shadow-none pr-0 pl-0" href="javascript:void(0);" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v fa-lg"></i> <i class="fas fa-ellipsis-v fa-lg"></i>
</a> </a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuLink" > <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" :href="resolveDjangoUrl('edit_recipe', recipe.id)" v-if="!disabled_options.edit"><i <a class="dropdown-item" :href="resolveDjangoUrl('edit_recipe', recipe.id)" v-if="!disabled_options.edit"
class="fas fa-pencil-alt fa-fw"></i> {{ $t("Edit") }}</a> ><i class="fas fa-pencil-alt fa-fw"></i> {{ $t("Edit") }}</a
>
<a class="dropdown-item" :href="resolveDjangoUrl('view_property_editor', recipe.id)" v-if="!disabled_options.edit"> <a class="dropdown-item" :href="resolveDjangoUrl('view_property_editor', recipe.id)" v-if="!disabled_options.edit">
<i class="fas fa-table"></i> {{ $t("Property_Editor") }}</a> <i class="fas fa-table"></i> {{ $t("Property_Editor") }}</a
>
<a class="dropdown-item" :href="resolveDjangoUrl('edit_convert_recipe', recipe.id)" <a class="dropdown-item" :href="resolveDjangoUrl('edit_convert_recipe', recipe.id)" v-if="!recipe.internal && !disabled_options.convert"
v-if="!recipe.internal && !disabled_options.convert"><i class="fas fa-exchange-alt fa-fw"></i> {{ $t("convert_internal") }}</a> ><i class="fas fa-exchange-alt fa-fw"></i> {{ $t("convert_internal") }}</a
>
<a href="javascript:void(0);"> <a href="javascript:void(0);">
<button class="dropdown-item" @click="$bvModal.show(`id_modal_add_book_${modal_id}`)" v-if="!disabled_options.books"><i <button class="dropdown-item" @click="$bvModal.show(`id_modal_add_book_${modal_id}`)" v-if="!disabled_options.books">
class="fas fa-bookmark fa-fw"></i> {{ $t("Manage_Books") }} <i class="fas fa-bookmark fa-fw"></i> {{ $t("Manage_Books") }}
</button> </button>
</a> </a>
<a class="dropdown-item" v-if="recipe.internal && !disabled_options.shopping" @click="addToShopping" href="#" > <i <a class="dropdown-item" v-if="recipe.internal && !disabled_options.shopping" @click="addToShopping" href="#">
class="fas fa-shopping-cart fa-fw"></i> {{ $t("Add_to_Shopping") }} </a> <i class="fas fa-shopping-cart fa-fw"></i> {{ $t("Add_to_Shopping") }}
</a>
<a class="dropdown-item" @click="createMealPlan" href="javascript:void(0);" v-if="!disabled_options.plan"><i <a class="dropdown-item" @click="createMealPlan" href="javascript:void(0);" v-if="!disabled_options.plan"
class="fas fa-calendar fa-fw"></i> {{ $t("Add_to_Plan") }} </a> ><i class="fas fa-calendar fa-fw"></i> {{ $t("Add_to_Plan") }}
</a>
<a href="javascript:void(0);"> <a href="javascript:void(0);">
<button class="dropdown-item" @click="$bvModal.show(`id_modal_cook_log_${modal_id}`)" v-if="!disabled_options.log"><i <button class="dropdown-item" @click="$bvModal.show(`id_modal_cook_log_${modal_id}`)" v-if="!disabled_options.log">
class="fas fa-clipboard-list fa-fw"></i> {{ $t("Log_Cooking") }} <i class="fas fa-clipboard-list fa-fw"></i> {{ $t("Log_Cooking") }}
</button> </button>
</a> </a>
@ -41,56 +45,49 @@
</button> </button>
</a> </a>
<a href="javascript:void(0);"> <a href="javascript:void(0);">
<button class="dropdown-item" @click="copyToNew" v-if="!disabled_options.copy"><i class="fas fa-copy fa-fw"></i> <button class="dropdown-item" @click="copyToNew" v-if="!disabled_options.copy">
<i class="fas fa-copy fa-fw"></i>
{{ $t("copy_to_new") }} {{ $t("copy_to_new") }}
</button> </button>
</a> </a>
<a class="dropdown-item" :href="resolveDjangoUrl('view_export') + '?r=' + recipe.id" target="_blank" <a class="dropdown-item" :href="resolveDjangoUrl('view_export') + '?r=' + recipe.id" target="_blank" rel="noopener noreferrer" v-if="!disabled_options.export"
rel="noopener noreferrer" v-if="!disabled_options.export"><i class="fas fa-file-export fa-fw"></i> {{ $t("Export") }}</a> ><i class="fas fa-file-export fa-fw"></i> {{ $t("Export") }}</a
>
<a href="javascript:void(0);"> <a href="javascript:void(0);">
<button class="dropdown-item" @click="pinRecipe()" v-if="!disabled_options.pin"> <button class="dropdown-item" @click="pinRecipe()" v-if="!disabled_options.pin">
<i class="fas fa-thumbtack fa-fw"></i> <i class="fas fa-thumbtack fa-fw"></i>
{{ isPinned ? $t("Unpin") : $t("Pin")}} {{ isPinned ? $t("Unpin") : $t("Pin") }}
</button> </button>
</a> </a>
<a href="javascript:void(0);"> <a href="javascript:void(0);">
<button class="dropdown-item" @click="createShareLink()" v-if="recipe.internal && !disabled_options.share" ><i <button class="dropdown-item" @click="createShareLink()" v-if="recipe.internal && !disabled_options.share">
class="fas fa-share-alt fa-fw"></i> {{ $t("Share") }} <i class="fas fa-share-alt fa-fw"></i> {{ $t("Share") }}
</button> </button>
</a> </a>
</div> </div>
</div> </div>
<cook-log :recipe="recipe" :modal_id="modal_id"></cook-log> <cook-log :recipe="recipe" :modal_id="modal_id"></cook-log>
<add-recipe-to-book :recipe="recipe" :modal_id="modal_id" <add-recipe-to-book :recipe="recipe" :modal_id="modal_id" :entryEditing_inital_servings="servings_value"></add-recipe-to-book>
:entryEditing_inital_servings="servings_value"></add-recipe-to-book> <shopping-modal :recipe="recipe" :servings="servings_value" :modal_id="modal_id" :mealplan="undefined" />
<shopping-modal :recipe="recipe" :servings="servings_value" :modal_id="modal_id" :mealplan="undefined"/>
<b-modal :id="`modal-share-link_${modal_id}`" v-bind:title="$t('Share')" hide-footer> <b-modal :id="`modal-share-link_${modal_id}`" v-bind:title="$t('Share')" hide-footer>
<div class="row"> <div class="row">
<div class="col col-md-12"> <div class="col col-md-12">
<label v-if="recipe_share_link !== undefined">{{ $t("Public share link") }}</label> <label v-if="recipe_share_link !== undefined">{{ $t("Public share link") }}</label>
<input ref="share_link_ref" class="form-control" v-model="recipe_share_link"/> <input ref="share_link_ref" class="form-control" v-model="recipe_share_link" />
<b-button class="mt-2 mb-3 d-none d-md-inline" variant="secondary" <b-button class="mt-2 mb-3 d-none d-md-inline" variant="secondary" @click="$bvModal.hide(`modal-share-link_${modal_id}`)">{{ $t("Close") }} </b-button>
@click="$bvModal.hide(`modal-share-link_${modal_id}`)">{{ $t("Close") }} <b-button class="mt-2 mb-3 ml-md-2" variant="primary" @click="copyShareLink()">{{ $t("Copy") }} </b-button>
</b-button> <b-button class="mt-2 mb-3 ml-2 float-right" variant="success" @click="shareIntend()">{{ $t("Share") }} <i class="fa fa-share-alt"></i></b-button>
<b-button class="mt-2 mb-3 ml-md-2" variant="primary" @click="copyShareLink()">{{
$t("Copy")
}}
</b-button>
<b-button class="mt-2 mb-3 ml-2 float-right" variant="success" @click="shareIntend()">{{
$t("Share")
}} <i class="fa fa-share-alt"></i></b-button>
</div> </div>
</div> </div>
</b-modal> </b-modal>
<meal-plan-edit-modal <meal-plan-edit-modal
:entry="entryEditing" :entry="entryEditing"
:entryEditing_inital_servings="servings_value"
@save-entry="saveMealPlan" @save-entry="saveMealPlan"
:modal_id="`modal-meal-plan_${modal_id}`" :modal_id="`modal-meal-plan_${modal_id}`"
:allow_delete="false" :allow_delete="false"
@ -100,16 +97,16 @@
</template> </template>
<script> <script>
import {makeToast, resolveDjangoUrl, ResolveUrlMixin, StandardToasts} from "@/utils/utils"
import CookLog from "@/components/CookLog" import CookLog from "@/components/CookLog"
import axios from "axios"
import AddRecipeToBook from "@/components/Modals/AddRecipeToBook"
import MealPlanEditModal from "@/components/MealPlanEditModal" import MealPlanEditModal from "@/components/MealPlanEditModal"
import AddRecipeToBook from "@/components/Modals/AddRecipeToBook"
import ShoppingModal from "@/components/Modals/ShoppingModal" import ShoppingModal from "@/components/Modals/ShoppingModal"
import { useMealPlanStore } from "@/stores/MealPlanStore"
import { ApiApiFactory } from "@/utils/openapi/api"
import { makeToast, resolveDjangoUrl, ResolveUrlMixin, StandardToasts } from "@/utils/utils"
import axios from "axios"
import moment from "moment" import moment from "moment"
import Vue from "vue" import Vue from "vue"
import {ApiApiFactory} from "@/utils/openapi/api"
import {useMealPlanStore} from "@/stores/MealPlanStore";
Vue.prototype.moment = moment Vue.prototype.moment = moment
@ -143,7 +140,7 @@ export default {
}, },
}, },
entryEditing: {}, entryEditing: {},
mealplan: undefined mealplan: undefined,
} }
}, },
props: { props: {
@ -154,19 +151,18 @@ export default {
}, },
disabled_options: { disabled_options: {
type: Object, type: Object,
default: () => ({print:true}), default: () => ({ print: true }),
}, },
}, },
mounted() { mounted() {
this.servings_value = this.servings === -1 ? this.recipe.servings : this.servings this.servings_value = this.servings === -1 ? this.recipe.servings : this.servings
let pinnedRecipes = JSON.parse(localStorage.getItem("pinned_recipes")) || [] let pinnedRecipes = JSON.parse(localStorage.getItem("pinned_recipes")) || []
this.isPinned = pinnedRecipes.some((r) => r.id == this.recipe.id); this.isPinned = pinnedRecipes.some((r) => r.id == this.recipe.id)
}, },
watch: { watch: {
recipe: { recipe: {
handler() { handler() {},
},
deep: true, deep: true,
}, },
servings: function (newVal) { servings: function (newVal) {
@ -174,14 +170,14 @@ export default {
}, },
}, },
methods: { methods: {
pinRecipe () { pinRecipe() {
let pinnedRecipes = JSON.parse(localStorage.getItem("pinned_recipes")) || [] let pinnedRecipes = JSON.parse(localStorage.getItem("pinned_recipes")) || []
if(this.isPinned) { if (this.isPinned) {
pinnedRecipes = pinnedRecipes.filter((r) => r.id !== this.recipe.id) pinnedRecipes = pinnedRecipes.filter((r) => r.id !== this.recipe.id)
makeToast(this.$t("Unpin"), this.$t("UnpinnedConfirmation", {recipe: this.recipe.name}), "info") makeToast(this.$t("Unpin"), this.$t("UnpinnedConfirmation", { recipe: this.recipe.name }), "info")
} else { } else {
pinnedRecipes.push({id: this.recipe.id, name: this.recipe.name}) pinnedRecipes.push({ id: this.recipe.id, name: this.recipe.name })
makeToast(this.$t("Pin"), this.$t("PinnedConfirmation", {recipe: this.recipe.name}), "info") makeToast(this.$t("Pin"), this.$t("PinnedConfirmation", { recipe: this.recipe.name }), "info")
} }
this.isPinned = !this.isPinned this.isPinned = !this.isPinned
localStorage.setItem("pinned_recipes", JSON.stringify(pinnedRecipes)) localStorage.setItem("pinned_recipes", JSON.stringify(pinnedRecipes))
@ -211,6 +207,7 @@ export default {
createMealPlan(data) { createMealPlan(data) {
this.entryEditing = this.options.entryEditing this.entryEditing = this.options.entryEditing
this.entryEditing.recipe = this.recipe this.entryEditing.recipe = this.recipe
this.entryEditing.servings = this.recipe.servings
this.entryEditing.from_date = moment(new Date()).format("YYYY-MM-DD") this.entryEditing.from_date = moment(new Date()).format("YYYY-MM-DD")
this.entryEditing.to_date = moment(new Date()).format("YYYY-MM-DD") this.entryEditing.to_date = moment(new Date()).format("YYYY-MM-DD")
this.$nextTick(function () { this.$nextTick(function () {
@ -218,17 +215,20 @@ export default {
}) })
}, },
createShareLink: function () { createShareLink: function () {
console.log('create') console.log("create")
axios.get(resolveDjangoUrl("api_share_link", this.recipe.id)).then((result) => { axios
console.log('success') .get(resolveDjangoUrl("api_share_link", this.recipe.id))
this.$bvModal.show(`modal-share-link_${this.modal_id}`) .then((result) => {
this.recipe_share_link = result.data.link console.log("success")
}).catch((err) => { this.$bvModal.show(`modal-share-link_${this.modal_id}`)
console.log('fail') this.recipe_share_link = result.data.link
if (err.response.status === 403) { })
makeToast(this.$t("Share"), this.$t("Sharing is not enabled for this space or your user account."), "danger") .catch((err) => {
} console.log("fail")
}) if (err.response.status === 403) {
makeToast(this.$t("Share"), this.$t("Sharing is not enabled for this space or your user account."), "danger")
}
})
}, },
copyShareLink: function () { copyShareLink: function () {
let share_input = this.$refs.share_link_ref let share_input = this.$refs.share_link_ref
@ -251,21 +251,21 @@ export default {
let apiClient = new ApiApiFactory() let apiClient = new ApiApiFactory()
apiClient.retrieveRecipe(this.recipe.id).then((results) => { apiClient.retrieveRecipe(this.recipe.id).then((results) => {
let recipe = {...results.data, ...{id: undefined, name: recipe_name}} let recipe = { ...results.data, ...{ id: undefined, name: recipe_name } }
recipe.steps = recipe.steps.map((step) => { recipe.steps = recipe.steps.map((step) => {
return { return {
...step, ...step,
...{ ...{
id: undefined, id: undefined,
ingredients: step.ingredients.map((ingredient) => { ingredients: step.ingredients.map((ingredient) => {
return {...ingredient, ...{id: undefined}} return { ...ingredient, ...{ id: undefined } }
}), }),
}, },
} }
}) })
recipe.properties = recipe.properties.map(p => { recipe.properties = recipe.properties.map((p) => {
return { ...p, ...{ id: undefined, } } return { ...p, ...{ id: undefined } }
}) })
apiClient apiClient

View File

@ -1,24 +1,30 @@
<template> <template>
<div> <div>
<span class="d-inline" v-if="recipe.rating > 0"> <span class="d-inline" v-if="recipe.rating > 0">
<i class="fas fa-star fa-xs text-primary" v-for="i in Math.floor(recipe.rating)" v-bind:key="i"></i> <div v-if="!pill">
<i class="fas fa-star-half-alt fa-xs text-primary" v-if="recipe.rating % 1 > 0"></i> <i class="fas fa-star fa-xs text-primary" v-for="i in Math.floor(recipe.rating)" v-bind:key="i"></i>
<i class="far fa-star fa-xs text-secondary" v-for="i in (5 - Math.ceil(recipe.rating))" v-bind:key="i + 10"></i> <i class="fas fa-star-half-alt fa-xs text-primary" v-if="recipe.rating % 1 > 0"></i>
</span> <i class="far fa-star fa-xs text-secondary" v-for="i in 5 - Math.ceil(recipe.rating)" v-bind:key="i + 10"></i>
</div> </div>
<div v-else>
<b-badge pill variant="light" class="mt-1 font-weight-normal">
<i class="fas fa-star fa-xs text-dark" v-for="i in Math.floor(recipe.rating)" v-bind:key="i"></i>
<i class="fas fa-star-half-alt fa-xs text-dark" v-if="recipe.rating % 1 > 0"></i>
<i class="far fa-star fa-xs text-dark" v-for="i in 5 - Math.ceil(recipe.rating)" v-bind:key="i + 10"></i>
</b-badge>
</div>
</span>
</div>
</template> </template>
<script> <script>
export default { export default {
name: "RecipeRating", name: "RecipeRating",
props: { props: {
recipe: Object recipe: Object,
} pill: { required: false, type: Boolean, default: false },
},
} }
</script> </script>
<style scoped> <style scoped></style>
</style>

View File

@ -11848,13 +11848,13 @@ wildcard@^2.0.0:
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67"
integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==
workbox-background-sync@6.6.1: workbox-background-sync@7.0.0, workbox-background-sync@^7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz#2b84b96ca35fec976e3bd2794b70e4acec46b3a5"
integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== integrity sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==
dependencies: dependencies:
idb "^7.0.1" idb "^7.0.1"
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-background-sync@^5.1.4: workbox-background-sync@^5.1.4:
version "5.1.4" version "5.1.4"
@ -11863,21 +11863,13 @@ workbox-background-sync@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-background-sync@^7.0.0: workbox-broadcast-update@7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz#2b84b96ca35fec976e3bd2794b70e4acec46b3a5" resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz#7f611ca1a94ba8ac0aa40fa171c9713e0f937d22"
integrity sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA== integrity sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==
dependencies: dependencies:
idb "^7.0.1"
workbox-core "7.0.0" workbox-core "7.0.0"
workbox-broadcast-update@6.6.1:
version "6.6.1"
resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e"
integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ==
dependencies:
workbox-core "6.6.1"
workbox-broadcast-update@^5.1.4: workbox-broadcast-update@^5.1.4:
version "5.1.4" version "5.1.4"
resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc"
@ -11885,10 +11877,10 @@ workbox-broadcast-update@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-build@6.6.1: workbox-build@7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-7.0.0.tgz#02ab5ef2991b3369b8b9395703f08912212769b4"
integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== integrity sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==
dependencies: dependencies:
"@apideck/better-ajv-errors" "^0.3.1" "@apideck/better-ajv-errors" "^0.3.1"
"@babel/core" "^7.11.1" "@babel/core" "^7.11.1"
@ -11912,21 +11904,21 @@ workbox-build@6.6.1:
strip-comments "^2.0.1" strip-comments "^2.0.1"
tempy "^0.6.0" tempy "^0.6.0"
upath "^1.2.0" upath "^1.2.0"
workbox-background-sync "6.6.1" workbox-background-sync "7.0.0"
workbox-broadcast-update "6.6.1" workbox-broadcast-update "7.0.0"
workbox-cacheable-response "6.6.1" workbox-cacheable-response "7.0.0"
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-expiration "6.6.1" workbox-expiration "7.0.0"
workbox-google-analytics "6.6.1" workbox-google-analytics "7.0.0"
workbox-navigation-preload "6.6.1" workbox-navigation-preload "7.0.0"
workbox-precaching "6.6.1" workbox-precaching "7.0.0"
workbox-range-requests "6.6.1" workbox-range-requests "7.0.0"
workbox-recipes "6.6.1" workbox-recipes "7.0.0"
workbox-routing "6.6.1" workbox-routing "7.0.0"
workbox-strategies "6.6.1" workbox-strategies "7.0.0"
workbox-streams "6.6.1" workbox-streams "7.0.0"
workbox-sw "6.6.1" workbox-sw "7.0.0"
workbox-window "6.6.1" workbox-window "7.0.0"
workbox-build@^5.1.4: workbox-build@^5.1.4:
version "5.1.4" version "5.1.4"
@ -11970,12 +11962,12 @@ workbox-build@^5.1.4:
workbox-sw "^5.1.4" workbox-sw "^5.1.4"
workbox-window "^5.1.4" workbox-window "^5.1.4"
workbox-cacheable-response@6.6.1: workbox-cacheable-response@7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz#ee27c036728189eed69d25a135013053277482d2"
integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== integrity sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==
dependencies: dependencies:
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-cacheable-response@^5.1.4: workbox-cacheable-response@^5.1.4:
version "5.1.4" version "5.1.4"
@ -11999,13 +11991,13 @@ workbox-core@^5.1.4:
resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4"
integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==
workbox-expiration@6.6.1, workbox-expiration@^6.5.4: workbox-expiration@7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-7.0.0.tgz#3d90bcf2a7577241de950f89784f6546b66c2baa"
integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== integrity sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==
dependencies: dependencies:
idb "^7.0.1" idb "^7.0.1"
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-expiration@^5.1.4: workbox-expiration@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12014,15 +12006,23 @@ workbox-expiration@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-google-analytics@6.6.1: workbox-expiration@^6.5.4:
version "6.6.1" version "6.6.1"
resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739"
integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A==
dependencies: dependencies:
workbox-background-sync "6.6.1" idb "^7.0.1"
workbox-core "6.6.1" workbox-core "6.6.1"
workbox-routing "6.6.1"
workbox-strategies "6.6.1" workbox-google-analytics@7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz#603b2c4244af1e85de0fb26287d4e17d3293452a"
integrity sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==
dependencies:
workbox-background-sync "7.0.0"
workbox-core "7.0.0"
workbox-routing "7.0.0"
workbox-strategies "7.0.0"
workbox-google-analytics@^5.1.4: workbox-google-analytics@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12034,12 +12034,12 @@ workbox-google-analytics@^5.1.4:
workbox-routing "^5.1.4" workbox-routing "^5.1.4"
workbox-strategies "^5.1.4" workbox-strategies "^5.1.4"
workbox-navigation-preload@6.6.1: workbox-navigation-preload@7.0.0, workbox-navigation-preload@^7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz#4913878dbbd97057181d57baa18d2bbdde085c6c"
integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== integrity sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==
dependencies: dependencies:
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-navigation-preload@^5.1.4: workbox-navigation-preload@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12048,21 +12048,14 @@ workbox-navigation-preload@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-navigation-preload@^7.0.0: workbox-precaching@7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz#4913878dbbd97057181d57baa18d2bbdde085c6c" resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-7.0.0.tgz#3979ba8033aadf3144b70e9fe631d870d5fbaa03"
integrity sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA== integrity sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==
dependencies: dependencies:
workbox-core "7.0.0" workbox-core "7.0.0"
workbox-routing "7.0.0"
workbox-precaching@6.6.1, workbox-precaching@^6.5.4: workbox-strategies "7.0.0"
version "6.6.1"
resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2"
integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A==
dependencies:
workbox-core "6.6.1"
workbox-routing "6.6.1"
workbox-strategies "6.6.1"
workbox-precaching@^5.1.4: workbox-precaching@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12071,12 +12064,21 @@ workbox-precaching@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-range-requests@6.6.1: workbox-precaching@^6.5.4:
version "6.6.1" version "6.6.1"
resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2"
integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A==
dependencies: dependencies:
workbox-core "6.6.1" workbox-core "6.6.1"
workbox-routing "6.6.1"
workbox-strategies "6.6.1"
workbox-range-requests@7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz#97511901e043df27c1aa422adcc999a7751f52ed"
integrity sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==
dependencies:
workbox-core "7.0.0"
workbox-range-requests@^5.1.4: workbox-range-requests@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12085,17 +12087,17 @@ workbox-range-requests@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-recipes@6.6.1: workbox-recipes@7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-7.0.0.tgz#1a6a01c8c2dfe5a41eef0fed3fe517e8a45c6514"
integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== integrity sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==
dependencies: dependencies:
workbox-cacheable-response "6.6.1" workbox-cacheable-response "7.0.0"
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-expiration "6.6.1" workbox-expiration "7.0.0"
workbox-precaching "6.6.1" workbox-precaching "7.0.0"
workbox-routing "6.6.1" workbox-routing "7.0.0"
workbox-strategies "6.6.1" workbox-strategies "7.0.0"
workbox-routing@6.6.1: workbox-routing@6.6.1:
version "6.6.1" version "6.6.1"
@ -12104,6 +12106,13 @@ workbox-routing@6.6.1:
dependencies: dependencies:
workbox-core "6.6.1" workbox-core "6.6.1"
workbox-routing@7.0.0, workbox-routing@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-7.0.0.tgz#6668438a06554f60645aedc77244a4fe3a91e302"
integrity sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==
dependencies:
workbox-core "7.0.0"
workbox-routing@^5.1.4: workbox-routing@^5.1.4:
version "5.1.4" version "5.1.4"
resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970"
@ -12111,13 +12120,6 @@ workbox-routing@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-routing@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-7.0.0.tgz#6668438a06554f60645aedc77244a4fe3a91e302"
integrity sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==
dependencies:
workbox-core "7.0.0"
workbox-strategies@6.6.1, workbox-strategies@^6.2.4: workbox-strategies@6.6.1, workbox-strategies@^6.2.4:
version "6.6.1" version "6.6.1"
resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf"
@ -12125,6 +12127,13 @@ workbox-strategies@6.6.1, workbox-strategies@^6.2.4:
dependencies: dependencies:
workbox-core "6.6.1" workbox-core "6.6.1"
workbox-strategies@7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-7.0.0.tgz#dcba32b3f3074476019049cc490fe1a60ea73382"
integrity sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==
dependencies:
workbox-core "7.0.0"
workbox-strategies@^5.1.4: workbox-strategies@^5.1.4:
version "5.1.4" version "5.1.4"
resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c"
@ -12133,13 +12142,13 @@ workbox-strategies@^5.1.4:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-routing "^5.1.4" workbox-routing "^5.1.4"
workbox-streams@6.6.1: workbox-streams@7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-7.0.0.tgz#36722aecd04785f88b6f709e541c094fc658c0f9"
integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== integrity sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==
dependencies: dependencies:
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-routing "6.6.1" workbox-routing "7.0.0"
workbox-streams@^5.1.4: workbox-streams@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12149,10 +12158,10 @@ workbox-streams@^5.1.4:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-routing "^5.1.4" workbox-routing "^5.1.4"
workbox-sw@6.6.1: workbox-sw@7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-7.0.0.tgz#7350126411e3de1409f7ec243df8d06bb5b08b86"
integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== integrity sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==
workbox-sw@^5.1.4: workbox-sw@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12171,24 +12180,24 @@ workbox-webpack-plugin@^5.1.3, workbox-webpack-plugin@^6.1.0:
webpack-sources "^1.3.0" webpack-sources "^1.3.0"
workbox-build "^5.1.4" workbox-build "^5.1.4"
workbox-webpack-plugin@^6.5.4: workbox-webpack-plugin@^7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-7.0.0.tgz#6c61661a2cacde1239192a5877a041a2943d1a55"
integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== integrity sha512-R1ZzCHPfzeJjLK2/TpKUhxSQ3fFDCxlWxgRhhSjMQLz3G2MlBnyw/XeYb34e7SGgSv0qG22zEhMIzjMNqNeKbw==
dependencies: dependencies:
fast-json-stable-stringify "^2.1.0" fast-json-stable-stringify "^2.1.0"
pretty-bytes "^5.4.1" pretty-bytes "^5.4.1"
upath "^1.2.0" upath "^1.2.0"
webpack-sources "^1.4.3" webpack-sources "^1.4.3"
workbox-build "6.6.1" workbox-build "7.0.0"
workbox-window@6.6.1: workbox-window@7.0.0, workbox-window@^7.0.0:
version "6.6.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-7.0.0.tgz#a683ab33c896e4f16786794eac7978fc98a25d08"
integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== integrity sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==
dependencies: dependencies:
"@types/trusted-types" "^2.0.2" "@types/trusted-types" "^2.0.2"
workbox-core "6.6.1" workbox-core "7.0.0"
workbox-window@^5.1.4: workbox-window@^5.1.4:
version "5.1.4" version "5.1.4"
@ -12197,14 +12206,6 @@ workbox-window@^5.1.4:
dependencies: dependencies:
workbox-core "^5.1.4" workbox-core "^5.1.4"
workbox-window@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-7.0.0.tgz#a683ab33c896e4f16786794eac7978fc98a25d08"
integrity sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==
dependencies:
"@types/trusted-types" "^2.0.2"
workbox-core "7.0.0"
worker-farm@^1.7.0: worker-farm@^1.7.0:
version "1.7.0" version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"