diff --git a/lib/models/nutrition/nutritional_plan.dart b/lib/models/nutrition/nutritional_plan.dart
index 294c95c6..ce9b8069 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 'package:collection/collection.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:json_annotation/json_annotation.dart';
@@ -191,16 +192,16 @@ class NutritionalPlan {
return out;
}
- /// Helper that returns all meal items for the current plan
- ///
- /// Duplicated ingredients are removed
- List get allMealItems {
+ /// returns meal items across all meals
+ /// deduped by the combination of amount and ingredient ID
+ List get dedupMealItems {
final List out = [];
for (final meal in meals) {
for (final mealItem in meal.mealItems) {
- final ingredientInList = out.where((e) => e.ingredientId == mealItem.ingredientId);
+ final found = out.firstWhereOrNull(
+ (e) => e.amount == mealItem.amount && e.ingredientId == mealItem.ingredientId);
- if (ingredientInList.isEmpty) {
+ if (found == null) {
out.add(mealItem);
}
}
@@ -208,6 +209,20 @@ class NutritionalPlan {
return out;
}
+ /// returns diary entries
+ /// deduped by the combination of amount and ingredient ID
+ List get dedupDiaryEntries {
+ final out = [];
+ for (final log in diaryEntries) {
+ final found =
+ out.firstWhereOrNull((e) => e.amount == log.amount && e.ingredientId == log.ingredientId);
+ if (found == null) {
+ out.add(log);
+ }
+ }
+ return out;
+ }
+
Meal pseudoMealOthers(String name) {
return Meal(
id: PSEUDO_MEAL_ID,
diff --git a/lib/widgets/nutrition/forms.dart b/lib/widgets/nutrition/forms.dart
index c9d319e7..cfe4d06a 100644
--- a/lib/widgets/nutrition/forms.dart
+++ b/lib/widgets/nutrition/forms.dart
@@ -131,7 +131,7 @@ Widget MealItemForm(Meal meal, List recent, [String? barcode, bool? te
Widget IngredientLogForm(NutritionalPlan plan) {
return IngredientForm(
- recent: plan.diaryEntries,
+ recent: plan.dedupDiaryEntries,
onSave: (BuildContext context, MealItem mealItem, DateTime? dt) {
Provider.of(context, listen: false)
.logIngredientToDiary(mealItem, plan.id!, dt);
diff --git a/lib/widgets/nutrition/meal.dart b/lib/widgets/nutrition/meal.dart
index 769f991f..e11b6e7c 100644
--- a/lib/widgets/nutrition/meal.dart
+++ b/lib/widgets/nutrition/meal.dart
@@ -39,11 +39,11 @@ enum viewMode {
class MealWidget extends StatefulWidget {
final Meal _meal;
- final List _listMealItems;
+ final List _recentMealItems;
const MealWidget(
this._meal,
- this._listMealItems,
+ this._recentMealItems,
);
@override
@@ -108,7 +108,7 @@ class _MealWidgetState extends State {
FormScreen.routeName,
arguments: FormScreenArguments(
AppLocalizations.of(context).addIngredient,
- MealItemForm(widget._meal, widget._listMealItems),
+ MealItemForm(widget._meal, widget._recentMealItems),
hasListView: true,
),
);
diff --git a/lib/widgets/nutrition/nutritional_plan_detail.dart b/lib/widgets/nutrition/nutritional_plan_detail.dart
index 9feb631c..cf873904 100644
--- a/lib/widgets/nutrition/nutritional_plan_detail.dart
+++ b/lib/widgets/nutrition/nutritional_plan_detail.dart
@@ -56,11 +56,11 @@ class NutritionalPlanDetailWidget extends StatelessWidget {
const SizedBox(height: 10),
..._nutritionalPlan.meals.map((meal) => MealWidget(
meal,
- _nutritionalPlan.allMealItems,
+ _nutritionalPlan.dedupMealItems,
)),
MealWidget(
_nutritionalPlan.pseudoMealOthers('Other logs'),
- _nutritionalPlan.allMealItems,
+ _nutritionalPlan.dedupMealItems,
),
if (!_nutritionalPlan.onlyLogging)
Padding(
diff --git a/test/nutrition/nutritional_plan_model_test.dart b/test/nutrition/nutritional_plan_model_test.dart
index 096e837e..8e3a2887 100644
--- a/test/nutrition/nutritional_plan_model_test.dart
+++ b/test/nutrition/nutritional_plan_model_test.dart
@@ -101,7 +101,7 @@ void main() {
});
test('Test that the getter returns all meal items for a plan', () {
- expect(plan.allMealItems, plan.meals[0].mealItems + plan.meals[1].mealItems);
+ expect(plan.dedupMealItems, plan.meals[0].mealItems + plan.meals[1].mealItems);
});
});
}