blob: 94ac6c63d6b293288959e532f1a3c3b227c933db [file] [log] [blame]
module.exports = function DeviceListStatsDirective(
UserService
) {
return {
restrict: 'E'
, template: require('./device-list-stats.jade')
, scope: {
tracker: '&tracker'
}
, link: function(scope, element) {
var tracker = scope.tracker()
var mapping = Object.create(null)
var nodes = Object.create(null)
scope.counter = {
total: 0
, usable: 0
, busy: 0
, using: 0
}
scope.currentUser = UserService.currentUser
function findTextNodes() {
var elements = element[0].getElementsByClassName('counter')
for (var i = 0, l = elements.length; i < l; ++i) {
nodes[elements[i].getAttribute('data-type')] = elements[i].firstChild
}
}
function notify() {
nodes.total.nodeValue = scope.counter.total
nodes.usable.nodeValue = scope.counter.usable
nodes.busy.nodeValue = scope.counter.busy
nodes.using.nodeValue = scope.counter.using
}
function updateStats(device) {
return (mapping[device.serial] = {
usable: device.usable ? 1 : 0
, busy: device.owner ? 1 : 0
, using: device.using ? 1 : 0
})
}
function addListener(device) {
var stats = updateStats(device)
scope.counter.total += 1
scope.counter.usable += stats.usable
scope.counter.busy += stats.busy
scope.counter.using += stats.using
notify()
}
function changeListener(device) {
var oldStats = mapping[device.serial]
var newStats = updateStats(device)
var diffs = Object.create(null)
scope.counter.usable += diffs.usable = newStats.usable - oldStats.usable
scope.counter.busy += diffs.busy = newStats.busy - oldStats.busy
scope.counter.using += diffs.using = newStats.using - oldStats.using
if (diffs.usable || diffs.busy || diffs.using) {
notify()
}
}
function removeListener(device) {
var oldStats = mapping[device.serial]
var newStats = updateStats(device)
scope.counter.total -= 1
scope.counter.busy += newStats.busy - oldStats.busy
scope.counter.using += newStats.using - oldStats.using
delete mapping[device.serial]
notify()
}
findTextNodes()
tracker.on('add', addListener)
tracker.on('change', changeListener)
tracker.on('remove', removeListener)
scope.$on('$destroy', function() {
tracker.removeListener('add', addListener)
tracker.removeListener('change', changeListener)
tracker.removeListener('remove', removeListener)
})
}
}
}