2
0
mirror of https://github.com/inventree/InvenTree.git synced 2026-04-04 10:31:03 +00:00

Allow bulk edit of stock batch code (#11499)

* Allow bulk edit of stock batch code

Closes https://github.com/inventree/InvenTree/issues/10817

* Bump API version

* Add unit test
This commit is contained in:
Oliver
2026-03-13 01:23:55 +11:00
committed by GitHub
parent bc0ab35a8b
commit 6ca102cb5f
10 changed files with 97 additions and 5 deletions

View File

@@ -51,6 +51,7 @@ import { RenderStockLocation } from '../components/render/Stock';
import { InvenTreeIcon } from '../functions/icons';
import {
useApiFormModal,
useBulkEditApiFormModal,
useCreateApiFormModal,
useDeleteApiFormModal
} from '../hooks/UseForm';
@@ -1375,6 +1376,38 @@ export function useChangeStockStatus(props: StockOperationProps) {
});
}
export function useChangeStockBatchCode(props: StockOperationProps) {
// Return a common batch code value if all items share the same batch code, otherwise return undefined
const batchCode = useMemo(() => {
const batchCodeValues = new Set(
props.items?.filter((item) => item.batch).map((item) => item.batch)
);
if (batchCodeValues.size === 1) {
return batchCodeValues.values().next().value;
}
return undefined;
}, [props.items]);
return useBulkEditApiFormModal({
url: ApiEndpoints.stock_item_list,
items: props.items?.map((item: any) => item.pk) ?? [],
title: t`Change Batch Code`,
preFormContent: (
<Alert color='blue'>
{t`Change batch code for the selected stock items`}
</Alert>
),
fields: {
batch: {
value: batchCode
}
},
onFormSuccess: props.refresh
});
}
export function useMergeStockItem(props: StockOperationProps) {
return useStockOperationModal({
...props,

View File

@@ -8,6 +8,7 @@ import { ActionDropdown } from '../components/items/ActionDropdown';
import {
useAddStockItem,
useAssignStockItem,
useChangeStockBatchCode,
useChangeStockStatus,
useCountStockItem,
useDeleteStockItem,
@@ -26,6 +27,7 @@ interface StockAdjustActionProps {
assign?: boolean;
count?: boolean;
changeStatus?: boolean;
changeBatch?: boolean;
delete?: boolean;
merge?: boolean;
remove?: boolean;
@@ -55,6 +57,7 @@ export function useStockAdjustActions(
const addStock = useAddStockItem(props.formProps);
const assignStock = useAssignStockItem(props.formProps);
const changeStatus = useChangeStockStatus(props.formProps);
const changeBatch = useChangeStockBatchCode(props.formProps);
const countStock = useCountStockItem(props.formProps);
const deleteStock = useDeleteStockItem(props.formProps);
const mergeStock = useMergeStockItem(props.formProps);
@@ -74,6 +77,7 @@ export function useStockAdjustActions(
props.assign != false && modals.push(assignStock);
props.count != false && modals.push(countStock);
props.changeStatus != false && modals.push(changeStatus);
props.changeBatch != false && modals.push(changeBatch);
props.merge != false && modals.push(mergeStock);
props.remove != false && modals.push(removeStock);
props.transfer != false && modals.push(transferStock);
@@ -153,6 +157,16 @@ export function useStockAdjustActions(
}
});
props.changeBatch != false &&
menuActions.push({
name: t`Change Batch Code`,
icon: <InvenTreeIcon icon='batch' iconProps={{ color: 'blue' }} />,
tooltip: t`Change batch code of selected stock items`,
onClick: () => {
changeBatch.open();
}
});
props.assign != false &&
menuActions.push({
name: t`Assign Stock`,

View File

@@ -1118,6 +1118,7 @@ export default function PartDetail() {
const stockAdjustActions = useStockAdjustActions({
formProps: stockOperationProps,
merge: false,
changeBatch: false,
enabled: true
});

View File

@@ -307,6 +307,7 @@ export default function Stock() {
const stockAdjustActions = useStockAdjustActions({
formProps: stockOperationProps,
enabled: true,
changeBatch: false,
delete: false,
merge: false,
assign: false

View File

@@ -754,6 +754,7 @@ export default function StockDetail() {
const stockAdjustActions = useStockAdjustActions({
formProps: stockOperationProps,
delete: false,
changeBatch: false,
assign: !!stockitem.in_stock && stockitem.part_detail?.salable,
return: !!stockitem.consumed_by || !!stockitem.customer,
merge: false

View File

@@ -428,7 +428,8 @@ export function StockItemTable({
const stockAdjustActions = useStockAdjustActions({
formProps: stockOperationProps,
return: allowReturn
return: allowReturn,
changeBatch: true
});
const tableActions = useMemo(() => {