@@ -42,9 +42,9 @@ | |||
* ...or include within your HTML | |||
```html | |||
<script src="https://cdn.jsdelivr.net/npm/frappe-charts@0.0.8/dist/frappe-charts.min.iife.js"></script> | |||
<script src="https://cdn.jsdelivr.net/npm/frappe-charts@1.0.0/dist/frappe-charts.min.iife.js"></script> | |||
<!-- or --> | |||
<script src="https://unpkg.com/frappe-charts@0.0.8/dist/frappe-charts.min.iife.js"></script> | |||
<script src="https://unpkg.com/frappe-charts@1.0.0/dist/frappe-charts.min.iife.js"></script> | |||
``` | |||
#### Usage | |||
@@ -55,27 +55,22 @@ const data = { | |||
], | |||
datasets: [ | |||
{ | |||
title: "Some Data", | |||
title: "Some Data", type: "bar", | |||
values: [25, 40, 30, 35, 8, 52, 17, -4] | |||
}, | |||
{ | |||
title: "Another Set", | |||
title: "Another Set", type: "line", | |||
values: [25, 50, -10, 15, 18, 32, 27, 14] | |||
} | |||
] | |||
} | |||
const chart = new Chart({ | |||
parent: "#chart", // or a DOM element | |||
const chart = new Chart("#chart", { // or a DOM element | |||
title: "My Awesome Chart", | |||
data: data, | |||
type: 'bar', // or 'line', 'scatter', 'pie', 'percentage' | |||
type: 'axis-mixed', // or 'bar', 'line', 'scatter', 'pie', 'percentage' | |||
height: 250, | |||
colors: ['#7cd6fd', '#743ee2'], | |||
format_tooltip_x: d => (d + '').toUpperCase(), | |||
format_tooltip_y: d => d + ' pts' | |||
colors: ['#7cd6fd', '#743ee2'] | |||
}) | |||
``` | |||
@@ -88,6 +83,16 @@ If you want to contribute: | |||
#### Updates | |||
##### v1.0.0 | |||
- Major rewrite out. Some new features include: | |||
- Mixed type axis datasets | |||
- Stacked bar charts | |||
- Value over data points | |||
- Y Markers and regions | |||
- Dot size, Bar space size, and other options | |||
- Legend for axis charts | |||
- We would be looking to incorporate existing PRs and issues in the meantime. | |||
##### Please read [#93](https://github.com/frappe/charts/issues/93) for v0.1.0 updates on rework and development. | |||
##### v0.0.7 | |||
@@ -230,6 +230,10 @@ const DEFAULT_CHAR_WIDTH = 7; | |||
const ANGLE_RATIO = Math.PI / 180; | |||
const FULL_ANGLE = 360; | |||
/** | |||
* Returns the value of a number upto 2 decimal places. | |||
* @param {Number} d Any number | |||
*/ | |||
function floatTwo(d) { | |||
return parseFloat(d.toFixed(2)); | |||
} | |||
@@ -306,113 +310,11 @@ function equilizeNoOfElements(array1, array2, | |||
return [array1, array2]; | |||
} | |||
const UNIT_ANIM_DUR = 350; | |||
const PATH_ANIM_DUR = 350; | |||
const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR; | |||
const REPLACE_ALL_NEW_DUR = 250; | |||
const STD_EASING = 'easein'; | |||
function translate(unit, oldCoord, newCoord, duration) { | |||
let old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', '); | |||
return [ | |||
unit, | |||
{transform: newCoord.join(', ')}, | |||
duration, | |||
STD_EASING, | |||
"translate", | |||
{transform: old} | |||
]; | |||
} | |||
function translateVertLine(xLine, newX, oldX) { | |||
return translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR); | |||
} | |||
function translateHoriLine(yLine, newY, oldY) { | |||
return translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR); | |||
} | |||
function animateRegion(rectGroup, newY1, newY2, oldY2) { | |||
let newHeight = newY1 - newY2; | |||
let rect = rectGroup.childNodes[0]; | |||
let width = rect.getAttribute("width"); | |||
let rectAnim = [ | |||
rect, | |||
{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` }, | |||
MARKER_LINE_ANIM_DUR, | |||
STD_EASING | |||
]; | |||
let groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR); | |||
return [rectAnim, groupAnim]; | |||
} | |||
function animateBar(bar, x, yTop, width, offset=0, index=0, meta={}) { | |||
let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine); | |||
y -= offset; | |||
if(bar.nodeName !== 'rect') { | |||
let rect = bar.childNodes[0]; | |||
let rectAnim = [ | |||
rect, | |||
{width: width, height: height}, | |||
UNIT_ANIM_DUR, | |||
STD_EASING | |||
]; | |||
let oldCoordStr = bar.getAttribute("transform").split("(")[1].slice(0, -1); | |||
let groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); | |||
return [rectAnim, groupAnim]; | |||
} else { | |||
return [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]]; | |||
} | |||
// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein); | |||
} | |||
function animateDot(dot, x, y) { | |||
if(dot.nodeName !== 'circle') { | |||
let oldCoordStr = dot.getAttribute("transform").split("(")[1].slice(0, -1); | |||
let groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); | |||
return [groupAnim]; | |||
} else { | |||
return [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]]; | |||
} | |||
// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein); | |||
} | |||
function animatePath(paths, newXList, newYList, zeroLine) { | |||
let pathComponents = []; | |||
let pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)); | |||
let pathStr = pointsStr.join("L"); | |||
const animPath = [paths.path, {d:"M"+pathStr}, PATH_ANIM_DUR, STD_EASING]; | |||
pathComponents.push(animPath); | |||
if(paths.region) { | |||
let regStartPt = `${newXList[0]},${zeroLine}L`; | |||
let regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`; | |||
const animRegion = [ | |||
paths.region, | |||
{d:"M" + regStartPt + pathStr + regEndPt}, | |||
PATH_ANIM_DUR, | |||
STD_EASING | |||
]; | |||
pathComponents.push(animRegion); | |||
} | |||
return pathComponents; | |||
} | |||
function animatePathStr(oldPath, pathStr) { | |||
return [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING]; | |||
} | |||
const AXIS_TICK_LENGTH = 6; | |||
const LABEL_MARGIN = 4; | |||
const FONT_SIZE = 10; | |||
const BASE_LINE_COLOR = '#dadada'; | |||
function $$1(expr, con) { | |||
return typeof expr === "string"? (con || document).querySelector(expr) : expr || null; | |||
} | |||
@@ -647,6 +549,8 @@ function yLine(y, label, width, options={}) { | |||
x2 = width; | |||
} | |||
// let offset = options.pos === 'left' ? -1 * options.offset : options.offset; | |||
x1 += options.offset; | |||
x2 += options.offset; | |||
@@ -793,7 +697,7 @@ function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) | |||
} | |||
} | |||
function datasetDot(x, y, radius, color, label='', index=0, meta={}) { | |||
function datasetDot(x, y, radius, color, label='', index=0) { | |||
let dot = createSVG('circle', { | |||
style: `fill: ${color}`, | |||
'data-point-index': index, | |||
@@ -904,10 +808,10 @@ let updateOverlay = { | |||
} | |||
let attributes = ['x', 'y', 'width', 'height']; | |||
Object.values(unit.attributes) | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
if(transformValue) { | |||
overlay.setAttribute('transform', transformValue); | |||
@@ -922,10 +826,10 @@ let updateOverlay = { | |||
} | |||
let attributes = ['cx', 'cy']; | |||
Object.values(unit.attributes) | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
if(transformValue) { | |||
overlay.setAttribute('transform', transformValue); | |||
@@ -1027,6 +931,109 @@ function getDifferentChart(type, current_type, parent, args) { | |||
return new Chart(parent, args); | |||
} | |||
const UNIT_ANIM_DUR = 350; | |||
const PATH_ANIM_DUR = 350; | |||
const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR; | |||
const REPLACE_ALL_NEW_DUR = 250; | |||
const STD_EASING = 'easein'; | |||
function translate(unit, oldCoord, newCoord, duration) { | |||
let old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', '); | |||
return [ | |||
unit, | |||
{transform: newCoord.join(', ')}, | |||
duration, | |||
STD_EASING, | |||
"translate", | |||
{transform: old} | |||
]; | |||
} | |||
function translateVertLine(xLine, newX, oldX) { | |||
return translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR); | |||
} | |||
function translateHoriLine(yLine, newY, oldY) { | |||
return translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR); | |||
} | |||
function animateRegion(rectGroup, newY1, newY2, oldY2) { | |||
let newHeight = newY1 - newY2; | |||
let rect = rectGroup.childNodes[0]; | |||
let width = rect.getAttribute("width"); | |||
let rectAnim = [ | |||
rect, | |||
{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` }, | |||
MARKER_LINE_ANIM_DUR, | |||
STD_EASING | |||
]; | |||
let groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR); | |||
return [rectAnim, groupAnim]; | |||
} | |||
function animateBar(bar, x, yTop, width, offset=0, meta={}) { | |||
let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine); | |||
y -= offset; | |||
if(bar.nodeName !== 'rect') { | |||
let rect = bar.childNodes[0]; | |||
let rectAnim = [ | |||
rect, | |||
{width: width, height: height}, | |||
UNIT_ANIM_DUR, | |||
STD_EASING | |||
]; | |||
let oldCoordStr = bar.getAttribute("transform").split("(")[1].slice(0, -1); | |||
let groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); | |||
return [rectAnim, groupAnim]; | |||
} else { | |||
return [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]]; | |||
} | |||
// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein); | |||
} | |||
function animateDot(dot, x, y) { | |||
if(dot.nodeName !== 'circle') { | |||
let oldCoordStr = dot.getAttribute("transform").split("(")[1].slice(0, -1); | |||
let groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); | |||
return [groupAnim]; | |||
} else { | |||
return [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]]; | |||
} | |||
// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein); | |||
} | |||
function animatePath(paths, newXList, newYList, zeroLine) { | |||
let pathComponents = []; | |||
let pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)); | |||
let pathStr = pointsStr.join("L"); | |||
const animPath = [paths.path, {d:"M"+pathStr}, PATH_ANIM_DUR, STD_EASING]; | |||
pathComponents.push(animPath); | |||
if(paths.region) { | |||
let regStartPt = `${newXList[0]},${zeroLine}L`; | |||
let regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`; | |||
const animRegion = [ | |||
paths.region, | |||
{d:"M" + regStartPt + pathStr + regEndPt}, | |||
PATH_ANIM_DUR, | |||
STD_EASING | |||
]; | |||
pathComponents.push(animRegion); | |||
} | |||
return pathComponents; | |||
} | |||
function animatePathStr(oldPath, pathStr) { | |||
return [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING]; | |||
} | |||
// Leveraging SMIL Animations | |||
const EASING = { | |||
@@ -1178,7 +1185,7 @@ class BaseChart { | |||
} | |||
configure(args) { | |||
this.setColors(); | |||
this.setColors(args); | |||
this.setMargins(); | |||
// Bind window events | |||
@@ -1331,8 +1338,8 @@ class BaseChart { | |||
updateNav() { | |||
if(this.config.isNavigable) { | |||
// if(!this.overlayGuides){ | |||
this.makeOverlay(); | |||
this.bindUnits(); | |||
this.makeOverlay(); | |||
this.bindUnits(); | |||
// } else { | |||
// this.updateOverlay(); | |||
// } | |||
@@ -1403,19 +1410,6 @@ class BaseChart { | |||
onDownArrow() {} | |||
onEnterKey() {} | |||
getDataPoint(index = 0) {} | |||
setCurrentDataPoint(point) {} | |||
updateDataset(dataset, index) {} | |||
addDataset(dataset, index) {} | |||
removeDataset(index = 0) {} | |||
updateDatasets(datasets) {} | |||
updateDataPoint(dataPoint, index = 0) {} | |||
addDataPoint(dataPoint, index = 0) {} | |||
removeDataPoint(index = 0) {} | |||
getDifferentChart(type) { | |||
return getDifferentChart(type, this.type, this.parent, this.rawChartArgs); | |||
} | |||
@@ -1795,8 +1789,6 @@ let componentConfigs = { | |||
return this.units; | |||
}, | |||
animateElements(newData) { | |||
let c = this.constants; | |||
let newXPos = newData.xPositions; | |||
let newYPos = newData.yPositions; | |||
let newOffsets = newData.offsets; | |||
@@ -1827,7 +1819,7 @@ let componentConfigs = { | |||
this.store.map((bar, i) => { | |||
animateElements = animateElements.concat(animateBar( | |||
bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], c.index, | |||
bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], | |||
{zeroLine: newData.zeroLine} | |||
)); | |||
}); | |||
@@ -2305,7 +2297,7 @@ function getValueRange(orderedArray) { | |||
} | |||
function scale(val, yAxis) { | |||
return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier) | |||
return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier); | |||
} | |||
function calcDistribution(values, distributionSize) { | |||
@@ -2602,7 +2594,7 @@ function dataPrep(data, type) { | |||
}]; | |||
} | |||
datasets.map((d, i)=> { | |||
datasets.map(d=> { | |||
// Set values | |||
if(!d.values) { | |||
d.values = zeroArray; | |||
@@ -2656,7 +2648,7 @@ function zeroDataPrep(realData) { | |||
name: '', | |||
values: zeroArray.slice(0, -1), | |||
chartType: d.chartType | |||
} | |||
}; | |||
}), | |||
}; | |||
@@ -3256,6 +3248,7 @@ class AxisChart extends BaseChart { | |||
// removeDataPoint(index = 0) {} | |||
} | |||
// import MultiAxisChart from './charts/MultiAxisChart'; | |||
const chartTypes = { | |||
// multiaxis: MultiAxisChart, | |||
percentage: PercentageChart, | |||
@@ -289,7 +289,7 @@ | |||
<p class="step-explain">And include it in your project</p> | |||
<pre><code class="hljs javascript"> import Chart from "frappe-charts/dist/frappe-charts.min.esm"</code></pre> | |||
<p class="step-explain">... or include it directly in your HTML</p> | |||
<pre><code class="hljs html"> <script src="https://unpkg.com/frappe-charts@0.0.8/dist/frappe-charts.min.iife.js"></script></code></pre> | |||
<pre><code class="hljs html"> <script src="https://unpkg.com/frappe-charts@1.0.0/dist/frappe-charts.min.iife.js"></script></code></pre> | |||
</div> | |||
</div> | |||
@@ -53,7 +53,7 @@ | |||
<p class="step-explain">And include it in your project</p> | |||
<pre><code class="hljs javascript"> import Chart from "frappe-charts/dist/frappe-charts.min.esm"</code></pre> | |||
<p class="step-explain">... or include it directly in your HTML</p> | |||
<pre><code class="hljs html"> <script src="https://unpkg.com/frappe-charts@0.0.8/dist/frappe-charts.min.iife.js"></script></code></pre> | |||
<pre><code class="hljs html"> <script src="https://unpkg.com/frappe-charts@1.0.0/dist/frappe-charts.min.iife.js"></script></code></pre> | |||
<p class="step-explain">Make a new Chart</p> | |||
<pre><code class="hljs html"> <!--HTML--> | |||
<div id="chart"></div></code></pre> | |||
@@ -2572,7 +2572,7 @@ | |||
} | |||
}, | |||
"minimist": { | |||
"version": "0.0.8", | |||
"version": "1.0.0", | |||
"bundled": true, | |||
"dev": true | |||
}, | |||
@@ -2581,7 +2581,7 @@ | |||
"bundled": true, | |||
"dev": true, | |||
"requires": { | |||
"minimist": "0.0.8" | |||
"minimist": "1.0.0" | |||
} | |||
}, | |||
"ms": { | |||
@@ -4054,8 +4054,8 @@ | |||
} | |||
}, | |||
"minimist": { | |||
"version": "0.0.8", | |||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", | |||
"version": "1.0.0", | |||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.0.0.tgz", | |||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", | |||
"dev": true | |||
}, | |||
@@ -4065,7 +4065,7 @@ | |||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", | |||
"dev": true, | |||
"requires": { | |||
"minimist": "0.0.8" | |||
"minimist": "1.0.0" | |||
} | |||
}, | |||
"ms": { | |||
@@ -1,6 +1,6 @@ | |||
{ | |||
"name": "frappe-charts", | |||
"version": "0.0.8", | |||
"version": "1.0.0", | |||
"description": "https://frappe.github.io/charts", | |||
"main": "dist/frappe-charts.min.cjs.js", | |||
"module": "dist/frappe-charts.min.esm.js", | |||
@@ -1,5 +1,5 @@ | |||
import BaseChart from './BaseChart'; | |||
import { $, getOffset } from '../utils/dom'; | |||
import { $ } from '../utils/dom'; | |||
export default class AggregationChart extends BaseChart { | |||
constructor(parent, args) { | |||
@@ -174,7 +174,7 @@ export default class AxisChart extends BaseChart { | |||
if(this.data.yRegions) { | |||
this.data.yRegions.map(d => { | |||
allValueLists.push([d.end, d.start]); | |||
}) | |||
}); | |||
} | |||
return [].concat(...allValueLists); | |||
@@ -1,7 +1,6 @@ | |||
import SvgTip from '../objects/SvgTip'; | |||
import { $, isElementInViewport, getElementContentWidth } from '../utils/dom'; | |||
import { makeSVGContainer, makeSVGDefs, makeSVGGroup } from '../utils/draw'; | |||
import { getStringWidth } from '../utils/helpers'; | |||
import { VERT_SPACE_OUTSIDE_BASE_CHART, TRANSLATE_Y_BASE_CHART, LEFT_MARGIN_BASE_CHART, | |||
RIGHT_MARGIN_BASE_CHART, INIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT } from '../utils/constants'; | |||
import { getColor, DEFAULT_COLORS } from '../utils/colors'; | |||
@@ -44,7 +43,7 @@ export default class BaseChart { | |||
} | |||
configure(args) { | |||
this.setColors(); | |||
this.setColors(args); | |||
this.setMargins(); | |||
// Bind window events | |||
@@ -197,8 +196,8 @@ export default class BaseChart { | |||
updateNav() { | |||
if(this.config.isNavigable) { | |||
// if(!this.overlayGuides){ | |||
this.makeOverlay(); | |||
this.bindUnits(); | |||
this.makeOverlay(); | |||
this.bindUnits(); | |||
// } else { | |||
// this.updateOverlay(); | |||
// } | |||
@@ -269,19 +268,6 @@ export default class BaseChart { | |||
onDownArrow() {} | |||
onEnterKey() {} | |||
getDataPoint(index = 0) {} | |||
setCurrentDataPoint(point) {} | |||
updateDataset(dataset, index) {} | |||
addDataset(dataset, index) {} | |||
removeDataset(index = 0) {} | |||
updateDatasets(datasets) {} | |||
updateDataPoint(dataPoint, index = 0) {} | |||
addDataPoint(dataPoint, index = 0) {} | |||
removeDataPoint(index = 0) {} | |||
getDifferentChart(type) { | |||
return getDifferentChart(type, this.type, this.parent, this.rawChartArgs); | |||
} | |||
@@ -235,8 +235,6 @@ let componentConfigs = { | |||
return this.units; | |||
}, | |||
animateElements(newData) { | |||
let c = this.constants; | |||
let newXPos = newData.xPositions; | |||
let newYPos = newData.yPositions; | |||
let newOffsets = newData.offsets; | |||
@@ -267,7 +265,7 @@ let componentConfigs = { | |||
this.store.map((bar, i) => { | |||
animateElements = animateElements.concat(animateBar( | |||
bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], c.index, | |||
bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], | |||
{zeroLine: newData.zeroLine} | |||
)); | |||
}); | |||
@@ -36,13 +36,13 @@ export function animateRegion(rectGroup, newY1, newY2, oldY2) { | |||
{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` }, | |||
MARKER_LINE_ANIM_DUR, | |||
STD_EASING | |||
] | |||
]; | |||
let groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR); | |||
return [rectAnim, groupAnim]; | |||
} | |||
export function animateBar(bar, x, yTop, width, offset=0, index=0, meta={}) { | |||
export function animateBar(bar, x, yTop, width, offset=0, meta={}) { | |||
let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine); | |||
y -= offset; | |||
if(bar.nodeName !== 'rect') { | |||
@@ -52,7 +52,7 @@ export function animateBar(bar, x, yTop, width, offset=0, index=0, meta={}) { | |||
{width: width, height: height}, | |||
UNIT_ANIM_DUR, | |||
STD_EASING | |||
] | |||
]; | |||
let oldCoordStr = bar.getAttribute("transform").split("(")[1].slice(0, -1); | |||
let groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); | |||
@@ -1,4 +1,4 @@ | |||
import { floatTwo, fillArray } from '../utils/helpers'; | |||
import { fillArray } from '../utils/helpers'; | |||
import { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants'; | |||
export function dataPrep(data, type) { | |||
@@ -16,7 +16,7 @@ export function dataPrep(data, type) { | |||
}]; | |||
} | |||
datasets.map((d, i)=> { | |||
datasets.map(d=> { | |||
// Set values | |||
if(!d.values) { | |||
d.values = zeroArray; | |||
@@ -70,7 +70,7 @@ export function zeroDataPrep(realData) { | |||
name: '', | |||
values: zeroArray.slice(0, -1), | |||
chartType: d.chartType | |||
} | |||
}; | |||
}), | |||
}; | |||
@@ -1,13 +1,11 @@ | |||
import { getBarHeightAndYAttr } from './draw-utils'; | |||
import { getStringWidth } from './helpers'; | |||
import { STD_EASING, UNIT_ANIM_DUR, MARKER_LINE_ANIM_DUR, PATH_ANIM_DUR } from './animate'; | |||
import { DOT_OVERLAY_SIZE_INCR } from './constants'; | |||
const AXIS_TICK_LENGTH = 6; | |||
const LABEL_MARGIN = 4; | |||
export const FONT_SIZE = 10; | |||
const BASE_LINE_COLOR = '#dadada'; | |||
const BASE_BG_COLOR = '#F7FAFC'; | |||
function $(expr, con) { | |||
return typeof expr === "string"? (con || document).querySelector(expr) : expr || null; | |||
@@ -245,11 +243,11 @@ export function yLine(y, label, width, options={}) { | |||
let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; | |||
if(options.mode === 'tick' && options.pos === 'right') { | |||
x1 = width + AXIS_TICK_LENGTH | |||
x1 = width + AXIS_TICK_LENGTH; | |||
x2 = width; | |||
} | |||
let offset = options.pos === 'left' ? -1 * options.offset : options.offset; | |||
// let offset = options.pos === 'left' ? -1 * options.offset : options.offset; | |||
x1 += options.offset; | |||
x2 += options.offset; | |||
@@ -397,7 +395,7 @@ export function datasetBar(x, yTop, width, color, label='', index=0, offset=0, m | |||
} | |||
} | |||
export function datasetDot(x, y, radius, color, label='', index=0, meta={}) { | |||
export function datasetDot(x, y, radius, color, label='', index=0) { | |||
let dot = createSVG('circle', { | |||
style: `fill: ${color}`, | |||
'data-point-index': index, | |||
@@ -448,7 +446,7 @@ export function getPaths(xList, yList, color, options={}, meta={}) { | |||
let paths = { | |||
path: path | |||
} | |||
}; | |||
// Region | |||
if(options.regionFill) { | |||
@@ -497,7 +495,7 @@ export let makeOverlay = { | |||
} | |||
return overlay; | |||
} | |||
} | |||
}; | |||
export let updateOverlay = { | |||
'bar': (unit, overlay) => { | |||
@@ -508,10 +506,10 @@ export let updateOverlay = { | |||
} | |||
let attributes = ['x', 'y', 'width', 'height']; | |||
Object.values(unit.attributes) | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
if(transformValue) { | |||
overlay.setAttribute('transform', transformValue); | |||
@@ -526,14 +524,13 @@ export let updateOverlay = { | |||
} | |||
let attributes = ['cx', 'cy']; | |||
Object.values(unit.attributes) | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
.filter(attr => attributes.includes(attr.name) && attr.specified) | |||
.map(attr => { | |||
overlay.setAttribute(attr.name, attr.nodeValue); | |||
}); | |||
if(transformValue) { | |||
overlay.setAttribute('transform', transformValue); | |||
} | |||
} | |||
} | |||
}; |
@@ -70,7 +70,7 @@ export function bindChange(obj, getFn, setFn) { | |||
setFn(); | |||
return Reflect.set(target, prop, value); | |||
}, | |||
get: function(target, prop, value) { | |||
get: function(target, prop) { | |||
getFn(); | |||
return Reflect.get(target, prop); | |||
} | |||
@@ -197,7 +197,7 @@ export function getValueRange(orderedArray) { | |||
} | |||
export function scale(val, yAxis) { | |||
return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier) | |||
return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier); | |||
} | |||
export function calcDistribution(values, distributionSize) { | |||