diff --git a/analysis_options.yaml b/analysis_options.yaml index 92962f4e..07b40c28 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -55,5 +55,7 @@ linter: sort_child_properties_last: false + directives_ordering: false + # Blindly follow the Flutter code style, which prefers types everywhere always_specify_types: false diff --git a/lib/api.dart b/lib/api.dart index b89a95fa..96202c3d 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -50,7 +50,7 @@ class APIResponse { bool clientError() => (statusCode >= 400) && (statusCode < 500); - bool serverError() => (statusCode >= 500); + bool serverError() => statusCode >= 500; bool isMap() { return data != null && data is Map; @@ -86,8 +86,6 @@ class APIResponse { */ class InvenTreeFileService extends FileService { - HttpClient? _client; - InvenTreeFileService({HttpClient? client, bool strictHttps = false}) { _client = client ?? HttpClient(); @@ -99,6 +97,8 @@ class InvenTreeFileService extends FileService { } } + HttpClient? _client; + @override Future get(String url, {Map? headers}) async { @@ -133,6 +133,12 @@ class InvenTreeFileService extends FileService { class InvenTreeAPI { + factory InvenTreeAPI() { + return _api; + } + + InvenTreeAPI._internal(); + // Minimum required API version for server static const _minApiVersion = 7; @@ -236,14 +242,7 @@ class InvenTreeAPI { } // Ensure we only ever create a single instance of the API class - static final InvenTreeAPI _api = new InvenTreeAPI._internal(); - - factory InvenTreeAPI() { - return _api; - } - - InvenTreeAPI._internal(); - + static final InvenTreeAPI _api = InvenTreeAPI._internal(); /* * Connect to the remote InvenTree server: @@ -481,7 +480,7 @@ class InvenTreeAPI { // Perform a PATCH request Future patch(String url, {Map body = const {}, int? expectedStatusCode}) async { - var _body = Map(); + Map _body = {}; // Copy across provided data body.forEach((K, V) => _body[K] = V); @@ -939,7 +938,7 @@ class InvenTreeAPI { // Return a list of request headers Map defaultHeaders() { - var headers = Map(); + Map headers = {}; headers[HttpHeaders.authorizationHeader] = _authorizationHeader(); headers[HttpHeaders.acceptHeader] = "application/json"; @@ -983,7 +982,7 @@ class InvenTreeAPI { ) ); - return new CachedNetworkImage( + return CachedNetworkImage( imageUrl: url, placeholder: (context, url) => CircularProgressIndicator(), errorWidget: (context, url, error) => FaIcon(FontAwesomeIcons.timesCircle, color: COLOR_DANGER), diff --git a/lib/api_form.dart b/lib/api_form.dart index 93fd5171..70971a13 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -209,7 +209,7 @@ class APIFormField { // Field for selecting and uploading files Widget _constructFileField() { - TextEditingController controller = new TextEditingController(); + TextEditingController controller = TextEditingController(); controller.text = (attachedfile?.path ?? L10().attachmentSelect).split("/").last; @@ -506,7 +506,7 @@ class APIFormField { } TextStyle _labelStyle() { - return new TextStyle( + return TextStyle( fontWeight: FontWeight.bold, fontSize: 18, fontFamily: "arial", @@ -516,7 +516,7 @@ class APIFormField { } TextStyle _helperStyle() { - return new TextStyle( + return TextStyle( fontStyle: FontStyle.italic, color: hasErrors() ? COLOR_DANGER : COLOR_GRAY, ); @@ -660,6 +660,18 @@ Future launchApiForm(BuildContext context, String title, String url, Map)? onSuccess; - APIFormWidget( - this.title, - this.url, - this.fields, - this.method, - { - Key? key, - this.onSuccess, - this.fileField = "", - } - ) : super(key: key); - @override _APIFormWidgetState createState() => _APIFormWidgetState(title, url, fields, method, onSuccess, fileField); @@ -695,7 +695,9 @@ class APIFormWidget extends StatefulWidget { class _APIFormWidgetState extends State { - final _formKey = new GlobalKey(); + _APIFormWidgetState(this.title, this.url, this.fields, this.method, this.onSuccess, this.fileField) : super(); + + final _formKey = GlobalKey(); String title; @@ -709,8 +711,6 @@ class _APIFormWidgetState extends State { Function(Map)? onSuccess; - _APIFormWidgetState(this.title, this.url, this.fields, this.method, this.onSuccess, this.fileField) : super(); - bool spacerRequired = false; List _buildForm() { @@ -788,29 +788,36 @@ class _APIFormWidgetState extends State { if (file != null) { // A valid file has been supplied - return await InvenTreeAPI().uploadFile( + final response = await InvenTreeAPI().uploadFile( url, file, name: fileField, fields: data, ); + + return response; } } } } if (method == "POST") { - return await InvenTreeAPI().post( + final response = await InvenTreeAPI().post( url, body: data, expectedStatusCode: null ); + + return response; + } else { - return await InvenTreeAPI().patch( + final response = await InvenTreeAPI().patch( url, body: data, expectedStatusCode: null ); + + return response; } } diff --git a/lib/app_settings.dart b/lib/app_settings.dart index c2c672d8..f47b41d3 100644 --- a/lib/app_settings.dart +++ b/lib/app_settings.dart @@ -7,9 +7,15 @@ import "package:inventree/preferences.dart"; class InvenTreeSettingsManager { + factory InvenTreeSettingsManager() { + return _manager; + } + + InvenTreeSettingsManager._internal(); + final store = StoreRef("settings"); - Future get _db async => await InvenTreePreferencesDB.instance.database; + Future get _db async => InvenTreePreferencesDB.instance.database; Future getValue(String key, dynamic backup) async { @@ -39,11 +45,5 @@ class InvenTreeSettingsManager { } // Ensure we only ever create a single instance of this class - static final InvenTreeSettingsManager _manager = new InvenTreeSettingsManager._internal(); - - factory InvenTreeSettingsManager() { - return _manager; - } - - InvenTreeSettingsManager._internal(); -} \ No newline at end of file + static final InvenTreeSettingsManager _manager = InvenTreeSettingsManager._internal(); +} diff --git a/lib/barcode.dart b/lib/barcode.dart index e3069dc3..3f44aa9c 100644 --- a/lib/barcode.dart +++ b/lib/barcode.dart @@ -32,21 +32,21 @@ class BarcodeHandler { * based on the response returned from the InvenTree server */ - String getOverlayText(BuildContext context) => "Barcode Overlay"; + BarcodeHandler(); - BarcodeHandler(); + String getOverlayText(BuildContext context) => "Barcode Overlay"; - QRViewController? _controller; + QRViewController? _controller; - Future successTone() async { + Future successTone() async { - final bool en = await InvenTreeSettingsManager().getValue("barcodeSounds", true) as bool; + final bool en = await InvenTreeSettingsManager().getValue("barcodeSounds", true) as bool; - if (en) { - final player = AudioCache(); - player.play("sounds/barcode_scan.mp3"); - } + if (en) { + final player = AudioCache(); + player.play("sounds/barcode_scan.mp3"); } + } Future failureTone() async { @@ -266,10 +266,10 @@ class StockItemBarcodeAssignmentHandler extends BarcodeHandler { * Barcode handler for assigning a new barcode to a stock item */ - final InvenTreeStockItem item; - StockItemBarcodeAssignmentHandler(this.item); + final InvenTreeStockItem item; + @override String getOverlayText(BuildContext context) => L10().barcodeScanAssign; @@ -334,10 +334,10 @@ class StockItemScanIntoLocationHandler extends BarcodeHandler { * Barcode handler for scanning a provided StockItem into a scanned StockLocation */ - final InvenTreeStockItem item; - StockItemScanIntoLocationHandler(this.item); + final InvenTreeStockItem item; + @override String getOverlayText(BuildContext context) => L10().barcodeScanLocation; @@ -396,11 +396,11 @@ class StockLocationScanInItemsHandler extends BarcodeHandler { /* * Barcode handler for scanning stock item(s) into the specified StockLocation */ - - final InvenTreeStockLocation location; - + StockLocationScanInItemsHandler(this.location); - + + final InvenTreeStockLocation location; + @override String getOverlayText(BuildContext context) => L10().barcodeScanItem; @@ -466,10 +466,10 @@ class StockLocationScanInItemsHandler extends BarcodeHandler { class InvenTreeQRView extends StatefulWidget { - final BarcodeHandler _handler; - const InvenTreeQRView(this._handler, {Key? key}) : super(key: key); + final BarcodeHandler _handler; + @override State createState() => _QRViewState(_handler); } @@ -477,6 +477,8 @@ class InvenTreeQRView extends StatefulWidget { class _QRViewState extends State { + _QRViewState(this._handler) : super(); + final GlobalKey qrKey = GlobalKey(debugLabel: "QR"); QRViewController? _controller; @@ -496,8 +498,6 @@ class _QRViewState extends State { _controller!.resumeCamera(); } - _QRViewState(this._handler) : super(); - void _onViewCreated(BuildContext context, QRViewController controller) { _controller = controller; controller.scannedDataStream.listen((barcode) { diff --git a/lib/inventree/company.dart b/lib/inventree/company.dart index 332db292..a749d233 100644 --- a/lib/inventree/company.dart +++ b/lib/inventree/company.dart @@ -10,6 +10,8 @@ class InvenTreeCompany extends InvenTreeModel { InvenTreeCompany() : super(); + InvenTreeCompany.fromJson(Map json) : super.fromJson(json); + @override String get URL => "company/"; @@ -42,8 +44,6 @@ class InvenTreeCompany extends InvenTreeModel { bool get isCustomer => (jsondata["is_customer"] ?? false) as bool; - InvenTreeCompany.fromJson(Map json) : super.fromJson(json); - @override InvenTreeModel createFromJson(Map json) { var company = InvenTreeCompany.fromJson(json); @@ -57,6 +57,11 @@ class InvenTreeCompany extends InvenTreeModel { * The InvenTreeSupplierPart class represents the SupplierPart model in the InvenTree database */ class InvenTreeSupplierPart extends InvenTreeModel { + + InvenTreeSupplierPart() : super(); + + InvenTreeSupplierPart.fromJson(Map json) : super.fromJson(json); + @override String get URL => "company/part/"; @@ -78,10 +83,6 @@ class InvenTreeSupplierPart extends InvenTreeModel { return _filters(); } - InvenTreeSupplierPart() : super(); - - InvenTreeSupplierPart.fromJson(Map json) : super.fromJson(json); - int get manufacturerId => (jsondata["manufacturer"] ?? -1) as int; String get manufacturerName => (jsondata["manufacturer_detail"]["name"] ?? "") as String; @@ -117,6 +118,10 @@ class InvenTreeSupplierPart extends InvenTreeModel { class InvenTreeManufacturerPart extends InvenTreeModel { + InvenTreeManufacturerPart() : super(); + + InvenTreeManufacturerPart.fromJson(Map json) : super.fromJson(json); + @override String url = "company/part/manufacturer/"; @@ -127,10 +132,6 @@ class InvenTreeManufacturerPart extends InvenTreeModel { }; } - InvenTreeManufacturerPart() : super(); - - InvenTreeManufacturerPart.fromJson(Map json) : super.fromJson(json); - int get partId => (jsondata["part"] ?? -1) as int; int get manufacturerId => (jsondata["manufacturer"] ?? -1) as int; diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 1a5a1a03..bd1517ec 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -39,6 +39,11 @@ class InvenTreePageResponse { */ class InvenTreeModel { + InvenTreeModel(); + + // Construct an InvenTreeModel from a JSON data object + InvenTreeModel.fromJson(this.jsondata); + // Override the endpoint URL for each subclass String get URL => ""; @@ -115,19 +120,6 @@ class InvenTreeModel { // Accessor for the API var api = InvenTreeAPI(); - // Default empty object constructor - InvenTreeModel() { - jsondata.clear(); - } - - // Construct an InvenTreeModel from a JSON data object - InvenTreeModel.fromJson(Map json) { - - // Store the json object - jsondata = json; - - } - int get pk => (jsondata["pk"] ?? -1) as int; // Some common accessors @@ -185,10 +177,14 @@ class InvenTreeModel { } - Map defaultListFilters() { return Map(); } + Map defaultListFilters() { + return {}; + } // A map of "default" headers to use when performing a GET request - Map defaultGetFilters() { return Map(); } + Map defaultGetFilters() { + return {}; + } /* * Reload this object, by requesting data from the server @@ -357,7 +353,7 @@ class InvenTreeModel { } // Construct the response - InvenTreePageResponse page = new InvenTreePageResponse(); + InvenTreePageResponse page = InvenTreePageResponse(); var data = response.asMap(); @@ -458,9 +454,10 @@ class InvenTreeModel { class InvenTreeAttachment extends InvenTreeModel { // Class representing an "attachment" file - InvenTreeAttachment() : super(); + InvenTreeAttachment.fromJson(Map json) : super.fromJson(json); + String get attachment => (jsondata["attachment"] ?? "") as String; // Return the filename of the attachment @@ -509,8 +506,6 @@ class InvenTreeAttachment extends InvenTreeModel { } } - InvenTreeAttachment.fromJson(Map json) : super.fromJson(json); - Future uploadAttachment(File attachment, {String comment = "", Map fields = const {}}) async { final APIResponse response = await InvenTreeAPI().uploadFile( diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index 118a7c33..804615e6 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -10,6 +10,10 @@ import "model.dart"; class InvenTreePartCategory extends InvenTreeModel { + InvenTreePartCategory() : super(); + + InvenTreePartCategory.fromJson(Map json) : super.fromJson(json); + @override String get URL => "part/category/"; @@ -25,12 +29,11 @@ class InvenTreePartCategory extends InvenTreeModel { @override Map defaultListFilters() { - var filters = new Map(); - filters["active"] = "true"; - filters["cascade"] = "false"; - - return filters; + return { + "active": "true", + "cascade": "false" + }; } String get pathstring => (jsondata["pathstring"] ?? "") as String; @@ -54,10 +57,6 @@ class InvenTreePartCategory extends InvenTreeModel { int get partcount => (jsondata["parts"] ?? 0) as int; - InvenTreePartCategory() : super(); - - InvenTreePartCategory.fromJson(Map json) : super.fromJson(json); - @override InvenTreeModel createFromJson(Map json) { var cat = InvenTreePartCategory.fromJson(json); @@ -71,6 +70,10 @@ class InvenTreePartCategory extends InvenTreeModel { class InvenTreePartTestTemplate extends InvenTreeModel { + InvenTreePartTestTemplate() : super(); + + InvenTreePartTestTemplate.fromJson(Map json) : super.fromJson(json); + @override String get URL => "part/test-template/"; @@ -84,10 +87,6 @@ class InvenTreePartTestTemplate extends InvenTreeModel { bool get requiresAttachment => (jsondata["requires_attachment"] ?? false) as bool; - InvenTreePartTestTemplate() : super(); - - InvenTreePartTestTemplate.fromJson(Map json) : super.fromJson(json); - @override InvenTreeModel createFromJson(Map json) { var template = InvenTreePartTestTemplate.fromJson(json); @@ -123,6 +122,10 @@ class InvenTreePartTestTemplate extends InvenTreeModel { class InvenTreePart extends InvenTreeModel { + InvenTreePart() : super(); + + InvenTreePart.fromJson(Map json) : super.fromJson(json); + @override String get URL => "part/"; @@ -377,12 +380,6 @@ class InvenTreePart extends InvenTreeModel { // Return the "starred" status of this part bool get starred => (jsondata["starred"] ?? false) as bool; - InvenTreePart() : super(); - - InvenTreePart.fromJson(Map json) : super.fromJson(json) { - // TODO - } - @override InvenTreeModel createFromJson(Map json) { @@ -397,11 +394,11 @@ class InvenTreePartAttachment extends InvenTreeAttachment { InvenTreePartAttachment() : super(); + InvenTreePartAttachment.fromJson(Map json) : super.fromJson(json); + @override String get URL => "part/attachment/"; - InvenTreePartAttachment.fromJson(Map json) : super.fromJson(json); - @override InvenTreeModel createFromJson(Map json) { return InvenTreePartAttachment.fromJson(json); diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index b7698d36..349066e3 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -13,6 +13,10 @@ const int PO_STATUS_RETURNED = 60; class InvenTreePurchaseOrder extends InvenTreeModel { + InvenTreePurchaseOrder() : super(); + + InvenTreePurchaseOrder.fromJson(Map json) : super.fromJson(json); + @override String get URL => "order/po/"; @@ -28,8 +32,6 @@ class InvenTreePurchaseOrder extends InvenTreeModel { }; } - InvenTreePurchaseOrder() : super(); - @override Map defaultGetFilters() { return { @@ -102,8 +104,6 @@ class InvenTreePurchaseOrder extends InvenTreeModel { return items; } - InvenTreePurchaseOrder.fromJson(Map json) : super.fromJson(json); - @override InvenTreeModel createFromJson(Map json) { return InvenTreePurchaseOrder.fromJson(json); @@ -111,6 +111,11 @@ class InvenTreePurchaseOrder extends InvenTreeModel { } class InvenTreePOLineItem extends InvenTreeModel { + + InvenTreePOLineItem() : super(); + + InvenTreePOLineItem.fromJson(Map json) : super.fromJson(json); + @override String get URL => "order/po-line/"; @@ -189,11 +194,6 @@ class InvenTreePOLineItem extends InvenTreeModel { Map get destinationDetail => (jsondata["destination_detail"] ?? {}) as Map; - InvenTreePOLineItem() : super(); - - InvenTreePOLineItem.fromJson(Map json) - : super.fromJson(json); - @override InvenTreeModel createFromJson(Map json) { return InvenTreePOLineItem.fromJson(json); diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index 87f97df2..cbfe7142 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -12,6 +12,10 @@ import "package:inventree/api.dart"; class InvenTreeStockItemTestResult extends InvenTreeModel { + InvenTreeStockItemTestResult() : super(); + + InvenTreeStockItemTestResult.fromJson(Map json) : super.fromJson(json); + @override String get URL => "stock/test/"; @@ -41,10 +45,6 @@ class InvenTreeStockItemTestResult extends InvenTreeModel { String get date => (jsondata["date"] ?? "") as String; - InvenTreeStockItemTestResult() : super(); - - InvenTreeStockItemTestResult.fromJson(Map json) : super.fromJson(json); - @override InvenTreeStockItemTestResult createFromJson(Map json) { var result = InvenTreeStockItemTestResult.fromJson(json); @@ -56,6 +56,10 @@ class InvenTreeStockItemTestResult extends InvenTreeModel { class InvenTreeStockItem extends InvenTreeModel { + InvenTreeStockItem() : super(); + + InvenTreeStockItem.fromJson(Map json) : super.fromJson(json); + // Stock status codes static const int OK = 10; static const int ATTENTION = 50; @@ -128,33 +132,23 @@ class InvenTreeStockItem extends InvenTreeModel { @override Map defaultGetFilters() { - var headers = new Map(); - - headers["part_detail"] = "true"; - headers["location_detail"] = "true"; - headers["supplier_detail"] = "true"; - headers["cascade"] = "false"; - - return headers; + return { + "part_detail": "true", + "location_detail": "true", + "supplier_detail": "true", + "cascade": "false" + }; } @override Map defaultListFilters() { - var headers = new Map(); - - headers["part_detail"] = "true"; - headers["location_detail"] = "true"; - headers["supplier_detail"] = "true"; - headers["cascade"] = "false"; - - return headers; - } - - InvenTreeStockItem() : super(); - - InvenTreeStockItem.fromJson(Map json) : super.fromJson(json) { - // TODO + return { + "part_detail": "true", + "location_detail": "true", + "supplier_detail": "true", + "cascade": "false" + }; } List testTemplates = []; @@ -533,6 +527,10 @@ class InvenTreeStockItem extends InvenTreeModel { class InvenTreeStockLocation extends InvenTreeModel { + InvenTreeStockLocation() : super(); + + InvenTreeStockLocation.fromJson(Map json) : super.fromJson(json); + @override String get URL => "stock/location/"; @@ -566,10 +564,6 @@ class InvenTreeStockLocation extends InvenTreeModel { int get itemcount => (jsondata["items"] ?? 0) as int; - InvenTreeStockLocation() : super(); - - InvenTreeStockLocation.fromJson(Map json) : super.fromJson(json); - @override InvenTreeModel createFromJson(Map json) { diff --git a/lib/preferences.dart b/lib/preferences.dart index f35f7ab6..2c52a88d 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -11,12 +11,12 @@ import "package:path/path.dart"; */ class InvenTreePreferencesDB { + InvenTreePreferencesDB._(); + static final InvenTreePreferencesDB _singleton = InvenTreePreferencesDB._(); static InvenTreePreferencesDB get instance => _singleton; - InvenTreePreferencesDB._(); - Completer _dbOpenCompleter = Completer(); bool isOpen = false; @@ -56,6 +56,12 @@ class InvenTreePreferencesDB { class InvenTreePreferences { + factory InvenTreePreferences() { + return _api; + } + + InvenTreePreferences._internal(); + /* The following settings are not stored to persistent storage, * instead they are only used as "session preferences". * They are kept here as a convenience only. @@ -74,11 +80,6 @@ class InvenTreePreferences { bool expandStockList = true; // Ensure we only ever create a single instance of the preferences class - static final InvenTreePreferences _api = new InvenTreePreferences._internal(); + static final InvenTreePreferences _api = InvenTreePreferences._internal(); - factory InvenTreePreferences() { - return _api; - } - - InvenTreePreferences._internal(); } \ No newline at end of file diff --git a/lib/settings/about.dart b/lib/settings/about.dart index 87ba5c2f..cde55bf5 100644 --- a/lib/settings/about.dart +++ b/lib/settings/about.dart @@ -12,10 +12,10 @@ import "package:inventree/l10.dart"; class InvenTreeAboutWidget extends StatelessWidget { - final PackageInfo info; - const InvenTreeAboutWidget(this.info) : super(); + final PackageInfo info; + Future _releaseNotes(BuildContext context) async { // Load release notes from external file diff --git a/lib/settings/app_settings.dart b/lib/settings/app_settings.dart index 4cee024a..07d6dfd3 100644 --- a/lib/settings/app_settings.dart +++ b/lib/settings/app_settings.dart @@ -15,10 +15,10 @@ class InvenTreeAppSettingsWidget extends StatefulWidget { class _InvenTreeAppSettingsState extends State { - final GlobalKey<_InvenTreeAppSettingsState> _settingsKey = GlobalKey<_InvenTreeAppSettingsState>(); - _InvenTreeAppSettingsState(); + final GlobalKey<_InvenTreeAppSettingsState> _settingsKey = GlobalKey<_InvenTreeAppSettingsState>(); + bool barcodeSounds = true; bool serverSounds = true; bool partSubcategory = false; diff --git a/lib/settings/login.dart b/lib/settings/login.dart index 59487df4..32cdc35c 100644 --- a/lib/settings/login.dart +++ b/lib/settings/login.dart @@ -17,14 +17,14 @@ class InvenTreeLoginSettingsWidget extends StatefulWidget { class _InvenTreeLoginSettingsState extends State { - final GlobalKey<_InvenTreeLoginSettingsState> _loginKey = GlobalKey<_InvenTreeLoginSettingsState>(); - - List profiles = []; - _InvenTreeLoginSettingsState() { _reload(); } + final GlobalKey<_InvenTreeLoginSettingsState> _loginKey = GlobalKey<_InvenTreeLoginSettingsState>(); + + List profiles = []; + Future _reload() async { profiles = await UserProfileDBManager().getAllProfiles(); @@ -237,21 +237,21 @@ class _InvenTreeLoginSettingsState extends State { class ProfileEditWidget extends StatefulWidget { - UserProfile? profile; - ProfileEditWidget(this.profile) : super(); + UserProfile? profile; + @override _ProfileEditState createState() => _ProfileEditState(profile); } class _ProfileEditState extends State { - UserProfile? profile; - _ProfileEditState(this.profile) : super(); - final formKey = new GlobalKey(); + UserProfile? profile; + + final formKey = GlobalKey(); String name = ""; String server = ""; @@ -359,7 +359,7 @@ class _ProfileEditState extends State { if (uri.hasScheme) { print("Scheme: ${uri.scheme}"); - if (!(["http", "https"].contains(uri.scheme.toLowerCase()))) { + if (!["http", "https"].contains(uri.scheme.toLowerCase())) { return L10().serverStart; } } else { diff --git a/lib/settings/release.dart b/lib/settings/release.dart index b2589a85..35e60a44 100644 --- a/lib/settings/release.dart +++ b/lib/settings/release.dart @@ -6,10 +6,10 @@ import "package:inventree/l10.dart"; class ReleaseNotesWidget extends StatelessWidget { - final String releaseNotes; - const ReleaseNotesWidget(this.releaseNotes); + final String releaseNotes; + @override Widget build (BuildContext context) { return Scaffold( @@ -27,10 +27,10 @@ class ReleaseNotesWidget extends StatelessWidget { class CreditsWidget extends StatelessWidget { - final String credits; - const CreditsWidget(this.credits); + final String credits; + @override Widget build (BuildContext context) { return Scaffold( diff --git a/lib/user_profile.dart b/lib/user_profile.dart index 26e055b6..3aac40bf 100644 --- a/lib/user_profile.dart +++ b/lib/user_profile.dart @@ -16,6 +16,15 @@ class UserProfile { this.selected = false, }); + factory UserProfile.fromJson(int key, Map json, bool isSelected) => UserProfile( + key: key, + name: json["name"] as String, + server: json["server"] as String, + username: json["username"] as String, + password: json["password"] as String, + selected: isSelected, + ); + // ID of the profile int? key; @@ -36,15 +45,6 @@ class UserProfile { // User ID (will be provided by the server on log-in) int user_id = -1; - factory UserProfile.fromJson(int key, Map json, bool isSelected) => UserProfile( - key: key, - name: json["name"] as String, - server: json["server"] as String, - username: json["username"] as String, - password: json["password"] as String, - selected: isSelected, - ); - Map toJson() => { "name": name, "server": server, @@ -62,7 +62,7 @@ class UserProfileDBManager { final store = StoreRef("profiles"); - Future get _db async => await InvenTreePreferencesDB.instance.database; + Future get _db async => InvenTreePreferencesDB.instance.database; Future profileNameExists(String name) async { diff --git a/lib/widget/category_display.dart b/lib/widget/category_display.dart index f3d60034..80ce8605 100644 --- a/lib/widget/category_display.dart +++ b/lib/widget/category_display.dart @@ -32,6 +32,7 @@ class CategoryDisplayWidget extends StatefulWidget { class _CategoryDisplayState extends RefreshableState { + _CategoryDisplayState(this.category); @override String getAppBarTitle(BuildContext context) => L10().partCategory; @@ -74,8 +75,6 @@ class _CategoryDisplayState extends RefreshableState { ); } - _CategoryDisplayState(this.category); - // The local InvenTreePartCategory object final InvenTreePartCategory? category; @@ -350,10 +349,11 @@ class _CategoryDisplayState extends RefreshableState { * Builder for displaying a list of PartCategory objects */ class SubcategoryList extends StatelessWidget { - final List _categories; const SubcategoryList(this._categories); + final List _categories; + void _openCategory(BuildContext context, int pk) { // Attempt to load the sub-category. @@ -397,12 +397,12 @@ class SubcategoryList extends StatelessWidget { class PaginatedPartList extends StatefulWidget { + PaginatedPartList(this.filters, {this.onTotalChanged}); + final Map filters; Function(int)? onTotalChanged; - PaginatedPartList(this.filters, {this.onTotalChanged}); - @override _PaginatedPartListState createState() => _PaginatedPartListState(filters, onTotalChanged); } @@ -410,6 +410,8 @@ class PaginatedPartList extends StatefulWidget { class _PaginatedPartListState extends State { + _PaginatedPartListState(this.filters, this.onTotalChanged); + static const _pageSize = 25; String _searchTerm = ""; @@ -418,8 +420,6 @@ class _PaginatedPartListState extends State { final Map filters; - _PaginatedPartListState(this.filters, this.onTotalChanged); - final PagingController _pagingController = PagingController(firstPageKey: 0); @override diff --git a/lib/widget/company_detail.dart b/lib/widget/company_detail.dart index 4bea741d..21b9e380 100644 --- a/lib/widget/company_detail.dart +++ b/lib/widget/company_detail.dart @@ -10,10 +10,10 @@ import "package:inventree/l10.dart"; class CompanyDetailWidget extends StatefulWidget { - final InvenTreeCompany company; - const CompanyDetailWidget(this.company, {Key? key}) : super(key: key); + final InvenTreeCompany company; + @override _CompanyDetailState createState() => _CompanyDetailState(company); diff --git a/lib/widget/drawer.dart b/lib/widget/drawer.dart index 475ed27c..92868971 100644 --- a/lib/widget/drawer.dart +++ b/lib/widget/drawer.dart @@ -13,10 +13,10 @@ import "package:font_awesome_flutter/font_awesome_flutter.dart"; class InvenTreeDrawer extends StatelessWidget { - final BuildContext context; - const InvenTreeDrawer(this.context); + final BuildContext context; + void _closeDrawer() { // Close the drawer Navigator.of(context).pop(); diff --git a/lib/widget/home.dart b/lib/widget/home.dart index 6589a89d..95551c2d 100644 --- a/lib/widget/home.dart +++ b/lib/widget/home.dart @@ -31,14 +31,14 @@ class InvenTreeHomePage extends StatefulWidget { class _InvenTreeHomePageState extends State { - final GlobalKey<_InvenTreeHomePageState> _homeKey = GlobalKey<_InvenTreeHomePageState>(); - _InvenTreeHomePageState() : super() { // Initially load the profile and attempt server connection _loadProfile(); } + final GlobalKey<_InvenTreeHomePageState> _homeKey = GlobalKey<_InvenTreeHomePageState>(); + // Selected user profile UserProfile? _profile; @@ -266,7 +266,7 @@ class _InvenTreeHomePageState extends State { appBar: AppBar( title: Text(L10().appTitle), ), - drawer: new InvenTreeDrawer(context), + drawer: InvenTreeDrawer(context), body: ListView( physics: ClampingScrollPhysics(), shrinkWrap: true, diff --git a/lib/widget/location_display.dart b/lib/widget/location_display.dart index 31ab8c4d..c2670e38 100644 --- a/lib/widget/location_display.dart +++ b/lib/widget/location_display.dart @@ -31,6 +31,8 @@ class LocationDisplayWidget extends StatefulWidget { class _LocationDisplayState extends RefreshableState { + _LocationDisplayState(this.location); + final InvenTreeStockLocation? location; @override @@ -92,8 +94,6 @@ class _LocationDisplayState extends RefreshableState { ); } - _LocationDisplayState(this.location); - List _sublocations = []; String _locationFilter = ""; @@ -428,10 +428,11 @@ List detailTiles() { class SublocationList extends StatelessWidget { - final List _locations; const SublocationList(this._locations); + final List _locations; + void _openLocation(BuildContext context, int pk) { InvenTreeStockLocation().get(pk).then((var loc) { @@ -475,10 +476,10 @@ class SublocationList extends StatelessWidget { class PaginatedStockList extends StatefulWidget { - final Map filters; - const PaginatedStockList(this.filters); + final Map filters; + @override _PaginatedStockListState createState() => _PaginatedStockListState(filters); } @@ -486,14 +487,14 @@ class PaginatedStockList extends StatefulWidget { class _PaginatedStockListState extends State { + _PaginatedStockListState(this.filters); + static const _pageSize = 25; String _searchTerm = ""; final Map filters; - _PaginatedStockListState(this.filters); - final PagingController _pagingController = PagingController(firstPageKey: 0); @override diff --git a/lib/widget/paginator.dart b/lib/widget/paginator.dart index ad639766..c5482e35 100644 --- a/lib/widget/paginator.dart +++ b/lib/widget/paginator.dart @@ -5,14 +5,14 @@ import "package:inventree/l10.dart"; class PaginatedSearchWidget extends StatelessWidget { + PaginatedSearchWidget(this.controller, this.onChanged, this.results); + Function onChanged; int results = 0; TextEditingController controller; - PaginatedSearchWidget(this.controller, this.onChanged, this.results); - @override Widget build(BuildContext context) { return ListTile( diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index 6a1cdd18..4c4c8761 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -34,10 +34,10 @@ class PartDetailWidget extends StatefulWidget { class _PartDisplayState extends RefreshableState { - InvenTreePart part; - _PartDisplayState(this.part); + InvenTreePart part; + @override String getAppBarTitle(BuildContext context) => L10().partDetails; diff --git a/lib/widget/part_notes.dart b/lib/widget/part_notes.dart index fe4b0348..e2618d2f 100644 --- a/lib/widget/part_notes.dart +++ b/lib/widget/part_notes.dart @@ -10,10 +10,10 @@ import "package:inventree/l10.dart"; class PartNotesWidget extends StatefulWidget { - final InvenTreePart part; - const PartNotesWidget(this.part, {Key? key}) : super(key: key); + final InvenTreePart part; + @override _PartNotesState createState() => _PartNotesState(part); } @@ -21,10 +21,10 @@ class PartNotesWidget extends StatefulWidget { class _PartNotesState extends RefreshableState { - final InvenTreePart part; - _PartNotesState(this.part); + final InvenTreePart part; + @override Future request() async { await part.reload(); diff --git a/lib/widget/search.dart b/lib/widget/search.dart index a4fd9a18..a6a73537 100644 --- a/lib/widget/search.dart +++ b/lib/widget/search.dart @@ -17,18 +17,6 @@ import "package:inventree/api.dart"; class PartSearchDelegate extends SearchDelegate { - final partSearchKey = GlobalKey(); - - BuildContext context; - - // What did we search for last time? - String _cachedQuery = ""; - - bool _searching = false; - - // Custom filters for the part search - Map _filters = {}; - PartSearchDelegate(this.context, {Map filters = const {}}) { // Copy filter values @@ -42,6 +30,18 @@ class PartSearchDelegate extends SearchDelegate { } } + final partSearchKey = GlobalKey(); + + BuildContext context; + + // What did we search for last time? + String _cachedQuery = ""; + + bool _searching = false; + + // Custom filters for the part search + Map _filters = {}; + @override String get searchFieldLabel => L10().searchParts; @@ -207,17 +207,6 @@ class PartSearchDelegate extends SearchDelegate { class StockSearchDelegate extends SearchDelegate { - final stockSearchKey = GlobalKey(); - - final BuildContext context; - - String _cachedQuery = ""; - - bool _searching = false; - - // Custom filters for the stock item search - Map _filters = {}; - StockSearchDelegate(this.context, {Map filters = const {}}) { // Copy filter values @@ -231,6 +220,17 @@ class StockSearchDelegate extends SearchDelegate { } } + final stockSearchKey = GlobalKey(); + + final BuildContext context; + + String _cachedQuery = ""; + + bool _searching = false; + + // Custom filters for the stock item search + Map _filters = {}; + @override String get searchFieldLabel => L10().searchStock; diff --git a/lib/widget/spinner.dart b/lib/widget/spinner.dart index 9b53a93e..d5723ccf 100644 --- a/lib/widget/spinner.dart +++ b/lib/widget/spinner.dart @@ -5,9 +5,6 @@ import "package:font_awesome_flutter/font_awesome_flutter.dart"; import "package:inventree/app_colors.dart"; class Spinner extends StatefulWidget { - final IconData? icon; - final Duration duration; - final Color color; const Spinner({ this.color = COLOR_GRAY_LIGHT, @@ -16,6 +13,10 @@ class Spinner extends StatefulWidget { this.duration = const Duration(milliseconds: 1800), }) : super(key: key); + final IconData? icon; + final Duration duration; + final Color color; + @override _SpinnerState createState() => _SpinnerState(); } diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index e4431190..7ed69124 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -35,6 +35,8 @@ class StockDetailWidget extends StatefulWidget { class _StockItemDisplayState extends RefreshableState { + _StockItemDisplayState(this.item); + @override String getAppBarTitle(BuildContext context) => L10().stockItem; @@ -46,8 +48,6 @@ class _StockItemDisplayState extends RefreshableState { final _countStockKey = GlobalKey(); final _moveStockKey = GlobalKey(); - _StockItemDisplayState(this.item); - @override List getAppBarActions(BuildContext context) { diff --git a/lib/widget/stock_item_test_results.dart b/lib/widget/stock_item_test_results.dart index 3651fd2c..27556e50 100644 --- a/lib/widget/stock_item_test_results.dart +++ b/lib/widget/stock_item_test_results.dart @@ -26,6 +26,8 @@ class StockItemTestResultsWidget extends StatefulWidget { class _StockItemTestResultDisplayState extends RefreshableState { + _StockItemTestResultDisplayState(this.item); + @override String getAppBarTitle(BuildContext context) => L10().testResults; @@ -49,8 +51,6 @@ class _StockItemTestResultDisplayState extends RefreshableState addTestResult(BuildContext context, {String name = "", bool nameIsEditable = true, bool result = false, String value = "", bool valueRequired = false, bool attachmentRequired = false}) async { InvenTreeStockItemTestResult().createForm( diff --git a/lib/widget/stock_notes.dart b/lib/widget/stock_notes.dart index 0a7bc1b9..28c1c890 100644 --- a/lib/widget/stock_notes.dart +++ b/lib/widget/stock_notes.dart @@ -12,10 +12,10 @@ import "package:inventree/api.dart"; class StockNotesWidget extends StatefulWidget { - final InvenTreeStockItem item; - const StockNotesWidget(this.item, {Key? key}) : super(key: key); + final InvenTreeStockItem item; + @override _StockNotesState createState() => _StockNotesState(item); } @@ -23,10 +23,10 @@ class StockNotesWidget extends StatefulWidget { class _StockNotesState extends RefreshableState { - final InvenTreeStockItem item; - _StockNotesState(this.item); + final InvenTreeStockItem item; + @override String getAppBarTitle(BuildContext context) => L10().stockItemNotes;