@@ -301,6 +301,10 @@ class SvgTip { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* Returns the value of a number upto 2 decimal places. | |||||
* @param {Number} d Any number | |||||
*/ | |||||
function floatTwo(d) { | function floatTwo(d) { | ||||
return parseFloat(d.toFixed(2)); | return parseFloat(d.toFixed(2)); | ||||
} | } | ||||
@@ -51,8 +51,11 @@ section figure { | |||||
border-radius: 3px; | border-radius: 3px; | ||||
overflow: auto; | overflow: auto; | ||||
} | } | ||||
section code { | |||||
margin-top: 1rem; /* SAME 2 */ | |||||
.btn, .btn-group { | |||||
margin-bottom: 1rem; | |||||
} | |||||
.btn-group { | |||||
margin-right: 0.5rem; | |||||
} | } | ||||
h1 { | h1 { | ||||
font-size: 3.5rem; | font-size: 3.5rem; | ||||
@@ -1,4 +1,4 @@ | |||||
import { lineCompositeData, barCompositeData, trendsData, heatmapData } from './data'; | |||||
import { lineCompositeData, barCompositeData, typeData, trendsData, heatmapData } from './data'; | |||||
import { HEATMAP_COLORS_YELLOW, HEATMAP_COLORS_BLUE } from '../../../src/js/utils/constants'; | import { HEATMAP_COLORS_YELLOW, HEATMAP_COLORS_BLUE } from '../../../src/js/utils/constants'; | ||||
export default { | export default { | ||||
@@ -35,12 +35,8 @@ export default { | |||||
}, | }, | ||||
demoMain: { | demoMain: { | ||||
title: "Creating a Chart", | |||||
title: "Create a Chart", | |||||
contentBlocks: [ | contentBlocks: [ | ||||
{ | |||||
type: "text", | |||||
content: `Booga wooga wooga Booga Booga wooga`, | |||||
}, | |||||
{ | { | ||||
type: "code", | type: "code", | ||||
lang: "html", | lang: "html", | ||||
@@ -94,7 +90,7 @@ export default { | |||||
type: "demo", | type: "demo", | ||||
config: { | config: { | ||||
title: "My Awesome Chart", | title: "My Awesome Chart", | ||||
data: "typeData", | |||||
data: typeData, | |||||
type: "axis-mixed", | type: "axis-mixed", | ||||
height: 300, | height: 300, | ||||
colors: ["purple", "magenta", "light-blue"], | colors: ["purple", "magenta", "light-blue"], | ||||
@@ -105,20 +101,19 @@ export default { | |||||
formatTooltipY: d => d + ' pts', | formatTooltipY: d => d + ' pts', | ||||
} | } | ||||
}, | }, | ||||
sideContent: {}, | |||||
options: [ | options: [ | ||||
{ | { | ||||
name: "lineOptions", | |||||
path: ["lineOptions"], | |||||
type: "map", | |||||
mapKeys: ['hideLine', 'hideDots', 'heatline', 'regionFill'], | |||||
name: "type", | |||||
path: ["type"], | |||||
type: "string", | |||||
states: { | states: { | ||||
"Line": [0, 1, 0, 0], | |||||
"Dots": [1, 0, 0, 0], | |||||
"HeatLine": [0, 1, 1, 0], | |||||
"Region": [0, 1, 0, 1] | |||||
"Mixed": 'axis-mixed', | |||||
"Line": 'line', | |||||
"Bar": 'bar', | |||||
"Pie Chart": 'pie', | |||||
"Percentage Chart": 'percentage', | |||||
}, | }, | ||||
activeState: "HeatLine" | |||||
activeState: "Mixed" | |||||
} | } | ||||
], | ], | ||||
actions: [{ name: "Export ...", fn: "export", args: [] }], | actions: [{ name: "Export ...", fn: "export", args: [] }], | ||||
@@ -224,5 +219,126 @@ export default { | |||||
});`, | });`, | ||||
} | } | ||||
], | ], | ||||
}, | |||||
codePenDemo: { | |||||
title: "Demo", | |||||
contentBlocks: [ | |||||
{ | |||||
type: "custom", | |||||
html: `<p data-height="299" data-theme-id="light" data-slug-hash="wjKBoq" data-default-tab="js,result" | |||||
data-user="pratu16x7" data-embed-version="2" data-pen-title="Frappe Charts Demo" class="codepen"> | |||||
See the Pen <a href="https://codepen.io/pratu16x7/pen/wjKBoq/">Frappe Charts Demo</a> | |||||
by Prateeksha Singh (<a href="https://codepen.io/pratu16x7">@pratu16x7</a>) on | |||||
<a href="https://codepen.io">CodePen</a>. | |||||
</p>` | |||||
} | |||||
] | |||||
}, | |||||
optionsList: { | |||||
title: "Available Options", | |||||
contentBlocks: [ | |||||
{ | |||||
type: "code", | |||||
lang: "javascript", | |||||
content: ` | |||||
... | |||||
{ | |||||
data: { | |||||
labels: [], | |||||
datasets: [], | |||||
yRegions: [], | |||||
yMarkers: [] | |||||
} | |||||
title: '', | |||||
colors: [], | |||||
height: 200, | |||||
tooltipOptions: { | |||||
formatTooltipX: d => (d + '').toUpperCase(), | |||||
formatTooltipY: d => d + ' pts', | |||||
} | |||||
// Axis charts | |||||
isNavigable: 1, // default: 0 | |||||
valuesOverPoints: 1, // default: 0 | |||||
barOptions: { | |||||
spaceRatio: 1 // default: 0.5 | |||||
stacked: 1 // default: 0 | |||||
} | |||||
lineOptions: { | |||||
dotSize: 6, // default: 4 | |||||
hideLine: 0, // default: 0 | |||||
hideDots: 1, // default: 0 | |||||
heatline: 1, // default: 0 | |||||
regionFill: 1 // default: 0 | |||||
} | |||||
axisOptions: { | |||||
yAxisMode: 'span', // Axis lines, default | |||||
xAxisMode: 'tick', // No axis lines, only short ticks | |||||
xIsSeries: 1 // Allow skipping x values for space | |||||
// default: 0 | |||||
}, | |||||
// Pie/Percentage charts | |||||
maxLegendPoints: 6, // default: 20 | |||||
maxSlices: 10, // default: 20 | |||||
// Percentage chart | |||||
barOptions: { | |||||
height: 15 // default: 20 | |||||
depth: 5 // default: 2 | |||||
} | |||||
// Heatmap | |||||
discreteDomains: 1, // default: 1 | |||||
} | |||||
... | |||||
// Updating values | |||||
chart.update(data); | |||||
// Axis charts: | |||||
chart.addDataPoint(label, valueFromEachDataset, index) | |||||
chart.removeDataPoint(index) | |||||
chart.updateDataset(datasetValues, index) | |||||
// Exporting | |||||
chart.export(); | |||||
// Unbind window-resize events | |||||
chart.unbindWindowEvents(); | |||||
` | |||||
} | |||||
] | |||||
}, | |||||
installation: { | |||||
title: "Install", | |||||
contentBlocks: [ | |||||
{ type: "text", content: 'Install via npm' }, | |||||
{ type: "code", lang: "console", content: ` npm install frappe-charts` }, | |||||
{ type: "text", content: 'And include it in your project' }, | |||||
{ type: "code", lang: "javascript", content: ` import { Chart } from "frappe-charts` }, | |||||
{ type: "text", content: 'Use as:' }, | |||||
{ | |||||
type: "code", | |||||
lang: "javascript", | |||||
content: ` new Chart(); // ES6 module | |||||
// or | |||||
new frappe.Chart(); // Browser`, | |||||
}, | |||||
{ type: "text", content: '... or include it directly in your HTML' }, | |||||
{ | |||||
type: "code", | |||||
lang: "html", | |||||
content: ` <script src="https://unpkg.com/frappe-charts@1.1.0"></script>`, | |||||
}, | |||||
] | |||||
} | } | ||||
} | } |
@@ -1,4 +1,5 @@ | |||||
import { $ } from '../../../src/js/utils/dom'; | import { $ } from '../../../src/js/utils/dom'; | ||||
import { toTitleCase } from '../../../src/js/utils/helpers'; | |||||
export class docSectionBuilder { | export class docSectionBuilder { | ||||
constructor(LIB_OBJ) { | constructor(LIB_OBJ) { | ||||
@@ -26,26 +27,31 @@ export class docSectionBuilder { | |||||
} | } | ||||
getBlock(blockConf) { | getBlock(blockConf) { | ||||
let block; | |||||
let type = blockConf.type; | |||||
if(type === "text") { | |||||
block = this.getText(blockConf); | |||||
} else if(type === "code") { | |||||
block = this.getCode(blockConf); | |||||
let fnName = 'get' + toTitleCase(blockConf.type); | |||||
if(this[fnName]) { | |||||
return this[fnName](blockConf); | |||||
} else { | } else { | ||||
block = this.getDemo(blockConf); | |||||
throw new Error(`Unknown section block type '${blockConf.type}'.`); | |||||
} | } | ||||
} | } | ||||
getText(blockConf) {} | |||||
getText(blockConf) { | |||||
return $.create('p', { | |||||
inside: this.section, | |||||
innerHTML: blockConf.content | |||||
}); | |||||
} | |||||
getCode(blockConf) { | getCode(blockConf) { | ||||
let pre = $.create('pre', { inside: this.section }); | let pre = $.create('pre', { inside: this.section }); | ||||
let lang = blockConf.lang || 'javascript'; | |||||
let code = $.create('code', { | let code = $.create('code', { | ||||
inside: pre, | inside: pre, | ||||
className: `hljs ${blockConf.lang}`, | |||||
className: `hljs ${lang}`, | |||||
innerHTML: blockConf.content | innerHTML: blockConf.content | ||||
}); | }); | ||||
} | } | ||||
getCustom(blockConf) { | |||||
this.section.innerHTML += blockConf.html; | |||||
} | |||||
getDemo(blockConf) { | getDemo(blockConf) { | ||||
let args = blockConf.config; | let args = blockConf.config; | ||||
let figure = $.create('figure', { inside: this.section }); | let figure = $.create('figure', { inside: this.section }); | ||||
@@ -81,7 +87,7 @@ export class docSectionBuilder { | |||||
args[o.path[0]][attr] = state[i]; | args[o.path[0]][attr] = state[i]; | ||||
}) | }) | ||||
} else { | } else { | ||||
// boolean, number, object | |||||
// boolean, string, number, object | |||||
args[o.path[0]] = state; | args[o.path[0]] = state; | ||||
} | } | ||||
this.libObj = new this.LIB_OBJ(figure, args); | this.libObj = new this.LIB_OBJ(figure, args); | ||||
@@ -18,62 +18,10 @@ lineComposite.parent.addEventListener('data-select', (e) => { | |||||
]); | ]); | ||||
}); | }); | ||||
// ================================================================================ | |||||
let customColors = ['purple', 'magenta', 'light-blue']; | |||||
let typeChartArgs = { | |||||
title: "My Awesome Chart", | |||||
data: typeData, | |||||
type: 'axis-mixed', | |||||
height: 300, | |||||
colors: customColors, | |||||
valuesOverPoints: 1, | |||||
// maxLegendPoints: 6, | |||||
maxSlices: 10, | |||||
tooltipOptions: { | |||||
formatTooltipX: d => (d + '').toUpperCase(), | |||||
formatTooltipY: d => d + ' pts', | |||||
} | |||||
}; | |||||
let aggrChart = new Chart("#chart-aggr", typeChartArgs); | |||||
Array.prototype.slice.call( | |||||
document.querySelectorAll('.aggr-type-buttons button') | |||||
).map(el => { | |||||
el.addEventListener('click', (e) => { | |||||
let btn = e.target; | |||||
let type = btn.getAttribute('data-type'); | |||||
typeChartArgs.type = type; | |||||
if(type !== 'axis-mixed') { | |||||
typeChartArgs.colors = undefined; | |||||
} else { | |||||
typeChartArgs.colors = customColors; | |||||
} | |||||
if(type !== 'percentage') { | |||||
typeChartArgs.height = 300; | |||||
} else { | |||||
typeChartArgs.height = undefined; | |||||
} | |||||
let newChart = new Chart("#chart-aggr", typeChartArgs); | |||||
if(newChart){ | |||||
aggrChart = newChart; | |||||
} | |||||
Array.prototype.slice.call( | |||||
btn.parentNode.querySelectorAll('button')).map(el => { | |||||
el.classList.remove('active'); | |||||
}); | |||||
btn.classList.add('active'); | |||||
}); | |||||
}); | |||||
document.querySelector('.export-aggr').addEventListener('click', () => { | |||||
aggrChart.export(); | |||||
}); | |||||
let section = document.querySelector('.demo-main'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.demoMain); | |||||
dcb.make(); | |||||
// Update values chart | // Update values chart | ||||
// ================================================================================ | // ================================================================================ | ||||
@@ -171,7 +119,7 @@ document.querySelector('.export-update').addEventListener('click', () => { | |||||
// Trends Chart | // Trends Chart | ||||
// ================================================================================ | // ================================================================================ | ||||
let section = document.querySelector('.trends-plot'); | |||||
section = document.querySelector('.trends-plot'); | |||||
dcb.setParent(section); | dcb.setParent(section); | ||||
dcb.setSys(dc.trendsPlot); | dcb.setSys(dc.trendsPlot); | ||||
dcb.make(); | dcb.make(); | ||||
@@ -214,3 +162,18 @@ section = document.querySelector('.heatmap'); | |||||
dcb.setParent(section); | dcb.setParent(section); | ||||
dcb.setSys(dc.heatmap); | dcb.setSys(dc.heatmap); | ||||
dcb.make(); | dcb.make(); | ||||
section = document.querySelector('.codepen'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.codePenDemo); | |||||
dcb.make(); | |||||
section = document.querySelector('.options'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.optionsList); | |||||
dcb.make(); | |||||
section = document.querySelector('.installation'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.installation); | |||||
dcb.make(); |
@@ -265,6 +265,14 @@ function getRandomBias(min, max, bias, influence) { | |||||
return rnd * (1 - mix) + biasValue * mix; // mix full range and bias | return rnd * (1 - mix) + biasValue * mix; // mix full range and bias | ||||
} | } | ||||
function toTitleCase(str) { | |||||
return str.replace(/\w*/g, function (txt) { | |||||
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); | |||||
}); | |||||
} | |||||
// Playing around with dates | // Playing around with dates | ||||
@@ -492,11 +500,8 @@ var dc = { | |||||
}, | }, | ||||
demoMain: { | demoMain: { | ||||
title: "Creating a Chart", | |||||
title: "Create a Chart", | |||||
contentBlocks: [{ | contentBlocks: [{ | ||||
type: "text", | |||||
content: 'Booga wooga wooga Booga Booga wooga' | |||||
}, { | |||||
type: "code", | type: "code", | ||||
lang: "html", | lang: "html", | ||||
content: ' <!--HTML-->\n <figure id="frost-chart"></figure>' | content: ' <!--HTML-->\n <figure id="frost-chart"></figure>' | ||||
@@ -508,7 +513,7 @@ var dc = { | |||||
type: "demo", | type: "demo", | ||||
config: { | config: { | ||||
title: "My Awesome Chart", | title: "My Awesome Chart", | ||||
data: "typeData", | |||||
data: typeData, | |||||
type: "axis-mixed", | type: "axis-mixed", | ||||
height: 300, | height: 300, | ||||
colors: ["purple", "magenta", "light-blue"], | colors: ["purple", "magenta", "light-blue"], | ||||
@@ -523,19 +528,18 @@ var dc = { | |||||
} | } | ||||
} | } | ||||
}, | }, | ||||
sideContent: {}, | |||||
options: [{ | options: [{ | ||||
name: "lineOptions", | |||||
path: ["lineOptions"], | |||||
type: "map", | |||||
mapKeys: ['hideLine', 'hideDots', 'heatline', 'regionFill'], | |||||
name: "type", | |||||
path: ["type"], | |||||
type: "string", | |||||
states: { | states: { | ||||
"Line": [0, 1, 0, 0], | |||||
"Dots": [1, 0, 0, 0], | |||||
"HeatLine": [0, 1, 1, 0], | |||||
"Region": [0, 1, 0, 1] | |||||
"Mixed": 'axis-mixed', | |||||
"Line": 'line', | |||||
"Bar": 'bar', | |||||
"Pie Chart": 'pie', | |||||
"Percentage Chart": 'percentage' | |||||
}, | }, | ||||
activeState: "HeatLine" | |||||
activeState: "Mixed" | |||||
}], | }], | ||||
actions: [{ name: "Export ...", fn: "export", args: [] }] | actions: [{ name: "Export ...", fn: "export", args: [] }] | ||||
}] | }] | ||||
@@ -614,6 +618,34 @@ var dc = { | |||||
lang: "javascript", | lang: "javascript", | ||||
content: ' let heatmap = new frappe.Chart("#heatmap", {\n type: \'heatmap\',\n title: "Monthly Distribution",\n data: {\n dataPoints: {\'1524064033\': 8, /* ... */},\n // object with timestamp-value pairs\n start: startDate\n end: endDate // Date objects\n },\n countLabel: \'Level\',\n discreteDomains: 0 // default: 1\n colors: [\'#ebedf0\', \'#c0ddf9\', \'#73b3f3\', \'#3886e1\', \'#17459e\'],\n // Set of five incremental colors,\n // preferably with a low-saturation color for zero data;\n // def: [\'#ebedf0\', \'#c6e48b\', \'#7bc96f\', \'#239a3b\', \'#196127\']\n });' | content: ' let heatmap = new frappe.Chart("#heatmap", {\n type: \'heatmap\',\n title: "Monthly Distribution",\n data: {\n dataPoints: {\'1524064033\': 8, /* ... */},\n // object with timestamp-value pairs\n start: startDate\n end: endDate // Date objects\n },\n countLabel: \'Level\',\n discreteDomains: 0 // default: 1\n colors: [\'#ebedf0\', \'#c0ddf9\', \'#73b3f3\', \'#3886e1\', \'#17459e\'],\n // Set of five incremental colors,\n // preferably with a low-saturation color for zero data;\n // def: [\'#ebedf0\', \'#c6e48b\', \'#7bc96f\', \'#239a3b\', \'#196127\']\n });' | ||||
}] | }] | ||||
}, | |||||
codePenDemo: { | |||||
title: "Demo", | |||||
contentBlocks: [{ | |||||
type: "custom", | |||||
html: '<p data-height="299" data-theme-id="light" data-slug-hash="wjKBoq" data-default-tab="js,result"\n data-user="pratu16x7" data-embed-version="2" data-pen-title="Frappe Charts Demo" class="codepen">\n See the Pen <a href="https://codepen.io/pratu16x7/pen/wjKBoq/">Frappe Charts Demo</a>\n by Prateeksha Singh (<a href="https://codepen.io/pratu16x7">@pratu16x7</a>) on\n <a href="https://codepen.io">CodePen</a>.\n </p>' | |||||
}] | |||||
}, | |||||
optionsList: { | |||||
title: "Available Options", | |||||
contentBlocks: [{ | |||||
type: "code", | |||||
lang: "javascript", | |||||
content: '\n ...\n {\n data: {\n labels: [],\n datasets: [],\n yRegions: [],\n yMarkers: []\n }\n title: \'\',\n colors: [],\n height: 200,\n\n tooltipOptions: {\n formatTooltipX: d => (d + \'\').toUpperCase(),\n formatTooltipY: d => d + \' pts\',\n }\n\n // Axis charts\n isNavigable: 1, // default: 0\n valuesOverPoints: 1, // default: 0\n barOptions: {\n spaceRatio: 1 // default: 0.5\n stacked: 1 // default: 0\n }\n\n lineOptions: {\n dotSize: 6, // default: 4\n hideLine: 0, // default: 0\n hideDots: 1, // default: 0\n heatline: 1, // default: 0\n regionFill: 1 // default: 0\n }\n\n axisOptions: {\n yAxisMode: \'span\', // Axis lines, default\n xAxisMode: \'tick\', // No axis lines, only short ticks\n xIsSeries: 1 // Allow skipping x values for space\n // default: 0\n },\n\n // Pie/Percentage charts\n maxLegendPoints: 6, // default: 20\n maxSlices: 10, // default: 20\n\n // Percentage chart\n barOptions: {\n height: 15 // default: 20\n depth: 5 // default: 2\n }\n\n // Heatmap\n discreteDomains: 1, // default: 1\n }\n ...\n\n // Updating values\n chart.update(data);\n\n // Axis charts:\n chart.addDataPoint(label, valueFromEachDataset, index)\n chart.removeDataPoint(index)\n chart.updateDataset(datasetValues, index)\n\n // Exporting\n chart.export();\n\n // Unbind window-resize events\n chart.unbindWindowEvents();\n\n ' | |||||
}] | |||||
}, | |||||
installation: { | |||||
title: "Install", | |||||
contentBlocks: [{ type: "text", content: 'Install via npm' }, { type: "code", lang: "console", content: ' npm install frappe-charts' }, { type: "text", content: 'And include it in your project' }, { type: "code", lang: "javascript", content: ' import { Chart } from "frappe-charts' }, { type: "text", content: 'Use as:' }, { | |||||
type: "code", | |||||
lang: "javascript", | |||||
content: ' new Chart(); // ES6 module\n // or\n new frappe.Chart(); // Browser' | |||||
}, { type: "text", content: '... or include it directly in your HTML' }, { | |||||
type: "code", | |||||
lang: "html", | |||||
content: ' <script src="https://unpkg.com/frappe-charts@1.1.0"></script>' | |||||
}] | |||||
} | } | ||||
}; | }; | ||||
@@ -658,30 +690,37 @@ var docSectionBuilder = function () { | |||||
}, { | }, { | ||||
key: 'getBlock', | key: 'getBlock', | ||||
value: function getBlock(blockConf) { | value: function getBlock(blockConf) { | ||||
var block = void 0; | |||||
var type = blockConf.type; | |||||
if (type === "text") { | |||||
block = this.getText(blockConf); | |||||
} else if (type === "code") { | |||||
block = this.getCode(blockConf); | |||||
var fnName = 'get' + toTitleCase(blockConf.type); | |||||
if (this[fnName]) { | |||||
return this[fnName](blockConf); | |||||
} else { | } else { | ||||
block = this.getDemo(blockConf); | |||||
throw new Error('Unknown section block type \'' + blockConf.type + '\'.'); | |||||
} | } | ||||
} | } | ||||
}, { | }, { | ||||
key: 'getText', | key: 'getText', | ||||
value: function getText(blockConf) {} | |||||
value: function getText(blockConf) { | |||||
return $.create('p', { | |||||
inside: this.section, | |||||
innerHTML: blockConf.content | |||||
}); | |||||
} | |||||
}, { | }, { | ||||
key: 'getCode', | key: 'getCode', | ||||
value: function getCode(blockConf) { | value: function getCode(blockConf) { | ||||
var pre = $.create('pre', { inside: this.section }); | var pre = $.create('pre', { inside: this.section }); | ||||
var lang = blockConf.lang || 'javascript'; | |||||
var code = $.create('code', { | var code = $.create('code', { | ||||
inside: pre, | inside: pre, | ||||
className: 'hljs ' + blockConf.lang, | |||||
className: 'hljs ' + lang, | |||||
innerHTML: blockConf.content | innerHTML: blockConf.content | ||||
}); | }); | ||||
} | } | ||||
}, { | |||||
key: 'getCustom', | |||||
value: function getCustom(blockConf) { | |||||
this.section.innerHTML += blockConf.html; | |||||
} | |||||
}, { | }, { | ||||
key: 'getDemo', | key: 'getDemo', | ||||
value: function getDemo(blockConf) { | value: function getDemo(blockConf) { | ||||
@@ -723,7 +762,7 @@ var docSectionBuilder = function () { | |||||
args[o.path[0]][attr] = state[i]; | args[o.path[0]][attr] = state[i]; | ||||
}); | }); | ||||
} else { | } else { | ||||
// boolean, number, object | |||||
// boolean, string, number, object | |||||
args[o.path[0]] = state; | args[o.path[0]] = state; | ||||
} | } | ||||
_this2.libObj = new _this2.LIB_OBJ(figure, args); | _this2.libObj = new _this2.LIB_OBJ(figure, args); | ||||
@@ -770,63 +809,10 @@ lineComposite.parent.addEventListener('data-select', function (e) { | |||||
barComposite.updateDatasets([fireballOver25[i], fireball_5_25[i], fireball_2_5[i]]); | barComposite.updateDatasets([fireballOver25[i], fireball_5_25[i], fireball_2_5[i]]); | ||||
}); | }); | ||||
// ================================================================================ | |||||
var customColors = ['purple', 'magenta', 'light-blue']; | |||||
var typeChartArgs = { | |||||
title: "My Awesome Chart", | |||||
data: typeData, | |||||
type: 'axis-mixed', | |||||
height: 300, | |||||
colors: customColors, | |||||
valuesOverPoints: 1, | |||||
// maxLegendPoints: 6, | |||||
maxSlices: 10, | |||||
tooltipOptions: { | |||||
formatTooltipX: function formatTooltipX(d) { | |||||
return (d + '').toUpperCase(); | |||||
}, | |||||
formatTooltipY: function formatTooltipY(d) { | |||||
return d + ' pts'; | |||||
} | |||||
} | |||||
}; | |||||
var aggrChart = new Chart("#chart-aggr", typeChartArgs); | |||||
Array.prototype.slice.call(document.querySelectorAll('.aggr-type-buttons button')).map(function (el) { | |||||
el.addEventListener('click', function (e) { | |||||
var btn = e.target; | |||||
var type = btn.getAttribute('data-type'); | |||||
typeChartArgs.type = type; | |||||
if (type !== 'axis-mixed') { | |||||
typeChartArgs.colors = undefined; | |||||
} else { | |||||
typeChartArgs.colors = customColors; | |||||
} | |||||
if (type !== 'percentage') { | |||||
typeChartArgs.height = 300; | |||||
} else { | |||||
typeChartArgs.height = undefined; | |||||
} | |||||
var newChart = new Chart("#chart-aggr", typeChartArgs); | |||||
if (newChart) { | |||||
aggrChart = newChart; | |||||
} | |||||
Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) { | |||||
el.classList.remove('active'); | |||||
}); | |||||
btn.classList.add('active'); | |||||
}); | |||||
}); | |||||
document.querySelector('.export-aggr').addEventListener('click', function () { | |||||
aggrChart.export(); | |||||
}); | |||||
var section = document.querySelector('.demo-main'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.demoMain); | |||||
dcb.make(); | |||||
// Update values chart | // Update values chart | ||||
// ================================================================================ | // ================================================================================ | ||||
@@ -920,7 +906,7 @@ document.querySelector('.export-update').addEventListener('click', function () { | |||||
// Trends Chart | // Trends Chart | ||||
// ================================================================================ | // ================================================================================ | ||||
var section = document.querySelector('.trends-plot'); | |||||
section = document.querySelector('.trends-plot'); | |||||
dcb.setParent(section); | dcb.setParent(section); | ||||
dcb.setSys(dc.trendsPlot); | dcb.setSys(dc.trendsPlot); | ||||
dcb.make(); | dcb.make(); | ||||
@@ -963,4 +949,19 @@ dcb.setParent(section); | |||||
dcb.setSys(dc.heatmap); | dcb.setSys(dc.heatmap); | ||||
dcb.make(); | dcb.make(); | ||||
section = document.querySelector('.codepen'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.codePenDemo); | |||||
dcb.make(); | |||||
section = document.querySelector('.options'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.optionsList); | |||||
dcb.make(); | |||||
section = document.querySelector('.installation'); | |||||
dcb.setParent(section); | |||||
dcb.setSys(dc.installation); | |||||
dcb.make(); | |||||
}()); | }()); |
@@ -32,61 +32,7 @@ | |||||
<figure id="bar-composite-1" class="border"></figure> | <figure id="bar-composite-1" class="border"></figure> | ||||
</header> | </header> | ||||
<section> | |||||
<h6>Create a chart</h6> | |||||
<p>Click or use arrow keys to navigate data points</p> | |||||
<pre><code class="hljs html"> <!--HTML--> | |||||
<figure id="frost-chart"></figure></code></pre> | |||||
<pre><code class="hljs javascript"> // Javascript | |||||
let chart = new frappe.Chart( "#frost-chart", { // or DOM element | |||||
data: { | |||||
labels: ["12am-3am", "3am-6am", "6am-9am", "9am-12pm", | |||||
"12pm-3pm", "3pm-6pm", "6pm-9pm", "9pm-12am"], | |||||
datasets: [ | |||||
{ | |||||
name: "Some Data", chartType: 'bar', | |||||
values: [25, 40, 30, 35, 8, 52, 17, -4] | |||||
}, | |||||
{ | |||||
name: "Another Set", chartType: 'bar', | |||||
values: [25, 50, -10, 15, 18, 32, 27, 14] | |||||
}, | |||||
{ | |||||
name: "Yet Another", chartType: 'line', | |||||
values: [15, 20, -3, -15, 58, 12, -17, 37] | |||||
} | |||||
], | |||||
yMarkers: [{ label: "Marker", value: 70, | |||||
options: { labelPos: 'left' }}], | |||||
yRegions: [{ label: "Region", start: -10, end: 50, | |||||
options: { labelPos: 'right' }}] | |||||
}, | |||||
title: "My Awesome Chart", | |||||
type: 'axis-mixed', // or 'bar', 'line', 'pie', 'percentage' | |||||
height: 300, | |||||
colors: ['purple', '#ffa3ef', 'light-blue'], | |||||
tooltipOptions: { | |||||
formatTooltipX: d => (d + '').toUpperCase(), | |||||
formatTooltipY: d => d + ' pts', | |||||
} | |||||
}); | |||||
chart.export(); | |||||
</code></pre> | |||||
<div id="chart-aggr" class="border"></div> | |||||
<div class="btn-group aggr-type-buttons mt1 mx-auto" role="group"> | |||||
<button type="button" class="btn btn-sm btn-secondary active" data-type='axis-mixed'>Mixed</button> | |||||
<button type="button" class="btn btn-sm btn-secondary" data-type='pie'>Pie Chart</button> | |||||
<button type="button" class="btn btn-sm btn-secondary" data-type='percentage'>Percentage Chart</button> | |||||
</div> | |||||
<button type="button" class="btn btn-sm btn-secondary export-aggr mt1">Export ...</button> | |||||
</section> | |||||
<section class="demo-main"></section> | |||||
<section> | <section> | ||||
<h6>Update Values</h6> | <h6>Update Values</h6> | ||||
@@ -131,105 +77,9 @@ | |||||
<section class="heatmap"></section> | <section class="heatmap"></section> | ||||
<section> | |||||
<h6>Demo</h6> | |||||
<p data-height="299" data-theme-id="light" data-slug-hash="wjKBoq" data-default-tab="js,result" | |||||
data-user="pratu16x7" data-embed-version="2" data-pen-title="Frappe Charts Demo" class="codepen"> | |||||
See the Pen <a href="https://codepen.io/pratu16x7/pen/wjKBoq/">Frappe Charts Demo</a> | |||||
by Prateeksha Singh (<a href="https://codepen.io/pratu16x7">@pratu16x7</a>) on | |||||
<a href="https://codepen.io">CodePen</a>. | |||||
</p> | |||||
<script async src="https://static.codepen.io/assets/embed/ei.js"></script> | |||||
</section> | |||||
<section> | |||||
<h6>Available options</h6> | |||||
<pre><code class="hljs javascript"> | |||||
... | |||||
{ | |||||
data: { | |||||
labels: [], | |||||
datasets: [], | |||||
yRegions: [], | |||||
yMarkers: [] | |||||
} | |||||
title: '', | |||||
colors: [], | |||||
height: 200, | |||||
tooltipOptions: { | |||||
formatTooltipX: d => (d + '').toUpperCase(), | |||||
formatTooltipY: d => d + ' pts', | |||||
} | |||||
// Axis charts | |||||
isNavigable: 1, // default: 0 | |||||
valuesOverPoints: 1, // default: 0 | |||||
barOptions: { | |||||
spaceRatio: 1 // default: 0.5 | |||||
stacked: 1 // default: 0 | |||||
} | |||||
lineOptions: { | |||||
dotSize: 6, // default: 4 | |||||
hideLine: 0, // default: 0 | |||||
hideDots: 1, // default: 0 | |||||
heatline: 1, // default: 0 | |||||
regionFill: 1 // default: 0 | |||||
} | |||||
axisOptions: { | |||||
yAxisMode: 'span', // Axis lines, default | |||||
xAxisMode: 'tick', // No axis lines, only short ticks | |||||
xIsSeries: 1 // Allow skipping x values for space | |||||
// default: 0 | |||||
}, | |||||
// Pie/Percentage charts | |||||
maxLegendPoints: 6, // default: 20 | |||||
maxSlices: 10, // default: 20 | |||||
// Percentage chart | |||||
barOptions: { | |||||
height: 15 // default: 20 | |||||
depth: 5 // default: 2 | |||||
} | |||||
// Heatmap | |||||
discreteDomains: 1, // default: 1 | |||||
} | |||||
... | |||||
// Updating values | |||||
chart.update(data); | |||||
// Axis charts: | |||||
chart.addDataPoint(label, valueFromEachDataset, index) | |||||
chart.removeDataPoint(index) | |||||
chart.updateDataset(datasetValues, index) | |||||
// Exporting | |||||
chart.export(); | |||||
// Unbind window-resize events | |||||
chart.unbindWindowEvents(); | |||||
</code></pre> | |||||
</section> | |||||
<section> | |||||
<h6>Install</h6> | |||||
<p>Install via npm</p> | |||||
<pre><code class="hljs console"> npm install frappe-charts</code></pre> | |||||
<p>And include it in your project</p> | |||||
<pre><code class="hljs javascript"> import { Chart } from "frappe-charts"</code></pre> | |||||
<p>... or include it directly in your HTML</p> | |||||
<pre><code class="hljs html"> <script src="https://unpkg.com/frappe-charts@1.1.0"></script></code></pre> | |||||
<p>Use as:</p> | |||||
<pre><code class="hljs javascript"> new Chart(); // ES6 module | |||||
// or | |||||
new frappe.Chart(); // Browser</code></pre> | |||||
</section> | |||||
<section class="codepen"></section> | |||||
<section class="options"></section> | |||||
<section class="installation"></section> | |||||
<section class="text-center"> | <section class="text-center"> | ||||
<!-- Closing --> | <!-- Closing --> | ||||
@@ -266,6 +116,7 @@ | |||||
</svg> | </svg> | ||||
</a> | </a> | ||||
<script async src="https://static.codepen.io/assets/embed/ei.js"></script> | |||||
<script src="assets/js/frappe-charts.min.js"></script> | <script src="assets/js/frappe-charts.min.js"></script> | ||||
<script src="assets/js/index.min.js"></script> | <script src="assets/js/index.min.js"></script> | ||||
</body> | </body> | ||||
@@ -92,3 +92,7 @@ export function getPositionByAngle(angle, radius) { | |||||
y: Math.cos(angle * ANGLE_RATIO) * radius, | y: Math.cos(angle * ANGLE_RATIO) * radius, | ||||
}; | }; | ||||
} | } | ||||
export function toTitleCase(str) { | |||||
return str.replace(/\w*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); | |||||
} |