tikal-tech-radar-generator
Version:
A library that generates an interactive radar, inspired by http://thoughtworks.com/radar/
86 lines (69 loc) • 2 kB
JavaScript
const MalformedDataError = require('../exceptions/malformedDataError')
const ExceptionMessages = require('../util/exceptionMessages')
const _ = {
map: require('lodash/map'),
uniqBy: require('lodash/uniqBy'),
sortBy: require('lodash/sortBy')
}
const Radar = function () {
var self, quadrants, blipNumber, addingQuadrant, alternatives, currentSheetName
blipNumber = 0
addingQuadrant = 0
quadrants = [
{ order: 'first', startAngle: 90 },
{ order: 'second', startAngle: 0 },
{ order: 'third', startAngle: -90 },
{ order: 'fourth', startAngle: -180 }
]
alternatives = []
currentSheetName = ''
self = {}
function setNumbers (blips) {
blips.forEach(function (blip) {
blip.setNumber(++blipNumber)
})
}
self.addAlternative = function (sheetName) {
alternatives.push(sheetName)
}
self.getAlternatives = function () {
return alternatives
}
self.setCurrentSheet = function (sheetName) {
currentSheetName = sheetName
}
self.getCurrentSheet = function () {
return currentSheetName
}
self.addQuadrant = function (quadrant) {
if (addingQuadrant >= 4) {
throw new MalformedDataError(ExceptionMessages.TOO_MANY_QUADRANTS)
}
quadrants[addingQuadrant].quadrant = quadrant
setNumbers(quadrant.blips())
addingQuadrant++
}
function allQuadrants () {
if (addingQuadrant < 4) { throw new MalformedDataError(ExceptionMessages.LESS_THAN_FOUR_QUADRANTS) }
return _.map(quadrants, 'quadrant')
}
function allBlips () {
return allQuadrants().reduce(function (blips, quadrant) {
return blips.concat(quadrant.blips())
}, [])
}
self.rings = function () {
return _.sortBy(_.map(_.uniqBy(allBlips(), function (blip) {
return blip.ring().name()
}), function (blip) {
return blip.ring()
}), function (ring) {
return ring.order()
})
}
self.quadrants = function () {
return quadrants
}
return self
}
module.exports = Radar