Update templates/index.html
Browse files- templates/index.html +59 -39
templates/index.html
CHANGED
|
@@ -75,9 +75,9 @@
|
|
| 75 |
textarea {
|
| 76 |
resize: none; /* Prevent manual resizing */
|
| 77 |
flex-grow: 1;
|
| 78 |
-
min-height: 2.5rem;
|
| 79 |
-
max-height: 8rem;
|
| 80 |
-
overflow-y: auto;
|
| 81 |
background-color: #2d3748; /* Same as container */
|
| 82 |
color: #e2e8f0; /* Light text */
|
| 83 |
border: 1px solid #4a5568; /* Darker border */
|
|
@@ -174,7 +174,7 @@
|
|
| 174 |
<div id="messagesArea" class="messages-area">
|
| 175 |
<!-- Chat messages will be appended here -->
|
| 176 |
<div class="ai-message message-bubble">
|
| 177 |
-
Hello! How can I assist you today? You can type a message, or upload an image
|
| 178 |
</div>
|
| 179 |
</div>
|
| 180 |
<div class="input-area flex-col items-stretch">
|
|
@@ -253,9 +253,9 @@
|
|
| 253 |
}
|
| 254 |
|
| 255 |
let uploadedFile = null; // Stores the selected file object
|
| 256 |
-
let uploadedFileType = null; // 'image' or '
|
| 257 |
-
let uploadedFileBase64 = null; // For images
|
| 258 |
-
let uploadedFileText = null; // For documents
|
| 259 |
|
| 260 |
// Function to show custom message box
|
| 261 |
function showMessage(title, content) {
|
|
@@ -288,9 +288,7 @@
|
|
| 288 |
} else if (typeof content === 'string') {
|
| 289 |
messageDiv.innerHTML = marked.parse(content); // Render Markdown for text
|
| 290 |
} else if (typeof content === 'object' && content.type === 'image') {
|
| 291 |
-
// Display image in message bubble
|
| 292 |
-
// This block is now effectively unused for user messages as displayContent will be a string
|
| 293 |
-
// But keeping it here for potential future use or if AI sends image back
|
| 294 |
const img = document.createElement('img');
|
| 295 |
img.src = content.src;
|
| 296 |
img.alt = "Uploaded image";
|
|
@@ -302,8 +300,7 @@
|
|
| 302 |
messageDiv.appendChild(textDiv);
|
| 303 |
}
|
| 304 |
} else if (typeof content === 'object' && content.type === 'document') {
|
| 305 |
-
// Display document info in message bubble
|
| 306 |
-
// This block is now effectively unused for user messages as displayContent will be a string
|
| 307 |
const docInfoDiv = document.createElement('div');
|
| 308 |
docInfoDiv.innerHTML = `<strong>Document Uploaded:</strong> ${content.name}<br>`;
|
| 309 |
if (content.textPreview) {
|
|
@@ -368,17 +365,15 @@
|
|
| 368 |
|
| 369 |
uploadedFile = file;
|
| 370 |
uploadedFileType = 'image';
|
| 371 |
-
|
| 372 |
-
fileNameDisplay.textContent = `Image: ${file.name} (Uploaded successfully!)`;
|
| 373 |
clearFileButton.classList.remove('hidden');
|
| 374 |
|
| 375 |
const reader = new FileReader();
|
| 376 |
reader.onload = (e) => {
|
| 377 |
uploadedFileBase64 = e.target.result.split(',')[1]; // Get base64 part
|
| 378 |
console.log("DEBUG: Image FileReader loaded. Base64 length:", uploadedFileBase64.length);
|
| 379 |
-
|
| 380 |
-
filePreview.
|
| 381 |
-
filePreview.classList.add('hidden'); // Ensure preview container remains hidden
|
| 382 |
};
|
| 383 |
reader.onerror = (e) => {
|
| 384 |
console.error("DEBUG: FileReader error for image:", e);
|
|
@@ -403,35 +398,56 @@
|
|
| 403 |
|
| 404 |
console.log("DEBUG: Selected document file:", file);
|
| 405 |
uploadedFile = file;
|
| 406 |
-
|
| 407 |
-
// Update this line to show success message and file name
|
| 408 |
-
fileNameDisplay.textContent = `Document: ${file.name} (Uploaded successfully!)`;
|
| 409 |
clearFileButton.classList.remove('hidden');
|
| 410 |
|
| 411 |
-
//
|
| 412 |
if (file.type === 'text/plain') {
|
|
|
|
| 413 |
const reader = new FileReader();
|
| 414 |
reader.onload = (e) => {
|
| 415 |
uploadedFileText = e.target.result;
|
| 416 |
-
console.log("DEBUG: Document FileReader loaded. Text length:", uploadedFileText.length);
|
| 417 |
-
|
| 418 |
-
filePreview.
|
| 419 |
-
filePreview.classList.add('hidden'); // Ensure preview container remains hidden
|
| 420 |
};
|
| 421 |
reader.onerror = (e) => {
|
| 422 |
-
console.error("DEBUG: FileReader error for document:", e);
|
| 423 |
-
showMessage("File Read Error", "Could not read the document file.");
|
| 424 |
clearFileSelection();
|
| 425 |
};
|
| 426 |
reader.readAsText(file);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 427 |
} else {
|
| 428 |
-
// For other document types, inform the user
|
| 429 |
-
|
| 430 |
-
showMessage("Unsupported Document", "Only plain text (.txt) files are directly processed
|
| 431 |
console.warn("DEBUG: Unsupported document type selected:", file.type);
|
| 432 |
-
uploadedFileText = null;
|
| 433 |
-
|
| 434 |
-
filePreview.
|
|
|
|
| 435 |
}
|
| 436 |
});
|
| 437 |
|
|
@@ -460,18 +476,22 @@
|
|
| 460 |
mimeType: uploadedFile.type,
|
| 461 |
data: uploadedFileBase64
|
| 462 |
};
|
| 463 |
-
// Change displayContent to a text message for the chat bubble
|
| 464 |
displayContent = `Image uploaded: ${uploadedFile.name}. ${userQuery ? `\n\n${userQuery}` : ''}`;
|
| 465 |
console.log("DEBUG: Prepared image data for requestBody. MimeType:", requestBody.image_data.mimeType, "Data length:", requestBody.image_data.data.length);
|
| 466 |
-
} else if (uploadedFileType === '
|
| 467 |
requestBody.document_text = uploadedFileText;
|
| 468 |
-
// Change displayContent to a text message for the chat bubble
|
| 469 |
displayContent = `Document uploaded: ${uploadedFile.name}. ${userQuery ? `\n\n${userQuery}` : ''}`;
|
| 470 |
-
console.log("DEBUG: Prepared document text for requestBody. Text length:", requestBody.document_text.length);
|
| 471 |
-
} else if (uploadedFileType === '
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 472 |
// For unsupported document types, send filename and a note
|
| 473 |
requestBody.query = `${userQuery}\n\nUser uploaded a document named "${uploadedFile.name}". Please note: Content extraction for this file type is not supported in this demo.`;
|
| 474 |
-
// Change displayContent to a text message for the chat bubble
|
| 475 |
displayContent = `Document uploaded: ${uploadedFile.name} (unsupported type). ${userQuery ? `\n\n${userQuery}` : ''}`;
|
| 476 |
console.log("DEBUG: Prepared unsupported document type as text query:", requestBody.query);
|
| 477 |
}
|
|
|
|
| 75 |
textarea {
|
| 76 |
resize: none; /* Prevent manual resizing */
|
| 77 |
flex-grow: 1;
|
| 78 |
+
min-height: 2.5rem;
|
| 79 |
+
max-height: 8rem;
|
| 80 |
+
overflow-y: auto;
|
| 81 |
background-color: #2d3748; /* Same as container */
|
| 82 |
color: #e2e8f0; /* Light text */
|
| 83 |
border: 1px solid #4a5568; /* Darker border */
|
|
|
|
| 174 |
<div id="messagesArea" class="messages-area">
|
| 175 |
<!-- Chat messages will be appended here -->
|
| 176 |
<div class="ai-message message-bubble">
|
| 177 |
+
Hello! How can I assist you today? You can type a message, or upload an image, a text document, or a PDF.
|
| 178 |
</div>
|
| 179 |
</div>
|
| 180 |
<div class="input-area flex-col items-stretch">
|
|
|
|
| 253 |
}
|
| 254 |
|
| 255 |
let uploadedFile = null; // Stores the selected file object
|
| 256 |
+
let uploadedFileType = null; // 'image', 'text_document', or 'pdf_document'
|
| 257 |
+
let uploadedFileBase64 = null; // For images and PDFs
|
| 258 |
+
let uploadedFileText = null; // For text documents
|
| 259 |
|
| 260 |
// Function to show custom message box
|
| 261 |
function showMessage(title, content) {
|
|
|
|
| 288 |
} else if (typeof content === 'string') {
|
| 289 |
messageDiv.innerHTML = marked.parse(content); // Render Markdown for text
|
| 290 |
} else if (typeof content === 'object' && content.type === 'image') {
|
| 291 |
+
// Display image in message bubble (if AI sends image back, or if re-introduced)
|
|
|
|
|
|
|
| 292 |
const img = document.createElement('img');
|
| 293 |
img.src = content.src;
|
| 294 |
img.alt = "Uploaded image";
|
|
|
|
| 300 |
messageDiv.appendChild(textDiv);
|
| 301 |
}
|
| 302 |
} else if (typeof content === 'object' && content.type === 'document') {
|
| 303 |
+
// Display document info in message bubble (if AI sends document back, or if re-introduced)
|
|
|
|
| 304 |
const docInfoDiv = document.createElement('div');
|
| 305 |
docInfoDiv.innerHTML = `<strong>Document Uploaded:</strong> ${content.name}<br>`;
|
| 306 |
if (content.textPreview) {
|
|
|
|
| 365 |
|
| 366 |
uploadedFile = file;
|
| 367 |
uploadedFileType = 'image';
|
| 368 |
+
fileNameDisplay.textContent = `Image: ${file.name} (Ready to send)`;
|
|
|
|
| 369 |
clearFileButton.classList.remove('hidden');
|
| 370 |
|
| 371 |
const reader = new FileReader();
|
| 372 |
reader.onload = (e) => {
|
| 373 |
uploadedFileBase64 = e.target.result.split(',')[1]; // Get base64 part
|
| 374 |
console.log("DEBUG: Image FileReader loaded. Base64 length:", uploadedFileBase64.length);
|
| 375 |
+
filePreview.innerHTML = '';
|
| 376 |
+
filePreview.classList.add('hidden');
|
|
|
|
| 377 |
};
|
| 378 |
reader.onerror = (e) => {
|
| 379 |
console.error("DEBUG: FileReader error for image:", e);
|
|
|
|
| 398 |
|
| 399 |
console.log("DEBUG: Selected document file:", file);
|
| 400 |
uploadedFile = file;
|
| 401 |
+
fileNameDisplay.textContent = `Document: ${file.name} (Ready to send)`;
|
|
|
|
|
|
|
| 402 |
clearFileButton.classList.remove('hidden');
|
| 403 |
|
| 404 |
+
// Determine file type and read accordingly
|
| 405 |
if (file.type === 'text/plain') {
|
| 406 |
+
uploadedFileType = 'text_document';
|
| 407 |
const reader = new FileReader();
|
| 408 |
reader.onload = (e) => {
|
| 409 |
uploadedFileText = e.target.result;
|
| 410 |
+
console.log("DEBUG: Text Document FileReader loaded. Text length:", uploadedFileText.length);
|
| 411 |
+
filePreview.innerHTML = '';
|
| 412 |
+
filePreview.classList.add('hidden');
|
|
|
|
| 413 |
};
|
| 414 |
reader.onerror = (e) => {
|
| 415 |
+
console.error("DEBUG: FileReader error for text document:", e);
|
| 416 |
+
showMessage("File Read Error", "Could not read the text document file.");
|
| 417 |
clearFileSelection();
|
| 418 |
};
|
| 419 |
reader.readAsText(file);
|
| 420 |
+
} else if (file.type === 'application/pdf') {
|
| 421 |
+
uploadedFileType = 'pdf_document';
|
| 422 |
+
if (file.size > 10 * 1024 * 1024) { // 10MB limit for PDFs (adjust as needed)
|
| 423 |
+
showMessage("File Too Large", "Please upload a PDF smaller than 10MB.");
|
| 424 |
+
documentUpload.value = '';
|
| 425 |
+
console.error("DEBUG: PDF file too large:", file.size);
|
| 426 |
+
clearFileSelection();
|
| 427 |
+
return;
|
| 428 |
+
}
|
| 429 |
+
const reader = new FileReader();
|
| 430 |
+
reader.onload = (e) => {
|
| 431 |
+
uploadedFileBase64 = e.target.result.split(',')[1]; // Get base64 part
|
| 432 |
+
console.log("DEBUG: PDF FileReader loaded. Base64 length:", uploadedFileBase64.length);
|
| 433 |
+
filePreview.innerHTML = '';
|
| 434 |
+
filePreview.classList.add('hidden');
|
| 435 |
+
};
|
| 436 |
+
reader.onerror = (e) => {
|
| 437 |
+
console.error("DEBUG: FileReader error for PDF:", e);
|
| 438 |
+
showMessage("File Read Error", "Could not read the PDF file.");
|
| 439 |
+
clearFileSelection();
|
| 440 |
+
};
|
| 441 |
+
reader.readAsDataURL(file); // Read PDF as Data URL (base64)
|
| 442 |
} else {
|
| 443 |
+
// For other document types like .docx, inform the user
|
| 444 |
+
uploadedFileType = 'unsupported_document';
|
| 445 |
+
showMessage("Unsupported Document", "Only plain text (.txt) and PDF (.pdf) files are directly processed. For DOCX, etc., advanced backend parsing is required.");
|
| 446 |
console.warn("DEBUG: Unsupported document type selected:", file.type);
|
| 447 |
+
uploadedFileText = null;
|
| 448 |
+
uploadedFileBase64 = null;
|
| 449 |
+
filePreview.innerHTML = '';
|
| 450 |
+
filePreview.classList.add('hidden');
|
| 451 |
}
|
| 452 |
});
|
| 453 |
|
|
|
|
| 476 |
mimeType: uploadedFile.type,
|
| 477 |
data: uploadedFileBase64
|
| 478 |
};
|
|
|
|
| 479 |
displayContent = `Image uploaded: ${uploadedFile.name}. ${userQuery ? `\n\n${userQuery}` : ''}`;
|
| 480 |
console.log("DEBUG: Prepared image data for requestBody. MimeType:", requestBody.image_data.mimeType, "Data length:", requestBody.image_data.data.length);
|
| 481 |
+
} else if (uploadedFileType === 'text_document' && uploadedFileText) {
|
| 482 |
requestBody.document_text = uploadedFileText;
|
|
|
|
| 483 |
displayContent = `Document uploaded: ${uploadedFile.name}. ${userQuery ? `\n\n${userQuery}` : ''}`;
|
| 484 |
+
console.log("DEBUG: Prepared text document text for requestBody. Text length:", requestBody.document_text.length);
|
| 485 |
+
} else if (uploadedFileType === 'pdf_document' && uploadedFileBase64) {
|
| 486 |
+
requestBody.pdf_data = {
|
| 487 |
+
mimeType: uploadedFile.type,
|
| 488 |
+
data: uploadedFileBase64
|
| 489 |
+
};
|
| 490 |
+
displayContent = `PDF uploaded: ${uploadedFile.name}. ${userQuery ? `\n\n${userQuery}` : ''}`;
|
| 491 |
+
console.log("DEBUG: Prepared PDF data for requestBody. MimeType:", requestBody.pdf_data.mimeType, "Data length:", requestBody.pdf_data.data.length);
|
| 492 |
+
} else if (uploadedFileType === 'unsupported_document' && uploadedFile) {
|
| 493 |
// For unsupported document types, send filename and a note
|
| 494 |
requestBody.query = `${userQuery}\n\nUser uploaded a document named "${uploadedFile.name}". Please note: Content extraction for this file type is not supported in this demo.`;
|
|
|
|
| 495 |
displayContent = `Document uploaded: ${uploadedFile.name} (unsupported type). ${userQuery ? `\n\n${userQuery}` : ''}`;
|
| 496 |
console.log("DEBUG: Prepared unsupported document type as text query:", requestBody.query);
|
| 497 |
}
|