Spaces:
Sleeping
Sleeping
File size: 5,017 Bytes
a691ebc 078431c 8edd0c3 078431c 7ad0ad6 a355a11 81886a7 a355a11 078431c 7ad0ad6 a355a11 7ad0ad6 8edd0c3 f3efaf1 078431c 81886a7 a691ebc c5c590b a691ebc 9b46be7 31bbffa c5c590b 31bbffa c5c590b 31bbffa c5c590b 9b46be7 31bbffa 9b46be7 a691ebc 81886a7 a691ebc 81886a7 a691ebc 81886a7 f3efaf1 078431c 81886a7 f3efaf1 31bbffa 81886a7 c5c590b 81886a7 c5c590b 31bbffa a691ebc f3efaf1 a691ebc c5c590b 8632ccc c5c590b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
import gradio as gr
import pandas as pd
# Load menu data from Excel file
def load_menu(file_path="menu.xlsx"):
menu_df = pd.read_excel(file_path)
menu_df.columns = menu_df.columns.str.strip().str.lower()
column_mapping = {
"name": next((col for col in menu_df.columns if "name" in col), None),
"price": next((col for col in menu_df.columns if "price" in col), None),
"description": next((col for col in menu_df.columns if "description" in col), None),
"image": next((col for col in menu_df.columns if "image" in col), None),
}
missing_columns = [key for key, col in column_mapping.items() if col is None]
if missing_columns:
raise ValueError(f"Excel file is missing one or more required columns: {missing_columns}")
menu = []
for _, row in menu_df.iterrows():
menu.append({
"name": row[column_mapping["name"]],
"price": row[column_mapping["price"]],
"description": row[column_mapping["description"]],
"image": row[column_mapping["image"]],
})
return menu
# Initialize menu and cart
menu_data = load_menu("menu.xlsx")
cart = {}
def display_menu():
"""
Render the menu dynamically as HTML.
"""
menu_html = ""
for item in menu_data:
if item["name"] in cart:
# Quantity selector if the item is already in the cart
menu_html += f"""
<div style="display: flex; align-items: center; margin-bottom: 15px; border: 1px solid #ddd; padding: 10px; border-radius: 5px;">
<img src="{item['image']}" alt="{item['name']}" style="width: 80px; height: 80px; border-radius: 5px; margin-right: 15px;">
<div>
<h4 style="margin: 0;">{item['name']} - ${item['price']}</h4>
<p style="font-size: 12px; color: gray;">{item['description']}</p>
</div>
<div style="margin-left: auto; display: flex; align-items: center;">
<button onclick="decrease_quantity('{item['name']}')" style="background-color: #dc3545; color: white; border: none; padding: 5px; border-radius: 5px;">-</button>
<span style="margin: 0 10px;">{cart[item['name']]['quantity']}</span>
<button onclick="increase_quantity('{item['name']}')" style="background-color: #28a745; color: white; border: none; padding: 5px; border-radius: 5px;">+</button>
</div>
</div>
"""
else:
# Add button if the item is not in the cart
menu_html += f"""
<div style="display: flex; align-items: center; margin-bottom: 15px; border: 1px solid #ddd; padding: 10px; border-radius: 5px;">
<img src="{item['image']}" alt="{item['name']}" style="width: 80px; height: 80px; border-radius: 5px; margin-right: 15px;">
<div>
<h4 style="margin: 0;">{item['name']} - ${item['price']}</h4>
<p style="font-size: 12px; color: gray;">{item['description']}</p>
</div>
<button id="add-{item['name']}" style="background-color: #28a745; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; margin-left: auto;">Add</button>
</div>
"""
return menu_html
def add_to_cart(item_name):
"""
Add an item to the cart.
"""
if item_name in cart:
cart[item_name]["quantity"] += 1
else:
for item in menu_data:
if item["name"] == item_name:
cart[item_name] = {
"name": item["name"],
"price": item["price"],
"quantity": 1
}
break
return display_menu()
def update_quantity(item_name, operation):
"""
Update the quantity of an item in the cart.
"""
if item_name in cart:
if operation == "increase":
cart[item_name]["quantity"] += 1
elif operation == "decrease":
cart[item_name]["quantity"] -= 1
if cart[item_name]["quantity"] <= 0:
del cart[item_name]
return display_menu()
# Gradio Interface
with gr.Blocks() as demo:
gr.Markdown("# Dynamic Food Menu")
menu_html = gr.HTML(value=display_menu())
# Hidden input fields for Gradio's event handling
item_name_input = gr.Textbox(visible=False)
operation_input = gr.Textbox(visible=False)
# Simulate "Add to Cart" and "Update Quantity"
add_button = gr.Button("Add to Cart", visible=False)
update_button = gr.Button("Update Quantity", visible=False)
# Update menu after adding or updating quantity
add_button.click(fn=add_to_cart, inputs=item_name_input, outputs=menu_html)
update_button.click(fn=update_quantity, inputs=[item_name_input, operation_input], outputs=menu_html)
# Include menu_html in Blocks context
menu_html.render()
demo.launch()
|