import gradio as gr import pandas as pd # Function to load menu data def load_menu(): try: return pd.read_excel("menu.xlsx") except Exception as e: raise ValueError(f"Error loading menu file: {e}") # Generate the menu content def filter_menu(preference): menu_data = load_menu() # Filter logic remains the same # Generating menu HTML html_content = "" for _, item in menu_data.iterrows(): html_content += f""" """ return html_content # Get dish details for the modal def get_dish_details(dish_name): menu_data = load_menu() try: dish = menu_data[menu_data["Dish Name"] == dish_name].iloc[0] return ( dish["Image URL"], dish["Dish Name"], dish["Description"], f"${dish['Price ($)']}" ) except IndexError: raise ValueError(f"Dish '{dish_name}' not found!") # Gradio App def app(): with gr.Blocks(css="style.css") as demo: # Menu Filtering Section preference_selector = gr.Radio( choices=["All", "Vegetarian", "Halal/Non-Veg", "Guilt-Free"], value="All", label="Filter Menu" ) menu_output = gr.HTML(value=filter_menu("All")) # Modal Window (initially hidden) modal = gr.Column(visible=False, elem_classes=["modal"]) modal_image = gr.Image(label="Dish Image") modal_name = gr.Markdown() modal_description = gr.Markdown() modal_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(value=1, label="Quantity", interactive=True) special_instructions = gr.Textbox(label="Special Instructions", placeholder="Add any requests...") add_to_cart_button = gr.Button("Add to Cart") close_modal_button = gr.Button("Close") # Cart Section cart_state = gr.State([]) cart_output = gr.HTML(value="Your cart is empty.") # Handlers def show_modal(dish_name): img, name, desc, price = get_dish_details(dish_name) return ( gr.update(visible=True), img, f"### {name}", desc, price ) def close_modal(): return gr.update(visible=False) def add_to_cart(name, spice, extras, qty, instructions, cart): cart.append({ "name": name, "spice_level": spice, "extras": extras, "quantity": qty, "instructions": instructions }) cart_html = "
".join( [f"{item['quantity']}x {item['name']} ({item['spice_level']})" for item in cart] ) return cart, cart_html # Events preference_selector.change(filter_menu, inputs=[preference_selector], outputs=[menu_output]) close_modal_button.click(close_modal, outputs=[modal]) add_to_cart_button.click(add_to_cart, inputs=[modal_name, spice_level, extras, quantity, special_instructions, cart_state], outputs=[cart_state, cart_output]) # Layout with gr.Row(): menu_output with modal: modal_image modal_name modal_description modal_price spice_level extras quantity special_instructions add_to_cart_button close_modal_button with gr.Row(): cart_output return demo if __name__ == "__main__": app().launch()