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