diff --git a/backend/src/services/api/joinedOrderPayment.ts b/backend/src/services/api/joinedOrderPayment.ts index e883382076c23a4f64291cadbcb6c2e2bc081934..6db3138f77ed5e3c3befffaf60c9215b8ebd6cac 100644 --- a/backend/src/services/api/joinedOrderPayment.ts +++ b/backend/src/services/api/joinedOrderPayment.ts @@ -12,7 +12,7 @@ export default function joinedOrderPayment() { const paymentData = paymentResponse.data.data; // Perform the join based on the specified conditions - const result = orderData.map((order: { id: number; id_table: number; time: Date; status: string; }) => { + const result = orderData.map((order: { id: number; id_table: number; time: Date; status: string; id_tenant: string }) => { const matchingPayment = paymentData.find((payment: { id_order: number; }) => payment.id_order === order.id); return { @@ -22,6 +22,7 @@ export default function joinedOrderPayment() { time: order.time, orderStatus: order.status, paymentStatus: matchingPayment ? matchingPayment.status : null, + tenantId: order.id_tenant, }; }); diff --git a/frontend/src/pages/ManageOrderTenant.tsx b/frontend/src/pages/ManageOrderTenant.tsx index 6b5b8de0e003326b79287bc73f8619f38ad8778a..7e7141c9c1381fb8ee3ebffbf5983af758cc7fdd 100644 --- a/frontend/src/pages/ManageOrderTenant.tsx +++ b/frontend/src/pages/ManageOrderTenant.tsx @@ -1,7 +1,6 @@ import Sidebar from "../components/Sidebar"; import OrderDetailsCard from "../components/OrderDetailsCard"; import OrderSummaryCard from "../components/OrderSummaryCard"; -import WelcomingText from "../components/WelcomingText"; import BackButton from "../components/BackButton"; import Welcome from "../components/Welcome"; import Profile from "../components/Profile"; @@ -10,8 +9,6 @@ import ProfileDropDown from "../components/ProfileDropDown"; import Axios from "axios"; import { useParams } from "react-router-dom"; -type id = number; - interface Order { id: number, status: string, @@ -138,6 +135,86 @@ export default function OrderDetails() { console.log(joinedOrderDetailsData); + //Const for state Button + const [buttonState, setButtonState] = useState({ + label: "Waiting for Payment", + disabled: true, + color: "mealshub-greenpalet", + onClick: () => { }, + }); + + useEffect(() => { + getOrderSummaryData(); + }, []); + + useEffect(() => { + // Update button state based on payment and order status + if (joinedOrderDetailsData.length > 0) { + const paymentStatus = joinedOrderDetailsData[0].paymentstatus; + const orderStatus = joinedOrderDetailsData[0].orderstatus; + + if (paymentStatus === "Waiting for Confirmation") { + setButtonState({ + label: "Waiting for Payment", + disabled: true, + color: "mealshub-greenpalet", + onClick: () => { }, + }); + } else if (paymentStatus === "Confirmed" && orderStatus === "Waiting for Payment") { + setButtonState({ + label: "Prepare Order", + disabled: false, + color: "mealshub-red", + onClick: handlePrepareOrder, + }); + } else if (paymentStatus === "Confirmed" && orderStatus === "Prepared") { + setButtonState({ + label: "Complete Order", + disabled: false, + color: "mealshub-red", + onClick: handleCompleteOrder, + }); + } + else if (paymentStatus === "Confirmed" && orderStatus === "Completed") { + setButtonState({ + label: "Completed", + disabled: true, + color: "mealshub-greenpalet", + onClick: handleCompleteOrder, + }); + } + } + }, [joinedOrderDetailsData]); + + const handlePrepareOrder = async () => { + // Call API or perform actions to update order status to "Prepared" + await Axios.patch(`http://localhost:8000/orders/${orderid}`, { + status: "Prepared" + }); + getOrderDetailsData(); + // Set button state accordingly + setButtonState({ + label: "Complete Order", + disabled: false, + color: "mealshub-red", + onClick: handleCompleteOrder, + }); + }; + + const handleCompleteOrder = async () => { + // Call API or perform actions to update order status to "Completed" + await Axios.patch(`http://localhost:8000/orders/${orderid}`, { + status: "Completed" + }); + getOrderDetailsData(); + // Set button state accordingly + setButtonState({ + label: "Completed", + disabled: true, + color: "mealshub-greenpalet", + onClick: () => { }, + }); + }; return ( // Create grid layout for sidebard, header, and main content <div className="grid grid-cols-5 grid-rows-8 bg-mealshub-cream min-h-screen"> @@ -174,6 +251,15 @@ export default function OrderDetails() { <h2 className="text-mealshub-red text-3xl font-bold ms-16">Order Details</h2> <OrderDetailsCard data={joinedOrderDetailsData} /> <OrderSummaryCard data={joinedOrderSummaryData} /> + <div className="flex flex-col items-center"> + <button + onClick={buttonState.onClick} + disabled={buttonState.disabled} + className={`mt-4 px-6 py-2 w-1/5 text-white text-lg font-semibold shadow-xl rounded-full bg-${buttonState.color}`} + > + {buttonState.label} + </button> + </div> </div> </div> </div> diff --git a/frontend/src/pages/PageManageMenu.tsx b/frontend/src/pages/PageManageMenu.tsx index 0854b447eddcd1c2118df5990e0f7fd4b54dbe2b..7689b32224ec57d0febbd27879357c9b07b4fe02 100644 --- a/frontend/src/pages/PageManageMenu.tsx +++ b/frontend/src/pages/PageManageMenu.tsx @@ -12,20 +12,57 @@ import ProfileDropDown from "../components/ProfileDropDown"; import Axios from "axios"; +interface Product { + id: number, + image: string, + name: string, + description: string, + price: number, + id_tenant: number +} + +interface ProductCard { + id: number, + image: string, + name: string, + description: string, + price: number +} + export default function PageManageMenu() { const idTenant = 1; - const [data, setData] = useState([]); + const [MenuData, setMenuData] = useState<ProductCard[]>([]); + + const getMenuData = async () => { + const tenantResponse = await Axios.get(`http://localhost:8000/tenants/${idTenant}`); + const productResponse = await Axios.get("http://localhost:8000/products"); + + const tenantData = tenantResponse.data.data; + const productData = productResponse.data.data; + + // Perform the join based on the specified conditions + // OrderData is not an array, so we need to convert it into an array + const producttenant = productData.filter((product: Product) => product.id_tenant === tenantData.id); + const result = producttenant.map((product: Product) => { + return { + id: product.id, + image: product.image, + name: product.name, + description: product.description, + price: product.price + } + }); + + setMenuData(result); - const getData = async () => { - const res = await Axios.get("http://localhost:8000/products"); - setData(res.data.data); }; useEffect(() => { - getData(); + getMenuData(); }, []); - console.log(data); + console.log(MenuData); + const [menuToDelete, setMenuToDelete] = useState(null); const [menuToEdit, setMenuToEdit] = useState(null); @@ -68,13 +105,13 @@ export default function PageManageMenu() { // Lakukan penghapusan menu menggunakan Axios await Axios.delete(`http://localhost:8000/products/${menuId}`); // Perbarui data setelah penghapusan - getData(); + getMenuData(); } catch (error) { console.error('Error deleting menu:', error); } }; - const maxId = Math.max(...data.map((menu: any) => menu.id)); + const maxId = Math.max(...MenuData.map((menu: any) => menu.id)); return ( // Create grid layout for sidebard, header, and main content <div className="grid grid-cols-5 grid-rows-8 min-h-screen bg-mealshub-cream"> @@ -116,7 +153,7 @@ export default function PageManageMenu() { Menu </h2> <div className="grid grid-cols-4 gap-6 h-4/5 my-6 mx-9 justify-items-center"> - {data.map((menus) => ( + {MenuData.map((menus) => ( <div key={menus.id}> <MenuCard image={menus.image} diff --git a/frontend/src/pages/PageManageOrder.tsx b/frontend/src/pages/PageManageOrder.tsx index 94ad9aa615c34eee78c3d026df886c651a7905ab..add10095d31011cf0b086571902529b7ef957841 100644 --- a/frontend/src/pages/PageManageOrder.tsx +++ b/frontend/src/pages/PageManageOrder.tsx @@ -8,12 +8,15 @@ import joinedOrderPayment from "../../../backend/src/services/api/joinedOrderPay export default function PageManageOrder() { + const tenantid = 1; const [showProfileDropDown, setShowProfileDropDown] = useState(false); const handleProfileClick = () => { setShowProfileDropDown(!showProfileDropDown); }; const data = joinedOrderPayment(); + console.log(data); + const databytenant = data.filter((data: any) => data.tenantId == tenantid); return ( // Create grid layout for sidebard, header, and main content <div className="grid grid-cols-5 grid-rows-8 min-h-screen bg-mealshub-cream"> @@ -51,7 +54,7 @@ export default function PageManageOrder() { )} </div> <div className="ms-20 mt-6 mb-9 py-4 w-11/12 bg-white rounded-3xl h-auto"> - <TableOrder data={data} /> + <TableOrder data={databytenant} /> </div> </div> </div>