React Device Fleet Table
Is the fleet healthy, how far has the update reached, and which devices fell behind? Four summary figures across the top, then a sortable, filterable table with per-device OTA progress — the whole answer on one screen.
Fleet size
40
Online
28
Degraded / offline
12
OTA complete
21/30
| KLV-7000Fab 2 | Offline | 3.4.1 | 10h ago | 100% |
| KLV-7008Lab 4 | Offline | 3.4.1 | 14h ago | 100% |
| KLV-7016Grid North | Offline | 3.4.0behind | 3d ago | — |
| KLV-7022Grid South | Offline | 3.4.0behind | 2d ago | — |
| KLV-7025Fab 2 | Offline | 3.4.0behind | 3d ago | — |
| KLV-7028Lab 4 | Offline | 3.4.1 | 3d ago | 100% |
| KLV-7038Lab 4 | Offline | 3.4.1 | 1d ago | 100% |
| KLV-7012Grid South | Degraded | 3.4.0behind | 4m ago | — |
| KLV-7019Warehouse | Degraded | 3.4.1 | 23m ago | 100% |
| KLV-7026Grid North | Degraded | 3.4.1 | 15m ago | 100% |
| KLV-7030Fab 2 | Degraded | 3.4.1 | 4m ago | 100% |
| KLV-7035Fab 2 | Degraded | 3.4.0behind | 23m ago | 50% |
| KLV-7001Grid North | Online | 3.4.1 | 4m ago | 100% |
| KLV-7002Grid South | Online | 3.4.1 | 27m ago | 100% |
| KLV-7003Lab 4 | Online | 3.4.1 | 12m ago | 100% |
| KLV-7004Warehouse | Online | 3.4.1 | 12m ago | 100% |
| KLV-7005Fab 2 | Online | 3.4.1 | 21m ago | 100% |
| KLV-7006Grid North | Online | 3.4.1 | 20m ago | 100% |
| KLV-7007Grid South | Online | 3.4.0behind | 19m ago | — |
| KLV-7009Warehouse | Online | 3.4.0behind | 3m ago | — |
| KLV-7010Fab 2 | Online | 3.4.0behind | 28m ago | — |
| KLV-7011Grid North | Online | 3.4.0behind | 23m ago | 45% |
| KLV-7013Lab 4 | Online | 3.4.1 | 1m ago | 100% |
| KLV-7014Warehouse | Online | 3.4.0behind | 27m ago | — |
| KLV-7015Fab 2 | Online | 3.4.0behind | 12m ago | 61% |
| KLV-7017Grid South | Online | 3.4.1 | 22m ago | 100% |
| KLV-7018Lab 4 | Online | 3.4.1 | 28m ago | 100% |
| KLV-7020Fab 2 | Online | 3.4.0behind | 22m ago | 26% |
| KLV-7021Grid North | Online | 3.4.0behind | 28m ago | 30% |
| KLV-7023Lab 4 | Online | 3.4.0behind | 26m ago | 44% |
| KLV-7024Warehouse | Online | 3.4.0behind | 19m ago | 43% |
| KLV-7027Grid South | Online | 3.4.0behind | just now | — |
| KLV-7029Warehouse | Online | 3.4.1 | 28m ago | 100% |
| KLV-7031Grid North | Online | 3.4.1 | just now | 100% |
| KLV-7032Grid South | Online | 3.4.0behind | 5m ago | 74% |
| KLV-7033Lab 4 | Online | 3.4.0behind | 29m ago | 87% |
| KLV-7034Warehouse | Online | 3.4.0behind | 25m ago | — |
| KLV-7036Grid North | Online | 3.4.1 | 2m ago | 100% |
| KLV-7037Grid South | Online | 3.4.1 | 27m ago | 100% |
| KLV-7039Warehouse | Online | 3.4.1 | 17m ago | 100% |
Installation
Props
| Prop | Type | Description |
|---|---|---|
| devices | FleetDevice[] | { id, name, health, firmware, lastSeenMin, site?, otaProgress? } |
| targetFirmware | string | Current version — anything older is flagged "behind" |
Sorted so the problems float up
The default sort is by health ascending, which puts offline first, then degraded, then online. That is deliberate: a fleet screen sorted alphabetically buries the three broken devices among the four hundred working ones. Every column is still sortable, and the health filter narrows to one class in a click.
targetFirmware turns the firmware column into a drift indicator — anything not on the target is marked behind in amber, so a stalled rollout is visible without doing version maths in your head. otaProgress renders as a bar per device (green at 100%, primary while in flight, an em dash when the device isn't targeted at all), and the header rolls it into an "OTA complete" count.
lastSeenMin is minutes since contact, formatted relatively — pass minutes rather than a timestamp so the display stays deterministic between server and client render, which matters in a statically exported app.
New components every week
Get the week's new Kelvin UI components and templates in one short email. No spam, unsubscribe anytime.