move_detect/server/public
유창욱 eaff1765a4 feat(dashboard): device -> camera tree rail with pair-scoped camera filter
- Rail rework: the flat device strip + camera <select> becomes one device->camera
  tree (device-tree.js owns the DOM). A device row carries the heartbeat verdict
  (online/offline, fps, temp, throttle, config drift); the cameras seen in the
  event stream nest under it and double as the stream's camera filter.
- The camera filter is a (device, camera) PAIR: camera ids are free-form edge
  strings, so two devices may both run a "cam-01" - one device's events no longer
  leak into another's filtered view. Clicking the selected camera (or 전체 보기)
  clears the filter.
- A camera whose device is missing from /api/devices renders as its own
  unknown-device group ("장치 목록에 없음 - 등록 확인") instead of being dropped.
- Offline rows show liveness only - fps/temp are the LAST values a dead device
  reported and would read as current telemetry.
- Poll-failure staleness, collapse state, and focus survive the 5s re-render;
  an unchanged poll never rebuilds the DOM (render signature).
- Stream rows: device NAME + mono camera id + compact 24h stamp (year only when
  not current); thumb slot links to the incident and is honest about 무영상 for
  screen readers; KPI strip captioned "미확인" once.

Verified: PHPUnit 119 pass (4 skipped, PDO gate) + real-render harness in Chrome
(tree states, pair filter, collapse, reset, no console errors).
2026-08-06 16:54:44 +09:00
..
assets feat(dashboard): device -> camera tree rail with pair-scoped camera filter 2026-08-06 16:54:44 +09:00
.htaccess refactor: rename cloud/ to server/ (cafe24 is web hosting, not cloud) 2026-07-20 11:30:52 +09:00
index.php feat(dashboard): device-status panel + event-list rework, hardened 2026-07-25 19:20:42 +09:00