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); }); }); }