File size: 5,218 Bytes
ba4dd53
 
 
001b11b
ba4dd53
 
001b11b
ba4dd53
 
 
37e70db
 
ba4dd53
 
 
 
 
 
 
37e70db
ba4dd53
 
37e70db
 
 
 
c6f513e
001b11b
c6f513e
 
 
d9fe1ff
37e70db
 
 
 
d9fe1ff
 
ba4dd53
7b360d9
 
 
c6f513e
001b11b
c6f513e
001b11b
d9fe1ff
7b360d9
 
 
37e70db
6b86d43
37e70db
c6f513e
001b11b
ba4dd53
001b11b
0d58d8b
 
 
6b86d43
4b578a2
6b86d43
 
001b11b
d9fe1ff
6b86d43
 
 
 
 
 
4b578a2
 
d9fe1ff
6b86d43
4b578a2
001b11b
4b578a2
 
37e70db
001b11b
0d58d8b
 
 
6b86d43
d9fe1ff
 
 
 
 
 
001b11b
d9fe1ff
6b86d43
 
 
37e70db
4b578a2
 
 
 
 
 
 
 
 
 
 
 
 
 
001b11b
6b86d43
d9fe1ff
 
6b86d43
4b578a2
37e70db
f690d7c
6b86d43
d9fe1ff
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
141
import gradio as gr
import pandas as pd

# Function to load menu data from Excel
def load_menu():
    try:
        return pd.read_excel("menu.xlsx")  # Ensure menu.xlsx exists 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']}" class="dish-image">
            <h3>{item['Dish Name']}</h3>
            <p>{item['Description']}</p>
            <p><strong>${item['Price ($)']}</strong></p>
            <button onclick="showModal('{item['Dish Name']}')" class="add-button">Add</button>
        </div>
        """
    return html_content

# Function to 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_name,
            dish["Description"],
            f"${dish['Price ($)']}",
            dish["Ingredients"]
        )
    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")

        # Home page menu
        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 (hidden by default)
        modal = 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 Cart")
        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):
            img, name, desc, price, ingredients = get_dish_details(dish_name)
            return (
                gr.update(visible=True),
                img,
                f"### {name}",
                f"**Description:** {desc}\n\n**Ingredients:** {ingredients}",
                price
            )

        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, modal_image, modal_name, modal_description, modal_price])
        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()