stuff and things

This commit is contained in:
vabene1111 2023-12-27 23:20:31 +01:00
parent 999e3794f5
commit 2c3e0b547b
2 changed files with 20 additions and 136 deletions

View File

@ -21,7 +21,7 @@
</div>
</b-button>
<i id="id_filters_button" class="fas fa-filter fa-fw mt-1" style="font-size: 16px; cursor: pointer"
:class="filterApplied ? 'text-danger' : 'text-primary'"/>
/>
</div>
</div>
@ -29,10 +29,9 @@
<!-- shopping list tab -->
<b-tab active>
<template #title>
<b-spinner v-if="loading" type="border" small class="d-inline-block"></b-spinner>
<i v-if="!loading" class="fas fa-shopping-cart fa-fw d-inline-block d-md-none"></i>
<span
class="d-none d-md-inline-block">{{ $t('Shopping_list') + ` (${items.filter(x => x.checked === false).length})` }}</span>
<b-spinner v-if="shopping_list_store.currently_updating" type="border" small class="d-inline-block"></b-spinner>
<i v-if="!shopping_list_store.currently_updating" class="fas fa-shopping-cart fa-fw d-inline-block d-md-none"></i>
<span class="d-none d-md-inline-block">{{ $t('Shopping_list') + ` (${Object.keys(shopping_list_store.entries).length})` }}</span> <!-- TODO properly count only checked -->
</template>
<b-row class="d-lg-block d-print-none d-none pr-1 pl-1 mb-3 mt-3">
@ -368,7 +367,7 @@
<div>
<b-form-group v-bind:label="$t('GroupBy')" label-for="popover-input-1" label-cols="6" class="mb-1">
<b-form-select v-model="user_preference_store.device_settings.shopping_selected_grouping" size="sm">
<b-form-select-option v-for="go in shopping_list_store.grouping_options" :value="go.id" v-bind:key="go.id">{{ $t(go.translatable_label)}}</b-form-select-option>
<b-form-select-option v-for="go in shopping_list_store.grouping_options" :value="go.id" v-bind:key="go.id">{{ $t(go.translatable_label) }}</b-form-select-option>
</b-form-select>
</b-form-group>
<b-form-group v-bind:label="$t('Supermarket')" label-for="popover-input-2" label-cols="6" class="mb-1">
@ -384,93 +383,32 @@
<b-form-checkbox v-model="user_preference_store.device_settings.shopping_show_checked_entries" @change="user_preference_store.updateDeviceSettings()"></b-form-checkbox>
</b-form-group>
<b-form-group v-bind:label="$t('SupermarketCategoriesOnly')" label-for="popover-input-5"
content-cols="1" class="mb-1" >
content-cols="1" class="mb-1">
<b-form-checkbox v-model="user_preference_store.device_settings.shopping_show_selected_supermarket_only" @change="user_preference_store.updateDeviceSettings()"></b-form-checkbox>
</b-form-group>
<span>{{ $t('Information')}}</span>
<span>{{ $t('Information') }}</span>
<b-form-group v-bind:label="$t('Recipe')" label-for="popover-input-5"
content-cols="1" class="mb-1" >
content-cols="1" class="mb-1">
<b-form-checkbox v-model="user_preference_store.device_settings.shopping_item_info_recipe" @change="user_preference_store.updateDeviceSettings()"></b-form-checkbox>
</b-form-group>
<b-form-group v-bind:label="$t('Meal_Plan')" label-for="popover-input-5"
content-cols="1" class="mb-1" >
content-cols="1" class="mb-1">
<b-form-checkbox v-model="user_preference_store.device_settings.shopping_item_info_mealplan" @change="user_preference_store.updateDeviceSettings()"></b-form-checkbox>
</b-form-group>
<b-form-group v-bind:label="$t('created_by')" label-for="popover-input-5"
content-cols="1" class="mb-1" >
content-cols="1" class="mb-1">
<b-form-checkbox v-model="user_preference_store.device_settings.shopping_item_info_created_by" @change="user_preference_store.updateDeviceSettings()"></b-form-checkbox>
</b-form-group>
</div>
<div class="row" style="margin-top: 1vh; min-width: 300px">
<div class="col-12" style="text-align: right">
<b-button size="sm" variant="primary" class="mx-1" @click="resetFilters">{{
$t("Reset")
}}
</b-button>
<b-button size="sm" variant="secondary" class="mr-3" @click="$root.$emit('bv::hide::popover')">
{{ $t("Close") }}
</b-button>
</div>
</div>
</b-popover>
<ContextMenu ref="menu">
<template #menu="{ contextData }">
<ContextMenuItem>
<b-input-group>
<template #prepend>
<span class="dropdown-item p-2 text-decoration-none" style="user-select: none !important"><i
class="fas fa-cubes"></i> {{ $t("MoveCategory") }}</span>
</template>
<b-form-select
class="form-control mt-1 mr-1"
:options="shopping_categories"
text-field="name"
value-field="id"
v-model="shopcat"
@change="
moveEntry($event, contextData)
$refs.menu.close()
"
></b-form-select>
</b-input-group>
</ContextMenuItem>
<ContextMenuItem
@click="
$refs.menu.close()
onHand(contextData)
"
>
<a class="dropdown-item p-2" href="#"><i class="fas fa-clipboard-check"></i> {{ $t("OnHand") }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
$refs.menu.close()
delayThis(contextData)
"
>
<a class="dropdown-item p-2" href="#"><i class="fas fa-hourglass"></i>
{{ $t("DelayFor", {hours: delay}) }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
$refs.menu.close()
updateChecked({ entries: contextData, checked: true })
"
>
<a class="dropdown-item p-2" href="#"><i class="fas fa-check-square"></i> {{ $t("mark_complete") }}</a>
</ContextMenuItem>
<ContextMenuItem
@click="
$refs.menu.close()
deleteThis(contextData)
"
>
<a class="dropdown-item p-2 text-danger" href="#"><i class="fas fa-trash"></i> {{
$t("Delete")
}}</a>
</ContextMenuItem>
</template>
</ContextMenu>
<shopping-modal v-if="new_recipe.id" :recipe="new_recipe" :servings="parseInt(add_recipe_servings)"
:modal_id="new_recipe.id" @finish="finishShopping" :list_recipe="new_recipe.list_recipe"/>
@ -517,14 +455,12 @@ import "bootstrap-vue/dist/bootstrap-vue.css"
import VueCookies from "vue-cookies"
import draggable from "vuedraggable"
import ContextMenu from "@/components/ContextMenu/ContextMenu"
import ContextMenuItem from "@/components/ContextMenu/ContextMenuItem"
import ShoppingLineItem from "@/components/ShoppingLineItem"
import DownloadPDF from "@/components/Buttons/DownloadPDF"
import DownloadCSV from "@/components/Buttons/DownloadCSV"
import CopyToClipboard from "@/components/Buttons/CopyToClipboard"
import GenericMultiselect from "@/components/GenericMultiselect"
import LookupInput from "@/components/Modals/LookupInput"
import ShoppingModal from "@/components/Modals/ShoppingModal"
import {ApiMixin, getUserPreference, StandardToasts, makeToast, ResolveUrlMixin} from "@/utils/utils"
@ -533,7 +469,7 @@ import ShoppingSettingsComponent from "@/components/Settings/ShoppingSettingsCom
Vue.use(BootstrapVue)
Vue.use(VueCookies)
let SETTINGS_COOKIE_NAME = "shopping_settings"
import {Workbox} from 'workbox-window';
import BottomNavigationBar from "@/components/BottomNavigationBar.vue";
import {useShoppingListStore} from "@/stores/ShoppingListStore";
@ -543,8 +479,7 @@ export default {
name: "ShoppingListView",
mixins: [ApiMixin, ResolveUrlMixin],
components: {
ContextMenu,
ContextMenuItem,
ShoppingLineItem,
GenericMultiselect,
DownloadPDF,
@ -561,8 +496,7 @@ export default {
// this.Models and this.Actions inherited from ApiMixin
items: [],
current_tab: 0,
group_by: "category",
group_by_choices: ["created_by", "category", "recipe"],
supermarkets: [],
shopping_categories: [],
show_undefined_categories: true,
@ -696,9 +630,6 @@ export default {
// })
return []
},
defaultDelay() {
return Number(getUserPreference("default_delay")) || 2
},
editingSupermarket() {
return this.supermarkets.filter((el) => {
return el.editing
@ -711,22 +642,6 @@ export default {
return []
}
},
formUnit() {
let unit = this.Models.SHOPPING_LIST.create.form.unit
unit.value = this.new_item.unit
return unit
},
formFood() {
let food = this.Models.SHOPPING_LIST.create.form.food
food.value = this.new_item.food
return food
},
itemsDelayed() {
return this.items.filter((x) => !x.delay_until || !Date.parse(x?.delay_until) > new Date(Date.now())).length < this.items.length
},
filterApplied() {
return (this.itemsDelayed && !this.show_delay) || !this.show_undefined_categories || (this.supermarket_categories_only && this.ui.selected_supermarket)
},
Recipes() {
// hiding recipes associated with shopping list items that are complete
return [...new Map(this.items.filter((x) => x.list_recipe && !x.checked).map((item) => [item["list_recipe"], item])).values()]
@ -734,7 +649,6 @@ export default {
supermarket_categories() {
return this.shopping_categories
},
},
watch: {
@ -809,9 +723,11 @@ export default {
setFocus() {
this.$refs['amount_input_simple'].focus()
},
// this.genericAPI inherited from ApiMixin
/**
* get ingredient from input string and create new shopping list entry using it
*/
addItem: function () {
// this.genericAPI inherited from ApiMixin
if (this.new_item.ingredient !== "" && this.new_item.ingredient !== undefined) {
this.genericPostAPI("api_ingredient_from_string", {text: this.new_item.ingredient}).then((result) => {
let unit = null
@ -828,38 +744,6 @@ export default {
})
}
},
resetFilters: function () {
this.ui.selected_supermarket = undefined
this.supermarket_categories_only = this.settings.filter_to_supermarket
this.show_undefined_categories = true
this.group_by = "category"
this.show_delay = false
},
delayThis: function (item) {
let entries = []
let promises = []
let delay_date = new Date(Date.now() + this.delay * (60 * 60 * 1000))
if (Array.isArray(item)) {
item = item.map((x) => {
return {...x, delay_until: delay_date}
})
entries = item.map((x) => x.id)
} else {
item.delay_until = delay_date
entries = [item.id]
}
entries.forEach((entry) => {
promises.push(this.saveThis({id: entry, delay_until: delay_date}, false))
})
Promise.all(promises).then(() => {
this.items = this.items.filter((x) => !entries.includes(x.id))
this.delay = this.defaultDelay
}).catch(err => {
StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err)
})
},
deleteRecipe: function (e, recipe) {
let api = new ApiApiFactory()
api.destroyShoppingListRecipe(recipe)

View File

@ -188,7 +188,7 @@ export const useShoppingListStore = defineStore(_STORE_ID, {
* @param {{}} entries set of entries
*/
delayEntries(entries) {
let delay = 4 //TODO get delay from settings
let delay = 4 //TODO get delay from settings in an offline friendly way
let delay_date = new Date(Date.now() + delay * (60 * 60 * 1000))
for (let i in entries) {