Merge pull request 'Focus Clear In edit QTY and Serial Number' (#228) from OptimUpdate into main

Reviewed-on: Pozomind/pozo-retail-app#228
This commit is contained in:
karthikalakshmi 2026-03-04 15:02:23 +05:30
commit 875da2dcfd
3 changed files with 239 additions and 190 deletions

View File

@ -12,6 +12,9 @@ import {
GlobalReorderProductDetails, GlobalReorderProductDetails,
PreferenceData, PreferenceData,
getConfigType, getConfigType,
changefocusStatusCust,
changeCombofocus,
GlobalfocusStatusCust,
} from '../../../../../Features/BookingScreen/BookingData/BookingData'; } from '../../../../../Features/BookingScreen/BookingData/BookingData';
import { ArrowRightOutlined } from '@ant-design/icons'; import { ArrowRightOutlined } from '@ant-design/icons';
import { Messages } from '../../../../../Components/Notifications/Messages'; import { Messages } from '../../../../../Components/Notifications/Messages';
@ -66,13 +69,24 @@ const BSBillingEditQuantity = (props) => {
shallowEqual shallowEqual
); );
const overAllLimitPreferenece = const overAllLimitPreferenece = preferenceDatas?.[0]?.[
preferenceDatas?.[0]?.['SettingDtlDetails']?.find( 'SettingDtlDetails'
(item) => (item.SettingIdName?.toLowerCase() === 'overalllimit') && item?.SettingValue === 'Y'); ]?.find(
const itemWiseLimitPreferenece = (item) =>
preferenceDatas?.[0]?.['SettingDtlDetails']?.find( item.SettingIdName?.toLowerCase() === 'overalllimit' &&
(item) => item.SettingIdName?.toLowerCase() === 'itemwiselimit' && item?.SettingValue === 'Y'); item?.SettingValue === 'Y'
const maxQtyLimit = itemWiseLimitPreferenece?.SettingCount || overAllLimitPreferenece?.SettingCount || null; );
const itemWiseLimitPreferenece = preferenceDatas?.[0]?.[
'SettingDtlDetails'
]?.find(
(item) =>
item.SettingIdName?.toLowerCase() === 'itemwiselimit' &&
item?.SettingValue === 'Y'
);
const maxQtyLimit =
itemWiseLimitPreferenece?.SettingCount ||
overAllLimitPreferenece?.SettingCount ||
null;
const preferenceOffer = const preferenceOffer =
preferenceDatas?.[0]?.['SettingDtlDetails']?.find( preferenceDatas?.[0]?.['SettingDtlDetails']?.find(
(item) => item.SettingIdName === 'Offer' (item) => item.SettingIdName === 'Offer'
@ -86,7 +100,7 @@ const BSBillingEditQuantity = (props) => {
); );
console.log(preferenceshortcutkey, 'preferenceshortcutkey'); console.log(preferenceshortcutkey, 'preferenceshortcutkey');
const [PriceChangeaccess, setPriceChangeaccess] = useState(true); const [PriceChangeaccess, setPriceChangeaccess] = useState(true);
const selectStatuscust = useSelector(GlobalfocusStatusCust);
const [ConfigDataList, setConfigDataList] = useState([]); const [ConfigDataList, setConfigDataList] = useState([]);
const [messageType, setMessageType] = useState(null); const [messageType, setMessageType] = useState(null);
const [messageData, setMessageData] = useState(null); const [messageData, setMessageData] = useState(null);
@ -115,7 +129,7 @@ const BSBillingEditQuantity = (props) => {
price: 'Price', price: 'Price',
quantity: 'qty', quantity: 'qty',
Parcel: 'Parcel', Parcel: 'Parcel',
weightAmount: 'weightAmount' weightAmount: 'weightAmount',
}; };
const [RadioBtnSelection, setRadioBtnSelection] = useState(() => { const [RadioBtnSelection, setRadioBtnSelection] = useState(() => {
if (props?.shortKeyMethod && SHORTKEY_TO_RADIO[props.shortKeyMethod]) { if (props?.shortKeyMethod && SHORTKEY_TO_RADIO[props.shortKeyMethod]) {
@ -343,7 +357,6 @@ const BSBillingEditQuantity = (props) => {
}; };
const calculateOverAllQty = (item, filterItems) => { const calculateOverAllQty = (item, filterItems) => {
if (!item) return 0; if (!item) return 0;
const totalUsedQty = const totalUsedQty =
@ -446,11 +459,18 @@ const BSBillingEditQuantity = (props) => {
); );
const editedProduct = CartOrderDetails[editedProductIndex]; const editedProduct = CartOrderDetails[editedProductIndex];
if ((overAllLimitPreferenece || itemWiseLimitPreferenece) && maxQtyLimit) { if (
(overAllLimitPreferenece || itemWiseLimitPreferenece) &&
maxQtyLimit
) {
if (overAllLimitPreferenece) { if (overAllLimitPreferenece) {
const calculatedOverAllQty = calculateOverAllQtyLimit(CartOrderDetails?.filter((_, index) => index !== editedProductIndex)); const calculatedOverAllQty = calculateOverAllQtyLimit(
if ((calculatedOverAllQty + editedQty) > maxQtyLimit) { CartOrderDetails?.filter((_, index) => index !== editedProductIndex)
setMessageData(`Overall Quantity Limit Exceeds than ${maxQtyLimit}`); );
if (calculatedOverAllQty + editedQty > maxQtyLimit) {
setMessageData(
`Overall Quantity Limit Exceeds than ${maxQtyLimit}`
);
setMessageType('warning'); setMessageType('warning');
return; return;
} }
@ -722,7 +742,8 @@ const BSBillingEditQuantity = (props) => {
newPrice, newPrice,
overrideQty = null overrideQty = null
) => { ) => {
const editedQty = overrideQty !== null const editedQty =
overrideQty !== null
? overrideQty ? overrideQty
: props?.Productdata?.ScaleType !== 'weight' : props?.Productdata?.ScaleType !== 'weight'
? parseInt(Quantity) ? parseInt(Quantity)
@ -3481,16 +3502,21 @@ const BSBillingEditQuantity = (props) => {
); );
const editedProduct = { const editedProduct = {
...CartOrderDetails[editedProductIndex], ...CartOrderDetails[editedProductIndex],
OrderQty: qty OrderQty: qty,
}; };
await handleEditQuantity(editedProduct, editedProductIndex, editedProduct.OrderRate, qty); await handleEditQuantity(
editedProduct,
editedProductIndex,
editedProduct.OrderRate,
qty
);
props.handleEditQuantityCancel(); props.handleEditQuantityCancel();
setClearQuantity(false); setClearQuantity(false);
}; };
const isKg = const isKg =
props?.Productdata?.Size == 1 && props?.Productdata?.Size == 1 &&
["KG", "KGS"].includes(props?.Productdata?.UomName?.toUpperCase()); ['KG', 'KGS'].includes(props?.Productdata?.UomName?.toUpperCase());
return ( return (
<div className="BSBilling-EditQuantity-Modal"> <div className="BSBilling-EditQuantity-Modal">
@ -3589,7 +3615,8 @@ const BSBillingEditQuantity = (props) => {
Packing Packing
</button> </button>
{isKg && (<button {isKg && (
<button
type="button" type="button"
className={ className={
RadioBtnSelection === 'weightAmount' RadioBtnSelection === 'weightAmount'
@ -3599,13 +3626,19 @@ const BSBillingEditQuantity = (props) => {
onClick={() => onRadioBtnChange('weightAmount')} onClick={() => onRadioBtnChange('weightAmount')}
> >
Weight / Amount Weight / Amount
</button>)} </button>
)}
</div> </div>
{RadioBtnSelection == 'Quantity' && ( {RadioBtnSelection == 'Quantity' && (
<> <>
<div className="EditQuantity-Quantity"> <div
className="EditQuantity-Quantity"
onBlur={() => {
dispatch(changefocusStatusCust(!selectStatuscust));
dispatch(changeCombofocus(false));
}}
>
<label className="EditQuantity-itemname"> <label className="EditQuantity-itemname">
Item Quantity: Item Quantity:
</label> </label>
@ -3614,6 +3647,10 @@ const BSBillingEditQuantity = (props) => {
type="number" type="number"
value={Quantity} value={Quantity}
onChange={(e) => setQuantity(e.target.value)} onChange={(e) => setQuantity(e.target.value)}
onBlur={() => {
dispatch(changefocusStatusCust(!selectStatuscust));
dispatch(changeCombofocus(false));
}}
className="EditQuantity-Quantitybox" className="EditQuantity-Quantitybox"
/> />
<button <button
@ -3806,7 +3843,7 @@ const BSBillingEditQuantity = (props) => {
/> />
</> </>
)} )}
{(RadioBtnSelection == 'weightAmount') && isKg && ( {RadioBtnSelection == 'weightAmount' && isKg && (
<> <>
<WeightCalculatePrice <WeightCalculatePrice
CartOrderDetails={CartOrderDetails} CartOrderDetails={CartOrderDetails}

View File

@ -11,17 +11,21 @@ import { InputField } from '../../../../../Components/Forms/InputField';
import { import {
GlobalOrderCardDetails, GlobalOrderCardDetails,
changeOrderCardDetails, changeOrderCardDetails,
changefocusStatusCust,
changeCombofocus,
GlobalfocusStatusCust,
} from '../../../../../Features/BookingScreen/BookingData/BookingData'; } from '../../../../../Features/BookingScreen/BookingData/BookingData';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { validateSafeInput } from '../../../../../Services/Others'; import { validateSafeInput } from '../../../../../Services/Others';
import { TextAreaInput } from '../../../../../../ownLib/my-ui-lib'; import { TextAreaInput } from '../../../../../../ownLib/my-ui-lib';
import "../../../../../Styles/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.scss" import '../../../../../Styles/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.scss';
const BSImeiDetails = (props) => { const BSImeiDetails = (props) => {
const formRef = useRef(null); const formRef = useRef(null);
const dispatch = useDispatch(); const dispatch = useDispatch();
const [messageType, setMessageType] = useState(null); const [messageType, setMessageType] = useState(null);
const [messageData, setMessageData] = useState(null); const [messageData, setMessageData] = useState(null);
const CartOrderDetails = useSelector(GlobalOrderCardDetails); const CartOrderDetails = useSelector(GlobalOrderCardDetails);
const selectStatuscust = useSelector(GlobalfocusStatusCust);
const [DeviceDetailOpen, setDeviceDetailOpen] = useState(props.DeviceDetails); const [DeviceDetailOpen, setDeviceDetailOpen] = useState(props.DeviceDetails);
const [ProductDetail, setProductDetail] = useState(props.ProductDetail); const [ProductDetail, setProductDetail] = useState(props.ProductDetail);
const [RadioBtnSelection, setRadioBtnSelection] = useState('Serial'); const [RadioBtnSelection, setRadioBtnSelection] = useState('Serial');
@ -51,8 +55,8 @@ const BSImeiDetails = (props) => {
); );
formRef?.current?.setFieldsValue({ formRef?.current?.setFieldsValue({
description: productidentifier?.[0]?.Description || "", description: productidentifier?.[0]?.Description || '',
}) });
}, []); }, []);
const CloseDeviceDetailModal = () => { const CloseDeviceDetailModal = () => {
props.handleDeviceDetailClose(); props.handleDeviceDetailClose();
@ -72,8 +76,7 @@ const BSImeiDetails = (props) => {
} else { } else {
setSerialNumberList([...SerialNumberList, e]); setSerialNumberList([...SerialNumberList, e]);
} }
} } else {
else {
setMessageType('error'); setMessageType('error');
setMessageData('Already Selected '); setMessageData('Already Selected ');
} }
@ -94,7 +97,6 @@ const BSImeiDetails = (props) => {
setMessageData('you cant enter more than Order Qty'); setMessageData('you cant enter more than Order Qty');
} }
formRef.current?.resetFields(['SerialNumbertext', 'IMEINumbertext']); formRef.current?.resetFields(['SerialNumbertext', 'IMEINumbertext']);
}; };
const IMEINumberOnchange = (e) => { const IMEINumberOnchange = (e) => {
@ -139,8 +141,10 @@ const BSImeiDetails = (props) => {
setMessageType(null); setMessageType(null);
}, []); }, []);
const AddDeviceDetails = () => { const AddDeviceDetails = () => {
console.log(
console.log(formRef?.current?.getFieldsValue, "formRef?.current?.getFieldsValue") formRef?.current?.getFieldsValue,
'formRef?.current?.getFieldsValue'
);
const maxLength = Math.max(SerialNumberList.length, IMEINumberList.length); const maxLength = Math.max(SerialNumberList.length, IMEINumberList.length);
// Create the new object array // Create the new object array
const IdentifyDetails = Array.from({ length: maxLength }, (_, index) => { const IdentifyDetails = Array.from({ length: maxLength }, (_, index) => {
@ -173,9 +177,8 @@ const BSImeiDetails = (props) => {
) )
) )
); );
formRef?.current?.resetFields() formRef?.current?.resetFields();
CloseDeviceDetailModal(); CloseDeviceDetailModal();
}; };
console.log(ProductDetail, 'ProductDetaildevice'); console.log(ProductDetail, 'ProductDetaildevice');
return ( return (
@ -239,7 +242,7 @@ const BSImeiDetails = (props) => {
{RadioBtnSelection == 'Serial' && ( {RadioBtnSelection == 'Serial' && (
<div> <div>
<div className="SerialNumberColumn"> <div className="SerialNumberColumn">
{ProductDetail?.FullProductIdentifierDtls?.length > 0 && {ProductDetail?.FullProductIdentifierDtls?.length > 0 && (
<Form.Item name="SerialNumber"> <Form.Item name="SerialNumber">
<DropDowns <DropDowns
options={ProductDetail?.FullProductIdentifierDtls?.filter( options={ProductDetail?.FullProductIdentifierDtls?.filter(
@ -260,20 +263,24 @@ const BSImeiDetails = (props) => {
onChangeFunction={(e) => SerialNumberOnchange(e)} onChangeFunction={(e) => SerialNumberOnchange(e)}
/> />
</Form.Item> </Form.Item>
)}
}
<Form.Item <Form.Item
name="SerialNumbertext" name="SerialNumbertext"
rules={[ rules={[
{ {
validator: async (_, value) => { validator: async (_, value) => {
await validateSafeInput(value); await validateSafeInput(value);
return Promise.resolve(); return Promise.resolve();
}, },
}, },
]} ]}
>
<div
onBlur={() => {
dispatch(changefocusStatusCust(!selectStatuscust));
dispatch(changeCombofocus(false));
}}
> >
<InputField <InputField
field="SerialNumbertext" field="SerialNumbertext"
@ -283,12 +290,12 @@ const BSImeiDetails = (props) => {
fieldApi={true} fieldApi={true}
autocomplete="off" autocomplete="off"
type="text" type="text"
// onKeyDown={(e) => { onBlur={() => {
// if (['e', 'E', '+', '-', '.'].includes(e.key)) { dispatch(changefocusStatusCust(!selectStatuscust));
// e.preventDefault(); dispatch(changeCombofocus(false));
// } }}
// }}
/> />
</div>
</Form.Item> </Form.Item>
<Buttons <Buttons
buttonText="Add" buttonText="Add"
@ -315,11 +322,10 @@ const BSImeiDetails = (props) => {
</div> </div>
)} )}
{RadioBtnSelection == 'IMEI' && ( {RadioBtnSelection == 'IMEI' && (
<div> <div>
<div className="SerialNumberColumn"> <div className="SerialNumberColumn">
{ProductDetail?.FullProductIdentifierDtls?.length > 0 && {ProductDetail?.FullProductIdentifierDtls?.length > 0 && (
<Form.Item name="IMEINumber"> <Form.Item name="IMEINumber">
<DropDowns <DropDowns
options={ProductDetail?.FullProductIdentifierDtls?.filter( options={ProductDetail?.FullProductIdentifierDtls?.filter(
@ -342,19 +348,25 @@ const BSImeiDetails = (props) => {
className="field-DropDown" className="field-DropDown"
onChangeFunction={(e) => IMEINumberOnchange(e)} onChangeFunction={(e) => IMEINumberOnchange(e)}
/> />
</Form.Item>} </Form.Item>
)}
<Form.Item <Form.Item
name="IMEINumbertext" name="IMEINumbertext"
rules={[ rules={[
{ {
validator: async (_, value) => { validator: async (_, value) => {
await validateSafeInput(value); await validateSafeInput(value);
return Promise.resolve(); return Promise.resolve();
}, },
}, },
]} ]}
>
<div
onBlur={() => {
dispatch(changefocusStatusCust(!selectStatuscust));
dispatch(changeCombofocus(false));
}}
> >
<InputField <InputField
field="IMEINumbertext" field="IMEINumbertext"
@ -364,12 +376,12 @@ const BSImeiDetails = (props) => {
fieldApi={true} fieldApi={true}
autocomplete="off" autocomplete="off"
type="text" type="text"
// onKeyDown={(e) => { onBlur={() => {
// if (['e', 'E', '+', '-', '.'].includes(e.key)) { dispatch(changefocusStatusCust(!selectStatuscust));
// e.preventDefault(); dispatch(changeCombofocus(false));
// } }}
// }}
/> />
</div>
</Form.Item> </Form.Item>
<Buttons <Buttons
buttonText="Add" buttonText="Add"
@ -395,12 +407,12 @@ const BSImeiDetails = (props) => {
</div> </div>
)} )}
<div style={{ display: "flex", marginTop: "10px" }}> <div style={{ display: 'flex', marginTop: '10px' }}>
<Form.Item name="description"> <Form.Item name="description">
<TextAreaInput <TextAreaInput
disabled={ disabled={
(IMEINumberList?.length === 0) && IMEINumberList?.length === 0 &&
(SerialNumberList?.length === 0) SerialNumberList?.length === 0
} }
autoComplete="off" autoComplete="off"
label={<label>Description..</label>} label={<label>Description..</label>}
@ -411,7 +423,6 @@ const BSImeiDetails = (props) => {
</div> </div>
</Form> </Form>
<div style={{ display: 'flex', justifyContent: 'flex-end' }}> <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
<Buttons <Buttons
buttonText="Submit" buttonText="Submit"

View File

@ -514,6 +514,7 @@
position: absolute; position: absolute;
z-index: 10; z-index: 10;
left: 6px; left: 6px;
background-color: unset !important;
} }
.custom-input { .custom-input {
padding: 10px 30px 10px 30px; padding: 10px 30px 10px 30px;