1const uploaderResults = {}; 2document.querySelectorAll('.uploader-rd').forEach(container => { 3 const name = container.dataset.name; 4 uploaderResults[name] = []; 5 const dropZone = container.querySelector('.drop-zone'); 6 const fileInput = container.querySelector('.file-input'); 7 const uploadBtn = container.querySelector('.upload-btn-uploader'); 8 const fileList = container.querySelector('.file-list'); 9 10 uploadBtn.addEventListener('click', () => fileInput.click()); 11 fileInput.addEventListener('change', () => handleFiles(fileInput.files)); 12 13 dropZone.addEventListener('dragover', (e) => { 14 e.preventDefault(); 15 dropZone.classList.add('dragover'); 16 }); 17 18 dropZone.addEventListener('dragleave', () => { 19 dropZone.classList.remove('dragover'); 20 }); 21 22 dropZone.addEventListener('drop', (e) => { 23 e.preventDefault(); 24 dropZone.classList.remove('dragover'); 25 handleFiles(e.dataTransfer.files); 26 }); 27 28 function handleFiles(files) { 29 const allowedExtensions = ['stp', 'step', 'stl', 'igs', 'iges', 'prt', 'sldprt', 'sat', 'x_t', 'jpg', 'jpeg', 'png', 'pdf', 'zip', 'rar']; 30 const maxSizeMB = 50; 31 32 Array.from(files).forEach(file => { 33 const ext = file.name.split('.').pop().toLowerCase(); 34 const sizeMB = file.size / (1024 * 1024); 35 36 if (!allowedExtensions.includes(ext)) { 37 alert(`File "${file.name}" has an unsupported format.`); 38 return; 39 } 40 41 if (sizeMB > maxSizeMB) { 42 alert(`File "${file.name}" exceeds the "${maxSizeMB}"MB limit.`); 43 return; 44 } 45 46 const fileElement = document.createElement('div'); 47 fileElement.className = 'file-item';
48 49 const fileName = document.createElement('div'); 50 fileName.className = 'file-name'; 51 fileName.textContent = file.name; 52 53 const progressContainer = document.createElement('div'); 54 progressContainer.className = 'progress-container'; 55 56 const progressBar = document.createElement('div'); 57 progressBar.className = 'progress-bar'; 58 59 progressContainer.appendChild(progressBar); 60 fileElement.appendChild(fileName); 61 fileElement.appendChild(progressContainer); 62 fileList.appendChild(fileElement); 63 64 simulateProgress(progressBar, async () => { 65 try { 66 const result = await fileUpload(file); 67 uploaderResults[name].push(result.data); 68 progressBar.style.background = '#ea543f'; 69 console.log(`Uploaded ${file.name} to ${name}:`, result); 70 } catch (err) { 71 progressBar.style.background = 'red'; 72 console.error(`Error uploading ${file.name} to ${name}:`, err); 73 } 74 }); 75 }); 76 } 77 78 function simulateProgress(bar, callback) { 79 let percent = 0; 80 const interval = setInterval(() => { 81 percent += Math.random() * 15; 82 bar.style.width = `${Math.min(percent, 95)}%`; 83 if (percent >= 95) { 84 clearInterval(interval); 85 callback().then(() => { 86 bar.style.width = '100%'; 87 }); 88 } 89 }, 200); 90 } 91}); 92async function fileUpload(file) { 93 const form = new FormData(); 94 form.append('type', 'file'); 95 form.append('file', file); 96 const response = await fetch('https://app.rapiddirect.com/api/5d15ed1791c1c/', { 97 method: 'POST', 98 body: form 99 }); 100 if (!response.ok) throw new Error('Upload failed'); 101 return await response.json(); 102}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.