From 05c59260f15b53880c0ac438021164311b91296e Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 10 Feb 2026 18:52:40 +1100 Subject: [PATCH 01/15] [bug] Label fix (#768) * [Bug] Fix label printing URL - Closes https://github.com/inventree/inventree-app/issues/767 * Bump release notes and version --- assets/release_notes.md | 5 +++++ lib/labels.dart | 2 +- pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index f38d841..62b42d7 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,8 @@ +## 0.22.2 - February 2026 +--- + +- Bug fix for label printing, which used improperly formatted URL + ## 0.22.1 - February 2026 --- diff --git a/lib/labels.dart b/lib/labels.dart index 2b7cc27..fe226be 100644 --- a/lib/labels.dart +++ b/lib/labels.dart @@ -7,7 +7,7 @@ import "package:inventree/l10.dart"; import "package:inventree/widget/progress.dart"; import "package:inventree/widget/snacks.dart"; -const String PRINT_LABEL_URL = "api/label/print/"; +const String PRINT_LABEL_URL = "label/print/"; /* * Custom form handler for label printing. diff --git a/pubspec.yaml b/pubspec.yaml index 14f931f..5230671 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: inventree description: InvenTree stock management -version: 0.22.1+110 +version: 0.22.2+111 environment: sdk: ^3.8.1 From 91bface77f2bf5d1d2647903e8cfae3f73c23c2e Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 17 Feb 2026 07:55:19 +1100 Subject: [PATCH 02/15] Update Android direct download link in README (#771) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2fdfe3..866e6f0 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Download and install from the [Apple App Store](https://apps.apple.com/au/app/in ### Direct Download (Android) -We provide direct downloads for Android users - view our [download page via polar.sh](https://polar.sh/inventree/products/299bf0d5-af88-4e0f-becf-c007ad37ecf2) +We provide direct downloads for Android users - view our [download page via polar.sh](https://buy.polar.sh/polar_cl_UnGILJ0c7P3hQrOrJs127oyLTTDOTHKrnqfCg30XtBI) ## User Documentation From 286daf2567c3f357127dc5168db6e348387f700f Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 22 Feb 2026 13:57:08 +1100 Subject: [PATCH 03/15] Extract location data when scanning barcode (#774) - Closes https://github.com/inventree/inventree-app/issues/772 --- assets/release_notes.md | 5 +++++ lib/barcode/purchase_order.dart | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/assets/release_notes.md b/assets/release_notes.md index 62b42d7..1ecdbe5 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,8 @@ +## 0.xx.y - Month Year +--- + +- Auto-fill location data when receiving item via barcode scan + ## 0.22.2 - February 2026 --- diff --git a/lib/barcode/purchase_order.dart b/lib/barcode/purchase_order.dart index 65f4913..3e2cdba 100644 --- a/lib/barcode/purchase_order.dart +++ b/lib/barcode/purchase_order.dart @@ -154,9 +154,12 @@ class POAllocateBarcodeHandler extends BarcodeHandler { return onBarcodeUnknown(data); } + // Extract field data from the returned result dynamic supplier_part = data["supplierpart"]; + dynamic location = data["location"]; int supplier_part_pk = -1; + int location_pk = -1; if (supplier_part is Map) { supplier_part_pk = (supplier_part["pk"] ?? -1) as int; @@ -164,6 +167,10 @@ class POAllocateBarcodeHandler extends BarcodeHandler { return onBarcodeUnknown(data); } + if (location is Map) { + location_pk = (location["pk"] ?? -1) as int; + } + // Dispose of the barcode scanner if (OneContext.hasContext) { OneContext().pop(); @@ -177,6 +184,10 @@ class POAllocateBarcodeHandler extends BarcodeHandler { fields["part"]?["hidden"] = false; fields["part"]?["value"] = supplier_part_pk; + if (location_pk > 0) { + fields["location"]?["value"] = location_pk; + } + InvenTreePOLineItem().createForm( context, L10().lineItemAdd, From 04f98559fc1d418cf9b91b97979ec808506e6344 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 27 Feb 2026 13:55:08 +1100 Subject: [PATCH 04/15] Fix bool fields (#778) * Improved UX for boolean fields - Use segmented button - Allow tristate - Improved filtering options * Bug fix for null filter values * Prevent null filters from being sent to the server * Update release notes --- assets/release_notes.md | 3 ++ lib/api_form.dart | 95 ++++++++++++++++++++++++++++++++------- lib/labels.dart | 2 + lib/widget/paginator.dart | 16 +++++-- 4 files changed, 97 insertions(+), 19 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index 1ecdbe5..d69806a 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -2,6 +2,9 @@ --- - Auto-fill location data when receiving item via barcode scan +- Visual improvements for boolean form fields +- Add support for tri-state boolean form fields +- Bug fixes for refreshing list view data ## 0.22.2 - February 2026 --- diff --git a/lib/api_form.dart b/lib/api_form.dart index 9df134c..091af6d 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -874,25 +874,86 @@ class APIFormField { // Construct a boolean input element Widget _constructBoolean() { - bool? initial_value; + String initial_value = "null"; - if (value is bool || value == null) { - initial_value = value as bool?; + bool allow_null = (getParameter("tristate") ?? false) as bool; + + if (value is bool) { + initial_value = value.toString().toLowerCase(); + } else if (value == null) { + if (allow_null) { + initial_value = "null"; + } else { + initial_value = "false"; + } } else { - String vs = value.toString().toLowerCase(); - initial_value = ["1", "true", "yes"].contains(vs); + // Not a boolean value - may be a string + if (["1", "true", "yes"].contains(value.toString().toLowerCase())) { + initial_value = "true"; + } else if ([ + "0", + "false", + "no", + ].contains(value.toString().toLowerCase())) { + initial_value = "false"; + } else if (allow_null) { + initial_value = "null"; + } else { + initial_value = "false"; + } } - return CheckBoxField( - label: label, - labelStyle: _labelStyle(), - helperText: helpText, - helperStyle: _helperStyle(), - initial: initial_value, - tristate: (getParameter("tristate") ?? false) as bool, - onSaved: (val) { - setFieldValue(val); - }, + List> buttons = []; + + if ((getParameter("tristate") ?? false) as bool) { + buttons.add( + ButtonSegment( + value: "null", + icon: Icon(TablerIcons.minus, color: COLOR_GRAY_LIGHT), + ), + ); + } + + buttons.add( + ButtonSegment( + value: "false", + icon: Icon(TablerIcons.x, color: COLOR_DANGER), + ), + ); + + buttons.add( + ButtonSegment( + value: "true", + icon: Icon(TablerIcons.check, color: COLOR_SUCCESS), + ), + ); + + return ListTile( + title: Text(label), + contentPadding: EdgeInsets.zero, + subtitle: Text(helpText), + trailing: SegmentedButton( + segments: buttons, + selected: {initial_value}, + showSelectedIcon: false, + multiSelectionEnabled: false, + style: SegmentedButton.styleFrom( + padding: EdgeInsets.all(0), + // minimumSize: MaterialStateProperty.all(Size(0, 0)), + // tapTargetSize: MaterialTapTargetSize.shrinkWrap, + visualDensity: VisualDensity.compact, + ), + onSelectionChanged: (Set selection) { + String element = selection.first; + if (element == "null" && allow_null) { + setFieldValue(null); + } else if (element == "true") { + setFieldValue(true); + } else { + setFieldValue(false); + } + }, + ), ); } @@ -1168,7 +1229,9 @@ class APIFormWidgetState extends State { // Callback for when a field value is changed // Default implementation does nothing, // but custom form implementations may override this function - void onValueChanged(String field, dynamic value) {} + void onValueChanged(String field, dynamic value) { + setState(() {}); + } Future handleSuccess( Map submittedData, diff --git a/lib/labels.dart b/lib/labels.dart index fe226be..8743a4a 100644 --- a/lib/labels.dart +++ b/lib/labels.dart @@ -45,6 +45,8 @@ class LabelFormWidgetState extends APIFormWidgetState { if (field == "plugin") { onPluginChanged(value.toString()); } + + super.onValueChanged(field, value); } @override diff --git a/lib/widget/paginator.dart b/lib/widget/paginator.dart index 6bbf355..3872593 100644 --- a/lib/widget/paginator.dart +++ b/lib/widget/paginator.dart @@ -92,9 +92,10 @@ abstract class PaginatedSearchState // Skip null values if (value == null) { - continue; + f[k] = "null"; + } else { + f[k] = value.toString(); } - f[k] = value.toString(); } return f; @@ -341,7 +342,16 @@ abstract class PaginatedSearchState Map f = await constructFilters(); if (f.isNotEmpty) { - params.addAll(f); + for (String k in f.keys) { + // Remove any existing filter keys + dynamic value = f[k]; + + if (value == null || value == "null") { + params.remove(k); + } else { + params[k] = value.toString(); + } + } } final page = await requestPage(_pageSize, pageKey, params); From a88a102a50489a93a9023175f0af91fec8b673c3 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 27 Feb 2026 18:03:06 +1100 Subject: [PATCH 05/15] Update barcode scanner (#779) --- android/app/build.gradle | 5 +++-- android/settings.gradle | 2 +- ios/.gitignore | 1 + pubspec.lock | 20 ++++++++++++++------ pubspec.yaml | 6 +++--- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index d133d64..71834ec 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -30,7 +30,8 @@ if (keystorePropertiesFile.exists()) { android { namespace "inventree.inventree_app" - compileSdkVersion 35 + ndkVersion "26.3.11579264" + compileSdkVersion 36 compileOptions { sourceCompatibility JavaVersion.VERSION_17 @@ -56,7 +57,7 @@ android { defaultConfig { applicationId "inventree.inventree_app" - minSdkVersion 21 + minSdkVersion 23 targetSdkVersion 35 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/android/settings.gradle b/android/settings.gradle index eb1096e..d8b786c 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,7 +19,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version "8.6.0" apply false - id "org.jetbrains.kotlin.android" version "1.9.25" apply false + id "org.jetbrains.kotlin.android" version "2.3.10" apply false } include ":app" \ No newline at end of file diff --git a/ios/.gitignore b/ios/.gitignore index 0ca5a97..c888ad8 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -22,6 +22,7 @@ Flutter/Generated.xcconfig Flutter/ephemeral/ Flutter/app.flx Flutter/app.zip +Flutter/ephemeral/ Flutter/flutter_assets/ Flutter/flutter_export_environment.sh ServiceDefinitions.json diff --git a/pubspec.lock b/pubspec.lock index ed42dec..9fd5914 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -637,6 +637,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + jni: + dependency: transitive + description: + name: jni + sha256: d2c361082d554d4593c3012e26f6b188f902acd291330f13d6427641a92b3da1 + url: "https://pub.dev" + source: hosted + version: "0.14.2" js: dependency: transitive description: @@ -737,10 +745,10 @@ packages: dependency: "direct main" description: name: mobile_scanner - sha256: "54005bdea7052d792d35b4fef0f84ec5ddc3a844b250ecd48dc192fb9b4ebc95" + sha256: c92c26bf2231695b6d3477c8dcf435f51e28f87b1745966b1fe4c47a286171ce url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.2.0" node_preamble: dependency: transitive description: @@ -921,18 +929,18 @@ packages: dependency: transitive description: name: sentry - sha256: "599701ca0693a74da361bc780b0752e1abc98226cf5095f6b069648116c896bb" + sha256: "605ad1f6f1ae5b72018cbe8fc20f490fa3bd53e58882e5579566776030d8c8c1" url: "https://pub.dev" source: hosted - version: "8.14.2" + version: "9.14.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "5ba2cf40646a77d113b37a07bd69f61bb3ec8a73cbabe5537b05a7c89d2656f8" + sha256: "7fd0fb80050c1f6a77ae185bda997a76d384326d6777cf5137a6c38952c4ac7d" url: "https://pub.dev" source: hosted - version: "8.14.2" + version: "9.14.0" shared_preferences: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5230671..8139024 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,19 +28,19 @@ dependencies: flutter_markdown: ^0.6.19 # Rendering markdown flutter_overlay_loader: ^2.0.0 # Overlay screen support flutter_speed_dial: ^6.2.0 # Speed dial / FAB implementation - flutter_tabler_icons: ^1.43.0 + flutter_tabler_icons: ^1.43.0 # Tabler icons http: ^1.4.0 image_picker: ^1.1.2 # Select or take photos infinite_scroll_pagination: ^4.0.0 # Let the server do all the work! intl: ^0.20.2 - mobile_scanner: ^7.0.1 # Barcode scanning support + mobile_scanner: ^7.2.0 # Barcode scanning support one_context: ^4.0.0 # Dialogs without requiring context open_filex: ^4.7.0 # Open local files package_info_plus: ^8.1.1 # App information introspection path: ^1.9.0 path_provider: ^2.1.5 # Local file storage sembast: ^3.6.0 # NoSQL data storage - sentry_flutter: 8.14.2 # Error reporting + sentry_flutter: ^9.14.0 # Error reporting url_launcher: ^6.3.1 # Open link in system browser wakelock_plus: ^1.3.2 # Prevent device from sleeping From 958067a3f96d48520f86aae28dc4036cbae19e42 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 27 Feb 2026 22:03:22 +1100 Subject: [PATCH 06/15] Bump version (#781) --- assets/release_notes.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index d69806a..cf29a28 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,4 +1,4 @@ -## 0.xx.y - Month Year +## 0.22.3 - February 2026 --- - Auto-fill location data when receiving item via barcode scan diff --git a/pubspec.yaml b/pubspec.yaml index 8139024..55d7829 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: inventree description: InvenTree stock management -version: 0.22.2+111 +version: 0.22.3+112 environment: sdk: ^3.8.1 From 5339d6acc0e99c882a0a0475eb8b1f8dfcdb6095 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 27 Feb 2026 23:03:25 +1100 Subject: [PATCH 07/15] Check server state (#782) --- lib/api.dart | 14 +++++----- lib/l10n/app_en.arb | 3 +++ lib/settings/select_server.dart | 46 +++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/lib/api.dart b/lib/api.dart index e3b7d16..8f75df3 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -410,7 +410,7 @@ class InvenTreeAPI { * 5. Request information on available plugins */ Future _connectToServer() async { - if (!await _checkServer()) { + if (!await checkServer()) { return false; } @@ -450,8 +450,8 @@ class InvenTreeAPI { * Check that the remote server is available. * Ping the api/ endpoint, which does not require user authentication */ - Future _checkServer() async { - String address = profile?.server ?? ""; + Future checkServer({String? server}) async { + String address = server ?? profile?.server ?? ""; if (address.isEmpty) { showSnackIcon( @@ -462,8 +462,10 @@ class InvenTreeAPI { return false; } - if (!address.endsWith("/")) { - address = address + "/"; + String url = _makeUrl("/api/", base: address); + + if (!url.endsWith("/")) { + url = url + "/"; } // Cache the "strictHttps" setting, so we can use it later without async requirement @@ -473,7 +475,7 @@ class InvenTreeAPI { debug("Connecting to ${apiUrl}"); - APIResponse response = await get("", expectedStatusCode: 200); + APIResponse response = await get(url, expectedStatusCode: 200); if (!response.successful()) { debug("Server returned invalid response: ${response.statusCode}"); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index cd5faad..73a37ce 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -294,6 +294,9 @@ "confirmScanDetail": "Confirm stock transfer details when scanning barcodes", "@confirmScanDetail": {}, + "connectionCheck": "Check Connection", + "@connectionCheck": {}, + "connectionRefused": "Connection Refused", "@connectionRefused": {}, diff --git a/lib/settings/select_server.dart b/lib/settings/select_server.dart index bfeae98..1d37855 100644 --- a/lib/settings/select_server.dart +++ b/lib/settings/select_server.dart @@ -298,6 +298,9 @@ class _ProfileEditState extends State { String name = ""; String server = ""; + bool? serverStatus; + bool serverChecking = false; + @override Widget build(BuildContext context) { return Scaffold( @@ -411,6 +414,49 @@ class _ProfileEditState extends State { return null; }, ), + Divider(), + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + label: Text(L10().connectionCheck), + icon: serverStatus == true + ? Icon(TablerIcons.circle_check, color: COLOR_SUCCESS) + : serverStatus == false + ? Icon(TablerIcons.circle_x, color: COLOR_DANGER) + : Icon(TablerIcons.question_mark, color: COLOR_WARNING), + onPressed: serverChecking + ? null + : () async { + if (serverChecking) { + return; + } + + if (!formKey.currentState!.validate()) { + return; + } + + if (mounted) { + setState(() { + serverStatus = null; + serverChecking = true; + }); + } + + formKey.currentState!.save(); + + InvenTreeAPI().checkServer(server: server).then(( + result, + ) { + if (mounted) { + setState(() { + serverStatus = result; + serverChecking = false; + }); + } + }); + }, + ), + ), ], ), padding: EdgeInsets.all(16), From a38ec4cf0d1bc762f092cb2170d83e3244b3a349 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 27 Feb 2026 23:26:14 +1100 Subject: [PATCH 08/15] Fix URLs (#783) * Fix URLs - Remove leading slash - Closes https://github.com/inventree/inventree-app/issues/780 * Bump release notes --- assets/release_notes.md | 6 ++++++ lib/inventree/sales_order.dart | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index cf29a28..ea93f27 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,9 @@ +## 0.22.4 - February 2026 +--- + +- Adds button to check server connection +- Fixes bug fetching sales order shipments + ## 0.22.3 - February 2026 --- diff --git a/lib/inventree/sales_order.dart b/lib/inventree/sales_order.dart index 82cc074..3b73800 100644 --- a/lib/inventree/sales_order.dart +++ b/lib/inventree/sales_order.dart @@ -270,9 +270,9 @@ class InvenTreeSalesOrderShipment extends InvenTreeModel { InvenTreeSalesOrderShipment.fromJson(json); @override - String get URL => "/order/so/shipment/"; + String get URL => "order/so/shipment"; - String get SHIP_SHIPMENT_URL => "/order/so/shipment/${pk}/ship/"; + String get SHIP_SHIPMENT_URL => "order/so/shipment/${pk}/ship/"; @override Future goToDetailPage(BuildContext context) async { @@ -345,7 +345,7 @@ class InvenTreeSalesOrderAllocation extends InvenTreeModel { InvenTreeSalesOrderAllocation.fromJson(json); @override - String get URL => "/order/so-allocation/"; + String get URL => "order/so-allocation/"; @override List get rolesRequired => ["sales_order"]; From d45ed1f8385341e6c7066dd86366e863f15e4a16 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 28 Feb 2026 15:47:01 +1100 Subject: [PATCH 09/15] [bug] Fix fetching of related field values (#789) - Fixes https://github.com/inventree/inventree-app/issues/784 --- lib/api_form.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/api_form.dart b/lib/api_form.dart index 091af6d..4b82d6b 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -275,7 +275,7 @@ class APIFormField { return; } - String url = api_url + "/" + value.toString() + "/"; + String url = api_url + value.toString() + "/"; final APIResponse response = await InvenTreeAPI().get(url, params: filters); From a90fdd432369716d8aeb62f85a07304efa8764c4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 28 Feb 2026 15:47:07 +1100 Subject: [PATCH 10/15] [bug] Fix boolean fields (#788) - Use Switch field in API forms - Retain custom tri-state filter button - Closes https://github.com/inventree/inventree-app/issues/785 --- assets/release_notes.md | 1 + lib/api_form.dart | 29 +++++++++++++++++++++++++++-- lib/widget/paginator.dart | 2 +- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index ea93f27..2300601 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -3,6 +3,7 @@ - Adds button to check server connection - Fixes bug fetching sales order shipments +- Fix for boolean fields in API forms ## 0.22.3 - February 2026 --- diff --git a/lib/api_form.dart b/lib/api_form.dart index 4b82d6b..d826898 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -293,6 +293,8 @@ class APIFormField { return _constructString(); case "boolean": return _constructBoolean(); + case "boolean filter": + return _constructBooleanFilter(); case "related field": return _constructRelatedField(); case "integer": @@ -874,6 +876,29 @@ class APIFormField { // Construct a boolean input element Widget _constructBoolean() { + bool v = false; + + if (value is bool) { + v = value as bool; + } else { + v = false; + } + + return ListTile( + title: Text(label), + subtitle: Text(helpText), + contentPadding: EdgeInsets.zero, + trailing: Switch( + value: v, + onChanged: (val) { + setFieldValue(val); + }, + ), + ); + } + + // Construct a tri-state boolean filter element + Widget _constructBooleanFilter() { String initial_value = "null"; bool allow_null = (getParameter("tristate") ?? false) as bool; @@ -930,8 +955,8 @@ class APIFormField { return ListTile( title: Text(label), - contentPadding: EdgeInsets.zero, subtitle: Text(helpText), + contentPadding: EdgeInsets.zero, trailing: SegmentedButton( segments: buttons, selected: {initial_value}, @@ -1457,7 +1482,7 @@ class APIFormWidgetState extends State { if (field.isSimple) { // Simple top-level field data - data[field.name] = field.data["value"]; + data[field.name] = field.data["value"] ?? field.defaultValue; } else { // Not so simple... (WHY DID I MAKE THE API SO COMPLEX?) if (field.parent.isNotEmpty) { diff --git a/lib/widget/paginator.dart b/lib/widget/paginator.dart index 3872593..231b03a 100644 --- a/lib/widget/paginator.dart +++ b/lib/widget/paginator.dart @@ -207,7 +207,7 @@ abstract class PaginatedSearchState } Map filter = { - "type": "boolean", + "type": "boolean filter", "display_name": label, "label": label, "help_text": help_text, From 0d687622522e84262fc060cb8a185bf4c1d4d4e2 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 1 Mar 2026 10:03:04 +1100 Subject: [PATCH 11/15] Bump version to 0.22.4 (#790) --- assets/release_notes.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index 2300601..7ab06ab 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,4 +1,4 @@ -## 0.22.4 - February 2026 +## 0.22.4 - March 2026 --- - Adds button to check server connection diff --git a/pubspec.yaml b/pubspec.yaml index 55d7829..8802eec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: inventree description: InvenTree stock management -version: 0.22.3+112 +version: 0.22.4+113 environment: sdk: ^3.8.1 From a87a7d6228a825faa6e8c6fe679d0c21b94cc335 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 3 Mar 2026 20:10:06 +1100 Subject: [PATCH 12/15] Fix default location for "cascade" filter (#793) --- assets/release_notes.md | 6 ++++++ lib/widget/part/category_list.dart | 2 +- lib/widget/stock/location_list.dart | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index 7ab06ab..581eb88 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,9 @@ +## 0.22.5 - March 2026 +--- + +- Fix default value for "cascade" filter in PartCategory list view +- Fix default value for "cascade" filter in StockLocation list view + ## 0.22.4 - March 2026 --- diff --git a/lib/widget/part/category_list.dart b/lib/widget/part/category_list.dart index b90f2f6..fb74730 100644 --- a/lib/widget/part/category_list.dart +++ b/lib/widget/part/category_list.dart @@ -54,7 +54,7 @@ class _PaginatedPartCategoryListState @override Map> get filterOptions => { "cascade": { - "default": false, + "default": true, "label": L10().includeSubcategories, "help_text": L10().includeSubcategoriesDetail, "tristate": false, diff --git a/lib/widget/stock/location_list.dart b/lib/widget/stock/location_list.dart index d59c369..a808d27 100644 --- a/lib/widget/stock/location_list.dart +++ b/lib/widget/stock/location_list.dart @@ -66,6 +66,7 @@ class _PaginatedStockLocationListState "label": L10().includeSublocations, "help_text": L10().includeSublocationsDetail, "tristate": false, + "default": true, }, }; From 7dcd35e56cafef8bf3c627c37de6f748f127d146 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 3 Mar 2026 21:04:46 +1100 Subject: [PATCH 13/15] Bump version number (#794) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 8802eec..3784cf7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: inventree description: InvenTree stock management -version: 0.22.4+113 +version: 0.22.5+114 environment: sdk: ^3.8.1 From ec9a7176a2673da48d5445fcae0deba6d00c2eb6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 9 Mar 2026 21:43:53 +1100 Subject: [PATCH 14/15] [bug] Fix for testable items (#796) - Show test results --- assets/release_notes.md | 5 +++++ lib/widget/stock/stock_detail.dart | 2 +- pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index 581eb88..f98a63e 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,8 @@ +## 0.22.6 - March 2026 +--- + +- Fix for displaying stock item test results + ## 0.22.5 - March 2026 --- diff --git a/lib/widget/stock/stock_detail.dart b/lib/widget/stock/stock_detail.dart index 282a962..ed10212 100644 --- a/lib/widget/stock/stock_detail.dart +++ b/lib/widget/stock/stock_detail.dart @@ -225,7 +225,7 @@ class _StockItemDisplayState extends RefreshableState { // Request part information part = await InvenTreePart().get(widget.item.partId) as InvenTreePart?; - stockShowTests &= part?.isTrackable ?? false; + stockShowTests &= part?.isTestable ?? false; // Request default location int? defaultLocationId = part?.defaultLocation; diff --git a/pubspec.yaml b/pubspec.yaml index 3784cf7..65a91ad 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: inventree description: InvenTree stock management -version: 0.22.5+114 +version: 0.22.6+115 environment: sdk: ^3.8.1 From 83e97c56a2f854b03f59a9acf3a24c3e202ae852 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 29 Mar 2026 15:08:19 +1100 Subject: [PATCH 15/15] Shipment fix (#802) * Fix broken URL for SalesOrderShipment * Bump version and update release notes --- assets/release_notes.md | 5 +++++ lib/inventree/sales_order.dart | 2 +- pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index f98a63e..e5e9169 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,8 @@ +## 0.22.7 - March 2026 +--- + +- Bug fix for loading sales order shipments + ## 0.22.6 - March 2026 --- diff --git a/lib/inventree/sales_order.dart b/lib/inventree/sales_order.dart index 3b73800..9e239a7 100644 --- a/lib/inventree/sales_order.dart +++ b/lib/inventree/sales_order.dart @@ -270,7 +270,7 @@ class InvenTreeSalesOrderShipment extends InvenTreeModel { InvenTreeSalesOrderShipment.fromJson(json); @override - String get URL => "order/so/shipment"; + String get URL => "order/so/shipment/"; String get SHIP_SHIPMENT_URL => "order/so/shipment/${pk}/ship/"; diff --git a/pubspec.yaml b/pubspec.yaml index 65a91ad..19dfc9c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: inventree description: InvenTree stock management -version: 0.22.6+115 +version: 0.22.7+116 environment: sdk: ^3.8.1