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);
  }
});