mirror of
https://github.com/inventree/inventree-app.git
synced 2025-04-28 05:26:47 +00:00
commit
cc3f7e7f7c
55
lib/api.dart
55
lib/api.dart
@ -453,6 +453,10 @@ class InvenTreeAPI {
|
||||
_connecting = false;
|
||||
_token = "";
|
||||
profile = null;
|
||||
|
||||
// Clear received settings
|
||||
_globalSettings.clear();
|
||||
_userSettings.clear();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -492,7 +496,9 @@ class InvenTreeAPI {
|
||||
return _connected;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Request the user roles (permissions) from the InvenTree server
|
||||
*/
|
||||
Future<void> getUserRoles() async {
|
||||
|
||||
roles.clear();
|
||||
@ -1147,4 +1153,51 @@ class InvenTreeAPI {
|
||||
cacheManager: manager,
|
||||
);
|
||||
}
|
||||
|
||||
bool get supportsSettings => isConnected() && apiVersion >= 46;
|
||||
|
||||
// Keep a record of which settings we have received from the server
|
||||
Map<String, InvenTreeGlobalSetting> _globalSettings = {};
|
||||
Map<String, InvenTreeUserSetting> _userSettings = {};
|
||||
|
||||
Future<String> getGlobalSetting(String key) async {
|
||||
if (!supportsSettings) return "";
|
||||
|
||||
InvenTreeGlobalSetting? setting = _globalSettings[key];
|
||||
|
||||
if ((setting != null) && setting.reloadedWithin(Duration(minutes: 5))) {
|
||||
return setting.value;
|
||||
}
|
||||
|
||||
final response = await InvenTreeGlobalSetting().getModel(key);
|
||||
|
||||
if (response is InvenTreeGlobalSetting) {
|
||||
response.lastReload = DateTime.now();
|
||||
_globalSettings[key] = response;
|
||||
return response.value;
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
Future<String> getUserSetting(String key) async {
|
||||
if (!supportsSettings) return "";
|
||||
|
||||
InvenTreeUserSetting? setting = _userSettings[key];
|
||||
|
||||
if ((setting != null) && setting.reloadedWithin(Duration(minutes: 5))) {
|
||||
return setting.value;
|
||||
}
|
||||
|
||||
final response = await InvenTreeGlobalSetting().getModel(key);
|
||||
|
||||
if (response is InvenTreeUserSetting) {
|
||||
response.lastReload = DateTime.now();
|
||||
_userSettings[key] = response;
|
||||
return response.value;
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -44,6 +44,17 @@ class InvenTreeModel {
|
||||
// Construct an InvenTreeModel from a JSON data object
|
||||
InvenTreeModel.fromJson(this.jsondata);
|
||||
|
||||
// Update whenever the model is loaded from the server
|
||||
DateTime? lastReload;
|
||||
|
||||
bool reloadedWithin(Duration d) {
|
||||
if (lastReload == null) {
|
||||
return false;
|
||||
} else {
|
||||
return lastReload!.add(d).isAfter(DateTime.now());
|
||||
}
|
||||
}
|
||||
|
||||
// Override the endpoint URL for each subclass
|
||||
String get URL => "";
|
||||
|
||||
@ -287,6 +298,8 @@ class InvenTreeModel {
|
||||
|
||||
}
|
||||
|
||||
lastReload = DateTime.now();
|
||||
|
||||
jsondata = response.asMap();
|
||||
|
||||
return true;
|
||||
@ -315,7 +328,7 @@ class InvenTreeModel {
|
||||
}
|
||||
|
||||
// Return the detail view for the associated pk
|
||||
Future<InvenTreeModel?> get(int pk, {Map<String, String> filters = const {}}) async {
|
||||
Future<InvenTreeModel?> getModel(String pk, {Map<String, String> filters = const {}}) async {
|
||||
|
||||
var url = path.join(URL, pk.toString());
|
||||
|
||||
@ -357,9 +370,15 @@ class InvenTreeModel {
|
||||
|
||||
}
|
||||
|
||||
lastReload = DateTime.now();
|
||||
|
||||
return createFromJson(response.asMap());
|
||||
}
|
||||
|
||||
Future<InvenTreeModel?> get(int pk, {Map<String, String> filters = const {}}) async {
|
||||
return getModel(pk.toString(), filters: filters);
|
||||
}
|
||||
|
||||
Future<InvenTreeModel?> create(Map<String, dynamic> data) async {
|
||||
|
||||
if (data.containsKey("pk")) {
|
||||
@ -565,6 +584,50 @@ class InvenTreePlugin extends InvenTreeModel {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class representing a 'setting' object on the InvenTree server.
|
||||
* There are two sorts of settings available from the server, via the API:
|
||||
* - GlobalSetting (applicable to all users)
|
||||
* - UserSetting (applicable only to the current user)
|
||||
*/
|
||||
class InvenTreeGlobalSetting extends InvenTreeModel {
|
||||
|
||||
InvenTreeGlobalSetting() : super();
|
||||
|
||||
InvenTreeGlobalSetting.fromJson(Map<String, dynamic> json) : super.fromJson(json);
|
||||
|
||||
@override
|
||||
InvenTreeGlobalSetting createFromJson(Map<String, dynamic> json) {
|
||||
return InvenTreeGlobalSetting.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
String get URL => "settings/global/";
|
||||
|
||||
String get key => (jsondata["key"] ?? "") as String;
|
||||
|
||||
String get value => (jsondata["value"] ?? "") as String;
|
||||
|
||||
String get type => (jsondata["type"] ?? "") as String;
|
||||
|
||||
}
|
||||
|
||||
class InvenTreeUserSetting extends InvenTreeGlobalSetting {
|
||||
|
||||
InvenTreeUserSetting() : super();
|
||||
|
||||
InvenTreeUserSetting.fromJson(Map<String, dynamic> json) : super.fromJson(json);
|
||||
|
||||
@override
|
||||
InvenTreeGlobalSetting createFromJson(Map<String, dynamic> json) {
|
||||
return InvenTreeGlobalSetting.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
String get URL => "settings/user/";
|
||||
}
|
||||
|
||||
|
||||
class InvenTreeAttachment extends InvenTreeModel {
|
||||
// Class representing an "attachment" file
|
||||
InvenTreeAttachment() : super();
|
||||
|
@ -44,7 +44,6 @@ class PaginatedSearchState<T extends StatefulWidget> extends State<T> {
|
||||
|
||||
Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async {
|
||||
|
||||
print("Blank request page");
|
||||
// Default implementation returns null - must be overridden
|
||||
return null;
|
||||
}
|
||||
|
@ -37,6 +37,8 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
||||
|
||||
int completedLines = 0;
|
||||
|
||||
String _poPrefix = "";
|
||||
|
||||
@override
|
||||
String getAppBarTitle(BuildContext context) => L10().purchaseOrder;
|
||||
|
||||
@ -61,6 +63,9 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
||||
|
||||
@override
|
||||
Future<void> request(BuildContext context) async {
|
||||
|
||||
_poPrefix = await InvenTreeAPI().getGlobalSetting("PURCHASEORDER_REFERENCE_PREFIX");
|
||||
|
||||
await order.reload();
|
||||
|
||||
lines = await order.getLineItems();
|
||||
@ -72,7 +77,6 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
||||
completedLines += 1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Future <void> editOrder(BuildContext context) async {
|
||||
@ -93,7 +97,7 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
||||
|
||||
return Card(
|
||||
child: ListTile(
|
||||
title: Text(order.reference),
|
||||
title: Text("${_poPrefix}${order.reference}"),
|
||||
subtitle: Text(order.description),
|
||||
leading: supplier == null ? null : InvenTreeAPI().getImage(supplier.thumbnail, width: 40, height: 40),
|
||||
)
|
||||
|
@ -55,9 +55,14 @@ class _PaginatedPurchaseOrderListState extends PaginatedSearchState<PaginatedPur
|
||||
|
||||
_PaginatedPurchaseOrderListState(Map<String, String> filters) : super(filters);
|
||||
|
||||
// Purchase order prefix
|
||||
String _poPrefix = "";
|
||||
|
||||
@override
|
||||
Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async {
|
||||
|
||||
_poPrefix = await InvenTreeAPI().getGlobalSetting("PURCHASEORDER_REFERENCE_PREFIX");
|
||||
|
||||
params["outstanding"] = "true";
|
||||
|
||||
final page = await InvenTreePurchaseOrder().listPaginated(limit, offset, filters: params);
|
||||
@ -74,7 +79,7 @@ class _PaginatedPurchaseOrderListState extends PaginatedSearchState<PaginatedPur
|
||||
InvenTreeCompany? supplier = order.supplier;
|
||||
|
||||
return ListTile(
|
||||
title: Text(order.reference),
|
||||
title: Text("${_poPrefix}${order.reference}"),
|
||||
subtitle: Text(order.description),
|
||||
leading: supplier == null ? null : InvenTreeAPI().getImage(
|
||||
supplier.thumbnail,
|
||||
|
Loading…
x
Reference in New Issue
Block a user