efnanaladagg commited on
Commit
8ad8a4f
·
verified ·
1 Parent(s): 979545f

Update src/app/static/app.js

Browse files
Files changed (1) hide show
  1. src/app/static/app.js +124 -23
src/app/static/app.js CHANGED
@@ -1,37 +1,138 @@
1
- const fileInput = document.getElementById("file");
2
- const btn = document.getElementById("btn");
3
- const preview = document.getElementById("preview");
4
- const out = document.getElementById("out");
5
  const statusEl = document.getElementById("status");
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  fileInput.addEventListener("change", () => {
8
  const f = fileInput.files?.[0];
9
- if (!f) return;
10
- preview.src = URL.createObjectURL(f);
11
- statusEl.textContent = "";
12
- out.textContent = "{}";
13
- });
14
 
15
- btn.addEventListener("click", async () => {
16
- const f = fileInput.files?.[0];
17
- if (!f) {
18
- statusEl.textContent = "Lütfen bir görsel seçin.";
 
 
 
19
  return;
20
  }
21
 
22
- statusEl.textContent = "Yükleniyor...";
23
- out.textContent = "{}";
 
 
 
 
24
 
25
- const fd = new FormData();
26
- fd.append("file", f);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
  try {
29
- const res = await fetch("/predict", { method: "POST", body: fd });
 
 
 
 
 
 
 
 
 
 
 
 
30
  const data = await res.json();
31
- if (!res.ok) throw new Error(data?.detail || "Request failed");
32
- out.textContent = JSON.stringify(data, null, 2);
33
- statusEl.textContent = "Tamam.";
34
- } catch (e) {
35
- statusEl.textContent = "Hata: " + e.message;
 
 
 
36
  }
37
  });
 
1
+ const fileInput = document.getElementById("fileInput");
2
+ const predictBtn = document.getElementById("predictBtn");
 
 
3
  const statusEl = document.getElementById("status");
4
 
5
+ const previewImg = document.getElementById("previewImg");
6
+ const previewPlaceholder = document.getElementById("previewPlaceholder");
7
+
8
+ const resultCard = document.getElementById("resultCard");
9
+ const emptyState = document.getElementById("emptyState");
10
+
11
+ const predClass = document.getElementById("predClass");
12
+ const predConf = document.getElementById("predConf");
13
+ const confBar = document.getElementById("confBar");
14
+ const confPct = document.getElementById("confPct");
15
+
16
+ const topkBody = document.getElementById("topkBody");
17
+
18
+ const toggleDetails = document.getElementById("toggleDetails");
19
+ const rawJson = document.getElementById("rawJson");
20
+
21
+ let selectedFile = null;
22
+ let detailsOpen = false;
23
+
24
+ function setStatus(msg, type = "") {
25
+ statusEl.textContent = msg;
26
+ statusEl.className = `status ${type}`.trim();
27
+ }
28
+
29
+ function percent(x) {
30
+ const p = Math.max(0, Math.min(1, x)) * 100;
31
+ return p.toFixed(2);
32
+ }
33
+
34
+ function showResult(data) {
35
+ emptyState.classList.add("hidden");
36
+ resultCard.classList.remove("hidden");
37
+
38
+ predClass.textContent = data.predicted_class || "-";
39
+ predConf.textContent = (data.confidence !== undefined)
40
+ ? `${percent(data.confidence)}%`
41
+ : "-";
42
+
43
+ const p = data.confidence ?? 0;
44
+ confBar.style.width = `${percent(p)}%`;
45
+ confPct.textContent = `${percent(p)}%`;
46
+
47
+ // top-k table
48
+ topkBody.innerHTML = "";
49
+ const topk = data.top_k || [];
50
+ for (const item of topk) {
51
+ const tr = document.createElement("tr");
52
+ const td1 = document.createElement("td");
53
+ const td2 = document.createElement("td");
54
+ td1.textContent = item.label ?? "-";
55
+ td2.textContent = (item.confidence !== undefined)
56
+ ? `${percent(item.confidence)}%`
57
+ : "-";
58
+ tr.appendChild(td1);
59
+ tr.appendChild(td2);
60
+ topkBody.appendChild(tr);
61
+ }
62
+
63
+ // raw json (toggle)
64
+ rawJson.textContent = JSON.stringify(data, null, 2);
65
+ }
66
+
67
+ function resetResult() {
68
+ resultCard.classList.add("hidden");
69
+ emptyState.classList.remove("hidden");
70
+ rawJson.classList.add("hidden");
71
+ detailsOpen = false;
72
+ toggleDetails.textContent = "Detayları Göster";
73
+ }
74
+
75
  fileInput.addEventListener("change", () => {
76
  const f = fileInput.files?.[0];
77
+ selectedFile = f || null;
78
+ predictBtn.disabled = !selectedFile;
 
 
 
79
 
80
+ resetResult();
81
+ setStatus("");
82
+
83
+ if (!selectedFile) {
84
+ previewImg.src = "";
85
+ previewImg.style.display = "none";
86
+ previewPlaceholder.style.display = "block";
87
  return;
88
  }
89
 
90
+ const url = URL.createObjectURL(selectedFile);
91
+ previewImg.src = url;
92
+ previewImg.onload = () => URL.revokeObjectURL(url);
93
+ previewImg.style.display = "block";
94
+ previewPlaceholder.style.display = "none";
95
+ });
96
 
97
+ toggleDetails.addEventListener("click", () => {
98
+ detailsOpen = !detailsOpen;
99
+ if (detailsOpen) {
100
+ rawJson.classList.remove("hidden");
101
+ toggleDetails.textContent = "Detayları Gizle";
102
+ } else {
103
+ rawJson.classList.add("hidden");
104
+ toggleDetails.textContent = "Detayları Göster";
105
+ }
106
+ });
107
+
108
+ predictBtn.addEventListener("click", async () => {
109
+ if (!selectedFile) return;
110
+
111
+ setStatus("Tahmin yapılıyor...", "loading");
112
+ predictBtn.disabled = true;
113
 
114
  try {
115
+ const form = new FormData();
116
+ form.append("file", selectedFile);
117
+
118
+ const res = await fetch("/predict", {
119
+ method: "POST",
120
+ body: form
121
+ });
122
+
123
+ if (!res.ok) {
124
+ const txt = await res.text();
125
+ throw new Error(`API error (${res.status}): ${txt}`);
126
+ }
127
+
128
  const data = await res.json();
129
+ showResult(data);
130
+ setStatus("Tamam.", "ok");
131
+ } catch (err) {
132
+ console.error(err);
133
+ setStatus("Hata: " + (err?.message || "Bilinmeyen hata"), "err");
134
+ resetResult();
135
+ } finally {
136
+ predictBtn.disabled = false;
137
  }
138
  });