diff --git a/assets/release_notes.md b/assets/release_notes.md index 07573425..8e511fab 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,6 +1,12 @@ ## InvenTree App Release Notes --- +### 0.2.8 - July 2021 +--- + +- Bug fixes for API calls + + ### 0.2.7 - July 2021 --- diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh index c4c0ae52..9597aff1 100644 --- a/ios/Flutter/flutter_export_environment.sh +++ b/ios/Flutter/flutter_export_environment.sh @@ -6,8 +6,8 @@ export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=lib\main.dart" export "FLUTTER_BUILD_DIR=build" export "SYMROOT=${SOURCE_ROOT}/../build\ios" -export "FLUTTER_BUILD_NAME=0.2.7" -export "FLUTTER_BUILD_NUMBER=15" +export "FLUTTER_BUILD_NAME=0.2.8" +export "FLUTTER_BUILD_NUMBER=16" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=false" export "TREE_SHAKE_ICONS=false" diff --git a/lib/api.dart b/lib/api.dart index 77906948..371e3fd9 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -4,19 +4,40 @@ import 'dart:io'; import 'package:intl/intl.dart'; -import 'package:InvenTree/inventree/sentry.dart'; -import 'package:InvenTree/user_profile.dart'; -import 'package:InvenTree/widget/snacks.dart'; +import 'package:inventree/inventree/sentry.dart'; +import 'package:inventree/user_profile.dart'; +import 'package:inventree/widget/snacks.dart'; import 'package:flutter/cupertino.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/l10.dart'; import 'package:http/http.dart' as http; + +/** + * Class representing an API response from the server + */ +class APIResponse { + + APIResponse({this.url = "", this.method = "", this.statusCode = -1, this.data}); + + int statusCode = -1; + + String url = ""; + + String method = ""; + + dynamic data; + + // Request is "valid" if a statusCode was returned + bool isValid() => statusCode >= 0; +} + + /** * Custom FileService for caching network images * Requires a custom badCertificateCallback, @@ -214,16 +235,12 @@ class InvenTreeAPI { print("Connecting to ${apiUrl} -> username=${username}"); - HttpClientResponse? response; + APIResponse response; - dynamic data; + response = await get("", expectedStatusCode: 200); - response = await getResponse(""); - - // Null response means something went horribly wrong! - // Most likely, the server cannot be contacted - if (response == null) { - // An error message has already been displayed! + // Response was invalid for some reason + if (!response.isValid()) { return false; } @@ -232,10 +249,8 @@ class InvenTreeAPI { return false; } - data = await responseToJson(response); - // We expect certain response from the server - if (data == null || !data.containsKey("server") || !data.containsKey("version") || !data.containsKey("instance")) { + if (response.data == null || !response.data.containsKey("server") || !response.data.containsKey("version") || !response.data.containsKey("instance")) { showServerError( L10().missingData, @@ -246,11 +261,11 @@ class InvenTreeAPI { } // Record server information - _version = data["version"]; - instance = data['instance'] ?? ''; + _version = response.data["version"]; + instance = response.data['instance'] ?? ''; // Default API version is 1 if not provided - _apiVersion = (data['apiVersion'] ?? 1) as int; + _apiVersion = (response.data['apiVersion'] ?? 1) as int; if (_apiVersion < _minApiVersion) { @@ -280,10 +295,10 @@ class InvenTreeAPI { print("Requesting token from server"); - response = await getResponse(_URL_GET_TOKEN); + response = await get(_URL_GET_TOKEN); - // A "null" response means that the request was unsuccessful - if (response == null) { + // Invalid response + if (!response.isValid()) { return false; } @@ -305,9 +320,7 @@ class InvenTreeAPI { return false; } - data = await responseToJson(response); - - if (data == null || !data.containsKey("token")) { + if (response.data == null || !response.data.containsKey("token")) { showServerError( L10().tokenMissing, L10().tokenMissingFromResponse, @@ -317,7 +330,7 @@ class InvenTreeAPI { } // Return the received token - _token = data["token"]; + _token = response.data["token"]; print("Received token - $_token"); // Request user role information @@ -383,17 +396,15 @@ class InvenTreeAPI { // Any 'older' version of the server allows any API method for any logged in user! // We will return immediately, but request the user roles in the background - var response = await get(_URL_GET_ROLES); + var response = await get(_URL_GET_ROLES, expectedStatusCode: 200); - // Null response from server - if (response == null) { - print("null response requesting user roles"); + if (!response.isValid() || response.statusCode != 200) { return; } - if (response.containsKey('roles')) { + if (response.data.containsKey('roles')) { // Save a local copy of the user roles - roles = response['roles']; + roles = response.data['roles']; } } @@ -420,108 +431,27 @@ class InvenTreeAPI { // Perform a PATCH request - Future patch(String url, {Map body = const {}, int expectedStatusCode=200}) async { - var _url = makeApiUrl(url); + Future patch(String url, {Map body = const {}, int expectedStatusCode=200}) async { var _body = Map(); // Copy across provided data body.forEach((K, V) => _body[K] = V); - print("PATCH: " + _url); + HttpClientRequest? request = await apiRequest(url, "PATCH"); - final uri = Uri.parse(_url); - - // Check for invalid host - if (uri.host.isEmpty) { - showServerError(L10().invalidHost, L10().invalidHostDetails); - return null; - } - - var client = createClient(true); - - HttpClientRequest? request; - - try { - // Open a connection to the server - request = await client.patchUrl(uri).timeout(Duration(seconds: 10)); - } on SocketException catch (error) { - showServerError(L10().connectionRefused, error.toString()); - return null; - } on TimeoutException { - showTimeoutError(); - return null; - } catch (error, stackTrace) { - showServerError( - L10().serverError, - error.toString() + if (request == null) { + // Return an "invalid" APIResponse + return new APIResponse( + url: url, + method: 'PATCH', ); - - sentryReportError(error, stackTrace); - - return null; } - var data = json.encode(_body); - - // Set headers - request.headers.set(HttpHeaders.acceptHeader, 'application/json'); - request.headers.set(HttpHeaders.contentTypeHeader, 'application/json'); - request.headers.set(HttpHeaders.acceptLanguageHeader, Intl.getCurrentLocale()); - request.headers.set(HttpHeaders.contentLengthHeader, data.length.toString()); - request.headers.set(HttpHeaders.authorizationHeader, _authorizationHeader()); - - request.add(utf8.encode(data)); - - HttpClientResponse? response; - - try { - response = await request.close().timeout(Duration(seconds: 10)); - } on SocketException catch (error) { - showServerError( - L10().connectionRefused, - error.toString() - ); - return null; - } on TimeoutException { - showTimeoutError(); - return null; - } catch (error, stackTrace) { - showServerError( - L10().serverError, - error.toString() - ); - - sentryReportError(error, stackTrace); - return null; - } - - var responseData = await responseToJson(response); - - if (response.statusCode != expectedStatusCode) { - showStatusCodeError(response.statusCode); - - print("PATCH to ${_url} returned status code ${response.statusCode}"); - print("Data:"); - print(responseData); - - // Server error - if (response.statusCode >= 500) { - sentryReportMessage( - "Server error on PATCH request", - context: { - "url": _url, - "statusCode": "${response.statusCode}", - "response": responseData.toString(), - "request": body.toString(), - } - ); - } - } - - // Include the statuscode in the response object - responseData["statusCode"] = response.statusCode; - - return responseData; + return completeRequest( + request, + data: json.encode(_body), + statusCode: expectedStatusCode + ); } /* @@ -572,155 +502,42 @@ class InvenTreeAPI { * We send this with the currently selected "locale", * so that (hopefully) the field messages are correctly translated */ - Future options(String url) async { + Future options(String url) async { - var _url = makeApiUrl(url); + HttpClientRequest? request = await apiRequest(url, "OPTIONS"); - var client = createClient(true); - - final uri = Uri.parse(_url); - - if (uri.host.isEmpty) { - showServerError(L10().invalidHost, L10().invalidHostDetails); - return null; + if (request == null) { + // Return an "invalid" APIResponse + return new APIResponse( + url: url, + method: 'OPTIONS' + ); } - HttpClientRequest? request; - HttpClientResponse? response; - - try { - request = await client.openUrl("OPTIONS", uri).timeout(Duration(seconds: 10)); - - request.headers.set(HttpHeaders.acceptHeader, 'application/json'); - request.headers.set(HttpHeaders.acceptLanguageHeader, Intl.getCurrentLocale()); - request.headers.set(HttpHeaders.contentTypeHeader, 'application/json'); - request.headers.set(HttpHeaders.authorizationHeader, _authorizationHeader()); - - response = await request.close().timeout(Duration(seconds: 10)); - } on SocketException catch (error) { - showServerError(L10().connectionRefused, error.toString()); - return null; - } on TimeoutException { - showTimeoutError(); - return null; - } catch (error, stackTrace) { - showServerError(L10().serverError, error.toString()); - sentryReportError(error, stackTrace); - return null; - } - - var responseData = await responseToJson(response); - - return responseData; + return completeRequest(request); } /** * Perform a HTTP POST request * Returns a json object (or null if unsuccessful) */ - Future post(String url, {Map body = const {}, int expectedStatusCode=201}) async { + Future post(String url, {Map body = const {}, int expectedStatusCode=201}) async { - var _url = makeApiUrl(url); + HttpClientRequest? request = await apiRequest(url, "POST"); - print("POST: ${_url} -> ${body.toString()}"); - - var client = createClient(true); - - final uri = Uri.parse(_url); - - if (uri.host.isEmpty) { - showServerError(L10().invalidHost, L10().invalidHostDetails); - return null; + if (request == null) { + // Return an "invalid" APIResponse + return new APIResponse( + url: url, + method: 'POST' + ); } - HttpClientRequest? request; - - try { - // Open a connection to the server - request = await client.postUrl(uri).timeout(Duration(seconds: 10)); - } on SocketException catch (error) { - showServerError( - L10().connectionRefused, - error.toString() - ); - return null; - } on TimeoutException { - showTimeoutError(); - return null; - } catch (error, stackTrace) { - - showServerError( - L10().serverError, - error.toString() - ); - - sentryReportError(error, stackTrace); - - return null; - } - - var data = json.encode(body); - - // Set headers - // Ref: https://stackoverflow.com/questions/59713003/body-not-sending-using-map-in-flutter - request.headers.set(HttpHeaders.acceptHeader, 'application/json'); - request.headers.set(HttpHeaders.contentTypeHeader, 'application/json'); - request.headers.set(HttpHeaders.acceptLanguageHeader, Intl.getCurrentLocale()); - request.headers.set(HttpHeaders.contentLengthHeader, data.length.toString()); - request.headers.set(HttpHeaders.authorizationHeader, _authorizationHeader()); - - // Add JSON data to the request - request.add(utf8.encode(data)); - - HttpClientResponse? response; - - try { - response = await request.close().timeout(Duration(seconds: 10)); - } on SocketException catch (error) { - showServerError( - L10().connectionRefused, - error.toString() - ); - return null; - } on TimeoutException { - showTimeoutError(); - return null; - } catch (error, stackTrace) { - showServerError( - L10().serverError, - error.toString() - ); - - sentryReportError(error, stackTrace); - return null; - } - - var responseData = await responseToJson(response); - - if (response.statusCode != expectedStatusCode) { - showStatusCodeError(response.statusCode); - - print("POST to ${_url} returned status code ${response.statusCode}"); - print("Data:"); - print(responseData); - - // Server error - if (response.statusCode >= 500) { - sentryReportMessage( - "Server error on POST request", - context: { - "url": _url, - "statusCode": "${response.statusCode}", - "response": responseData.toString(), - "request": body.toString(), - } - ); - } - - return null; - } - - return responseData; + return completeRequest( + request, + data: json.encode(body), + statusCode: expectedStatusCode + ); } HttpClient createClient(bool allowBadCert) { @@ -750,20 +567,21 @@ class InvenTreeAPI { } /** - * Perform a HTTP GET request, - * and return the Response object - * (or null if the request fails) + * Initiate a HTTP request to the server + * + * @param url is the API endpoint + * @param method is the HTTP method e.g. 'POST' / 'PATCH' / 'GET' etc; + * @param params is the request parameters */ - Future getResponse(String url, {Map params = const {}}) async { + Future apiRequest(String url, String method, {Map urlParams = const {}}) async { + var _url = makeApiUrl(url); - print("GET: ${_url}"); + // Add any required query parameters to the URL using ?key=value notation + if (urlParams.isNotEmpty) { + String query = "?"; - // If query parameters are supplied, form a query string - if (params.isNotEmpty) { - String query = '?'; - - params.forEach((K, V) => query += K + '=' + V + '&'); + urlParams.forEach((k, v) => query += "${k}=${v}&"); _url += query; } @@ -773,70 +591,106 @@ class InvenTreeAPI { _url = _url.substring(0, _url.length - 1); } + Uri? _uri = Uri.tryParse(_url); + + print("apiRequest ${method} -> ${url}"); + + if (_uri == null) { + showServerError(L10().invalidHost, L10().invalidHostDetails); + return null; + } + + if (_uri.host.isEmpty) { + showServerError(L10().invalidHost, L10().invalidHostDetails); + return null; + } + + HttpClientRequest? _request; + var client = createClient(true); - Uri? uri = Uri.tryParse(_url); - - if (uri == null) { - showServerError(L10().invalidHost, L10().invalidHostDetails); - return null; - } - - // Check for invalid host - if (uri.host.isEmpty) { - showServerError(L10().invalidHost, L10().invalidHostDetails); - return null; - } - - HttpClientRequest? request; - + // Attempt to open a connection to the server try { - // Open a connection - request = await client.getUrl(uri).timeout(Duration(seconds: 10)); - } on TimeoutException { - showTimeoutError(); - return null; + _request = await client.openUrl(method, _uri).timeout(Duration(seconds: 10)); + + // Set headers + _request.headers.set(HttpHeaders.authorizationHeader, _authorizationHeader()); + _request.headers.set(HttpHeaders.acceptHeader, 'application/json'); + _request.headers.set(HttpHeaders.contentTypeHeader, 'application/json'); + _request.headers.set(HttpHeaders.acceptLanguageHeader, Intl.getCurrentLocale()); + + return _request; } on SocketException catch (error) { showServerError(L10().connectionRefused, error.toString()); return null; - } on FormatException { - showServerError(L10().invalidHost, L10().invalidHostDetails); - return null; - } catch (error, stackTrace) { - sentryReportError(error, stackTrace); - showServerError(L10().serverError, error.toString()); - return null; - } - - // Set connection headers - request.headers.set(HttpHeaders.acceptHeader, 'application/json'); - request.headers.set(HttpHeaders.contentTypeHeader, 'application/json'); - request.headers.set(HttpHeaders.acceptLanguageHeader, Intl.getCurrentLocale()); - request.headers.set(HttpHeaders.authorizationHeader, _authorizationHeader()); - - try { - HttpClientResponse response = await request.close().timeout(Duration(seconds: 10)); - return response; - } on TimeoutException { showTimeoutError(); return null; - } on SocketException catch (error) { - showServerError(L10().connectionRefused, error.toString()); - return null; } catch (error, stackTrace) { - - showServerError( - L10().serverError, - error.toString() - ); - - sentryReportError(error, stackTrace); - + showServerError(L10().serverError, error.toString()); + sentryReportError(error, stackTrace); return null; } } + + /** + * Complete an API request, and return an APIResponse object + */ + Future completeRequest(HttpClientRequest request, {String? data, int? statusCode}) async { + + if (data != null && data.isNotEmpty) { + request.headers.set(HttpHeaders.contentLengthHeader, data.length.toString()); + request.add(utf8.encode(data)); + } + + APIResponse response = new APIResponse( + method: request.method, + url: request.uri.toString() + ); + + try { + HttpClientResponse? _response = await request.close().timeout(Duration(seconds: 10)); + + response.statusCode = _response.statusCode; + response.data = await responseToJson(_response); + + // Expected status code not returned + if ((statusCode != null) && (statusCode != _response.statusCode)) { + showStatusCodeError(_response.statusCode); + } + + // Report any server errors + if (_response.statusCode >= 500) { + sentryReportMessage( + "Server error", + context: { + "url": request.uri.toString(), + "method": request.method, + "statusCode": _response.statusCode.toString(), + "requestHeaders": request.headers.toString(), + "responseHeaders": _response.headers.toString(), + "responseData": response.data.toString(), + } + ); + } + + } on SocketException catch (error) { + showServerError(L10().connectionRefused, error.toString()); + } on TimeoutException { + showTimeoutError(); + } catch (error, stackTrace) { + showServerError(L10().serverError, error.toString()); + sentryReportError(error, stackTrace); + } + + return response; + + } + + /** + * Convert a HttpClientResponse response object to JSON + */ dynamic responseToJson(HttpClientResponse response) async { String body = await response.transform(utf8.decoder).join(); @@ -872,55 +726,37 @@ class InvenTreeAPI { * Perform a HTTP GET request * Returns a json object (or null if did not complete) */ - Future get(String url, {Map params = const {}, int expectedStatusCode=200}) async { + Future get(String url, {Map params = const {}, int expectedStatusCode=200}) async { - var response = await getResponse(url, params: params); + HttpClientRequest? request = await apiRequest( + url, + "GET", + urlParams: params, + ); - // A null response means something has gone wrong... - if (response == null) { - print("null response from GET ${url}"); - return null; + if (request == null) { + // Return an "invalid" APIResponse + return new APIResponse( + url: url, + method: 'GET', + ); } - var responseData = await responseToJson(response); - - // Check the status code of the response - if (response.statusCode != expectedStatusCode) { - showStatusCodeError(response.statusCode); - - // Server error - if (response.statusCode >= 500) { - sentryReportMessage( - "Server error on GET request", - context: { - "url": url, - "statusCode": "${response.statusCode}", - "response": responseData.toString(), - "params": params.toString(), - } - ); - } - - return null; - } - - return responseData; + return completeRequest(request); } + // Return a list of request headers Map defaultHeaders() { var headers = Map(); headers[HttpHeaders.authorizationHeader] = _authorizationHeader(); + headers[HttpHeaders.acceptHeader] = 'application/json'; + headers[HttpHeaders.contentTypeHeader] = 'application/json'; + headers[HttpHeaders.acceptLanguageHeader] = Intl.getCurrentLocale(); return headers; } - Map jsonHeaders() { - var headers = defaultHeaders(); - headers['Content-Type'] = 'application/json'; - return headers; - } - String _authorizationHeader() { if (_token.isNotEmpty) { return "Token $_token"; @@ -965,4 +801,4 @@ class InvenTreeAPI { cacheManager: manager, ); } -} \ No newline at end of file +} diff --git a/lib/app_settings.dart b/lib/app_settings.dart index 062c7a9e..7146b91b 100644 --- a/lib/app_settings.dart +++ b/lib/app_settings.dart @@ -3,7 +3,7 @@ */ import 'package:sembast/sembast.dart'; -import 'package:InvenTree/preferences.dart'; +import 'package:inventree/preferences.dart'; class InvenTreeSettingsManager { diff --git a/lib/barcode.dart b/lib/barcode.dart index d43707c4..7f361e9b 100644 --- a/lib/barcode.dart +++ b/lib/barcode.dart @@ -1,6 +1,6 @@ -import 'package:InvenTree/app_settings.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/snacks.dart'; +import 'package:inventree/app_settings.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/snacks.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -9,15 +9,15 @@ import 'package:one_context/one_context.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; -import 'package:InvenTree/inventree/stock.dart'; -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/inventree/stock.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/l10.dart'; -import 'package:InvenTree/api.dart'; +import 'package:inventree/api.dart'; -import 'package:InvenTree/widget/location_display.dart'; -import 'package:InvenTree/widget/part_detail.dart'; -import 'package:InvenTree/widget/stock_detail.dart'; +import 'package:inventree/widget/location_display.dart'; +import 'package:inventree/widget/part_detail.dart'; +import 'package:inventree/widget/stock_detail.dart'; import 'dart:io'; @@ -92,7 +92,7 @@ class BarcodeHandler { print("Scanned barcode data: ${barcode}"); - var data = await InvenTreeAPI().post( + var response = await InvenTreeAPI().post( url, body: { "barcode": barcode, @@ -100,19 +100,19 @@ class BarcodeHandler { expectedStatusCode: 200 ); - if (data == null) { + if (!response.isValid()) { return; } - if (data.containsKey('error')) { + if (response.data.containsKey('error')) { _controller?.resumeCamera(); - onBarcodeUnknown(data); - } else if (data.containsKey('success')) { + onBarcodeUnknown(response.data); + } else if (response.data.containsKey('success')) { _controller?.resumeCamera(); - onBarcodeMatched(data); + onBarcodeMatched(response.data); } else { _controller?.resumeCamera(); - onBarcodeUnhandled(data); + onBarcodeUnhandled(response.data); } } } diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 3cc6b916..90f6d4ce 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:InvenTree/api.dart'; +import 'package:inventree/api.dart'; import 'package:flutter/cupertino.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -149,13 +149,13 @@ class InvenTreeModel { */ Future reload() async { - var response = await api.get(url, params: defaultGetFilters()); + var response = await api.get(url, params: defaultGetFilters(), expectedStatusCode: 200); - if (response == null) { + if (!response.isValid()) { return false; } - jsondata = response; + jsondata = response.data; return true; } @@ -163,19 +163,21 @@ class InvenTreeModel { // POST data to update the model Future update({Map values = const {}}) async { - var addr = path.join(URL, pk.toString()); + var url = path.join(URL, pk.toString()); - if (!addr.endsWith("/")) { - addr += "/"; + if (!url.endsWith("/")) { + url += "/"; } var response = await api.patch( - addr, + url, body: values, expectedStatusCode: 200 ); - if (response == null) return false; + if (!response.isValid()) { + return false; + } return true; } @@ -199,15 +201,13 @@ class InvenTreeModel { params[key] = filters[key] ?? ''; } - print("GET: $url ${params.toString()}"); - var response = await api.get(url, params: params); - if (response == null) { + if (!response.isValid()) { return null; } - return createFromJson(response); + return createFromJson(response.data); } Future create(Map data) async { @@ -224,11 +224,12 @@ class InvenTreeModel { var response = await api.post(URL, body: data); - if (response == null) { + // Invalid response returned from server + if (!response.isValid()) { return null; } - return createFromJson(response); + return createFromJson(response.data); } Future listPaginated(int limit, int offset, {Map filters = const {}}) async { @@ -243,19 +244,19 @@ class InvenTreeModel { var response = await api.get(URL, params: params); - if (response == null) { + if (!response.isValid()) { return null; } // Construct the response InvenTreePageResponse page = new InvenTreePageResponse(); - if (response.containsKey("count") && response.containsKey("results")) { - page.count = response["count"] as int; + if (response.data.containsKey("count") && response.data.containsKey("results")) { + page.count = response.data["count"] as int; page.results = []; - for (var result in response["results"]) { + for (var result in response.data["results"]) { page.addResult(createFromJson(result)); } @@ -282,7 +283,7 @@ class InvenTreeModel { // A list of "InvenTreeModel" items List results = []; - if (response == null) { + if (!response.isValid()) { return results; } @@ -290,7 +291,7 @@ class InvenTreeModel { // - No data receieved // - Data is not a list of maps - for (var d in response) { + for (var d in response.data) { // Create a new object (of the current class type InvenTreeModel obj = createFromJson(d); diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index 22bee60f..d41ee1e7 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -1,7 +1,7 @@ -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/inventree/stock.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/inventree/stock.dart'; import 'package:flutter/cupertino.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'model.dart'; import 'dart:io'; diff --git a/lib/inventree/sentry.dart b/lib/inventree/sentry.dart index 4e4e4f2a..3d21160e 100644 --- a/lib/inventree/sentry.dart +++ b/lib/inventree/sentry.dart @@ -4,7 +4,7 @@ import 'package:device_info/device_info.dart'; import 'package:package_info/package_info.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; -import 'package:InvenTree/api.dart'; +import 'package:inventree/api.dart'; Future> getDeviceInfo() async { diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index 4242d79b..865aa88b 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -1,14 +1,14 @@ -import 'package:InvenTree/inventree/part.dart'; +import 'package:inventree/inventree/part.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart' as http; import 'model.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'dart:async'; import 'dart:io'; -import 'package:InvenTree/api.dart'; +import 'package:inventree/api.dart'; class InvenTreeStockItemTestResult extends InvenTreeModel { diff --git a/lib/main.dart b/lib/main.dart index ecf7097c..56a77df2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,10 @@ import 'dart:async'; -import 'package:InvenTree/inventree/sentry.dart'; +import 'package:inventree/inventree/sentry.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:InvenTree/widget/home.dart'; +import 'package:inventree/widget/home.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:one_context/one_context.dart'; diff --git a/lib/settings/about.dart b/lib/settings/about.dart index 5403be96..572eb1f5 100644 --- a/lib/settings/about.dart +++ b/lib/settings/about.dart @@ -1,5 +1,5 @@ -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/settings/release.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/settings/release.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -7,7 +7,7 @@ import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:package_info/package_info.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; class InvenTreeAboutWidget extends StatelessWidget { diff --git a/lib/settings/app_settings.dart b/lib/settings/app_settings.dart index d7754cbc..ddad7fd6 100644 --- a/lib/settings/app_settings.dart +++ b/lib/settings/app_settings.dart @@ -2,11 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/app_settings.dart'; +import 'package:inventree/app_settings.dart'; class InvenTreeAppSettingsWidget extends StatefulWidget { @override diff --git a/lib/settings/login.dart b/lib/settings/login.dart index 4ecb26d9..977e558c 100644 --- a/lib/settings/login.dart +++ b/lib/settings/login.dart @@ -1,11 +1,11 @@ -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/fields.dart'; -import 'package:InvenTree/widget/spinner.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/fields.dart'; +import 'package:inventree/widget/spinner.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import '../api.dart'; import '../user_profile.dart'; diff --git a/lib/settings/release.dart b/lib/settings/release.dart index 5664ea2c..aa456d7c 100644 --- a/lib/settings/release.dart +++ b/lib/settings/release.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; class ReleaseNotesWidget extends StatelessWidget { diff --git a/lib/settings/settings.dart b/lib/settings/settings.dart index 635d5ddb..90f769d1 100644 --- a/lib/settings/settings.dart +++ b/lib/settings/settings.dart @@ -1,13 +1,13 @@ -import 'package:InvenTree/inventree/sentry.dart'; -import 'package:InvenTree/settings/about.dart'; -import 'package:InvenTree/settings/app_settings.dart'; -import 'package:InvenTree/settings/login.dart'; -import 'package:InvenTree/widget/snacks.dart'; -import 'package:InvenTree/widget/dialogs.dart'; +import 'package:inventree/inventree/sentry.dart'; +import 'package:inventree/settings/about.dart'; +import 'package:inventree/settings/app_settings.dart'; +import 'package:inventree/settings/login.dart'; +import 'package:inventree/widget/snacks.dart'; +import 'package:inventree/widget/dialogs.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/widget/category_display.dart b/lib/widget/category_display.dart index 4abdccf8..62ac1ad7 100644 --- a/lib/widget/category_display.dart +++ b/lib/widget/category_display.dart @@ -1,19 +1,19 @@ -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/app_settings.dart'; -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/inventree/sentry.dart'; -import 'package:InvenTree/widget/progress.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/app_settings.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/inventree/sentry.dart'; +import 'package:inventree/widget/progress.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; -import 'package:InvenTree/widget/fields.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/snacks.dart'; -import 'package:InvenTree/widget/part_detail.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; -import 'package:InvenTree/widget/paginator.dart'; +import 'package:inventree/widget/fields.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/snacks.dart'; +import 'package:inventree/widget/part_detail.dart'; +import 'package:inventree/widget/refreshable_state.dart'; +import 'package:inventree/widget/paginator.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/widget/company_detail.dart b/lib/widget/company_detail.dart index c5741fe7..1b7c2e72 100644 --- a/lib/widget/company_detail.dart +++ b/lib/widget/company_detail.dart @@ -1,13 +1,13 @@ -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/inventree/company.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/fields.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/inventree/company.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/fields.dart'; +import 'package:inventree/widget/refreshable_state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; class CompanyDetailWidget extends StatefulWidget { diff --git a/lib/widget/company_list.dart b/lib/widget/company_list.dart index 090784d3..29ec6a10 100644 --- a/lib/widget/company_list.dart +++ b/lib/widget/company_list.dart @@ -1,11 +1,11 @@ -import 'package:InvenTree/widget/company_detail.dart'; +import 'package:inventree/widget/company_detail.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/inventree/company.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/inventree/company.dart'; +import 'package:inventree/widget/refreshable_state.dart'; abstract class CompanyListWidget extends StatefulWidget { diff --git a/lib/widget/dialogs.dart b/lib/widget/dialogs.dart index dfa7edcf..4490329e 100644 --- a/lib/widget/dialogs.dart +++ b/lib/widget/dialogs.dart @@ -1,11 +1,11 @@ -import 'package:InvenTree/app_settings.dart'; -import 'package:InvenTree/widget/snacks.dart'; +import 'package:inventree/app_settings.dart'; +import 'package:inventree/widget/snacks.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'package:one_context/one_context.dart'; Future confirmationDialog(String title, String text, {String? acceptText, String? rejectText, Function? onAccept, Function? onReject}) async { diff --git a/lib/widget/drawer.dart b/lib/widget/drawer.dart index c0f642fd..6f6f6bbb 100644 --- a/lib/widget/drawer.dart +++ b/lib/widget/drawer.dart @@ -1,14 +1,14 @@ -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/barcode.dart'; -import 'package:InvenTree/widget/company_list.dart'; -import 'package:InvenTree/widget/search.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/barcode.dart'; +import 'package:inventree/widget/company_list.dart'; +import 'package:inventree/widget/search.dart'; import 'package:flutter/material.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; -import 'package:InvenTree/widget/category_display.dart'; -import 'package:InvenTree/widget/location_display.dart'; +import 'package:inventree/widget/category_display.dart'; +import 'package:inventree/widget/location_display.dart'; -import 'package:InvenTree/settings/settings.dart'; +import 'package:inventree/settings/settings.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; class InvenTreeDrawer extends StatelessWidget { diff --git a/lib/widget/fields.dart b/lib/widget/fields.dart index 53126604..6d004a43 100644 --- a/lib/widget/fields.dart +++ b/lib/widget/fields.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'dart:async'; import 'dart:io'; diff --git a/lib/widget/full_screen_image.dart b/lib/widget/full_screen_image.dart index 85f36269..070b1945 100644 --- a/lib/widget/full_screen_image.dart +++ b/lib/widget/full_screen_image.dart @@ -1,5 +1,5 @@ -import 'package:InvenTree/api.dart'; +import 'package:inventree/api.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/widget/home.dart b/lib/widget/home.dart index dd466447..1c5bc55d 100644 --- a/lib/widget/home.dart +++ b/lib/widget/home.dart @@ -1,4 +1,4 @@ -import 'package:InvenTree/user_profile.dart'; +import 'package:inventree/user_profile.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -6,17 +6,17 @@ import 'file:///C:/inventree-app/lib/l10.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/barcode.dart'; -import 'package:InvenTree/api.dart'; +import 'package:inventree/barcode.dart'; +import 'package:inventree/api.dart'; -import 'package:InvenTree/settings/login.dart'; +import 'package:inventree/settings/login.dart'; -import 'package:InvenTree/widget/category_display.dart'; -import 'package:InvenTree/widget/company_list.dart'; -import 'package:InvenTree/widget/location_display.dart'; -import 'package:InvenTree/widget/search.dart'; -import 'package:InvenTree/widget/spinner.dart'; -import 'package:InvenTree/widget/drawer.dart'; +import 'package:inventree/widget/category_display.dart'; +import 'package:inventree/widget/company_list.dart'; +import 'package:inventree/widget/location_display.dart'; +import 'package:inventree/widget/search.dart'; +import 'package:inventree/widget/spinner.dart'; +import 'package:inventree/widget/drawer.dart'; class InvenTreeHomePage extends StatefulWidget { InvenTreeHomePage({Key? key}) : super(key: key); diff --git a/lib/widget/location_display.dart b/lib/widget/location_display.dart index ed053cd2..ae8d1692 100644 --- a/lib/widget/location_display.dart +++ b/lib/widget/location_display.dart @@ -1,17 +1,17 @@ -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/app_settings.dart'; -import 'package:InvenTree/barcode.dart'; -import 'package:InvenTree/inventree/sentry.dart'; -import 'package:InvenTree/inventree/stock.dart'; -import 'package:InvenTree/widget/progress.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/app_settings.dart'; +import 'package:inventree/barcode.dart'; +import 'package:inventree/inventree/sentry.dart'; +import 'package:inventree/inventree/stock.dart'; +import 'package:inventree/widget/progress.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; -import 'package:InvenTree/widget/fields.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/snacks.dart'; -import 'package:InvenTree/widget/stock_detail.dart'; -import 'package:InvenTree/widget/paginator.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/widget/refreshable_state.dart'; +import 'package:inventree/widget/fields.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/snacks.dart'; +import 'package:inventree/widget/stock_detail.dart'; +import 'package:inventree/widget/paginator.dart'; +import 'package:inventree/l10.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widget/paginator.dart b/lib/widget/paginator.dart index a4d0e863..6ab9c337 100644 --- a/lib/widget/paginator.dart +++ b/lib/widget/paginator.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; class PaginatedSearchWidget extends StatelessWidget { diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index d301e3f6..327ce958 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -7,16 +7,16 @@ import 'package:InvenTree/widget/snacks.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/widget/full_screen_image.dart'; -import 'package:InvenTree/widget/category_display.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/fields.dart'; -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/widget/full_screen_image.dart'; +import 'package:inventree/widget/category_display.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/fields.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/widget/refreshable_state.dart'; import 'location_display.dart'; @@ -558,4 +558,4 @@ class _PartDisplayState extends RefreshableState { Widget getBody(BuildContext context) { return getSelectedWidget(tabIndex); } -} \ No newline at end of file +} diff --git a/lib/widget/part_notes.dart b/lib/widget/part_notes.dart index 929cbaa6..31a5ae0a 100644 --- a/lib/widget/part_notes.dart +++ b/lib/widget/part_notes.dart @@ -1,8 +1,8 @@ -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/widget/refreshable_state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; class PartNotesWidget extends StatefulWidget { diff --git a/lib/widget/refreshable_state.dart b/lib/widget/refreshable_state.dart index e6589959..27b0d6a6 100644 --- a/lib/widget/refreshable_state.dart +++ b/lib/widget/refreshable_state.dart @@ -1,4 +1,4 @@ -import 'package:InvenTree/widget/drawer.dart'; +import 'package:inventree/widget/drawer.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/widget/search.dart b/lib/widget/search.dart index f6fb1c1b..d010c1df 100644 --- a/lib/widget/search.dart +++ b/lib/widget/search.dart @@ -1,15 +1,15 @@ -import 'package:InvenTree/widget/part_detail.dart'; -import 'package:InvenTree/widget/progress.dart'; -import 'package:InvenTree/widget/snacks.dart'; -import 'package:InvenTree/widget/stock_detail.dart'; +import 'package:inventree/widget/part_detail.dart'; +import 'package:inventree/widget/progress.dart'; +import 'package:inventree/widget/snacks.dart'; +import 'package:inventree/widget/stock_detail.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/inventree/stock.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/inventree/stock.dart'; import '../api.dart'; diff --git a/lib/widget/snacks.dart b/lib/widget/snacks.dart index 2856cd99..7d3e1578 100644 --- a/lib/widget/snacks.dart +++ b/lib/widget/snacks.dart @@ -12,7 +12,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:one_context/one_context.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; void showSnackIcon(String text, {IconData? icon, Function()? onAction, bool? success, String? actionText}) { diff --git a/lib/widget/starred_parts.dart b/lib/widget/starred_parts.dart index a571b2fe..df439f79 100644 --- a/lib/widget/starred_parts.dart +++ b/lib/widget/starred_parts.dart @@ -1,13 +1,13 @@ -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/widget/part_detail.dart'; -import 'package:InvenTree/widget/progress.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/widget/part_detail.dart'; +import 'package:inventree/widget/progress.dart'; +import 'package:inventree/widget/refreshable_state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import '../api.dart'; @@ -35,11 +35,9 @@ class _StarredPartState extends RefreshableState { starredParts.clear(); - if (parts != null) { - for (int idx = 0; idx < parts.length; idx++) { - if (parts[idx] is InvenTreePart) { - starredParts.add(parts[idx] as InvenTreePart); - } + for (int idx = 0; idx < parts.length; idx++) { + if (parts[idx] is InvenTreePart) { + starredParts.add(parts[idx] as InvenTreePart); } } } diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index d8ef4a17..fd50798c 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -1,24 +1,21 @@ - -import 'dart:io'; - -import 'package:InvenTree/barcode.dart'; -import 'package:InvenTree/inventree/stock.dart'; -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/fields.dart'; -import 'package:InvenTree/widget/location_display.dart'; -import 'package:InvenTree/widget/part_detail.dart'; -import 'package:InvenTree/widget/progress.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; -import 'package:InvenTree/widget/snacks.dart'; -import 'package:InvenTree/widget/stock_item_test_results.dart'; -import 'package:InvenTree/widget/stock_notes.dart'; +import 'package:inventree/barcode.dart'; +import 'package:inventree/inventree/stock.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/fields.dart'; +import 'package:inventree/widget/location_display.dart'; +import 'package:inventree/widget/part_detail.dart'; +import 'package:inventree/widget/progress.dart'; +import 'package:inventree/widget/refreshable_state.dart'; +import 'package:inventree/widget/snacks.dart'; +import 'package:inventree/widget/stock_item_test_results.dart'; +import 'package:inventree/widget/stock_notes.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; -import 'package:InvenTree/api.dart'; +import 'package:inventree/api.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; diff --git a/lib/widget/stock_item_test_results.dart b/lib/widget/stock_item_test_results.dart index 4015742e..0851224e 100644 --- a/lib/widget/stock_item_test_results.dart +++ b/lib/widget/stock_item_test_results.dart @@ -1,19 +1,19 @@ -import 'package:InvenTree/inventree/part.dart'; -import 'package:InvenTree/inventree/stock.dart'; -import 'package:InvenTree/inventree/model.dart'; -import 'package:InvenTree/api.dart'; -import 'package:InvenTree/widget/dialogs.dart'; -import 'package:InvenTree/widget/fields.dart'; -import 'package:InvenTree/widget/progress.dart'; -import 'package:InvenTree/widget/snacks.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/inventree/stock.dart'; +import 'package:inventree/inventree/model.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/widget/dialogs.dart'; +import 'package:inventree/widget/fields.dart'; +import 'package:inventree/widget/progress.dart'; +import 'package:inventree/widget/snacks.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:inventree/widget/refreshable_state.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; diff --git a/lib/widget/stock_notes.dart b/lib/widget/stock_notes.dart index b07159c7..2fb5d3b7 100644 --- a/lib/widget/stock_notes.dart +++ b/lib/widget/stock_notes.dart @@ -1,9 +1,9 @@ -import 'package:InvenTree/inventree/stock.dart'; -import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:inventree/inventree/stock.dart'; +import 'package:inventree/widget/refreshable_state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; -import 'package:InvenTree/l10.dart'; +import 'package:inventree/l10.dart'; class StockNotesWidget extends StatefulWidget { diff --git a/pubspec.yaml b/pubspec.yaml index ea2225a9..0d94a7a7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,4 +1,4 @@ -name: InvenTree +name: inventree description: InvenTree stock management # In Android, build-name is used as versionName while build-number used as versionCode. @@ -7,7 +7,7 @@ description: InvenTree stock management # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.2.7+15 +version: 0.2.8+16 environment: sdk: ">=2.12.0 <3.0.0"