mirror of
				https://github.com/inventree/inventree-app.git
				synced 2025-11-03 23:05:44 +00:00 
			
		
		
		
	Reorganize settings:
- Add new setting to disable error uploading - Move "about" info to a separate view
This commit is contained in:
		@@ -19,6 +19,7 @@ const String INV_PART_SUBCATEGORY = "partSubcategory";
 | 
			
		||||
 | 
			
		||||
const String INV_STOCK_SUBLOCATION = "stockSublocation";
 | 
			
		||||
 | 
			
		||||
const String INV_REPORT_ERRORS = "reportErrors";
 | 
			
		||||
 | 
			
		||||
class InvenTreeSettingsManager {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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<bool> sentryReportMessage(String message, {Map<String, String>? 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<void> 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();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								lib/l10n
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								lib/l10n
									
									
									
									
									
								
							 Submodule lib/l10n updated: e49ca8618d...1ba291fe1f
									
								
							@@ -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 <void> _openDocs() async {
 | 
			
		||||
 | 
			
		||||
    const String docsUrl = "https://inventree.readthedocs.io/en/latest/app/app/";
 | 
			
		||||
 | 
			
		||||
    if (await canLaunch(docsUrl)) {
 | 
			
		||||
      await launch(docsUrl);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future <void> _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 <void> _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),
 | 
			
		||||
 
 | 
			
		||||
@@ -19,13 +19,6 @@ class _InvenTreeAppSettingsState extends State<InvenTreeAppSettingsWidget> {
 | 
			
		||||
 | 
			
		||||
  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<InvenTreeAppSettingsWidget> {
 | 
			
		||||
  // Stock settings
 | 
			
		||||
  bool stockSublocation = false;
 | 
			
		||||
 | 
			
		||||
  bool reportErrors = true;
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void initState() {
 | 
			
		||||
    super.initState();
 | 
			
		||||
@@ -47,12 +42,6 @@ class _InvenTreeAppSettingsState extends State<InvenTreeAppSettingsWidget> {
 | 
			
		||||
 | 
			
		||||
    // 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<InvenTreeAppSettingsWidget> {
 | 
			
		||||
 | 
			
		||||
    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<InvenTreeAppSettingsWidget> {
 | 
			
		||||
      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<InvenTreeAppSettingsWidget> {
 | 
			
		||||
              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<InvenTreeAppSettingsWidget> {
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
            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;
 | 
			
		||||
                  });
 | 
			
		||||
                },
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
          ]
 | 
			
		||||
        )
 | 
			
		||||
      )
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										136
									
								
								lib/settings/home_settings.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								lib/settings/home_settings.dart
									
									
									
									
									
										Normal file
									
								
							@@ -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<HomeScreenSettingsWidget> {
 | 
			
		||||
 | 
			
		||||
  _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 <void> 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;
 | 
			
		||||
                        });
 | 
			
		||||
                      },
 | 
			
		||||
                    ),
 | 
			
		||||
                  ),
 | 
			
		||||
                ]
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
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";
 | 
			
		||||
@@ -24,8 +25,6 @@ class _InvenTreeSettingsState extends State<InvenTreeSettingsWidget> {
 | 
			
		||||
 | 
			
		||||
  final _scaffoldKey = GlobalKey<ScaffoldState>();
 | 
			
		||||
 | 
			
		||||
  final String docsUrl = "https://inventree.readthedocs.io/en/latest/app/app/";
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return Scaffold(
 | 
			
		||||
@@ -44,46 +43,18 @@ class _InvenTreeSettingsState extends State<InvenTreeSettingsWidget> {
 | 
			
		||||
                  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 +62,17 @@ class _InvenTreeSettingsState extends State<InvenTreeSettingsWidget> {
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Future <void> _openDocs() async {
 | 
			
		||||
    if (await canLaunch(docsUrl)) {
 | 
			
		||||
      await launch(docsUrl);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future <void> _translate() async {
 | 
			
		||||
    const String url = "https://crowdin.com/project/inventree";
 | 
			
		||||
 | 
			
		||||
    if (await canLaunch(url)) {
 | 
			
		||||
      await launch(url);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future <void> _editServerSettings() async {
 | 
			
		||||
 | 
			
		||||
    Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeLoginSettingsWidget()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future<void> _editHomeScreenSettings() async {
 | 
			
		||||
    Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreenSettingsWidget()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future <void> _editAppSettings() async {
 | 
			
		||||
    Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeAppSettingsWidget()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future <void> _about() async {
 | 
			
		||||
 | 
			
		||||
    PackageInfo.fromPlatform().then((PackageInfo info) {
 | 
			
		||||
      Navigator.push(context,
 | 
			
		||||
          MaterialPageRoute(builder: (context) => InvenTreeAboutWidget(info)));
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Future <void> _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);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -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<void> _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(),
 | 
			
		||||
        )
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user