angular-sunburst-radar-chart
Version:
A Sunburst Radar chart with SVG,No Dependencies
118 lines • 18.4 kB
JavaScript
//Not Used now ,Might Use later
import { polarToCartesian } from './trignometry';
// function anglesBasedOnPercentage(items) {
//
// const total = items.reduce((prevValue, curValue) => prevValue +
//curValue, 0);
// if (Math.round(total) != 100) {
// console.error('Cannnot draw as the sum of values should be 100');
// throw new Error('Cannnot draw as the sum of values should be 100');
// }
// let prevDegree = 0;
// const results = [];
// for (let i = 0; i < items.length; i++) {
//
// const item = items[i];
// const currentDegree = item * 3.6;
//
// const degreeToBeDrawn = currentDegree + prevDegree;
// results.push(degreeToBeDrawn);
// prevDegree = prevDegree + currentDegree;
// }
//
//
// return results;
// }
//
function getInitialPosition(startLocation, totalDegrees, num) {
const perLocation = totalDegrees / num;
const middleLocation = perLocation / 2;
const startMiddle = startLocation + middleLocation;
return { startLocation, perLocation, middleLocation, startMiddle };
}
function getDegreeForIndexBasedOnSplitAngle(index, data) {
const { perLocation, middleLocation, startMiddle, startLocation } = data;
let position = index; // + 1;
const startDegree = startLocation + (position * perLocation);
const middleDegree = startMiddle + (position * perLocation);
const endDegree = startLocation + (position * perLocation) + perLocation;
return { startDegree, middleDegree, endDegree };
}
export function getAllAnglesBasedOnChild(items) {
const num = items.length;
const results = [];
const totalChildren = items.filter(item => item.children).map(item => item.children.length).reduce(((a, b) => a + b), 0);
const childAngleDifference = 360 / totalChildren;
let currentStartLocation = 0;
for (let i = 0; i < items.length; i++) {
const item = items[i];
const childCount = item.children ? item.children.length : 0;
const totalDegrees = childCount * childAngleDifference;
const endDegree = currentStartLocation + (childCount * childAngleDifference);
const middleDegree = (endDegree - currentStartLocation) / 2;
const currentItem = {};
currentItem['item'] = item;
currentItem['startDegree'] = currentStartLocation;
currentItem['middleDegree'] = middleDegree;
currentItem['endDegree'] = endDegree;
if (childCount > 0) {
currentItem['children'] = iterateChildrenAndSetAngles({ children: item.children, currentItem, angleDifference: totalDegrees });
}
currentStartLocation = currentStartLocation + (childCount * childAngleDifference);
results.push(currentItem);
}
return results;
}
export function getAllAnglesBasedOnParent(items) {
const num = items.length;
let results = [];
let angleDifference = 360 / num;
const data = getInitialPosition(0, 360, num);
for (let i = 0; i < items.length; i++) {
const { startDegree, middleDegree, endDegree } = getDegreeForIndexBasedOnSplitAngle(i, data);
const item = items[i];
const currentItem = {};
currentItem['item'] = item;
currentItem['startDegree'] = startDegree;
currentItem['middleDegree'] = middleDegree;
currentItem['endDegree'] = endDegree;
const hasChildren = items.filter(item => !!item.children).length > 0;
if (hasChildren) {
currentItem['children'] = iterateChildrenAndSetAngles({ children: item.children, currentItem, angleDifference });
}
results.push(currentItem);
}
return results;
}
function iterateChildrenAndSetAngles({ children, currentItem, angleDifference }) {
const count = children.length;
const childItems = [];
const data = getInitialPosition(currentItem['startDegree'], angleDifference, count);
for (let j = 0; j < count; j++) {
const childItem = {};
childItem['item'] = children[j];
const { startDegree, middleDegree, endDegree } = getDegreeForIndexBasedOnSplitAngle(j, data);
childItem['startDegree'] = startDegree;
childItem['middleDegree'] = middleDegree;
childItem['endDegree'] = endDegree;
childItems.push(childItem);
}
return childItems;
}
export function positionsOnAngles(centerX, centerY, radius, angels) {
const results = [];
for (let i = 0; i < angels.length; i++) {
const degreeToBeDrawn = angels[i];
results.push(polarToCartesian(centerX, centerY, radius, degreeToBeDrawn));
}
return results;
}
export function getPointsOnCircleAtAngels(centerX, centerY, radius, angels) {
const results = [];
for (let i = 0; i < angels.length; i++) {
const degreeToBeDrawn = angels[i];
results.push(polarToCartesian(centerX, centerY, radius, degreeToBeDrawn));
}
return results;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5nZWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1zdW5idXJzdC1yYWRhci1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9hbmdlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUvQyw0Q0FBNEM7QUFDNUMsRUFBRTtBQUNGLG9FQUFvRTtBQUNwRSxlQUFlO0FBQ2Ysb0NBQW9DO0FBQ3BDLHdFQUF3RTtBQUN4RSwwRUFBMEU7QUFDMUUsTUFBTTtBQUNOLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsNkNBQTZDO0FBQzdDLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0Isd0NBQXdDO0FBQ3hDLEVBQUU7QUFDRiwwREFBMEQ7QUFDMUQscUNBQXFDO0FBQ3JDLCtDQUErQztBQUMvQyxNQUFNO0FBQ04sRUFBRTtBQUNGLEVBQUU7QUFDRixvQkFBb0I7QUFDcEIsSUFBSTtBQUNKLEVBQUU7QUFFRixTQUFTLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRztJQUcxRCxNQUFNLFdBQVcsR0FBRyxZQUFZLEdBQUcsR0FBRyxDQUFDO0lBQ3ZDLE1BQU0sY0FBYyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxXQUFXLEdBQUcsYUFBYSxHQUFHLGNBQWMsQ0FBQztJQUVuRCxPQUFPLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFDLENBQUM7QUFHbkUsQ0FBQztBQUVELFNBQVMsa0NBQWtDLENBQUMsS0FBSyxFQUFFLElBQUk7SUFHckQsTUFBTSxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBQyxHQUFHLElBQUksQ0FBQztJQUN2RSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQSxPQUFPO0lBRzVCLE1BQU0sV0FBVyxHQUFHLGFBQWEsR0FBRyxD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QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUV0QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0tBRTNFO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vTm90IFVzZWQgbm93ICxNaWdodCBVc2UgbGF0ZXJcclxuaW1wb3J0IHtwb2xhclRvQ2FydGVzaWFufSBmcm9tICcuL3RyaWdub21ldHJ5JztcclxuXHJcbi8vIGZ1bmN0aW9uIGFuZ2xlc0Jhc2VkT25QZXJjZW50YWdlKGl0ZW1zKSB7XHJcbi8vXHJcbi8vICAgY29uc3QgdG90YWwgPSBpdGVtcy5yZWR1Y2UoKHByZXZWYWx1ZSwgY3VyVmFsdWUpID0+IHByZXZWYWx1ZSArXHJcbi8vY3VyVmFsdWUsIDApO1xyXG4vLyAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSAhPSAxMDApIHtcclxuLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5ub3QgZHJhdyBhcyB0aGUgc3VtIG9mIHZhbHVlcyBzaG91bGQgYmUgMTAwJyk7XHJcbi8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5ub3QgZHJhdyBhcyB0aGUgc3VtIG9mIHZhbHVlcyBzaG91bGQgYmUgMTAwJyk7XHJcbi8vICAgfVxyXG4vLyAgIGxldCBwcmV2RGVncmVlID0gMDtcclxuLy8gICBjb25zdCByZXN1bHRzID0gW107XHJcbi8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4vL1xyXG4vLyAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xyXG4vLyAgICAgY29uc3QgY3VycmVudERlZ3JlZSA9IGl0ZW0gKiAzLjY7XHJcbi8vXHJcbi8vICAgICBjb25zdCBkZWdyZWVUb0JlRHJhd24gPSBjdXJyZW50RGVncmVlICsgcHJldkRlZ3JlZTtcclxuLy8gICAgIHJlc3VsdHMucHVzaChkZWdyZWVUb0JlRHJhd24pO1xyXG4vLyAgICAgcHJldkRlZ3JlZSA9IHByZXZEZWdyZWUgKyBjdXJyZW50RGVncmVlO1xyXG4vLyAgIH1cclxuLy9cclxuLy9cclxuLy8gICByZXR1cm4gcmVzdWx0cztcclxuLy8gfVxyXG4vL1xyXG5cclxuZnVuY3Rpb24gZ2V0SW5pdGlhbFBvc2l0aW9uKHN0YXJ0TG9jYXRpb24sIHRvdGFsRGVncmVlcywgbnVtKSB7XHJcblxyXG5cclxuICBjb25zdCBwZXJMb2NhdGlvbiA9IHRvdGFsRGVncmVlcyAvIG51bTtcclxuICBjb25zdCBtaWRkbGVMb2NhdGlvbiA9IHBlckxvY2F0aW9uIC8gMjtcclxuICBjb25zdCBzdGFydE1pZGRsZSA9IHN0YXJ0TG9jYXRpb24gKyBtaWRkbGVMb2NhdGlvbjtcclxuXHJcbiAgcmV0dXJuIHtzdGFydExvY2F0aW9uLCBwZXJMb2NhdGlvbiwgbWlkZGxlTG9jYXRpb24sIHN0YXJ0TWlkZGxlfTtcclxuXHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREZWdyZWVGb3JJbmRleEJhc2VkT25TcGxpdEFuZ2xlKGluZGV4LCBkYXRhKSB7XHJcblxyXG5cclxuICBjb25zdCB7cGVyTG9jYXRpb24sIG1pZGRsZUxvY2F0aW9uLCBzdGFydE1pZGRsZSwgc3RhcnRMb2NhdGlvbn0gPSBkYXRhO1xyXG4gIGxldCBwb3NpdGlvbiA9IGluZGV4Oy8vICsgMTtcclxuXHJcblxyXG4gIGNvbnN0IHN0YXJ0RGVncmVlID0gc3RhcnRMb2NhdGlvbiArIChwb3NpdGlvbiAqIHBlckxvY2F0aW9uKTtcclxuICBjb25zdCBtaWRkbGVEZWdyZWUgPSBzdGFydE1pZGRsZSArIChwb3NpdGlvbiAqIHBlckxvY2F0aW9uKTtcclxuICBjb25zdCBlbmREZWdyZWUgPSBzdGFydExvY2F0aW9uICsgKHBvc2l0aW9uICogcGVyTG9jYXRpb24pICsgcGVyTG9jYXRpb247XHJcblxyXG5cclxuICByZXR1cm4ge3N0YXJ0RGVncmVlLCBtaWRkbGVEZWdyZWUsIGVuZERlZ3JlZX07XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQW5nbGVzQmFzZWRPbkNoaWxkKGl0ZW1zKSB7XHJcblxyXG4gIGNvbnN0IG51bSA9IGl0ZW1zLmxlbmd0aDtcclxuICBjb25zdCByZXN1bHRzID0gW107XHJcblxyXG5cclxuICBjb25zdCB0b3RhbENoaWxkcmVuID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jaGlsZHJlbikubWFwKGl0ZW0gPT4gaXRlbS5jaGlsZHJlbi5sZW5ndGgpLnJlZHVjZSgoKGEsIGIpID0+IGEgKyBiKSwwKTtcclxuXHJcbiAgY29uc3QgY2hpbGRBbmdsZURpZmZlcmVuY2UgPSAzNjAgLyB0b3RhbENoaWxkcmVuO1xyXG5cclxuICBsZXQgY3VycmVudFN0YXJ0TG9jYXRpb24gPSAwO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XHJcbiAgICBjb25zdCBjaGlsZENvdW50ID0gaXRlbS5jaGlsZHJlbiA/IGl0ZW0uY2hpbGRyZW4ubGVuZ3RoIDogMDtcclxuICAgIGNvbnN0IHRvdGFsRGVncmVlcyA9IGNoaWxkQ291bnQgKiBjaGlsZEFuZ2xlRGlmZmVyZW5jZTtcclxuXHJcblxyXG4gICAgY29uc3QgZW5kRGVncmVlID0gY3VycmVudFN0YXJ0TG9jYXRpb24gKyAoY2hpbGRDb3VudCAqIGNoaWxkQW5nbGVEaWZmZXJlbmNlKTtcclxuXHJcbiAgICBjb25zdCBtaWRkbGVEZWdyZWUgPSAoZW5kRGVncmVlIC0gY3VycmVudFN0YXJ0TG9jYXRpb24pIC8gMjtcclxuXHJcblxyXG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSB7fTtcclxuICAgIGN1cnJlbnRJdGVtWydpdGVtJ10gPSBpdGVtO1xyXG4gICAgY3VycmVudEl0ZW1bJ3N0YXJ0RGVncmVlJ10gPSBjdXJyZW50U3RhcnRMb2NhdGlvbjtcclxuICAgIGN1cnJlbnRJdGVtWydtaWRkbGVEZWdyZWUnXSA9IG1pZGRsZURlZ3JlZTtcclxuICAgIGN1cnJlbnRJdGVtWydlbmREZWdyZWUnXSA9IGVuZERlZ3JlZTtcclxuXHJcbiAgICBpZiAoY2hpbGRDb3VudCA+IDApIHtcclxuXHJcblxyXG4gICAgICBjdXJyZW50SXRlbVsnY2hpbGRyZW4nXSA9IGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW46IGl0ZW0uY2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2U6IHRvdGFsRGVncmVlc30pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U3RhcnRMb2NhdGlvbiA9IGN1cnJlbnRTdGFydExvY2F0aW9uICsgKGNoaWxkQ291bnQgKiBjaGlsZEFuZ2xlRGlmZmVyZW5jZSk7XHJcbiAgICByZXN1bHRzLnB1c2goY3VycmVudEl0ZW0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQW5nbGVzQmFzZWRPblBhcmVudChpdGVtcykge1xyXG5cclxuICBjb25zdCBudW0gPSBpdGVtcy5sZW5ndGg7XHJcbiAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICBsZXQgYW5nbGVEaWZmZXJlbmNlID0gMzYwIC8gbnVtO1xyXG5cclxuICBjb25zdCBkYXRhID0gZ2V0SW5pdGlhbFBvc2l0aW9uKDAsIDM2MCwgbnVtKTtcclxuXHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICBjb25zdFxyXG4gICAgICB7c3RhcnREZWdyZWUsIG1pZGRsZURlZ3JlZSwgZW5kRGVncmVlfSA9IGdldERlZ3JlZUZvckluZGV4QmFzZWRPblNwbGl0QW5nbGUoaSwgZGF0YSk7XHJcblxyXG5cclxuICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0ge307XHJcbiAgICBjdXJyZW50SXRlbVsnaXRlbSddID0gaXRlbTtcclxuICAgIGN1cnJlbnRJdGVtWydzdGFydERlZ3JlZSddID0gc3RhcnREZWdyZWU7XHJcbiAgICBjdXJyZW50SXRlbVsnbWlkZGxlRGVncmVlJ10gPSBtaWRkbGVEZWdyZWU7XHJcbiAgICBjdXJyZW50SXRlbVsnZW5kRGVncmVlJ10gPSBlbmREZWdyZWU7XHJcblxyXG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0uY2hpbGRyZW4pLmxlbmd0aCA+IDA7XHJcbiAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcclxuXHJcblxyXG4gICAgICBjdXJyZW50SXRlbVsnY2hpbGRyZW4nXSA9IGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW46IGl0ZW0uY2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2V9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRJdGVtKTtcclxuICB9XHJcblxyXG5cclxuICByZXR1cm4gcmVzdWx0cztcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2V9KSB7XHJcblxyXG5cclxuICBjb25zdCBjb3VudCA9IGNoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgY29uc3QgY2hpbGRJdGVtcyA9IFtdO1xyXG4gIGNvbnN0IGRhdGEgPSBnZXRJbml0aWFsUG9zaXRpb24oY3VycmVudEl0ZW1bJ3N0YXJ0RGVncmVlJ10sIGFuZ2xlRGlmZmVyZW5jZSwgY291bnQpO1xyXG5cclxuXHJcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7XHJcbiAgICBjb25zdCBjaGlsZEl0ZW0gPSB7fTtcclxuXHJcblxyXG4gICAgY2hpbGRJdGVtWydpdGVtJ10gPSBjaGlsZHJlbltqXTtcclxuXHJcblxyXG4gICAgY29uc3RcclxuICAgICAge3N0YXJ0RGVncmVlLCBtaWRkbGVEZWdyZWUsIGVuZERlZ3JlZX0gPSBnZXREZWdyZWVGb3JJbmRleEJhc2VkT25TcGxpdEFuZ2xlKGosIGRhdGEpO1xyXG5cclxuXHJcbiAgICBjaGlsZEl0ZW1bJ3N0YXJ0RGVncmVlJ10gPSBzdGFydERlZ3JlZTtcclxuICAgIGNoaWxkSXRlbVsnbWlkZGxlRGVncmVlJ10gPSBtaWRkbGVEZWdyZWU7XHJcbiAgICBjaGlsZEl0ZW1bJ2VuZERlZ3JlZSddID0gZW5kRGVncmVlO1xyXG5cclxuICAgIGNoaWxkSXRlbXMucHVzaChjaGlsZEl0ZW0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHJldHVybiBjaGlsZEl0ZW1zO1xyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25zT25BbmdsZXMoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdlbHMpIHtcclxuXHJcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYW5nZWxzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgY29uc3QgZGVncmVlVG9CZURyYXduID0gYW5nZWxzW2ldO1xyXG4gICAgcmVzdWx0cy5wdXNoKHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBkZWdyZWVUb0JlRHJhd24pKTtcclxuXHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uXHJcbmdldFBvaW50c09uQ2lyY2xlQXRBbmdlbHMoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdlbHMpIHtcclxuXHJcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYW5nZWxzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgY29uc3QgZGVncmVlVG9CZURyYXduID0gYW5nZWxzW2ldO1xyXG4gICAgcmVzdWx0cy5wdXNoKHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBkZWdyZWVUb0JlRHJhd24pKTtcclxuXHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcbiJdfQ==