diff --git a/lib/api.dart b/lib/api.dart index fc900c1d..a799235b 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -22,6 +22,8 @@ import "package:inventree/user_profile.dart"; import "package:inventree/widget/snacks.dart"; import "package:path_provider/path_provider.dart"; +import 'api_form.dart'; + /* * Class representing an API response from the server @@ -1200,4 +1202,80 @@ class InvenTreeAPI { } } + /** + * Send a request to the server to locate / identify either a StockItem or StockLocation + */ + Future locateItemOrLocation(BuildContext context, {int? item, int? location}) async { + + var plugins = getPlugins(mixin: "locate"); + + print("locateItemOrLocation"); + + if (plugins.isEmpty) { + // TODO: Error message + return; + } + + String plugin_name = ""; + + if (plugins.length == 1) { + plugin_name = plugins.first.key; + } else { + // User selects which plugin to use + List> plugin_options = []; + + for (var plugin in plugins) { + plugin_options.add({ + "display_name": plugin.humanName, + "value": plugin.key, + }); + } + + Map fields = { + "plugin": { + "label": L10().plugin, + "type": "choice", + "value": plugins.first.key, + "choices": plugin_options, + "required": true, + } + }; + + await launchApiForm( + context, + L10().locateLocation, + "", + fields, + icon: FontAwesomeIcons.searchLocation, + onSuccess: (Map data) async { + plugin_name = (data["plugin"] ?? "") as String; + } + ); + } + + Map body = { + "plugin": plugin_name, + }; + + if (item != null) { + body["item"] = item.toString(); + } + + if (location != null) { + body["location"] = location.toString(); + } + + post( + "/api/locate/", + body: body, + expectedStatusCode: 200, + ).then((APIResponse response) { + if (response.successful()) { + showSnackIcon( + L10().requestSuccessful, + success: true, + ); + } + }); + } } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7640b154..02cb93b5 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -707,6 +707,9 @@ "request": "Request", "@request": {}, + "requestSuccessful": "Request successful", + "@requestSuccessful": {}, + "requestingData": "Requesting Data", "@requestingData": {}, diff --git a/lib/widget/location_display.dart b/lib/widget/location_display.dart index 17ca0103..4b38bf4a 100644 --- a/lib/widget/location_display.dart +++ b/lib/widget/location_display.dart @@ -92,69 +92,21 @@ class _LocationDisplayState extends RefreshableState { return actions; } + /* + * Request identification of this location + */ Future _locateStockLocation(BuildContext context) async { final _loc = location; if (_loc != null) { - - final plugins = InvenTreeAPI().getPlugins(mixin: "locate"); - - if (plugins.isEmpty) { - // TODO: Error message here - return; - } - - String plugin_name = ""; - - if (plugins.length == 1) { - plugin_name = plugins.first.key; - } else { - // User selects which plugin to use - List> plugin_options = []; - - for (var plugin in plugins) { - plugin_options.add({ - "display_name": plugin.humanName, - "value": plugin.key, - }); - } - - Map fields = { - "plugin": { - "label": L10().plugin, - "type": "choice", - "value": plugins.first.key, - "choices": plugin_options, - "required": true, - } - }; - - await launchApiForm( - context, - L10().locateLocation, - "", - fields, - icon: FontAwesomeIcons.searchLocation, - onSuccess: (Map data) async { - plugin_name = (data["plugin"] ?? "") as String; - } - ); - } - - print("plugin: ${plugin_name}"); - - InvenTreeAPI().post( - "/api/locate/", - body: { - "plugin": plugin_name, - "location": "${_loc.pk}", - }, - expectedStatusCode: 200, - ); + InvenTreeAPI().locateItemOrLocation(context, location: _loc.pk); } } + /* + * Launch a dialog form to edit this stock location + */ void _editLocationDialog(BuildContext context) { final _loc = location;