geethareddy commited on
Commit
2b5a00c
·
verified ·
1 Parent(s): 5faf79f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -139
app.py CHANGED
@@ -12,17 +12,6 @@ def load_menu():
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()
@@ -38,51 +27,33 @@ def filter_menu(preference):
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: 18px;\">{item['Dish Name']}</h3>
44
- <p style=\"margin: 5px 0; font-size: 16px; color: #888;\">${item['Price ($)']}</p>
45
- <p style=\"margin: 5px 0; font-size: 14px; 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:
@@ -98,129 +69,107 @@ def app():
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
- <div id="spice-level-options" style="display: flex; flex-wrap: wrap; gap: 10px; margin: 10px 0;">
186
- <label><input type="radio" name="spice-level" value="American Mild" /> American Mild</label>
187
- <label><input type="radio" name="spice-level" value="American Medium" /> American Medium</label>
188
- <label><input type="radio" name="spice-level" value="American Spicy" /> American Spicy</label>
189
- <label><input type="radio" name="spice-level" value="Indian Mild" /> Indian Mild</label>
190
- <label><input type="radio" name="spice-level" value="Indian Medium" /> Indian Medium</label>
191
- <label><input type="radio" name="spice-level" value="Indian Very Spicy" /> Indian Very Spicy</label>
192
- </div>
193
- <!-- Biryani Extras -->
194
- <label for="biryani-extras">Biryani Extras (Optional - Choose as many as you like):</label>
195
- <div id="biryani-extras-options" style="display: flex; flex-wrap: wrap; gap: 10px; margin: 10px 0;">
196
- <label><input type="checkbox" name="biryani-extra" value="Extra Raitha 4oz" /> Extra Raitha 4oz + $1.00</label>
197
- <label><input type="checkbox" name="biryani-extra" value="Extra Raitha 8oz" /> Extra Raitha 8oz + $2.00</label>
198
- <label><input type="checkbox" name="biryani-extra" value="Extra Salan 4oz" /> Extra Salan 4oz + $1.00</label>
199
- <label><input type="checkbox" name="biryani-extra" value="Extra Salan 8oz" /> Extra Salan 8oz + $2.00</label>
200
- <label><input type="checkbox" name="biryani-extra" value="Extra Onion" /> Extra Onion + $1.00</label>
201
- <label><input type="checkbox" name="biryani-extra" value="Extra Onion & Lemon" /> Extra Onion & Lemon + $2.00</label>
202
- <label><input type="checkbox" name="biryani-extra" value="Extra Fried Onion 4oz" /> Extra Fried Onion 4oz + $2.00</label>
203
- </div>
204
- <!-- Quantity and Special Instructions -->
205
- <label for="quantity">Quantity:</label>
206
- <input type="number" id="quantity" value="1" min="1" style="width: 50px;" />
207
- <br><br>
208
- <textarea id="special-instructions" placeholder="Add special instructions here..." style="width: 100%; height: 60px;"></textarea>
209
- <br><br>
210
- <!-- Add to Cart Button -->
211
- <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>
212
- </div>
213
  """)
214
 
215
  # Interactivity
216
  selected_preference.change(filter_menu, inputs=[selected_preference], outputs=[menu_output])
217
 
218
- # Layout
219
  gr.Row([selected_preference])
220
  gr.Row(menu_output)
221
  gr.Row(cart_output)
222
  gr.Row(modal_window)
223
- gr.HTML(modal_and_cart_js)
224
 
225
  return demo
226
 
 
12
  # Initialize cart globally
13
  cart_items = []
14
 
 
 
 
 
 
 
 
 
 
 
 
15
  # Function to filter menu items based on preference
16
  def filter_menu(preference):
17
  menu_data = load_menu()
 
27
  html_content = ""
28
  for _, item in filtered_data.iterrows():
29
  html_content += f"""
30
+ <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);">
31
+ <div style="flex: 1; margin-right: 15px;">
32
+ <h3 style="margin: 0; font-size: 18px;">{item['Dish Name']}</h3>
33
+ <p style="margin: 5px 0; font-size: 16px; color: #888;">${item['Price ($)']}</p>
34
+ <p style="margin: 5px 0; font-size: 14px; color: #555;">{item['Description']}</p>
35
  </div>
36
+ <div style="flex-shrink: 0; text-align: center;">
37
+ <img src="{item['Image URL']}" alt="{item['Dish Name']}" style="width: 100px; height: 100px; border-radius: 8px; object-fit: cover; margin-bottom: 10px;">
38
+ <button class="add-btn" style="background-color: #28a745; color: white; border: none; padding: 8px 15px; font-size: 14px; border-radius: 5px; cursor: pointer;" onclick="openModal(event, '{item['Dish Name']}', '{item['Image URL']}', '{item['Description']}', '{item['Price ($)']}')">Add</button>
39
  </div>
40
  </div>
41
  """
42
  return html_content
43
 
44
  # Function to update the cart display
45
+ def update_cart(cart):
46
+ global cart_items
47
+ cart_items = cart # Update global cart items
48
  if len(cart_items) == 0:
49
  return "Your cart is empty."
50
+ cart_html = "<h3>Your Cart:</h3><ul>"
 
 
 
51
  for item in cart_items:
52
  extras = ", ".join(item.get("extras", []))
53
+ cart_html += f"<li>{item['name']} (x{item['quantity']}, Spice: {item.get('spiceLevel', 'None')}, Extras: {extras}) - {item['price']}</li>"
54
+ cart_html += "</ul>"
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  return cart_html
56
 
 
 
 
 
57
  # Gradio app definition
58
  def app():
59
  with gr.Blocks() as demo:
 
69
  # Output area for menu items
70
  menu_output = gr.HTML(value=filter_menu("All"))
71
 
72
+ # Cart display
73
+ cart_output = gr.HTML(value="Your cart is empty.")
74
 
75
+ # Modal window
76
+ modal_window = gr.HTML("""
77
+ <div id="modal" style="
78
+ display: none;
79
+ position: fixed;
80
+ top: 50%;
81
+ left: 50%;
82
+ transform: translate(-50%, -50%); /* Centers the modal on the page */
83
+ background: white;
84
+ padding: 20px;
85
+ border-radius: 15px;
86
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3);
87
+ font-family: Arial, sans-serif;
88
+ z-index: 1000;
89
+ min-width: 350px; /* Minimum width of the modal */
90
+ min-height: 300px; /* Minimum height of the modal */
91
+ overflow-y: auto; /* Allow scrolling inside the modal if content is too tall */
92
+ ">
93
+ <div style="text-align: right;">
94
+ <button onclick="closeModal()" style="
95
+ background: none;
96
+ border: none;
97
+ font-size: 24px;
98
+ cursor: pointer;
99
+ color: #333;
100
+ ">&times;</button>
101
+ </div>
102
+ <img id="modal-image" style="
103
+ width: 100%;
104
+ height: auto;
105
+ border-radius: 12px;
106
+ margin-bottom: 15px;
107
+ " />
108
+ <h2 id="modal-name" style="margin-bottom: 10px; font-size: 22px; color: #333;"></h2>
109
+ <p id="modal-description" style="margin-bottom: 10px; color: #555; font-size: 16px;"></p>
110
+ <p id="modal-price" style="margin-bottom: 20px; font-size: 18px; font-weight: bold; color: #222;"></p>
111
+ <div style="display: flex; justify-content: space-between; align-items: center;">
112
+ <label for="quantity" style="font-weight: bold;">Quantity:</label>
113
+ <input type="number" id="quantity" value="1" min="1" style="
114
+ width: 60px;
115
+ padding: 5px;
116
+ border: 1px solid #ccc;
117
+ border-radius: 5px;
118
+ " />
119
+ <button style="
120
+ background-color: #28a745;
121
+ color: white;
122
+ border: none;
123
+ padding: 10px 20px;
124
+ font-size: 16px;
125
+ border-radius: 8px;
126
+ cursor: pointer;
127
+ " onclick="addToCart()">Add</button>
128
+ </div>
129
+ </div>
130
  <script>
131
  let cart = [];
132
+ function openModal(event, name, image, description, price) {
133
+ const modal = document.getElementById('modal');
134
+ modal.style.display = 'block';
135
+
136
+ // Get the clicked button's position
137
+ const rect = event.target.getBoundingClientRect();
138
+
139
+ // Set the popup position based on the clicked element
140
+ modal.style.top = `${rect.top + window.scrollY + rect.height + 10}px`; // 10px below the button
141
+ modal.style.left = `${rect.left + window.scrollX}px`;
142
+
 
143
  document.getElementById('modal-image').src = image;
144
  document.getElementById('modal-name').innerText = name;
145
  document.getElementById('modal-description').innerText = description;
146
+ document.getElementById('modal-price').innerText = `$${price}`;
 
 
 
 
 
 
 
 
 
 
147
  }
 
148
  function closeModal() {
149
+ const modal = document.getElementById('modal');
150
+ modal.style.display = 'none';
151
  }
 
152
  function addToCart() {
153
  const name = document.getElementById('modal-name').innerText;
154
  const price = document.getElementById('modal-price').innerText;
155
+ const description = document.getElementById('modal-description').innerText;
156
  const quantity = parseInt(document.getElementById('quantity').value) || 1;
157
+ const cartItem = { name, description, price, quantity };
 
 
 
 
 
 
158
  cart.push(cartItem);
 
159
  alert(`${name} added to cart!`);
 
160
  closeModal();
161
  }
 
 
 
 
 
 
 
 
 
 
 
 
162
  </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  """)
164
 
165
  # Interactivity
166
  selected_preference.change(filter_menu, inputs=[selected_preference], outputs=[menu_output])
167
 
168
+ # Add the cart output
169
  gr.Row([selected_preference])
170
  gr.Row(menu_output)
171
  gr.Row(cart_output)
172
  gr.Row(modal_window)
 
173
 
174
  return demo
175