Skip to content

Commit 3e42d6a

Browse files
committed
Add button now adds food to FoodEntry instead of creating a new one in sub menus. Ingredients can now be edited
1 parent 2dd3c89 commit 3e42d6a

9 files changed

Lines changed: 86 additions & 11 deletions

app/lib/screens/create_ingredient_dialog.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ class _CreateIngredientDialogState extends State<CreateIngredientDialog> {
2121

2222
@override
2323
void initState() {
24-
super.initState();
2524
if (widget.ingredient.id != null) {
2625
nameController.text = widget.ingredient.name ?? "";
2726
costController.text = PriceHelper.formatPriceWithoutUnit(widget.ingredient.cost);
2827
amountController.text = widget.ingredient.amount.toString();
29-
}
28+
}
29+
super.initState();
3030
}
3131

3232
@override

app/lib/screens/food_screen.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class _FoodScreenState extends State<FoodScreen> {
4949
},
5050
items: Storage.getFoodsForCurrentAssembly(),
5151
mappingFunction: (x) => FoodWidget(
52+
allowNew: true,
5253
food: x,
5354
foodRemoved: () => setState(() {}),
5455
),

app/lib/screens/food_widget.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ class FoodWidget extends StatefulWidget {
1414
Food food;
1515
Function()? onTap;
1616
Function()? foodRemoved;
17+
bool allowNew = true;
1718

1819
FoodWidget({
1920
Key? key,
2021
required this.food,
2122
this.foodRemoved,
23+
required this.allowNew,
2224
this.onTap,
2325
}) : super(key: key);
2426

@@ -74,7 +76,7 @@ class _FoodWidgetState extends State<FoodWidget> {
7476
}),
7577
IconButton(
7678
icon: const Icon(Icons.add),
77-
onPressed: () {
79+
onPressed: widget.allowNew ? () {
7880
Navigator.push(
7981
context,
8082
MaterialPageRoute(
@@ -83,7 +85,7 @@ class _FoodWidgetState extends State<FoodWidget> {
8385
),
8486
),
8587
);
86-
}),
88+
} : widget.onTap),
8789
],
8890
)
8991
],
Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
import 'package:eat_somewhere/data/food.dart';
22
import 'package:eat_somewhere/data/helper.dart';
3+
import 'package:eat_somewhere/screens/create_ingredient_dialog.dart';
4+
import 'package:eat_somewhere/service/storage.dart';
5+
import 'package:eat_somewhere/widgets/error_dialog.dart';
6+
import 'package:eat_somewhere/widgets/info_dialog.dart';
7+
import 'package:eat_somewhere/widgets/padded_card.dart';
8+
import 'package:eat_somewhere/widgets/yes_cancel_dialog.dart';
39
import 'package:flutter/material.dart';
410

511
class IngredientWidget extends StatefulWidget {
612
Ingredient ingredient;
713
Function() onTap;
14+
Function()? ingredientRemoved;
815

9-
IngredientWidget({required this.ingredient, required this.onTap, Key? key})
16+
IngredientWidget({required this.ingredient, required this.onTap, required this.ingredientRemoved, Key? key})
1017
: super(key: key);
1118

1219
@override
@@ -16,10 +23,51 @@ class IngredientWidget extends StatefulWidget {
1623
class _IngredientWidgetState extends State<IngredientWidget> {
1724
@override
1825
Widget build(BuildContext context) {
19-
return ListTile(
20-
title: Text(widget.ingredient.name ?? "Unknown"),
21-
subtitle: Text("${widget.ingredient.amount} ${widget.ingredient.unit.name} - ${PriceHelper.formatPriceWithUnit(widget.ingredient.cost)}"),
26+
return PaddedCard(
2227
onTap: widget.onTap,
23-
);
28+
child: Row(
29+
spacing: 10,
30+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
31+
children: [
32+
Column(
33+
crossAxisAlignment: CrossAxisAlignment.start,
34+
children: [
35+
Text(widget.ingredient.name ?? "Unknown"),
36+
Text("~ ${PriceHelper.formatPriceWithUnit(widget.ingredient.cost)} per ${widget.ingredient.amount} ${widget.ingredient.unit.name}"),
37+
]),
38+
Row(
39+
spacing: 10,
40+
children: [
41+
if(widget.ingredientRemoved != null) IconButton(
42+
icon: const Icon(Icons.delete),
43+
onPressed: () async {
44+
if(await YesCancelDialog.show("Archive Ingredient", "Do you really want to archive '${widget.ingredient.name}'? This cannot be undone") == true) {
45+
String? error = await Storage.deleteIngredient(widget.ingredient);
46+
if(error != null) {
47+
ErrorDialog.show("Error archiving Ingredient", error);
48+
return;
49+
}
50+
InfoDialog.show("Ingredient archived", "Ingredient '${widget.ingredient.name}' was successfully archived");
51+
widget.ingredientRemoved?.call();
52+
}
53+
}),
54+
IconButton(
55+
icon: const Icon(Icons.edit),
56+
onPressed: () async {
57+
Ingredient? newIngredient = await showDialog(
58+
context: context,
59+
builder: (builder) => CreateIngredientDialog(
60+
ingredient: widget.ingredient
61+
));
62+
widget.ingredientRemoved?.call();
63+
setState(() {});
64+
}),
65+
IconButton(
66+
icon: const Icon(Icons.add),
67+
onPressed: widget.onTap),
68+
],
69+
)
70+
],
71+
));
2472
}
2573
}

app/lib/screens/select_food.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class _SelectFoodScreenState extends State<SelectFoodScreen> {
2727
mappingFunction: (x) => FoodWidget(
2828
food: x,
2929
onTap: () => Navigator.pop(context, x),
30+
allowNew: false,
3031
),
3132
stringFunction: (x) => x.name ?? "Unknown",
3233
newAction: () async {

app/lib/screens/select_ingredient.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class _SelectIngredientScreenState extends State<SelectIngredientScreen> {
2323
setState(() {});
2424
},
2525
mappingFunction: (x) => IngredientWidget(
26+
ingredientRemoved: () => setState(() {}),
2627
ingredient: x,
2728
onTap: () {
2829
Navigator.pop(context, x);

app/lib/screens/shopping_list_screen.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ class _ShoppingListScreenState extends State<ShoppingListScreen> {
3030
),
3131
// Adjust the table to use the minimum width it needs
3232
Row(
33+
mainAxisSize: MainAxisSize.min,
3334
children: [
34-
Expanded(child: Container(child: Table(
35+
Expanded(child: Table(
3536
defaultVerticalAlignment: TableCellVerticalAlignment.middle,
3637
children: [
3738
...widget.foodEntry
@@ -44,7 +45,7 @@ class _ShoppingListScreenState extends State<ShoppingListScreen> {
4445
PriceChip(amount: item.getEstimatedCost()),
4546
])),
4647
],
47-
)))
48+
))
4849
],
4950
)
5051
],

app/lib/service/server_loader.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,16 @@ class ServerLoader {
170170
}
171171
return [];
172172
}
173+
174+
static Future<ErrorContainer<bool?>> deleteIngredient(Ingredient ingredient) async {
175+
var response = await ServerCom.delete("/api/v1/ingredient/${ingredient.id}");
176+
print(response.body);
177+
if (response.statusCode == 200) {
178+
return ErrorContainer(jsonDecode(response.body)["Success"], null);
179+
} else {
180+
return ErrorContainer(null, "Error: ${response.statusCode} ${response.body}");
181+
}
182+
}
173183
}
174184

175185
class CreatedResponse {

app/lib/service/storage.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,4 +215,15 @@ class Storage {
215215
Storage.instance.foods[getSettings().chosenAssembly]?.removeWhere((x) => x.id == food.id);
216216
return null;
217217
}
218+
219+
static Future<String?> deleteIngredient(Ingredient ingredient) async {
220+
ErrorContainer<bool?> serverResponse =
221+
await ServerLoader.deleteIngredient(ingredient);
222+
if (serverResponse.error != null) {
223+
return serverResponse.error;
224+
}
225+
// The old food was archived, therefore we need to remove it
226+
Storage.instance.ingredients[getSettings().chosenAssembly]?.removeWhere((x) => x.id == ingredient.id);
227+
return null;
228+
}
218229
}

0 commit comments

Comments
 (0)