hide_zero is decided per field but applied per row, and the two front ends
read that per-field verdict in opposite directions.
msg_curse drops a disk only when *all* of its hide_zero_fields are hidden:
if all(self.get_views(item=..., key=f, option='hidden') for f in self.hide_zero_fields):
continue
plugin-diskio.vue and plugin-network.vue keep a row only when *all* of them
are visible:
return (
(!readBytesRate || readBytesRate.hidden === false) &&
(!writeBytesRate || writeBytesRate.hidden === false)
);
Those agree while both fields say the same thing, and disagree the moment
one moves and the other does not -- a disk that has only ever been read, an
interface that has only ever received. Curses shows it; the browser drops
it entirely.
Use the same rule as msg_curse in both components.