File size: 3,207 Bytes
6a94706
b537c3b
7980609
b537c3b
 
2eb1a73
96fe3dc
b537c3b
 
 
920d44a
057b451
 
96fe3dc
057b451
96fe3dc
057b451
 
 
 
 
6a94706
057b451
 
 
 
 
 
 
 
 
 
 
 
 
 
 
920d44a
057b451
 
 
 
 
 
920d44a
6a94706
920d44a
 
057b451
 
 
 
 
 
 
 
 
2eb1a73
057b451
 
 
 
 
ad4e58e
6a94706
057b451
 
6a94706
ad4e58e
057b451
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad4e58e
920d44a
7980609
920d44a
7980609
920d44a
 
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
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 get unique categories
def get_categories():
    menu_data = load_menu()
    return list(menu_data["Category"].unique())

# Function to get dishes for a selected category
def get_dishes(category):
    menu_data = load_menu()
    dishes = menu_data[menu_data["Category"] == category]["Dish Name"].tolist()
    return dishes

# Function to display the menu for a selected dish
def get_menu_item(dish_name):
    menu_data = load_menu()
    item = menu_data[menu_data["Dish Name"] == dish_name]
    if item.empty:
        return "No item found for the selected dish."
    
    # Extract item details
    item = item.iloc[0]
    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 style="background-color: #28a745; color: white; border: none; padding: 8px 15px; font-size: 14px; border-radius: 5px; cursor: pointer;">Add</button>
        </div>
    </div>
    """
    return html_content

# Gradio app definition
def app():
    with gr.Blocks(title="Dynamic Menu with Categories") as demo:
        gr.Markdown("## Dynamic Menu with Categories")

        # Dropdown for selecting a category
        category_dropdown = gr.Dropdown(
            choices=get_categories(),
            value="Appetizer",
            label="Select a Category",
        )

        # Dropdown for selecting a dish
        dish_dropdown = gr.Dropdown(
            choices=get_dishes("Appetizer"),
            value="Samosa",
            label="Select a Dish",
        )

        # Output area for the selected menu item
        menu_output = gr.HTML()

        # Define interactivity
        def update_dishes(category):
            return gr.update(choices=get_dishes(category), value=get_dishes(category)[0])

        category_dropdown.change(
            update_dishes,
            inputs=[category_dropdown],
            outputs=[dish_dropdown]
        )

        dish_dropdown.change(
            get_menu_item,
            inputs=[dish_dropdown],
            outputs=[menu_output]
        )

        # Layout
        gr.Row([category_dropdown, dish_dropdown])
        menu_output.render()

    return demo

# Run the app
if __name__ == "__main__":
    demo = app()
    demo.launch()