From 4ec3611a3613de08a3c60a315b1182a5c4a8b801 Mon Sep 17 00:00:00 2001 From: burny0202 Date: Sat, 3 May 2025 10:51:34 +0100 Subject: [PATCH 1/4] Get the number of times an ingrient occurred in the last 90 days. Still need to sort by this #805 --- lib/widgets/nutrition/forms.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/widgets/nutrition/forms.dart b/lib/widgets/nutrition/forms.dart index 60d32967..d5e3bfea 100644 --- a/lib/widgets/nutrition/forms.dart +++ b/lib/widgets/nutrition/forms.dart @@ -141,6 +141,7 @@ Widget MealItemForm( Widget IngredientLogForm(NutritionalPlan plan) { return IngredientForm( + allDiaryEntries: plan.diaryEntries, recent: plan.dedupDiaryEntries, onSave: (BuildContext context, MealItem mealItem, DateTime? dt) { Provider.of(context, listen: false) @@ -166,6 +167,7 @@ class IngredientForm extends StatefulWidget { final bool withDate; final String barcode; final bool test; + final List? allDiaryEntries; const IngredientForm({ required this.recent, @@ -173,6 +175,7 @@ class IngredientForm extends StatefulWidget { required this.withDate, this.barcode = '', this.test = false, + this.allDiaryEntries, }); @override @@ -331,7 +334,6 @@ class IngredientFormState extends State { onTap: () async { // Stop keyboard from appearing FocusScope.of(context).requestFocus(FocusNode()); - // Open time picker final pickedTime = await showTimePicker( context: context, @@ -439,11 +441,13 @@ class IngredientFormState extends State { ); } + const Duration recentWindow = Duration(days: -90); return Card( child: ListTile( onTap: select, title: Text( - '${suggestions[index].ingredient.name} (${suggestions[index].amount.toStringAsFixed(0)}$unit)', + '${widget.allDiaryEntries?.where((diaryEntries) => diaryEntries.ingredientId == suggestions[index].ingredientId && diaryEntries.amount == suggestions[index].amount && diaryEntries.datetime.isAfter(DateTime.now().add(recentWindow))).length} x ' + '${suggestions[index].ingredient.name} (${suggestions[index].amount.toStringAsFixed(0)}$unit) ', ), subtitle: Text(getShortNutritionValues( suggestions[index].ingredient.nutritionalValues, From f2d4b27e18ad7435e5e35fc6f5da0fb9f608a9c7 Mon Sep 17 00:00:00 2001 From: burny0202 Date: Sun, 4 May 2025 15:59:25 +0100 Subject: [PATCH 2/4] Bug fix - Unexpected twice unique filtering. Used padding method instead #805 --- lib/models/nutrition/nutritional_plan.dart | 32 +++++++++++++++++----- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/models/nutrition/nutritional_plan.dart b/lib/models/nutrition/nutritional_plan.dart index 4318f07e..ffa91f85 100644 --- a/lib/models/nutrition/nutritional_plan.dart +++ b/lib/models/nutrition/nutritional_plan.dart @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import 'dart:collection'; import 'package:collection/collection.dart'; import 'package:flutter/widgets.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -226,15 +227,32 @@ class NutritionalPlan { /// returns diary entries /// deduped by the combination of amount and ingredient ID List get dedupDiaryEntries { - final out = []; + List out; + var uniqueLogs = {}; for (final log in diaryEntries) { - final found = out.firstWhereOrNull( - (e) => e.amount == log.amount && e.ingredientId == log.ingredientId, - ); - if (found == null) { - out.add(log); - } + final uniqueAndCountString = '${log.ingredientId}/${log.amount}'; + uniqueLogs[uniqueAndCountString] = log; } + + //Get unique + out = uniqueLogs.values.toList(); + var countLogs = {}; + const Duration recentWindow = Duration(days: -90); + + //Sort by frequency + for (final log in out) { + final int howMany = diaryEntries + .where((diaryEntries) => + diaryEntries.ingredientId == log.ingredientId && + diaryEntries.amount == log.amount && + diaryEntries.datetime.isAfter(DateTime.now().add(recentWindow))) + .length; + countLogs[howMany] = log; + } + + final sortedByFrequency = SplayTreeMap.from(countLogs, (b, a) => a.compareTo(b)); + out = sortedByFrequency.values.toList(); + return out; } From e9f7438c367d3135c0735a9aff5dd71fee649b34 Mon Sep 17 00:00:00 2001 From: Shininess8816 Date: Thu, 8 May 2025 21:54:24 +0100 Subject: [PATCH 3/4] Bring unique method #805 --- lib/models/nutrition/nutritional_plan.dart | 30 +++++++++------------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/lib/models/nutrition/nutritional_plan.dart b/lib/models/nutrition/nutritional_plan.dart index ffa91f85..8f477919 100644 --- a/lib/models/nutrition/nutritional_plan.dart +++ b/lib/models/nutrition/nutritional_plan.dart @@ -227,31 +227,25 @@ class NutritionalPlan { /// returns diary entries /// deduped by the combination of amount and ingredient ID List get dedupDiaryEntries { - List out; - var uniqueLogs = {}; - for (final log in diaryEntries) { - final uniqueAndCountString = '${log.ingredientId}/${log.amount}'; - uniqueLogs[uniqueAndCountString] = log; - } - //Get unique - out = uniqueLogs.values.toList(); - var countLogs = {}; + //Get unique and sort by frequency const Duration recentWindow = Duration(days: -90); - - //Sort by frequency - for (final log in out) { + var uniqueLogs = {}; + for (final log in diaryEntries){ final int howMany = diaryEntries .where((diaryEntries) => - diaryEntries.ingredientId == log.ingredientId && - diaryEntries.amount == log.amount && - diaryEntries.datetime.isAfter(DateTime.now().add(recentWindow))) + diaryEntries.ingredientId == log.ingredientId && + diaryEntries.amount == log.amount && + diaryEntries.datetime.isAfter(DateTime.now().add(recentWindow))) .length; - countLogs[howMany] = log; + //Padding allows for sorting string as if number + final String howManyPadded = howMany.toString().padLeft(10,'0'); + final uniqueAndCountString = '${howManyPadded}_${log.ingredientId}_${log.amount}'; + uniqueLogs[uniqueAndCountString] = log; } - final sortedByFrequency = SplayTreeMap.from(countLogs, (b, a) => a.compareTo(b)); - out = sortedByFrequency.values.toList(); + final sortedByFrequency = SplayTreeMap.from(uniqueLogs, (b, a) => a.compareTo(b)); + final out = sortedByFrequency.values.toList(); return out; } From 33166d508180351564fcca539699b36c733544e2 Mon Sep 17 00:00:00 2001 From: Shininess8816 Date: Thu, 8 May 2025 22:34:19 +0100 Subject: [PATCH 4/4] flutter pub run build_runner build && dart format --line-length=100 . --- lib/models/nutrition/nutritional_plan.dart | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/models/nutrition/nutritional_plan.dart b/lib/models/nutrition/nutritional_plan.dart index 8f477919..6857ea5a 100644 --- a/lib/models/nutrition/nutritional_plan.dart +++ b/lib/models/nutrition/nutritional_plan.dart @@ -227,19 +227,18 @@ class NutritionalPlan { /// returns diary entries /// deduped by the combination of amount and ingredient ID List get dedupDiaryEntries { - //Get unique and sort by frequency const Duration recentWindow = Duration(days: -90); var uniqueLogs = {}; - for (final log in diaryEntries){ + for (final log in diaryEntries) { final int howMany = diaryEntries .where((diaryEntries) => - diaryEntries.ingredientId == log.ingredientId && - diaryEntries.amount == log.amount && - diaryEntries.datetime.isAfter(DateTime.now().add(recentWindow))) + diaryEntries.ingredientId == log.ingredientId && + diaryEntries.amount == log.amount && + diaryEntries.datetime.isAfter(DateTime.now().add(recentWindow))) .length; //Padding allows for sorting string as if number - final String howManyPadded = howMany.toString().padLeft(10,'0'); + final String howManyPadded = howMany.toString().padLeft(10, '0'); final uniqueAndCountString = '${howManyPadded}_${log.ingredientId}_${log.amount}'; uniqueLogs[uniqueAndCountString] = log; }