31 lines
1.5 KiB
JavaScript
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
|
|
}
|