menu item deleted option updated

This commit is contained in:
alaguraj 2025-08-30 16:02:56 +05:30
parent a5a57a7cd7
commit efac879e03
2 changed files with 99 additions and 27 deletions

View File

@ -8,7 +8,8 @@ import PageNoData from "@/components/common-component/PageNoData";
import Breadcrumb from "@/components/Breadcrumb"; import Breadcrumb from "@/components/Breadcrumb";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { ImageBase } from "@utils/BaseUrl.utils"; import { Baseurl, ImageBase } from "@utils/BaseUrl.utils";
import axios from "axios";
const ProductListInner = () => { const ProductListInner = () => {
@ -44,7 +45,7 @@ const ProductListInner = () => {
is_active: 0, is_active: 0,
}); });
const [menuItemDeleteConfirm, setMenuItemDeleteConfirm] = useState({ show: false, id: null, isDeleted: null }); const [menuItemDeleteConfirm, setMenuItemDeleteConfirm] = useState({ show: false, id: null, isDeleted: null, menu: null });
const [restaruntBranch, setRestaruntBranch] = useState("") const [restaruntBranch, setRestaruntBranch] = useState("")
@ -69,7 +70,7 @@ const ProductListInner = () => {
try { try {
const res = await client?.get(`/Dine360 Menu?fields=["*"]&limit_page_length=100`); const res = await client?.get(`/Dine360 Menu?fields=["*"]&limit_page_length=100`);
setCatMenu(res?.data?.data || []); setCatMenu(res?.data?.data || []);
setCatMenuActive(res?.data?.data[0]?.name || []); setCatMenuActive(res?.data?.data[0]?.menuname || []);
} catch (error) { } catch (error) {
console.error("Error fetching menu list:", error); console.error("Error fetching menu list:", error);
} }
@ -77,7 +78,7 @@ const ProductListInner = () => {
useEffect(() => { useEffect(() => {
if (catMenu?.length > 0) { if (catMenu?.length > 0) {
getMenuCategoryItems(catMenu[0]?.menuname); getMenuCategoryItems(catMenu[0]?.name);
} }
}, [catMenu]); }, [catMenu]);
@ -109,7 +110,7 @@ const ProductListInner = () => {
const categories = await Promise.all(menuCategoryPromises); const categories = await Promise.all(menuCategoryPromises);
const validCategories = categories.filter(Boolean); const validCategories = categories.filter(Boolean);
console.log("validCategories", validCategories)
setMenuData(validCategories); setMenuData(validCategories);
} catch (error) { } catch (error) {
console.error("Error fetching menu categories:", error); console.error("Error fetching menu categories:", error);
@ -131,12 +132,13 @@ const ProductListInner = () => {
} }
}; };
const handleCatMenuClick = async (menuname) => { const handleCatMenuClick = async (menu) => {
await getMenuCategoryItems(menuname); await getMenuCategoryItems(menu.name);
setCatMenuActive(menuname); setCatMenuActive(menu.name);
}; };
const handleMenuClick = async (menu) => { const handleMenuClick = async (menu) => {
console.log("menu", menu)
try { try {
const res = await client.get( const res = await client.get(
`/Dine360%20Menu%20Category/${menu.name}?fields=["*"]&limit_page_length=100` `/Dine360%20Menu%20Category/${menu.name}?fields=["*"]&limit_page_length=100`
@ -320,7 +322,7 @@ const ProductListInner = () => {
const handleMenuCategoryDelete = async () => { const handleMenuCategoryDelete = async () => {
try { try {
const Body = { const Body = {
isdelete: menuCategoryDeleteConfirm.isDeleted == 0 ? 1 : 0 isdeleted: menuCategoryDeleteConfirm.isDeleted == 0 ? 1 : 0
} }
// await client.delete(`/Dine360%20Menu%20Category%20Link/${catMenuActive} - ${menuCategoryDeleteConfirm.id}`) // await client.delete(`/Dine360%20Menu%20Category%20Link/${catMenuActive} - ${menuCategoryDeleteConfirm.id}`)
@ -341,28 +343,92 @@ const ProductListInner = () => {
}; };
const handleMenuItemDelete = async () => { const handleMenuItemDelete = async () => {
try { try {
const body = { const body = {
isdelete: menuItemDeleteConfirm?.isDeleted == 0 ? 1 : 0 name: menuItemDeleteConfirm?.menu?.name || '',
menuitemname: menuItemDeleteConfirm?.menu?.menuitemname || '',
price: menuItemDeleteConfirm?.menu?.price || 0,
is_active: menuItemDeleteConfirm?.menu?.is_active ? 1 : 0,
is_special: menuItemDeleteConfirm?.menu?.is_special ? 1 : 0,
availability_time: menuItemDeleteConfirm?.menu?.availability_time || '',
preparation_time: menuItemDeleteConfirm?.menu?.preparation_time || '',
description: menuItemDeleteConfirm?.menu?.description || '',
isdeleted: menuItemDeleteConfirm?.isDeleted == 0 ? 1 : 0
};
// // Convert image to File using Axios with arraybuffer
// async function getImageAsFile(imageUrl, fileName) {
// try {
// const response = await axios.get(imageUrl, {
// responseType: "arraybuffer", // Important for binary data
// });
// const mimeType = response.headers["content-type"] || "image/jpeg";
// const blob = new Blob([response.data], { type: mimeType });
// return new File([blob], fileName || "image.jpg", { type: mimeType });
// } catch (err) {
// console.error("Image fetch error:", err);
// return null;
// }
// }
// Prepare image if exists
// let imageFile = null;
// if (menuItemDeleteConfirm?.menu?.item_image) {
// const fullUrl = `${ImageBase}${menuItemDeleteConfirm.menu.item_image}`;
// const fileName = menuItemDeleteConfirm.menu.item_image.split("/").pop();
// imageFile = await getImageAsFile(fullUrl, fileName);
// }
// Prepare FormData
const formDataToSend = new FormData();
formDataToSend.append("endpoint", "Dine360 Menu Category");
// if (imageFile) {
// formDataToSend.append("file", imageFile);
// formDataToSend.append("fileid", "item_image");
// }
formDataToSend.append("childjson", JSON.stringify(body));
formDataToSend.append("childkey", "menuitems_child");
formDataToSend.append("docname", activeCategory);
formDataToSend.append("isimageupdateorcreate", 0);
// Send request
const response = await axios.post(
`${Baseurl}/Upload-Image-To-Frappe/parent-child`,
formDataToSend,
{
headers: {
Authorization: "token 482beca79d9c005:b8778f51fcca82b",
},
} }
await client.put(`/Dine360%20Menu%20Category/${activeCategory}/${menuItemDeleteConfirm.id}`, body); );
setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null });
console.log("response", response.data);
setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null, menu: null });
getMenuItem(); getMenuItem();
} catch (error) { } catch (error) {
if ( if (
error?.response?.data?.exception?.includes("DuplicateEntryError") || error?.response?.data?.exception?.includes("DuplicateEntryError") ||
error?.response?.data?.message?.includes("Duplicate entry") error?.response?.data?.message?.includes("Duplicate entry")
) { ) {
alert("Menu Name already exists. Please use a different name."); alert("Menu Name already exists. Please use a different name.");
} else if (error?.response?.data?.exception?.includes("LinkExistsError") || } else if (
error?.response?.data?.message?.includes("LinkExistsError")) { error?.response?.data?.exception?.includes("LinkExistsError") ||
alert("Cannot delete or cancel because Dine360 Menu three is linked with Dine360 Menu Category "); error?.response?.data?.message?.includes("LinkExistsError")
) {
alert("Cannot delete or cancel because Dine360 Menu three is linked with Dine360 Menu Category");
} else {
console.error("Unexpected error:", error);
alert("Something went wrong. Please try again.");
} }
} }
}; };
const renderMenuItem = (menu) => ( const renderMenuItem = (menu) => (
<div key={menu.name} className="col-xxl-2 col-md-6 user-grid-card"> <div key={menu.name} className="col-xxl-2 col-md-6 user-grid-card">
<div className="border radius-16 overflow-hidden"> <div className="border radius-16 overflow-hidden">
@ -380,7 +446,7 @@ const ProductListInner = () => {
</div> </div>
</div> </div>
{ {
menu?.isdelete == 1 && (<Icon icon="mdi:block-helper" style={{ menu?.isdeleted == 1 && (<Icon icon="mdi:block-helper" style={{
color: "red", position: "absolute", top: "5%", color: "red", position: "absolute", top: "5%",
left: "5%", zIndex: 1 left: "5%", zIndex: 1
}} />) }} />)
@ -417,10 +483,10 @@ const ProductListInner = () => {
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); // optional e.stopPropagation(); // optional
setMenuItemDeleteConfirm({ show: true, id: menu.name, isDeleted: menu.isdelete }); setMenuItemDeleteConfirm({ show: true, id: menu.name, isDeleted: menu.isdeleted, menu: menu });
}} }}
> >
{menu.isdelete == 1 ? ( {menu.isdeleted == 1 ? (
<> <>
<Icon icon="mdi:restore" /> Restore <Icon icon="mdi:restore" /> Restore
</> </>
@ -440,6 +506,8 @@ const ProductListInner = () => {
</div> </div>
); );
console.log("menuData", menuData)
console.log("activecategory", activeCategory)
return ( return (
<> <>
@ -468,7 +536,7 @@ const ProductListInner = () => {
className={`nav-item border rounded-2 px-3 py-3 bg-border-theme d-flex align-items-center gap-3 position-relative ${catMenuActive === menu.menuname ? "bg-theme" : "" className={`nav-item border rounded-2 px-3 py-3 bg-border-theme d-flex align-items-center gap-3 position-relative ${catMenuActive === menu.menuname ? "bg-theme" : ""
}`} }`}
role="presentation" role="presentation"
onClick={() => handleCatMenuClick(menu?.menuname)} onClick={() => handleCatMenuClick(menu)}
style={{ cursor: "pointer" }} style={{ cursor: "pointer" }}
> >
{menu.isdeleted !== 1 ? ( {menu.isdeleted !== 1 ? (
@ -560,7 +628,7 @@ const ProductListInner = () => {
> >
{/* Left: Icon and Name */} {/* Left: Icon and Name */}
<div className="d-flex align-items-center gap-2"> <div className="d-flex align-items-center gap-2">
{menu.isdelete == 0 ? ( {menu.isdeleted == 0 ? (
<img <img
src="/assets/images/menu/menu-icons/all-menu.png" src="/assets/images/menu/menu-icons/all-menu.png"
alt="menu" alt="menu"
@ -604,10 +672,10 @@ const ProductListInner = () => {
href="#" href="#"
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
setMenuCategoryDeleteConfirm({ show: true, id: menu.name, isDeleted: menu.isdelete }); // 👈 use menu setMenuCategoryDeleteConfirm({ show: true, id: menu.name, isDeleted: menu.isdeleted }); // 👈 use menu
}} }}
> >
{menu.isdelete == 1 ? ( {menu.isdeleted == 1 ? (
<> <>
<Icon icon="mdi:restore" /> Restore <Icon icon="mdi:restore" /> Restore
</> </>
@ -867,7 +935,7 @@ const ProductListInner = () => {
<button <button
type="button" type="button"
className="btn-close" className="btn-close"
onClick={() => setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null })} onClick={() => setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null, menu: null })}
></button> ></button>
</div> </div>
<p className="m-0"> <p className="m-0">
@ -878,7 +946,7 @@ const ProductListInner = () => {
<div className="d-flex justify-content-end gap-2 mt-1 "> <div className="d-flex justify-content-end gap-2 mt-1 ">
<button <button
className="btn btn-outline-danger px-14 py-6 text-sm" className="btn btn-outline-danger px-14 py-6 text-sm"
onClick={() => setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null })} onClick={() => setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null, menu: null })}
> >
Cancel Cancel
</button> </button>

View File

@ -131,12 +131,16 @@ const UpdateProduct = () => {
try { try {
const formDataToSend = new FormData(); const formDataToSend = new FormData();
formDataToSend.append("endpoint", "Dine360 Menu Category"); formDataToSend.append("endpoint", "Dine360 Menu Category");
formDataToSend.append("file", imageFile); // use imageFile
formDataToSend.append("fileid", "item_image"); formDataToSend.append("fileid", "item_image");
formDataToSend.append("childjson", JSON.stringify(body)) formDataToSend.append("childjson", JSON.stringify(body))
formDataToSend.append("childkey", "menuitems_child"); formDataToSend.append("childkey", "menuitems_child");
formDataToSend.append("docname", category); formDataToSend.append("docname", category);
formDataToSend.append("isimageupdateorcreate", 1); if (imageFile) {
formDataToSend.append("isimageupdateorcreate", 1); // new image uploaded
formDataToSend.append("file", imageFile);
} else {
formDataToSend.append("isimageupdateorcreate", 0); // keep old image
}
console.log(formDataToSend) console.log(formDataToSend)
const response = await axios.post(`${Baseurl}/Upload-Image-To-Frappe/parent-child`, formDataToSend, { const response = await axios.post(`${Baseurl}/Upload-Image-To-Frappe/parent-child`, formDataToSend, {
headers: { headers: {