From a90fdd432369716d8aeb62f85a07304efa8764c4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 28 Feb 2026 15:47:07 +1100 Subject: [PATCH] [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 ea93f27f..23006019 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 4b82d6bb..d8268989 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 38725931..231b03a2 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,