Spaces:
Sleeping
Sleeping
File size: 5,139 Bytes
a691ebc 078431c 8edd0c3 a355a11 8edd0c3 078431c 7ad0ad6 a355a11 078431c 7ad0ad6 a355a11 7ad0ad6 8edd0c3 f3efaf1 078431c a691ebc 078431c a691ebc 9b46be7 078431c 9b46be7 078431c 9b46be7 078431c 9b46be7 a691ebc f3efaf1 a691ebc f3efaf1 a691ebc f3efaf1 8edd0c3 f3efaf1 078431c f3efaf1 a691ebc f3efaf1 a691ebc 9b46be7 f3efaf1 9b46be7 f3efaf1 a691ebc f3efaf1 bbab687 f3efaf1 bbab687 a691ebc bbab687 f3efaf1 bbab687 f3efaf1 a691ebc bbab687 a691ebc 3e88fb2 f3efaf1 a691ebc f3efaf1 bbab687 f3efaf1 b81ebfc a691ebc |
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 123 124 125 126 127 128 129 130 131 132 |
import gradio as gr
import pandas as pd
# Load menu data from Excel file
def load_menu(file_path="menu.xlsx"):
"""
Load menu data from an Excel file and dynamically map its columns to required fields.
"""
menu_df = pd.read_excel(file_path)
# Normalize column names (strip spaces and make lowercase)
menu_df.columns = menu_df.columns.str.strip().str.lower()
# Map dynamic column names to required fields
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),
}
# Ensure all required columns are present
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}")
# Map data to required structure
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:
menu_html += f"""
<div style="display: flex; margin-bottom: 15px; align-items: center; border: 1px solid #ddd; padding: 10px; border-radius: 5px;">
<img src="{item['image']}" alt="{item['name']}" style="width: 100px; height: 100px; margin-right: 15px; border-radius: 5px;">
<div style="flex-grow: 1;">
<h4 style="margin: 0;">{item['name']} - ${item['price']}</h4>
<p style="margin: 5px 0; font-size: 12px;">{item['description']}</p>
<label for="quantity-{item['name']}" style="margin-right: 10px;">Quantity:</label>
<input type="number" id="quantity-{item['name']}" value="1" min="1" style="width: 50px;">
</div>
<button onclick="add_to_cart('{item['name']}', document.getElementById('quantity-{item['name']}').value)" style="background-color: #28a745; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer;">Add</button>
</div>
"""
return menu_html
def add_to_cart(item_name, quantity):
"""
Add an item to the cart and return success message with cart count.
"""
quantity = int(quantity)
# Check if the item already exists in the cart
for item in cart:
if item["name"] == item_name:
item["quantity"] += quantity
break
else:
# Add new item to cart
for item in menu_data:
if item["name"] == item_name:
cart.append({"name": item_name, "price": item["price"], "quantity": quantity})
break
return f"{item_name} added to cart! Total items: {len(cart)}"
def view_cart():
"""
Render the cart contents and calculate the total price.
"""
if not cart:
return "Your cart is empty."
cart_html = "<h3>Cart Summary:</h3><ul>"
total_price = 0
for item in cart:
cart_html += f"<li>{item['name']} (x{item['quantity']}) - ${item['price'] * item['quantity']}</li>"
total_price += item["price"] * item["quantity"]
cart_html += f"</ul><h4>Total Price: ${total_price}</h4>"
return cart_html
# Gradio Interface
def menu_page():
return gr.update(value=display_menu(), visible=True), gr.update(visible=False)
def cart_page():
return gr.update(value=view_cart(), visible=True), gr.update(visible=False)
with gr.Blocks() as demo:
gr.Markdown("# Dynamic Food Menu")
# Menu and Cart Views
menu_display = gr.HTML(value=display_menu(), visible=True)
cart_display = gr.HTML(visible=False)
notification = gr.Textbox(label="Notification", value="", interactive=False)
# Navigation Buttons
with gr.Row():
menu_button = gr.Button("Menu")
cart_button = gr.Button("View Cart")
# Add item interaction
food_item_input = gr.Textbox(visible=False) # Hidden input to capture item name
quantity_input = gr.Number(visible=False) # Hidden input to capture quantity
add_button = gr.Button("Add to Cart", visible=False) # Simulated button for functionality
# Notification when item is added
add_button.click(add_to_cart, inputs=[food_item_input, quantity_input], outputs=notification)
# Navigation between Menu and Cart pages
menu_button.click(menu_page, outputs=[menu_display, cart_display])
cart_button.click(cart_page, outputs=[cart_display, menu_display])
# Render menu and cart
demo.append(menu_display)
demo.append(cart_display)
demo.append(notification)
demo.launch()
|