Rudert commited on
Commit
9ef1148
·
verified ·
1 Parent(s): 17fe998

Update script.js

Browse files
Files changed (1) hide show
  1. script.js +118 -22
script.js CHANGED
@@ -8,7 +8,9 @@ let files = {
8
  'style.css': '/* Main styles */\nbody {\n font-family: Arial, sans-serif;\n background-color: #f0f0f0;\n}',
9
  'script.js': '// Main script\nconsole.log("Hello from JavaScript!");',
10
  'header.py': '# Header component\n\ndef render_header():\n return "<header>Header Content</header>"',
11
- 'footer.py': '# Footer component\n\ndef render_footer():\n return "<footer>Footer Content</footer>"'
 
 
12
  };
13
 
14
  // DOM Elements
@@ -20,6 +22,7 @@ const hamburgerBtn = document.getElementById('hamburger-btn');
20
  const closeSidebarBtn = document.getElementById('close-sidebar-btn');
21
  const sidebar = document.getElementById('sidebar');
22
  const newChatBtn = document.getElementById('new-chat-btn');
 
23
  const suggestionCards = document.querySelectorAll('.suggestion-card');
24
  const modeSelector = document.getElementById('mode-selector');
25
  const modelSelector = document.getElementById('model-selector');
@@ -35,6 +38,7 @@ const refreshPreviewBtn = document.getElementById('refresh-preview-btn');
35
  const openPreviewBtn = document.getElementById('open-preview-btn');
36
  const newFileBtn = document.getElementById('new-file-btn');
37
  const newFolderBtn = document.getElementById('new-folder-btn');
 
38
 
39
  // Fungsi untuk menambahkan pesan ke UI
40
  function addMessageToUI(role, content) {
@@ -115,6 +119,7 @@ async function sendUserMessage() {
115
  addMessageToUI('user', message);
116
  chatHistory.push({ role: 'user', content: message });
117
  userInput.value = '';
 
118
 
119
  // Tampilkan indikator pengetikan
120
  const typingElement = showTypingIndicator();
@@ -163,14 +168,17 @@ function handleSidebarItemClick(itemId) {
163
  case 'project-planning':
164
  userInput.value = 'Help me plan a new project. What should be the first steps?';
165
  userInput.focus();
 
166
  break;
167
  case 'code-review':
168
  userInput.value = 'Please review this code snippet and suggest improvements:';
169
  userInput.focus();
 
170
  break;
171
  case 'web-app-builder':
172
  userInput.value = 'Help me build a simple web application. What technologies should I use?';
173
  userInput.focus();
 
174
  break;
175
  case 'file-explorer':
176
  switchTab('files');
@@ -185,24 +193,29 @@ function handleSidebarItemClick(itemId) {
185
  case 'create-application':
186
  userInput.value = 'Create a new application for me. What kind of application would you like?';
187
  userInput.focus();
 
188
  break;
189
  case 'auto-debug':
190
  userInput.value = 'I have an error in my code. Can you help me debug it? Here is the error: ';
191
  userInput.focus();
 
192
  break;
193
  case 'code-suggestions':
194
  userInput.value = 'Can you suggest code improvements for best practices?';
195
  userInput.focus();
 
196
  break;
197
  case 'performance-analysis':
198
  userInput.value = 'Analyze the performance of this code:';
199
  userInput.focus();
 
200
  break;
201
  default:
202
  console.log('Unknown sidebar item:', itemId);
203
  }
204
  // Tutup sidebar setelah klik (opsional)
205
  sidebar.classList.remove('open');
 
206
  }
207
 
208
  // Fungsi untuk beralih antar tab
@@ -220,22 +233,86 @@ function switchTab(tabName) {
220
  function updateFileTree() {
221
  fileTree.innerHTML = '';
222
 
223
- for (const [filename, content] of Object.entries(files)) {
224
- const fileItem = document.createElement('div');
225
- fileItem.classList.add('file-item');
226
- fileItem.setAttribute('data-file', filename);
227
-
228
- // Ikon berdasarkan ekstensi file
229
- let icon = 'fa-file-code';
230
- if (filename.endsWith('.css')) icon = 'fa-file-code';
231
- else if (filename.endsWith('.js')) icon = 'fa-file-code';
232
- else if (filename.endsWith('.html')) icon = 'fa-file-code';
233
- else if (filename.endsWith('.json')) icon = 'fa-file-code';
234
-
235
- fileItem.innerHTML = `<i class="fas ${icon}"></i> ${filename}`;
236
- fileItem.addEventListener('click', () => openFile(filename));
237
- fileTree.appendChild(fileItem);
238
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  }
240
 
241
  // Fungsi untuk membuka file
@@ -261,15 +338,20 @@ function addTerminalOutput(output, isError = false) {
261
 
262
  // Fungsi untuk menjalankan perintah terminal
263
  function runTerminalCommand(command) {
264
- addTerminalOutput(`$ ${command}`);
265
 
266
  if (command === 'help') {
267
- addTerminalOutput('Available commands: help, ls, clear, run [file]');
268
  } else if (command === 'ls') {
269
  addTerminalOutput('Files in directory:');
270
  for (const filename of Object.keys(files)) {
271
  addTerminalOutput(` ${filename}`);
272
  }
 
 
 
 
 
273
  } else if (command.startsWith('run ')) {
274
  const filename = command.split(' ')[1];
275
  if (filename && files[filename]) {
@@ -290,6 +372,11 @@ function runTerminalCommand(command) {
290
  // Event Listeners
291
  sendButton.addEventListener('click', sendUserMessage);
292
 
 
 
 
 
 
293
  userInput.addEventListener('keydown', (e) => {
294
  if (e.key === 'Enter' && !e.shiftKey) {
295
  e.preventDefault();
@@ -299,13 +386,21 @@ userInput.addEventListener('keydown', (e) => {
299
 
300
  hamburgerBtn.addEventListener('click', () => {
301
  sidebar.classList.add('open');
 
302
  });
303
 
304
  closeSidebarBtn.addEventListener('click', () => {
305
  sidebar.classList.remove('open');
 
 
 
 
 
 
306
  });
307
 
308
  newChatBtn.addEventListener('click', startNewChat);
 
309
 
310
  // Tambahkan event listener ke kartu saran
311
  suggestionCards.forEach(card => {
@@ -313,6 +408,7 @@ suggestionCards.forEach(card => {
313
  const prompt = card.getAttribute('data-prompt');
314
  userInput.value = prompt;
315
  userInput.focus();
 
316
  });
317
  });
318
 
@@ -335,7 +431,7 @@ tabs.forEach(tab => {
335
 
336
  // Event listener untuk file tree
337
  newFileBtn.addEventListener('click', () => {
338
- const filename = prompt('Enter new file name:');
339
  if (filename) {
340
  files[filename] = '';
341
  updateFileTree();
@@ -368,8 +464,8 @@ runCodeBtn.addEventListener('click', () => {
368
 
369
  clearTerminalBtn.addEventListener('click', () => {
370
  terminalOutput.innerHTML = '';
371
- addTerminalOutput('$ Welcome to VicoXDarkGPT Terminal');
372
- addTerminalOutput('$ Type \'help\' for available commands');
373
  });
374
 
375
  // Event listener untuk preview
 
8
  'style.css': '/* Main styles */\nbody {\n font-family: Arial, sans-serif;\n background-color: #f0f0f0;\n}',
9
  'script.js': '// Main script\nconsole.log("Hello from JavaScript!");',
10
  'header.py': '# Header component\n\ndef render_header():\n return "<header>Header Content</header>"',
11
+ 'footer.py': '# Footer component\n\ndef render_footer():\n return "<footer>Footer Content</footer>"',
12
+ 'README.md': '# My Project\nThis is a sample project.',
13
+ 'requirements.txt': 'flask==2.3.3\nopenai==1.10.0'
14
  };
15
 
16
  // DOM Elements
 
22
  const closeSidebarBtn = document.getElementById('close-sidebar-btn');
23
  const sidebar = document.getElementById('sidebar');
24
  const newChatBtn = document.getElementById('new-chat-btn');
25
+ const floatingNewChatBtn = document.getElementById('floating-new-chat');
26
  const suggestionCards = document.querySelectorAll('.suggestion-card');
27
  const modeSelector = document.getElementById('mode-selector');
28
  const modelSelector = document.getElementById('model-selector');
 
38
  const openPreviewBtn = document.getElementById('open-preview-btn');
39
  const newFileBtn = document.getElementById('new-file-btn');
40
  const newFolderBtn = document.getElementById('new-folder-btn');
41
+ const sidebarBackdrop = document.querySelector('.sidebar-backdrop');
42
 
43
  // Fungsi untuk menambahkan pesan ke UI
44
  function addMessageToUI(role, content) {
 
119
  addMessageToUI('user', message);
120
  chatHistory.push({ role: 'user', content: message });
121
  userInput.value = '';
122
+ userInput.style.height = 'auto';
123
 
124
  // Tampilkan indikator pengetikan
125
  const typingElement = showTypingIndicator();
 
168
  case 'project-planning':
169
  userInput.value = 'Help me plan a new project. What should be the first steps?';
170
  userInput.focus();
171
+ switchTab('chat');
172
  break;
173
  case 'code-review':
174
  userInput.value = 'Please review this code snippet and suggest improvements:';
175
  userInput.focus();
176
+ switchTab('chat');
177
  break;
178
  case 'web-app-builder':
179
  userInput.value = 'Help me build a simple web application. What technologies should I use?';
180
  userInput.focus();
181
+ switchTab('chat');
182
  break;
183
  case 'file-explorer':
184
  switchTab('files');
 
193
  case 'create-application':
194
  userInput.value = 'Create a new application for me. What kind of application would you like?';
195
  userInput.focus();
196
+ switchTab('chat');
197
  break;
198
  case 'auto-debug':
199
  userInput.value = 'I have an error in my code. Can you help me debug it? Here is the error: ';
200
  userInput.focus();
201
+ switchTab('chat');
202
  break;
203
  case 'code-suggestions':
204
  userInput.value = 'Can you suggest code improvements for best practices?';
205
  userInput.focus();
206
+ switchTab('chat');
207
  break;
208
  case 'performance-analysis':
209
  userInput.value = 'Analyze the performance of this code:';
210
  userInput.focus();
211
+ switchTab('chat');
212
  break;
213
  default:
214
  console.log('Unknown sidebar item:', itemId);
215
  }
216
  // Tutup sidebar setelah klik (opsional)
217
  sidebar.classList.remove('open');
218
+ sidebarBackdrop.classList.remove('active');
219
  }
220
 
221
  // Fungsi untuk beralih antar tab
 
233
  function updateFileTree() {
234
  fileTree.innerHTML = '';
235
 
236
+ // Simulasi struktur file
237
+ const srcFolder = document.createElement('div');
238
+ srcFolder.classList.add('folder-item');
239
+ srcFolder.innerHTML = `
240
+ <div class="folder-header">
241
+ <i class="fas fa-folder folder-icon"></i>
242
+ <span>src</span>
243
+ </div>
244
+ <div class="folder-content">
245
+ <div class="file-item" data-file="main.py">
246
+ <i class="fas fa-file-code"></i> main.py
247
+ </div>
248
+ <div class="file-item" data-file="app.py">
249
+ <i class="fas fa-file-code"></i> app.py
250
+ </div>
251
+ </div>
252
+ `;
253
+ fileTree.appendChild(srcFolder);
254
+
255
+ const staticFolder = document.createElement('div');
256
+ staticFolder.classList.add('folder-item');
257
+ staticFolder.innerHTML = `
258
+ <div class="folder-header">
259
+ <i class="fas fa-folder folder-icon"></i>
260
+ <span>static</span>
261
+ </div>
262
+ <div class="folder-content">
263
+ <div class="folder-item">
264
+ <div class="folder-header">
265
+ <i class="fas fa-folder folder-icon"></i>
266
+ <span>css</span>
267
+ </div>
268
+ <div class="folder-content">
269
+ <div class="file-item" data-file="style.css">
270
+ <i class="fas fa-file-code"></i> style.css
271
+ </div>
272
+ </div>
273
+ </div>
274
+ <div class="folder-item">
275
+ <div class="folder-header">
276
+ <i class="fas fa-folder folder-icon"></i>
277
+ <span>js</span>
278
+ </div>
279
+ <div class="folder-content">
280
+ <div class="file-item" data-file="script.js">
281
+ <i class="fas fa-file-code"></i> script.js
282
+ </div>
283
+ </div>
284
+ </div>
285
+ </div>
286
+ `;
287
+ fileTree.appendChild(staticFolder);
288
+
289
+ const readmeFile = document.createElement('div');
290
+ readmeFile.classList.add('file-item');
291
+ readmeFile.setAttribute('data-file', 'README.md');
292
+ readmeFile.innerHTML = `<i class="fas fa-file-alt"></i> README.md`;
293
+ fileTree.appendChild(readmeFile);
294
+
295
+ const reqFile = document.createElement('div');
296
+ reqFile.classList.add('file-item');
297
+ reqFile.setAttribute('data-file', 'requirements.txt');
298
+ reqFile.innerHTML = `<i class="fas fa-file-alt"></i> requirements.txt`;
299
+ fileTree.appendChild(reqFile);
300
+
301
+ // Tambahkan event listener ke file
302
+ document.querySelectorAll('.file-item').forEach(item => {
303
+ item.addEventListener('click', () => {
304
+ const filename = item.getAttribute('data-file');
305
+ openFile(filename);
306
+ });
307
+ });
308
+
309
+ // Tambahkan event listener ke folder
310
+ document.querySelectorAll('.folder-header').forEach(header => {
311
+ header.addEventListener('click', () => {
312
+ const folderItem = header.parentElement;
313
+ folderItem.classList.toggle('expanded');
314
+ });
315
+ });
316
  }
317
 
318
  // Fungsi untuk membuka file
 
338
 
339
  // Fungsi untuk menjalankan perintah terminal
340
  function runTerminalCommand(command) {
341
+ addTerminalOutput(`[user@ai-assistant ~]$ ${command}`);
342
 
343
  if (command === 'help') {
344
+ addTerminalOutput('Available commands: help, ls, clear, run [file], pwd, cd');
345
  } else if (command === 'ls') {
346
  addTerminalOutput('Files in directory:');
347
  for (const filename of Object.keys(files)) {
348
  addTerminalOutput(` ${filename}`);
349
  }
350
+ } else if (command === 'pwd') {
351
+ addTerminalOutput('/home/user/project');
352
+ } else if (command.startsWith('cd ')) {
353
+ const dir = command.split(' ')[1];
354
+ addTerminalOutput(`Changed directory to ${dir}`);
355
  } else if (command.startsWith('run ')) {
356
  const filename = command.split(' ')[1];
357
  if (filename && files[filename]) {
 
372
  // Event Listeners
373
  sendButton.addEventListener('click', sendUserMessage);
374
 
375
+ userInput.addEventListener('input', function() {
376
+ this.style.height = 'auto';
377
+ this.style.height = (this.scrollHeight) + 'px';
378
+ });
379
+
380
  userInput.addEventListener('keydown', (e) => {
381
  if (e.key === 'Enter' && !e.shiftKey) {
382
  e.preventDefault();
 
386
 
387
  hamburgerBtn.addEventListener('click', () => {
388
  sidebar.classList.add('open');
389
+ sidebarBackdrop.classList.add('active');
390
  });
391
 
392
  closeSidebarBtn.addEventListener('click', () => {
393
  sidebar.classList.remove('open');
394
+ sidebarBackdrop.classList.remove('active');
395
+ });
396
+
397
+ sidebarBackdrop.addEventListener('click', () => {
398
+ sidebar.classList.remove('open');
399
+ sidebarBackdrop.classList.remove('active');
400
  });
401
 
402
  newChatBtn.addEventListener('click', startNewChat);
403
+ floatingNewChatBtn.addEventListener('click', startNewChat);
404
 
405
  // Tambahkan event listener ke kartu saran
406
  suggestionCards.forEach(card => {
 
408
  const prompt = card.getAttribute('data-prompt');
409
  userInput.value = prompt;
410
  userInput.focus();
411
+ switchTab('chat');
412
  });
413
  });
414
 
 
431
 
432
  // Event listener untuk file tree
433
  newFileBtn.addEventListener('click', () => {
434
+ const filename = prompt('Enter new file name (e.g., myfile.py):');
435
  if (filename) {
436
  files[filename] = '';
437
  updateFileTree();
 
464
 
465
  clearTerminalBtn.addEventListener('click', () => {
466
  terminalOutput.innerHTML = '';
467
+ addTerminalOutput('[user@ai-assistant ~]$ Welcome to VicoXDarkGPT Terminal');
468
+ addTerminalOutput('[user@ai-assistant ~]$ Type \'help\' for available commands');
469
  });
470
 
471
  // Event listener untuk preview