Spaces:
Sleeping
Sleeping
File size: 3,005 Bytes
8354653 214c544 19f24a5 214c544 19f24a5 214c544 19f24a5 995884c 19f24a5 214c544 19f24a5 214c544 79b0691 19f24a5 214c544 19f24a5 8354653 19f24a5 214c544 19f24a5 214c544 19f24a5 214c544 19f24a5 214c544 19f24a5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | function uploadWithProgress(url, formData, onProgress) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.withCredentials = true;
xhr.upload.addEventListener('progress', (e) => {
if (e.lengthComputable && onProgress) onProgress(e.loaded, e.total);
});
xhr.addEventListener('load', () => {
let data = null;
try { data = xhr.responseText ? JSON.parse(xhr.responseText) : null; } catch (_) {}
if (xhr.status >= 200 && xhr.status < 300) resolve(data);
else reject(new Error(data?.detail || xhr.statusText || 'Upload failed'));
});
xhr.addEventListener('error', () => reject(new Error('Network error during upload')));
xhr.send(formData);
});
}
document.getElementById('form-tree-upload')?.addEventListener('submit', async (e) => {
e.preventDefault();
hideDdaError?.();
const nodeId = document.getElementById('upload-node')?.value;
const fileInput = document.getElementById('upload-file');
const file = fileInput?.files?.[0];
if (!nodeId) return showDdaError?.('Select a tree node.');
if (!file) return showDdaError?.('Select a file.');
const ext = (file.name.split('.').pop() || '').toLowerCase();
const isTiff = ext === 'tif' || ext === 'tiff';
const cfg = window.ddaState?.localCfg || {};
const maxBytes = isTiff
? (cfg.maxGeotiffBytes || (cfg.maxGeotiffMb || 15360) * 1024 * 1024)
: (cfg.maxImageBytes || (cfg.maxImageMb || 15360) * 1024 * 1024);
if (file.size > maxBytes) {
return showDdaError?.(`File is ${formatBytes(file.size)} — max ${formatBytes(maxBytes)}.`);
}
const form = new FormData();
form.append('file', file);
form.append('image_type', document.getElementById('upload-image-type')?.value || 'GeoTIFF');
form.append('capture_date', document.getElementById('upload-capture-date')?.value || '');
const manualBounds = document.getElementById('upload-manual-bounds')?.value?.trim();
if (manualBounds) form.append('manual_bounds', manualBounds);
const btn = document.getElementById('btn-tree-upload');
const progWrap = document.getElementById('upload-progress');
const progFill = document.getElementById('upload-progress-fill');
const progLabel = document.getElementById('upload-progress-label');
btn.disabled = true;
progWrap?.classList.remove('hidden');
if (progFill) progFill.style.width = '0%';
try {
await uploadWithProgress(`/api/dda/tree/nodes/${nodeId}/images/upload`, form, (loaded, total) => {
const pct = total ? Math.round((loaded / total) * 100) : 0;
if (progFill) progFill.style.width = pct + '%';
if (progLabel) progLabel.textContent = `Uploading… ${pct}%`;
});
showDdaSuccess?.('Uploaded. Refreshing…');
fileInput.value = '';
await window.ddaState.rescan();
} catch (err) {
showDdaError?.(err.message || 'Upload failed.');
} finally {
btn.disabled = false;
setTimeout(() => progWrap?.classList.add('hidden'), 2000);
}
});
|