2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-04-28 05:26:47 +00:00

Refactor barcode scann function

- Provide a custom callback to be executed when the barcode is scanned
This commit is contained in:
Oliver 2021-10-03 12:04:01 +11:00
parent f75aa4ca0e
commit 4f8794e652
4 changed files with 67 additions and 105 deletions

View File

@ -335,6 +335,13 @@ class APIFormField {
var handler = UniqueBarcodeHandler((String hash) { var handler = UniqueBarcodeHandler((String hash) {
controller.text = hash; controller.text = hash;
data["value"] = hash; data["value"] = hash;
successTone();
showSnackIcon(
L10().barcodeAssigned,
success: true
);
}); });
Navigator.push( Navigator.push(

View File

@ -1,10 +1,8 @@
import "dart:io"; import "dart:io";
import "package:inventree/app_settings.dart";
import "package:inventree/inventree/sentry.dart"; import "package:inventree/inventree/sentry.dart";
import "package:inventree/widget/dialogs.dart"; import "package:inventree/widget/dialogs.dart";
import "package:inventree/widget/snacks.dart"; import "package:inventree/widget/snacks.dart";
import "package:audioplayers/audioplayers.dart";
import "package:flutter/cupertino.dart"; import "package:flutter/cupertino.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:font_awesome_flutter/font_awesome_flutter.dart"; import "package:font_awesome_flutter/font_awesome_flutter.dart";
@ -15,7 +13,7 @@ import "package:qr_code_scanner/qr_code_scanner.dart";
import "package:inventree/inventree/stock.dart"; import "package:inventree/inventree/stock.dart";
import "package:inventree/inventree/part.dart"; import "package:inventree/inventree/part.dart";
import "package:inventree/l10.dart"; import "package:inventree/l10.dart";
import "package:inventree/helpers.dart";
import "package:inventree/api.dart"; import "package:inventree/api.dart";
import "package:inventree/widget/location_display.dart"; import "package:inventree/widget/location_display.dart";
@ -38,26 +36,6 @@ class BarcodeHandler {
QRViewController? _controller; QRViewController? _controller;
Future<void> successTone() async {
final bool en = await InvenTreeSettingsManager().getValue("barcodeSounds", true) as bool;
if (en) {
final player = AudioCache();
player.play("sounds/barcode_scan.mp3");
}
}
Future <void> failureTone() async {
final bool en = await InvenTreeSettingsManager().getValue("barcodeSounds", true) as bool;
if (en) {
final player = AudioCache();
player.play("sounds/barcode_error.mp3");
}
}
Future<void> onBarcodeMatched(BuildContext context, Map<String, dynamic> data) async { Future<void> onBarcodeMatched(BuildContext context, Map<String, dynamic> data) async {
// Called when the server "matches" a barcode // Called when the server "matches" a barcode
// Override this function // Override this function
@ -260,75 +238,6 @@ class BarcodeScanHandler extends BarcodeHandler {
} }
} }
class StockItemBarcodeAssignmentHandler extends BarcodeHandler {
/*
* Barcode handler for assigning a new barcode to a stock item
*/
StockItemBarcodeAssignmentHandler(this.item);
final InvenTreeStockItem item;
@override
String getOverlayText(BuildContext context) => L10().barcodeScanAssign;
@override
Future<void> onBarcodeMatched(BuildContext context, Map<String, dynamic> data) async {
failureTone();
// If the barcode is known, we can"t assign it to the stock item!
showSnackIcon(
L10().barcodeInUse,
icon: FontAwesomeIcons.qrcode,
success: false
);
}
@override
Future<void> onBarcodeUnknown(BuildContext context, Map<String, dynamic> data) async {
// If the barcode is unknown, we *can* assign it to the stock item!
if (!data.containsKey("hash")) {
showServerError(
L10().missingData,
L10().barcodeMissingHash,
);
} else {
String hash = (data["hash"] ?? "") as String;
if (hash.isNotEmpty) {
item.update(
values: {
"uid": hash,
}
).then((result) {
if (result) {
successTone();
Navigator.of(context).pop();
showSnackIcon(
L10().barcodeAssigned,
success: true,
icon: FontAwesomeIcons.qrcode
);
} else {
failureTone();
showSnackIcon(
L10().barcodeNotAssigned,
success: false,
icon: FontAwesomeIcons.qrcode
);
}
});
}
}
}
}
class StockItemScanIntoLocationHandler extends BarcodeHandler { class StockItemScanIntoLocationHandler extends BarcodeHandler {
/* /*
* Barcode handler for scanning a provided StockItem into a scanned StockLocation * Barcode handler for scanning a provided StockItem into a scanned StockLocation
@ -469,13 +378,21 @@ class UniqueBarcodeHandler extends BarcodeHandler {
* Barcode handler for finding a "unique" barcode (one that does not match an item in the database) * Barcode handler for finding a "unique" barcode (one that does not match an item in the database)
*/ */
UniqueBarcodeHandler(this.callback); UniqueBarcodeHandler(this.callback, {this.overlayText = ""});
// Callback function when a "unique" barcode hash is found // Callback function when a "unique" barcode hash is found
final Function(String) callback; final Function(String) callback;
final String overlayText;
@override @override
String getOverlayText(BuildContext context) => L10().barcodeScanAssign; String getOverlayText(BuildContext context) {
if (overlayText.isEmpty) {
return L10().barcodeScanAssign;
} else {
return overlayText;
}
}
@override @override
Future<void> onBarcodeMatched(BuildContext context, Map<String, dynamic> data) async { Future<void> onBarcodeMatched(BuildContext context, Map<String, dynamic> data) async {
@ -516,11 +433,6 @@ class UniqueBarcodeHandler extends BarcodeHandler {
// Close the barcode scanner // Close the barcode scanner
Navigator.of(context).pop(); Navigator.of(context).pop();
showSnackIcon(
L10().barcodeAssigned,
success: true
);
callback(hash); callback(hash);
} }
} }

View File

@ -6,8 +6,32 @@
* Simplify a numerical value into a string, * Simplify a numerical value into a string,
* supressing trailing zeroes * supressing trailing zeroes
*/ */
import "package:audioplayers/audioplayers.dart";
import "package:inventree/app_settings.dart";
String simpleNumberString(double number) { String simpleNumberString(double number) {
// Ref: https://stackoverflow.com/questions/55152175/how-to-remove-trailing-zeros-using-dart // Ref: https://stackoverflow.com/questions/55152175/how-to-remove-trailing-zeros-using-dart
return number.toStringAsFixed(number.truncateToDouble() == number ? 0 : 1); return number.toStringAsFixed(number.truncateToDouble() == number ? 0 : 1);
}
Future<void> successTone() async {
final bool en = await InvenTreeSettingsManager().getValue("barcodeSounds", true) as bool;
if (en) {
final player = AudioCache();
player.play("sounds/barcode_scan.mp3");
}
}
Future <void> failureTone() async {
final bool en = await InvenTreeSettingsManager().getValue("barcodeSounds", true) as bool;
if (en) {
final player = AudioCache();
player.play("sounds/barcode_error.mp3");
}
} }

View File

@ -16,7 +16,7 @@ import "package:flutter/cupertino.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:inventree/l10.dart"; import "package:inventree/l10.dart";
import "package:inventree/helpers.dart";
import "package:inventree/api.dart"; import "package:inventree/api.dart";
import "package:dropdown_search/dropdown_search.dart"; import "package:dropdown_search/dropdown_search.dart";
@ -676,12 +676,31 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
leading: FaIcon(FontAwesomeIcons.barcode, color: COLOR_CLICK), leading: FaIcon(FontAwesomeIcons.barcode, color: COLOR_CLICK),
trailing: FaIcon(FontAwesomeIcons.qrcode), trailing: FaIcon(FontAwesomeIcons.qrcode),
onTap: () { onTap: () {
Navigator.push(
context, var handler = UniqueBarcodeHandler((String hash) {
MaterialPageRoute(builder: (context) => InvenTreeQRView(StockItemBarcodeAssignmentHandler(item))) item.update(
).then((context) { values: {
refresh(); "uid": hash,
}
).then((result) {
if (result) {
successTone();
showSnackIcon(
L10().barcodeAssigned,
success: true,
icon: FontAwesomeIcons.qrcode
);
refresh();
}
});
}); });
Navigator.push(
context,
MaterialPageRoute(builder: (context) => InvenTreeQRView(handler))
);
} }
) )
); );