@@ -523,7 +523,7 @@ function makeHeatSquare(className, x, y, size, fill='none', data={}) { | |||||
y: y, | y: y, | ||||
width: size, | width: size, | ||||
height: size, | height: size, | ||||
fill: 1 | |||||
fill: fill | |||||
}; | }; | ||||
Object.keys(data).map(key => { | Object.keys(data).map(key => { | ||||
@@ -1269,7 +1269,7 @@ class BaseChart { | |||||
// TODO: remove timeout and decrease post animate time in chart component | // TODO: remove timeout and decrease post animate time in chart component | ||||
if(init) { | if(init) { | ||||
this.data = this.realData; | this.data = this.realData; | ||||
setTimeout(() => {this.update();}, 1000); | |||||
setTimeout(() => {this.update();}, 400); | |||||
} | } | ||||
this.renderLegend(); | this.renderLegend(); | ||||
@@ -2082,8 +2082,6 @@ class AxisChart extends BaseChart { | |||||
this.xAxisMode = args.xAxisMode || 'span'; | this.xAxisMode = args.xAxisMode || 'span'; | ||||
this.yAxisMode = args.yAxisMode || 'span'; | this.yAxisMode = args.yAxisMode || 'span'; | ||||
this.zeroLine = this.height; | |||||
// this.setTrivialState(); | |||||
this.setup(); | this.setup(); | ||||
} | } | ||||
@@ -2549,175 +2547,6 @@ class AxisChart extends BaseChart { | |||||
// keep a binding at the end of chart | // keep a binding at the end of chart | ||||
class MultiAxisChart extends AxisChart { | |||||
constructor(args) { | |||||
super(args); | |||||
// this.unitType = args.unitType || 'line'; | |||||
// this.setup(); | |||||
} | |||||
preSetup() { | |||||
this.type = 'multiaxis'; | |||||
} | |||||
setMargins() { | |||||
super.setMargins(); | |||||
let noOfLeftAxes = this.data.datasets.filter(d => d.axisPosition === 'left').length; | |||||
this.translateXLeft = (noOfLeftAxes) * Y_AXIS_MARGIN || Y_AXIS_MARGIN; | |||||
this.translateXRight = (this.data.datasets.length - noOfLeftAxes) * Y_AXIS_MARGIN || Y_AXIS_MARGIN; | |||||
} | |||||
prepareYAxis() { } | |||||
prepareData(data) { | |||||
super.prepareData(data); | |||||
let sets = this.state.datasets; | |||||
// let axesLeft = sets.filter(d => d.axisPosition === 'left'); | |||||
// let axesRight = sets.filter(d => d.axisPosition === 'right'); | |||||
// let axesNone = sets.filter(d => !d.axisPosition || | |||||
// !['left', 'right'].includes(d.axisPosition)); | |||||
let leftCount = 0, rightCount = 0; | |||||
sets.forEach((d, i) => { | |||||
d.yAxis = { | |||||
position: d.axisPosition, | |||||
index: d.axisPosition === 'left' ? leftCount++ : rightCount++ | |||||
}; | |||||
}); | |||||
} | |||||
configure(args) { | |||||
super.configure(args); | |||||
this.config.xAxisMode = args.xAxisMode || 'tick'; | |||||
this.config.yAxisMode = args.yAxisMode || 'span'; | |||||
} | |||||
// setUnitWidthAndXOffset() { | |||||
// this.state.unitWidth = this.width/(this.state.datasetLength); | |||||
// this.state.xOffset = this.state.unitWidth/2; | |||||
// } | |||||
configUnits() { | |||||
this.unitArgs = { | |||||
type: 'bar', | |||||
args: { | |||||
spaceWidth: this.state.unitWidth/2, | |||||
} | |||||
}; | |||||
} | |||||
setYAxis() { | |||||
this.state.datasets.map(d => { | |||||
this.calcYAxisParameters(d.yAxis, d.values, this.unitType === 'line'); | |||||
}); | |||||
} | |||||
calcYUnits() { | |||||
this.state.datasets.map(d => { | |||||
d.positions = d.values.map(val => floatTwo(d.yAxis.zeroLine - val * d.yAxis.scaleMultiplier)); | |||||
}); | |||||
} | |||||
// TODO: function doesn't exist, handle with components | |||||
renderConstants() { | |||||
this.state.datasets.map(d => { | |||||
let guidePos = d.yAxis.position === 'left' | |||||
? -1 * d.yAxis.index * Y_AXIS_MARGIN | |||||
: this.width + d.yAxis.index * Y_AXIS_MARGIN; | |||||
this.renderer.xLine(guidePos, '', { | |||||
pos:'top', | |||||
mode: 'span', | |||||
stroke: this.colors[i], | |||||
className: 'y-axis-guide' | |||||
}); | |||||
}); | |||||
} | |||||
getYAxesComponents() { | |||||
return this.data.datasets.map((e, i) => { | |||||
return new ChartComponent({ | |||||
layerClass: 'y axis y-axis-' + i, | |||||
make: () => { | |||||
let yAxis = this.state.datasets[i].yAxis; | |||||
this.renderer.setZeroline(yAxis.zeroline); | |||||
let options = { | |||||
pos: yAxis.position, | |||||
mode: 'tick', | |||||
offset: yAxis.index * Y_AXIS_MARGIN, | |||||
stroke: this.colors[i] | |||||
}; | |||||
return yAxis.positions.map((position, j) => | |||||
this.renderer.yLine(position, yAxis.labels[j], options) | |||||
); | |||||
}, | |||||
animate: () => {} | |||||
}); | |||||
}); | |||||
} | |||||
// TODO remove renderer zeroline from above and below | |||||
getChartComponents() { | |||||
return this.data.datasets.map((d, index) => { | |||||
return new ChartComponent({ | |||||
layerClass: 'dataset-units dataset-' + index, | |||||
make: () => { | |||||
let d = this.state.datasets[index]; | |||||
let unitType = this.unitArgs; | |||||
// the only difference, should be tied to datasets or default | |||||
this.renderer.setZeroline(d.yAxis.zeroLine); | |||||
return d.positions.map((y, j) => { | |||||
return this.renderer[unitType.type]( | |||||
this.state.xAxisPositions[j], | |||||
y, | |||||
unitType.args, | |||||
this.colors[index], | |||||
j, | |||||
index, | |||||
this.state.datasetLength | |||||
); | |||||
}); | |||||
}, | |||||
animate: (svgUnits) => { | |||||
let d = this.state.datasets[index]; | |||||
let unitType = this.unitArgs.type; | |||||
// have been updated in axis render; | |||||
let newX = this.state.xAxisPositions; | |||||
let newY = this.state.datasets[index].positions; | |||||
let lastUnit = svgUnits[svgUnits.length - 1]; | |||||
let parentNode = lastUnit.parentNode; | |||||
if(this.oldState.xExtra > 0) { | |||||
for(var i = 0; i<this.oldState.xExtra; i++) { | |||||
let unit = lastUnit.cloneNode(true); | |||||
parentNode.appendChild(unit); | |||||
svgUnits.push(unit); | |||||
} | |||||
} | |||||
this.renderer.setZeroline(d.yAxis.zeroLine); | |||||
svgUnits.map((unit, i) => { | |||||
if(newX[i] === undefined || newY[i] === undefined) return; | |||||
this.elementsToAnimate.push(this.renderer['animate' + unitType]( | |||||
unit, // unit, with info to replace where it came from in the data | |||||
newX[i], | |||||
newY[i], | |||||
index, | |||||
this.state.noOfDatasets | |||||
)); | |||||
}); | |||||
} | |||||
}); | |||||
}); | |||||
} | |||||
} | |||||
class PercentageChart extends BaseChart { | class PercentageChart extends BaseChart { | ||||
constructor(args) { | constructor(args) { | ||||
super(args); | super(args); | ||||
@@ -3096,7 +2925,7 @@ class Heatmap extends BaseChart { | |||||
this.distribution_size = 5; | this.distribution_size = 5; | ||||
this.translateX = 0; | this.translateX = 0; | ||||
// this.setup(); | |||||
this.setup(); | |||||
} | } | ||||
validate_colors(colors) { | validate_colors(colors) { | ||||
@@ -3140,19 +2969,25 @@ class Heatmap extends BaseChart { | |||||
} | } | ||||
} | } | ||||
setupLayers() { | |||||
this.domain_label_group = this.makeLayer( | |||||
makeChartArea() { | |||||
super.makeChartArea(); | |||||
this.domainLabelGroup = makeSVGGroup(this.drawArea, | |||||
'domain-label-group chart-label'); | 'domain-label-group chart-label'); | ||||
this.data_groups = this.makeLayer( | |||||
this.dataGroups = makeSVGGroup(this.drawArea, | |||||
'data-groups', | 'data-groups', | ||||
`translate(0, 20)` | `translate(0, 20)` | ||||
); | ); | ||||
// Array.prototype.slice.call( | |||||
// this.container.querySelectorAll('.graph-stats-container, .sub-title, .title') | |||||
// ).map(d => { | |||||
// d.style.display = 'None'; | |||||
// }); | |||||
// this.chartWrapper.style.marginTop = '0px'; | |||||
// this.chartWrapper.style.paddingTop = '0px'; | |||||
} | } | ||||
setupValues() { | |||||
this.domain_label_group.textContent = ''; | |||||
this.data_groups.textContent = ''; | |||||
calc() { | |||||
let data_values = Object.keys(this.data).map(key => this.data[key]); | let data_values = Object.keys(this.data).map(key => this.data[key]); | ||||
this.distribution = calcDistribution(data_values, this.distribution_size); | this.distribution = calcDistribution(data_values, this.distribution_size); | ||||
@@ -3160,11 +2995,17 @@ class Heatmap extends BaseChart { | |||||
this.month_names = ["January", "February", "March", "April", "May", "June", | this.month_names = ["January", "February", "March", "April", "May", "June", | ||||
"July", "August", "September", "October", "November", "December" | "July", "August", "September", "October", "November", "December" | ||||
]; | ]; | ||||
} | |||||
this.render_all_weeks_and_store_x_values(this.no_of_cols); | |||||
render() { | |||||
this.renderAllWeeksAndStoreXValues(this.no_of_cols); | |||||
} | } | ||||
render_all_weeks_and_store_x_values(no_of_weeks) { | |||||
renderAllWeeksAndStoreXValues(no_of_weeks) { | |||||
// renderAllWeeksAndStoreXValues | |||||
this.domainLabelGroup.textContent = ''; | |||||
this.dataGroups.textContent = ''; | |||||
let current_week_sunday = new Date(this.first_week_start); | let current_week_sunday = new Date(this.first_week_start); | ||||
this.week_col = 0; | this.week_col = 0; | ||||
this.current_month = current_week_sunday.getMonth(); | this.current_month = current_week_sunday.getMonth(); | ||||
@@ -3179,7 +3020,7 @@ class Heatmap extends BaseChart { | |||||
let day = new Date(current_week_sunday); | let day = new Date(current_week_sunday); | ||||
[data_group, month_change] = this.get_week_squares_group(day, this.week_col); | [data_group, month_change] = this.get_week_squares_group(day, this.week_col); | ||||
this.data_groups.appendChild(data_group); | |||||
this.dataGroups.appendChild(data_group); | |||||
this.week_col += 1 + parseInt(this.discrete_domains && month_change); | this.week_col += 1 + parseInt(this.discrete_domains && month_change); | ||||
this.month_weeks[this.current_month]++; | this.month_weeks[this.current_month]++; | ||||
if(month_change) { | if(month_change) { | ||||
@@ -3202,11 +3043,11 @@ class Heatmap extends BaseChart { | |||||
let month_change = 0; | let month_change = 0; | ||||
let week_col_change = 0; | let week_col_change = 0; | ||||
let data_group = makeSVGGroup(this.data_groups, 'data-group'); | |||||
let data_group = makeSVGGroup(this.dataGroups, 'data-group'); | |||||
for(var y = 0, i = 0; i < no_of_weekdays; i += step, y += (square_side + cell_padding)) { | for(var y = 0, i = 0; i < no_of_weekdays; i += step, y += (square_side + cell_padding)) { | ||||
let data_value = 0; | let data_value = 0; | ||||
let color_index = 0; | |||||
let colorIndex = 0; | |||||
let current_timestamp = current_date.getTime()/1000; | let current_timestamp = current_date.getTime()/1000; | ||||
let timestamp = Math.floor(current_timestamp - (current_timestamp % 86400)).toFixed(1); | let timestamp = Math.floor(current_timestamp - (current_timestamp % 86400)).toFixed(1); | ||||
@@ -3220,7 +3061,7 @@ class Heatmap extends BaseChart { | |||||
} | } | ||||
if(data_value) { | if(data_value) { | ||||
color_index = getMaxCheckpoint(data_value, this.distribution); | |||||
colorIndex = getMaxCheckpoint(data_value, this.distribution); | |||||
} | } | ||||
let x = 13 + (index + week_col_change) * 12; | let x = 13 + (index + week_col_change) * 12; | ||||
@@ -3230,8 +3071,9 @@ class Heatmap extends BaseChart { | |||||
'data-value': data_value, | 'data-value': data_value, | ||||
'data-day': current_date.getDay() | 'data-day': current_date.getDay() | ||||
}; | }; | ||||
let heatSquare = makeHeatSquare('day', x, y, square_side, | let heatSquare = makeHeatSquare('day', x, y, square_side, | ||||
this.legend_colors[color_index], dataAttr); | |||||
this.legend_colors[colorIndex], dataAttr); | |||||
data_group.appendChild(heatSquare); | data_group.appendChild(heatSquare); | ||||
@@ -3277,18 +3119,8 @@ class Heatmap extends BaseChart { | |||||
this.month_start_points.map((start, i) => { | this.month_start_points.map((start, i) => { | ||||
let month_name = this.month_names[this.months[i]].substring(0, 3); | let month_name = this.month_names[this.months[i]].substring(0, 3); | ||||
let text = makeText('y-value-text', start+12, 10, month_name); | let text = makeText('y-value-text', start+12, 10, month_name); | ||||
this.domain_label_group.appendChild(text); | |||||
}); | |||||
} | |||||
renderComponents() { | |||||
Array.prototype.slice.call( | |||||
this.container.querySelectorAll('.graph-stats-container, .sub-title, .title') | |||||
).map(d => { | |||||
d.style.display = 'None'; | |||||
this.domainLabelGroup.appendChild(text); | |||||
}); | }); | ||||
this.chartWrapper.style.marginTop = '0px'; | |||||
this.chartWrapper.style.paddingTop = '0px'; | |||||
} | } | ||||
bindTooltip() { | bindTooltip() { | ||||
@@ -3316,28 +3148,28 @@ class Heatmap extends BaseChart { | |||||
} | } | ||||
update(data) { | update(data) { | ||||
this.data = data; | |||||
this.setupValues(); | |||||
super.update(data); | |||||
this.bindTooltip(); | this.bindTooltip(); | ||||
} | } | ||||
} | } | ||||
const chartTypes = { | const chartTypes = { | ||||
mixed: AxisChart, | |||||
multiaxis: MultiAxisChart, | |||||
// multiaxis: MultiAxisChart, | |||||
percentage: PercentageChart, | percentage: PercentageChart, | ||||
heatmap: Heatmap, | heatmap: Heatmap, | ||||
pie: PieChart | pie: PieChart | ||||
}; | }; | ||||
function getChartByType(chartType = 'line', options) { | function getChartByType(chartType = 'line', options) { | ||||
debugger; | |||||
if(chartType === 'line') { | if(chartType === 'line') { | ||||
options.type = 'line'; | options.type = 'line'; | ||||
return new AxisChart(options); | return new AxisChart(options); | ||||
} else if (chartType === 'bar') { | } else if (chartType === 'bar') { | ||||
options.type = 'bar'; | options.type = 'bar'; | ||||
return new AxisChart(options); | return new AxisChart(options); | ||||
} else if (chartType === 'axis-mixed') { | |||||
options.type = 'line'; | |||||
return new AxisChart(options); | |||||
} | } | ||||
if (!chartTypes[chartType]) { | if (!chartTypes[chartType]) { | ||||
@@ -447,100 +447,100 @@ document.querySelector('[data-aggregation="average"]').addEventListener("click", | |||||
// Heatmap | // Heatmap | ||||
// ================================================================================ | // ================================================================================ | ||||
// let heatmap_data = {}; | |||||
// let current_date = new Date(); | |||||
// let timestamp = current_date.getTime()/1000; | |||||
// timestamp = Math.floor(timestamp - (timestamp % 86400)).toFixed(1); // convert to midnight | |||||
// for (var i = 0; i< 375; i++) { | |||||
// heatmap_data[parseInt(timestamp)] = Math.floor(Math.random() * 5); | |||||
// timestamp = Math.floor(timestamp - 86400).toFixed(1); | |||||
// } | |||||
// new Chart({ | |||||
// parent: "#chart-heatmap", | |||||
// data: heatmap_data, | |||||
// type: 'heatmap', | |||||
// legend_scale: [0, 1, 2, 4, 5], | |||||
// height: 115, | |||||
// discrete_domains: 1 // default 0 | |||||
// }); | |||||
// Array.prototype.slice.call( | |||||
// document.querySelectorAll('.heatmap-mode-buttons button') | |||||
// ).map(el => { | |||||
// el.addEventListener('click', (e) => { | |||||
// let btn = e.target; | |||||
// let mode = btn.getAttribute('data-mode'); | |||||
// let discrete_domains = 0; | |||||
// if(mode === 'discrete') { | |||||
// discrete_domains = 1; | |||||
// } | |||||
// let colors = []; | |||||
// let colors_mode = document | |||||
// .querySelector('.heatmap-color-buttons .active') | |||||
// .getAttribute('data-color'); | |||||
// if(colors_mode === 'halloween') { | |||||
// colors = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c']; | |||||
// } | |||||
// new Chart({ | |||||
// parent: "#chart-heatmap", | |||||
// data: heatmap_data, | |||||
// type: 'heatmap', | |||||
// legend_scale: [0, 1, 2, 4, 5], | |||||
// height: 115, | |||||
// discrete_domains: discrete_domains, | |||||
// legend_colors: colors | |||||
// }); | |||||
// Array.prototype.slice.call( | |||||
// btn.parentNode.querySelectorAll('button')).map(el => { | |||||
// el.classList.remove('active'); | |||||
// }); | |||||
// btn.classList.add('active'); | |||||
// }); | |||||
// }); | |||||
// Array.prototype.slice.call( | |||||
// document.querySelectorAll('.heatmap-color-buttons button') | |||||
// ).map(el => { | |||||
// el.addEventListener('click', (e) => { | |||||
// let btn = e.target; | |||||
// let colors_mode = btn.getAttribute('data-color'); | |||||
// let colors = []; | |||||
// if(colors_mode === 'halloween') { | |||||
// colors = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c']; | |||||
// } | |||||
// let discrete_domains = 1; | |||||
// let view_mode = document | |||||
// .querySelector('.heatmap-mode-buttons .active') | |||||
// .getAttribute('data-mode'); | |||||
// if(view_mode === 'continuous') { | |||||
// discrete_domains = 0; | |||||
// } | |||||
// new Chart({ | |||||
// parent: "#chart-heatmap", | |||||
// data: heatmap_data, | |||||
// type: 'heatmap', | |||||
// legend_scale: [0, 1, 2, 4, 5], | |||||
// height: 115, | |||||
// discrete_domains: discrete_domains, | |||||
// legend_colors: colors | |||||
// }); | |||||
// Array.prototype.slice.call( | |||||
// btn.parentNode.querySelectorAll('button')).map(el => { | |||||
// el.classList.remove('active'); | |||||
// }); | |||||
// btn.classList.add('active'); | |||||
// }); | |||||
// }); | |||||
let heatmap_data = {}; | |||||
let current_date = new Date(); | |||||
let timestamp = current_date.getTime()/1000; | |||||
timestamp = Math.floor(timestamp - (timestamp % 86400)).toFixed(1); // convert to midnight | |||||
for (var i = 0; i< 375; i++) { | |||||
heatmap_data[parseInt(timestamp)] = Math.floor(Math.random() * 5); | |||||
timestamp = Math.floor(timestamp - 86400).toFixed(1); | |||||
} | |||||
new Chart({ | |||||
parent: "#chart-heatmap", | |||||
data: heatmap_data, | |||||
type: 'heatmap', | |||||
legend_scale: [0, 1, 2, 4, 5], | |||||
height: 115, | |||||
discrete_domains: 1 | |||||
}); | |||||
Array.prototype.slice.call( | |||||
document.querySelectorAll('.heatmap-mode-buttons button') | |||||
).map(el => { | |||||
el.addEventListener('click', (e) => { | |||||
let btn = e.target; | |||||
let mode = btn.getAttribute('data-mode'); | |||||
let discrete_domains = 0; | |||||
if(mode === 'discrete') { | |||||
discrete_domains = 1; | |||||
} | |||||
let colors = []; | |||||
let colors_mode = document | |||||
.querySelector('.heatmap-color-buttons .active') | |||||
.getAttribute('data-color'); | |||||
if(colors_mode === 'halloween') { | |||||
colors = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c']; | |||||
} | |||||
new Chart({ | |||||
parent: "#chart-heatmap", | |||||
data: heatmap_data, | |||||
type: 'heatmap', | |||||
legend_scale: [0, 1, 2, 4, 5], | |||||
height: 115, | |||||
discrete_domains: discrete_domains, | |||||
legend_colors: colors | |||||
}); | |||||
Array.prototype.slice.call( | |||||
btn.parentNode.querySelectorAll('button')).map(el => { | |||||
el.classList.remove('active'); | |||||
}); | |||||
btn.classList.add('active'); | |||||
}); | |||||
}); | |||||
Array.prototype.slice.call( | |||||
document.querySelectorAll('.heatmap-color-buttons button') | |||||
).map(el => { | |||||
el.addEventListener('click', (e) => { | |||||
let btn = e.target; | |||||
let colors_mode = btn.getAttribute('data-color'); | |||||
let colors = []; | |||||
if(colors_mode === 'halloween') { | |||||
colors = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c']; | |||||
} | |||||
let discrete_domains = 1; | |||||
let view_mode = document | |||||
.querySelector('.heatmap-mode-buttons .active') | |||||
.getAttribute('data-mode'); | |||||
if(view_mode === 'continuous') { | |||||
discrete_domains = 0; | |||||
} | |||||
new Chart({ | |||||
parent: "#chart-heatmap", | |||||
data: heatmap_data, | |||||
type: 'heatmap', | |||||
legend_scale: [0, 1, 2, 4, 5], | |||||
height: 115, | |||||
discrete_domains: discrete_domains, | |||||
legend_colors: colors | |||||
}); | |||||
Array.prototype.slice.call( | |||||
btn.parentNode.querySelectorAll('button')).map(el => { | |||||
el.classList.remove('active'); | |||||
}); | |||||
btn.classList.add('active'); | |||||
}); | |||||
}); | |||||
// Helpers | // Helpers | ||||
// ================================================================================ | // ================================================================================ | ||||
@@ -20,21 +20,22 @@ import AxisChart from './charts/AxisChart'; | |||||
const chartTypes = { | const chartTypes = { | ||||
mixed: AxisChart, | |||||
multiaxis: MultiAxisChart, | |||||
// multiaxis: MultiAxisChart, | |||||
percentage: PercentageChart, | percentage: PercentageChart, | ||||
heatmap: Heatmap, | heatmap: Heatmap, | ||||
pie: PieChart | pie: PieChart | ||||
}; | }; | ||||
function getChartByType(chartType = 'line', options) { | function getChartByType(chartType = 'line', options) { | ||||
debugger; | |||||
if(chartType === 'line') { | if(chartType === 'line') { | ||||
options.type = 'line'; | options.type = 'line'; | ||||
return new AxisChart(options); | return new AxisChart(options); | ||||
} else if (chartType === 'bar') { | } else if (chartType === 'bar') { | ||||
options.type = 'bar'; | options.type = 'bar'; | ||||
return new AxisChart(options); | return new AxisChart(options); | ||||
} else if (chartType === 'axis-mixed') { | |||||
options.type = 'line'; | |||||
return new AxisChart(options); | |||||
} | } | ||||
if (!chartTypes[chartType]) { | if (!chartTypes[chartType]) { | ||||
@@ -22,8 +22,6 @@ export default class AxisChart extends BaseChart { | |||||
this.xAxisMode = args.xAxisMode || 'span'; | this.xAxisMode = args.xAxisMode || 'span'; | ||||
this.yAxisMode = args.yAxisMode || 'span'; | this.yAxisMode = args.yAxisMode || 'span'; | ||||
this.zeroLine = this.height; | |||||
// this.setTrivialState(); | |||||
this.setup(); | this.setup(); | ||||
} | } | ||||
@@ -154,7 +154,7 @@ export default class BaseChart { | |||||
// TODO: remove timeout and decrease post animate time in chart component | // TODO: remove timeout and decrease post animate time in chart component | ||||
if(init) { | if(init) { | ||||
this.data = this.realData; | this.data = this.realData; | ||||
setTimeout(() => {this.update();}, 1000); | |||||
setTimeout(() => {this.update();}, 400); | |||||
} | } | ||||
this.renderLegend(); | this.renderLegend(); | ||||
@@ -37,7 +37,7 @@ export default class Heatmap extends BaseChart { | |||||
this.distribution_size = 5; | this.distribution_size = 5; | ||||
this.translateX = 0; | this.translateX = 0; | ||||
// this.setup(); | |||||
this.setup(); | |||||
} | } | ||||
validate_colors(colors) { | validate_colors(colors) { | ||||
@@ -81,19 +81,25 @@ export default class Heatmap extends BaseChart { | |||||
} | } | ||||
} | } | ||||
setupLayers() { | |||||
this.domain_label_group = this.makeLayer( | |||||
makeChartArea() { | |||||
super.makeChartArea(); | |||||
this.domainLabelGroup = makeSVGGroup(this.drawArea, | |||||
'domain-label-group chart-label'); | 'domain-label-group chart-label'); | ||||
this.data_groups = this.makeLayer( | |||||
this.dataGroups = makeSVGGroup(this.drawArea, | |||||
'data-groups', | 'data-groups', | ||||
`translate(0, 20)` | `translate(0, 20)` | ||||
); | ); | ||||
// Array.prototype.slice.call( | |||||
// this.container.querySelectorAll('.graph-stats-container, .sub-title, .title') | |||||
// ).map(d => { | |||||
// d.style.display = 'None'; | |||||
// }); | |||||
// this.chartWrapper.style.marginTop = '0px'; | |||||
// this.chartWrapper.style.paddingTop = '0px'; | |||||
} | } | ||||
setupValues() { | |||||
this.domain_label_group.textContent = ''; | |||||
this.data_groups.textContent = ''; | |||||
calc() { | |||||
let data_values = Object.keys(this.data).map(key => this.data[key]); | let data_values = Object.keys(this.data).map(key => this.data[key]); | ||||
this.distribution = calcDistribution(data_values, this.distribution_size); | this.distribution = calcDistribution(data_values, this.distribution_size); | ||||
@@ -101,11 +107,17 @@ export default class Heatmap extends BaseChart { | |||||
this.month_names = ["January", "February", "March", "April", "May", "June", | this.month_names = ["January", "February", "March", "April", "May", "June", | ||||
"July", "August", "September", "October", "November", "December" | "July", "August", "September", "October", "November", "December" | ||||
]; | ]; | ||||
} | |||||
this.render_all_weeks_and_store_x_values(this.no_of_cols); | |||||
render() { | |||||
this.renderAllWeeksAndStoreXValues(this.no_of_cols); | |||||
} | } | ||||
render_all_weeks_and_store_x_values(no_of_weeks) { | |||||
renderAllWeeksAndStoreXValues(no_of_weeks) { | |||||
// renderAllWeeksAndStoreXValues | |||||
this.domainLabelGroup.textContent = ''; | |||||
this.dataGroups.textContent = ''; | |||||
let current_week_sunday = new Date(this.first_week_start); | let current_week_sunday = new Date(this.first_week_start); | ||||
this.week_col = 0; | this.week_col = 0; | ||||
this.current_month = current_week_sunday.getMonth(); | this.current_month = current_week_sunday.getMonth(); | ||||
@@ -120,7 +132,7 @@ export default class Heatmap extends BaseChart { | |||||
let day = new Date(current_week_sunday); | let day = new Date(current_week_sunday); | ||||
[data_group, month_change] = this.get_week_squares_group(day, this.week_col); | [data_group, month_change] = this.get_week_squares_group(day, this.week_col); | ||||
this.data_groups.appendChild(data_group); | |||||
this.dataGroups.appendChild(data_group); | |||||
this.week_col += 1 + parseInt(this.discrete_domains && month_change); | this.week_col += 1 + parseInt(this.discrete_domains && month_change); | ||||
this.month_weeks[this.current_month]++; | this.month_weeks[this.current_month]++; | ||||
if(month_change) { | if(month_change) { | ||||
@@ -143,11 +155,11 @@ export default class Heatmap extends BaseChart { | |||||
let month_change = 0; | let month_change = 0; | ||||
let week_col_change = 0; | let week_col_change = 0; | ||||
let data_group = makeSVGGroup(this.data_groups, 'data-group'); | |||||
let data_group = makeSVGGroup(this.dataGroups, 'data-group'); | |||||
for(var y = 0, i = 0; i < no_of_weekdays; i += step, y += (square_side + cell_padding)) { | for(var y = 0, i = 0; i < no_of_weekdays; i += step, y += (square_side + cell_padding)) { | ||||
let data_value = 0; | let data_value = 0; | ||||
let color_index = 0; | |||||
let colorIndex = 0; | |||||
let current_timestamp = current_date.getTime()/1000; | let current_timestamp = current_date.getTime()/1000; | ||||
let timestamp = Math.floor(current_timestamp - (current_timestamp % 86400)).toFixed(1); | let timestamp = Math.floor(current_timestamp - (current_timestamp % 86400)).toFixed(1); | ||||
@@ -161,7 +173,7 @@ export default class Heatmap extends BaseChart { | |||||
} | } | ||||
if(data_value) { | if(data_value) { | ||||
color_index = getMaxCheckpoint(data_value, this.distribution); | |||||
colorIndex = getMaxCheckpoint(data_value, this.distribution); | |||||
} | } | ||||
let x = 13 + (index + week_col_change) * 12; | let x = 13 + (index + week_col_change) * 12; | ||||
@@ -171,8 +183,9 @@ export default class Heatmap extends BaseChart { | |||||
'data-value': data_value, | 'data-value': data_value, | ||||
'data-day': current_date.getDay() | 'data-day': current_date.getDay() | ||||
}; | }; | ||||
let heatSquare = makeHeatSquare('day', x, y, square_side, | let heatSquare = makeHeatSquare('day', x, y, square_side, | ||||
this.legend_colors[color_index], dataAttr); | |||||
this.legend_colors[colorIndex], dataAttr); | |||||
data_group.appendChild(heatSquare); | data_group.appendChild(heatSquare); | ||||
@@ -218,18 +231,8 @@ export default class Heatmap extends BaseChart { | |||||
this.month_start_points.map((start, i) => { | this.month_start_points.map((start, i) => { | ||||
let month_name = this.month_names[this.months[i]].substring(0, 3); | let month_name = this.month_names[this.months[i]].substring(0, 3); | ||||
let text = makeText('y-value-text', start+12, 10, month_name); | let text = makeText('y-value-text', start+12, 10, month_name); | ||||
this.domain_label_group.appendChild(text); | |||||
}); | |||||
} | |||||
renderComponents() { | |||||
Array.prototype.slice.call( | |||||
this.container.querySelectorAll('.graph-stats-container, .sub-title, .title') | |||||
).map(d => { | |||||
d.style.display = 'None'; | |||||
this.domainLabelGroup.appendChild(text); | |||||
}); | }); | ||||
this.chartWrapper.style.marginTop = '0px'; | |||||
this.chartWrapper.style.paddingTop = '0px'; | |||||
} | } | ||||
bindTooltip() { | bindTooltip() { | ||||
@@ -257,8 +260,7 @@ export default class Heatmap extends BaseChart { | |||||
} | } | ||||
update(data) { | update(data) { | ||||
this.data = data; | |||||
this.setupValues(); | |||||
super.update(data); | |||||
this.bindTooltip(); | this.bindTooltip(); | ||||
} | } | ||||
} | } |
@@ -146,7 +146,7 @@ export function makeHeatSquare(className, x, y, size, fill='none', data={}) { | |||||
y: y, | y: y, | ||||
width: size, | width: size, | ||||
height: size, | height: size, | ||||
fill: 1 | |||||
fill: fill | |||||
}; | }; | ||||
Object.keys(data).map(key => { | Object.keys(data).map(key => { | ||||