146 lines
4.4 KiB
Dart
146 lines
4.4 KiB
Dart
import 'package:cdb_ui/api.dart';
|
|
import 'package:cdb_ui/pages/expandable_list.dart';
|
|
import 'package:cdb_ui/pages/transaction.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class StatsPage extends StatelessWidget {
|
|
const StatsPage({super.key});
|
|
|
|
Future<(List<MinItem>, List<Transaction>, GlobalItemStat)>
|
|
_fetchData() async {
|
|
return (
|
|
await API().getItemsUnderMin(),
|
|
await API().getExpiredItems(),
|
|
await API().getGlobalItemStat()
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// todo : add global statistics
|
|
// todo : demand stat
|
|
// todo : stat on origin + destination
|
|
|
|
// global origin / destinations
|
|
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text("Home"),
|
|
),
|
|
body: FutureBuilder(
|
|
future: _fetchData(),
|
|
builder: (context, snapshot) {
|
|
if (!snapshot.hasData) {
|
|
return const CircularProgressIndicator();
|
|
}
|
|
|
|
var data = snapshot.data!;
|
|
var min = data.$1;
|
|
var expired = data.$2;
|
|
var globalStat = data.$3;
|
|
|
|
return Column(
|
|
children: [
|
|
Card(
|
|
margin: const EdgeInsets.all(10.0),
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(10.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
IconText(Icons.data_object,
|
|
"Items: ${globalStat.itemCount}"),
|
|
IconText(Icons.list_alt,
|
|
"Inventory: ${globalStat.totalTransactions}"),
|
|
IconText(Icons.money,
|
|
"Price: ${globalStat.totalPrice.toStringAsFixed(2)} €")
|
|
],
|
|
),
|
|
)),
|
|
|
|
if (min.isNotEmpty)
|
|
const ListTile(
|
|
title: Text(
|
|
"Items under Minimum",
|
|
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
|
|
)),
|
|
...min.map((item) {
|
|
var (itemID, variant) = itemVariant(item.itemVariant);
|
|
var name = API().getItem(itemID).variants[variant]!.name;
|
|
|
|
return ListTile(
|
|
title: Text("$name under minimum. Needs ${item.need} more."),
|
|
);
|
|
}).toList(),
|
|
|
|
if (expired.isNotEmpty)
|
|
const ListTile(
|
|
title: Text(
|
|
"Expired Items",
|
|
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
|
|
)),
|
|
|
|
// Mapping expired list to widgets
|
|
...expired.map((item) {
|
|
return ListTile(
|
|
title: TransactionCard(item, () {}),
|
|
);
|
|
}).toList(),
|
|
],
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class ItemStatPage extends StatelessWidget {
|
|
final Item item;
|
|
|
|
const ItemStatPage(this.item, {super.key});
|
|
|
|
// todo : avg time of transaction active
|
|
|
|
ExpandableListItem buildVariantStat(String variant) {
|
|
return ExpandableListItem(
|
|
body: FutureBuilder(
|
|
future: API().getStat(item.id, variant, full: true),
|
|
builder: (context, snapshot) {
|
|
if (!snapshot.hasData) {
|
|
return const CircularProgressIndicator();
|
|
}
|
|
|
|
var data = snapshot.data! as FullItemVariantStat;
|
|
|
|
return Column(
|
|
children: [
|
|
Text("Amount: ${data.amount}"),
|
|
Text("Total Cost: ${data.totalPrice}"),
|
|
Text("Expiry Rate: ${data.expiryRate}"),
|
|
...data.origins.keys.map((key) {
|
|
var originStat = data.origins[key]!;
|
|
return Column(children: [
|
|
Text("Inventory: ${originStat.inventory}"),
|
|
Text(
|
|
"Average Price: ${originStat.averagePrice.toStringAsFixed(2)} €"),
|
|
]);
|
|
}).toList()
|
|
],
|
|
);
|
|
},
|
|
),
|
|
header: Text(item.variants[variant]!.name));
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text("Statistics of ${item.name}"),
|
|
),
|
|
body: Column(children: [
|
|
ExpandableList(item.variants.keys.map(buildVariantStat).toList())
|
|
]),
|
|
);
|
|
}
|
|
}
|