Files

31 lines
1.5 KiB
JavaScript

export function fleetStatusKind(status) {
if (!status) return 'unknown'
if (!status.reachable) return 'offline'
if (status.authenticated === false) return 'auth'
return 'online'
}
export function filterAndSortFleet(instances, statuses, { filter = 'all', query = '', sort = 'name' } = {}) {
const needle = String(query).trim().toLocaleLowerCase()
const rank = { online: 0, auth: 1, offline: 2, unknown: 3 }
return instances.filter(item => {
const status = statuses.get(item.id)
if (filter !== 'all' && fleetStatusKind(status) !== filter) return false
if (!needle) return true
return [item.id, item.name, item.url, item.description, ...(item.tags || []), JSON.stringify(status?.summary || {})]
.join(' ').toLocaleLowerCase().includes(needle)
}).slice().sort((a, b) => {
const sa = statuses.get(a.id); const sb = statuses.get(b.id)
if (sort === 'latency') return (sa?.latencyMs ?? Infinity) - (sb?.latencyMs ?? Infinity) || String(a.name || a.id).localeCompare(String(b.name || b.id))
if (sort === 'status') return rank[fleetStatusKind(sa)] - rank[fleetStatusKind(sb)] || String(a.name || a.id).localeCompare(String(b.name || b.id))
return String(a.name || a.id).localeCompare(String(b.name || b.id))
})
}
export function emptyFleetReason({ total = 0, query = '', filter = 'all', visible = 0 } = {}) {
if (!total) return 'config'
if (!visible && String(query).trim()) return 'search'
if (!visible && filter !== 'all') return 'filter'
return null
}