Android_Retail/src/Pages/BookingScreen/Components/PrintMainPage/SalesPrintSize.jsx

489 lines
15 KiB
React
Raw Normal View History

2026-02-11 11:35:57 +05:30
import { Switch, Tooltip } from 'antd';
import { useDispatch } from 'react-redux';
import {
changeBillName,
changeNotes,
changeSelectedAmount,
changeSelectedDiscount,
changeSelectedHsnCode,
changeSelectedItem,
changeSelectedMRP,
changeSelectedprintStyle,
changeSelectedQrcode,
changeSelectedQuantity,
changeSelectedRate,
changeSelectedSignature,
changeSelectedSlNo,
changeSelectedtermsAndConditions,
changeSignatureImage,
changethemeFormat,
getPrintSelectionComponentData,
putPrintSelectionComponentData,
changeSelectedPrintdummyData,
} from '../../../../Features/ThemeChange/ThemeChange';
import { useEffect, useState, useMemo, useCallback } from 'react';
import {
InfoCircleOutlined,
UploadOutlined,
PlusOutlined,
MinusCircleOutlined,
ArrowRightOutlined,
EditFilled,
DeleteFilled,
} from '@ant-design/icons';
import { getSession } from '../../../../Services/Others';
import Buttons from '../../../../Components/Forms/Buttons';
import { Messages } from '../../../../Components/Notifications/Messages';
2026-01-27 18:27:29 +05:30
const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
2026-02-11 11:35:57 +05:30
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const UserId = getSession('UserId');
const dispatch = useDispatch();
const [PrintType, setPrintType] = useState(false);
const [PageSize, setPageSize] = useState(false);
// const [PrintTemplates, setPrintTemplates] = useState([])
const [SizeOptionData, setSizeOptionData] = useState([]);
const [selectedTemplate, setSelectedTemplate] = useState(null);
const [messageType, setMessageType] = useState('');
const [messageData, setMessageData] = useState('');
console.log(selectedTemplate, 'selectedTemplate');
// Memoized values for better performance
const currentPrintType = useMemo(() => {
if (selectedTemplate) {
return selectedTemplate.PrintType === 'S' ? true : false;
}
return PrintType;
}, [selectedTemplate, PrintType]);
const currentPageSize = useMemo(() => {
if (selectedTemplate) {
return selectedTemplate.PageSize === 'A5' ? true : false;
}
return PageSize;
}, [selectedTemplate, PageSize]);
// Get the actual values to pass to parent component
const getPrintTypeValue = () => {
if (selectedTemplate) {
return selectedTemplate.PrintType;
}
return PrintType ? 'S' : 'C';
};
const getPageSizeValue = () => {
if (selectedTemplate) {
return selectedTemplate.PageSize;
}
return PageSize ? 'A5' : 'A4';
};
useEffect(() => {
printsyleget();
}, []);
// Auto-select default template when data loads
useEffect(() => {
if (SizeOptionData.length > 0) {
const defaultTemplate = SizeOptionData.find(
(template) => template.SetasDefault === 'Y'
);
if (defaultTemplate) {
handleTemplateSelect(defaultTemplate);
}
}
}, [SizeOptionData]);
const handleTemplateSelect = (template) => {
setSelectedTemplate(template);
setPrintType(template.PrintType === 'S');
setPageSize(template.PageSize === 'A5');
stylePreview(template);
// Immediately pass the template settings
if (onSettingsChange && typeof onSettingsChange === 'function') {
const currentSettings = {
PrintType: template.PrintType,
PageSize: template.PageSize,
selectedTemplate: template,
};
console.log('Template Selected - Settings:', currentSettings);
onSettingsChange(currentSettings);
}
};
const onChangeToggle = async (e) => {
setPrintType(e);
await dispatch(changethemeFormat(e));
// If a template is selected, update it
if (selectedTemplate) {
const updatedTemplate = {
...selectedTemplate,
PrintType: e ? 'S' : 'C',
};
setSelectedTemplate(updatedTemplate);
// Immediately pass updated settings
if (onSettingsChange && typeof onSettingsChange === 'function') {
const currentSettings = {
PrintType: updatedTemplate.PrintType,
PageSize: updatedTemplate.PageSize,
selectedTemplate: updatedTemplate,
};
onSettingsChange(currentSettings);
}
}
};
const onChangepageSize = async (e) => {
setPageSize(e);
// If a template is selected, update it
if (selectedTemplate) {
const updatedTemplate = {
...selectedTemplate,
PageSize: e ? 'A5' : 'A4',
};
setSelectedTemplate(updatedTemplate);
if (onSettingsChange && typeof onSettingsChange === 'function') {
const currentSettings = {
PrintType: updatedTemplate.PrintType,
PageSize: updatedTemplate.PageSize,
selectedTemplate: updatedTemplate,
};
onSettingsChange(currentSettings);
}
}
};
const stylePreview = async (template) => {
if (!template) return;
const {
StyleId,
StyleName,
PrintType: printType,
PageSize,
Notes,
PrintHdrName,
Signature,
TermsandConditions,
OptionDetails,
} = template;
const helperFunction = (param) => {
return OptionDetails.some((item) => item.ConfigName === param);
2026-01-27 18:27:29 +05:30
};
2026-02-11 11:35:57 +05:30
dispatch(changeSelectedSlNo(helperFunction('Sl.No')));
dispatch(changeSelectedItem(helperFunction('Item')));
dispatch(changeSelectedMRP(helperFunction('MRP')));
dispatch(changeSelectedDiscount(helperFunction('Discount')));
dispatch(changeSelectedQuantity(helperFunction('Quantity')));
dispatch(changeSelectedRate(helperFunction('Rate')));
dispatch(changeSelectedAmount(helperFunction('Amount')));
dispatch(changeSelectedHsnCode(helperFunction('HsnCode')));
dispatch(changeSelectedQrcode(helperFunction('Qrcode')));
dispatch(changeSelectedSignature(helperFunction('signature')));
dispatch(
changeSelectedtermsAndConditions(helperFunction('terms&conditions'))
);
dispatch(changeNotes(helperFunction('Notes')));
dispatch(changeSignatureImage(Signature));
dispatch(changeBillName(PrintHdrName));
dispatch(
changeSelectedprintStyle({
ConfigId: StyleId,
ConfigName: StyleName,
})
);
};
const printsyleget = async () => {
try {
const Data = { AppId, CompId, BranchId };
let response = await dispatch(
getPrintSelectionComponentData(Data)
).unwrap();
if (response?.data?.statusCode === 1) {
// const salesTemplates = response.data.data?.flatMap(template =>
// (template.ComponentDetails || []).filter(comp => comp.PrintTypeName === "Sales" && comp.SetasDefault === "Y")
// );
// setPrintTemplates(salesTemplates);
let TableData = response?.data?.data?.[0]?.ComponentDetails.map(
(item) => ({
ActiveStatus: 'A',
OptionDetails: item.FieldDetails,
StyleId: item.StyleId,
SetasDefault: item.SetasDefault,
SetasDefaultInvoice: item.SetasDefaultInvoice,
StyleName: item.StyleName,
Signature: item.Signature,
PrintType: item.PrintType,
PrintHdrName: item.PrintHdrName,
Notes: item?.Notes,
PageSize: item?.PageSize,
PrintTypeId: item?.PrintTypeId,
TermsandConditions: (item?.TermsandConditions
? item?.TermsandConditions
: []
)?.map((tc) => tc?.TermsandConditions),
})
)?.sort((a, b) => {
if ((a.StyleName || '') === 'A4Standard') return 1;
if ((b.StyleName || '') === 'A4Standard') return -1;
const isA4orA5 = (name) => /A4|A5/i.test(name);
const nameA = a.StyleName || '';
const nameB = b.StyleName || '';
if (isA4orA5(nameA) && !isA4orA5(nameB)) return 1;
if (!isA4orA5(nameA) && isA4orA5(nameB)) return -1;
const numA = parseInt(nameA.match(/\d+/)?.[0]) || 0;
const numB = parseInt(nameB.match(/\d+/)?.[0]) || 0;
return numA - numB;
});
setSizeOptionData(TableData);
}
} catch (error) {
console.error('Error fetching print styles:', error);
}
};
// Log current values for debugging
console.log('Current PrintType:', getPrintTypeValue());
console.log('Current PageSize:', getPageSizeValue());
console.log('Selected Template:', selectedTemplate);
useEffect(() => {
const currentSettings = {
PrintType: getPrintTypeValue(),
PageSize: getPageSizeValue(),
selectedTemplate,
2026-01-27 18:27:29 +05:30
};
2026-02-11 11:35:57 +05:30
console.log('Current Print Settings:', currentSettings);
// Call the callback if provided
if (onSettingsChange && typeof onSettingsChange === 'function') {
onSettingsChange(currentSettings);
}
}, [selectedTemplate, PrintType, PageSize]); // Removed onSettingsChange from dependencies
// Also pass data when component mounts and when selectedTemplate changes
useEffect(() => {
if (
selectedTemplate &&
onSettingsChange &&
typeof onSettingsChange === 'function'
) {
const currentSettings = {
PrintType: selectedTemplate.PrintType,
PageSize: selectedTemplate.PageSize,
selectedTemplate,
};
console.log('Template-based Print Settings:', currentSettings);
onSettingsChange(currentSettings);
}
}, [selectedTemplate]);
const onfinish = async (values) => {
try {
if (!SizeOptionData || SizeOptionData.length === 0) {
setMessageType('error');
setMessageData('Please Setup the Screen');
return;
}
if (!selectedTemplate) {
setMessageType('error');
setMessageData('Please select a template first');
return;
}
const currentPrintType = getPrintTypeValue(); // 'S' or 'C'
const currentPageSize = getPageSizeValue(); // 'A4' or 'A5'
// Only one "Sales" style should have SetasDefault: "Y"
const updatedTemplates = SizeOptionData.map((item) => {
if (item.PrintType === 'Sales' || item.PrintType === 'S') {
return {
...item,
SetasDefault: item.StyleId === selectedTemplate.StyleId ? 'Y' : 'N',
};
2026-01-27 18:27:29 +05:30
}
2026-02-11 11:35:57 +05:30
return item;
});
let TemplateDetails = updatedTemplates.map((item) => {
const isSelectedTemplate = item.StyleId === selectedTemplate.StyleId;
return {
SizeId: null,
StyleId: item.StyleId,
SetasDefault: item.SetasDefault,
SetasDefaultInvoice: item.SetasDefaultInvoice,
PrintTypeId: item?.PrintTypeId,
SizeDetails: item.OptionDetails.map((opt) => ({
OptionId: opt.ConfigId,
})),
...(item?.TermsandConditions?.length > 0
? {
PrintTermsandConditions: (item?.TermsandConditions
? item?.TermsandConditions
: []
)?.map((tc) => ({
TermsandConditions: tc,
})),
}
: {}),
...(item?.Notes ? { Notes: item.Notes } : {}),
PageSize: isSelectedTemplate ? currentPageSize : item?.PageSize,
...(item?.PrintHdrName ? { PrintHdrName: item.PrintHdrName } : {}),
...(item?.Signature ? { Signature: item?.Signature } : {}),
PrintType: isSelectedTemplate ? currentPrintType : item?.PrintType,
2026-01-27 18:27:29 +05:30
};
2026-02-11 11:35:57 +05:30
});
const Data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
TemplateDetails: TemplateDetails,
CreatedBy: UserId,
};
// console.log('API Request Data:', Data);
const response = await dispatch(
putPrintSelectionComponentData(Data)
).unwrap();
if (response?.data?.statusCode === 1) {
dispatch(changeSelectedPrintdummyData(false));
await printsyleget();
setMessageType('success');
setMessageData(response?.data?.response);
if (closeModel) {
closeModel();
2026-01-27 18:27:29 +05:30
}
2026-02-11 11:35:57 +05:30
}
} catch (error) {
console.error('Error setting default template:', error);
setMessageType('error');
setMessageData('Failed to set default template');
}
};
const onComplete = useCallback(() => {
setMessageData(null);
setMessageType(null);
}, []);
return (
<div
style={{
display: 'flex',
flexDirection: 'column',
gap: '1rem',
alignItems: 'center',
justifyContent: 'center',
}}
>
<Messages
messageType={messageType}
messageData={messageData}
onComplete={onComplete}
/>
<div style={{ textAlign: 'center' }}>
<p> Print : {selectedTemplate?.StyleName}</p>
</div>
<div style={{ display: 'flex', gap: '1rem' }}>
<div>
{
<div
style={{
display: 'flex',
alignItems: 'center',
gap: '1rem',
backgroundColor: '#f5f5f5',
padding: '0.75rem 1rem',
borderRadius: '12px',
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
maxWidth: 'fit-content',
margin: '1rem 0 0 0',
}}
>
<span style={{ fontWeight: '500', color: '#555' }}>
Customized
<Tooltip title="Print will stop when the content finishes. It won't waste paper.">
<InfoCircleOutlined
style={{
color: '#1890ff',
cursor: 'pointer',
marginLeft: '5px',
}}
/>
</Tooltip>
</span>
<Switch checked={currentPrintType} onChange={onChangeToggle} />
<span style={{ fontWeight: '500', color: '#555' }}>
Standard
<Tooltip title=" Print will take full paper, even if there's less content.">
<InfoCircleOutlined
style={{
color: '#1890ff',
cursor: 'pointer',
marginLeft: '5px',
}}
/>
</Tooltip>
</span>
2026-01-27 18:27:29 +05:30
</div>
2026-02-11 11:35:57 +05:30
}
</div>
2026-01-27 18:27:29 +05:30
2026-02-11 11:35:57 +05:30
<div>
{currentPrintType && (
<div
style={{
display: 'flex',
alignItems: 'center',
gap: '1rem',
backgroundColor: '#f5f5f5',
padding: '0.75rem 1rem',
borderRadius: '12px',
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
maxWidth: 'fit-content',
margin: '1rem 0 0 0',
}}
>
<span style={{ fontWeight: '500', color: '#555' }}>A4</span>
<Switch checked={currentPageSize} onChange={onChangepageSize} />
<span style={{ fontWeight: '500', color: '#555' }}>A5</span>
2026-01-27 18:27:29 +05:30
</div>
2026-02-11 11:35:57 +05:30
)}
2026-01-27 18:27:29 +05:30
</div>
2026-02-11 11:35:57 +05:30
</div>
<div
style={{ display: 'flex', justifyContent: 'flex-end', width: '100%' }}
>
<Buttons
buttonText="Save"
color="901D77"
icon={<ArrowRightOutlined />}
htmlType={true}
handleSubmit={onfinish}
/>
</div>
</div>
);
};
export default SalesPrintSize;