{# Summary + detail row pair for one device. Used in two places: 1. `_live_table.html` — server-side render of the full table on initial page load and on the one-shot htmx `load` fragment swap. 2. The `/api/devices/{id}/row-html` endpoint — fetched by the dashboard JSON poll when a brand new device appears so we can append a fresh row pair without forcing a page reload. Both summary cells (.cell-status / .cell-location / .cell-lastseen) and the row id (#summary-{device_id}) are the same hooks the JSON poll updates in place on subsequent ticks. #}
{{ device.device_id }}
{{ device.device_type }} {% if device.status == "available" %} online {% else %} {{ device.status }} {% endif %} {{ device.location or "—" }} {{ device.last_seen or "—" }} {# Per-device detail is lazy-loaded on first expand by toggleDetail() in dashboard.html. We deliberately do not use ``hx-trigger=revealed``: htmx's revealed implementation polls getBoundingClientRect, and display:none elements report a zero-rect at (0,0) which falsely counts as "in viewport", so revealed would fire for every hidden row on page load. #}

Loading details…