-
{{ $t("Reset") }}
-
{{ $t("Close") }}
+
@@ -332,6 +230,8 @@ import { StandardToasts, makeToast } from "@/utils/utils"
Vue.use(BootstrapVue)
export default {
+ // TODO ApiGenerator doesn't capture and share error information - would be nice to share error details when available
+ // or i'm capturing it incorrectly
name: "ShoppingListView",
mixins: [ApiMixin],
components: { ContextMenu, ContextMenuItem, ShoppingLineItem, GenericMultiselect },
@@ -340,7 +240,7 @@ export default {
return {
// this.Models and this.Actions inherited from ApiMixin
items: [],
- group_by: "category",
+ group_by: "category", //TODO create setting to switch group_by
group_by_choices: ["created_by", "category", "recipe"],
supermarkets: [],
shopping_categories: [],
@@ -348,25 +248,13 @@ export default {
show_undefined_categories: true,
supermarket_categories_only: false,
shopcat: null,
- delay: 0,
- settings: {
- shopping_auto_sync: 0,
- default_delay: 4,
- mealplan_autoadd_shopping: false,
- mealplan_autoinclude_related: false,
- mealplan_autoexclude_onhand: true,
- filter_to_supermarket: false,
- },
-
- autosync_id: undefined,
- auto_sync_running: false,
+ delay: 0, // user default
show_delay: false,
show_modal: false,
fields: ["checked", "amount", "category", "unit", "food", "recipe", "details"],
loading: true,
entrymode: false,
new_item: { amount: 1, unit: undefined, food: undefined },
- online: true,
}
},
computed: {
@@ -401,16 +289,16 @@ export default {
shopping_list = shopping_list.filter((x) => x?.food?.supermarket_category)
}
- let groups = { false: {}, true: {} } // force unchecked to always be first
+ const groups = { false: {}, true: {} } // force unchecked to always be first
if (this.selected_supermarket) {
let super_cats = this.supermarkets
.filter((x) => x.id === this.selected_supermarket)
.map((x) => x.category_to_supermarket)
.flat()
.map((x) => x.category.name)
- new Set([...super_cats, ...this.shopping_categories.map((x) => x.name)]).forEach((cat) => {
- groups["false"][cat.name] = {}
- groups["true"][cat.name] = {}
+ new Set([...super_cats, ...this.shopping_categories.map((x) => x.name)]).foreach((cat) => {
+ groups.false[cat.name] = {}
+ groups.true[cat.name] = {}
})
} else {
this.shopping_categories.forEach((cat) => {
@@ -443,7 +331,7 @@ export default {
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.selected_supermarket)
+ return (this.itemsDelayed && !this.show_delay) || !this.show_undefined_categories || this.supermarket_categories_only
},
Recipes() {
return [...new Map(this.items.filter((x) => x.list_recipe).map((item) => [item["list_recipe"], item])).values()]
@@ -451,49 +339,24 @@ export default {
},
watch: {
selected_supermarket(newVal, oldVal) {
- this.supermarket_categories_only = this.settings.filter_to_supermarket
- },
- "settings.filter_to_supermarket": function(newVal, oldVal) {
- this.supermarket_categories_only = this.settings.filter_to_supermarket
- },
- "settings.shopping_auto_sync": function(newVal, oldVal) {
- clearInterval(this.autosync_id)
- this.autosync_id = undefined
- if (!newVal) {
- window.removeEventListener("online", this.updateOnlineStatus)
- window.removeEventListener("offline", this.updateOnlineStatus)
- return
- } else if (oldVal === 0 && newVal > 0) {
- window.addEventListener("online", this.updateOnlineStatus)
- window.addEventListener("offline", this.updateOnlineStatus)
- }
- this.autosync_id = setInterval(() => {
- if (this.online && !this.auto_sync_running) {
- this.auto_sync_running = true
- this.getShoppingList(true)
- }
- }, this.settings.shopping_auto_sync * 1000)
+ this.getShoppingList()
},
},
mounted() {
+ // value is passed from lists.py
this.getShoppingList()
this.getSupermarkets()
this.getShoppingCategories()
-
- this.settings = getUserPreference()
- this.delay = this.settings.default_delay || 4
- this.supermarket_categories_only = this.settings.filter_to_supermarket
- if (this.settings.shopping_auto_sync) {
- window.addEventListener("online", this.updateOnlineStatus)
- window.addEventListener("offline", this.updateOnlineStatus)
- }
+ this.delay = getUserPreference("default_delay") || 4
},
methods: {
// this.genericAPI inherited from ApiMixin
addItem() {
+ console.log(this.new_item)
let api = new ApiApiFactory()
api.createShoppingListEntry(this.new_item)
.then((results) => {
+ console.log(results)
if (results?.data) {
this.items.push(results.data)
StandardToasts.makeStandardToast(StandardToasts.SUCCESS_CREATE)
@@ -510,13 +373,6 @@ export default {
categoryName: function(value) {
return this.shopping_categories.filter((x) => x.id == value)[0]?.name ?? ""
},
- resetFilters: function() {
- this.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 = []
@@ -580,45 +436,40 @@ export default {
this.shopping_categories = result.data
})
},
- getShoppingList: function(autosync = false) {
- let params = {}
- params.supermarket = this.selected_supermarket
-
- params.options = { query: { recent: 1 } }
- if (autosync) {
- params.options.query["autosync"] = 1
- } else {
- this.loading = true
+ getShoppingList: function(params = {}) {
+ this.loading = true
+ params = {
+ supermarket: this.selected_supermarket,
}
+ params.options = { query: { recent: 1 } }
this.genericAPI(this.Models.SHOPPING_LIST, this.Actions.LIST, params)
.then((results) => {
- if (!autosync) {
- if (results.data?.length) {
- this.items = results.data
- } else {
- console.log("no data returned")
- }
- this.loading = false
+ console.log(results.data)
+ if (results.data?.length) {
+ this.items = results.data
} else {
- this.mergeShoppingList(results.data)
+ console.log("no data returned")
}
+ this.loading = false
})
.catch((err) => {
console.log(err)
- if (!autosync) {
- StandardToasts.makeStandardToast(StandardToasts.FAIL_FETCH)
- }
+ StandardToasts.makeStandardToast(StandardToasts.FAIL_FETCH)
})
},
getSupermarkets: function() {
let api = new ApiApiFactory()
api.listSupermarkets().then((result) => {
this.supermarkets = result.data
+ console.log(this.supermarkets)
})
},
getThis: function(id) {
return this.genericAPI(this.Models.SHOPPING_CATEGORY, this.Actions.FETCH, { id: id })
},
+ getRecipe: function(item) {
+ // change to get pop up card? maybe same for unit and food?
+ },
ignoreThis: function(item) {
let food = {
id: item?.[0]?.food.id ?? item.food.id,
@@ -626,17 +477,6 @@ export default {
}
this.updateFood(food, "ignore_shopping")
},
- mergeShoppingList: function(data) {
- this.items.map((x) =>
- data.map((y) => {
- if (y.id === x.id) {
- x.checked = y.checked
- return x
- }
- })
- )
- this.auto_sync_running = false
- },
moveEntry: function(e, item) {
if (!e) {
makeToast(this.$t("Warning"), this.$t("NoCategory"), "warning")
@@ -671,17 +511,6 @@ export default {
this.shopcat = value?.food?.supermarket_category?.id ?? value?.[0]?.food?.supermarket_category?.id ?? undefined
this.$refs.menu.open(e, value)
},
- saveSettings: function() {
- let api = ApiApiFactory()
- api.partialUpdateUserPreference(this.settings.user, this.settings)
- .then((result) => {
- StandardToasts.makeStandardToast(StandardToasts.SUCCESS_UPDATE)
- })
- .catch((err) => {
- console.log(err)
- StandardToasts.makeStandardToast(StandardToasts.FAIL_UPDATE)
- })
- },
saveThis: function(thisItem, toast = true) {
let api = new ApiApiFactory()
if (!thisItem?.id) {
@@ -707,6 +536,7 @@ export default {
})
.catch((err) => {
console.log(err, err.response)
+
StandardToasts.makeStandardToast(StandardToasts.FAIL_UPDATE)
})
}
@@ -716,17 +546,15 @@ export default {
},
updateChecked: function(update) {
// when checking a sub item don't refresh the screen until all entries complete but change class to cross out
+
let promises = []
update.entries.forEach((x) => {
+ console.log({ id: x, checked: update.checked })
promises.push(this.saveThis({ id: x, checked: update.checked }, false))
let item = this.items.filter((entry) => entry.id == x)[0]
Vue.set(item, "checked", update.checked)
- if (update.checked) {
- Vue.set(item, "completed_at", new Date().toISOString())
- } else {
- Vue.set(item, "completed_at", undefined)
- }
+ Vue.set(item, "completed_at", new Date().toISOString())
})
Promise.all(promises).catch((err) => {
console.log(err, err.response)
@@ -769,14 +597,6 @@ export default {
this.getShoppingList()
})
},
- updateOnlineStatus(e) {
- const { type } = e
- this.online = type === "online"
- },
- beforeDestroy() {
- window.removeEventListener("online", this.updateOnlineStatus)
- window.removeEventListener("offline", this.updateOnlineStatus)
- },
},
}
@@ -798,8 +618,4 @@ export default {
padding-bottom: -3em;
margin-bottom: -3em;
}
-.float-up {
- padding-top: -3em;
- margin-top: -3em;
-}
diff --git a/vue/src/components/ShoppingLineItem.vue b/vue/src/components/ShoppingLineItem.vue
index c56b7840..9b9f32a7 100644
--- a/vue/src/components/ShoppingLineItem.vue
+++ b/vue/src/components/ShoppingLineItem.vue
@@ -2,12 +2,12 @@
-