import { formatNumber, formatPercent } from './util' export class PercentageBar { constructor (app) { this._app = app this._parent = document.getElementById('perc-bar') } redraw = () => { const serverRegistrations = this._app.serverRegistry.getServerRegistrations().sort(function (a, b) { return a.playerCount - b.playerCount }) const totalPlayers = this._app.getTotalPlayerCount() let leftPadding = 0 for (const serverRegistration of serverRegistrations) { const width = Math.round((serverRegistration.playerCount / totalPlayers) * this._parent.offsetWidth) // Update position/width // leftPadding is a sum of previous iterations width value const div = document.getElementById(`perc-bar-part_${serverRegistration.serverId}`) || this.createPart(serverRegistration) const widthPixels = `${width}px` const leftPaddingPixels = `${leftPadding}px` // Only redraw if needed if (div.style.width !== widthPixels || div.style.left !== leftPaddingPixels) { div.style.width = widthPixels div.style.left = leftPaddingPixels } leftPadding += width } } createPart (serverRegistration) { const div = document.createElement('div') div.id = `perc-bar-part_${serverRegistration.serverId}` div.style.background = serverRegistration.data.color div.setAttribute('class', 'perc-bar-part') div.setAttribute('minetrack-server-id', serverRegistration.serverId) this._parent.appendChild(div) // Define events once during creation div.addEventListener('mouseover', this.handleMouseOver, false) div.addEventListener('mouseout', this.handleMouseOut, false) return div } handleMouseOver = (event) => { const serverId = parseInt(event.target.getAttribute('minetrack-server-id')) const serverRegistration = this._app.serverRegistry.getServerRegistration(serverId) this._app.tooltip.set(event.target.offsetLeft, event.target.offsetTop, 10, this._parent.offsetTop + this._parent.offsetHeight + 10, `${typeof serverRegistration.rankIndex !== 'undefined' ? `#${serverRegistration.rankIndex + 1} ` : ''} ${serverRegistration.data.name}
${formatNumber(serverRegistration.playerCount)} Players
${formatPercent(serverRegistration.playerCount, this._app.getTotalPlayerCount())}`) } handleMouseOut = () => { this._app.tooltip.hide() } reset () { // Reset modified DOM elements this._parent.innerHTML = '' } }