Jatin Mehra commited on
Commit
6c81e4d
·
1 Parent(s): e3257b5

Implement PDF removal functionality and update UI with remove button

Browse files
Files changed (4) hide show
  1. app.py +36 -0
  2. static/css/styles.css +11 -2
  3. static/index.html +2 -1
  4. static/js/app.js +35 -0
app.py CHANGED
@@ -109,6 +109,32 @@ def load_session(session_id, model_name="meta-llama/llama-4-scout-17b-16e-instru
109
  print(f"Error loading session: {str(e)}")
110
  return None, False
111
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  # Mount static files (we'll create these later)
113
  app.mount("/static", StaticFiles(directory="static"), name="static")
114
 
@@ -249,6 +275,16 @@ async def clear_history(request: SessionRequest):
249
 
250
  return {"status": "success", "message": "Chat history cleared"}
251
 
 
 
 
 
 
 
 
 
 
 
252
  # Route to list available models
253
  @app.get("/models")
254
  async def get_models():
 
109
  print(f"Error loading session: {str(e)}")
110
  return None, False
111
 
112
+ # Function to remove PDF file
113
+ def remove_pdf_file(session_id):
114
+ try:
115
+ # Check if the session exists
116
+ session_path = f"{UPLOAD_DIR}/{session_id}_session.pkl"
117
+ if os.path.exists(session_path):
118
+ # Load session data
119
+ with open(session_path, "rb") as f:
120
+ data = pickle.load(f)
121
+
122
+ # Delete PDF file if it exists
123
+ if data.get("file_path") and os.path.exists(data["file_path"]):
124
+ os.remove(data["file_path"])
125
+
126
+ # Remove session file
127
+ os.remove(session_path)
128
+
129
+ # Remove from memory if exists
130
+ if session_id in sessions:
131
+ del sessions[session_id]
132
+
133
+ return True
134
+ except Exception as e:
135
+ print(f"Error removing PDF file: {str(e)}")
136
+ return False
137
+
138
  # Mount static files (we'll create these later)
139
  app.mount("/static", StaticFiles(directory="static"), name="static")
140
 
 
275
 
276
  return {"status": "success", "message": "Chat history cleared"}
277
 
278
+ # Route to remove PDF from session
279
+ @app.post("/remove-pdf")
280
+ async def remove_pdf(request: SessionRequest):
281
+ success = remove_pdf_file(request.session_id)
282
+
283
+ if success:
284
+ return {"status": "success", "message": "PDF file and session removed successfully"}
285
+ else:
286
+ raise HTTPException(status_code=404, detail="Session not found or could not be removed")
287
+
288
  # Route to list available models
289
  @app.get("/models")
290
  async def get_models():
static/css/styles.css CHANGED
@@ -33,7 +33,7 @@ body {
33
  /* App container layout */
34
  .app-container {
35
  display: grid;
36
- grid-template-columns: 260px 1fr 300px;
37
  height: 100vh;
38
  overflow: hidden;
39
  }
@@ -151,7 +151,7 @@ body {
151
  white-space: nowrap;
152
  }
153
 
154
- .btn-clear, .btn-new {
155
  padding: 0.75rem;
156
  border-radius: var(--border-radius);
157
  border: none;
@@ -170,6 +170,15 @@ body {
170
  background-color: rgba(239, 68, 68, 0.2);
171
  }
172
 
 
 
 
 
 
 
 
 
 
173
  .btn-new {
174
  background-color: rgba(37, 99, 235, 0.1);
175
  color: var(--primary-color);
 
33
  /* App container layout */
34
  .app-container {
35
  display: grid;
36
+ grid-template-columns: 260px 1fr;
37
  height: 100vh;
38
  overflow: hidden;
39
  }
 
151
  white-space: nowrap;
152
  }
153
 
154
+ .btn-clear, .btn-new, .btn-remove {
155
  padding: 0.75rem;
156
  border-radius: var(--border-radius);
157
  border: none;
 
170
  background-color: rgba(239, 68, 68, 0.2);
171
  }
172
 
173
+ .btn-remove {
174
+ background-color: rgba(255, 152, 0, 0.1);
175
+ color: #ff9800;
176
+ }
177
+
178
+ .btn-remove:hover {
179
+ background-color: rgba(255, 152, 0, 0.2);
180
+ }
181
+
182
  .btn-new {
183
  background-color: rgba(37, 99, 235, 0.1);
184
  color: var(--primary-color);
static/index.html CHANGED
@@ -44,6 +44,7 @@
44
  <span id="current-file-name">No file loaded</span>
45
  </div>
46
  <button id="clear-history" class="btn-clear">Clear History</button>
 
47
  <button id="new-chat" class="btn-new">New Document</button>
48
  </div>
49
  </div>
@@ -102,7 +103,7 @@
102
  </div>
103
 
104
  <!-- Context Sidebar -->
105
- <div class="context-sidebar" id="context-sidebar">
106
  <div class="context-header">
107
  <h3>Context Used</h3>
108
  <button id="toggle-context" class="btn-toggle">
 
44
  <span id="current-file-name">No file loaded</span>
45
  </div>
46
  <button id="clear-history" class="btn-clear">Clear History</button>
47
+ <button id="remove-pdf" class="btn-remove">Remove PDF</button>
48
  <button id="new-chat" class="btn-new">New Document</button>
49
  </div>
50
  </div>
 
103
  </div>
104
 
105
  <!-- Context Sidebar -->
106
+ <div class="context-sidebar hidden" id="context-sidebar">
107
  <div class="context-header">
108
  <h3>Context Used</h3>
109
  <button id="toggle-context" class="btn-toggle">
static/js/app.js CHANGED
@@ -11,6 +11,7 @@ const modelSelect = document.getElementById('model-select');
11
  const sessionInfo = document.getElementById('session-info');
12
  const currentFileName = document.getElementById('current-file-name');
13
  const clearHistoryBtn = document.getElementById('clear-history');
 
14
  const newChatBtn = document.getElementById('new-chat');
15
  const loadingOverlay = document.getElementById('loading-overlay');
16
  const loadingText = document.getElementById('loading-text');
@@ -40,6 +41,7 @@ chatInput.addEventListener('input', () => {
40
  sendButton.disabled = chatInput.value.trim() === '';
41
  });
42
  clearHistoryBtn.addEventListener('click', clearChatHistory);
 
43
  newChatBtn.addEventListener('click', resetApp);
44
  getStartedBtn.addEventListener('click', () => {
45
  uploadBox.click();
@@ -344,6 +346,39 @@ async function clearChatHistory() {
344
  }
345
  }
346
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
347
  function resetApp() {
348
  // Clear current session
349
  currentSessionId = null;
 
11
  const sessionInfo = document.getElementById('session-info');
12
  const currentFileName = document.getElementById('current-file-name');
13
  const clearHistoryBtn = document.getElementById('clear-history');
14
+ const removePdfBtn = document.getElementById('remove-pdf');
15
  const newChatBtn = document.getElementById('new-chat');
16
  const loadingOverlay = document.getElementById('loading-overlay');
17
  const loadingText = document.getElementById('loading-text');
 
41
  sendButton.disabled = chatInput.value.trim() === '';
42
  });
43
  clearHistoryBtn.addEventListener('click', clearChatHistory);
44
+ removePdfBtn.addEventListener('click', removePdf);
45
  newChatBtn.addEventListener('click', resetApp);
46
  getStartedBtn.addEventListener('click', () => {
47
  uploadBox.click();
 
346
  }
347
  }
348
 
349
+ async function removePdf() {
350
+ if (!currentSessionId) return;
351
+
352
+ try {
353
+ showLoading('Removing PDF from the system...');
354
+
355
+ const response = await fetch('/remove-pdf', {
356
+ method: 'POST',
357
+ headers: {
358
+ 'Content-Type': 'application/json'
359
+ },
360
+ body: JSON.stringify({
361
+ session_id: currentSessionId
362
+ })
363
+ });
364
+
365
+ const data = await response.json();
366
+
367
+ if (data.status === 'success') {
368
+ // Reset the app
369
+ resetApp();
370
+ showError('PDF file has been removed from the system.');
371
+ } else {
372
+ showError('Failed to remove PDF: ' + data.detail);
373
+ }
374
+ } catch (error) {
375
+ console.error('Error removing PDF:', error);
376
+ showError('Failed to remove PDF. Please try again.');
377
+ } finally {
378
+ hideLoading();
379
+ }
380
+ }
381
+
382
  function resetApp() {
383
  // Clear current session
384
  currentSessionId = null;