angular-sunburst-radar-chart
Version:
A Sunburst Radar chart with SVG,No Dependencies
44 lines • 6.3 kB
JavaScript
import { getCurrentPointFromEvent } from './utils';
import { calculateAngleRadian } from './trignometry';
export function createSvgHandlerWithSelector(selectorName, center) {
const svg = document.querySelector(selectorName);
const pt = svg.createSVGPoint();
const maxRad = 6.283185307179586;
const maxDeg = 360;
return {
initPoint: 0,
cursorPoint(evt) {
const { x, y } = getCurrentPointFromEvent(evt);
pt.x = x;
pt.y = y;
return pt.matrixTransform(svg.getScreenCTM().inverse());
},
startDrag(evt, initialPoint) {
this.previousPoint = this.angleFromCenter(evt);
this.initPoint = initialPoint;
},
updateInitPointFromCurrentPoint(currentPoint) {
const difference = Math.abs(this.previousPoint - currentPoint);
if (currentPoint < this.previousPoint) {
this.initPoint += difference;
}
else {
this.initPoint -= difference;
}
},
getRotationAngle(evt) {
const currentPoint = this.angleFromCenter(evt);
this.updateInitPointFromCurrentPoint(currentPoint);
this.previousPoint = currentPoint;
return this.initPoint;
},
angleFromCenter(evt) {
const [centerX, centerY] = [center.x, center.y];
const { x, y } = this.cursorPoint(evt);
const angleInRadian = calculateAngleRadian({ x, y, centerX, centerY, maxRad });
const currentDegree = maxDeg * angleInRadian / (2 * Math.PI);
return currentDegree;
}
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLXJvdGF0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXN1bmJ1cnN0LXJhZGFyLWNoYXJ0LyIsInNvdXJjZXMiOlsibGliL3V0aWxzL3N2Zy1yb3RhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbkQsTUFBTSxVQUFVLDRCQUE0QixDQUFDLFlBQVksRUFBRSxNQUFNO0lBQy9ELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakQsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBR2hDLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUduQixPQUFPO1FBRUwsU0FBUyxFQUFFLENBQUM7UUFHWixXQUFXLENBQUMsR0FBRztZQUNiLE1BQU0sRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNULE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUUxRCxDQUFDO1FBQ0QsU0FBUyxDQUFDLEdBQUcsRUFBRSxZQUFZO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztRQUNoQyxDQUFDO1FBQ0QsK0JBQStCLENBQUMsWUFBWTtZQUUxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDLENBQUM7WUFDL0QsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7YUFDOUI7UUFFSCxDQUFDO1FBQ0QsZ0JBQWdCLENBQUMsR0FBRztZQUNsQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRS9DLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztZQUVsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFeEIsQ0FBQztRQUVELGVBQWUsQ0FBQyxHQUFHO1lBRWpCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFckMsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLGFBQWEsR0FBRyxNQUFNLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RCxPQUFPLGFBQWEsQ0FBQztRQUV2QixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dldEN1cnJlbnRQb2ludEZyb21FdmVudH0gZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7Y2FsY3VsYXRlQW5nbGVSYWRpYW59IGZyb20gJy4vdHJpZ25vbWV0cnknO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN2Z0hhbmRsZXJXaXRoU2VsZWN0b3Ioc2VsZWN0b3JOYW1lLCBjZW50ZXIpIHtcclxuICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yTmFtZSk7XHJcbiAgY29uc3QgcHQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcclxuXHJcblxyXG4gIGNvbnN0IG1heFJhZCA9IDYuMjgzMTg1MzA3MTc5NTg2O1xyXG4gIGNvbnN0IG1heERlZyA9IDM2MDtcclxuXHJcblxyXG4gIHJldHVybiB7XHJcblxyXG4gICAgaW5pdFBvaW50OiAwLFxyXG5cclxuXHJcbiAgICBjdXJzb3JQb2ludChldnQpIHtcclxuICAgICAgY29uc3Qge3gsIHl9ID0gZ2V0Q3VycmVudFBvaW50RnJvbUV2ZW50KGV2dCk7XHJcbiAgICAgIHB0LnggPSB4O1xyXG4gICAgICBwdC55ID0geTtcclxuICAgICAgcmV0dXJuIHB0Lm1hdHJpeFRyYW5zZm9ybShzdmcuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcclxuXHJcbiAgICB9LFxyXG4gICAgc3RhcnREcmFnKGV2dCwgaW5pdGlhbFBvaW50KSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXNQb2ludCA9IHRoaXMuYW5nbGVGcm9tQ2VudGVyKGV2dCk7XHJcbiAgICAgIHRoaXMuaW5pdFBvaW50ID0gaW5pdGlhbFBvaW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZUluaXRQb2ludEZyb21DdXJyZW50UG9pbnQoY3VycmVudFBvaW50KSB7XHJcblxyXG4gICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnModGhpcy5wcmV2aW91c1BvaW50IC0gY3VycmVudFBvaW50KTtcclxuICAgICAgaWYgKGN1cnJlbnRQb2ludCA8IHRoaXMucHJldmlvdXNQb2ludCkge1xyXG4gICAgICAgIHRoaXMuaW5pdFBvaW50ICs9IGRpZmZlcmVuY2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pbml0UG9pbnQgLT0gZGlmZmVyZW5jZTtcclxuICAgICAgfVxyXG5cclxuICAgIH0sXHJcbiAgICBnZXRSb3RhdGlvbkFuZ2xlKGV2dCkge1xyXG4gICAgICBjb25zdCBjdXJyZW50UG9pbnQgPSB0aGlzLmFuZ2xlRnJvbUNlbnRlcihldnQpO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVJbml0UG9pbnRGcm9tQ3VycmVudFBvaW50KGN1cnJlbnRQb2ludCk7XHJcbiAgICAgIHRoaXMucHJldmlvdXNQb2ludCA9IGN1cnJlbnRQb2ludDtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmluaXRQb2ludDtcclxuXHJcbiAgICB9LFxyXG5cclxuICAgIGFuZ2xlRnJvbUNlbnRlcihldnQpIHtcclxuXHJcbiAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IFtjZW50ZXIueCwgY2VudGVyLnldO1xyXG4gICAgICBjb25zdCB7eCwgeX0gPSB0aGlzLmN1cnNvclBvaW50KGV2dCk7XHJcblxyXG4gICAgICBjb25zdCBhbmdsZUluUmFkaWFuID0gY2FsY3VsYXRlQW5nbGVSYWRpYW4oe3gsIHksIGNlbnRlclgsIGNlbnRlclksIG1heFJhZH0pO1xyXG4gICAgICBjb25zdCBjdXJyZW50RGVncmVlID0gbWF4RGVnICogYW5nbGVJblJhZGlhbiAvICgyICogTWF0aC5QSSk7XHJcbiAgICAgIHJldHVybiBjdXJyZW50RGVncmVlO1xyXG5cclxuICAgIH1cclxuICB9O1xyXG59XHJcbiJdfQ==