diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index e3962ae9..edb4d158 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -12,22 +12,31 @@
6.0
CFBundleLocalizations
- de
- el
+ cs-CZ
+ da-DK
+ de-DE
+ el-GR
en
- es
- fr
- he
- it
- ja
- ko
- nl
- no
- pl
- ru
- sv
- tr
- vi
+ es-ES
+ es-MX
+ fa-IR
+ fr-FR
+ he-IL
+ hu-HU
+ id-ID
+ it-IT
+ ja-JP
+ ko-KR
+ nl-NL
+ no-NO
+ pl-PL
+ pt-BR
+ pt-PT
+ ru-RU
+ sv-SE
+ th-TH
+ tr-TR
+ vi-VN
zh-CN
CFBundleName
@@ -69,7 +78,10 @@
LSApplicationQueriesSchemes
+ http
https
+ mailto
+ tel
CADisableMinimumFrameDurationOnPhone
diff --git a/lib/helpers.dart b/lib/helpers.dart
index 3cb905e7..404e6ea1 100644
--- a/lib/helpers.dart
+++ b/lib/helpers.dart
@@ -9,9 +9,13 @@
import "dart:io";
import "package:currency_formatter/currency_formatter.dart";
-
-import "package:audioplayers/audioplayers.dart";
import "package:one_context/one_context.dart";
+import "package:url_launcher/url_launcher.dart";
+import "package:audioplayers/audioplayers.dart";
+
+import "package:inventree/l10.dart";
+import "package:inventree/widget/snacks.dart";
+
List debug_messages = [];
@@ -80,6 +84,19 @@ Future playAudioFile(String path) async {
}
+// Open an external URL
+Future openLink(String url) async {
+
+ final link = Uri.parse(url);
+
+ try {
+ await launchUrl(link);
+ } catch (e) {
+ showSnackIcon(L10().error, success: false);
+ }
+}
+
+
/*
* Helper function for rendering a money / currency object as a String
*/
diff --git a/lib/inventree/bom.dart b/lib/inventree/bom.dart
index 55217864..ec326fef 100644
--- a/lib/inventree/bom.dart
+++ b/lib/inventree/bom.dart
@@ -1,5 +1,4 @@
-
import "package:inventree/inventree/model.dart";
import "package:inventree/inventree/part.dart";
diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart
index 33d5e477..8427b58c 100644
--- a/lib/inventree/model.dart
+++ b/lib/inventree/model.dart
@@ -2,17 +2,16 @@ import "dart:async";
import "dart:io";
import "package:font_awesome_flutter/font_awesome_flutter.dart";
-import "package:inventree/api.dart";
import "package:flutter/material.dart";
-import "package:inventree/inventree/sentry.dart";
-import "package:inventree/widget/dialogs.dart";
import "package:url_launcher/url_launcher.dart";
-
import "package:path/path.dart" as path;
+import "package:inventree/api.dart";
import "package:inventree/api_form.dart";
import "package:inventree/fa_icon_mapping.dart";
import "package:inventree/l10.dart";
+import "package:inventree/inventree/sentry.dart";
+import "package:inventree/widget/dialogs.dart";
// Paginated response object
diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart
index 762ba9d5..339382b2 100644
--- a/lib/inventree/part.dart
+++ b/lib/inventree/part.dart
@@ -1,12 +1,13 @@
import "dart:io";
+import "package:flutter/material.dart";
+
import "package:inventree/api.dart";
import "package:inventree/helpers.dart";
-import "package:inventree/inventree/stock.dart";
-import "package:inventree/inventree/company.dart";
-import "package:flutter/material.dart";
import "package:inventree/l10.dart";
+import "package:inventree/inventree/stock.dart";
+import "package:inventree/inventree/company.dart";
import "package:inventree/inventree/model.dart";
diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart
index 23f5819b..2ee14890 100644
--- a/lib/inventree/purchase_order.dart
+++ b/lib/inventree/purchase_order.dart
@@ -1,9 +1,7 @@
import "package:inventree/inventree/company.dart";
import "package:inventree/inventree/part.dart";
-
import "package:inventree/inventree/model.dart";
-// TODO: In the future, status codes should be retrieved from the server
const int PO_STATUS_PENDING = 10;
const int PO_STATUS_PLACED = 20;
const int PO_STATUS_COMPLETE = 30;
diff --git a/lib/inventree/sentry.dart b/lib/inventree/sentry.dart
index de247338..d8becd8c 100644
--- a/lib/inventree/sentry.dart
+++ b/lib/inventree/sentry.dart
@@ -1,11 +1,11 @@
import "dart:io";
import "package:device_info_plus/device_info_plus.dart";
-import "package:inventree/preferences.dart";
import "package:package_info_plus/package_info_plus.dart";
import "package:sentry_flutter/sentry_flutter.dart";
import "package:inventree/api.dart";
+import "package:inventree/preferences.dart";
Future