mirror of
				https://github.com/inventree/inventree-app.git
				synced 2025-10-31 05:15:42 +00:00 
			
		
		
		
	Display history
This commit is contained in:
		| @@ -56,6 +56,67 @@ class InvenTreeStockItemTestResult extends InvenTreeModel { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class InvenTreeStockItemHistory extends InvenTreeModel { | ||||||
|  |  | ||||||
|  |   InvenTreeStockItemHistory() : super(); | ||||||
|  |  | ||||||
|  |   InvenTreeStockItemHistory.fromJson(Map<String, dynamic> json) : super.fromJson(json); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   InvenTreeModel createFromJson(Map<String, dynamic> json) { | ||||||
|  |     return InvenTreeStockItemHistory.fromJson(json); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   String get URL => "stock/track/"; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Map<String, String> 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<String, dynamic> deltas = (jsondata["deltas"] ?? {}) as Map<String, dynamic>; | ||||||
|  |  | ||||||
|  |     // 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 { | class InvenTreeStockItem extends InvenTreeModel { | ||||||
|  |  | ||||||
|   InvenTreeStockItem() : super(); |   InvenTreeStockItem() : super(); | ||||||
|   | |||||||
| @@ -6,6 +6,8 @@ import 'package:flutter/material.dart'; | |||||||
| import 'package:inventree/widget/refreshable_state.dart'; | import 'package:inventree/widget/refreshable_state.dart'; | ||||||
| import 'package:inventree/l10.dart'; | import 'package:inventree/l10.dart'; | ||||||
| import 'package:inventree/inventree/stock.dart'; | import 'package:inventree/inventree/stock.dart'; | ||||||
|  | import 'package:inventree/inventree/model.dart'; | ||||||
|  |  | ||||||
|  |  | ||||||
| class StockItemHistoryWidget extends StatefulWidget { | class StockItemHistoryWidget extends StatefulWidget { | ||||||
|  |  | ||||||
| @@ -27,9 +29,24 @@ class _StockItemHistoryDisplayState extends RefreshableState<StockItemHistoryWid | |||||||
|   @override |   @override | ||||||
|   String getAppBarTitle(BuildContext context) => L10().stockItemHistory; |   String getAppBarTitle(BuildContext context) => L10().stockItemHistory; | ||||||
|  |  | ||||||
|  |   List<InvenTreeStockItemHistory> history = []; | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Future<void> request(BuildContext refresh) async { |   Future<void> request(BuildContext refresh) async { | ||||||
|     // TODO |  | ||||||
|  |     history.clear(); | ||||||
|  |  | ||||||
|  |     InvenTreeStockItemHistory().list(filters: {"item": "${item.pk}"}).then((List<InvenTreeModel> results) { | ||||||
|  |       for (var result in results) { | ||||||
|  |         if (result is InvenTreeStockItemHistory) { | ||||||
|  |           history.add(result); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Refresh | ||||||
|  |       setState(() { | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
| @@ -37,8 +54,25 @@ class _StockItemHistoryDisplayState extends RefreshableState<StockItemHistoryWid | |||||||
|     return ListView( |     return ListView( | ||||||
|       children: ListTile.divideTiles( |       children: ListTile.divideTiles( | ||||||
|         context: context, |         context: context, | ||||||
|         tiles: [], |         tiles: historyList(), | ||||||
|       ).toList() |       ).toList() | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   List<Widget> historyList() { | ||||||
|  |     List<Widget> 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; | ||||||
|  |   } | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user