diff --git a/lib/app_settings.dart b/lib/app_settings.dart index 8a705293..88145bd2 100644 --- a/lib/app_settings.dart +++ b/lib/app_settings.dart @@ -19,6 +19,7 @@ const String INV_PART_SUBCATEGORY = "partSubcategory"; const String INV_STOCK_SUBLOCATION = "stockSublocation"; +const String INV_REPORT_ERRORS = "reportErrors"; class InvenTreeSettingsManager { diff --git a/lib/inventree/sentry.dart b/lib/inventree/sentry.dart index 46a412a7..34e12840 100644 --- a/lib/inventree/sentry.dart +++ b/lib/inventree/sentry.dart @@ -1,6 +1,7 @@ import "dart:io"; import "package:device_info_plus/device_info_plus.dart"; +import "package:inventree/app_settings.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:sentry_flutter/sentry_flutter.dart"; @@ -94,6 +95,13 @@ Future sentryReportMessage(String message, {Map? context}) return true; } + final upload = await InvenTreeSettingsManager().getValue(INV_REPORT_ERRORS, true) as bool; + + if (!upload) { + print("----- Error reporting disabled -----"); + return true; + } + Sentry.configureScope((scope) { scope.setExtra("server", server_info); scope.setExtra("app", app_info); @@ -129,6 +137,13 @@ Future sentryReportError(dynamic error, dynamic stackTrace) async { return; } + final upload = await InvenTreeSettingsManager().getValue(INV_REPORT_ERRORS, true) as bool; + + if (!upload) { + print("----- Error reporting disabled -----"); + return; + } + final server_info = getServerInfo(); final app_info = await getAppInfo(); final device_info = await getDeviceInfo(); diff --git a/lib/l10n b/lib/l10n index e49ca861..1ba291fe 160000 --- a/lib/l10n +++ b/lib/l10n @@ -1 +1 @@ -Subproject commit e49ca8618d79e734c054beaa289798c968fa6a5c +Subproject commit 1ba291fe1f5c7109a4817bb6cd5caac26c0a9d82 diff --git a/lib/settings/about.dart b/lib/settings/about.dart index cde55bf5..4a4036d8 100644 --- a/lib/settings/about.dart +++ b/lib/settings/about.dart @@ -9,6 +9,7 @@ import "package:font_awesome_flutter/font_awesome_flutter.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:inventree/l10.dart"; +import "package:url_launcher/url_launcher.dart"; class InvenTreeAboutWidget extends StatelessWidget { @@ -37,6 +38,32 @@ class InvenTreeAboutWidget extends StatelessWidget { ); } + Future _openDocs() async { + + const String docsUrl = "https://inventree.readthedocs.io/en/latest/app/app/"; + + if (await canLaunch(docsUrl)) { + await launch(docsUrl); + } + } + + Future _reportBug(BuildContext context) async { + + const String url = "https://github.com/inventree/InvenTree/issues/new?assignees=&labels=app%2C+bug&title=%5BApp%5D+Enter+bug+description"; + + if (await canLaunch(url)) { + await launch(url); + } + } + + Future _translate() async { + const String url = "https://crowdin.com/project/inventree"; + + if (await canLaunch(url)) { + await launch(url); + } + } + @override Widget build(BuildContext context) { @@ -135,6 +162,39 @@ class InvenTreeAboutWidget extends StatelessWidget { ) ); + tiles.add( + ListTile( + title: Text(L10().documentation), + subtitle: Text("https://inventree.readthedocs.io"), + leading: FaIcon(FontAwesomeIcons.book, color: COLOR_CLICK), + onTap: () { + _openDocs(); + }, + ) + ); + + tiles.add( + ListTile( + title: Text(L10().translate), + subtitle: Text(L10().translateHelp), + leading: FaIcon(FontAwesomeIcons.language, color: COLOR_CLICK), + onTap: () { + _translate(); + } + ) + ); + + tiles.add( + ListTile( + title: Text(L10().reportBug), + subtitle: Text(L10().reportBugDescription), + leading: FaIcon(FontAwesomeIcons.bug, color: COLOR_CLICK), + onTap: () { + _reportBug(context); + }, + ) + ); + return Scaffold( appBar: AppBar( title: Text(L10().appAbout), diff --git a/lib/settings/app_settings.dart b/lib/settings/app_settings.dart index 6a120bb4..2431b630 100644 --- a/lib/settings/app_settings.dart +++ b/lib/settings/app_settings.dart @@ -19,13 +19,6 @@ class _InvenTreeAppSettingsState extends State { final GlobalKey<_InvenTreeAppSettingsState> _settingsKey = GlobalKey<_InvenTreeAppSettingsState>(); - // Home screen settings - bool homeShowSubscribed = true; - bool homeShowPo = true; - bool homeShowSuppliers = true; - bool homeShowManufacturers = true; - bool homeShowCustomers = true; - // Sound settings bool barcodeSounds = true; bool serverSounds = true; @@ -36,6 +29,8 @@ class _InvenTreeAppSettingsState extends State { // Stock settings bool stockSublocation = false; + bool reportErrors = true; + @override void initState() { super.initState(); @@ -47,12 +42,6 @@ class _InvenTreeAppSettingsState extends State { // Load initial settings - homeShowSubscribed = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_SUBSCRIBED, true) as bool; - homeShowPo = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_PO, true) as bool; - homeShowManufacturers = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_MANUFACTURERS, true) as bool; - homeShowCustomers = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_CUSTOMERS, true) as bool; - homeShowSuppliers = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_SUPPLIERS, true) as bool; - barcodeSounds = await InvenTreeSettingsManager().getValue(INV_SOUNDS_BARCODE, true) as bool; serverSounds = await InvenTreeSettingsManager().getValue(INV_SOUNDS_SERVER, true) as bool; @@ -60,6 +49,8 @@ class _InvenTreeAppSettingsState extends State { stockSublocation = await InvenTreeSettingsManager().getValue(INV_STOCK_SUBLOCATION, true) as bool; + reportErrors = await InvenTreeSettingsManager().getValue(INV_REPORT_ERRORS, true) as bool; + setState(() { }); } @@ -75,90 +66,12 @@ class _InvenTreeAppSettingsState extends State { body: Container( child: ListView( children: [ - /* Home Screen Settings */ - ListTile( - title: Text( - L10().homeScreen, - style: TextStyle(fontWeight: FontWeight.bold) - ), - ), - ListTile( - title: Text(L10().homeShowSubscribed), - subtitle: Text(L10().homeShowSubscribedDescription), - leading: FaIcon(FontAwesomeIcons.bell), - trailing: Switch( - value: homeShowSubscribed, - onChanged: (bool value) { - InvenTreeSettingsManager().setValue(INV_HOME_SHOW_SUBSCRIBED, value); - setState(() { - homeShowSubscribed = value; - }); - }, - ) - ), - ListTile( - title: Text(L10().homeShowPo), - subtitle: Text(L10().homeShowPoDescription), - leading: FaIcon(FontAwesomeIcons.shoppingCart), - trailing: Switch( - value: homeShowPo, - onChanged: (bool value) { - InvenTreeSettingsManager().setValue(INV_HOME_SHOW_PO, value); - setState(() { - homeShowPo = value; - }); - }, - ), - ), - ListTile( - title: Text(L10().homeShowSuppliers), - subtitle: Text(L10().homeShowSuppliersDescription), - leading: FaIcon(FontAwesomeIcons.building), - trailing: Switch( - value: homeShowSuppliers, - onChanged: (bool value) { - InvenTreeSettingsManager().setValue(INV_HOME_SHOW_SUPPLIERS, value); - setState(() { - homeShowSuppliers = value; - }); - }, - ), - ), - ListTile( - title: Text(L10().homeShowManufacturers), - subtitle: Text(L10().homeShowManufacturersDescription), - leading: FaIcon(FontAwesomeIcons.industry), - trailing: Switch( - value: homeShowManufacturers, - onChanged: (bool value) { - InvenTreeSettingsManager().setValue(INV_HOME_SHOW_MANUFACTURERS, value); - setState(() { - homeShowManufacturers = value; - }); - }, - ), - ), - ListTile( - title: Text(L10().homeShowCustomers), - subtitle: Text(L10().homeShowCustomersDescription), - leading: FaIcon(FontAwesomeIcons.userTie), - trailing: Switch( - value: homeShowCustomers, - onChanged: (bool value) { - InvenTreeSettingsManager().setValue(INV_HOME_SHOW_CUSTOMERS, value); - setState(() { - homeShowCustomers = value; - }); - }, - ), - ), - /* Part Settings */ - Divider(height: 3), ListTile( title: Text( L10().parts, style: TextStyle(fontWeight: FontWeight.bold), ), + leading: FaIcon(FontAwesomeIcons.shapes), ), ListTile( title: Text(L10().includeSubcategories), @@ -180,6 +93,7 @@ class _InvenTreeAppSettingsState extends State { title: Text(L10().stock, style: TextStyle(fontWeight: FontWeight.bold), ), + leading: FaIcon(FontAwesomeIcons.boxes), ), ListTile( title: Text(L10().includeSublocations), @@ -233,6 +147,27 @@ class _InvenTreeAppSettingsState extends State { ), ), Divider(height: 1), + ListTile( + title: Text( + L10().errorReporting, + style: TextStyle(fontWeight: FontWeight.bold), + ), + leading: FaIcon(FontAwesomeIcons.bug), + ), + ListTile( + title: Text(L10().errorReportUpload), + subtitle: Text(L10().errorReportUploadDetails), + leading: FaIcon(FontAwesomeIcons.cloudUploadAlt), + trailing: Switch( + value: reportErrors, + onChanged: (bool value) { + InvenTreeSettingsManager().setValue(INV_REPORT_ERRORS, value); + setState(() { + reportErrors = value; + }); + }, + ), + ), ] ) ) diff --git a/lib/settings/home_settings.dart b/lib/settings/home_settings.dart new file mode 100644 index 00000000..42bbb10d --- /dev/null +++ b/lib/settings/home_settings.dart @@ -0,0 +1,136 @@ + +import "package:flutter/material.dart"; +import "package:flutter/cupertino.dart"; + +import "package:inventree/l10.dart"; + +import "package:font_awesome_flutter/font_awesome_flutter.dart"; + +import "package:inventree/app_settings.dart"; + +class HomeScreenSettingsWidget extends StatefulWidget { + @override + _HomeScreenSettingsState createState() => _HomeScreenSettingsState(); +} + +class _HomeScreenSettingsState extends State { + + _HomeScreenSettingsState(); + + final GlobalKey<_HomeScreenSettingsState> _settingsKey = GlobalKey<_HomeScreenSettingsState>(); + + // Home screen settings + bool homeShowSubscribed = true; + bool homeShowPo = true; + bool homeShowSuppliers = true; + bool homeShowManufacturers = true; + bool homeShowCustomers = true; + + @override + void initState() { + super.initState(); + + loadSettings(); + } + + Future loadSettings() async { + + // Load initial settings + + homeShowSubscribed = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_SUBSCRIBED, true) as bool; + homeShowPo = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_PO, true) as bool; + homeShowManufacturers = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_MANUFACTURERS, true) as bool; + homeShowCustomers = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_CUSTOMERS, true) as bool; + homeShowSuppliers = await InvenTreeSettingsManager().getValue(INV_HOME_SHOW_SUPPLIERS, true) as bool; + + setState(() { + }); + } + + @override + Widget build(BuildContext context) { + + return Scaffold( + key: _settingsKey, + appBar: AppBar( + title: Text(L10().homeScreen), + ), + body: Container( + child: ListView( + children: [ + ListTile( + title: Text(L10().homeShowSubscribed), + subtitle: Text(L10().homeShowSubscribedDescription), + leading: FaIcon(FontAwesomeIcons.bell), + trailing: Switch( + value: homeShowSubscribed, + onChanged: (bool value) { + InvenTreeSettingsManager().setValue(INV_HOME_SHOW_SUBSCRIBED, value); + setState(() { + homeShowSubscribed = value; + }); + }, + ) + ), + ListTile( + title: Text(L10().homeShowPo), + subtitle: Text(L10().homeShowPoDescription), + leading: FaIcon(FontAwesomeIcons.shoppingCart), + trailing: Switch( + value: homeShowPo, + onChanged: (bool value) { + InvenTreeSettingsManager().setValue(INV_HOME_SHOW_PO, value); + setState(() { + homeShowPo = value; + }); + }, + ), + ), + ListTile( + title: Text(L10().homeShowSuppliers), + subtitle: Text(L10().homeShowSuppliersDescription), + leading: FaIcon(FontAwesomeIcons.building), + trailing: Switch( + value: homeShowSuppliers, + onChanged: (bool value) { + InvenTreeSettingsManager().setValue(INV_HOME_SHOW_SUPPLIERS, value); + setState(() { + homeShowSuppliers = value; + }); + }, + ), + ), + ListTile( + title: Text(L10().homeShowManufacturers), + subtitle: Text(L10().homeShowManufacturersDescription), + leading: FaIcon(FontAwesomeIcons.industry), + trailing: Switch( + value: homeShowManufacturers, + onChanged: (bool value) { + InvenTreeSettingsManager().setValue(INV_HOME_SHOW_MANUFACTURERS, value); + setState(() { + homeShowManufacturers = value; + }); + }, + ), + ), + ListTile( + title: Text(L10().homeShowCustomers), + subtitle: Text(L10().homeShowCustomersDescription), + leading: FaIcon(FontAwesomeIcons.userTie), + trailing: Switch( + value: homeShowCustomers, + onChanged: (bool value) { + InvenTreeSettingsManager().setValue(INV_HOME_SHOW_CUSTOMERS, value); + setState(() { + homeShowCustomers = value; + }); + }, + ), + ), + ] + ) + ) + ); + } +} \ No newline at end of file diff --git a/lib/settings/settings.dart b/lib/settings/settings.dart index 81581ebd..b1b07ae8 100644 --- a/lib/settings/settings.dart +++ b/lib/settings/settings.dart @@ -1,15 +1,12 @@ import "package:inventree/app_colors.dart"; -import "package:inventree/settings/about.dart"; import "package:inventree/settings/app_settings.dart"; +import "package:inventree/settings/home_settings.dart"; import "package:inventree/settings/login.dart"; import "package:flutter/material.dart"; import "package:font_awesome_flutter/font_awesome_flutter.dart"; import "package:inventree/l10.dart"; -import "package:url_launcher/url_launcher.dart"; - -import "package:package_info_plus/package_info_plus.dart"; class InvenTreeSettingsWidget extends StatefulWidget { // InvenTree settings view @@ -24,8 +21,6 @@ class _InvenTreeSettingsState extends State { final _scaffoldKey = GlobalKey(); - final String docsUrl = "https://inventree.readthedocs.io/en/latest/app/app/"; - @override Widget build(BuildContext context) { return Scaffold( @@ -44,46 +39,18 @@ class _InvenTreeSettingsState extends State { leading: FaIcon(FontAwesomeIcons.server, color: COLOR_CLICK), onTap: _editServerSettings, ), + ListTile( + title: Text(L10().homeScreen), + subtitle: Text(L10().homeScreenSettings), + leading: FaIcon(FontAwesomeIcons.home, color: COLOR_CLICK), + onTap: _editHomeScreenSettings, + ), ListTile( title: Text(L10().appSettings), subtitle: Text(L10().appSettingsDetails), leading: FaIcon(FontAwesomeIcons.cogs, color: COLOR_CLICK), onTap: _editAppSettings, ), - ListTile( - title: Text(L10().about), - subtitle: Text(L10().appDetails), - leading: FaIcon(FontAwesomeIcons.infoCircle, color: COLOR_CLICK), - onTap: _about, - ), - - ListTile( - title: Text(L10().documentation), - subtitle: Text("https://inventree.readthedocs.io"), - leading: FaIcon(FontAwesomeIcons.book, color: COLOR_CLICK), - onTap: () { - _openDocs(); - }, - ), - - ListTile( - title: Text(L10().translate), - subtitle: Text(L10().translateHelp), - leading: FaIcon(FontAwesomeIcons.language, color: COLOR_CLICK), - onTap: () { - _translate(); - } - ), - - ListTile( - title: Text(L10().reportBug), - subtitle: Text(L10().reportBugDescription), - leading: FaIcon(FontAwesomeIcons.bug, color: COLOR_CLICK), - onTap: () { - _reportBug(context); - }, - ), - ] ).toList() ) @@ -91,45 +58,17 @@ class _InvenTreeSettingsState extends State { ); } - - Future _openDocs() async { - if (await canLaunch(docsUrl)) { - await launch(docsUrl); - } - } - - Future _translate() async { - const String url = "https://crowdin.com/project/inventree"; - - if (await canLaunch(url)) { - await launch(url); - } - } - Future _editServerSettings() async { Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeLoginSettingsWidget())); } + Future _editHomeScreenSettings() async { + Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreenSettingsWidget())); + } + Future _editAppSettings() async { Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeAppSettingsWidget())); } - Future _about() async { - - PackageInfo.fromPlatform().then((PackageInfo info) { - Navigator.push(context, - MaterialPageRoute(builder: (context) => InvenTreeAboutWidget(info))); - }); - } - - Future _reportBug(BuildContext context) async { - - const String url = "https://github.com/inventree/InvenTree/issues/new?assignees=&labels=app%2C+bug&title=%5BApp%5D+Enter+bug+description"; - - if (await canLaunch(url)) { - await launch(url); - } - } - } \ No newline at end of file diff --git a/lib/widget/drawer.dart b/lib/widget/drawer.dart index 969b6470..871b5112 100644 --- a/lib/widget/drawer.dart +++ b/lib/widget/drawer.dart @@ -2,10 +2,12 @@ import "package:inventree/api.dart"; import "package:inventree/barcode.dart"; import "package:flutter/material.dart"; import "package:inventree/l10.dart"; +import "package:inventree/settings/about.dart"; import "package:inventree/settings/settings.dart"; import "package:font_awesome_flutter/font_awesome_flutter.dart"; import "package:inventree/widget/search.dart"; +import "package:package_info_plus/package_info_plus.dart"; class InvenTreeDrawer extends StatelessWidget { @@ -63,6 +65,18 @@ class InvenTreeDrawer extends StatelessWidget { Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeSettingsWidget())); } + /* + * Load "About" widget + */ + Future _about() async { + _closeDrawer(); + + PackageInfo.fromPlatform().then((PackageInfo info) { + Navigator.push(context, + MaterialPageRoute(builder: (context) => InvenTreeAboutWidget(info))); + }); + } + @override Widget build(BuildContext context) { @@ -94,6 +108,11 @@ class InvenTreeDrawer extends StatelessWidget { leading: Icon(Icons.settings), onTap: _settings, ), + ListTile( + title: Text(L10().about), + leading: FaIcon(FontAwesomeIcons.infoCircle), + onTap: _about, + ) ] ).toList(), )