geethareddy commited on
Commit
16a0699
·
verified ·
1 Parent(s): 0fd88c9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +212 -83
app.py CHANGED
@@ -1,92 +1,221 @@
1
- # Define the Python script content
2
- menu_script = """
3
  import gradio as gr
 
4
 
5
- # Define the food items
6
- food_items = [
7
- {
8
- "name": "Veg Samosa",
9
- "price": "$9",
10
- "description": "Crispy fried pastry filled with spiced potatoes and peas. Serves 1.",
11
- "nutrition": "[Energy: 200 kcal, Protein: 5g, Carbohydrates: 25g, Fiber: 3g, Fat: 10g, Sugar: 1g]",
12
- "image": "https://example.com/images/veg_samosa.jpg",
13
- "portion": "Single Serve",
14
- },
15
- {
16
- "name": "Chilli Gobi",
17
- "price": "$12",
18
- "description": "Cauliflower florets tossed in a spicy chili sauce. Serves 2.",
19
- "nutrition": "[Energy: 180 kcal, Protein: 4g, Carbohydrates: 15g, Fiber: 5g, Fat: 8g, Sugar: 2g]",
20
- "image": "https://example.com/images/chilli_gobi.jpg",
21
- "portion": "Double Serve",
22
- },
23
- ]
24
-
25
- # Generate the food menu
26
- def generate_food_menu():
27
- html_content = "<div style='display: flex; flex-wrap: wrap; gap: 20px;'>"
28
- for item in food_items:
 
 
 
 
 
 
 
 
 
 
 
 
29
  html_content += f"""
30
- <div style='border: 1px solid #ddd; border-radius: 10px; width: 300px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1);'>
31
- <img src='{item['image']}' alt='{item['name']}' style='width: 100%; height: 200px; object-fit: cover; cursor: pointer;' onclick="openPopup('{item['name']}', '{item['price']}', '{item['description']}', '{item['nutrition']}', '{item['image']}', '{item['portion']}')">
32
- <div style='padding: 15px;'>
33
- <h3>{item['name']}</h3>
34
- <p>{item['price']}</p>
35
- <p>{item['description']}</p>
36
- <button style='background-color: green; color: white; padding: 10px; border-radius: 5px; border: none; cursor: pointer;' onclick="openPopup('{item['name']}', '{item['price']}', '{item['description']}', '{item['nutrition']}', '{item['image']}', '{item['portion']}')">Add</button>
 
 
37
  </div>
38
  </div>
39
  """
40
- html_content += "</div>"
41
  return html_content
42
 
43
- # JavaScript for pop-up functionality
44
- popup_js = """
45
- <script>
46
- function openPopup(name, price, description, nutrition, image, portion) {
47
- const popup = document.getElementById('popup');
48
- popup.style.display = 'block';
49
- popup.style.top = window.event.clientY + 'px';
50
- popup.style.left = window.event.clientX + 'px';
51
- document.getElementById('popup-name').innerText = name;
52
- document.getElementById('popup-price').innerText = price;
53
- document.getElementById('popup-description').innerText = description;
54
- document.getElementById('popup-nutrition').innerText = nutrition;
55
- document.getElementById('popup-image').src = image;
56
- document.getElementById('popup-portion').innerText = portion;
57
- }
58
 
59
- function closePopup() {
60
- document.getElementById('popup').style.display = 'none';
61
- }
62
- </script>
63
- """
64
-
65
- # Build the Gradio Interface
66
- with gr.Blocks() as demo:
67
- with gr.Row():
68
- gr.HTML("<h2 style='text-align: center;'>Dynamic Menu with Preferences</h2>")
69
- with gr.Row():
70
- gr.HTML(generate_food_menu())
71
- gr.HTML("""
72
- <div id="popup" style="display:none; position:fixed; width:300px; background:white; border:1px solid #ccc; border-radius:10px; padding:15px; box-shadow:0px 4px 8px rgba(0,0,0,0.2); z-index:1000;">
73
- <button onclick="closePopup()" style="position:absolute; top:5px; right:10px; background:none; border:none; font-size:1.2em; cursor:pointer;">&times;</button>
74
- <img id="popup-image" src="" alt="Food Image" style="width:100%; height:150px; border-radius:5px; object-fit:cover; margin-bottom:10px;">
75
- <h3 id="popup-name"></h3>
76
- <p id="popup-price"></p>
77
- <p id="popup-description"></p>
78
- <p id="popup-nutrition"></p>
79
- <p><b>Portion Size:</b> <span id="popup-portion"></span></p>
80
- </div>
81
- """)
82
- gr.HTML(popup_js)
83
-
84
- demo.launch()
85
- """
86
-
87
- # Save the script to a file
88
- file_path = "/mnt/data/dynamic_menu_with_popup.py"
89
- with open(file_path, "w") as file:
90
- file.write(menu_script)
91
-
92
- file_path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ import pandas as pd
3
 
4
+ # Function to load the menu data
5
+ def load_menu():
6
+ menu_file = "menu.xlsx" # Ensure this file exists in the same directory
7
+ try:
8
+ return pd.read_excel(menu_file)
9
+ except Exception as e:
10
+ raise ValueError(f"Error loading menu file: {e}")
11
+
12
+ # Initialize cart globally
13
+ cart_items = []
14
+
15
+ # Pricing for extras
16
+ EXTRAS_PRICES = {
17
+ "Extra Raitha 4oz": 1,
18
+ "Extra Raitha 8oz": 2,
19
+ "Extra Salan 4oz": 1,
20
+ "Extra Salan 8oz": 2,
21
+ "Extra Onion": 1,
22
+ "Extra Onion & Lemon": 2,
23
+ "Extra Fried Onion 4oz": 2,
24
+ }
25
+
26
+ # Function to filter menu items based on preference
27
+ def filter_menu(preference):
28
+ menu_data = load_menu()
29
+ if preference == "Halal/Non-Veg":
30
+ filtered_data = menu_data[menu_data["Ingredients"].str.contains("Chicken|Mutton|Fish|Prawns|Goat", case=False, na=False)]
31
+ elif preference == "Vegetarian":
32
+ filtered_data = menu_data[~menu_data["Ingredients"].str.contains("Chicken|Mutton|Fish|Prawns|Goat", case=False, na=False)]
33
+ elif preference == "Guilt-Free":
34
+ filtered_data = menu_data[menu_data["Description"].str.contains(r"Fat: ([0-9]|10)g", case=False, na=False)]
35
+ else:
36
+ filtered_data = menu_data
37
+
38
+ html_content = ""
39
+ for _, item in filtered_data.iterrows():
40
  html_content += f"""
41
+ <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);\">
42
+ <div style=\"flex: 1; margin-right: 15px;\">
43
+ <h3 style=\"margin: 0; font-size: 8px;\">{item['Dish Name']}</h3>
44
+ <p style=\"margin: 5px 0; font-size: 6px; color: #888;\">${item['Price ($)']}</p>
45
+ <p style=\"margin: 5px 0; font-size: 4px; color: #555;\">{item['Description']}</p>
46
+ </div>
47
+ <div style=\"flex-shrink: 0; text-align: center;\">
48
+ <img src=\"{item['Image URL']}\" alt=\"{item['Dish Name']}\" style=\"width: 100px; height: 100px; border-radius: 8px; object-fit: cover; margin-bottom: 10px;\">
49
+ <button style=\"background-color: #28a745; color: white; border: none; padding: 8px 15px; font-size: 14px; border-radius: 5px; cursor: pointer;\" onclick=\"openModal('{item['Dish Name']}', '{item['Image URL']}', '{item['Description']}', '{item['Price ($)']}')\">Add</button>
50
  </div>
51
  </div>
52
  """
 
53
  return html_content
54
 
55
+ # Function to update the cart display
56
+ def update_cart():
57
+ if len(cart_items) == 0:
58
+ return "Your cart is empty."
 
 
 
 
 
 
 
 
 
 
 
59
 
60
+ total_bill = 0
61
+ cart_html = "<h3>Your Cart:</h3><ul style='list-style-type: none; padding: 0;'>"
62
+
63
+ for item in cart_items:
64
+ extras = ", ".join(item.get("extras", []))
65
+ extras_cost = sum(EXTRAS_PRICES.get(extra, 0) for extra in item.get("extras", []))
66
+ item_price = float(item['price'].strip('$'))
67
+ item_total = (item_price + extras_cost) * item['quantity']
68
+ total_bill += item_total
69
+
70
+ cart_html += f"<li style='margin-bottom: 20px; border: 1px solid #ddd; padding: 10px; border-radius: 8px;'>"
71
+ cart_html += f"<strong>Item:</strong> {item['name']} - ${item_price:.2f}<br>"
72
+ cart_html += f"<strong>Quantity x Price:</strong> {item['quantity']} x ${item_price:.2f} = ${item_price * item['quantity']:.2f}<br>"
73
+ cart_html += f"<strong>Spice Level:</strong> {item['spiceLevel']}<br>"
74
+ cart_html += f"<strong>Extras:</strong> {extras} - ${extras_cost:.2f}<br>"
75
+ cart_html += f"<strong>Instructions:</strong> {item['instructions']}<br>"
76
+ cart_html += f"<strong>Item Total:</strong> ${item_total:.2f}"
77
+ cart_html += "</li>"
78
+
79
+ cart_html += f"</ul><p><strong>Total Bill: ${total_bill:.2f}</strong></p>"
80
+ return cart_html
81
+
82
+ # Redirect to cart details page
83
+ def redirect_to_cart():
84
+ return update_cart()
85
+
86
+ # Gradio app definition
87
+ def app():
88
+ with gr.Blocks() as demo:
89
+ gr.Markdown("## Dynamic Menu with Preferences")
90
+
91
+ # Radio button for selecting preference
92
+ selected_preference = gr.Radio(
93
+ choices=["All", "Vegetarian", "Halal/Non-Veg", "Guilt-Free"],
94
+ value="All",
95
+ label="Choose a Preference",
96
+ )
97
+
98
+ # Output area for menu items
99
+ menu_output = gr.HTML(value=filter_menu("All"))
100
+
101
+ # Floating cart display
102
+ cart_output = gr.HTML(value="Your cart is empty.", elem_id="floating-cart")
103
+
104
+ # JavaScript for modal and cart behavior
105
+ modal_and_cart_js = """
106
+ <script>
107
+ let cart = [];
108
+ const extrasPrices = {
109
+ "Extra Raitha 4oz": 1,
110
+ "Extra Raitha 8oz": 2,
111
+ "Extra Salan 4oz": 1,
112
+ "Extra Salan 8oz": 2,
113
+ "Extra Onion": 1,
114
+ "Extra Onion & Lemon": 2,
115
+ "Extra Fried Onion 4oz": 2
116
+ };
117
+
118
+ function openModal(name, image, description, price) {
119
+ document.getElementById('modal').style.display = 'block';
120
+ document.getElementById('modal-image').src = image;
121
+ document.getElementById('modal-name').innerText = name;
122
+ document.getElementById('modal-description').innerText = description;
123
+ document.getElementById('modal-price').innerText = price;
124
+
125
+ // Reset spice levels and extras
126
+ const spiceLevelInputs = document.querySelectorAll('input[name="spice-level"]');
127
+ spiceLevelInputs.forEach(input => input.checked = false);
128
+
129
+ const extrasInputs = document.querySelectorAll('input[name="biryani-extra"]');
130
+ extrasInputs.forEach(input => input.checked = false);
131
+
132
+ document.getElementById('quantity').value = 1;
133
+ document.getElementById('special-instructions').value = '';
134
+ }
135
+
136
+ function closeModal() {
137
+ document.getElementById('modal').style.display = 'none';
138
+ }
139
+
140
+ function addToCart() {
141
+ const name = document.getElementById('modal-name').innerText;
142
+ const price = document.getElementById('modal-price').innerText;
143
+ const spiceLevel = document.querySelector('input[name="spice-level"]:checked')?.value || "Not Selected";
144
+ const quantity = parseInt(document.getElementById('quantity').value) || 1;
145
+ const instructions = document.getElementById('special-instructions').value;
146
+ const extras = Array.from(document.querySelectorAll('input[name="biryani-extra"]:checked')).map(extra => extra.value);
147
+
148
+ const extrasCost = extras.reduce((sum, extra) => sum + (extrasPrices[extra] || 0), 0);
149
+ const itemTotal = (parseFloat(price.replace('$', '')) + extrasCost) * quantity;
150
+
151
+ const cartItem = { name, price, spiceLevel, quantity, instructions, extras, itemTotal };
152
+ cart.push(cartItem);
153
+
154
+ alert(`${name} added to cart!`);
155
+ updateCartDisplay();
156
+ closeModal();
157
+ }
158
+
159
+ function updateCartDisplay() {
160
+ let totalBill = 0;
161
+ let cartHTML = "<h3>Your Cart:</h3><ul>";
162
+ cart.forEach(item => {
163
+ totalBill += item.itemTotal;
164
+ const extras = item.extras.join(', ');
165
+ cartHTML += `<li>${item.name} (x${item.quantity}, Spice: ${item.spiceLevel}, Extras: ${extras}, Instructions: ${item.instructions}) - $${item.itemTotal.toFixed(2)}</li>`;
166
+ });
167
+ cartHTML += `</ul><p><strong>Total Bill: $${totalBill.toFixed(2)}</strong></p>`;
168
+ document.getElementById('floating-cart').innerHTML = cartHTML;
169
+ }
170
+ </script>
171
+ """
172
+
173
+ # Modal window
174
+ modal_window = gr.HTML("""
175
+ <div id="modal" style="display: none; position: fixed; top: 40%; left: 50%; transform: translate(-50%, -40%); width: 50%; background: white; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); padding: 20px; z-index: 1000;">
176
+ <div style="text-align: right;">
177
+ <button onclick="closeModal()" style="background: none; border: none; font-size: 18px; cursor: pointer;">&times;</button>
178
+ </div>
179
+ <img id="modal-image" style="width: 100%; height: auto; border-radius: 8px; margin-bottom: 20px;" />
180
+ <h2 id="modal-name"></h2>
181
+ <p id="modal-description"></p>
182
+ <p id="modal-price"></p>
183
+ <!-- Spice Levels -->
184
+ <label for="spice-level">Choose a Spice Level (Required):</label>
185
+ <!-- Biryani Extras -->
186
+ <label for="biryani-extras">Biryani Extras (Optional - Choose as many as you like):</label>
187
+ <div id="biryani-extras-options" style="display: flex; flex-wrap: wrap; gap: 10px; margin: 10px 0;">
188
+ <label><input type="checkbox" name="biryani-extra" value="Extra Raitha 4oz" /> Extra Raitha 4oz + $1.00</label>
189
+ <label><input type="checkbox" name="biryani-extra" value="Extra Raitha 8oz" /> Extra Raitha 8oz + $2.00</label>
190
+ <label><input type="checkbox" name="biryani-extra" value="Extra Salan 4oz" /> Extra Salan 4oz + $1.00</label>
191
+ <label><input type="checkbox" name="biryani-extra" value="Extra Salan 8oz" /> Extra Salan 8oz + $2.00</label>
192
+ <label><input type="checkbox" name="biryani-extra" value="Extra Onion" /> Extra Onion + $1.00</label>
193
+ <label><input type="checkbox" name="biryani-extra" value="Extra Onion & Lemon" /> Extra Onion & Lemon + $2.00</label>
194
+ <label><input type="checkbox" name="biryani-extra" value="Extra Fried Onion 4oz" /> Extra Fried Onion 4oz + $2.00</label>
195
+ </div>
196
+ <!-- Quantity and Special Instructions -->
197
+ <label for="quantity">Quantity:</label>
198
+ <input type="number" id="quantity" value="1" min="1" style="width: 50px;" />
199
+ <br><br>
200
+ <textarea id="special-instructions" placeholder="Add special instructions here..." style="width: 100%; height: 60px;"></textarea>
201
+ <br><br>
202
+ <!-- Add to Cart Button -->
203
+ <button style="background-color: #28a745; color: white; border: none; padding: 10px 20px; font-size: 14px; border-radius: 5px; cursor: pointer;" onclick="addToCart()">Add to Cart</button>
204
+ </div>
205
+ """)
206
+
207
+ # Interactivity
208
+ selected_preference.change(filter_menu, inputs=[selected_preference], outputs=[menu_output])
209
+
210
+ # Layout
211
+ gr.Row([selected_preference])
212
+ gr.Row(menu_output)
213
+ gr.Row(cart_output)
214
+ gr.Row(modal_window)
215
+ gr.HTML(modal_and_cart_js)
216
+
217
+ return demo
218
+
219
+ if __name__ == "__main__":
220
+ demo = app()
221
+ demo.launch()