()
| 166 | } |
| 167 | |
| 168 | function visibleServers(){ |
| 169 | const q = S.filters.query.trim().toLowerCase(); |
| 170 | let rows = S.servers.filter(server => { |
| 171 | const m = metrics(server); |
| 172 | if(S.filters.status === 'online' && !m.online) return false; |
| 173 | if(S.filters.status === 'offline' && m.online) return false; |
| 174 | if(S.filters.status === 'alert' && !m.alert) return false; |
| 175 | const os = osLabel(server.os); |
| 176 | if(S.filters.os !== 'all' && os !== S.filters.os) return false; |
| 177 | if(!q) return true; |
| 178 | return [server.name, server.type, server.host, server.location, os].some(v => String(v || '').toLowerCase().includes(q)); |
| 179 | }); |
| 180 | rows.sort((a, b) => { |
| 181 | const dir = S.filters.dir === 'asc' ? 1 : -1; |
| 182 | const ma = metrics(a), mb = metrics(b); |
| 183 | const value = (server, m) => ({ |
| 184 | name: String(server.name || ''), |
| 185 | type: String(server.type || ''), |
| 186 | location: String(server.location || ''), |
| 187 | status: m.online ? 1 : 0, |
| 188 | load: num(server.load_1), |
| 189 | cpu: num(server.cpu), |
| 190 | memory: m.memPct, |
| 191 | hdd: m.hddPct, |
| 192 | traffic: m.traffic, |
| 193 | loss: m.loss |
| 194 | })[S.filters.sort]; |
| 195 | const va = value(a, ma), vb = value(b, mb); |
| 196 | if(typeof va === 'string') return va.localeCompare(vb, 'zh-CN') * dir; |
| 197 | return (va - vb) * dir; |
| 198 | }); |
| 199 | return rows; |
| 200 | } |
| 201 | |
| 202 | function render(){ |
| 203 | $('notice').style.display = 'none'; |
no test coverage detected