2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-17 20:45:44 +00:00

Test result choices (#7417)

* Add "choices" field to PartTestTemplate

- Will allow validation of "value" field on StockItemTestResult

* Run validation against StockItemTestResult

* Expose 'choices' to serializer

* Update unit test

* Add unit test for test result validation

* Add 'choices' field for CUI forms

* Add "choices" field to PUI form

* Add 'choices' column to PartTestTemplateTable

* memoize stockitemtestresult fields

- Adjust field type of "value" field based on template choices

* Bump API version
This commit is contained in:
Oliver
2024-06-08 11:21:27 +10:00
committed by GitHub
parent bae5dcdbdc
commit a90b05add5
11 changed files with 298 additions and 82 deletions

View File

@ -866,3 +866,63 @@ export function stockLocationFields({}: {}): ApiFormFieldSet {
return fields;
}
// Construct a set of fields for
export function useTestResultFields({
partId,
itemId
}: {
partId: number;
itemId: number;
}): ApiFormFieldSet {
// Valid field choices
const [choices, setChoices] = useState<any[]>([]);
// Field type for the "value" input
const [fieldType, setFieldType] = useState<'string' | 'choice'>('string');
return useMemo(() => {
return {
stock_item: {
value: itemId,
hidden: true
},
template: {
filters: {
include_inherited: true,
part: partId
},
onValueChange: (value: any, record: any) => {
// Adjust the type of the "value" field based on the selected template
if (record?.choices) {
let _choices: string[] = record.choices.split(',');
if (_choices.length > 0) {
setChoices(
_choices.map((choice) => {
return {
label: choice.trim(),
value: choice.trim()
};
})
);
setFieldType('choice');
} else {
setChoices([]);
setFieldType('string');
}
}
}
},
result: {},
value: {
field_type: fieldType,
choices: fieldType === 'choice' ? choices : undefined
},
attachment: {},
notes: {},
started_datetime: {},
finished_datetime: {}
};
}, [choices, fieldType, partId, itemId]);
}

View File

@ -60,6 +60,11 @@ export default function PartTestTemplateTable({ partId }: { partId: number }) {
BooleanColumn({
accessor: 'enabled'
}),
{
accessor: 'choices',
sortable: false,
switchable: true
},
BooleanColumn({
accessor: 'required'
}),
@ -117,6 +122,7 @@ export default function PartTestTemplateTable({ partId }: { partId: number }) {
required: {},
requires_value: {},
requires_attachment: {},
choices: {},
enabled: {}
};
}, [user]);

View File

@ -19,6 +19,7 @@ import { RenderUser } from '../../components/render/User';
import { renderDate } from '../../defaults/formatters';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { UserRoles } from '../../enums/Roles';
import { useTestResultFields } from '../../forms/StockForms';
import {
useCreateApiFormModal,
useDeleteApiFormModal,
@ -232,27 +233,10 @@ export default function StockItemTestResultTable({
];
}, [itemId]);
const resultFields: ApiFormFieldSet = useMemo(() => {
return {
template: {
filters: {
include_inherited: true,
part: partId
}
},
result: {},
value: {},
attachment: {},
notes: {},
test_station: {},
started_datetime: {},
finished_datetime: {},
stock_item: {
value: itemId,
hidden: true
}
};
}, [partId, itemId]);
const resultFields: ApiFormFieldSet = useTestResultFields({
partId: partId,
itemId: itemId
});
const [selectedTemplate, setSelectedTemplate] = useState<number | undefined>(
undefined
@ -260,7 +244,7 @@ export default function StockItemTestResultTable({
const newTestModal = useCreateApiFormModal({
url: ApiEndpoints.stock_test_result_list,
fields: resultFields,
fields: useMemo(() => ({ ...resultFields }), [resultFields]),
initialData: {
template: selectedTemplate,
result: true
@ -275,7 +259,7 @@ export default function StockItemTestResultTable({
const editTestModal = useEditApiFormModal({
url: ApiEndpoints.stock_test_result_list,
pk: selectedTest,
fields: resultFields,
fields: useMemo(() => ({ ...resultFields }), [resultFields]),
title: t`Edit Test Result`,
table: table,
successMessage: t`Test result updated`