diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index 2e85a201..0de430ae 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -56,6 +56,67 @@ class InvenTreeStockItemTestResult extends InvenTreeModel { } +class InvenTreeStockItemHistory extends InvenTreeModel { + + InvenTreeStockItemHistory() : super(); + + InvenTreeStockItemHistory.fromJson(Map json) : super.fromJson(json); + + @override + InvenTreeModel createFromJson(Map json) { + return InvenTreeStockItemHistory.fromJson(json); + } + + @override + String get URL => "stock/track/"; + + @override + Map defaultListFilters() { + + // By default, order by decreasing date + return { + "ordering": "-date", + }; + } + + DateTime? get date { + if (jsondata.containsKey("date")) { + return DateTime.tryParse((jsondata["date"] ?? "") as String); + } else { + return null; + } + } + + String get dateString { + var d = date; + + if (d == null) { + return ""; + } + + return DateFormat("yyyy-MM-dd").format(d); + } + + String get label => (jsondata["label"] ?? "") as String; + + String get quantityString { + Map deltas = (jsondata["deltas"] ?? {}) as Map; + + // Serial number takes priority here + if (deltas.containsKey("serial")) { + var serial = (deltas["serial"] ?? "").toString() as String; + return "# ${serial}"; + } else if (deltas.containsKey("quantity")) { + double q = (deltas["quantity"] ?? 0); + + return simpleNumberString(q); + } else { + return ""; + } + } +} + + class InvenTreeStockItem extends InvenTreeModel { InvenTreeStockItem() : super(); diff --git a/lib/widget/stock_item_history.dart b/lib/widget/stock_item_history.dart index ffc6a8cd..7cfb260f 100644 --- a/lib/widget/stock_item_history.dart +++ b/lib/widget/stock_item_history.dart @@ -6,6 +6,8 @@ import 'package:flutter/material.dart'; import 'package:inventree/widget/refreshable_state.dart'; import 'package:inventree/l10.dart'; import 'package:inventree/inventree/stock.dart'; +import 'package:inventree/inventree/model.dart'; + class StockItemHistoryWidget extends StatefulWidget { @@ -27,9 +29,24 @@ class _StockItemHistoryDisplayState extends RefreshableState L10().stockItemHistory; + List history = []; + @override Future request(BuildContext refresh) async { - // TODO + + history.clear(); + + InvenTreeStockItemHistory().list(filters: {"item": "${item.pk}"}).then((List results) { + for (var result in results) { + if (result is InvenTreeStockItemHistory) { + history.add(result); + } + } + + // Refresh + setState(() { + }); + }); } @override @@ -37,8 +54,25 @@ class _StockItemHistoryDisplayState extends RefreshableState historyList() { + List tiles = []; + + for (var entry in history) { + tiles.add( + ListTile( + leading: Text(entry.dateString), + trailing: entry.quantityString.isNotEmpty ? Text(entry.quantityString) : null, + title: Text(entry.label), + subtitle: entry.notes.isNotEmpty ? Text(entry.notes) : null, + ) + ); + } + + return tiles; + } } \ No newline at end of file