Spaces:
Sleeping
Sleeping
File size: 6,083 Bytes
ba4dd53 37e70db ba4dd53 37e70db ba4dd53 37e70db ba4dd53 37e70db ba4dd53 37e70db 06b4e04 37e70db ba4dd53 06b4e04 37e70db ba4dd53 37e70db ba4dd53 06b4e04 ba4dd53 37e70db ba4dd53 37e70db ba4dd53 37e70db ba4dd53 37e70db ba4dd53 06b4e04 37e70db ba4dd53 37e70db ba4dd53 37e70db ba4dd53 37e70db ba4dd53 37e70db d0024b1 37e70db 06b4e04 d0024b1 37e70db 06b4e04 37e70db d0024b1 37e70db d0024b1 37e70db d0024b1 37e70db d0024b1 37e70db d0024b1 06b4e04 d0024b1 37e70db d0024b1 37e70db 7980609 37e70db 7980609 06b4e04 7980609 920d44a 013b172 |
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 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
import gradio as gr
import pandas as pd
# Function to load the menu data from Excel
def load_menu():
menu_file = "menu.xlsx" # Ensure this file exists in the same directory
try:
return pd.read_excel(menu_file)
except Exception as e:
raise ValueError(f"Error loading menu file: {e}")
# Function to filter menu items based on preference
def filter_menu(preference):
# Load menu data
menu_data = load_menu()
# Define filter conditions
if preference == "Halal/Non-Veg":
filtered_data = menu_data[menu_data["Ingredients"].str.contains("Chicken|Mutton|Fish|Prawns|Goat", case=False, na=False)]
elif preference == "Vegetarian":
filtered_data = menu_data[~menu_data["Ingredients"].str.contains("Chicken|Mutton|Fish|Prawns|Goat", case=False, na=False)]
elif preference == "Guilt-Free":
filtered_data = menu_data[menu_data["Description"].str.contains(r"Fat: ([0-9]|10)g", case=False, na=False)]
else: # Default to "All"
filtered_data = menu_data
# Generate HTML for the menu
html_content = ""
for _, item in filtered_data.iterrows():
html_content += f"""
<div style="display: flex; align-items: center; border: 1px solid #ddd; border-radius: 8px; padding: 15px; margin-bottom: 10px; box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1);">
<div style="flex: 1; margin-right: 15px;">
<h3 style="margin: 0; font-size: 18px;">{item['Dish Name']}</h3>
<p style="margin: 5px 0; font-size: 16px; color: #888;">${item['Price ($)']}</p>
<p style="margin: 5px 0; font-size: 14px; color: #555;">{item['Description']}</p>
</div>
<div style="flex-shrink: 0; text-align: center;">
<img src="{item['Image URL']}" alt="{item['Dish Name']}" style="width: 100px; height: 100px; border-radius: 8px; object-fit: cover; margin-bottom: 10px;">
<button value="{item['Dish Name']}" style="background-color: #28a745; color: white; border: none; padding: 8px 15px; font-size: 14px; border-radius: 5px; cursor: pointer;"
onclick="return '{item['Dish Name']}'">Add</button>
</div>
</div>
"""
return html_content
# Function to render detailed view of a dish
def render_dish_details(dish_name):
menu_data = load_menu()
dish = menu_data[menu_data["Dish Name"] == dish_name].iloc[0]
return (
dish["Image URL"],
f"## {dish_name}",
dish["Description"],
f"**Price:** ${dish['Price ($)']}"
)
# Gradio app definition
def app():
with gr.Blocks(title="Dynamic Menu with Filters") as demo:
gr.Markdown("## Dynamic Menu with Preferences")
# Radio button for selecting preference
selected_preference = gr.Radio(
choices=["All", "Vegetarian", "Halal/Non-Veg", "Guilt-Free"],
value="All",
label="Choose a Preference",
)
# Output area for menu items
menu_output = gr.HTML(value=filter_menu("All"))
# Detailed view
detailed_view = gr.Column(visible=False)
dish_image = gr.Image()
dish_name = gr.Markdown()
dish_description = gr.Markdown()
dish_price = gr.Markdown()
spice_level = gr.Radio(
choices=["Mild", "Medium", "Spicy"],
label="Choose Spice Level",
)
extras = gr.CheckboxGroup(
choices=["Extra Raita", "Extra Salan", "Extra Fried Onion"],
label="Choose Extras",
)
quantity = gr.Number(label="Quantity", value=1, interactive=True)
special_instructions = gr.Textbox(
label="Special Instructions",
placeholder="Add any requests here",
)
add_to_bag_button = gr.Button("Add to Bag")
back_button = gr.Button("Back to Menu")
# Cart
cart_state = gr.State([])
cart_output = gr.HTML(value="Your cart is empty.")
# Define interactivity
def update_menu(preference):
return filter_menu(preference)
def show_dish_details(dish_name):
img, name, desc, price = render_dish_details(dish_name)
return gr.update(visible=False), gr.update(visible=True), img, name, desc, price
def add_to_cart(dish_name, spice_level, extras, quantity, instructions, cart):
cart.append({
"name": dish_name,
"spice_level": spice_level,
"extras": extras,
"quantity": quantity,
"instructions": instructions
})
cart_html = "<br>".join(
[f"{item['quantity']}x {item['name']} - {item['spice_level']} (Extras: {', '.join(item['extras'])})" for item in cart]
)
return cart, cart_html
# Event handlers
selected_preference.change(
update_menu,
inputs=[selected_preference],
outputs=[menu_output],
)
menu_output.change(
show_dish_details,
inputs=[menu_output],
outputs=[menu_output, detailed_view, dish_image, dish_name, dish_description, dish_price],
)
add_to_bag_button.click(
add_to_cart,
inputs=[dish_name, spice_level, extras, quantity, special_instructions, cart_state],
outputs=[cart_state, cart_output],
)
back_button.click(
lambda: (gr.update(visible=True), gr.update(visible=False)),
outputs=[menu_output, detailed_view],
)
# Layout
with gr.Row():
menu_output
with detailed_view:
dish_image
dish_name
dish_description
dish_price
spice_level
extras
quantity
special_instructions
add_to_bag_button
back_button
with gr.Row():
cart_output
return demo
if __name__ == "__main__":
demo = app()
demo.launch()
|