Merge pull request 'Missed Functions' (#94) from feature/pricebulkchanges into main

Reviewed-on: Pozomind/pozo-retail-app#94
This commit is contained in:
karthikalakshmi 2026-02-06 15:44:50 +05:30
commit c8202c696a
3 changed files with 197 additions and 186 deletions

View File

@ -158,7 +158,7 @@ const ProductList = () => {
UomTypePreference?.some?.( UomTypePreference?.some?.(
(e) => (e) =>
e?.PreferredSubCatName?.toLowerCase() == e?.PreferredSubCatName?.toLowerCase() ==
item?.ConfigName?.toLowerCase() && e?.PreferredStatus == 'Y' item?.ConfigName?.toLowerCase() && e?.PreferredStatus == 'Y'
) )
); );
@ -965,19 +965,19 @@ const ProductList = () => {
}, },
...(brandColumn && subCategory ...(brandColumn && subCategory
? [ ? [
{ {
title: 'Brand', title: 'Brand',
dataIndex: 'BrandName', dataIndex: 'BrandName',
key: 'BrandName', key: 'BrandName',
columnKey: 'BrandName', columnKey: 'BrandName',
width: '100px', width: '100px',
render: (text) => <a style={{ color: 'black' }}>{text}</a>, render: (text) => <a style={{ color: 'black' }}>{text}</a>,
sorter: (a, b) => a?.BrandName?.localeCompare(b?.BrandName), sorter: (a, b) => a?.BrandName?.localeCompare(b?.BrandName),
sortOrder: sortOrder:
sortedInfo.columnKey === 'BrandName' ? sortedInfo.order : null, sortedInfo.columnKey === 'BrandName' ? sortedInfo.order : null,
ellipsis: true, ellipsis: true,
}, },
] ]
: []), : []),
{ {
@ -996,127 +996,127 @@ const ProductList = () => {
...(qrCodeColumn ...(qrCodeColumn
? [ ? [
{ {
title: 'QRCode', title: 'QRCode',
dataIndex: 'QRCode', dataIndex: 'QRCode',
key: 'QRCode', key: 'QRCode',
width: '100px', width: '100px',
align: 'center', align: 'center',
render: (text) => ( render: (text) => (
<a style={{ color: 'black' }}>{text ? text : '-'}</a> <a style={{ color: 'black' }}>{text ? text : '-'}</a>
), ),
ellipsis: true, ellipsis: true,
}, },
{ {
title: ( title: (
<Tooltip title=" printing multiple QR codes"> <Tooltip title=" printing multiple QR codes">
<Space> <Space>
{MultiCode && ( {MultiCode && (
<input <input
type="checkbox" type="checkbox"
checked={ checked={
selectedRecords.length > 0 && selectedRecords.length > 0 &&
productData productData
.filter((p) => p?.QRCode) .filter((p) => p?.QRCode)
.every((p) => .every((p) =>
selectedRecords.some((r) => r.ProdId === p.ProdId) selectedRecords.some((r) => r.ProdId === p.ProdId)
) )
} }
onChange={(e) => { onChange={(e) => {
const productsWithQR = productData.filter( const productsWithQR = productData.filter(
(p) => p?.QRCode (p) => p?.QRCode
); );
if (e.target.checked) { if (e.target.checked) {
const newSelections = productsWithQR.filter( const newSelections = productsWithQR.filter(
(p) => (p) =>
!selectedRecords.some( !selectedRecords.some(
(r) => r.ProdId === p.ProdId (r) => r.ProdId === p.ProdId
)
);
setSelectedRecords((prev) => [
...prev,
...newSelections,
]);
// Create QR codes for newly selected products
CreateQrcodesBatch(newSelections, true);
} else {
// Remove QR codes for deselected products
CreateQrcodesBatch(productsWithQR, false);
setSelectedRecords((prev) =>
prev.filter(
(r) =>
!productsWithQR.some(
(p) => p.ProdId === r.ProdId
)
) )
); );
} setSelectedRecords((prev) => [
}} ...prev,
/> ...newSelections,
)} ]);
<span>Print QRCode</span> // Create QR codes for newly selected products
<CheckSquareOutlined CreateQrcodesBatch(newSelections, true);
style={{ } else {
fontSize: '18px', // Remove QR codes for deselected products
cursor: 'pointer', CreateQrcodesBatch(productsWithQR, false);
color: MultiCode ? '#1890ff' : '#666', setSelectedRecords((prev) =>
}} prev.filter(
onClick={() => { (r) =>
setMultiCode((prev) => { !productsWithQR.some(
const newValue = !prev; (p) => p.ProdId === r.ProdId
if (!newValue) { )
setSelectedRecords([]); )
} );
}
return newValue;
});
}} }}
/> />
</Space> )}
</Tooltip> <span>Print QRCode</span>
), <CheckSquareOutlined
key: 'Print', style={{
dataIndex: 'Print', fontSize: '18px',
width: '100px', cursor: 'pointer',
align: 'center', color: MultiCode ? '#1890ff' : '#666',
render: (_, record) => }}
productData.length >= 1 ? ( onClick={() => {
<Space size="middle"> setMultiCode((prev) => {
{MultiCode ? ( const newValue = !prev;
record?.QRCode ? ( if (!newValue) {
<input setSelectedRecords([]);
type="checkbox" }
checked={selectedRecords.some(
(r) => r.ProdId == record.ProdId return newValue;
)} });
onChange={(e) => { }}
handleCheckboxChange(record, e.target.checked); />
CreateQrcode( </Space>
e.target.checked, </Tooltip>
record.QRCode, ),
record?.ProdName, key: 'Print',
record?.StockAvailable, dataIndex: 'Print',
record?.TotalBalanceQty width: '100px',
); align: 'center',
}} render: (_, record) =>
/> productData.length >= 1 ? (
) : ( <Space size="middle">
'-' {MultiCode ? (
) record?.QRCode ? (
) : record?.QRCode ? ( <input
<a> type="checkbox"
<PrinterFilled checked={selectedRecords.some(
style={{ fontSize: '20px' }} (r) => r.ProdId == record.ProdId
onClick={() => Qrcode(record)} )}
/> onChange={(e) => {
</a> handleCheckboxChange(record, e.target.checked);
CreateQrcode(
e.target.checked,
record.QRCode,
record?.ProdName,
record?.StockAvailable,
record?.TotalBalanceQty
);
}}
/>
) : ( ) : (
'-' '-'
)} )
</Space> ) : record?.QRCode ? (
) : null, <a>
}, <PrinterFilled
] style={{ fontSize: '20px' }}
onClick={() => Qrcode(record)}
/>
</a>
) : (
'-'
)}
</Space>
) : null,
},
]
: []), : []),
{ {
@ -1134,11 +1134,11 @@ const ProductList = () => {
style={{ color: '#1292EE' }} style={{ color: '#1292EE' }}
onClick={() => onClick={() =>
UserType === 'Super Admin' || UserType === 'Super Admin' ||
(UserType === 'Super Admin User' && (UserType === 'Super Admin User' &&
SAAccessCommonMaster?.UpdateAccess === 'Y') || SAAccessCommonMaster?.UpdateAccess === 'Y') ||
(UserType === 'Employee' && (UserType === 'Employee' &&
empData?.UpdateAccess === 'Y') || empData?.UpdateAccess === 'Y') ||
UserType === 'Admin' UserType === 'Admin'
? actionsFormatter(record, index) ? actionsFormatter(record, index)
: null : null
} }
@ -1155,11 +1155,11 @@ const ProductList = () => {
}} }}
onClick={() => onClick={() =>
UserType === 'Super Admin' || UserType === 'Super Admin' ||
(UserType === 'Super Admin User' && (UserType === 'Super Admin User' &&
SAAccessCommonMaster?.DeleteAccess === 'Y') || SAAccessCommonMaster?.DeleteAccess === 'Y') ||
(UserType === 'Employee' && (UserType === 'Employee' &&
empData?.DeleteAccess === 'Y') || empData?.DeleteAccess === 'Y') ||
UserType === 'Admin' UserType === 'Admin'
? statusFormatter(record) ? statusFormatter(record)
: null : null
} }
@ -1171,11 +1171,11 @@ const ProductList = () => {
}} }}
onClick={() => onClick={() =>
UserType === 'Super Admin' || UserType === 'Super Admin' ||
(UserType === 'Super Admin User' && (UserType === 'Super Admin User' &&
SAAccessCommonMaster?.DeleteAccess === 'Y') || SAAccessCommonMaster?.DeleteAccess === 'Y') ||
(UserType === 'Employee' && (UserType === 'Employee' &&
empData?.DeleteAccess === 'Y') || empData?.DeleteAccess === 'Y') ||
UserType === 'Admin' UserType === 'Admin'
? statusFormatter(record) ? statusFormatter(record)
: null : null
} }
@ -2269,7 +2269,7 @@ const ProductList = () => {
: generateBarcode(currentCode) : generateBarcode(currentCode)
: !MultiCode : !MultiCode
? base64Image ? base64Image
: generateQRCode(QrandbarcodeDatas, code) : generateQRCode(QrandbarcodeDatas, currentCode)
} }
alt="Barcode" alt="Barcode"
/> />
@ -2641,7 +2641,7 @@ const ProductList = () => {
generateQRCodeCopy={(code) => generateQRCodeCopy={(code) =>
generateQRCodeCopy(QrandbarcodeDatas, code) generateQRCodeCopy(QrandbarcodeDatas, code)
} }
generateCodeImage={generateCodeImage} generateCodeImage={(code, codeType = 'Q') => generateCodeImage(code, codeType, QrandbarcodeDatas) }
imageTagBarcodeAndQR={imageTagBarcodeAndQR} imageTagBarcodeAndQR={imageTagBarcodeAndQR}
dropdownValue={dropdownValue} dropdownValue={dropdownValue}
barcodeTemplateDetails={barcodeTemplateDetails} barcodeTemplateDetails={barcodeTemplateDetails}
@ -2747,7 +2747,7 @@ const ProductList = () => {
}} }}
onlineImage={onlineImage} onlineImage={onlineImage}
ImageLink={rowRecord?.ProdLogo || null} ImageLink={rowRecord?.ProdLogo || null}
updateImageUrl={imageModalRowIndex ? updateImageUrl : () => {}} updateImageUrl={imageModalRowIndex ? updateImageUrl : () => { }}
handleClose={handleImageModalClose} handleClose={handleImageModalClose}
/> />
<button <button

View File

@ -1143,7 +1143,7 @@ const StockList = () => {
: generateBarcode(currentCode) : generateBarcode(currentCode)
: !MultiCode : !MultiCode
? base64Image ? base64Image
: generateQRCode(QrandbarcodeDatas, code) : generateQRCode(QrandbarcodeDatas, currentCode)
} }
alt="Barcode" alt="Barcode"
/> />
@ -1393,7 +1393,7 @@ const StockList = () => {
generateQRCodeCopy={(code) => generateQRCodeCopy={(code) =>
generateQRCodeCopy(QrandbarcodeDatas, code) generateQRCodeCopy(QrandbarcodeDatas, code)
} }
generateCodeImage={generateCodeImage} generateCodeImage={(code, codeType = 'Q') => generateCodeImage(code, codeType, QrandbarcodeDatas)}
imageTagBarcodeAndQR={imageTagBarcodeAndQR} imageTagBarcodeAndQR={imageTagBarcodeAndQR}
dropdownValue={dropdownValue} dropdownValue={dropdownValue}
barcodeTemplateDetails={barcodeTemplateDetails} barcodeTemplateDetails={barcodeTemplateDetails}

View File

@ -1,52 +1,63 @@
import { useSelector, useDispatch } from 'react-redux'; import { useSelector, useDispatch } from 'react-redux';
import { import {
ChangeTotalAmount, ChangeTotalAmount,
globalExtraTotalAmount, globalExtraTotalAmount,
} from '../Features/ExteraCharges/ExtraCharges'; } from '../Features/ExteraCharges/ExtraCharges';
export const useUtilsComponent = () => { export const useUtilsComponent = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const extraCharges = useSelector(globalExtraTotalAmount); const extraCharges = useSelector(globalExtraTotalAmount);
const removeExtraCharge = (item) => { const removeExtraCharge = (item) => {
const filtered = extraCharges?.filter((e) => e?.localId !== item?.localId); const filtered = extraCharges?.filter((e) => e?.localId !== item?.localId);
dispatch(ChangeTotalAmount(filtered)); dispatch(ChangeTotalAmount(filtered));
}; };
return { return {
removeExtraCharge, removeExtraCharge,
}; };
}; };
export const generateBarcode = (code) => { export const generateBarcode = (code) => {
try { try {
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
JsBarcode(svg, code, { JsBarcode(svg, code, {
format: 'CODE128', format: 'CODE128',
displayValue: false, displayValue: false,
lineColor: '#030303', lineColor: '#030303',
width: 2, width: 2,
height: 40, height: 40,
}); });
const svgData = new XMLSerializer().serializeToString(svg); const svgData = new XMLSerializer().serializeToString(svg);
return `data:image/svg+xml;base64,${btoa(svgData)}`; return `data:image/svg+xml;base64,${btoa(svgData)}`;
} catch (error) { } catch (error) {
return null; return null;
} }
}; };
export const generateQRCode = (QrandbarcodeDatas, code) => { export const generateQRCode = (QrandbarcodeDatas, code) => {
let Data = QrandbarcodeDatas?.find((e) => e?.key === code)?.url; let Data = QrandbarcodeDatas?.find((e) => e?.key === code)?.url;
return Data; return Data;
}; };
export const generateQRCodeCopy = (QrandbarcodeDatas, code) => { export const generateQRCodeCopy = (QrandbarcodeDatas, code) => {
const found = QrandbarcodeDatas?.find((e) => e?.key === code); const found = QrandbarcodeDatas?.find((e) => e?.key === code);
const count = Number(found?.copiesCount); const count = Number(found?.copiesCount);
return Number.isFinite(count) && count > 0 ? count : 0; return Number.isFinite(count) && count > 0 ? count : 0;
}; };
export const generateCodeImage = (code, codeType = 'Q') => { export const generateCodeImage = (code, codeType = 'Q', QrandbarcodeDatas) => {
if (codeType === 'B') { if (codeType === 'B') {
return generateBarcode(code); return generateBarcode(code);
} else { } else {
return generateQRCode(QrandbarcodeDatas, code); return generateQRCode(QrandbarcodeDatas, code);
} }
};
export const formatDateForAPI = (date) => {
if (!date) return '';
const d = new Date(date);
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`; // YYYY-MM-DD
}; };