From 84edaef10a801834a1ba6c7dce1f940c19833ffc Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 18 Apr 2022 21:49:10 +1000 Subject: [PATCH] Bug fix and refactoring - Display difference between "in stock" and "unallocated stock" - Refactor to use single function in detail and list widgets --- lib/inventree/part.dart | 25 ++++++++++++++++++++----- lib/widget/part_detail.dart | 20 ++++++++++---------- lib/widget/part_list.dart | 2 +- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index db62ba66..a5b7ef39 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -269,17 +269,18 @@ class InvenTreePart extends InvenTreeModel { } // Get the 'available stock' for this Part - double get availableStock { + double get unallocatedStock { + // Note that the 'available_stock' was not added until API v35 - if (jsondata.containsKey("available_stock")) { - return double.tryParse(jsondata["available_stock"].toString()) ?? 0; + if (jsondata.containsKey("unallocated_stock")) { + return double.tryParse(jsondata["unallocated_stock"].toString()) ?? 0; } else { return inStock; } } - String get availableStockString { - String q = simpleNumberString(availableStock); + String get unallocatedStockString { + String q = simpleNumberString(unallocatedStock); if (units.isNotEmpty) { q += " ${units}"; @@ -288,6 +289,20 @@ class InvenTreePart extends InvenTreeModel { return q; } + String stockString({bool includeUnits = true}) { + String q = unallocatedStockString; + + if (unallocatedStock != inStock) { + q += " / ${inStockString}"; + } + + if (includeUnits && units.isNotEmpty) { + q += " ${units}"; + } + + return q; + } + String get units => (jsondata["units"] ?? "") as String; // Get the number of units being build for this Part diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index 254761f4..07a37c44 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -204,24 +204,24 @@ class _PartDisplayState extends RefreshableState { ); } else { tiles.add( - ListTile( - title: Text(L10().partCategory), - subtitle: Text(L10().partCategoryTopLevel), - leading: FaIcon(FontAwesomeIcons.sitemap, color: COLOR_CLICK), - onTap: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => CategoryDisplayWidget(null))); - }, - ) + ListTile( + title: Text(L10().partCategory), + subtitle: Text(L10().partCategoryTopLevel), + leading: FaIcon(FontAwesomeIcons.sitemap, color: COLOR_CLICK), + onTap: () { + Navigator.push(context, MaterialPageRoute( + builder: (context) => CategoryDisplayWidget(null))); + }, + ) ); } - // Stock information tiles.add( ListTile( title: Text(L10().availableStock), subtitle: Text(L10().stockDetails), leading: FaIcon(FontAwesomeIcons.boxes, color: COLOR_CLICK), - trailing: Text(part.availableStockString), + trailing: Text(part.stockString()), onTap: () { setState(() { tabIndex = 1; diff --git a/lib/widget/part_list.dart b/lib/widget/part_list.dart index dd8ea6a0..ca4d158e 100644 --- a/lib/widget/part_list.dart +++ b/lib/widget/part_list.dart @@ -87,7 +87,7 @@ class _PaginatedPartListState extends PaginatedSearchState { return ListTile( title: Text(part.fullname), subtitle: Text(part.description), - trailing: Text(part.availableStockString), + trailing: Text(part.stockString()), leading: InvenTreeAPI().getImage( part.thumbnail, width: 40,