File size: 5,017 Bytes
a691ebc
 
 
078431c
8edd0c3
 
078431c
7ad0ad6
a355a11
 
 
 
 
 
81886a7
a355a11
 
 
078431c
7ad0ad6
 
 
a355a11
 
 
 
7ad0ad6
8edd0c3
 
f3efaf1
078431c
81886a7
a691ebc
 
 
c5c590b
a691ebc
9b46be7
 
31bbffa
 
 
 
 
 
 
 
 
 
c5c590b
31bbffa
c5c590b
31bbffa
 
 
 
 
 
 
 
 
 
 
 
c5c590b
9b46be7
31bbffa
9b46be7
a691ebc
81886a7
a691ebc
81886a7
a691ebc
81886a7
 
f3efaf1
 
078431c
81886a7
 
 
 
 
f3efaf1
31bbffa
81886a7
c5c590b
81886a7
 
 
 
c5c590b
 
 
 
 
 
31bbffa
a691ebc
f3efaf1
a691ebc
 
 
c5c590b
 
 
 
 
 
 
 
 
 
 
 
 
 
8632ccc
 
c5c590b
 
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
import gradio as gr
import pandas as pd

# Load menu data from Excel file
def load_menu(file_path="menu.xlsx"):
    menu_df = pd.read_excel(file_path)
    menu_df.columns = menu_df.columns.str.strip().str.lower()
    
    column_mapping = {
        "name": next((col for col in menu_df.columns if "name" in col), None),
        "price": next((col for col in menu_df.columns if "price" in col), None),
        "description": next((col for col in menu_df.columns if "description" in col), None),
        "image": next((col for col in menu_df.columns if "image" in col), None),
    }
    
    missing_columns = [key for key, col in column_mapping.items() if col is None]
    if missing_columns:
        raise ValueError(f"Excel file is missing one or more required columns: {missing_columns}")
    
    menu = []
    for _, row in menu_df.iterrows():
        menu.append({
            "name": row[column_mapping["name"]],
            "price": row[column_mapping["price"]],
            "description": row[column_mapping["description"]],
            "image": row[column_mapping["image"]],
        })
    return menu

# Initialize menu and cart
menu_data = load_menu("menu.xlsx")
cart = {}

def display_menu():
    """
    Render the menu dynamically as HTML.
    """
    menu_html = ""
    for item in menu_data:
        if item["name"] in cart:
            # Quantity selector if the item is already in the cart
            menu_html += f"""
            <div style="display: flex; align-items: center; margin-bottom: 15px; border: 1px solid #ddd; padding: 10px; border-radius: 5px;">
                <img src="{item['image']}" alt="{item['name']}" style="width: 80px; height: 80px; border-radius: 5px; margin-right: 15px;">
                <div>
                    <h4 style="margin: 0;">{item['name']} - ${item['price']}</h4>
                    <p style="font-size: 12px; color: gray;">{item['description']}</p>
                </div>
                <div style="margin-left: auto; display: flex; align-items: center;">
                    <button onclick="decrease_quantity('{item['name']}')" style="background-color: #dc3545; color: white; border: none; padding: 5px; border-radius: 5px;">-</button>
                    <span style="margin: 0 10px;">{cart[item['name']]['quantity']}</span>
                    <button onclick="increase_quantity('{item['name']}')" style="background-color: #28a745; color: white; border: none; padding: 5px; border-radius: 5px;">+</button>
                </div>
            </div>
            """
        else:
            # Add button if the item is not in the cart
            menu_html += f"""
            <div style="display: flex; align-items: center; margin-bottom: 15px; border: 1px solid #ddd; padding: 10px; border-radius: 5px;">
                <img src="{item['image']}" alt="{item['name']}" style="width: 80px; height: 80px; border-radius: 5px; margin-right: 15px;">
                <div>
                    <h4 style="margin: 0;">{item['name']} - ${item['price']}</h4>
                    <p style="font-size: 12px; color: gray;">{item['description']}</p>
                </div>
                <button id="add-{item['name']}" style="background-color: #28a745; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; margin-left: auto;">Add</button>
            </div>
            """
    return menu_html

def add_to_cart(item_name):
    """
    Add an item to the cart.
    """
    if item_name in cart:
        cart[item_name]["quantity"] += 1
    else:
        for item in menu_data:
            if item["name"] == item_name:
                cart[item_name] = {
                    "name": item["name"],
                    "price": item["price"],
                    "quantity": 1
                }
                break
    return display_menu()

def update_quantity(item_name, operation):
    """
    Update the quantity of an item in the cart.
    """
    if item_name in cart:
        if operation == "increase":
            cart[item_name]["quantity"] += 1
        elif operation == "decrease":
            cart[item_name]["quantity"] -= 1
            if cart[item_name]["quantity"] <= 0:
                del cart[item_name]
    return display_menu()

# Gradio Interface
with gr.Blocks() as demo:
    gr.Markdown("# Dynamic Food Menu")
    
    menu_html = gr.HTML(value=display_menu())

    # Hidden input fields for Gradio's event handling
    item_name_input = gr.Textbox(visible=False)
    operation_input = gr.Textbox(visible=False)

    # Simulate "Add to Cart" and "Update Quantity"
    add_button = gr.Button("Add to Cart", visible=False)
    update_button = gr.Button("Update Quantity", visible=False)

    # Update menu after adding or updating quantity
    add_button.click(fn=add_to_cart, inputs=item_name_input, outputs=menu_html)
    update_button.click(fn=update_quantity, inputs=[item_name_input, operation_input], outputs=menu_html)

    # Include menu_html in Blocks context
    menu_html.render()

demo.launch()