Skip to content

Commit 03d8993

Browse files
authored
feat: Add UniqueBatchNoEntryInput component for batch number validation (#262)
1 parent 99eb9fa commit 03d8993

File tree

2 files changed

+59
-8
lines changed

2 files changed

+59
-8
lines changed

Diff for: src/stock-operations/add-stock-operation/stock-items-addition-row.component.tsx

+5-8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import BatchNoSelector from '../batch-no-selector/batch-no-selector.component';
2828

2929
import styles from './stock-items-addition-row.scss';
3030
import { useStockItemBatchInformationHook } from '../../stock-items/add-stock-item/batch-information/batch-information.resource';
31+
import UniqueBatchNoEntryInput from '../batch-no-selector/unique-batch-no-entry-input.component';
3132

3233
interface StockItemsAdditionRowProps {
3334
canEdit?: boolean;
@@ -182,15 +183,11 @@ const StockItemsAdditionRow: React.FC<StockItemsAdditionRowProps> = ({
182183
<div className={styles.cellContent}>
183184
{requiresActualBatchInformation &&
184185
(canEdit || (canUpdateBatchInformation && row?.permission?.canUpdateBatchInformation)) && (
185-
<TextInput
186-
size="sm"
187-
maxLength={50}
188-
onChange={(e: ChangeEvent<HTMLInputElement>) =>
189-
setValue(`stockItems.${index}.batchNo`, e.target.value)
190-
}
186+
<UniqueBatchNoEntryInput
187+
onValueChange={(val) => setValue(`stockItems.${index}.batchNo`, val)}
191188
defaultValue={row.batchNo}
192-
invalidText=""
193-
invalid={errors?.stockItems?.[index]?.batchNo}
189+
error={errors?.stockItems?.[index]?.batchNo?.message}
190+
stockItemUuid={row.stockItemUuid}
194191
/>
195192
)}
196193
{requiresBatchUuid && !requiresActualBatchInformation && canEdit && (
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { TextInput } from '@carbon/react';
2+
import React, { ChangeEvent, useEffect, useMemo, useState } from 'react';
3+
import { useStockItemBatchNos } from './batch-no-selector.resource';
4+
import { TextInputSkeleton } from '@carbon/react';
5+
6+
type UniqueBatchNoEntryInputProps = {
7+
defaultValue?: string;
8+
onValueChange?: (value: string) => void;
9+
error?: string;
10+
stockItemUuid: string;
11+
};
12+
const UniqueBatchNoEntryInput: React.FC<UniqueBatchNoEntryInputProps> = ({
13+
defaultValue,
14+
onValueChange,
15+
error,
16+
stockItemUuid,
17+
}) => {
18+
const { isLoading, stockItemBatchNos } = useStockItemBatchNos(stockItemUuid);
19+
const [value, setValue] = useState(defaultValue);
20+
const [_error, setError] = useState<string>();
21+
22+
const batchNoAlreadyUsed = useMemo(
23+
() => stockItemBatchNos?.findIndex((batchNo) => batchNo.batchNo === value) !== -1,
24+
[stockItemBatchNos, value],
25+
);
26+
27+
useEffect(() => {
28+
if (defaultValue) setValue(defaultValue);
29+
}, [defaultValue]);
30+
31+
useEffect(() => {
32+
if (batchNoAlreadyUsed) {
33+
setError('Batch number already used');
34+
} else {
35+
setError(undefined);
36+
onValueChange?.(value);
37+
}
38+
}, [value, onValueChange, batchNoAlreadyUsed, setError]);
39+
40+
if (isLoading) return <TextInputSkeleton />;
41+
42+
return (
43+
<TextInput
44+
size="sm"
45+
maxLength={50}
46+
onChange={(e: ChangeEvent<HTMLInputElement>) => setValue(e.target.value)}
47+
value={value}
48+
invalidText={_error ?? error}
49+
invalid={_error ?? error}
50+
/>
51+
);
52+
};
53+
54+
export default UniqueBatchNoEntryInput;

0 commit comments

Comments
 (0)