2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 19:46:46 +00:00

Prevent editing of attachment file on test result after upload (#8032)

This commit is contained in:
Oliver 2024-08-29 14:34:34 +10:00 committed by GitHub
parent 3911694342
commit 368d59ee55
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 8 deletions

View File

@ -914,11 +914,13 @@ export function useTestResultFields({
partId, partId,
itemId, itemId,
templateId, templateId,
editing = false,
editTemplate = false editTemplate = false
}: { }: {
partId: number; partId: number;
itemId: number; itemId: number;
templateId: number | undefined; templateId: number | undefined;
editing?: boolean;
editTemplate?: boolean; editTemplate?: boolean;
}): ApiFormFieldSet { }): ApiFormFieldSet {
// Valid field choices // Valid field choices
@ -927,7 +929,7 @@ export function useTestResultFields({
// Field type for the "value" input // Field type for the "value" input
const [fieldType, setFieldType] = useState<'string' | 'choice'>('string'); const [fieldType, setFieldType] = useState<'string' | 'choice'>('string');
const settings = useGlobalSettingsState.getState(); const settings = useGlobalSettingsState();
const includeTestStation = useMemo( const includeTestStation = useMemo(
() => settings.isSet('TEST_STATION_DATA'), () => settings.isSet('TEST_STATION_DATA'),
@ -935,7 +937,7 @@ export function useTestResultFields({
); );
return useMemo(() => { return useMemo(() => {
return { let fields: ApiFormFieldSet = {
stock_item: { stock_item: {
value: itemId, value: itemId,
hidden: true hidden: true
@ -985,8 +987,16 @@ export function useTestResultFields({
hidden: !includeTestStation hidden: !includeTestStation
} }
}; };
if (editing) {
// Prevent changing uploaded attachments
delete fields.attachment;
}
return fields;
}, [ }, [
choices, choices,
editing,
editTemplate, editTemplate,
fieldType, fieldType,
partId, partId,

View File

@ -27,6 +27,7 @@ import {
} from '../../hooks/UseForm'; } from '../../hooks/UseForm';
import { useTable } from '../../hooks/UseTable'; import { useTable } from '../../hooks/UseTable';
import { apiUrl } from '../../states/ApiState'; import { apiUrl } from '../../states/ApiState';
import { useGlobalSettingsState } from '../../states/SettingsState';
import { useUserState } from '../../states/UserState'; import { useUserState } from '../../states/UserState';
import { TableColumn } from '../Column'; import { TableColumn } from '../Column';
import { DateColumn, DescriptionColumn, NoteColumn } from '../ColumnRenderers'; import { DateColumn, DescriptionColumn, NoteColumn } from '../ColumnRenderers';
@ -49,6 +50,11 @@ export default function StockItemTestResultTable({
const user = useUserState(); const user = useUserState();
const table = useTable('stocktests'); const table = useTable('stocktests');
const globalSettings = useGlobalSettingsState();
const includeTestStation = useMemo(
() => globalSettings.isSet('TEST_STATION_DATA'),
[globalSettings]
);
// Fetch the test templates required for this stock item // Fetch the test templates required for this stock item
const { data: testTemplates } = useQuery({ const { data: testTemplates } = useQuery({
queryKey: ['stocktesttemplates', partId, itemId], queryKey: ['stocktesttemplates', partId, itemId],
@ -203,12 +209,14 @@ export default function StockItemTestResultTable({
{ {
accessor: 'test_station', accessor: 'test_station',
sortable: true, sortable: true,
title: t`Test station` title: t`Test station`,
hidden: !includeTestStation
}, },
{ {
accessor: 'started_datetime', accessor: 'started_datetime',
sortable: true, sortable: true,
title: t`Started`, title: t`Started`,
hidden: !includeTestStation,
render: (record: any) => { render: (record: any) => {
return ( return (
<Group justify="space-between"> <Group justify="space-between">
@ -224,6 +232,7 @@ export default function StockItemTestResultTable({
accessor: 'finished_datetime', accessor: 'finished_datetime',
sortable: true, sortable: true,
title: t`Finished`, title: t`Finished`,
hidden: !includeTestStation,
render: (record: any) => { render: (record: any) => {
return ( return (
<Group justify="space-between"> <Group justify="space-between">
@ -236,21 +245,29 @@ export default function StockItemTestResultTable({
} }
} }
]; ];
}, [itemId]); }, [itemId, includeTestStation]);
const [selectedTemplate, setSelectedTemplate] = useState<number | undefined>( const [selectedTemplate, setSelectedTemplate] = useState<number | undefined>(
undefined undefined
); );
const resultFields: ApiFormFieldSet = useTestResultFields({ const newResultFields: ApiFormFieldSet = useTestResultFields({
partId: partId, partId: partId,
itemId: itemId, itemId: itemId,
templateId: selectedTemplate templateId: selectedTemplate,
editing: false
});
const editResultFields: ApiFormFieldSet = useTestResultFields({
partId: partId,
itemId: itemId,
templateId: selectedTemplate,
editing: true
}); });
const newTestModal = useCreateApiFormModal({ const newTestModal = useCreateApiFormModal({
url: ApiEndpoints.stock_test_result_list, url: ApiEndpoints.stock_test_result_list,
fields: useMemo(() => ({ ...resultFields }), [resultFields]), fields: useMemo(() => ({ ...newResultFields }), [newResultFields]),
initialData: { initialData: {
template: selectedTemplate, template: selectedTemplate,
result: true result: true
@ -265,7 +282,7 @@ export default function StockItemTestResultTable({
const editTestModal = useEditApiFormModal({ const editTestModal = useEditApiFormModal({
url: ApiEndpoints.stock_test_result_list, url: ApiEndpoints.stock_test_result_list,
pk: selectedTest, pk: selectedTest,
fields: useMemo(() => ({ ...resultFields }), [resultFields]), fields: useMemo(() => ({ ...editResultFields }), [editResultFields]),
title: t`Edit Test Result`, title: t`Edit Test Result`,
table: table, table: table,
successMessage: t`Test result updated` successMessage: t`Test result updated`