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:
@@ -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,
|
||||
|
||||
@@ -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`,
|
||||
|
||||
@@ -1118,6 +1118,7 @@ export default function PartDetail() {
|
||||
const stockAdjustActions = useStockAdjustActions({
|
||||
formProps: stockOperationProps,
|
||||
merge: false,
|
||||
changeBatch: false,
|
||||
enabled: true
|
||||
});
|
||||
|
||||
|
||||
@@ -307,6 +307,7 @@ export default function Stock() {
|
||||
const stockAdjustActions = useStockAdjustActions({
|
||||
formProps: stockOperationProps,
|
||||
enabled: true,
|
||||
changeBatch: false,
|
||||
delete: false,
|
||||
merge: false,
|
||||
assign: false
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -428,7 +428,8 @@ export function StockItemTable({
|
||||
|
||||
const stockAdjustActions = useStockAdjustActions({
|
||||
formProps: stockOperationProps,
|
||||
return: allowReturn
|
||||
return: allowReturn,
|
||||
changeBatch: true
|
||||
});
|
||||
|
||||
const tableActions = useMemo(() => {
|
||||
|
||||
Reference in New Issue
Block a user