From 14c2be9277382c3284f72ec01ad39771f33e47dc Mon Sep 17 00:00:00 2001 From: tomtjes Date: Wed, 7 Feb 2024 16:51:19 -0500 Subject: [PATCH 01/45] add classes to scalable numbers apply "scalable" to all apply "scaled-up" when ingredient factor is >1 apply "unscaled" when ingredient factor is 1 apply "scaled-down" when factor is <1 --- vue/src/components/ScalableNumber.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vue/src/components/ScalableNumber.vue b/vue/src/components/ScalableNumber.vue index 2054c6c1c..6dcc47d85 100644 --- a/vue/src/components/ScalableNumber.vue +++ b/vue/src/components/ScalableNumber.vue @@ -1,6 +1,5 @@ diff --git a/vue/src/utils/utils.js b/vue/src/utils/utils.js index 00cc3735a..b4fb2e2e2 100644 --- a/vue/src/utils/utils.js +++ b/vue/src/utils/utils.js @@ -317,6 +317,10 @@ export function calculateAmount(amount, factor) { } } +export function escapeCSS(classname) { + return classname.replace(/\s+/g, "-").toLowerCase() +} + export function roundDecimals(num) { let decimals = getUserPreference("user_fractions") ? getUserPreference("user_fractions") : 2 return +(Math.round(num + `e+${decimals}`) + `e-${decimals}`) @@ -748,4 +752,4 @@ export const formFunctions = { } return form }, -} +} \ No newline at end of file From b5a204265af0f65bd7a4d6b737abe0747f283148 Mon Sep 17 00:00:00 2001 From: tomtjes Date: Wed, 14 Feb 2024 17:18:26 -0500 Subject: [PATCH 05/45] fix CSS escape (remove HTML sanitize) --- vue/src/components/IngredientComponent.vue | 2 +- vue/src/components/KeywordsComponent.vue | 7 +------ vue/src/components/StepComponent.vue | 4 +--- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/vue/src/components/IngredientComponent.vue b/vue/src/components/IngredientComponent.vue index dd2147000..1403840e0 100644 --- a/vue/src/components/IngredientComponent.vue +++ b/vue/src/components/IngredientComponent.vue @@ -127,7 +127,7 @@ export default { this.$emit("checked-state-changed", this.ingredient) }, escapeCSS: function (classname) { - return CSS.escape(this.$sanitize(escapeCSS(classname))) + return CSS.escape(escapeCSS(classname)) } }, } diff --git a/vue/src/components/KeywordsComponent.vue b/vue/src/components/KeywordsComponent.vue index 7c1f87be3..3cc3ce236 100644 --- a/vue/src/components/KeywordsComponent.vue +++ b/vue/src/components/KeywordsComponent.vue @@ -17,11 +17,6 @@ import {ResolveUrlMixin, escapeCSS} from "@/utils/utils"; -import Vue from "vue" -import VueSanitize from "vue-sanitize" - -Vue.use(VueSanitize) - export default { name: 'KeywordsComponent', mixins: [ResolveUrlMixin], @@ -43,7 +38,7 @@ export default { return this.escapeCSS('_keywordname-' + k.label) }, escapeCSS: function (classname) { - return CSS.escape(this.$sanitize(escapeCSS(classname))) + return CSS.escape(escapeCSS(classname)) } } } diff --git a/vue/src/components/StepComponent.vue b/vue/src/components/StepComponent.vue index 63a02406e..4a9e901b7 100644 --- a/vue/src/components/StepComponent.vue +++ b/vue/src/components/StepComponent.vue @@ -128,9 +128,7 @@ import IngredientsCard from "@/components/IngredientsCard" import Vue from "vue" import moment from "moment" import {ResolveUrlMixin, calculateHourMinuteSplit} from "@/utils/utils" -import VueSanitize from "vue-sanitize" -Vue.use(VueSanitize) Vue.prototype.moment = moment export default { @@ -200,7 +198,7 @@ export default { this.$refs[`id_reactive_popover_${this.step.id}`].$emit("open") }, escapeCSS: function (classname) { - return CSS.escape(this.$sanitize(escapeCSS(classname))) + return CSS.escape(escapeCSS(classname)) } }, } From f34dc4d242255b9e3b9a19232c92747eafcb92ba Mon Sep 17 00:00:00 2001 From: tomtjes Date: Thu, 15 Feb 2024 14:56:04 -0500 Subject: [PATCH 06/45] move escapeCSS function to mixins --- vue/src/components/IngredientComponent.vue | 7 ++----- vue/src/components/KeywordsComponent.vue | 7 ++----- vue/src/components/StepComponent.vue | 12 +++++------- vue/src/utils/utils.js | 9 +++++++-- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/vue/src/components/IngredientComponent.vue b/vue/src/components/IngredientComponent.vue index 1403840e0..d8e130eed 100644 --- a/vue/src/components/IngredientComponent.vue +++ b/vue/src/components/IngredientComponent.vue @@ -43,7 +43,7 @@ From e6fce0b4a7dbf81b39d8b2ec456956016ae8c6ef Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 19 Feb 2024 21:28:38 +0100 Subject: [PATCH 43/45] property editor enhancements --- .../apps/PropertyEditorView/PropertyEditorView.vue | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/vue/src/apps/PropertyEditorView/PropertyEditorView.vue b/vue/src/apps/PropertyEditorView/PropertyEditorView.vue index f7fa5d90b..ea416ee60 100644 --- a/vue/src/apps/PropertyEditorView/PropertyEditorView.vue +++ b/vue/src/apps/PropertyEditorView/PropertyEditorView.vue @@ -69,10 +69,11 @@ @@ -248,7 +249,8 @@ export default { updateFood: function (food) { let apiClient = new ApiApiFactory() apiClient.partialUpdateFood(food.id, food).then(result => { - this.spliceInFood(this.buildFood(result.data)) + // don't use result to prevent flickering + //this.spliceInFood(this.buildFood(result.data)) StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE) }).catch((err) => { StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err) @@ -269,10 +271,12 @@ export default { copyCalculatedResult: function () { this.$copyText(this.calculator_to_amount) }, - enableProperty: function (property, food) { + enableProperty: async function (property, food) { property.property_amount = 0; this.updateFood(food) - document.getElementById(`id_add_btn_${food.id}_${property.property_type.id}`).focus() + await this.$nextTick(); + this.$refs[`id_input_${food.id}_${property.property_type.id}`][0].focus() + this.$refs[`id_input_${food.id}_${property.property_type.id}`][0].select() }, }, } From 565a732ff01ae3054d3cde6052866f6325b2301a Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 19 Feb 2024 21:56:16 +0100 Subject: [PATCH 44/45] remove property --- vue/src/apps/PropertyEditorView/PropertyEditorView.vue | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/vue/src/apps/PropertyEditorView/PropertyEditorView.vue b/vue/src/apps/PropertyEditorView/PropertyEditorView.vue index ea416ee60..d4f6c1a6a 100644 --- a/vue/src/apps/PropertyEditorView/PropertyEditorView.vue +++ b/vue/src/apps/PropertyEditorView/PropertyEditorView.vue @@ -72,8 +72,14 @@ Add From de80702e3fa970a0904b86ecbc45d390c3e59e8e Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 20 Feb 2024 07:54:13 +0100 Subject: [PATCH 45/45] fixed property duplicate detection --- cookbook/helper/open_data_importer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cookbook/helper/open_data_importer.py b/cookbook/helper/open_data_importer.py index fd6a56e86..a6fad9764 100644 --- a/cookbook/helper/open_data_importer.py +++ b/cookbook/helper/open_data_importer.py @@ -413,15 +413,17 @@ class OpenDataImporter: if len(create_list) > 0: model_type.objects.bulk_create(create_list, ignore_conflicts=True, unique_fields=('space', 'open_data_food_slug', 'property_type',)) - linked_properties = list(model_type.objects.filter(space=self.request.space).values_list('id', flat=True).all()) + linked_properties = list(FoodProperty.objects.filter(food__space=self.request.space).values_list('property_id', flat=True).all()) property_food_relation_list = [] for p in model_type.objects.filter(space=self.request.space, open_data_food_slug__isnull=False).values_list('open_data_food_slug', 'id', ): + if p[1] == 147: + pass # slug_id_cache should always exist, don't create relations for already linked properties (ignore_conflicts would do that as well but this is more performant) if p[0] in self.slug_id_cache['food'] and p[1] not in linked_properties: property_food_relation_list.append(Food.properties.through(food_id=self.slug_id_cache['food'][p[0]], property_id=p[1])) - FoodProperty.objects.bulk_create(property_food_relation_list, ignore_conflicts=True, unique_fields=('food_id', 'property_id',)) + FoodProperty.objects.bulk_create(property_food_relation_list, unique_fields=('food_id', 'property_id',)) return od_response