File size: 4,800 Bytes
ba4dd53
 
 
37e70db
ba4dd53
 
 
 
 
 
 
37e70db
 
ba4dd53
 
 
 
 
 
 
 
37e70db
ba4dd53
 
37e70db
 
 
 
 
 
 
 
 
 
 
 
0d58d8b
37e70db
 
 
 
 
0d58d8b
ba4dd53
0d58d8b
ba4dd53
7b360d9
 
 
0d58d8b
 
 
 
7b360d9
 
 
37e70db
 
 
f690d7c
0d58d8b
f690d7c
0d58d8b
ba4dd53
0d58d8b
 
 
 
 
 
f690d7c
37e70db
0d58d8b
9c7ec1f
f690d7c
06b4e04
 
 
37e70db
f690d7c
0d58d8b
 
 
f690d7c
7b360d9
 
 
f690d7c
 
7b360d9
0d58d8b
7b360d9
0d58d8b
7b360d9
 
0d58d8b
 
 
 
 
 
 
 
37e70db
f690d7c
0d58d8b
 
 
 
 
 
f690d7c
 
 
 
d0024b1
 
37e70db
f690d7c
 
d0024b1
9c7ec1f
06b4e04
 
 
 
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
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):
    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 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']}" onclick="selectDish('{item['Dish Name']}')" 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

# Function to render dish details for the suggestion page
def render_dish_details(dish_name):
    print(f"Dish name received: {dish_name}")  # Debugging line
    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!")

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

        selected_dish = gr.State("")  # State for the selected dish name

        # Menu components
        preference_selector = gr.Radio(
            choices=["All", "Vegetarian", "Halal/Non-Veg", "Guilt-Free"],
            value="All",
            label="Choose a Preference"
        )
        menu_html = gr.HTML(value=filter_menu("All"))

        # Suggestion page components
        suggestion_page = gr.Column(visible=False)
        dish_image = gr.Image(label="Dish Image")
        dish_name = gr.Markdown()
        dish_description = gr.Markdown()
        dish_price = gr.Markdown()

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

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

        # Event Handlers
        preference_selector.change(
            update_menu,
            inputs=[preference_selector],
            outputs=[menu_html]
        )

        menu_html.change(
            show_suggestion,
            inputs=[selected_dish],
            outputs=[menu_html, suggestion_page, dish_image, dish_name, dish_description, dish_price]
        )

        # Layout
        with gr.Row():
            menu_html

        with suggestion_page:
            dish_image
            dish_name
            dish_description
            dish_price

    return demo


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