Spaces:
Sleeping
Sleeping
Update static/index.html
Browse files- static/index.html +43 -63
static/index.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>ChickSense</title>
|
| 7 |
-
<meta name="description" content="
|
| 8 |
|
| 9 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
@@ -15,24 +15,20 @@
|
|
| 15 |
<header class="flex flex-col md:flex-row justify-between items-start md:items-center mb-4 gap-3">
|
| 16 |
<div class="flex items-center gap-3">
|
| 17 |
|
| 18 |
-
<!-- Logo -->
|
| 19 |
<div class="w-12 h-12 bg-amber-100 rounded-lg flex items-center justify-center border border-amber-200" aria-hidden="true">
|
| 20 |
<img src="/static/assets/logo-.jpeg" alt="ChickSense Logo" class="rounded-lg">
|
| 21 |
</div>
|
| 22 |
|
| 23 |
-
<
|
| 24 |
-
<div>
|
| 25 |
<h1 class="text-xl md:text-2xl font-bold text-slate-800">ChickSense Dashboard</h1>
|
| 26 |
-
<p id="datetime" class="text-xs md:text-sm text-slate-500" aria-live="polite">
|
| 27 |
</div>
|
| 28 |
</div>
|
| 29 |
</header>
|
| 30 |
|
| 31 |
<main class="grid grid-cols-1 lg:grid-cols-12 gap-4">
|
| 32 |
<section class="lg:col-span-9 flex flex-col gap-4" aria-label="Video streams and controls">
|
| 33 |
-
<!-- Grid Kamera 2x2 -->
|
| 34 |
<div class="grid grid-cols-1 md:grid-cols-2 gap-4" role="region">
|
| 35 |
-
<!-- Kamera 1 -->
|
| 36 |
<div class="card relative">
|
| 37 |
<div class="p-2">
|
| 38 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
@@ -41,7 +37,6 @@
|
|
| 41 |
<div class="cam-badge">CAM 1</div>
|
| 42 |
</div>
|
| 43 |
</div>
|
| 44 |
-
<!-- Kamera 2 -->
|
| 45 |
<div class="card relative">
|
| 46 |
<div class="p-2">
|
| 47 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
@@ -50,7 +45,6 @@
|
|
| 50 |
<div class="cam-badge">CAM 2</div>
|
| 51 |
</div>
|
| 52 |
</div>
|
| 53 |
-
<!-- Kamera 3 -->
|
| 54 |
<div class="card relative">
|
| 55 |
<div class="p-2">
|
| 56 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
@@ -59,7 +53,6 @@
|
|
| 59 |
<div class="cam-badge">CAM 3</div>
|
| 60 |
</div>
|
| 61 |
</div>
|
| 62 |
-
<!-- Kamera 4 -->
|
| 63 |
<div class="card relative">
|
| 64 |
<div class="p-2">
|
| 65 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
@@ -70,19 +63,16 @@
|
|
| 70 |
</div>
|
| 71 |
</div>
|
| 72 |
|
| 73 |
-
<!-- Grid Kontrol Tampilan dan Log Sistem -->
|
| 74 |
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
| 75 |
-
<!-- Kontrol Tampilan -->
|
| 76 |
<div class="card" role="region">
|
| 77 |
<div class="card-header flex items-center justify-between">
|
| 78 |
<div class="flex items-center gap-2">
|
| 79 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-slate-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 80 |
<path stroke-linecap="round" stroke-linejoin="round" d="M6 13.5V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m12-3V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m-6-9V3.75m0 3.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 9.75V10.5" />
|
| 81 |
</svg>
|
| 82 |
-
<h3 class="font-semibold text-slate-700 text-sm">
|
| 83 |
</div>
|
| 84 |
|
| 85 |
-
<!-- Button Setting Kamera -->
|
| 86 |
<button id="settings-button" title="Double-click to change camera URLs" class="p-1 text-slate-500 hover:text-blue-600 hover:bg-slate-300 rounded-md transition-colors">
|
| 87 |
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
| 88 |
<circle cx="12" cy="12" r="3"></circle>
|
|
@@ -91,7 +81,6 @@
|
|
| 91 |
</button>
|
| 92 |
</div>
|
| 93 |
|
| 94 |
-
<!-- Button Toggle -->
|
| 95 |
<div id="toggle-controls" class="p-3 grid grid-cols-3 gap-3">
|
| 96 |
<button id="toggle-detected" data-control="show_detected" class="control-button flex items-center justify-center gap-2 p-2.5 rounded-lg text-xs md:text-sm font-medium" aria-pressed="true">
|
| 97 |
<svg class="w-6 h-6 icon-outline" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
@@ -100,7 +89,7 @@
|
|
| 100 |
<svg class="w-6 h-6 icon-solid" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
| 101 |
<path fill-rule="evenodd" d="M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z" clip-rule="evenodd"/>
|
| 102 |
</svg>
|
| 103 |
-
<span>
|
| 104 |
</button>
|
| 105 |
|
| 106 |
</button>
|
|
@@ -119,7 +108,7 @@
|
|
| 119 |
<circle cx="272" cy="460" r="28"/> <circle cx="88" cy="288" r="20"/>
|
| 120 |
</svg>
|
| 121 |
|
| 122 |
-
<span>
|
| 123 |
</button>
|
| 124 |
|
| 125 |
<button id="toggle-inactive" data-control="show_inactive" class="control-button flex items-center justify-center gap-2 p-2.5 rounded-lg text-xs md:text-sm font-medium" aria-pressed="false">
|
|
@@ -129,18 +118,17 @@
|
|
| 129 |
<svg class="w-6 h-6 icon-solid" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
| 130 |
<path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 6a.75.75 0 00-1.5 0v6c0 .414.336.75.75.75h4.5a.75.75 0 000-1.5h-3.75V6z" clip-rule="evenodd"/>
|
| 131 |
</svg>
|
| 132 |
-
<span>
|
| 133 |
</button>
|
| 134 |
</div>
|
| 135 |
</div>
|
| 136 |
|
| 137 |
-
<!-- Sistem Log Chart -->
|
| 138 |
<div class="card" role="region">
|
| 139 |
<div class="card-header flex items-center gap-2">
|
| 140 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-slate-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 141 |
<path stroke-linecap="round" stroke-linejoin="round" d="M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z" />
|
| 142 |
</svg>
|
| 143 |
-
<h3 class="font-semibold text-slate-700 text-sm">
|
| 144 |
</div>
|
| 145 |
<div id="system-log" class="p-4 text-xs text-slate-500 space-y-2 h-28 overflow-y-auto" role="log" aria-live="polite"></div>
|
| 146 |
</div>
|
|
@@ -148,16 +136,14 @@
|
|
| 148 |
</section>
|
| 149 |
|
| 150 |
<aside class="lg:col-span-3 flex flex-col gap-4" aria-label="Analysis and export panels">
|
| 151 |
-
<
|
| 152 |
-
<div class="card" role="region">
|
| 153 |
<div class="card-header flex items-center gap-2">
|
| 154 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-blue-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 155 |
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 12h16.5m-16.5 3.75h16.5M3.75 19.5h16.5M5.625 4.5h12.75a1.875 1.875 0 010 3.75H5.625a1.875 1.875 0 010-3.75z" />
|
| 156 |
</svg>
|
| 157 |
-
<h3 class="font-semibold text-slate-700 text-sm">
|
| 158 |
</div>
|
| 159 |
<div class="p-4 space-y-3 text-sm">
|
| 160 |
-
<!-- Jumlah Terdeteksi -->
|
| 161 |
<div class="flex items-center gap-3 p-2.5 bg-slate-50 rounded-lg">
|
| 162 |
<div class="w-9 h-9 bg-blue-100 text-blue-600 rounded-md flex items-center justify-center flex-shrink-0">
|
| 163 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
@@ -165,12 +151,11 @@
|
|
| 165 |
</svg>
|
| 166 |
</div>
|
| 167 |
<div>
|
| 168 |
-
<p class="text-slate-500 text-xs font-medium">
|
| 169 |
<p id="detected-count" class="text-lg font-bold text-slate-800">0</p>
|
| 170 |
</div>
|
| 171 |
</div>
|
| 172 |
-
<
|
| 173 |
-
<div class="flex items-center gap-3 p-2.5 bg-slate-50 rounded-lg">
|
| 174 |
<div class="w-9 h-9 bg-amber-100 text-amber-600 rounded-md flex items-center justify-center flex-shrink-0">
|
| 175 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none" stroke="currentColor" stroke-width="24">
|
| 176 |
<circle cx="256" cy="256" r="240"/> <circle cx="220" cy="120" r="64"/> <circle cx="356" cy="92" r="34"/> <circle cx="420" cy="160" r="26"/> <circle cx="120" cy="100" r="28"/> <circle cx="104" cy="196" r="44"/>
|
|
@@ -179,11 +164,10 @@
|
|
| 179 |
</svg>
|
| 180 |
</div>
|
| 181 |
<div>
|
| 182 |
-
<p class="text-slate-500 text-xs font-medium">
|
| 183 |
<p id="density-count" class="text-lg font-bold text-slate-800">0</p>
|
| 184 |
</div>
|
| 185 |
</div>
|
| 186 |
-
<!-- Ayam Tidak Aktif -->
|
| 187 |
<div class="flex items-center gap-3 p-2.5 bg-slate-50 rounded-lg">
|
| 188 |
<div class="w-9 h-9 bg-red-100 text-red-600 rounded-md flex items-center justify-center flex-shrink-0">
|
| 189 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
@@ -191,79 +175,75 @@
|
|
| 191 |
</svg>
|
| 192 |
</div>
|
| 193 |
<div>
|
| 194 |
-
<p class="text-slate-500 text-xs font-medium">
|
| 195 |
<p id="inactive-count" class="text-lg font-bold text-slate-800">0</p>
|
| 196 |
</div>
|
| 197 |
</div>
|
| 198 |
</div>
|
| 199 |
</div>
|
| 200 |
-
<!-- Card Analisis Vokalisasi -->
|
| 201 |
<div class="card" role="region">
|
| 202 |
<div class="card-header flex items-center gap-2">
|
| 203 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-green-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 204 |
<path stroke-linecap="round" stroke-linejoin="round" d="M19.114 5.636a9 9 0 010 12.728M16.463 8.288a5.25 5.25 0 010 7.424M6.75 8.25l4.72-4.72a.75.75 0 011.28.53v15.88a.75.75 0 01-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.01 9.01 0 012.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75z" />
|
| 205 |
</svg>
|
| 206 |
-
<h3 class="font-semibold text-slate-700 text-sm">
|
| 207 |
</div>
|
| 208 |
|
| 209 |
<div id="vocalization-content" class="p-4">
|
| 210 |
-
<
|
| 211 |
-
</div>
|
| 212 |
</div>
|
| 213 |
|
| 214 |
-
<
|
| 215 |
-
<div class="card" role="region">
|
| 216 |
<div class="card-header flex items-center gap-2">
|
| 217 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-slate-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 218 |
<path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3" />
|
| 219 |
</svg>
|
| 220 |
-
<h3 class="font-semibold text-slate-700 text-sm">
|
| 221 |
</div>
|
| 222 |
<div class="p-4">
|
| 223 |
<button id="open-export-modal-btn" class="btn btn-primary w-full text-sm">
|
| 224 |
-
|
| 225 |
</button>
|
| 226 |
-
<p class="text-[11px] text-slate-500 mt-2 text-center">
|
| 227 |
</div>
|
| 228 |
</div>
|
| 229 |
</aside>
|
| 230 |
</main>
|
| 231 |
</div>
|
| 232 |
|
| 233 |
-
<!-- Modal Section -->
|
| 234 |
<div id="settings-modal" class="modal z-50" role="dialog" aria-labelledby="settings-modal-title" aria-hidden="true">
|
| 235 |
<div class="modal-backdrop"></div>
|
| 236 |
<div class="modal-container">
|
| 237 |
<div class="card w-full max-w-lg">
|
| 238 |
<div class="card-header flex items-center justify-between">
|
| 239 |
-
<h3 id="settings-modal-title" class="font-semibold text-slate-700 text-sm">
|
| 240 |
<button class="modal-close-btn" aria-label="Close">✕</button>
|
| 241 |
</div>
|
| 242 |
<div class="p-4 space-y-4 text-sm">
|
| 243 |
<div>
|
| 244 |
-
<label for="cam1-url" class="block text-xs font-medium text-slate-600 mb-1">
|
| 245 |
-
<input type="text" id="cam1-url" class="modal-input" placeholder="
|
| 246 |
</div>
|
| 247 |
<div>
|
| 248 |
-
<label for="cam2-url" class="block text-xs font-medium text-slate-600 mb-1">
|
| 249 |
-
<input type="text" id="cam2-url" class="modal-input" placeholder="
|
| 250 |
</div>
|
| 251 |
<div>
|
| 252 |
-
<label for="cam3-url" class="block text-xs font-medium text-slate-600 mb-1">
|
| 253 |
-
<input type="text" id="cam3-url" class="modal-input" placeholder="
|
| 254 |
</div>
|
| 255 |
<div>
|
| 256 |
-
<label for="cam4-url" class="block text-xs font-medium text-slate-600 mb-1">
|
| 257 |
-
<input type="text" id="cam4-url" class="modal-input" placeholder="
|
| 258 |
</div>
|
| 259 |
<hr class="border-slate-200">
|
| 260 |
<div>
|
| 261 |
-
<label for="audio-url" class="block text-xs font-medium text-slate-600 mb-1">
|
| 262 |
-
<input type="text" id="audio-url" class="modal-input" placeholder="
|
| 263 |
</div>
|
| 264 |
<div class="flex justify-end gap-2 pt-2">
|
| 265 |
-
<button id="stop-all-streams-btn" class="btn bg-red-600 hover:bg-red-700 text-white text-sm">Stop
|
| 266 |
-
<button id="save-settings-btn" class="btn btn-primary text-sm">
|
| 267 |
</div>
|
| 268 |
</div>
|
| 269 |
</div>
|
|
@@ -275,29 +255,29 @@
|
|
| 275 |
<div class="modal-container">
|
| 276 |
<div class="card w-full max-w-md">
|
| 277 |
<div class="card-header flex items-center justify-between">
|
| 278 |
-
<h3 id="export-modal-title" class="font-semibold text-slate-700 text-sm">
|
| 279 |
<button class="modal-close-btn" aria-label="Close">✕</button>
|
| 280 |
</div>
|
| 281 |
<div class="p-4 space-y-3 text-sm">
|
| 282 |
<div>
|
| 283 |
-
<label for="start-date" class="block text-xs font-medium text-slate-600 mb-1">
|
| 284 |
<input type="date" id="start-date" class="modal-input">
|
| 285 |
</div>
|
| 286 |
<div>
|
| 287 |
-
<label for="end-date" class="block text-xs font-medium text-slate-600 mb-1">
|
| 288 |
<input type="date" id="end-date" class="modal-input">
|
| 289 |
</div>
|
| 290 |
<div>
|
| 291 |
-
<label for="camera-select" class="block text-xs font-medium text-slate-600 mb-1">
|
| 292 |
<select id="camera-select" class="modal-input bg-white">
|
| 293 |
-
<option value="">
|
| 294 |
-
<option value="1">
|
| 295 |
-
<option value="2">
|
| 296 |
-
<option value="3">
|
| 297 |
-
<option value="4">
|
| 298 |
</select>
|
| 299 |
</div>
|
| 300 |
-
<button id="download-csv-btn" class="btn btn-primary w-full">
|
| 301 |
</div>
|
| 302 |
</div>
|
| 303 |
</div>
|
|
|
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>ChickSense</title>
|
| 7 |
+
<meta name="description" content="Automatic Health and Welfare Monitoring System for Chickens" />
|
| 8 |
|
| 9 |
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
|
|
| 15 |
<header class="flex flex-col md:flex-row justify-between items-start md:items-center mb-4 gap-3">
|
| 16 |
<div class="flex items-center gap-3">
|
| 17 |
|
|
|
|
| 18 |
<div class="w-12 h-12 bg-amber-100 rounded-lg flex items-center justify-center border border-amber-200" aria-hidden="true">
|
| 19 |
<img src="/static/assets/logo-.jpeg" alt="ChickSense Logo" class="rounded-lg">
|
| 20 |
</div>
|
| 21 |
|
| 22 |
+
<div>
|
|
|
|
| 23 |
<h1 class="text-xl md:text-2xl font-bold text-slate-800">ChickSense Dashboard</h1>
|
| 24 |
+
<p id="datetime" class="text-xs md:text-sm text-slate-500" aria-live="polite">Loading Time...</p>
|
| 25 |
</div>
|
| 26 |
</div>
|
| 27 |
</header>
|
| 28 |
|
| 29 |
<main class="grid grid-cols-1 lg:grid-cols-12 gap-4">
|
| 30 |
<section class="lg:col-span-9 flex flex-col gap-4" aria-label="Video streams and controls">
|
|
|
|
| 31 |
<div class="grid grid-cols-1 md:grid-cols-2 gap-4" role="region">
|
|
|
|
| 32 |
<div class="card relative">
|
| 33 |
<div class="p-2">
|
| 34 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
|
|
| 37 |
<div class="cam-badge">CAM 1</div>
|
| 38 |
</div>
|
| 39 |
</div>
|
|
|
|
| 40 |
<div class="card relative">
|
| 41 |
<div class="p-2">
|
| 42 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
|
|
| 45 |
<div class="cam-badge">CAM 2</div>
|
| 46 |
</div>
|
| 47 |
</div>
|
|
|
|
| 48 |
<div class="card relative">
|
| 49 |
<div class="p-2">
|
| 50 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
|
|
| 53 |
<div class="cam-badge">CAM 3</div>
|
| 54 |
</div>
|
| 55 |
</div>
|
|
|
|
| 56 |
<div class="card relative">
|
| 57 |
<div class="p-2">
|
| 58 |
<div class="aspect-video bg-slate-800 rounded-md">
|
|
|
|
| 63 |
</div>
|
| 64 |
</div>
|
| 65 |
|
|
|
|
| 66 |
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
|
|
| 67 |
<div class="card" role="region">
|
| 68 |
<div class="card-header flex items-center justify-between">
|
| 69 |
<div class="flex items-center gap-2">
|
| 70 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-slate-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 71 |
<path stroke-linecap="round" stroke-linejoin="round" d="M6 13.5V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m12-3V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m-6-9V3.75m0 3.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 9.75V10.5" />
|
| 72 |
</svg>
|
| 73 |
+
<h3 class="font-semibold text-slate-700 text-sm">View Controls</h3>
|
| 74 |
</div>
|
| 75 |
|
|
|
|
| 76 |
<button id="settings-button" title="Double-click to change camera URLs" class="p-1 text-slate-500 hover:text-blue-600 hover:bg-slate-300 rounded-md transition-colors">
|
| 77 |
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
| 78 |
<circle cx="12" cy="12" r="3"></circle>
|
|
|
|
| 81 |
</button>
|
| 82 |
</div>
|
| 83 |
|
|
|
|
| 84 |
<div id="toggle-controls" class="p-3 grid grid-cols-3 gap-3">
|
| 85 |
<button id="toggle-detected" data-control="show_detected" class="control-button flex items-center justify-center gap-2 p-2.5 rounded-lg text-xs md:text-sm font-medium" aria-pressed="true">
|
| 86 |
<svg class="w-6 h-6 icon-outline" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
|
|
| 89 |
<svg class="w-6 h-6 icon-solid" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
| 90 |
<path fill-rule="evenodd" d="M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z" clip-rule="evenodd"/>
|
| 91 |
</svg>
|
| 92 |
+
<span>Detection</span>
|
| 93 |
</button>
|
| 94 |
|
| 95 |
</button>
|
|
|
|
| 108 |
<circle cx="272" cy="460" r="28"/> <circle cx="88" cy="288" r="20"/>
|
| 109 |
</svg>
|
| 110 |
|
| 111 |
+
<span>Density</span>
|
| 112 |
</button>
|
| 113 |
|
| 114 |
<button id="toggle-inactive" data-control="show_inactive" class="control-button flex items-center justify-center gap-2 p-2.5 rounded-lg text-xs md:text-sm font-medium" aria-pressed="false">
|
|
|
|
| 118 |
<svg class="w-6 h-6 icon-solid" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
| 119 |
<path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 6a.75.75 0 00-1.5 0v6c0 .414.336.75.75.75h4.5a.75.75 0 000-1.5h-3.75V6z" clip-rule="evenodd"/>
|
| 120 |
</svg>
|
| 121 |
+
<span>Inactivity</span>
|
| 122 |
</button>
|
| 123 |
</div>
|
| 124 |
</div>
|
| 125 |
|
|
|
|
| 126 |
<div class="card" role="region">
|
| 127 |
<div class="card-header flex items-center gap-2">
|
| 128 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-slate-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 129 |
<path stroke-linecap="round" stroke-linejoin="round" d="M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z" />
|
| 130 |
</svg>
|
| 131 |
+
<h3 class="font-semibold text-slate-700 text-sm">System Log</h3>
|
| 132 |
</div>
|
| 133 |
<div id="system-log" class="p-4 text-xs text-slate-500 space-y-2 h-28 overflow-y-auto" role="log" aria-live="polite"></div>
|
| 134 |
</div>
|
|
|
|
| 136 |
</section>
|
| 137 |
|
| 138 |
<aside class="lg:col-span-3 flex flex-col gap-4" aria-label="Analysis and export panels">
|
| 139 |
+
<div class="card" role="region">
|
|
|
|
| 140 |
<div class="card-header flex items-center gap-2">
|
| 141 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-blue-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 142 |
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 12h16.5m-16.5 3.75h16.5M3.75 19.5h16.5M5.625 4.5h12.75a1.875 1.875 0 010 3.75H5.625a1.875 1.875 0 010-3.75z" />
|
| 143 |
</svg>
|
| 144 |
+
<h3 class="font-semibold text-slate-700 text-sm">Analysis Summary</h3>
|
| 145 |
</div>
|
| 146 |
<div class="p-4 space-y-3 text-sm">
|
|
|
|
| 147 |
<div class="flex items-center gap-3 p-2.5 bg-slate-50 rounded-lg">
|
| 148 |
<div class="w-9 h-9 bg-blue-100 text-blue-600 rounded-md flex items-center justify-center flex-shrink-0">
|
| 149 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
|
|
| 151 |
</svg>
|
| 152 |
</div>
|
| 153 |
<div>
|
| 154 |
+
<p class="text-slate-500 text-xs font-medium">Total Detected</p>
|
| 155 |
<p id="detected-count" class="text-lg font-bold text-slate-800">0</p>
|
| 156 |
</div>
|
| 157 |
</div>
|
| 158 |
+
<div class="flex items-center gap-3 p-2.5 bg-slate-50 rounded-lg">
|
|
|
|
| 159 |
<div class="w-9 h-9 bg-amber-100 text-amber-600 rounded-md flex items-center justify-center flex-shrink-0">
|
| 160 |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none" stroke="currentColor" stroke-width="24">
|
| 161 |
<circle cx="256" cy="256" r="240"/> <circle cx="220" cy="120" r="64"/> <circle cx="356" cy="92" r="34"/> <circle cx="420" cy="160" r="26"/> <circle cx="120" cy="100" r="28"/> <circle cx="104" cy="196" r="44"/>
|
|
|
|
| 164 |
</svg>
|
| 165 |
</div>
|
| 166 |
<div>
|
| 167 |
+
<p class="text-slate-500 text-xs font-medium">Density Clusters</p>
|
| 168 |
<p id="density-count" class="text-lg font-bold text-slate-800">0</p>
|
| 169 |
</div>
|
| 170 |
</div>
|
|
|
|
| 171 |
<div class="flex items-center gap-3 p-2.5 bg-slate-50 rounded-lg">
|
| 172 |
<div class="w-9 h-9 bg-red-100 text-red-600 rounded-md flex items-center justify-center flex-shrink-0">
|
| 173 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
|
|
| 175 |
</svg>
|
| 176 |
</div>
|
| 177 |
<div>
|
| 178 |
+
<p class="text-slate-500 text-xs font-medium">Inactive Chickens</p>
|
| 179 |
<p id="inactive-count" class="text-lg font-bold text-slate-800">0</p>
|
| 180 |
</div>
|
| 181 |
</div>
|
| 182 |
</div>
|
| 183 |
</div>
|
|
|
|
| 184 |
<div class="card" role="region">
|
| 185 |
<div class="card-header flex items-center gap-2">
|
| 186 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-green-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 187 |
<path stroke-linecap="round" stroke-linejoin="round" d="M19.114 5.636a9 9 0 010 12.728M16.463 8.288a5.25 5.25 0 010 7.424M6.75 8.25l4.72-4.72a.75.75 0 011.28.53v15.88a.75.75 0 01-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.01 9.01 0 012.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75z" />
|
| 188 |
</svg>
|
| 189 |
+
<h3 class="font-semibold text-slate-700 text-sm">Vocalization Analysis</h3>
|
| 190 |
</div>
|
| 191 |
|
| 192 |
<div id="vocalization-content" class="p-4">
|
| 193 |
+
</div>
|
|
|
|
| 194 |
</div>
|
| 195 |
|
| 196 |
+
<div class="card" role="region">
|
|
|
|
| 197 |
<div class="card-header flex items-center gap-2">
|
| 198 |
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-slate-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
| 199 |
<path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3" />
|
| 200 |
</svg>
|
| 201 |
+
<h3 class="font-semibold text-slate-700 text-sm">Export Metric Data (CSV)</h3>
|
| 202 |
</div>
|
| 203 |
<div class="p-4">
|
| 204 |
<button id="open-export-modal-btn" class="btn btn-primary w-full text-sm">
|
| 205 |
+
Export CSV
|
| 206 |
</button>
|
| 207 |
+
<p class="text-[11px] text-slate-500 mt-2 text-center">Export data by double-clicking the button above.</p>
|
| 208 |
</div>
|
| 209 |
</div>
|
| 210 |
</aside>
|
| 211 |
</main>
|
| 212 |
</div>
|
| 213 |
|
|
|
|
| 214 |
<div id="settings-modal" class="modal z-50" role="dialog" aria-labelledby="settings-modal-title" aria-hidden="true">
|
| 215 |
<div class="modal-backdrop"></div>
|
| 216 |
<div class="modal-container">
|
| 217 |
<div class="card w-full max-w-lg">
|
| 218 |
<div class="card-header flex items-center justify-between">
|
| 219 |
+
<h3 id="settings-modal-title" class="font-semibold text-slate-700 text-sm">URL Settings</h3>
|
| 220 |
<button class="modal-close-btn" aria-label="Close">✕</button>
|
| 221 |
</div>
|
| 222 |
<div class="p-4 space-y-4 text-sm">
|
| 223 |
<div>
|
| 224 |
+
<label for="cam1-url" class="block text-xs font-medium text-slate-600 mb-1">Camera 1 URL</label>
|
| 225 |
+
<input type="text" id="cam1-url" class="modal-input" placeholder="Enter URL for Camera 1">
|
| 226 |
</div>
|
| 227 |
<div>
|
| 228 |
+
<label for="cam2-url" class="block text-xs font-medium text-slate-600 mb-1">Camera 2 URL</label>
|
| 229 |
+
<input type="text" id="cam2-url" class="modal-input" placeholder="Enter URL for Camera 2">
|
| 230 |
</div>
|
| 231 |
<div>
|
| 232 |
+
<label for="cam3-url" class="block text-xs font-medium text-slate-600 mb-1">Camera 3 URL</label>
|
| 233 |
+
<input type="text" id="cam3-url" class="modal-input" placeholder="Enter URL for Camera 3">
|
| 234 |
</div>
|
| 235 |
<div>
|
| 236 |
+
<label for="cam4-url" class="block text-xs font-medium text-slate-600 mb-1">Camera 4 URL</label>
|
| 237 |
+
<input type="text" id="cam4-url" class="modal-input" placeholder="Enter URL for Camera 4">
|
| 238 |
</div>
|
| 239 |
<hr class="border-slate-200">
|
| 240 |
<div>
|
| 241 |
+
<label for="audio-url" class="block text-xs font-medium text-slate-600 mb-1">Audio URL</label>
|
| 242 |
+
<input type="text" id="audio-url" class="modal-input" placeholder="Enter URL for Audio Source">
|
| 243 |
</div>
|
| 244 |
<div class="flex justify-end gap-2 pt-2">
|
| 245 |
+
<button id="stop-all-streams-btn" class="btn bg-red-600 hover:bg-red-700 text-white text-sm">Stop All Streams</button>
|
| 246 |
+
<button id="save-settings-btn" class="btn btn-primary text-sm">Save & Restart</button>
|
| 247 |
</div>
|
| 248 |
</div>
|
| 249 |
</div>
|
|
|
|
| 255 |
<div class="modal-container">
|
| 256 |
<div class="card w-full max-w-md">
|
| 257 |
<div class="card-header flex items-center justify-between">
|
| 258 |
+
<h3 id="export-modal-title" class="font-semibold text-slate-700 text-sm">Export Metric Data</h3>
|
| 259 |
<button class="modal-close-btn" aria-label="Close">✕</button>
|
| 260 |
</div>
|
| 261 |
<div class="p-4 space-y-3 text-sm">
|
| 262 |
<div>
|
| 263 |
+
<label for="start-date" class="block text-xs font-medium text-slate-600 mb-1">Start Date</label>
|
| 264 |
<input type="date" id="start-date" class="modal-input">
|
| 265 |
</div>
|
| 266 |
<div>
|
| 267 |
+
<label for="end-date" class="block text-xs font-medium text-slate-600 mb-1">End Date</label>
|
| 268 |
<input type="date" id="end-date" class="modal-input">
|
| 269 |
</div>
|
| 270 |
<div>
|
| 271 |
+
<label for="camera-select" class="block text-xs font-medium text-slate-600 mb-1">Select Camera</label>
|
| 272 |
<select id="camera-select" class="modal-input bg-white">
|
| 273 |
+
<option value="">All Cameras</option>
|
| 274 |
+
<option value="1">Camera 1</option>
|
| 275 |
+
<option value="2">Camera 2</option>
|
| 276 |
+
<option value="3">Camera 3</option>
|
| 277 |
+
<option value="4">Camera 4</option>
|
| 278 |
</select>
|
| 279 |
</div>
|
| 280 |
+
<button id="download-csv-btn" class="btn btn-primary w-full">Download CSV</button>
|
| 281 |
</div>
|
| 282 |
</div>
|
| 283 |
</div>
|