triflix commited on
Commit
78eed41
·
verified ·
1 Parent(s): 1ccf566

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +39 -91
templates/index.html CHANGED
@@ -3,116 +3,64 @@
3
  <head>
4
  <meta charset="UTF-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Image to Question Generator</title>
7
  <script src="https://cdn.tailwindcss.com"></script>
8
  </head>
9
- <body class="bg-gray-100">
10
- <div class="container mx-auto p-4">
11
- <h1 class="text-3xl font-bold text-center mb-6">
12
- Image to Question Generator
13
- </h1>
14
- <div class="flex flex-col items-center">
15
- <!-- Upload / Paste Area -->
16
- <div id="upload-area" class="border-2 border-dashed border-gray-400 p-8 rounded w-full max-w-lg text-center bg-white">
17
- <p class="mb-4">
18
- Paste an image with <strong>Ctrl + V</strong> or click to select an image.
19
- </p>
20
- <input type="file" id="fileInput" accept="image/*" class="hidden" />
21
- <button id="selectBtn" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
22
- Select Image
23
- </button>
24
- </div>
25
-
26
- <!-- Result Display -->
27
- <div id="resultArea" class="mt-6 w-full max-w-lg"></div>
28
-
29
- <!-- History Section -->
30
- <div id="historyArea" class="mt-6 w-full max-w-lg">
31
- <h2 class="text-xl font-bold mb-2">History</h2>
32
- <ul id="historyList" class="list-disc pl-5"></ul>
33
- </div>
34
- </div>
35
  </div>
36
 
37
  <script>
38
- const uploadArea = document.getElementById('upload-area');
39
  const fileInput = document.getElementById('fileInput');
40
- const selectBtn = document.getElementById('selectBtn');
41
- const resultArea = document.getElementById('resultArea');
42
- const historyList = document.getElementById('historyList');
43
-
44
- // Load history from localStorage
45
- let history = JSON.parse(localStorage.getItem('history')) || [];
46
-
47
- function renderHistory() {
48
- historyList.innerHTML = '';
49
- history.forEach((item) => {
50
- const li = document.createElement('li');
51
- li.textContent = item;
52
- li.classList.add('cursor-pointer', 'hover:text-blue-500');
53
- li.addEventListener('click', () => {
54
- resultArea.innerHTML = `<pre class="bg-gray-200 p-4 rounded whitespace-pre-wrap">${item}</pre>`;
55
- });
56
- historyList.appendChild(li);
57
- });
58
- }
59
-
60
- renderHistory();
61
-
62
- // Trigger file input on button click
63
- selectBtn.addEventListener('click', () => {
64
- fileInput.click();
65
- });
66
-
67
- // When a file is selected, upload it
68
- fileInput.addEventListener('change', () => {
69
- if (fileInput.files.length > 0) {
70
- uploadFile(fileInput.files[0]);
71
- }
72
- });
73
-
74
- // Listen for paste events to handle Ctrl+V image pasting
75
- window.addEventListener('paste', (event) => {
76
- const items = event.clipboardData.items;
77
- for (let i = 0; i < items.length; i++) {
78
- if (items[i].type.indexOf("image") !== -1) {
79
- const file = items[i].getAsFile();
80
- uploadFile(file);
81
- break;
82
- }
83
- }
84
- });
85
 
86
- // Upload the file via fetch
87
- async function uploadFile(file) {
88
  const formData = new FormData();
89
- formData.append('file', file);
90
- resultArea.innerHTML = `<p class="text-gray-500">Processing...</p>`;
 
 
 
 
 
91
  try {
92
  const response = await fetch('/upload', {
93
  method: 'POST',
94
  body: formData
95
  });
96
  const data = await response.json();
97
- if (data.result) {
98
- resultArea.innerHTML = `<pre class="bg-gray-200 p-4 rounded whitespace-pre-wrap">${data.result}</pre>`;
99
- // Save result to history (only last 10 entries)
100
- history.unshift(data.result);
101
- if (history.length > 10) history = history.slice(0, 10);
102
- localStorage.setItem('history', JSON.stringify(history));
103
- renderHistory();
104
  } else {
105
- resultArea.innerHTML = `<p class="text-red-500">No result received.</p>`;
106
  }
107
  } catch (error) {
108
- resultArea.innerHTML = `<p class="text-red-500">Error processing the image.</p>`;
109
  }
110
- }
111
 
112
- // Example keyboard support: pressing Enter triggers file selection
113
- document.addEventListener('keydown', (event) => {
114
- if (event.key === 'Enter') {
115
- fileInput.click();
 
 
 
 
 
 
 
 
116
  }
117
  });
118
  </script>
 
3
  <head>
4
  <meta charset="UTF-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Upload Image for Generative AI</title>
7
  <script src="https://cdn.tailwindcss.com"></script>
8
  </head>
9
+ <body class="bg-gray-100 flex items-center justify-center h-screen">
10
+ <div class="bg-white p-8 rounded shadow-md w-full max-w-md">
11
+ <h1 class="text-2xl font-bold mb-4 text-center">Upload Image</h1>
12
+ <form id="uploadForm" enctype="multipart/form-data">
13
+ <input type="file" id="fileInput" name="file" accept="image/*" class="mb-4 w-full" required />
14
+ <button type="submit" class="w-full bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
15
+ Send
16
+ </button>
17
+ </form>
18
+ <div id="result" class="mt-4"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </div>
20
 
21
  <script>
22
+ const form = document.getElementById('uploadForm');
23
  const fileInput = document.getElementById('fileInput');
24
+ const resultDiv = document.getElementById('result');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
+ form.addEventListener('submit', async (e) => {
27
+ e.preventDefault();
28
  const formData = new FormData();
29
+ if (fileInput.files.length === 0) {
30
+ alert("Please select an image.");
31
+ return;
32
+ }
33
+ formData.append('file', fileInput.files[0]);
34
+
35
+ resultDiv.innerHTML = `<p class="text-gray-500">Processing...</p>`;
36
  try {
37
  const response = await fetch('/upload', {
38
  method: 'POST',
39
  body: formData
40
  });
41
  const data = await response.json();
42
+ if (response.ok && data.result) {
43
+ resultDiv.innerHTML = `<pre class="bg-gray-200 p-4 rounded whitespace-pre-wrap">${data.result}</pre>`;
 
 
 
 
 
44
  } else {
45
+ resultDiv.innerHTML = `<p class="text-red-500">${data.detail || 'No result received.'}</p>`;
46
  }
47
  } catch (error) {
48
+ resultDiv.innerHTML = `<p class="text-red-500">Error processing the image: ${error.message}</p>`;
49
  }
50
+ });
51
 
52
+ // Listen for paste events (Ctrl+V) to upload an image.
53
+ window.addEventListener('paste', (event) => {
54
+ const items = event.clipboardData.items;
55
+ for (let item of items) {
56
+ if (item.type.indexOf("image") !== -1) {
57
+ const file = item.getAsFile();
58
+ const dt = new DataTransfer();
59
+ dt.items.add(file);
60
+ fileInput.files = dt.files;
61
+ form.dispatchEvent(new Event('submit'));
62
+ break;
63
+ }
64
  }
65
  });
66
  </script>