diff --git a/assets/release_notes.md b/assets/release_notes.md index 39384b79..5db870c0 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -4,6 +4,7 @@ - Add support for Project Codes - Improve purchase order support - Fix action button colors +- Improvements for stock item test result display - Added Norwegian translations - Fix serial number field when creating stock item diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index 4a026172..da797783 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -11,6 +11,9 @@ import "package:inventree/inventree/model.dart"; +/* + * Class representing a test result for a single stock item + */ class InvenTreeStockItemTestResult extends InvenTreeModel { InvenTreeStockItemTestResult() : super(); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 89edcc9a..dcb9c02c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1208,6 +1208,9 @@ "description": "" }, + "testResultsDetail": "Display stock item test results", + "@testResultsDetail": {}, + "testResultAdd": "Add Test Result", "@testResultAdd": {}, diff --git a/lib/preferences.dart b/lib/preferences.dart index d4273925..fc08450b 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -24,6 +24,7 @@ const String INV_PART_SHOW_BOM = "partShowBom"; // Stock settings const String INV_STOCK_SHOW_HISTORY = "stockShowHistory"; +const String INV_STOCK_SHOW_TESTS = "stockShowTests"; const String INV_REPORT_ERRORS = "reportErrors"; const String INV_STRICT_HTTPS = "strictHttps"; diff --git a/lib/settings/part_settings.dart b/lib/settings/part_settings.dart index 50d3f0df..79b0929f 100644 --- a/lib/settings/part_settings.dart +++ b/lib/settings/part_settings.dart @@ -18,6 +18,7 @@ class _InvenTreePartSettingsState extends State { bool partShowParameters = true; bool partShowBom = true; bool stockShowHistory = false; + bool stockShowTests = false; @override void initState() { @@ -30,6 +31,7 @@ class _InvenTreePartSettingsState extends State { partShowParameters = await InvenTreeSettingsManager().getValue(INV_PART_SHOW_PARAMETERS, true) as bool; partShowBom = await InvenTreeSettingsManager().getValue(INV_PART_SHOW_BOM, true) as bool; stockShowHistory = await InvenTreeSettingsManager().getValue(INV_STOCK_SHOW_HISTORY, false) as bool; + stockShowTests = await InvenTreeSettingsManager().getValue(INV_STOCK_SHOW_TESTS, true) as bool; if (mounted) { setState(() { @@ -86,6 +88,20 @@ class _InvenTreePartSettingsState extends State { }, ), ), + ListTile( + title: Text(L10().testResults), + subtitle: Text(L10().testResultsDetail), + leading: FaIcon(FontAwesomeIcons.vial), + trailing: Switch( + value: stockShowTests, + onChanged: (bool value) { + InvenTreeSettingsManager().setValue(INV_STOCK_SHOW_TESTS, value); + setState(() { + stockShowTests = value; + }); + }, + ), + ) ] ) ) diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index 7dc3c11c..cb656799 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -47,6 +47,7 @@ class _StockItemDisplayState extends RefreshableState { String getAppBarTitle() => L10().stockItem; bool stockShowHistory = false; + bool stockShowTests = true; @override List appBarActions(BuildContext context) { @@ -214,6 +215,7 @@ class _StockItemDisplayState extends RefreshableState { await api.StockStatus.load(); stockShowHistory = await InvenTreeSettingsManager().getValue(INV_STOCK_SHOW_HISTORY, false) as bool; + stockShowTests = await InvenTreeSettingsManager().getValue(INV_STOCK_SHOW_TESTS, true) as bool; final bool result = widget.item.pk > 0 && await widget.item.reload(); @@ -226,15 +228,19 @@ class _StockItemDisplayState extends RefreshableState { // Request part information part = await InvenTreePart().get(widget.item.partId) as InvenTreePart?; - // Request test results (async) - widget.item.getTestResults().then((value) { + stockShowTests &= part?.isTrackable ?? false; - if (mounted) { - setState(() { - // Update - }); - } - }); + // Request test results (async) + if (stockShowTests) { + widget.item.getTestResults().then((value) { + + if (mounted) { + setState(() { + // Update + }); + } + }); + } // Request the number of attachments InvenTreeStockItemAttachment().count( @@ -753,7 +759,7 @@ class _StockItemDisplayState extends RefreshableState { ); } - if ((widget.item.testResultCount > 0) || (part?.isTrackable ?? false)) { + if (stockShowTests || (widget.item.testResultCount > 0)) { tiles.add( ListTile( title: Text(L10().testResults), diff --git a/lib/widget/stock_item_test_results.dart b/lib/widget/stock_item_test_results.dart index b89a01b6..b6315d91 100644 --- a/lib/widget/stock_item_test_results.dart +++ b/lib/widget/stock_item_test_results.dart @@ -1,15 +1,17 @@ +import "package:flutter/material.dart"; +import "package:flutter_speed_dial/flutter_speed_dial.dart"; +import "package:font_awesome_flutter/font_awesome_flutter.dart"; + +import "package:inventree/api.dart"; import "package:inventree/app_colors.dart"; +import "package:inventree/l10.dart"; + import "package:inventree/inventree/part.dart"; import "package:inventree/inventree/stock.dart"; import "package:inventree/inventree/model.dart"; -import "package:inventree/api.dart"; + import "package:inventree/widget/progress.dart"; - -import "package:inventree/l10.dart"; - -import "package:flutter/material.dart"; import "package:inventree/widget/refreshable_state.dart"; -import "package:font_awesome_flutter/font_awesome_flutter.dart"; class StockItemTestResultsWidget extends StatefulWidget { @@ -31,15 +33,25 @@ class _StockItemTestResultDisplayState extends RefreshableState L10().testResults; @override - List appBarActions(BuildContext context) { - return [ - IconButton( - icon: FaIcon(FontAwesomeIcons.circlePlus), - onPressed: () { - addTestResult(context); + List appBarActions(BuildContext context) => []; + + @override + List actionButtons(BuildContext context) { + List actions = []; + + if (InvenTreeStockItemTestResult().canCreate) { + actions.add( + SpeedDialChild( + child: FaIcon(FontAwesomeIcons.circlePlus), + label: L10().testResultAdd, + onTap: () { + addTestResult(context); } - ), - ]; + ) + ); + } + + return actions; } @override @@ -153,6 +165,7 @@ class _StockItemTestResultDisplayState extends RefreshableState