Merge pull request 'Issues Solved' (#311) from PushMainVM into main

Reviewed-on: Pozomind/pozo-retail-app#311
This commit is contained in:
karthikalakshmi 2026-03-25 14:52:52 +05:30
commit bbf2575d37
11 changed files with 1117 additions and 1134 deletions

View File

@ -262,7 +262,7 @@ const styles = {
status: { status: {
marginTop: '6px', marginTop: '6px',
fontSize: '0.7rem', fontSize: '0.6rem',
fontWeight: 600, fontWeight: 600,
letterSpacing: '4px', letterSpacing: '4px',
textTransform: 'uppercase', textTransform: 'uppercase',

View File

@ -3,7 +3,7 @@
height: 90vh; height: 90vh;
overflow: auto; overflow: auto;
scrollbar-width: thin; scrollbar-width: thin;
font-family: 'Poppins'; font-family: "Poppins";
.automated-reorder-content { .automated-reorder-content {
padding-top: 18px; padding-top: 18px;
@ -52,3 +52,11 @@
} }
} }
} }
.automated-reorder-list-content {
.eyeopenShow {
display: flex;
align-items: center;
justify-content: center;
}
}

View File

@ -1,26 +1,32 @@
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from 'react';
import { useDispatch } from "react-redux"; import { useDispatch } from 'react-redux';
import { getSession } from "../../Services/Others"; import { getSession } from '../../Services/Others';
import { changeBreadCrumb, getEmpAccess } from "../../Features/AppPage/CenterPage"; import {
import { Messages } from "../../Components/Notifications/Messages"; changeBreadCrumb,
import { Tables } from "../../Components/Tables/Table"; getEmpAccess,
import FormHeader from "../PageComponents/FormHeader"; } from '../../Features/AppPage/CenterPage';
import Search from "../../Components/Forms/Search"; import { Messages } from '../../Components/Notifications/Messages';
import Buttons from "../../Components/Forms/Buttons"; import { Tables } from '../../Components/Tables/Table';
import FormHeader from '../PageComponents/FormHeader';
import Search from '../../Components/Forms/Search';
import Buttons from '../../Components/Forms/Buttons';
import { import {
EditFilled, EditFilled,
DeleteFilled, DeleteFilled,
PlusOutlined, PlusOutlined,
ReloadOutlined, ReloadOutlined,
} from '@ant-design/icons'; } from '@ant-design/icons';
import { useLocation, useNavigate } from "react-router-dom"; import { useLocation, useNavigate } from 'react-router-dom';
import { Space, Tooltip } from "antd"; import { Space, Tooltip } from 'antd';
import { deleteAutomatedReorder, getAutomatedReorderList } from "../../Features/PurchaseOrder/PurchaseOrder"; import {
import { DefaultModal } from "../../Components/Modal/DefaultModal"; deleteAutomatedReorder,
import { FaRegEye } from "react-icons/fa"; getAutomatedReorderList,
import { render } from "react-dom"; } from '../../Features/PurchaseOrder/PurchaseOrder';
import { useAuth } from "../../AuthContext"; import { DefaultModal } from '../../Components/Modal/DefaultModal';
import "./AutomatedReorder.scss"; import { FaRegEye } from 'react-icons/fa';
import { render } from 'react-dom';
import { useAuth } from '../../AuthContext';
import './AutomatedReorder.scss';
const subDirectory = import.meta.env.BASE_URL; const subDirectory = import.meta.env.BASE_URL;
@ -35,8 +41,6 @@ const items = [
}, },
]; ];
const AutomatedReorderList = () => { const AutomatedReorderList = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const navigate = useNavigate(); const navigate = useNavigate();
@ -62,7 +66,6 @@ const AutomatedReorderList = () => {
const [supplierRecordIndex, setSupplierRecordIndex] = useState(null); const [supplierRecordIndex, setSupplierRecordIndex] = useState(null);
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [searchedText, setSearchedText] = useState(''); const [searchedText, setSearchedText] = useState('');
const [tableData, setTableData] = useState([]); const [tableData, setTableData] = useState([]);
@ -79,9 +82,7 @@ const AutomatedReorderList = () => {
title: 'Product Name', title: 'Product Name',
dataIndex: 'ProdName', dataIndex: 'ProdName',
key: 'ProdName', key: 'ProdName',
render: (_, record) => ( render: (_, record) => `${record.ProdName} (${record.UOMName})`,
`${record.ProdName} (${record.UOMName})`
)
}, },
{ {
title: 'Supplier', title: 'Supplier',
@ -91,7 +92,7 @@ const AutomatedReorderList = () => {
render: (_, record, index) => ( render: (_, record, index) => (
// <div className="productMasterImageUpload"> // <div className="productMasterImageUpload">
<Tooltip title={record.SupplierDetails ? 'View Image' : 'Upload Image'}> <Tooltip title={record.SupplierDetails ? 'View Image' : 'Upload Image'}>
<div> <div className="eyeopenShow">
<FaRegEye <FaRegEye
style={{ background: 'none', cursor: 'pointer' }} style={{ background: 'none', cursor: 'pointer' }}
size={22} size={22}
@ -110,17 +111,15 @@ const AutomatedReorderList = () => {
title: 'Order Type', title: 'Order Type',
dataIndex: 'OrderType', dataIndex: 'OrderType',
key: 'OrderType', key: 'OrderType',
render: (_, record, index) => ( render: (_, record, index) =>
record.OrderType === 'E' ? 'End of Day (EOD)' : 'Immediate' record.OrderType === 'E' ? 'End of Day (EOD)' : 'Immediate',
)
}, },
{ {
title: 'Confirmation Type', title: 'Confirmation Type',
dataIndex: 'OrderProcessing', dataIndex: 'OrderProcessing',
key: 'OrderProcessing', key: 'OrderProcessing',
render: (_, record, index) => ( render: (_, record, index) =>
record.OrderProcessing === 'Y' ? 'Need Confirmation' : 'Auto' record.OrderProcessing === 'Y' ? 'Need Confirmation' : 'Auto',
)
}, },
{ {
title: 'Reorder Quantity', title: 'Reorder Quantity',
@ -134,10 +133,17 @@ const AutomatedReorderList = () => {
key: 'Action', key: 'Action',
width: '100px', width: '100px',
align: 'center', align: 'center',
render: (_, record, index) => ( render: (_, record, index) =>
record.ActiveStatus === 'A' ? ( record.ActiveStatus === 'A' ? (
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', width: '100%', gap: '10px' }}> <div
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
width: '100%',
gap: '10px',
}}
>
<EditFilled <EditFilled
style={{ color: '#1292EE' }} style={{ color: '#1292EE' }}
onClick={() => handleEdit(record)} onClick={() => handleEdit(record)}
@ -152,7 +158,6 @@ const AutomatedReorderList = () => {
style={{ color: '#52C41A' }} style={{ color: '#52C41A' }}
onClick={() => handleActiveAndDeactive(record)} onClick={() => handleActiveAndDeactive(record)}
/> />
)
), ),
}, },
]; ];
@ -163,21 +168,21 @@ const AutomatedReorderList = () => {
dataIndex: 'SLNO', dataIndex: 'SLNO',
key: 'SLNO', key: 'SLNO',
width: '10%', width: '10%',
render: (_, record, index) => index + 1 render: (_, record, index) => index + 1,
}, },
{ {
title: 'Supplier Name', title: 'Supplier Name',
dataIndex: 'SuppName', dataIndex: 'SuppName',
key: 'SuppName', key: 'SuppName',
width: '20%', width: '20%',
} },
]; ];
useEffect(() => { useEffect(() => {
try { try {
if (AppId && CompId && BranchId) { if (AppId && CompId && BranchId) {
dispatch(changeBreadCrumb({ items: items })); dispatch(changeBreadCrumb({ items: items }));
fetchData() fetchData();
if (state?.Notify) { if (state?.Notify) {
setMessageType(state?.Notify.messageType); setMessageType(state?.Notify.messageType);
setMessageData(state?.Notify.messageData); setMessageData(state?.Notify.messageData);
@ -224,16 +229,18 @@ const AutomatedReorderList = () => {
const fetchData = async () => { const fetchData = async () => {
try { try {
const res = await dispatch(getAutomatedReorderList({ AppId, CompId, BranchId }))?.unwrap(); const res = await dispatch(
getAutomatedReorderList({ AppId, CompId, BranchId })
)?.unwrap();
if (res?.data?.statusCode === 1 && res?.data?.data?.length > 0) { if (res?.data?.statusCode === 1 && res?.data?.data?.length > 0) {
setTableData(res?.data?.data) setTableData(res?.data?.data);
} else { } else {
setTableData([]) setTableData([]);
} }
} catch (error) { } catch (error) {
console.error(error, 'error: getAutomatedReorderList'); console.error(error, 'error: getAutomatedReorderList');
} }
} };
const onSearch = (value) => { const onSearch = (value) => {
setSearchedText(value); setSearchedText(value);
@ -244,26 +251,36 @@ const AutomatedReorderList = () => {
const handleAdd = () => { const handleAdd = () => {
navigate(`${subDirectory}setting/automated-reorder/new`); navigate(`${subDirectory}setting/automated-reorder/new`);
} };
const handleEdit = (record) => { const handleEdit = (record) => {
navigate(`${subDirectory}setting/automated-reorder/update`, { navigate(`${subDirectory}setting/automated-reorder/update`, {
state: { state: {
editstate: record, editstate: record,
} },
}); });
} };
const handleActiveAndDeactive = async (record) => { const handleActiveAndDeactive = async (record) => {
const res = await dispatch(deleteAutomatedReorder({ UniqueId: record?.UniqueId, UpdatedBy: UserId, ActiveStatus: record?.ActiveStatus === 'A' ? 'D' : 'A' }))?.unwrap(); const res = await dispatch(
deleteAutomatedReorder({
UniqueId: record?.UniqueId,
UpdatedBy: UserId,
ActiveStatus: record?.ActiveStatus === 'A' ? 'D' : 'A',
})
)?.unwrap();
if (res?.data?.statusCode === 1) { if (res?.data?.statusCode === 1) {
setMessageType('success'); setMessageType('success');
setMessageData(record?.ActiveStatus === 'A' ? 'Deactivated Successfully' : 'Activated Successfully'); setMessageData(
record?.ActiveStatus === 'A'
? 'Deactivated Successfully'
: 'Activated Successfully'
);
fetchData(); fetchData();
} else { } else {
setMessageType('error'); setMessageType('error');
setMessageData(res?.data?.message); setMessageData(res?.data?.message);
} }
} };
const onComplete = useCallback(() => { const onComplete = useCallback(() => {
setMessageType(null); setMessageType(null);
@ -314,7 +331,7 @@ const AutomatedReorderList = () => {
onChange: handlePageChange, onChange: handlePageChange,
defaultPageSize: 10, defaultPageSize: 10,
showSizeChanger: false, showSizeChanger: false,
hideOnSinglePage: true hideOnSinglePage: true,
}} }}
/> />
</div> </div>
@ -331,15 +348,12 @@ const AutomatedReorderList = () => {
}} }}
children={ children={
<div className="automated-reorder-list-content"> <div className="automated-reorder-list-content">
<Tables <Tables columns={supplierColumns} data={supplierRecords} />
columns={supplierColumns}
data={supplierRecords}
/>
</div> </div>
} }
/> />
</section> </section>
) );
} };
export default AutomatedReorderList export default AutomatedReorderList;

View File

@ -120,7 +120,10 @@ import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLo
import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js'; import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js';
import AddProduct from '../../../../Components/AddProduct/AddProduct.jsx'; import AddProduct from '../../../../Components/AddProduct/AddProduct.jsx';
import { MdOutlineAddShoppingCart } from 'react-icons/md'; import { MdOutlineAddShoppingCart } from 'react-icons/md';
import { bulkpostdata, getUomData } from '../../../../Features/ProductPage/ProductPage.js'; import {
bulkpostdata,
getUomData,
} from '../../../../Features/ProductPage/ProductPage.js';
import ProductPriceChange from '../UtillComponents/ProductPriceChange.jsx'; import ProductPriceChange from '../UtillComponents/ProductPriceChange.jsx';
import ExpireConfirmModal from '../BookingFunctionality/ExpireConfirmModal.jsx'; import ExpireConfirmModal from '../BookingFunctionality/ExpireConfirmModal.jsx';
import { calculateOverAllQtyLimit } from '../../../../utils/calculations.js'; import { calculateOverAllQtyLimit } from '../../../../utils/calculations.js';
@ -978,7 +981,6 @@ const BSItemCard = (props) => {
await dispatch( await dispatch(
getOfferinBooking({ AppId: AppId, CompId: CompId, BranchId: BranchId }) getOfferinBooking({ AppId: AppId, CompId: CompId, BranchId: BranchId })
).unwrap(); ).unwrap();
} }
useEffect(() => { useEffect(() => {
@ -1056,8 +1058,7 @@ const BSItemCard = (props) => {
if (AppId && CompId && BranchId) { if (AppId && CompId && BranchId) {
fetchedit(); fetchedit();
GetmultipleSearchData(); GetmultipleSearchData();
getUom() getUom();
} }
// dispatch(changepreOrder(false)); Commented to Add Normal Produts After Adding the Combo Pack !!!!!! Dont Touch Without Shifayath Permission // dispatch(changepreOrder(false)); Commented to Add Normal Produts After Adding the Combo Pack !!!!!! Dont Touch Without Shifayath Permission
@ -1065,7 +1066,7 @@ const BSItemCard = (props) => {
const getUom = () => { const getUom = () => {
dispatch(getUomData()); dispatch(getUomData());
} };
const GetmultipleSearchData = async () => { const GetmultipleSearchData = async () => {
const data = { const data = {
@ -6533,7 +6534,6 @@ const BSItemCard = (props) => {
'12px' '12px'
: '12px', : '12px',
textAlign: 'center', textAlign: 'center',
lineHeight: '2',
fontFamily: SelectedCardFont fontFamily: SelectedCardFont
? SelectedCardFont ? SelectedCardFont
: '', : '',
@ -6568,7 +6568,6 @@ const BSItemCard = (props) => {
'12px' '12px'
: '12px', : '12px',
textAlign: 'center', textAlign: 'center',
lineHeight: '2',
fontFamily: SelectedCardFont fontFamily: SelectedCardFont
? SelectedCardFont ? SelectedCardFont
: '', : '',
@ -6981,7 +6980,6 @@ const BSItemCard = (props) => {
'12px' '12px'
: '12px', : '12px',
textAlign: 'center', textAlign: 'center',
lineHeight: '2',
fontFamily: SelectedCardFont fontFamily: SelectedCardFont
? SelectedCardFont ? SelectedCardFont
: '', : '',
@ -7016,7 +7014,6 @@ const BSItemCard = (props) => {
'12px' '12px'
: '12px', : '12px',
textAlign: 'center', textAlign: 'center',
lineHeight: '2',
fontFamily: SelectedCardFont fontFamily: SelectedCardFont
? SelectedCardFont ? SelectedCardFont
: '', : '',

View File

@ -16,10 +16,8 @@ const BSBillingTable2 = lazy(
() => () =>
import('../../Components/BSBillingTables/BSBillingTable2/BSBillingTable2') import('../../Components/BSBillingTables/BSBillingTable2/BSBillingTable2')
); );
const BSBillingTable3 = lazy(
() => import BSBillingTable3 from '../../Components/BSBillingTables/BSBillingTable3/BSBillingTable3overall';
import('../../Components/BSBillingTables/BSBillingTable3/BSBillingTable3overall')
);
import { dynamicComponentProps } from '../DynamicComponentProps.js'; import { dynamicComponentProps } from '../DynamicComponentProps.js';
import { import {
@ -95,16 +93,10 @@ const BSOtherServicesVerticalcat = lazy(
() => import('../../Components/BSCategories/BSOtherServicesVerticalcat.jsx') () => import('../../Components/BSCategories/BSOtherServicesVerticalcat.jsx')
); );
const SalesCountForStandard = lazy( const SalesCountForStandard = lazy(
() => import('../SalesCountForStandard.jsx') () => import('../SalesCountForStandard.jsx')
); );
const StandardTable = lazy(
() =>
import('../../Components/BSBillingTables/StandardTable/StandardTable.jsx')
);
const ComboSalesBillTable = lazy( const ComboSalesBillTable = lazy(
() => () =>
import('../../Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.jsx') import('../../Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.jsx')

View File

@ -25,8 +25,7 @@ import { Messages } from '../../Components/Notifications/Messages';
import { DefaultModal } from '../../Components/Modal/DefaultModal.jsx'; import { DefaultModal } from '../../Components/Modal/DefaultModal.jsx';
import { useAuth } from '../../AuthContext.jsx'; import { useAuth } from '../../AuthContext.jsx';
import { getPreferenceData } from '../../Features/BookingScreen/BookingData/BookingData.js'; import { getPreferenceData } from '../../Features/BookingScreen/BookingData/BookingData.js';
const subDirectory = import.meta.env.ENV_BASE_URL;
const subDirectory = import.meta.env.BASE_URL;
const items = [ const items = [
{ {
@ -71,7 +70,6 @@ const CustomerMaster = () => {
const [addnewAccess, setaddnewAccess] = useState(true); const [addnewAccess, setaddnewAccess] = useState(true);
const [allowDecimal, setAllowDecimal] = useState(false); const [allowDecimal, setAllowDecimal] = useState(false);
async function fetchData() { async function fetchData() {
if (location?.state?.Notiffy) { if (location?.state?.Notiffy) {
setMessageType(location?.state?.Notiffy.messageType); setMessageType(location?.state?.Notiffy.messageType);
@ -155,13 +153,22 @@ const CustomerMaster = () => {
} }
}; };
const getPreference = async () => { const getPreference = async () => {
const data = { AppId: AppId, CompId: CompId, BranchId: BranchId, UserId: UserId }; const data = {
const { data: res } = await dispatch(getPreferenceData(data)).unwrap() AppId: AppId,
const decimalSetting = res?.data?.[0]?.SettingDtlDetails?.find((setting) => setting?.SettingIdName?.toLowerCase() === "decimal" && setting?.SettingValue === 'Y'); CompId: CompId,
BranchId: BranchId,
UserId: UserId,
};
const { data: res } = await dispatch(getPreferenceData(data)).unwrap();
const decimalSetting = res?.data?.[0]?.SettingDtlDetails?.find(
(setting) =>
setting?.SettingIdName?.toLowerCase() === 'decimal' &&
setting?.SettingValue === 'Y'
);
if (decimalSetting) { if (decimalSetting) {
setAllowDecimal(true) setAllowDecimal(true);
}
} }
};
//Delete //Delete
const statusFormatter = async (row) => { const statusFormatter = async (row) => {
@ -251,7 +258,8 @@ const CustomerMaster = () => {
width: '100px', width: '100px',
render: (text, row) => ( render: (text, row) => (
<a style={{ color: 'black', width: '200px' }}> <a style={{ color: 'black', width: '200px' }}>
{(row?.CustName ? (row?.CustName + ' ') : '') + (row?.CustShortName || "") || row?.CustMobile} {(row?.CustName ? row?.CustName + ' ' : '') +
(row?.CustShortName || '') || row?.CustMobile}
</a> </a>
), ),
filteredValue: [searchedText], filteredValue: [searchedText],
@ -260,8 +268,12 @@ const CustomerMaster = () => {
String(record.CustShortName) String(record.CustShortName)
?.toLowerCase() ?.toLowerCase()
?.includes(value?.toLowerCase()) || ?.includes(value?.toLowerCase()) ||
String(record.CustName)?.toLowerCase()?.includes(value?.toLowerCase()) || String(record.CustName)
String(record.CustMobile)?.toLowerCase()?.includes(value?.toLowerCase()) ?.toLowerCase()
?.includes(value?.toLowerCase()) ||
String(record.CustMobile)
?.toLowerCase()
?.includes(value?.toLowerCase())
); );
}, },
sorter: (a, b) => a?.CustName?.length - b?.CustName?.length, sorter: (a, b) => a?.CustName?.length - b?.CustName?.length,

View File

@ -1,6 +1,5 @@
import React, { useState, useRef, useEffect, useContext } from 'react'; import React, { useState, useRef, useEffect, useContext } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
// import { read, utils } from 'xlsx';
import ExcelJS from 'exceljs'; import ExcelJS from 'exceljs';
import { Table, Form, Input, Tooltip, Modal, Select } from 'antd'; import { Table, Form, Input, Tooltip, Modal, Select } from 'antd';
import { import {
@ -18,7 +17,6 @@ import {
getFieldSetupData, getFieldSetupData,
} from '../../Features/ProductPage/ProductPage.js'; } from '../../Features/ProductPage/ProductPage.js';
import Imageupload from '../../Components/Forms/Upload.jsx'; import Imageupload from '../../Components/Forms/Upload.jsx';
import { BiSolidFileExport } from 'react-icons/bi';
import { CiExport } from 'react-icons/ci'; import { CiExport } from 'react-icons/ci';
import { uploadImage } from '../../Features/upload/upload.js'; import { uploadImage } from '../../Features/upload/upload.js';
@ -617,15 +615,20 @@ const ProductExcel = ({
}; };
console.log(tableFieldPreferences, 'tableFieldPreferences'); console.log(tableFieldPreferences, 'tableFieldPreferences');
useEffect(() => { useEffect(() => {
if (excelData && excelData?.length > 0) { if (excelData && excelData?.length > 0) {
let ExecelToJsConvertion = []; let ExecelToJsConvertion = [];
let slicedData = excelData?.slice(1); let slicedData = excelData?.slice(1);
let filteredData = slicedData?.filter( let filteredData = slicedData?.filter((item) => {
(item) => item?.[item?.length - 1]?.trim() !== 'sample row' const values = Object.values(item || {});
); const lastVal = values[values.length - 1];
return typeof lastVal === 'string'
? lastVal.trim() !== 'sample row'
: true;
});
filteredData?.map((item, index) => { filteredData?.map((item, index) => {
ExecelToJsConvertion.push({ ExecelToJsConvertion?.push({
key: index, key: index,
ProductName: item?.['0'], ProductName: item?.['0'],
Quantity: item?.['1'], Quantity: item?.['1'],
@ -1005,112 +1008,6 @@ const ProductExcel = ({
reader.readAsArrayBuffer(file); reader.readAsArrayBuffer(file);
}; };
// const uploadAndProcessExcel = (file) => {
// const reader = new FileReader();
// reader.onload = (e) => {
// const data = new Uint8Array(e.target.result);
// const workbook = read(data, { type: 'array' });
// const worksheet = workbook.Sheets[workbook.SheetNames[0]];
// const jsonData = utils.sheet_to_json(worksheet, {
// header: 1,
// raw: false,
// dateNF: 'DD/MM/YY',
// });
// const nonEmptyRows = jsonData.filter((row) =>
// row.some((cell) => cell !== '')
// );
// const header = nonEmptyRows[0];
// const rows = nonEmptyRows.slice(1);
// const dateFields = [
// 'Available From',
// 'Available To',
// 'Manufacture Date',
// 'Expire Date',
// 'Stock Date',
// ];
// function convertToDisplayFormat(dateString) {
// const date = new Date(dateString);
// const day = date.getDate().toString().padStart(2, '0');
// const month = (date.getMonth() + 1).toString().padStart(2, '0');
// const year = date.getFullYear().toString();
// return `${day}-${month}-${year}`;
// }
// const formattedData = rows.map((row) => {
// let rowData = header.reduce((acc, col, columnIndex) => {
// if (dateFields?.includes(col)) {
// acc[col] = convertToDisplayFormat(row[columnIndex]);
// } else {
// acc[col] = row[columnIndex];
// }
// return acc;
// }, {});
// return rowData;
// });
// if (jsonData.length > 0) {
// const extractedHeaders = Object.keys(formattedData[0]);
// const filteredData = formattedData.filter(
// (item) => !Object.values(item)?.includes('sample row')
// );
// // Add default variant name if missing
// const updatedData = filteredData.map((item) => ({
// ...item,
// 'Product Varient Name':
// item['Product Varient Name'] === undefined
// ? 'Variant 1'
// : item['Product Varient Name'],
// 'Available To':
// item['Available To'] == 'NaN-NaN-NaN' ? '' : item['Available To'],
// ProdId: item['ProdId'] || null,
// }));
// // Detect modified products
// const modifiedProducts = findModifiedProducts(OrginalData, updatedData);
// const modifiedIds = new Set(modifiedProducts.map((p) => p.ProdId));
// const originalIds = new Set(OrginalData?.map((p) => p.ProdId) || []);
// const markedData = updatedData
// .map((item) => ({
// ...item,
// isModified:
// modifiedIds.has(item.ProdId) || !originalIds.has(item.ProdId),
// }))
// .sort((a, b) => b.isModified - a.isModified);
// setUploadedRawData(markedData);
// console.log(modifiedProducts, 'modifiedProducts');
// // Set only once with final data
// setHeaders(extractedHeaders);
// autoMapFields(extractedHeaders);
// dispatch(uploadExcel({ file, jsonData: nonEmptyRows }));
// setWorksheet(worksheet);
// setDatas([]); // Clear mapped state initially
// setExcelData([]);
// }
// // setMappingOpen(true);
// dispatch(uploadExcel({ file, jsonData: nonEmptyRows }));
// setWorksheet(worksheet);
// setWorksheet1(worksheet1);
// setDatas(formattedData); // Update Datas state here
// // setExcelData(formattedData);
// };
// reader.readAsArrayBuffer(file);
// };
useEffect(() => { useEffect(() => {
imagecall(); imagecall();
addOnlineImage(); addOnlineImage();
@ -1875,24 +1772,6 @@ const ProductExcel = ({
} }
}); });
// // Now set protection for all rows
// // First, unlock ALL cells in the worksheet
// for (let rowNum = 1; rowNum <= worksheet.rowCount; rowNum++) {
// const row = worksheet.getRow(rowNum);
// row.eachCell({ includeEmpty: true }, (cell, colNumber) => {
// const config = selectedColumns[colNumber - 1];
// cell.protection = { locked: config?.locked || false };
// });
// }
// // Then lock ONLY the header row (row 1) and sample row (row 2)
// worksheet.getRow(1).eachCell({ includeEmpty: true }, (cell) => {
// cell.protection = { locked: true };
// });
// worksheet.getRow(2).eachCell({ includeEmpty: true }, (cell) => {
// cell.protection = { locked: true };
// });
// Add empty rows for data entry // Add empty rows for data entry
for (let i = 1; i <= 1000; i++) { for (let i = 1; i <= 1000; i++) {
worksheet.addRow({}); worksheet.addRow({});
@ -2497,18 +2376,6 @@ const ProductExcel = ({
} }
}; };
// Usage examples:
// Download only specific fields:
// handleDownload(['ProdName', 'Size']); // Only Product Name and Quantity
// handleDownload(['ProdName', 'Size', 'UOM', 'SellPrice']); // Multiple fields
// handleDownload(['ProdName', 'Size', 'UOM', 'SellPrice', 'ProdCat', 'Brand']); // More fields
// Available field names:
// 'ProdName', 'Size', 'UOM', 'SellPrice', 'ProdCat', 'ProdSubCat', 'Brand',
// 'ProdVarientName', 'MRP', 'StockAvailable', 'OfferPrice', 'Supplier', 'TaxId',
// 'AutoGenerateQr', 'AddQrCode', 'SpecialPrice', 'OnePiecePrice', 'AutoGenOnePieceQr',
// 'AutoGenOnePieceQrNum', 'CESS', 'HSNCode', 'PartNumber', 'Rack', 'ManufDate',
// 'ExpDate', 'AvailableFrom', 'AvailableTo'
const handleFileSubmit = (e) => { const handleFileSubmit = (e) => {
e.preventDefault(); e.preventDefault();
if (excelFile === null) { if (excelFile === null) {
@ -2883,7 +2750,7 @@ const ProductExcel = ({
<div <div
className="editable-cell-value-wrap" className="editable-cell-value-wrap"
style={{ style={{
paddingRight: 24, textAlign: 'right',
}} }}
onClick={toggleEdit} onClick={toggleEdit}
> >
@ -3162,13 +3029,24 @@ const ProductExcel = ({
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
justifyContent: 'space-between', justifyContent: 'space-between',
height: '80%', alignItems: 'center',
height: '60%',
}} }}
> >
<div style={{ display: 'flex', flexDirection: 'column' }}> <div style={{ display: 'flex', flexDirection: 'column' }}>
<span>{col.title}</span> <span
style={{
whiteSpace: 'nowrap',
fontWeight: '500',
fontFamily: 'Poppins',
}}
>
{col.title}
</span>
{!isMapped && ( {!isMapped && (
<span style={{ color: 'red', fontSize: '11px' }}>Not mapped</span> <span style={{ color: '#f7a0a0', fontSize: '11px' }}>
Not mapped
</span>
)} )}
</div> </div>
@ -3217,7 +3095,7 @@ const ProductExcel = ({
style={{ style={{
position: 'absolute', position: 'absolute',
right: '-17px', right: '-17px',
top: '80%', top: '90%',
transform: 'translateY(-50%)', transform: 'translateY(-50%)',
color: 'red', color: 'red',
fontSize: 14, fontSize: 14,
@ -3347,14 +3225,15 @@ const ProductExcel = ({
autoComplete="off" autoComplete="off"
onSubmit={handleFileSubmit} onSubmit={handleFileSubmit}
> >
<div <div className="download-linkMain">
<div className="HeadingUploadExl">
<p
style={{ style={{
display: 'flex', fontSize: '16px',
justifyContent: 'space-between', fontWeight: '500',
flexWrap: 'wrap', whiteSpace: 'nowrap',
}} }}
> >
<p style={{ fontSize: '20px', fontWeight: '500' }}>
Upload Your Excel Upload Your Excel
</p> </p>
@ -3363,7 +3242,6 @@ const ProductExcel = ({
display: 'flex', display: 'flex',
flexDirection: 'row', flexDirection: 'row',
gap: '0.5rem', gap: '0.5rem',
margin: '1rem 0',
}} }}
> >
<Tooltip title="Field Setup"> <Tooltip title="Field Setup">
@ -3394,18 +3272,10 @@ const ProductExcel = ({
Export Excel Export Excel
</div> </div>
</div> </div>
{/* {excelData?.length > 0 && excelData &&
<div className="export-excel-div" onClick={() => setMappingOpen(true)}> {message && (
<div> <div style={{ color: '#ff4d4f' }}>No Data Found</div>
<CiBoxList /> )}
</div>
<div>
Map Your Fields
</div>
</div>
} */}
{loading && <div style={{ color: '#ff4d4f' }}>Loading...</div>}
{message && <div style={{ color: '#ff4d4f' }}>No Data Found</div>}
</div> </div>
{excelData?.length > 0 && excelData && ( {excelData?.length > 0 && excelData && (
@ -3426,11 +3296,9 @@ const ProductExcel = ({
className="download-link" className="download-link"
style={{ style={{
display: 'flex', display: 'flex',
alignItems: 'flex-end',
// justifyContent: "space-between",
justifyContent: justifyContent:
excelData?.length > 0 ? 'space-between' : 'flex-end', excelData?.length > 0 ? 'space-between' : 'flex-end',
width: '100%', gap: '1rem',
}} }}
> >
{excelData?.length > 0 && ( {excelData?.length > 0 && (
@ -3453,6 +3321,7 @@ const ProductExcel = ({
</button> </button>
</Tooltip> </Tooltip>
</div> </div>
</div>
{(!excelData || excelData?.length === 0) && ( {(!excelData || excelData?.length === 0) && (
<> <>
@ -3542,13 +3411,6 @@ const ProductExcel = ({
margin: '1rem 0rem', margin: '1rem 0rem',
}} }}
> >
{/* <Tooltip title="Format Sheet" placement="bottom">
<div className="download-link" onClick={handleDownload} style={{ display: 'flex', alignItems: 'center', gap: '.5rem', padding: '0.3rem 0.4rem', borderRadius: '6px', backgroundColor: 'ghostwhite' }} >
<FiDownload style={{ fontSize: '20px', }} />
<a style={{ color: '#000' }}> Download</a>
</div>
</Tooltip> */}
{excelData && excelData?.length > 0 && ( {excelData && excelData?.length > 0 && (
<div <div
className="cancel-link" className="cancel-link"
@ -3579,7 +3441,11 @@ const ProductExcel = ({
/> />
</div> </div>
<div className="field-setup-content"> <div className="field-setup-content">
<Form onFinish={handleFieldSetupSubmit} ref={formRef}> <Form
onFinish={handleFieldSetupSubmit}
ref={formRef}
style={{ marginTop: '1rem' }}
>
<Form.Item name="fields"> <Form.Item name="fields">
<DropDowns <DropDowns
label="Select fields" label="Select fields"
@ -3658,7 +3524,6 @@ const ProductExcel = ({
<Modal <Modal
title="Map Your Fields" title="Map Your Fields"
open={MappingOpen} open={MappingOpen}
// onOk={handleMappingConfirm}
onCancel={() => setMappingOpen(false)} onCancel={() => setMappingOpen(false)}
> >
{requiredFields.map((field) => { {requiredFields.map((field) => {

View File

@ -2714,7 +2714,7 @@ const ProductList = () => {
open={openExcel} open={openExcel}
title="Bulk Upload" title="Bulk Upload"
footer={true} footer={true}
width={excelDataValues?.length > 0 ? 2500 : 600} width={excelDataValues?.length > 0 ? 2500 : 700}
className={'bulkuploadmodal'} className={'bulkuploadmodal'}
children={ children={
<> <>

View File

@ -78,7 +78,7 @@
} }
.BSItemCard-content { .BSItemCard-content {
padding: 1px 0; padding: 3px 0;
background-color: rgba(255, 255, 255, 0.8); background-color: rgba(255, 255, 255, 0.8);
position: absolute; position: absolute;
display: flex; display: flex;
@ -96,7 +96,8 @@
font-weight: 500; font-weight: 500;
max-width: 130px; max-width: 130px;
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 3; -webkit-line-clamp: 2;
line-height: 1;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
} }

View File

@ -1721,3 +1721,17 @@ table {
right: 2rem; right: 2rem;
} }
} }
.addVariant {
background: #23378a29;
color: #23378a;
padding: 12px 24px;
border: none;
font-family: "Poppins", sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
border-radius: 6px;
outline: none;
height: max-content;
}

View File

@ -8,12 +8,7 @@
font-weight: bold !important; font-weight: bold !important;
} }
// .viewerExcelupload table {
// // table-layout: auto !important;
// }
.viewerExcelupload::-webkit-scrollbar { .viewerExcelupload::-webkit-scrollbar {
// display: block !important;
width: 0rem; width: 0rem;
height: 0.5rem; height: 0.5rem;
} }
@ -28,7 +23,7 @@
background-color: #1292ee; background-color: #1292ee;
color: #fff; color: #fff;
border-radius: 4px; border-radius: 4px;
font-family: 'Poppins'; font-family: "Poppins";
font-size: 16px; font-size: 16px;
svg { svg {
@ -48,6 +43,8 @@
.tableExcelUpload { .tableExcelUpload {
.ant-table-cell { .ant-table-cell {
padding: 0 8px !important; padding: 0 8px !important;
font-family: "Poppins";
font-weight: 500 !important;
} }
.ant-select-selection-placeholder { .ant-select-selection-placeholder {
@ -129,16 +126,16 @@
} }
.mdsheet { .mdsheet {
width: 25px; width: 20px;
height: 25px; height: 20px;
border: 1px solid #5bff73; border: 1px solid #5bff73;
background-color: #b3ffbf; background-color: #b3ffbf;
border-radius: 4px; border-radius: 4px;
} }
.mdsheet2 { .mdsheet2 {
width: 25px; width: 20px;
height: 20px;
border-radius: 4px; border-radius: 4px;
height: 25px;
background-color: #ffc7f8; background-color: #ffc7f8;
border: 1px solid #ff74ec; border: 1px solid #ff74ec;
} }
@ -148,5 +145,88 @@
font-family: "Poppins"; font-family: "Poppins";
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
@media (max-width: 500px) {
font-size: 10px;
} }
} }
}
.field-setup-selected-fields {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-bottom: 50px;
height: max-content;
max-height: 50vh;
overflow: auto;
.selected-field {
display: flex;
align-items: center;
gap: 4px;
background: #0bad77;
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
font-weight: 600;
color: #fff;
.close-icon {
display: flex;
align-items: center;
cursor: pointer;
> svg {
color: #ffffffff !important;
}
}
}
}
.HeadingUploadExl {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
width: 50%;
@media (max-width: 950px) {
width: 100%;
}
}
.download-linkMain {
display: flex;
align-items: center;
gap: 1rem;
justify-content: space-between;
margin-bottom: 10px;
@media (max-width: 950px) {
flex-wrap: wrap;
}
}
.download-link {
width: 50%;
justify-content: space-between;
align-items: center;
@media (max-width: 950px) {
width: 100%;
}
}
.viewerExcelupload {
.ant-select-selection-item {
margin-top: 0 !important ;
padding-top: 0 !important;
}
}
.download-link span {
font-size: 12px;
font-weight: 400;
}
.imgUpldr {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
}