File size: 4,290 Bytes
ba4dd53
 
 
807b0c3
ba4dd53
 
807b0c3
ba4dd53
 
 
807b0c3
37e70db
ba4dd53
807b0c3
 
37e70db
807b0c3
37e70db
807b0c3
 
 
 
 
 
 
 
 
 
37e70db
 
 
 
807b0c3
d9fe1ff
ba4dd53
7b360d9
 
 
c6f513e
807b0c3
c6f513e
807b0c3
7b360d9
 
 
37e70db
807b0c3
37e70db
c6f513e
807b0c3
0d58d8b
 
 
6b86d43
4b578a2
6b86d43
 
807b0c3
 
6b86d43
 
 
 
 
 
4b578a2
 
d9fe1ff
6b86d43
4b578a2
807b0c3
4b578a2
 
37e70db
001b11b
6b86d43
807b0c3
d9fe1ff
 
 
 
807b0c3
001b11b
d9fe1ff
6b86d43
 
 
37e70db
807b0c3
4b578a2
807b0c3
 
4b578a2
807b0c3
4b578a2
 
 
807b0c3
4b578a2
 
 
001b11b
807b0c3
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
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"""
        <div class="menu-item">
            <div class="menu-details">
                <h3>{item['Dish Name']}</h3>
                <p>{item['Description']}</p>
                <p><strong>${item['Price ($)']}</strong></p>
            </div>
            <div class="menu-actions">
                <img src="{item['Image URL']}" alt="{item['Dish Name']}" class="menu-img">
                <button class="add-button" onclick="showModal('{item['Dish Name']}')">Add</button>
            </div>
        </div>
        """
    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 = "<br>".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()