File size: 5,216 Bytes
ba4dd53
 
 
37e70db
ba4dd53
 
6b86d43
ba4dd53
 
 
37e70db
 
ba4dd53
 
 
 
 
 
 
37e70db
ba4dd53
 
37e70db
 
 
 
c6f513e
 
 
 
 
 
37e70db
 
 
 
6b86d43
ba4dd53
 
7b360d9
 
 
c6f513e
 
 
 
7b360d9
 
 
37e70db
6b86d43
37e70db
c6f513e
 
ba4dd53
4b578a2
0d58d8b
 
 
6b86d43
4b578a2
6b86d43
 
 
c6f513e
6b86d43
 
 
 
 
 
4b578a2
 
 
6b86d43
4b578a2
6b86d43
4b578a2
 
37e70db
6b86d43
0d58d8b
 
 
6b86d43
7b360d9
 
 
f690d7c
6b86d43
7b360d9
 
6b86d43
 
 
 
37e70db
4b578a2
 
 
 
 
 
 
 
 
 
 
 
 
 
6b86d43
 
 
 
 
4b578a2
37e70db
f690d7c
6b86d43
 
 
 
 
 
4b578a2
 
 
 
 
6b86d43
4b578a2
 
7980609
37e70db
7980609
06b4e04
7980609
6b86d43
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
import gradio as gr
import pandas as pd

# Function to load the menu data from Excel
def load_menu():
    try:
        return pd.read_excel("menu.xlsx")  # Ensure menu.xlsx is in the same directory
    except Exception as e:
        raise ValueError(f"Error loading menu file: {e}")

# Function to filter menu items based on preference
def filter_menu(preference):
    menu_data = load_menu()
    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 class="menu-item">
            <img src="{item['Image URL']}" alt="{item['Dish Name']}">
            <h3>{item['Dish Name']}</h3>
            <p>{item['Description']}</p>
            <p><strong>${item['Price ($)']}</strong></p>
            <button value="{item['Dish Name']}" onclick="showModal('{item['Dish Name']}')">Add</button>
        </div>
        """
    return html_content

# Function to render detailed view of a dish
def render_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_name,
            dish["Description"],
            f"${dish['Price ($)']}"
        )
    except IndexError:
        raise ValueError(f"Dish '{dish_name}' not found!")

# Main Gradio app
def app():
    with gr.Blocks(css="style.css") as demo:
        gr.Markdown("## Dynamic Menu with Modal Window")

        # Menu page
        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 (hidden by default)
        modal_window = gr.Column(visible=False, elem_classes=["popup"])
        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 Bag")
        close_modal_button = gr.Button("Close")

        # Cart
        cart_state = gr.State([])
        cart_output = gr.HTML(value="Your cart is empty.")

        # Handlers
        def update_menu(preference):
            return filter_menu(preference)

        def show_modal(dish_name):
            try:
                img, name, desc, price = render_dish_details(dish_name)
                return (
                    gr.update(visible=True),
                    img, name, desc, price
                )
            except ValueError as e:
                return gr.update(value=f"Error: {str(e)}")

        def close_modal():
            return gr.update(visible=False)

        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

        # Events
        preference_selector.change(update_menu, inputs=[preference_selector], outputs=[menu_output])
        menu_output.change(show_modal, inputs=[menu_output], outputs=[modal_window, modal_image, modal_name, modal_description, modal_price])
        close_modal_button.click(close_modal, outputs=[modal_window])
        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_window:
            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()