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()