import { Checkbox, Form, Modal, Row } from 'antd'; import { DropDowns } from '../../../../Components/Forms/DropDown'; import { InputField } from '../../../../Components/Forms/InputField'; import { validateSafeInput } from '../../../../Services/Others'; import { DefaultModal } from '../../../../Components/Modal/DefaultModal'; import { CloseOutlined, ArrowRightOutlined } from '@ant-design/icons'; import { IoMdAdd } from 'react-icons/io'; import { useCallback, useEffect, useState } from 'react'; import { SwatchesPicker } from 'react-color'; import { RadioGrpButton } from '../../../../Components/Forms/RadioGroup'; import { useSelector } from 'react-redux'; import { getSalesTemplate, getTemplate, postColorData, postTableFontData, putSelectionComponentData, StoredSessionData, } from '../../../../Features/ThemeChange/ThemeChange'; import { useDispatch } from 'react-redux'; import Buttons from '../../../../Components/Forms/Buttons'; import { Messages } from '../../../../Components/Notifications/Messages'; import './AllSalesPageSettings.scss'; const TableHeadersetting = ({ setModalOpen }) => { const dispatch = useDispatch(); const SessionData = useSelector(StoredSessionData); const AppId = SessionData?.AppId; const CompId = SessionData?.CompId; const BranchId = SessionData?.BranchId; const UserId = SessionData?.UserId; const UserType = SessionData?.UserType; const [messageType, setMessageType] = useState(null); const [messageData, setMessageData] = useState(null); const [TemplateDetails, setTemplateDetails] = useState([]); const [TableFontData, setTableFontData] = useState([ { FontId: 1, SessionFont: 'Arial' }, { FontId: 2, SessionFont: 'Roboto' }, { FontId: 3, SessionFont: 'Open Sans' }, { FontId: 4, SessionFont: 'Lato' }, { FontId: 5, SessionFont: 'Montserrat' }, ]); const [selectedTableFont, setSelectedTableFont] = useState(); console.log(selectedTableFont, 'selectedTableFontselectedTableFont'); const [TableFontModelopen, setTableFontModelopen] = useState(false); const [SelectedTableColor, setSelectedTableColor] = useState(null); const [Tableform] = Form.useForm(); const [billingSettings, setBillingSettings] = useState(); console.log(billingSettings, 'billingSettingsbillingSettings'); const [SelectedBillTableCheckValues, setSelectedBillTableCheckValues] = useState([]); const backgroundOptionId = billingSettings?.ComponentOptionsDetails?.find( (item) => item?.OptionName === 'Background' )?.OptionId; const hasBackground = SelectedBillTableCheckValues?.includes(backgroundOptionId); const OverallbackgroundOptionId = billingSettings?.ComponentOptionsDetails?.find( (item) => item?.OptionName === 'OverallBackground' )?.OptionId; const hasOverallBackground = SelectedBillTableCheckValues?.includes( OverallbackgroundOptionId ); // Hold and addcustomer OptionsDetails const [HoldButton, setHoldButton] = useState(false); const [AddCustomerButton, setAddCustomerButton] = useState(false); const [DineInChecked, setDineInChecked] = useState(false); console.log(billingSettings, 'billingSettingsbillingSettings'); const [TableBackgroundColorData, setTableBackgroundColorData] = useState([ { ColorId: 4, SessionId: 55, OptionId: 108, FontColor: '#000000', BackgroundColor: '#f06292', ThemeName: 'Theme 4', ActiveStatus: 'A', }, { ColorId: 14, SessionId: 55, OptionId: 108, FontColor: '#000000', BackgroundColor: '#52C41A', ThemeName: 'Theme 14', ActiveStatus: 'A', }, { ColorId: 23, SessionId: 55, OptionId: 108, FontColor: '#000000', BackgroundColor: '#0d47a1', ThemeName: 'Theme 23', ActiveStatus: 'A', }, { ColorId: 25, SessionId: 55, OptionId: 108, FontColor: '#000000', BackgroundColor: '#f8bbd0', ThemeName: 'Theme 25', ActiveStatus: 'A', }, { ColorId: 29, SessionId: 55, OptionId: 108, FontColor: '#000000', BackgroundColor: '#ffcdd2', ThemeName: 'Theme 29', ActiveStatus: 'A', }, ]); const [BillingOverallColorsList, setBillingOverallColorsList] = useState(); const [BillUploadColor, setBillUploadColor] = useState(false); const [TableColorType, setTableColorType] = useState('Y'); const [TablebackgroundColor, setTablebackgroundColor] = useState('#009b00'); const [tableBGHex, setTableBGHex] = useState( TablebackgroundColor?.replace('#', '').trim() ); const [TablefontColor, setTablefontColor] = useState('#000000'); const [tableFontHex, setTableFontHex] = useState( TablefontColor?.replace('#', '').trim() ); const [BillingUploadOverallColor, setBillingUploadOverallColor] = useState(false); const [BillingOverallColor, setBillingOverallColor] = useState('#000000'); const [billingOverallHex, setBillingOverallHex] = useState( BillingOverallColor?.replace('#', '').trim() ); const [selectOverallSelected, setSelectOverallSelected] = useState(true); const [dropdownBillingOverallColor, setdropdownBillingOverallColor] = useState(null); const [FirstOnClick, setFirstOnClick] = useState(false); useEffect(() => { GetTemplatedetails(); }, []); const GetTemplatedetails = async () => { let Data = { CompId: CompId, AppId: AppId, BranchId: BranchId, }; const templateresponse = await dispatch(getSalesTemplate(Data)).unwrap(); let AllDetails = templateresponse?.data?.data; setTemplateDetails(AllDetails?.Templates); let selectedBilling = AllDetails?.Templates?.[0]?.ComponentDetails?.find( (item) => item?.SessionName === 'BookingBilling' ); let selectedNavbar = AllDetails?.Templates?.[0]?.ComponentDetails?.find( (item) => item?.SessionName === 'BookingNavbar' ); let AllBillingdetails = AllDetails?.Components?.find( (item) => item?.ComponentName === selectedBilling?.ComponentName ); console.log(AllDetails, selectedNavbar, 'templateresponse'); setBillingSettings(AllBillingdetails); const optionIds = selectedBilling?.FieldDetails?.map( (item) => item?.OptionId ); setSelectedBillTableCheckValues(optionIds); let Allfontdata = AllDetails?.Fonts?.filter( (item) => item.SessionId === selectedBilling?.SessionId ); setTableFontData(Allfontdata); let selectedFont = AllDetails?.Templates?.[0]?.FontDetail?.find( (item) => item?.SessionId === selectedBilling?.SessionId ); setSelectedTableFont(selectedFont?.FontId); const hasHold = selectedNavbar?.FieldDetails?.some( (item) => item.OptionName === 'Hold' ); const hasAddcustomer = selectedNavbar?.FieldDetails?.some( (item) => item.OptionName === 'AddCustomer' ); const hasDinein = selectedNavbar?.FieldDetails?.some( (item) => item.OptionName === 'DineIn' ); setHoldButton(hasHold); setAddCustomerButton(hasAddcustomer); setDineInChecked(hasDinein); let allcolordata = AllDetails?.Colors?.filter( (item) => item.SessionId === selectedBilling?.SessionId && item.OptionName === 'OverallBackground' ); setBillingOverallColorsList(allcolordata); let allBackcolordata = AllDetails?.Colors?.filter( (item) => item.SessionId === selectedBilling?.SessionId && item.OptionName === 'Background' ); setTableBackgroundColorData(allBackcolordata); let selectedcolors = AllDetails?.Templates?.[0]?.ColorDetail?.filter( (item) => item?.SessionName === 'BookingBilling' ); console.log(selectedcolors, 'selectedOverallBackgroudcolor'); selectedcolors?.forEach((item) => { if (item?.['BackgroundColor']) { setSelectedTableColor(item?.['ColorId']); } else if (item?.['OverallBackgroundColor']) { setdropdownBillingOverallColor(item?.['ColorId']); } }); // await setdropdownBillingOverallColor(selectedOverallBackgroudcolor); // formRef.current?.setFieldsValue({ BillingOverallColor: value }); // setTableBackgroundColorData console.log(Allfontdata, 'All table colors'); // BookingBilling templateData?.['BookingBilling']?.[0] }; const BillTableSelectlistonChange = (checkedValues) => { setSelectedBillTableCheckValues(checkedValues); }; const handleChange = (itemId, checked) => { setBillingSettings((prev) => prev.map((item) => (item.id === itemId ? { ...item, checked } : item)) ); }; const selectFont3 = (value) => { setSelectedTableFont(value); }; const TablehandleUploadFonts = () => { setTableFontModelopen(true); }; const TablehandleCancel = () => { setTableFontModelopen(false); Tableform.resetFields(); }; const selectTableColor = async (value) => { await setSelectedTableColor(value); // formRef.current?.setFieldsValue({ TableColor: value }); }; const BillhandleUploadColor = () => { setBillUploadColor(true); }; const handleColorChange4 = (color, event) => { if (TableColorType == 'Y') { setTablebackgroundColor(color['hex']); setTableBGHex(color?.hex?.replace('#', '').trim()); } if (TableColorType == 'N') { setTablefontColor(color['hex']); setTableFontHex(color?.hex?.replace('#', '').trim()); } }; const handleBackgroundColorSubmit = async () => { if (TablebackgroundColor !== TablefontColor) { let response; try { let postData = { BackgroundColor: TablebackgroundColor, FontColor: TablefontColor, CreatedBy: UserId, SessionId: billingSettings?.SessionId, OptionId: backgroundOptionId, }; response = await dispatch(postColorData(postData)).unwrap(); } catch (err) { if (err['message'] == 'Request failed with status code 422') { response = { data: { statusCode: 0, response: 'Color Not Added', data: [], }, }; } } if (response?.data?.statusCode == 1) { if (response?.data?.response == 'Color Already Exists') { setMessageType('warning'); setMessageData(response?.data?.response); } else { setMessageType('success'); setMessageData(response?.data?.response); // BillsetUploadColor(false); } GetTemplatedetails(); setBillUploadColor(false); } else { setMessageData(response?.data?.response); setMessageType('error'); } } else { setMessageData('Please select different color for background and font'); setMessageType('warning'); } }; const TableonCancel4 = () => { setBillUploadColor(false); }; const handleTableHexChange = (e) => { if (TableColorType?.toLowerCase() === 'y') { setTableBGHex(e?.target?.value); if (e?.target?.value === '' || !isHexColor(`#${e.target.value}`)) { e.target.value = '009b00'; } setTablebackgroundColor(`#${e.target.value}`); } if (TableColorType?.toLowerCase() === 'n') { setTableFontHex(e?.target?.value); if (e?.target?.value === '' || !isHexColor(`#${e.target.value}`)) { e.target.value = '000000'; } setTablefontColor(`#${e.target.value}`); } }; const handleBillingOverallHexCode = (e) => { setBillingOverallHex(e?.target?.value); if (e?.target?.value === '' || !isHexColor(`#${e.target.value}`)) { e.target.value = '000000'; } setBillingOverallColor(`#${e.target.value}`); }; const handleBillingOverallColorChange = (color, event) => { setBillingOverallColor(color['hex']); setBillingOverallHex(color?.hex?.replace('#', '').trim()); }; const handleBillingOverallColorSubmit = async () => { let response; try { let postData = { BackgroundColor: BillingOverallColor, FontColor: '#000000', CreatedBy: UserId, SessionId: billingSettings?.SessionId, OptionId: OverallbackgroundOptionId, }; response = await dispatch(postColorData(postData)).unwrap(); } catch (err) { if (err['message'] == 'Request failed with status code 422') { response = { data: { statusCode: 0, response: 'Color Not Added', data: [], }, }; } } if (response?.data?.statusCode == 1) { if (response?.data?.response == 'Color Already Exists') { setMessageType('warning'); setMessageData(response?.data?.response); } else { setMessageType('success'); setMessageData(response?.data?.response); setBillingUploadOverallColor(false); } GetTemplatedetails(); BillingUploadOverallColor(false); } else { setMessageData(response?.data?.response); setMessageType('error'); } }; const selectBillingOverallColor = async (value) => { await setdropdownBillingOverallColor(value); // formRef.current?.setFieldsValue({ BillingOverallColor: value }); }; const openColour4 = (value) => { setTableColorType(value); }; const handleBillingUploadOverallColor = () => { setBillingUploadOverallColor(true); }; const TablehandleSubmit = async () => { const values = await Tableform.validateFields(); validateFontsTable(values); }; const validateFontsTable = async (values) => { console.log(values, 'valuesvalues'); const apiUrl = `https://www.googleapis.com/webfonts/v1/webfonts?key=AIzaSyDP1HqNkLI53iIAH-SB9_mt_24QdkUZ_24`; fetch(apiUrl) .then((response) => response.json()) .then(async (data) => { const fontNames = data?.items?.map((item) => item.family); if (fontNames.includes(formatFontName(values['TableFont']))) { let response; try { let postData = { SessionFont: formatFontName(values['TableFont']), CreatedBy: UserId, SessionId: billingSettings?.SessionId, }; response = await dispatch(postTableFontData(postData)).unwrap(); } catch (err) { if (err['message'] == 'Request failed with status code 422') { response = { data: { statusCode: 0, response: 'Font Not Added', data: [], }, }; } } if (response?.data?.statusCode == 1) { setTableFontModelopen(false); setMessageData(response?.data?.response); if (response?.data?.response == 'Font Already Exists') { setMessageType('warning'); } else { setMessageType('success'); } dispatch(getTableFonts(BillingTableData?.[0]?.SessionId)).unwrap; GetTemplatedetails(); Tableform.resetFields(); } else { setMessageData(response?.data?.response); setMessageType('error'); } } else { setMessageType('warning'); setMessageData('Please give the Correct google fonts Name!'); } }) .catch((error) => { console.error('Error fetching fonts:', error); }); }; function formatFontName(input) { return input ?.toLowerCase() .split(/\s+/) .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) // Capitalize each word .join(' '); } const HandleSubmit = async () => { console.log(TemplateDetails, 'TemplateDetails.ColorDetail'); const result = { AppId: AppId, CompId: CompId, UserId: UserId, BranchId: BranchId, ColorId: [ ...(TemplateDetails?.[0]?.ColorDetail?.filter( (c) => c.SessionName !== 'BookingBilling' )?.map((c) => c.ColorId) || []), SelectedTableColor, dropdownBillingOverallColor, ], FontId: TemplateDetails?.[0]?.FontDetail?.map((f) => f.SessionName === 'BookingBilling' ? selectedTableFont : f.FontId ), CreatedBy: UserId, TemplateDetails: TemplateDetails?.[0]?.ComponentDetails.map((comp) => ({ ComponentId: comp.ComponentId, // ✅ dynamic ComponentDetails: comp.SessionName === 'BookingBilling' ? SelectedBillTableCheckValues?.map((id) => ({ OptionId: id })) // ✅ NEW checked list : comp.FieldDetails.map((field) => ({ OptionId: field.OptionId })), // existing })), }; console.log(result, 'final result to submit'); var response = await dispatch(putSelectionComponentData(result)).unwrap(); if (response?.data?.statusCode == 1) { if (response?.data?.response === 'Application Template Already Exists') { setMessageType('warning'); setMessageData('Application Template Already Exists'); setFirstOnClick(false); } else { setMessageType('success'); setMessageData('Template Details Added Successfully'); setFirstOnClick(false); } await dispatch(getTemplate({ CompId, BranchId, AppId })).unwrap(); setModalOpen(false); } else { setMessageType('error'); setMessageData(response?.data?.response); setFirstOnClick(false); } }; const onComplete = useCallback(() => { setMessageData(null); setMessageType(null); }, []); return ( <>
{billingSettings?.ComponentOptionsDetails?.map((value, key) => ( Navholdoption(value.OptionName)} key={value?.OptionId} disabled={ value.OptionName === 'Hold' && HoldButton ? true : value.OptionName === 'AddCustomer' && AddCustomerButton ? true : value.OptionName === 'Item' ? true : value.OptionName === 'UnpaidBill' && !DineInChecked ? true : false } > {value.OptionName} ))} {/* {billingSettings?.ComponentOptionsDetails?.map((item) => (
handleChange(item.id, e.target.checked)} > {item.label}
))} */}

BillTable Font

({ value: option.FontId, label: option.SessionFont, }))} label="Font" onChangeFunction={selectFont3} className="settingsales-DropDown-Selection" isOnchanges={!!selectedTableFont} valueData={selectedTableFont} />
Add
{hasBackground ? (

BillTable Background Color

({ value: option.ColorId, label: (
   
{option.ThemeName}
), }))} labelChange={true} label="Color" className="field-DropDown-Selection" onChangeFunction={selectTableColor} isOnchanges={SelectedTableColor ? true : false} valueData={SelectedTableColor} />
Add
) : null} {hasOverallBackground ? (
{ setBillingUploadOverallColor(false); }} /> } width={400} footer={null} >

Selected Color:{' '}

BillTable Overall-Background

({ value: option.ColorId, label: (
   
{option.ThemeName}
), }))} labelChange={true} label={

Overall Background

} className="field-DropDown-Selection" onChangeFunction={selectBillingOverallColor} isOnchanges={dropdownBillingOverallColor ? true : false} valueData={dropdownBillingOverallColor} />
Add
) : null}
{ await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} >

* Google Fonts Only

} handleCancel={TablehandleCancel} handleSubmit={TablehandleSubmit} buttonText="SAVE" /> } width={400} footer={null} >
openColour4(e)} />

{' '} Selected Background Color :{' '}

<>|

{' '} Selected Font Color :{' '}

} htmlType={true} handleSubmit={HandleSubmit} />
); }; export default TableHeadersetting;