mirror of
https://github.com/inventree/inventree-app.git
synced 2025-04-29 14:06:47 +00:00
Adds code to requeest global setting from server
- Settings are individually cached for 5 minutes - For now, use it for the purchase order reference prefix
This commit is contained in:
parent
da3b668e8c
commit
059b69ce99
36
lib/api.dart
36
lib/api.dart
@ -452,6 +452,10 @@ class InvenTreeAPI {
|
|||||||
_connecting = false;
|
_connecting = false;
|
||||||
_token = "";
|
_token = "";
|
||||||
profile = null;
|
profile = null;
|
||||||
|
|
||||||
|
// Clear received settings
|
||||||
|
_globalSettings.clear();
|
||||||
|
_userSettings.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> connectToServer() async {
|
Future<bool> connectToServer() async {
|
||||||
@ -488,7 +492,9 @@ class InvenTreeAPI {
|
|||||||
return _connected;
|
return _connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Request the user roles (permissions) from the InvenTree server
|
||||||
|
*/
|
||||||
Future<void> getUserRoles() async {
|
Future<void> getUserRoles() async {
|
||||||
|
|
||||||
roles.clear();
|
roles.clear();
|
||||||
@ -1143,4 +1149,32 @@ class InvenTreeAPI {
|
|||||||
cacheManager: manager,
|
cacheManager: manager,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get supportsSettings => isConnected() && apiVersion >= 45;
|
||||||
|
|
||||||
|
// 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 "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,14 @@ class InvenTreeModel {
|
|||||||
// Update whenever the model is loaded from the server
|
// Update whenever the model is loaded from the server
|
||||||
DateTime? lastReload;
|
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
|
// Override the endpoint URL for each subclass
|
||||||
String get URL => "";
|
String get URL => "";
|
||||||
|
|
||||||
@ -320,7 +328,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 = const {}}) async {
|
Future<InvenTreeModel?> getModel(String pk, {Map<String, String> filters = const {}}) async {
|
||||||
|
|
||||||
var url = path.join(URL, pk.toString());
|
var url = path.join(URL, pk.toString());
|
||||||
|
|
||||||
@ -367,6 +375,10 @@ class InvenTreeModel {
|
|||||||
return createFromJson(response.asMap());
|
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 {
|
Future<InvenTreeModel?> create(Map<String, dynamic> data) async {
|
||||||
|
|
||||||
if (data.containsKey("pk")) {
|
if (data.containsKey("pk")) {
|
||||||
|
@ -44,7 +44,6 @@ class PaginatedSearchState<T extends StatefulWidget> extends State<T> {
|
|||||||
|
|
||||||
Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async {
|
Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async {
|
||||||
|
|
||||||
print("Blank request page");
|
|
||||||
// Default implementation returns null - must be overridden
|
// Default implementation returns null - must be overridden
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,8 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
|||||||
|
|
||||||
int completedLines = 0;
|
int completedLines = 0;
|
||||||
|
|
||||||
|
String _poPrefix = "";
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String getAppBarTitle(BuildContext context) => L10().purchaseOrder;
|
String getAppBarTitle(BuildContext context) => L10().purchaseOrder;
|
||||||
|
|
||||||
@ -61,6 +63,9 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> request(BuildContext context) async {
|
Future<void> request(BuildContext context) async {
|
||||||
|
|
||||||
|
_poPrefix = await InvenTreeAPI().getGlobalSetting("PURCHASEORDER_REFERENCE_PREFIX");
|
||||||
|
|
||||||
await order.reload();
|
await order.reload();
|
||||||
|
|
||||||
lines = await order.getLineItems();
|
lines = await order.getLineItems();
|
||||||
@ -72,7 +77,6 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
|||||||
completedLines += 1;
|
completedLines += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future <void> editOrder(BuildContext context) async {
|
Future <void> editOrder(BuildContext context) async {
|
||||||
@ -93,7 +97,7 @@ class _PurchaseOrderDetailState extends RefreshableState<PurchaseOrderDetailWidg
|
|||||||
|
|
||||||
return Card(
|
return Card(
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
title: Text(order.reference),
|
title: Text("${_poPrefix}${order.reference}"),
|
||||||
subtitle: Text(order.description),
|
subtitle: Text(order.description),
|
||||||
leading: supplier == null ? null : InvenTreeAPI().getImage(supplier.thumbnail, width: 40, height: 40),
|
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);
|
_PaginatedPurchaseOrderListState(Map<String, String> filters) : super(filters);
|
||||||
|
|
||||||
|
// Purchase order prefix
|
||||||
|
String _poPrefix = "";
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async {
|
Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async {
|
||||||
|
|
||||||
|
_poPrefix = await InvenTreeAPI().getGlobalSetting("PURCHASEORDER_REFERENCE_PREFIX");
|
||||||
|
|
||||||
params["outstanding"] = "true";
|
params["outstanding"] = "true";
|
||||||
|
|
||||||
final page = await InvenTreePurchaseOrder().listPaginated(limit, offset, filters: params);
|
final page = await InvenTreePurchaseOrder().listPaginated(limit, offset, filters: params);
|
||||||
@ -74,7 +79,7 @@ class _PaginatedPurchaseOrderListState extends PaginatedSearchState<PaginatedPur
|
|||||||
InvenTreeCompany? supplier = order.supplier;
|
InvenTreeCompany? supplier = order.supplier;
|
||||||
|
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text(order.reference),
|
title: Text("${_poPrefix}${order.reference}"),
|
||||||
subtitle: Text(order.description),
|
subtitle: Text(order.description),
|
||||||
leading: supplier == null ? null : InvenTreeAPI().getImage(
|
leading: supplier == null ? null : InvenTreeAPI().getImage(
|
||||||
supplier.thumbnail,
|
supplier.thumbnail,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user