2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-04-27 21:16:48 +00:00

Test result fixes (#564)

* Fix association of test results to templates

* Fixes

* Remove unused vars
This commit is contained in:
Oliver 2024-12-06 10:59:49 +11:00 committed by GitHub
parent b849bfc718
commit 6f5fc1d8a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 76 additions and 22 deletions

View File

@ -316,6 +316,10 @@ class InvenTreeAPI {
// Does the server support allocating stock to sales order using barcodes?
bool get supportsBarcodeSOAllocateEndpoint => isConnected() && apiVersion >= 160;
// Does the server support the "modern" test results API
// Ref: https://github.com/inventree/InvenTree/pull/6430/
bool get supportsModernTestResults => isConnected() && apiVersion >= 169;
// Does the server support "null" top-level filtering for PartCategory and StockLocation endpoints?
bool get supportsNullTopLevelFiltering => isConnected() && apiVersion < 174;

View File

@ -657,7 +657,13 @@ class APIFormField {
) : null,
leading: extended ? InvenTreeAPI().getThumbnail(part.thumbnail) : null,
);
case "parttesttemplate":
var template = InvenTreePartTestTemplate.fromJson(data);
return ListTile(
title: Text(template.testName),
subtitle: Text(template.description),
);
case "supplierpart":
var part = InvenTreeSupplierPart.fromJson(data);

View File

@ -97,7 +97,6 @@ class InvenTreeModel {
if (data.containsKey(key)) {
return data[key];
} else {
debug("JSON data does not contain key '$key' (subKey '${subKey}')");
return backup;
}
}
@ -427,13 +426,17 @@ class InvenTreeModel {
}
}
Map<String, String> defaultListFilters() {
Map<String, String> defaultFilters() {
return {};
}
Map<String, String> defaultListFilters() {
return defaultFilters();
}
// A map of "default" headers to use when performing a GET request
Map<String, String> defaultGetFilters() {
return {};
return defaultFilters();
}
/*

View File

@ -27,19 +27,43 @@ class InvenTreeStockItemTestResult extends InvenTreeModel {
List<String> get rolesRequired => ["stock"];
@override
Map<String, Map<String, dynamic>> formFields() {
Map<String, String> defaultFilters() {
return {
"user_detail": "true",
"template_detail": "true",
};
}
@override
Map<String, Map<String, dynamic>> formFields() {
Map<String, Map<String, dynamic>> fields = {
"stock_item": {"hidden": true},
"test": {},
"template": {
"filters": {
"enabled": "true",
}
},
"result": {},
"value": {},
"notes": {},
"attachment": {},
};
if (InvenTreeAPI().supportsModernTestResults) {
fields.remove("test");
} else {
fields.remove("template");
}
return fields;
}
String get key => getString("key");
int get templateId => getInt("template");
String get testName => getString("test");
bool get result => getBool("result");
@ -47,7 +71,9 @@ class InvenTreeStockItemTestResult extends InvenTreeModel {
String get value => getString("value");
String get attachment => getString("attachment");
String get username => getString("username", subKey: "user_detail");
String get date => getString("date");
@override
@ -256,6 +282,7 @@ class InvenTreeStockItem extends InvenTreeModel {
await InvenTreePartTestTemplate().list(
filters: {
"part": "${partId}",
"enabled": "true",
},
).then((var templates) {
testTemplates.clear();

View File

@ -62,12 +62,19 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
final InvenTreeStockItem item;
Future <void> addTestResult(BuildContext context, {String name = "", bool nameIsEditable = true, bool result = false, String value = "", bool valueRequired = false, bool attachmentRequired = false}) async {
Future <void> addTestResult(BuildContext context, {int templateId = 0, String name = "", bool nameIsEditable = true, bool result = false, String value = "", bool valueRequired = false, bool attachmentRequired = false}) async {
Map<String, Map<String, dynamic>> fields = InvenTreeStockItemTestResult().formFields();
// Add additional filters
fields["template"]?["filters"]?["part"] = "${item.partId}";
InvenTreeStockItemTestResult().createForm(
context,
L10().testResultAdd,
fields: fields,
data: {
"template": "${templateId}",
"stock_item": "${item.pk}",
"test": "${name}",
},
@ -98,10 +105,11 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
// Check against templates
if (outputs[ii] is InvenTreePartTestTemplate) {
var t = outputs[ii] as InvenTreePartTestTemplate;
var template = outputs[ii] as InvenTreePartTestTemplate;
if (result.key == t.key) {
t.results.add(result);
// Match the result to a template
if (result.templateId == template.pk || result.key == template.key) {
template.results.add(result);
match = true;
break;
}
@ -168,9 +176,10 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
bool _hasResult = false;
bool _required = false;
String _test = "";
int _templateId = 0;
bool _result = false;
String _value = "";
String _notes = "";
String _date = "";
Widget _icon = Icon(TablerIcons.help_circle, color: Colors.lightBlue);
bool _valueRequired = false;
@ -179,18 +188,20 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
if (item is InvenTreePartTestTemplate) {
_result = item.passFailStatus();
_test = item.testName;
_templateId = item.pk;
_required = item.required;
_value = item.latestResult()?.value ?? L10().noResults;
_valueRequired = item.requiresValue;
_attachmentRequired = item.requiresAttachment;
_notes = item.latestResult()?.notes ?? item.description;
_date = item.latestResult()?.date ?? "";
_hasResult = item.latestResult() != null;
} else if (item is InvenTreeStockItemTestResult) {
_result = item.result;
_test = item.testName;
_templateId = item.templateId;
_date = item.date;
_required = false;
_value = item.value;
_notes = item.notes;
_hasResult = true;
}
@ -207,17 +218,20 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
fontWeight: _required ? FontWeight.bold : FontWeight.normal,
fontStyle: _hasResult ? FontStyle.normal : FontStyle.italic
)),
subtitle: Text(_notes),
trailing: Text(_value),
subtitle: Text(_value),
trailing: Text(_date),
leading: _icon,
onTap: () {
addTestResult(
context,
name: _test,
nameIsEditable: !_required,
valueRequired: _valueRequired,
attachmentRequired: _attachmentRequired
);
if (InvenTreeStockItemTestResult().canCreate) {
addTestResult(
context,
name: _test,
templateId: _templateId,
nameIsEditable: !_required,
valueRequired: _valueRequired,
attachmentRequired: _attachmentRequired
);
}
}
));
}