Compare commits
5 Commits
7bed4a6576
...
efac879e03
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
efac879e03 | ||
|
|
a5a57a7cd7 | ||
|
|
214ce43ff9 | ||
|
|
78d753c65a | ||
|
|
75cf39efc2 |
@ -38,7 +38,7 @@ const DineInInner = () => {
|
||||
enable: 0,
|
||||
});
|
||||
const [errors, setErrors] = useState({});
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
const [restaruntBranch, setRestaruntBranch] = useState("")
|
||||
const [floorData, setFloorData] = useState(null);
|
||||
const [roomData, setRoomData] = useState(null);
|
||||
@ -66,7 +66,7 @@ const DineInInner = () => {
|
||||
description: "",
|
||||
});
|
||||
const [roomErrors, setRoomErrors] = useState({});
|
||||
const [roomDeleteConfirm, setRoomDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [roomDeleteConfirm, setRoomDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
|
||||
useEffect(() => {
|
||||
const restarunt = localStorage.getItem("restaurantbranch")
|
||||
@ -287,8 +287,11 @@ const DineInInner = () => {
|
||||
|
||||
const handleRoomDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360 Room/${roomDeleteConfirm?.id}`);
|
||||
setRoomDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
isdeleted: roomDeleteConfirm?.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
await client.put(`/Dine360 Room/${roomDeleteConfirm?.id}`, body);
|
||||
setRoomDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getRoomData(selectedFloor);
|
||||
} catch (error) {
|
||||
if (
|
||||
@ -455,8 +458,11 @@ const DineInInner = () => {
|
||||
|
||||
const handleDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360 Table/${deleteConfirm.id}`);
|
||||
setDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
isdeleted: deleteConfirm?.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
await client.put(`/Dine360 Table/${deleteConfirm.id}`, body);
|
||||
setDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getTableData(selectedRoom);
|
||||
} catch (error) {
|
||||
console.error("Delete error:", error);
|
||||
@ -575,7 +581,10 @@ const DineInInner = () => {
|
||||
getTableData(room.name);
|
||||
}}
|
||||
>
|
||||
<div className="card-body px-3 py-1 d-flex align-items-center ">
|
||||
<div className="card-body px-3 py-1 d-flex gap-2 align-items-center">
|
||||
{
|
||||
room?.isdeleted == 1 && (<Icon icon="mdi:block-helper" style={{ color: "red" }} />)
|
||||
}
|
||||
<span
|
||||
className="text-truncatew-100 text-sm fw-semibold"
|
||||
title={room.roomname}
|
||||
@ -606,9 +615,17 @@ const DineInInner = () => {
|
||||
<li>
|
||||
<Link className="dropdown-item px-16 py-8 d-flex align-items-center gap-2 rounded text-secondary-light bg-hover-neutral-200 text-hover-neutral-900" href="#" onClick={(e) => {
|
||||
e.preventDefault();
|
||||
setRoomDeleteConfirm({ show: true, id: room.name });
|
||||
setRoomDeleteConfirm({ show: true, id: room.name, isDeleted: room.isdeleted });
|
||||
}}>
|
||||
{room.isdeleted === 1 ? (
|
||||
<>
|
||||
<Icon icon="mdi:restore" /> Restore
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon icon="fluent:delete-24-regular" /> Delete
|
||||
</>
|
||||
)}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
@ -688,6 +705,7 @@ const DineInInner = () => {
|
||||
// onClick={() => handleTableClick(table)}
|
||||
>
|
||||
<div style={{ position: 'relative', paddingTop: "20px", width: "150px" }}>
|
||||
|
||||
<img
|
||||
src={`/assets/images/seat/${(() => {
|
||||
if (table?.totalcapacity <= 2) return 'seating-24.png';
|
||||
@ -703,6 +721,12 @@ const DineInInner = () => {
|
||||
{ 'grayscale': table.status === 'booked' }
|
||||
)}
|
||||
/>
|
||||
{
|
||||
table?.isdeleted == 1 && (<Icon icon="mdi:block-helper" style={{
|
||||
color: "red", position: "absolute", top: "28%",
|
||||
left: "15%", zIndex: 1
|
||||
}} />)
|
||||
}
|
||||
|
||||
<h6
|
||||
className={`position-absolute text-xs translate-middle text-white fw-bold text-center d-flex align-items-center justify-content-center ${table?.status === "Available" ? "bg-success-500" : table?.status === "Booked" ? "bg-warning-500" : "bg-secondary-500"}`}
|
||||
@ -749,13 +773,18 @@ const DineInInner = () => {
|
||||
className='dropdown-item px-16 py-8 d-flex align-items-center gap-2 rounded text-secondary-light bg-hover-neutral-200 text-hover-neutral-900'
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
setDeleteConfirm({ show: true, id: table.name })
|
||||
setDeleteConfirm({ show: true, id: table.name, isDeleted: table.isdeleted })
|
||||
}}
|
||||
> <Icon
|
||||
icon='fluent:delete-24-regular'
|
||||
className='menu-icon'
|
||||
/>
|
||||
Delete
|
||||
>
|
||||
{table.isdeleted === 1 ? (
|
||||
<>
|
||||
<Icon icon="mdi:restore" /> Restore
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon icon="fluent:delete-24-regular" /> Delete
|
||||
</>
|
||||
)}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
@ -941,23 +970,28 @@ const DineInInner = () => {
|
||||
|
||||
<div className="modal-body">
|
||||
<div className="d-flex justify-content-between mb-1">
|
||||
<h6 className="text-lg mb-0">Confirm Delete</h6>
|
||||
<h6 className="text-lg mb-0">
|
||||
{roomDeleteConfirm?.isDeleted === 0 ? "Confirm to Delete" : "Confirm to Restore"}
|
||||
</h6>
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={() => setRoomDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setRoomDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
></button>
|
||||
</div>
|
||||
<p className="mb-0">Are you sure you want to delete this Room?</p>
|
||||
<p className="mb-0">
|
||||
{roomDeleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this room as Delete?"
|
||||
: "Are you sure you want to set this room as Restore?"}</p>
|
||||
<div className="d-flex justify-content-end gap-2 mt-1">
|
||||
<button
|
||||
className="btn btn-outline-danger-600 px-14 py-6 text-sm"
|
||||
onClick={() => setRoomDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setRoomDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger px-14 py-6 text-sm" onClick={handleRoomDelete}>
|
||||
Delete
|
||||
{roomDeleteConfirm?.isDeleted === 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -1142,23 +1176,29 @@ const DineInInner = () => {
|
||||
|
||||
<div className="modal-body">
|
||||
<div className="d-flex justify-content-between mb-1">
|
||||
<h6 className="text-lg mb-0">Confirm Delete</h6>
|
||||
<h6 className="text-lg mb-0">
|
||||
{deleteConfirm?.isDeleted === 0 ? "Confirm to Delete" : "Confirm to Restore"}
|
||||
</h6>
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
></button>
|
||||
</div>
|
||||
<p className="m-0">Are you sure you want to delete this Table?</p>
|
||||
<p className="m-0">
|
||||
{deleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this table as Delete?"
|
||||
: "Are you sure you want to set this table as Restore?"}
|
||||
</p>
|
||||
<div className="d-flex justify-content-end gap-2 mt-1">
|
||||
<button
|
||||
className="btn btn-outline-danger px-14 py-6 text-sm"
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger px-14 py-6 text-sm" onClick={handleDelete}>
|
||||
Delete
|
||||
{deleteConfirm?.isDeleted === 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -98,9 +98,13 @@ const AddNewProduct = () => {
|
||||
const res = await client?.get(
|
||||
`/Dine360%20Food%20Sides%20Category?fields=[%22*%22]&limit_page_length=100&filters=[["restaurantbranch","=","${restaruntBranch}"]]`
|
||||
);
|
||||
setSidesCategoryData(res?.data?.data);
|
||||
if (res?.data?.data?.[0]) {
|
||||
const first = res?.data?.data[0]?.name;
|
||||
const sidesCategorys = res?.data?.data
|
||||
// Filter out deleted ones
|
||||
const activeSideCategory = sidesCategorys.filter(sidesCategory => sidesCategory.isdeleted !== 1);
|
||||
|
||||
setSidesCategoryData(activeSideCategory);
|
||||
if (activeSideCategory.length > 0) {
|
||||
const first = activeSideCategory[0]?.name;
|
||||
setActiveCategory(first);
|
||||
await getSideData(first);
|
||||
}
|
||||
@ -115,8 +119,10 @@ const AddNewProduct = () => {
|
||||
`/Dine360%20Food%20Sides?fields=[%22*%22]&limit_page_length=100&filters=[["sidecategoryid","=","${sidesCategoryName}"]]`
|
||||
);
|
||||
const data = sideRes?.data?.data || [];
|
||||
setSidesData(data);
|
||||
setSidesDataByCategory((prev) => ({ ...prev, [sidesCategoryName]: data }));
|
||||
// Filter out deleted ones
|
||||
const activeSides = data.filter(sides => sides.isdeleted !== 1);
|
||||
setSidesData(activeSides);
|
||||
setSidesDataByCategory((prev) => ({ ...prev, [sidesCategoryName]: activeSides }));
|
||||
// keep existing selectionByCategory for that category (do not clear)
|
||||
} catch (error) {
|
||||
console.error("Error fetching sides data:", error);
|
||||
@ -508,8 +514,7 @@ const AddNewProduct = () => {
|
||||
type="button"
|
||||
onClick={toggleSelectAll}
|
||||
aria-pressed={isAllSelected}
|
||||
className={`btn radius-8 ${
|
||||
isAllSelected ? "btn-bg-theme text-white" : "btn-outline-theme"
|
||||
className={`btn radius-8 ${isAllSelected ? "btn-bg-theme text-white" : "btn-outline-theme"
|
||||
}`}
|
||||
style={{ display: "inline-flex", alignItems: "center", gap: 6 }}
|
||||
>
|
||||
@ -547,8 +552,7 @@ const AddNewProduct = () => {
|
||||
{sidesCategoryData?.map((sidesCategory) => (
|
||||
<li
|
||||
key={sidesCategory?.name}
|
||||
className={`nav-item border rounded-2 px-3 py-3 bg-border-theme d-flex align-items-center gap-3 position-relative ${
|
||||
activeCategory === sidesCategory.name
|
||||
className={`nav-item border rounded-2 px-3 py-3 bg-border-theme d-flex align-items-center gap-3 position-relative ${activeCategory === sidesCategory.name
|
||||
? "bg-theme text-white"
|
||||
: ""
|
||||
}`}
|
||||
@ -587,8 +591,7 @@ const AddNewProduct = () => {
|
||||
onClick={() => toggleSide(side?.name)}
|
||||
>
|
||||
<div
|
||||
className={`card p-3 shadow-2 radius-8 h-100 border position-relative ${
|
||||
selected ? "bg-theme text-white" : "border-white"
|
||||
className={`card p-3 shadow-2 radius-8 h-100 border position-relative ${selected ? "bg-theme text-white" : "border-white"
|
||||
}`}
|
||||
style={{
|
||||
transition: "background-color .2s, color .2s",
|
||||
|
||||
@ -8,7 +8,8 @@ import PageNoData from "@/components/common-component/PageNoData";
|
||||
import Breadcrumb from "@/components/Breadcrumb";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { ImageBase } from "@utils/BaseUrl.utils";
|
||||
import { Baseurl, ImageBase } from "@utils/BaseUrl.utils";
|
||||
import axios from "axios";
|
||||
|
||||
const ProductListInner = () => {
|
||||
|
||||
@ -26,7 +27,7 @@ const ProductListInner = () => {
|
||||
const [isMenuFieldEditMode, setIsMenuFieldEditMode] = useState(false);
|
||||
const [editingMenuId, setEditingMenuId] = useState(null);
|
||||
const [formErrors, setFormErrors] = useState({});
|
||||
const [menuFieldDeleteConfirm, setMenuFieldDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [menuFieldDeleteConfirm, setMenuFieldDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
const [menuFieldsFormData, setMenuFieldsFormData] = useState({
|
||||
menuname: "",
|
||||
description: "",
|
||||
@ -37,14 +38,14 @@ const ProductListInner = () => {
|
||||
const [isMenuCategoryEditMode, setIsMenuCategoryEditMode] = useState(false);
|
||||
const [editingMenuCategoryId, setEditingMenuCategoryId] = useState(null);
|
||||
const [formMenuCategoryErrors, setFormMenuCategoryErrors] = useState({});
|
||||
const [menuCategoryDeleteConfirm, setMenuCategoryDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [menuCategoryDeleteConfirm, setMenuCategoryDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
const [menuCategoryFormData, setMenuCategoryFormData] = useState({
|
||||
menucategoryname: "",
|
||||
description: "",
|
||||
is_active: 0,
|
||||
});
|
||||
|
||||
const [menuItemDeleteConfirm, setMenuItemDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [menuItemDeleteConfirm, setMenuItemDeleteConfirm] = useState({ show: false, id: null, isDeleted: null, menu: null });
|
||||
|
||||
|
||||
const [restaruntBranch, setRestaruntBranch] = useState("")
|
||||
@ -69,7 +70,7 @@ const ProductListInner = () => {
|
||||
try {
|
||||
const res = await client?.get(`/Dine360 Menu?fields=["*"]&limit_page_length=100`);
|
||||
setCatMenu(res?.data?.data || []);
|
||||
setCatMenuActive(res?.data?.data[0]?.name || []);
|
||||
setCatMenuActive(res?.data?.data[0]?.menuname || []);
|
||||
} catch (error) {
|
||||
console.error("Error fetching menu list:", error);
|
||||
}
|
||||
@ -77,7 +78,7 @@ const ProductListInner = () => {
|
||||
|
||||
useEffect(() => {
|
||||
if (catMenu?.length > 0) {
|
||||
getMenuCategoryItems(catMenu[0]?.menuname);
|
||||
getMenuCategoryItems(catMenu[0]?.name);
|
||||
}
|
||||
}, [catMenu]);
|
||||
|
||||
@ -109,7 +110,7 @@ const ProductListInner = () => {
|
||||
|
||||
const categories = await Promise.all(menuCategoryPromises);
|
||||
const validCategories = categories.filter(Boolean);
|
||||
|
||||
console.log("validCategories", validCategories)
|
||||
setMenuData(validCategories);
|
||||
} catch (error) {
|
||||
console.error("Error fetching menu categories:", error);
|
||||
@ -131,12 +132,13 @@ const ProductListInner = () => {
|
||||
}
|
||||
};
|
||||
|
||||
const handleCatMenuClick = async (menuname) => {
|
||||
await getMenuCategoryItems(menuname);
|
||||
setCatMenuActive(menuname);
|
||||
const handleCatMenuClick = async (menu) => {
|
||||
await getMenuCategoryItems(menu.name);
|
||||
setCatMenuActive(menu.name);
|
||||
};
|
||||
|
||||
const handleMenuClick = async (menu) => {
|
||||
console.log("menu", menu)
|
||||
try {
|
||||
const res = await client.get(
|
||||
`/Dine360%20Menu%20Category/${menu.name}?fields=["*"]&limit_page_length=100`
|
||||
@ -217,8 +219,11 @@ const ProductListInner = () => {
|
||||
|
||||
const handleMenuFieldDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360 Menu/${menuFieldDeleteConfirm.id}`);
|
||||
setMenuFieldDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
isdeleted: menuFieldDeleteConfirm?.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
await client.put(`/Dine360 Menu/${menuFieldDeleteConfirm.id}`, body);
|
||||
setMenuFieldDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getMenuItem();
|
||||
} catch (error) {
|
||||
if (
|
||||
@ -316,10 +321,13 @@ const ProductListInner = () => {
|
||||
|
||||
const handleMenuCategoryDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360%20Menu%20Category%20Link/${catMenuActive} - ${menuCategoryDeleteConfirm.id}`)
|
||||
const Body = {
|
||||
isdeleted: menuCategoryDeleteConfirm.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
// await client.delete(`/Dine360%20Menu%20Category%20Link/${catMenuActive} - ${menuCategoryDeleteConfirm.id}`)
|
||||
|
||||
await client.delete(`/Dine360%20Menu%20Category/${menuCategoryDeleteConfirm.id}`);
|
||||
setMenuCategoryDeleteConfirm({ show: false, id: null });
|
||||
await client.put(`/Dine360%20Menu%20Category/${menuCategoryDeleteConfirm.id}`, Body);
|
||||
setMenuCategoryDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getMenuItem();
|
||||
} catch (error) {
|
||||
if (
|
||||
@ -335,25 +343,92 @@ const ProductListInner = () => {
|
||||
};
|
||||
|
||||
|
||||
|
||||
const handleMenuItemDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360%20Menu%20Category/${activeCategory}/${menuItemDeleteConfirm.id}`);
|
||||
setMenuItemDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
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",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
console.log("response", response.data);
|
||||
|
||||
setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null, menu: null });
|
||||
getMenuItem();
|
||||
|
||||
} catch (error) {
|
||||
if (
|
||||
error?.response?.data?.exception?.includes("DuplicateEntryError") ||
|
||||
error?.response?.data?.message?.includes("Duplicate entry")
|
||||
) {
|
||||
alert("Menu Name already exists. Please use a different name.");
|
||||
} else if (error?.response?.data?.exception?.includes("LinkExistsError") ||
|
||||
error?.response?.data?.message?.includes("LinkExistsError")) {
|
||||
} else if (
|
||||
error?.response?.data?.exception?.includes("LinkExistsError") ||
|
||||
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) => (
|
||||
<div key={menu.name} className="col-xxl-2 col-md-6 user-grid-card">
|
||||
<div className="border radius-16 overflow-hidden">
|
||||
@ -370,6 +445,12 @@ const ProductListInner = () => {
|
||||
<p className="text-sm mb-0 mt-1">${menu.price?.toFixed(2)}</p>
|
||||
</div>
|
||||
</div>
|
||||
{
|
||||
menu?.isdeleted == 1 && (<Icon icon="mdi:block-helper" style={{
|
||||
color: "red", position: "absolute", top: "5%",
|
||||
left: "5%", zIndex: 1
|
||||
}} />)
|
||||
}
|
||||
<div className="position-absolute top-0 end-0 me-1 mt-1" onClick={(e) => e.stopPropagation()}>
|
||||
<div className="dropdown">
|
||||
<button
|
||||
@ -402,11 +483,18 @@ const ProductListInner = () => {
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation(); // optional
|
||||
setMenuItemDeleteConfirm({ show: true, id: menu.name });
|
||||
setMenuItemDeleteConfirm({ show: true, id: menu.name, isDeleted: menu.isdeleted, menu: menu });
|
||||
}}
|
||||
>
|
||||
<Icon icon="fluent:delete-24-regular" className="menu-icon" />
|
||||
Delete
|
||||
{menu.isdeleted == 1 ? (
|
||||
<>
|
||||
<Icon icon="mdi:restore" /> Restore
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon icon="fluent:delete-24-regular" /> Delete
|
||||
</>
|
||||
)}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
@ -418,6 +506,8 @@ const ProductListInner = () => {
|
||||
</div>
|
||||
);
|
||||
|
||||
console.log("menuData", menuData)
|
||||
console.log("activecategory", activeCategory)
|
||||
|
||||
return (
|
||||
<>
|
||||
@ -446,14 +536,17 @@ 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" : ""
|
||||
}`}
|
||||
role="presentation"
|
||||
onClick={() => handleCatMenuClick(menu?.menuname)}
|
||||
onClick={() => handleCatMenuClick(menu)}
|
||||
style={{ cursor: "pointer" }}
|
||||
>
|
||||
{menu.isdeleted !== 1 ? (
|
||||
<img
|
||||
src="/assets/images/menu/menu-icons/all-menu.png"
|
||||
alt="menu"
|
||||
className="w-28-px h-28-px"
|
||||
/>
|
||||
/>) : (
|
||||
<Icon icon="mdi:block-helper" style={{ color: "red" }} />
|
||||
)}
|
||||
<span className="line-height-1">{menu?.menuname}</span>
|
||||
<div className="position-absolute top-0 end-0 me-1 mt-1" onClick={(e) => e.stopPropagation()}>
|
||||
<div className="dropdown">
|
||||
@ -487,11 +580,18 @@ const ProductListInner = () => {
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation(); // optional
|
||||
setMenuFieldDeleteConfirm({ show: true, id: menu.name });
|
||||
setMenuFieldDeleteConfirm({ show: true, id: menu.name, isDeleted: menu.isdeleted });
|
||||
}}
|
||||
>
|
||||
<Icon icon="fluent:delete-24-regular" className="menu-icon" />
|
||||
Delete
|
||||
{menu.isdeleted === 1 ? (
|
||||
<>
|
||||
<Icon icon="mdi:restore" /> Restore
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon icon="fluent:delete-24-regular" /> Delete
|
||||
</>
|
||||
)}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
@ -528,11 +628,14 @@ const ProductListInner = () => {
|
||||
>
|
||||
{/* Left: Icon and Name */}
|
||||
<div className="d-flex align-items-center gap-2">
|
||||
{menu.isdeleted == 0 ? (
|
||||
<img
|
||||
src="/assets/images/menu/menu-icons/all-menu.png"
|
||||
alt="menu icon"
|
||||
alt="menu"
|
||||
className="w-28-px h-28-px"
|
||||
/>
|
||||
/>) : (
|
||||
<Icon icon="mdi:block-helper" style={{ color: "red" }} />
|
||||
)}
|
||||
<span className="line-height-1">{menu?.menucategoryname}</span>
|
||||
</div>
|
||||
|
||||
@ -569,10 +672,18 @@ const ProductListInner = () => {
|
||||
href="#"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
setMenuCategoryDeleteConfirm({ show: true, id: menu.name }); // 👈 use menu
|
||||
setMenuCategoryDeleteConfirm({ show: true, id: menu.name, isDeleted: menu.isdeleted }); // 👈 use menu
|
||||
}}
|
||||
>
|
||||
{menu.isdeleted == 1 ? (
|
||||
<>
|
||||
<Icon icon="mdi:restore" /> Restore
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon icon="fluent:delete-24-regular" /> Delete
|
||||
</>
|
||||
)}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
@ -680,23 +791,27 @@ const ProductListInner = () => {
|
||||
|
||||
<div className="modal-body">
|
||||
<div className="d-flex justify-content-between mb-1">
|
||||
<h6 className="text-lg mb-0">Confirm Delete</h6>
|
||||
<h6 className="text-lg mb-0"> {menuFieldDeleteConfirm?.isDeleted == 0 ? "Confirm to Delete" : "Confirm to Restore"}</h6>
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={() => setMenuFieldDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setMenuFieldDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
></button>
|
||||
</div>
|
||||
<p className="m-0">Are you sure you want to delete this Menu?</p>
|
||||
<p className="mb-0">
|
||||
{menuFieldDeleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this Menu Fields as Delete?"
|
||||
: "Are you sure you want to set this Menu Fields as Restore?"}
|
||||
</p>
|
||||
<div className="d-flex justify-content-end gap-2 mt-1 ">
|
||||
<button
|
||||
className="btn btn-outline-danger px-14 py-6 text-sm"
|
||||
onClick={() => setMenuFieldDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setMenuFieldDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger px-14 py-6 text-sm" onClick={handleMenuFieldDelete}>
|
||||
Delete
|
||||
{menuFieldDeleteConfirm?.isDeleted === 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -779,23 +894,27 @@ const ProductListInner = () => {
|
||||
|
||||
<div className="modal-body">
|
||||
<div className="d-flex justify-content-between mb-1">
|
||||
<h6 className="text-lg mb-0">Confirm Delete</h6>
|
||||
<h6 className="text-lg mb-0"> {menuCategoryDeleteConfirm?.isDeleted == 0 ? "Confirm to Delete" : "Confirm to Restore"}</h6>
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={() => setMenuCategoryDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setMenuCategoryDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
></button>
|
||||
</div>
|
||||
<p className="m-0">Are you sure you want to delete this Menu?</p>
|
||||
<p className="mb-0">
|
||||
{menuCategoryDeleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this Menu Category as Delete?"
|
||||
: "Are you sure you want to set this Menu Category as Restore?"}
|
||||
</p>
|
||||
<div className="d-flex justify-content-end gap-2 mt-1 ">
|
||||
<button
|
||||
className="btn btn-outline-danger px-14 py-6 text-sm"
|
||||
onClick={() => setMenuCategoryDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setMenuCategoryDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger px-14 py-6 text-sm" onClick={handleMenuCategoryDelete}>
|
||||
Delete
|
||||
{menuCategoryDeleteConfirm?.isDeleted == 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -812,23 +931,27 @@ const ProductListInner = () => {
|
||||
|
||||
<div className="modal-body">
|
||||
<div className="d-flex justify-content-between mb-1">
|
||||
<h6 className="text-lg mb-0">Confirm Delete</h6>
|
||||
<h6 className="text-lg mb-0"> {menuItemDeleteConfirm?.isDeleted == 0 ? "Confirm to Delete" : "Confirm to Restore"}</h6>
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={() => setMenuItemDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null, menu: null })}
|
||||
></button>
|
||||
</div>
|
||||
<p className="m-0">Are you sure you want to delete this Menu?</p>
|
||||
<p className="m-0">
|
||||
{menuItemDeleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this Sides as Delete?"
|
||||
: "Are you sure you want to set this Sides as Restore?"}
|
||||
</p>
|
||||
<div className="d-flex justify-content-end gap-2 mt-1 ">
|
||||
<button
|
||||
className="btn btn-outline-danger px-14 py-6 text-sm"
|
||||
onClick={() => setMenuItemDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setMenuItemDeleteConfirm({ show: false, id: null, isDeleted: null, menu: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger px-14 py-6 text-sm" onClick={handleMenuItemDelete}>
|
||||
Delete
|
||||
{menuItemDeleteConfirm?.isDeleted == 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -131,12 +131,16 @@ const UpdateProduct = () => {
|
||||
try {
|
||||
const formDataToSend = new FormData();
|
||||
formDataToSend.append("endpoint", "Dine360 Menu Category");
|
||||
formDataToSend.append("file", imageFile); // ✅ use imageFile
|
||||
formDataToSend.append("fileid", "item_image");
|
||||
formDataToSend.append("childjson", JSON.stringify(body))
|
||||
formDataToSend.append("childkey", "menuitems_child");
|
||||
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)
|
||||
const response = await axios.post(`${Baseurl}/Upload-Image-To-Frappe/parent-child`, formDataToSend, {
|
||||
headers: {
|
||||
|
||||
@ -30,7 +30,7 @@ const SidesPageInner = () => {
|
||||
image_preview: null,
|
||||
});
|
||||
const [errors, setErrors] = useState({});
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
const [restaruntBranch, setRestaruntBranch] = useState("");
|
||||
|
||||
// Sides Category
|
||||
@ -44,7 +44,7 @@ const SidesPageInner = () => {
|
||||
description: "",
|
||||
});
|
||||
const [sidesCategoryErrors, setSidesCategoryErrors] = useState({});
|
||||
const [sidesCategoryDeleteConfirm, setSidesCategoryDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [sidesCategoryDeleteConfirm, setSidesCategoryDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
|
||||
useEffect(() => {
|
||||
const restarunt = localStorage.getItem("restaurantbranch");
|
||||
@ -199,8 +199,11 @@ const SidesPageInner = () => {
|
||||
|
||||
const handleDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360%20Food%20Sides/${deleteConfirm?.id}`);
|
||||
setDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
isdeleted: deleteConfirm.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
await client.put(`/Dine360%20Food%20Sides/${deleteConfirm?.id}`, body);
|
||||
setDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getSideData(activeCategory);
|
||||
} catch (error) {
|
||||
alert("Error deleting. It might be linked to other data.");
|
||||
@ -284,8 +287,11 @@ const SidesPageInner = () => {
|
||||
|
||||
const handleSidesCategoryDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360%20Food%20Sides%20Category/${sidesCategoryDeleteConfirm.id}`);
|
||||
setSidesCategoryDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
isdeleted: sidesCategoryDeleteConfirm.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
await client.put(`/Dine360%20Food%20Sides%20Category/${sidesCategoryDeleteConfirm.id}`, body);
|
||||
setSidesCategoryDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getSidesCategory();
|
||||
} catch (error) {
|
||||
if (
|
||||
@ -331,11 +337,21 @@ const SidesPageInner = () => {
|
||||
onClick={() => handleSidesCategoryClick(sidesCategory?.name)}
|
||||
style={{ cursor: "pointer" }}
|
||||
>
|
||||
|
||||
{
|
||||
sidesCategory?.isdeleted == 0 ? (
|
||||
<img
|
||||
src="/assets/images/menu/menu-icons/all-menu.png"
|
||||
alt="menu"
|
||||
className="w-28-px h-28-px"
|
||||
/>
|
||||
)
|
||||
:
|
||||
(
|
||||
<Icon icon="mdi:block-helper" style={{ color: "red" }} />
|
||||
)
|
||||
}
|
||||
|
||||
<span className="line-height-1">{sidesCategory?.sidecategoryname}</span>
|
||||
<div className="position-absolute top-0 end-0 me-1 mt-1" onClick={(e) => e.stopPropagation()}>
|
||||
<div className="dropdown">
|
||||
@ -366,14 +382,18 @@ const SidesPageInner = () => {
|
||||
className='dropdown-item px-16 py-8 d-flex align-items-center gap-2 rounded text-secondary-light bg-hover-neutral-200 text-hover-neutral-900'
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
setSidesCategoryDeleteConfirm({ show: true, id: sidesCategory.name });
|
||||
setSidesCategoryDeleteConfirm({ show: true, id: sidesCategory.name, isDeleted: sidesCategory.isdeleted });
|
||||
}}
|
||||
>
|
||||
<Icon
|
||||
icon='fluent:delete-24-regular'
|
||||
className='menu-icon'
|
||||
/>
|
||||
Delete
|
||||
{sidesCategory.isdeleted === 1 ? (
|
||||
<>
|
||||
<Icon icon="mdi:restore" /> Restore
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon icon="fluent:delete-24-regular" /> Delete
|
||||
</>
|
||||
)}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
@ -417,13 +437,27 @@ const SidesPageInner = () => {
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="#" className='dropdown-item px-16 py-8 d-flex align-items-center gap-2 rounded text-secondary-light bg-hover-neutral-200 text-hover-neutral-900' onClick={(e) => { e.preventDefault(); setDeleteConfirm({ show: true, id: room.name }); }}>
|
||||
<Icon icon='fluent:delete-24-regular' className='menu-icon' /> Delete
|
||||
<Link href="#" className='dropdown-item px-16 py-8 d-flex align-items-center gap-2 rounded text-secondary-light bg-hover-neutral-200 text-hover-neutral-900' onClick={(e) => { e.preventDefault(); setDeleteConfirm({ show: true, id: room.name, isDeleted: room.isdeleted }); }}>
|
||||
{room.isdeleted === 1 ? (
|
||||
<>
|
||||
<Icon icon="mdi:restore" /> Restore
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon icon="fluent:delete-24-regular" /> Delete
|
||||
</>
|
||||
)}
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{
|
||||
room?.isdeleted == 1 && (<Icon icon="mdi:block-helper" style={{
|
||||
color: "red", position: "absolute", top: "5%",
|
||||
left: "5%", zIndex: 1
|
||||
}} />)
|
||||
}
|
||||
<div className="card-body text-center p-3">
|
||||
<img src={`${ImageBase}/${room.item_image}`} alt="" className="w-100-px h-100-px rounded-circle object-fit-cover" />
|
||||
<h6 className="text-md mb-0 mt-3">{room?.sidename}</h6>
|
||||
@ -526,23 +560,27 @@ const SidesPageInner = () => {
|
||||
|
||||
<div className="modal-body">
|
||||
<div className="d-flex justify-content-between mb-1">
|
||||
<h6 className="text-lg mb-0">Confirm Delete</h6>
|
||||
<h6 className="text-lg mb-0">{sidesCategoryDeleteConfirm?.isDeleted == 0 ? "Confirm to Delete" : "Confirm to Restore"}</h6>
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={() => setSidesCategoryDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setSidesCategoryDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
></button>
|
||||
</div>
|
||||
<p className="m-0">Are you sure you want to delete this sidesCategory?</p>
|
||||
<p className="m-0">
|
||||
{sidesCategoryDeleteConfirm?.isDeleted == 0
|
||||
? "Are you sure you want to set this Sides as Delete?"
|
||||
: "Are you sure you want to set this Sides as Restore?"}
|
||||
</p>
|
||||
<div className="d-flex justify-content-end gap-2 mt-1 ">
|
||||
<button
|
||||
className="btn btn-outline-danger px-14 py-6 text-sm"
|
||||
onClick={() => setSidesCategoryDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setSidesCategoryDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger px-14 py-6 text-sm" onClick={handleSidesCategoryDelete}>
|
||||
Delete
|
||||
{sidesCategoryDeleteConfirm?.isDeleted == 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -659,13 +697,17 @@ const SidesPageInner = () => {
|
||||
<div className="modal-content">
|
||||
<div className="modal-body">
|
||||
<div className="d-flex justify-content-between mb-1">
|
||||
<h6 className="text-lg mb-0">Confirm Delete</h6>
|
||||
<button type="button" className="btn-close" onClick={() => setDeleteConfirm({ show: false, id: null })}></button>
|
||||
<h6 className="text-lg mb-0"> {deleteConfirm?.isDeleted == 0 ? "Confirm to Delete" : "Confirm to Restore"}</h6>
|
||||
<button type="button" className="btn-close" onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}></button>
|
||||
</div>
|
||||
<p>Are you sure you want to delete this item?</p>
|
||||
<p className="m-0">
|
||||
{deleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this Sides as Delete?"
|
||||
: "Are you sure you want to set this Sides as Restore?"}
|
||||
</p>
|
||||
<div className="d-flex justify-content-end gap-2 mt-1">
|
||||
<button className="btn btn-outline-danger" onClick={() => setDeleteConfirm({ show: false, id: null })}>Cancel</button>
|
||||
<button className="btn btn-danger" onClick={handleDelete}>Delete</button>
|
||||
<button className="btn btn-outline-danger" onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}>Cancel</button>
|
||||
<button className="btn btn-danger" onClick={handleDelete}> {deleteConfirm?.isDeleted == 0 ? "Delete" : "Restore"}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -49,8 +49,10 @@ const MenuItemsCategoryInner = () => {
|
||||
const getMenuItem = async () => {
|
||||
try {
|
||||
const res = await client?.get(`/Dine360 Menu?fields=["*"]&limit_page_length=100`);
|
||||
setCatMenu(res?.data?.data || []);
|
||||
setCatMenuActive(res?.data?.data[0]?.name || [])
|
||||
const menuFieldRes = res?.data?.data
|
||||
const activeMenuFields = menuFieldRes.filter(menuField => menuField.isdeleted !== 1);
|
||||
setCatMenu(activeMenuFields || []);
|
||||
setCatMenuActive(activeMenuFields[0]?.name || [])
|
||||
} catch (error) {
|
||||
console.error("Error fetching menu list:", error);
|
||||
}
|
||||
@ -81,7 +83,10 @@ const MenuItemsCategoryInner = () => {
|
||||
|
||||
const menuLinks = menuRes?.data?.data || [];
|
||||
|
||||
const menuCategoryPromises = menuLinks.map(async (menuItem) => {
|
||||
const activeMenuCategoryLink = menuLinks.filter(menuCatLink => menuCatLink.isdeleted !== 1);
|
||||
console.log("activeMenuCategoryLink", activeMenuCategoryLink)
|
||||
|
||||
const menuCategoryPromises = activeMenuCategoryLink.map(async (menuItem) => {
|
||||
const res = await client.get(
|
||||
`/Dine360%20Menu%20Category?fields=["*"]&limit_page_length=100&filters=[["name","=","${menuItem.menucategory}"]]`
|
||||
);
|
||||
@ -106,7 +111,10 @@ const MenuItemsCategoryInner = () => {
|
||||
const res = await client.get(
|
||||
`/Dine360%20Menu%20Category/${category.name}?fields=["*"]&limit_page_length=100`
|
||||
);
|
||||
setMenuItems(res?.data?.data || []);
|
||||
const menuItem = res?.data?.data
|
||||
console.log("menuItem", menuItem)
|
||||
const activeMenuItem = menuItem?.menuitems_child?.filter(menuItem => menuItem.isdeleted !== 1);
|
||||
setMenuItems(activeMenuItem || []);
|
||||
} catch (error) {
|
||||
console.error("Error fetching menu items:", error);
|
||||
}
|
||||
@ -398,8 +406,6 @@ const MenuItemsCategoryInner = () => {
|
||||
{
|
||||
loading ? (
|
||||
<PageLoader />
|
||||
) : menuData?.length == 0 ? (
|
||||
<PageNoData />
|
||||
) : (
|
||||
<div className="row gy-4">
|
||||
{/* Menu Category - Always col-xxl-2 */}
|
||||
|
||||
@ -68,12 +68,15 @@ const TableOrderInner = () => {
|
||||
`/Dine360 Floor?fields=["*"]&limit_page_length=100&filters=[["restaurantbranch","=","${restaruntBranch}"]]`
|
||||
);
|
||||
const floors = res?.data?.data || [];
|
||||
setFloorData(floors);
|
||||
|
||||
if (floors.length > 0) {
|
||||
setSelectedFloor(floors[0].name);
|
||||
// Filter out deleted ones
|
||||
const activeFloors = floors.filter(floor => floor.isdeleted !== 1);
|
||||
setFloorData(activeFloors);
|
||||
|
||||
if (activeFloors.length > 0) {
|
||||
setSelectedFloor(activeFloors[0].name);
|
||||
setSelectedRoom(null);
|
||||
getRoomData(floors[0].name);
|
||||
getRoomData(activeFloors[0].name);
|
||||
} else {
|
||||
setSelectedFloor(null);
|
||||
setRoomData([]);
|
||||
@ -91,11 +94,12 @@ const TableOrderInner = () => {
|
||||
`/Dine360 Room?fields=["*"]&limit_page_length=100&filters=[["floor","=","${floorName}"]]`
|
||||
);
|
||||
const rooms = res?.data?.data || [];
|
||||
setRoomData(rooms);
|
||||
const activeRooms = rooms.filter(room => room.isdeleted !== 1);
|
||||
setRoomData(activeRooms);
|
||||
|
||||
if (rooms.length > 0) {
|
||||
setSelectedRoom(rooms[0].name);
|
||||
getTableData(rooms[0].name);
|
||||
if (activeRooms.length > 0) {
|
||||
setSelectedRoom(activeRooms[0].name);
|
||||
getTableData(activeRooms[0].name);
|
||||
} else {
|
||||
setSelectedRoom(null); // clear selection if no rooms
|
||||
setTables([]); // clear table data
|
||||
@ -112,7 +116,9 @@ const TableOrderInner = () => {
|
||||
const res = await client.get(
|
||||
`/Dine360 Table?fields=["*"]&limit_page_length=100&filters=[["room","=","${roomName}"]]`
|
||||
);
|
||||
setTables(res?.data?.data || []);
|
||||
const tables = res?.data?.data
|
||||
const activeRooms = tables.filter(table => table.isdeleted !== 1);
|
||||
setTables(activeRooms || []);
|
||||
} catch (error) {
|
||||
console.error("Error fetching table data:", error);
|
||||
} finally {
|
||||
|
||||
@ -14,7 +14,7 @@ const DateReservationMainComponent = () => {
|
||||
|
||||
const [dateReservation, setDateReservation] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
const [restaruntBranch, setRestaruntBranch] = useState("")
|
||||
|
||||
useEffect(() => {
|
||||
@ -66,8 +66,11 @@ const DateReservationMainComponent = () => {
|
||||
|
||||
const handleDelete = async () => {
|
||||
try {
|
||||
await client.delete(`/Dine360 Table Reservation Master/${deleteConfirm?.id}`);
|
||||
setDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
isdeleted: deleteConfirm?.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
await client.put(`/Dine360 Table Reservation Master/${deleteConfirm?.id}`, body);
|
||||
setDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getReservationDate();
|
||||
} catch (error) {
|
||||
if (
|
||||
@ -145,13 +148,23 @@ const DateReservationMainComponent = () => {
|
||||
</button>
|
||||
<button onClick={(e) => {
|
||||
e.preventDefault();
|
||||
setDeleteConfirm({ show: true, id: reservation.name })
|
||||
setDeleteConfirm({ show: true, id: reservation.name, isDeleted: reservation?.isdeleted })
|
||||
}}
|
||||
type="button"
|
||||
className="bg-danger-focus text-danger-600 w-40-px h-40-px d-flex justify-content-center align-items-center rounded-circle"
|
||||
className={`w-40-px h-40-px d-flex justify-content-center align-items-center rounded-circle
|
||||
${reservation.isdeleted === 1
|
||||
? "bg-success-focus bg-hover-success-200 text-success-600"
|
||||
: "bg-danger-focus bg-hover-danger-200 text-danger-600"
|
||||
}`}
|
||||
>
|
||||
<Icon icon="fluent:delete-24-regular" className="menu-icon" />
|
||||
{reservation.isdeleted === 1 ? (
|
||||
<Icon icon="mdi:restore" />
|
||||
) : (
|
||||
<Icon icon="fluent:delete-24-regular" />
|
||||
)}
|
||||
</button>
|
||||
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@ -181,19 +194,25 @@ const DateReservationMainComponent = () => {
|
||||
<button
|
||||
type="button"
|
||||
className="btn-close"
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
></button>
|
||||
</div>
|
||||
<p>Are you sure you want to delete this Reservation?</p>
|
||||
<div>
|
||||
<p className="mb-0">
|
||||
{deleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this Day as Delete?"
|
||||
: "Are you sure you want to set this Day as Restore?"}
|
||||
</p>
|
||||
</div>
|
||||
<div className="d-flex justify-content-end gap-2">
|
||||
<button
|
||||
className="btn btn-secondary"
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger" onClick={handleDelete}>
|
||||
Delete
|
||||
{deleteConfirm?.isDeleted === 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -22,7 +22,7 @@ const DayReservationMainComponent = () => {
|
||||
const [formData, setFormData] = useState({ day: "" });
|
||||
const [existingDays, setExistingDays] = useState([]);
|
||||
const [formError, setFormError] = useState("");
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null });
|
||||
const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null, isDeleted: null });
|
||||
const [restaruntBranch, setRestaruntBranch] = useState("")
|
||||
|
||||
useEffect(() => {
|
||||
@ -85,8 +85,12 @@ const DayReservationMainComponent = () => {
|
||||
const handleDeleteConfirm = async () => {
|
||||
if (!deleteConfirm.id) return;
|
||||
try {
|
||||
await client.delete(`/Dine360 Days/${deleteConfirm.id}`);
|
||||
setDeleteConfirm({ show: false, id: null });
|
||||
const body = {
|
||||
isdeleted: deleteConfirm?.isDeleted == 0 ? 1 : 0
|
||||
}
|
||||
|
||||
await client.put(`/Dine360 Days/${deleteConfirm.id}`, body);
|
||||
setDeleteConfirm({ show: false, id: null, isDeleted: null });
|
||||
getDayData();
|
||||
} catch (err) {
|
||||
alert("Delete failed.");
|
||||
@ -137,12 +141,23 @@ const DayReservationMainComponent = () => {
|
||||
|
||||
{/* Delete Button Top-Right */}
|
||||
<button
|
||||
className="remove-item-btn bg-danger-focus bg-hover-danger-200 text-danger-600 fw-medium w-40-px h-40-px d-flex justify-content-center align-items-center rounded-circle position-absolute"
|
||||
className={`remove-item-btn fw-medium w-40-px h-40-px d-flex justify-content-center align-items-center rounded-circle position-absolute
|
||||
${days.isdeleted === 1
|
||||
? "bg-success-focus bg-hover-success-200 text-success-600"
|
||||
: "bg-danger-focus bg-hover-danger-200 text-danger-600"
|
||||
}`}
|
||||
style={{ top: "8px", right: "8px" }}
|
||||
onClick={() => setDeleteConfirm({ show: true, id: days.name })}
|
||||
onClick={() =>
|
||||
setDeleteConfirm({ show: true, id: days.name, isDeleted: days?.isdeleted })
|
||||
}
|
||||
>
|
||||
<Icon icon="fluent:delete-24-regular" className="menu-icon" />
|
||||
{days.isdeleted === 1 ? (
|
||||
<Icon icon="mdi:restore" />
|
||||
) : (
|
||||
<Icon icon="fluent:delete-24-regular" />
|
||||
)}
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -205,20 +220,24 @@ const DayReservationMainComponent = () => {
|
||||
<div className="modal-body">
|
||||
<div className="mb-1 d-flex justify-content-between align-items-center">
|
||||
<h5 className="mb-0 text-lg">Delete Confirmation</h5>
|
||||
<button type="button" className="btn-close" onClick={() => setDeleteConfirm({ show: false, id: null })}></button>
|
||||
<button type="button" className="btn-close" onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}></button>
|
||||
</div>
|
||||
<div>
|
||||
<p>Are you sure you want to delete this day?</p>
|
||||
<p className="mb-0">
|
||||
{deleteConfirm?.isDeleted === 0
|
||||
? "Are you sure you want to set this Day as Delete?"
|
||||
: "Are you sure you want to set this Day as Restore?"}
|
||||
</p>
|
||||
</div>
|
||||
<div className="d-flex justify-content-end align-items-center gap-2">
|
||||
<button
|
||||
className="btn btn-secondary"
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null })}
|
||||
onClick={() => setDeleteConfirm({ show: false, id: null, isDeleted: null })}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button className="btn btn-danger" onClick={handleDeleteConfirm}>
|
||||
Yes, Delete
|
||||
{deleteConfirm?.isDeleted === 0 ? "Delete" : "Restore"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -181,6 +181,8 @@ const DayReservationTableEnableInner = () => {
|
||||
};
|
||||
|
||||
const sortedTables = [...tables].sort((a, b) => a.tablename.localeCompare(b.tablename));
|
||||
|
||||
console.log("sortedTables", sortedTables)
|
||||
return (
|
||||
<>
|
||||
|
||||
@ -209,7 +211,7 @@ const DayReservationTableEnableInner = () => {
|
||||
</div>
|
||||
|
||||
<div className="row gy-3 gx-3 gx-lg-5 gy-lg-5 justify-content-center">
|
||||
{sortedTables.map((table) => (
|
||||
{sortedTables.filter((table) => table.isdeleted !== 1).map((table) => (
|
||||
<div
|
||||
className="col-xxl-2 col-lg-3 col-md-4 col-sm-6 col-6 text-center"
|
||||
key={table.name}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user