diff --git a/assets/release_notes.md b/assets/release_notes.md index b461844c..b385a356 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,6 +1,12 @@ ## InvenTree App Release Notes --- +### 0.8.2 - August 2022 +--- + +- Allow serial numbers to be specified when creating new stock items +- Allow serial numbers to be edited for existing stock items + ### 0.8.1 - August 2022 --- diff --git a/lib/api_form.dart b/lib/api_form.dart index 5c07f023..db9e6673 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -855,17 +855,18 @@ Future launchApiForm( IconData icon = FontAwesomeIcons.save, }) async { + showLoadingOverlay(context); + // List of fields defined by the server Map serverFields = {}; if (url.isNotEmpty) { - showLoadingOverlay(context); var options = await InvenTreeAPI().options(url); - hideLoadingOverlay(); // Invalid response from server if (!options.isValid()) { + hideLoadingOverlay(); return; } @@ -878,6 +879,7 @@ Future launchApiForm( icon: FontAwesomeIcons.userTimes, ); + hideLoadingOverlay(); return; } } @@ -927,6 +929,8 @@ Future launchApiForm( await field.loadInitialData(); } + hideLoadingOverlay(); + // Now, launch a new widget! Navigator.push( context, @@ -1067,7 +1071,6 @@ class _APIFormWidgetState extends State { spacerRequired = true; break; } - } return widgets; diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index 406b625f..fc21d8de 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -199,6 +199,11 @@ class InvenTreeStockItem extends InvenTreeModel { "part": {}, "location": {}, "quantity": {}, + "serial": {}, + "serial_numbers": { + "label": L10().serialNumber, + "type": "string", + }, "status": {}, "batch": {}, "packaging": {}, diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index ef63f483..f9457f5b 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -544,25 +544,53 @@ class _PartDisplayState extends RefreshableState { return tiles; } + /* + * Launch a form to create a new StockItem for this part + */ Future _newStockItem(BuildContext context) async { var fields = InvenTreeStockItem().formFields(); + // Serial number cannot be directly edited here + fields.remove("serial"); + + // Hide the "part" field fields["part"]["hidden"] = true; int? default_location = part.defaultLocation; + Map data = { + "part": part.pk.toString() + }; + if (default_location != null) { - fields["location"]["value"] = default_location; + data["location"] = default_location; } + if (part.isTrackable) { + // read the next available serial number + showLoadingOverlay(context); + var response = await InvenTreeAPI().get("/api/part/${part.pk}/serial-numbers/", expectedStatusCode: null); + hideLoadingOverlay(); + + if (response.isValid() && response.statusCode == 200) { + data["serial_numbers"] = response.data["next"] ?? response.data["latest"]; + } + + print("response: " + response.statusCode.toString() + response.data.toString()); + + } else { + // Cannot set serial numbers for non-trackable parts + fields.remove("serial_numbers"); + } + + print("data: ${data.toString()}"); + InvenTreeStockItem().createForm( context, L10().stockItemCreate, fields: fields, - data: { - "part": "${part.pk}", - }, + data: data, onSuccess: (result) async { Map data = result as Map; diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index 77804d7e..3f36055d 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -292,6 +292,11 @@ class _StockItemDisplayState extends RefreshableState { fields.remove("part"); fields.remove("quantity"); fields.remove("location"); + fields.remove("serial_numbers"); + + if (part == null || !part!.isTrackable) { + fields.remove("serial"); + } item.editForm( context, diff --git a/pubspec.yaml b/pubspec.yaml index cd98bc20..f78faea2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: inventree description: InvenTree stock management -version: 0.8.1+47 +version: 0.8.2+48 environment: sdk: ">=2.16.0 <3.0.0"