Merge pull request 'Missed Functions' (#94) from feature/pricebulkchanges into main
Reviewed-on: Pozomind/pozo-retail-app#94
This commit is contained in:
commit
c8202c696a
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue