3x-ui/frontend/src/pages/inbounds
MHSanaei 2551a673c3
fix(inbounds): refresh client rows live over websocket
Two bugs combined to leave per-client traffic / remained / all-time
columns stuck at stale numbers while only the inbound-level row and
the online badge refreshed:

1. Backend (xray + node sync traffic jobs) only included the per-client
   array in the client_stats broadcast when activeEmails / touched
   was non-empty. Cycles with no client deltas — or any node sync that
   failed to fetch a snapshot — shipped only the inbound summary, so
   the frontend had nothing to merge for clients. Replaced both code
   paths with a single GetAllClientTraffics() snapshot per cycle; the
   broadcast now always carries the full client list.

2. Frontend mutated dbInbound.clientStats[i] in place. DBInbound is a
   plain class instance (not wrapped in reactive()), so Vue could not
   see the field-level changes and ClientRowTable's statsMap computed
   stayed cached forever. Added a statsVersion tick bumped on every
   merge and read inside statsMap so the computed re-evaluates and the
   template pulls fresh up/down/allTime/expiryTime each push.

Removed the now-dead emailSet helper from node_traffic_sync_job and
the activeEmails filter from xray_traffic_job.
2026-05-14 01:31:49 +02:00
..
ClientBulkModal.vue feat(inbounds): bulk-select clients + UX polish 2026-05-11 03:50:28 +02:00
ClientFormModal.vue feat(xray/dns): align DNS settings with Xray docs + UI polish 2026-05-10 17:03:11 +02:00
ClientRowTable.vue fix(inbounds): refresh client rows live over websocket 2026-05-14 01:31:49 +02:00
CopyClientsModal.vue feat(inbounds): restore copy-clients-between-inbounds modal 2026-05-12 12:30:07 +02:00
InboundFormModal.vue feat(json): swap raw textareas for a CodeMirror 6 JsonEditor 2026-05-14 00:02:59 +02:00
InboundInfoModal.vue feat(inbounds): align tunnel, tun, and hysteria UI with Xray docs 2026-05-13 22:44:08 +02:00
InboundList.vue fix(inbounds): refresh client rows live over websocket 2026-05-14 01:31:49 +02:00
InboundsPage.vue fix(inbounds): refresh client rows live over websocket 2026-05-14 01:31:49 +02:00
QrCodeModal.vue refactor(panel): rename injected globals + collapse QR modal entries 2026-05-10 23:40:39 +02:00
QrPanel.vue feat(frontend): swap QRious for ant-design-vue's a-qrcode 2026-05-11 02:07:47 +02:00
useInbounds.js fix(inbounds): refresh client rows live over websocket 2026-05-14 01:31:49 +02:00