mirror of
https://github.com/inventree/inventree-app.git
synced 2025-06-13 02:35:27 +00:00
More fixes for null safety support
This commit is contained in:
43
lib/api.dart
43
lib/api.dart
@ -423,14 +423,12 @@ class InvenTreeAPI {
|
|||||||
|
|
||||||
|
|
||||||
// Perform a PATCH request
|
// Perform a PATCH request
|
||||||
Future<dynamic> patch(String url, {Map<String, String>? body, int expectedStatusCode=200}) async {
|
Future<dynamic> patch(String url, {Map<String, String> body = const {}, int expectedStatusCode=200}) async {
|
||||||
var _url = makeApiUrl(url);
|
var _url = makeApiUrl(url);
|
||||||
var _body = Map<String, String>();
|
var _body = Map<String, String>();
|
||||||
|
|
||||||
// Copy across provided data
|
// Copy across provided data
|
||||||
if (body != null) {
|
body.forEach((K, V) => _body[K] = V);
|
||||||
body.forEach((K, V) => _body[K] = V);
|
|
||||||
}
|
|
||||||
|
|
||||||
print("PATCH: " + _url);
|
print("PATCH: " + _url);
|
||||||
|
|
||||||
@ -512,18 +510,18 @@ class InvenTreeAPI {
|
|||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (response == null) {
|
var responseData = await responseToJson(response);
|
||||||
print("null response from PATCH ${_url}");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response.statusCode != expectedStatusCode) {
|
if (response.statusCode != expectedStatusCode) {
|
||||||
showStatusCodeError(response.statusCode);
|
showStatusCodeError(response.statusCode);
|
||||||
|
|
||||||
|
print("PATCH to ${_url} returned status code ${response.statusCode}");
|
||||||
|
print("Data:");
|
||||||
|
print(responseData);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var responseData = await responseToJson(response);
|
|
||||||
|
|
||||||
return responseData;
|
return responseData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,7 +556,7 @@ class InvenTreeAPI {
|
|||||||
* Perform a HTTP POST request
|
* Perform a HTTP POST request
|
||||||
* Returns a json object (or null if unsuccessful)
|
* Returns a json object (or null if unsuccessful)
|
||||||
*/
|
*/
|
||||||
Future<dynamic> post(String url, {Map<String, dynamic>? body, int expectedStatusCode=201}) async {
|
Future<dynamic> post(String url, {Map<String, dynamic> body = const {}, int expectedStatusCode=201}) async {
|
||||||
|
|
||||||
var _url = makeApiUrl(url);
|
var _url = makeApiUrl(url);
|
||||||
|
|
||||||
@ -600,10 +598,6 @@ class InvenTreeAPI {
|
|||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (request == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = json.encode(body);
|
var data = json.encode(body);
|
||||||
|
|
||||||
// Set headers
|
// Set headers
|
||||||
@ -647,13 +641,18 @@ class InvenTreeAPI {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var responseData = await responseToJson(response);
|
||||||
|
|
||||||
if (response.statusCode != expectedStatusCode) {
|
if (response.statusCode != expectedStatusCode) {
|
||||||
showStatusCodeError(response.statusCode);
|
showStatusCodeError(response.statusCode);
|
||||||
|
|
||||||
|
print("POST to ${_url} returned status code ${response.statusCode}");
|
||||||
|
print("Data:");
|
||||||
|
print(responseData);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var responseData = await responseToJson(response);
|
|
||||||
|
|
||||||
return responseData;
|
return responseData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -690,13 +689,13 @@ class InvenTreeAPI {
|
|||||||
* and return the Response object
|
* and return the Response object
|
||||||
* (or null if the request fails)
|
* (or null if the request fails)
|
||||||
*/
|
*/
|
||||||
Future<HttpClientResponse?> getResponse(String url, {Map<String, String>? params}) async {
|
Future<HttpClientResponse?> getResponse(String url, {Map<String, String> params = const {}}) async {
|
||||||
var _url = makeApiUrl(url);
|
var _url = makeApiUrl(url);
|
||||||
|
|
||||||
print("GET: ${_url}");
|
print("GET: ${_url}");
|
||||||
|
|
||||||
// If query parameters are supplied, form a query string
|
// If query parameters are supplied, form a query string
|
||||||
if (params != null && params.isNotEmpty) {
|
if (params.isNotEmpty) {
|
||||||
String query = '?';
|
String query = '?';
|
||||||
|
|
||||||
params.forEach((K, V) => query += K + '=' + V + '&');
|
params.forEach((K, V) => query += K + '=' + V + '&');
|
||||||
@ -785,10 +784,6 @@ class InvenTreeAPI {
|
|||||||
|
|
||||||
dynamic responseToJson(HttpClientResponse response) async {
|
dynamic responseToJson(HttpClientResponse response) async {
|
||||||
|
|
||||||
if (response == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String body = await response.transform(utf8.decoder).join();
|
String body = await response.transform(utf8.decoder).join();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -813,7 +808,7 @@ class InvenTreeAPI {
|
|||||||
* Perform a HTTP GET request
|
* Perform a HTTP GET request
|
||||||
* Returns a json object (or null if did not complete)
|
* Returns a json object (or null if did not complete)
|
||||||
*/
|
*/
|
||||||
Future<dynamic> get(String url, {Map<String, String>? params, int expectedStatusCode=200}) async {
|
Future<dynamic> get(String url, {Map<String, String> params = const {}, int expectedStatusCode=200}) async {
|
||||||
|
|
||||||
var response = await getResponse(url, params: params);
|
var response = await getResponse(url, params: params);
|
||||||
|
|
||||||
|
@ -142,11 +142,7 @@ class InvenTreeModel {
|
|||||||
|
|
||||||
|
|
||||||
// Search this Model type in the database
|
// Search this Model type in the database
|
||||||
Future<List<InvenTreeModel>> search(BuildContext context, String searchTerm, {Map<String, String>? filters}) async {
|
Future<List<InvenTreeModel>> search(BuildContext context, String searchTerm, {Map<String, String> filters = const {}}) async {
|
||||||
|
|
||||||
if (filters == null) {
|
|
||||||
filters = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
filters["search"] = searchTerm;
|
filters["search"] = searchTerm;
|
||||||
|
|
||||||
@ -178,7 +174,7 @@ class InvenTreeModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// POST data to update the model
|
// POST data to update the model
|
||||||
Future<bool> update({Map<String, String>? values}) async {
|
Future<bool> update({Map<String, String> values = const {}}) async {
|
||||||
|
|
||||||
var addr = path.join(URL, pk.toString());
|
var addr = path.join(URL, pk.toString());
|
||||||
|
|
||||||
@ -198,7 +194,7 @@ class InvenTreeModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return the detail view for the associated pk
|
// Return the detail view for the associated pk
|
||||||
Future<InvenTreeModel?> get(int pk, {Map<String, String>? filters}) async {
|
Future<InvenTreeModel?> get(int pk, {Map<String, String> filters = const {}}) async {
|
||||||
|
|
||||||
// TODO - Add "timeout"
|
// TODO - Add "timeout"
|
||||||
// TODO - Add error catching
|
// TODO - Add error catching
|
||||||
@ -211,11 +207,9 @@ class InvenTreeModel {
|
|||||||
|
|
||||||
var params = defaultGetFilters();
|
var params = defaultGetFilters();
|
||||||
|
|
||||||
if (filters != null) {
|
// Override any default values
|
||||||
// Override any default values
|
for (String key in filters.keys) {
|
||||||
for (String key in filters.keys) {
|
params[key] = filters[key] ?? '';
|
||||||
params[key] = filters[key] ?? '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
print("GET: $url ${params.toString()}");
|
print("GET: $url ${params.toString()}");
|
||||||
@ -250,13 +244,11 @@ class InvenTreeModel {
|
|||||||
return createFromJson(response);
|
return createFromJson(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<InvenTreePageResponse?> listPaginated(int limit, int offset, {Map<String, String>? filters = null}) async {
|
Future<InvenTreePageResponse?> listPaginated(int limit, int offset, {Map<String, String> filters = const {}}) async {
|
||||||
var params = defaultListFilters();
|
var params = defaultListFilters();
|
||||||
|
|
||||||
if (filters != null) {
|
for (String key in filters.keys) {
|
||||||
for (String key in filters.keys) {
|
params[key] = filters[key] ?? '';
|
||||||
params[key] = filters[key] ?? '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
params["limit"] = "${limit}";
|
params["limit"] = "${limit}";
|
||||||
@ -288,18 +280,12 @@ class InvenTreeModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return list of objects from the database, with optional filters
|
// Return list of objects from the database, with optional filters
|
||||||
Future<List<InvenTreeModel>> list({Map<String, String>? filters}) async {
|
Future<List<InvenTreeModel>> list({Map<String, String> filters = const {}}) async {
|
||||||
|
|
||||||
if (filters == null) {
|
|
||||||
filters = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
var params = defaultListFilters();
|
var params = defaultListFilters();
|
||||||
|
|
||||||
if (filters != null) {
|
for (String key in filters.keys) {
|
||||||
for (String key in filters.keys) {
|
params[key] = filters[key] ?? '';
|
||||||
params[key] = filters[key] ?? '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
print("LIST: $URL ${params.toString()}");
|
print("LIST: $URL ${params.toString()}");
|
||||||
|
@ -27,9 +27,20 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart?> {
|
|||||||
bool _searching = false;
|
bool _searching = false;
|
||||||
|
|
||||||
// Custom filters for the part search
|
// Custom filters for the part search
|
||||||
Map<String, String> filters = {};
|
Map<String, String> _filters = {};
|
||||||
|
|
||||||
PartSearchDelegate(this.context, {this.filters = const {}});
|
PartSearchDelegate(this.context, {Map<String, String> filters = const {}}) {
|
||||||
|
|
||||||
|
// Copy filter values
|
||||||
|
for (String key in filters.keys) {
|
||||||
|
|
||||||
|
String? value = filters[key];
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
_filters[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get searchFieldLabel => L10().searchParts;
|
String get searchFieldLabel => L10().searchParts;
|
||||||
@ -58,10 +69,9 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart?> {
|
|||||||
|
|
||||||
showResults(context);
|
showResults(context);
|
||||||
|
|
||||||
// Enable cascading part search by default
|
_filters["cascade"] = "true";
|
||||||
filters["cascade"] = "true";
|
|
||||||
|
|
||||||
final results = await InvenTreePart().search(context, query, filters: filters);
|
final results = await InvenTreePart().search(context, query, filters: _filters);
|
||||||
|
|
||||||
partResults.clear();
|
partResults.clear();
|
||||||
|
|
||||||
@ -208,11 +218,18 @@ class StockSearchDelegate extends SearchDelegate<InvenTreeStockItem?> {
|
|||||||
bool _searching = false;
|
bool _searching = false;
|
||||||
|
|
||||||
// Custom filters for the stock item search
|
// Custom filters for the stock item search
|
||||||
Map<String, String>? filters;
|
Map<String, String> _filters = {};
|
||||||
|
|
||||||
StockSearchDelegate(this.context, {this.filters}) {
|
StockSearchDelegate(this.context, {Map<String, String> filters = const {}}) {
|
||||||
if (filters == null) {
|
|
||||||
filters = {};
|
// Copy filter values
|
||||||
|
for (String key in filters.keys) {
|
||||||
|
|
||||||
|
String? value = filters[key];
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
_filters[key] = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,12 +260,10 @@ class StockSearchDelegate extends SearchDelegate<InvenTreeStockItem?> {
|
|||||||
showResults(context);
|
showResults(context);
|
||||||
|
|
||||||
// Enable cascading part search by default
|
// Enable cascading part search by default
|
||||||
if (filters != null) {
|
_filters["cascade"] = "true";
|
||||||
filters?["cascade"] = "true";
|
|
||||||
}
|
|
||||||
|
|
||||||
final results = await InvenTreeStockItem().search(
|
final results = await InvenTreeStockItem().search(
|
||||||
context, query, filters: filters);
|
context, query, filters: _filters);
|
||||||
|
|
||||||
itemResults.clear();
|
itemResults.clear();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user