490 lines
11 KiB
HTML
490 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
|
<title>Dynamic Loaded Column Chart</title>
|
|
|
|
|
|
<link href="../../assets/styles.css" rel="stylesheet" />
|
|
|
|
<style>
|
|
body {
|
|
background: #fff;
|
|
}
|
|
|
|
.wrap {
|
|
margin: 45px auto;
|
|
max-width: 800px;
|
|
position: relative;
|
|
}
|
|
|
|
.chart-box {
|
|
padding-left: 0;
|
|
}
|
|
|
|
#chart-year,
|
|
#chart-quarter {
|
|
width: 96%;
|
|
max-width: 48%;
|
|
box-shadow: none;
|
|
}
|
|
|
|
#chart-year {
|
|
float: left;
|
|
position: relative;
|
|
transition: 1s ease transform;
|
|
z-index: 3;
|
|
}
|
|
|
|
#chart-year.chart-quarter-activated {
|
|
transform: translateX(0);
|
|
transition: 1s ease transform;
|
|
}
|
|
|
|
#chart-quarter {
|
|
float: left;
|
|
position: relative;
|
|
z-index: -2;
|
|
transition: 1s ease transform;
|
|
}
|
|
|
|
#chart-quarter.active {
|
|
transition: 1.1s ease-in-out transform;
|
|
transform: translateX(0);
|
|
z-index: 1;
|
|
}
|
|
|
|
@media screen and (min-width: 480px) {
|
|
#chart-year {
|
|
transform: translateX(50%);
|
|
}
|
|
#chart-quarter {
|
|
transform: translateX(-50%);
|
|
}
|
|
}
|
|
|
|
select#model {
|
|
display: none;
|
|
position: absolute;
|
|
top: -40px;
|
|
left: 0;
|
|
z-index: 2;
|
|
cursor: pointer;
|
|
transform: scale(0.8);
|
|
}
|
|
|
|
</style>
|
|
</head>
|
|
|
|
|
|
<body>
|
|
<div class="wrap">
|
|
<select id="model" @change="changeData" class="flat-select">
|
|
<option value="iphone5">iPhone 5</option>
|
|
<option value="iphone6">iPhone 6</option>
|
|
<option value="iphone7">iPhone 7</option>
|
|
</select>
|
|
<div id="chart-year" class="chart-box">
|
|
<apexchart ref="chartYear" type=bar height=350 :options="chartOptionsYear" :series="seriesYear" />
|
|
</div>
|
|
<div id="chart-quarter" class="chart-box">
|
|
<apexchart ref="chartQuarter" type=bar height=350 :options="chartOptionsQuarter" :series="seriesQuarter" />
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Below element is just for displaying source code. it is not required. DO NOT USE -->
|
|
<div id="html">
|
|
<div class="wrap">
|
|
<select id="model" @change="changeData" class="flat-select">
|
|
<option value="iphone5">iPhone 5</option>
|
|
<option value="iphone6">iPhone 6</option>
|
|
<option value="iphone7">iPhone 7</option>
|
|
</select>
|
|
<div id="chart-year" class="chart-box">
|
|
<apexchart ref="chartYear" type=bar height=350 :options="chartOptionsYear" :series="seriesYear" />
|
|
</div>
|
|
<div id="chart-quarter" class="chart-box">
|
|
<apexchart ref="chartQuarter" type=bar height=350 :options="chartOptionsQuarter" :series="seriesQuarter" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="https://unpkg.com/vue/dist/vue.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/apexcharts@latest"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/vue-apexcharts"></script>
|
|
|
|
<script>
|
|
Apex = {
|
|
chart: {
|
|
toolbar: {
|
|
show: false
|
|
}
|
|
},
|
|
tooltip: {
|
|
shared: false
|
|
},
|
|
}
|
|
|
|
var colors = ['#008FFB', '#00E396', '#FEB019', '#FF4560', '#775DD0', '#00D9E9', '#FF66C3'];
|
|
|
|
/**
|
|
* Randomize array element order in-place.
|
|
* Using Durstenfeld shuffle algorithm.
|
|
*/
|
|
function shuffleArray(array) {
|
|
for (var i = array.length - 1; i > 0; i--) {
|
|
var j = Math.floor(Math.random() * (i + 1));
|
|
var temp = array[i];
|
|
array[i] = array[j];
|
|
array[j] = temp;
|
|
}
|
|
return array;
|
|
}
|
|
|
|
var arrayData = [{
|
|
y: 400,
|
|
quarters: [{
|
|
x: 'Q1',
|
|
y: 120
|
|
}, {
|
|
x: 'Q2',
|
|
y: 90
|
|
}, {
|
|
x: 'Q3',
|
|
y: 100
|
|
}, {
|
|
x: 'Q4',
|
|
y: 90
|
|
}]
|
|
}, {
|
|
y: 430,
|
|
quarters: [{
|
|
x: 'Q1',
|
|
y: 120
|
|
}, {
|
|
x: 'Q2',
|
|
y: 110
|
|
}, {
|
|
x: 'Q3',
|
|
y: 90
|
|
}, {
|
|
x: 'Q4',
|
|
y: 110
|
|
}]
|
|
}, {
|
|
y: 448,
|
|
quarters: [{
|
|
x: 'Q1',
|
|
y: 70
|
|
}, {
|
|
x: 'Q2',
|
|
y: 100
|
|
}, {
|
|
x: 'Q3',
|
|
y: 140
|
|
}, {
|
|
x: 'Q4',
|
|
y: 138
|
|
}]
|
|
}, {
|
|
y: 470,
|
|
quarters: [{
|
|
x: 'Q1',
|
|
y: 150
|
|
}, {
|
|
x: 'Q2',
|
|
y: 60
|
|
}, {
|
|
x: 'Q3',
|
|
y: 190
|
|
}, {
|
|
x: 'Q4',
|
|
y: 70
|
|
}]
|
|
}, {
|
|
y: 540,
|
|
quarters: [{
|
|
x: 'Q1',
|
|
y: 120
|
|
}, {
|
|
x: 'Q2',
|
|
y: 120
|
|
}, {
|
|
x: 'Q3',
|
|
y: 130
|
|
}, {
|
|
x: 'Q4',
|
|
y: 170
|
|
}]
|
|
}, {
|
|
y: 580,
|
|
quarters: [{
|
|
x: 'Q1',
|
|
y: 170
|
|
}, {
|
|
x: 'Q2',
|
|
y: 130
|
|
}, {
|
|
x: 'Q3',
|
|
y: 120
|
|
}, {
|
|
x: 'Q4',
|
|
y: 160
|
|
}]
|
|
}];
|
|
|
|
function makeData() {
|
|
var dataSet = shuffleArray(arrayData)
|
|
|
|
var dataYearSeries = [{
|
|
x: "2011",
|
|
y: dataSet[0].y,
|
|
color: colors[0],
|
|
quarters: dataSet[0].quarters
|
|
}, {
|
|
x: "2012",
|
|
y: dataSet[1].y,
|
|
color: colors[1],
|
|
quarters: dataSet[1].quarters
|
|
}, {
|
|
x: "2013",
|
|
y: dataSet[2].y,
|
|
color: colors[2],
|
|
quarters: dataSet[2].quarters
|
|
}, {
|
|
x: "2014",
|
|
y: dataSet[3].y,
|
|
color: colors[3],
|
|
quarters: dataSet[3].quarters
|
|
}, {
|
|
x: "2015",
|
|
y: dataSet[4].y,
|
|
color: colors[4],
|
|
quarters: dataSet[4].quarters
|
|
}, {
|
|
x: "2016",
|
|
y: dataSet[5].y,
|
|
color: colors[5],
|
|
quarters: dataSet[5].quarters
|
|
}];
|
|
|
|
return dataYearSeries
|
|
}
|
|
|
|
function updateQuarterChart(sourceChart, destChartIDToUpdate) {
|
|
var series = [];
|
|
var seriesIndex = 0;
|
|
var colors = []
|
|
|
|
if (sourceChart.w.globals.selectedDataPoints[0]) {
|
|
var selectedPoints = sourceChart.w.globals.selectedDataPoints;
|
|
for (var i = 0; i < selectedPoints[seriesIndex].length; i++) {
|
|
var selectedIndex = selectedPoints[seriesIndex][i];
|
|
var yearSeries = sourceChart.w.config.series[seriesIndex];
|
|
series.push({
|
|
name: yearSeries.data[selectedIndex].x,
|
|
data: yearSeries.data[selectedIndex].quarters
|
|
})
|
|
colors.push(yearSeries.data[selectedIndex].color)
|
|
}
|
|
|
|
if (series.length === 0) series = [{
|
|
data: []
|
|
}]
|
|
|
|
return ApexCharts.exec(destChartIDToUpdate, 'updateOptions', {
|
|
series: series,
|
|
colors: colors,
|
|
fill: {
|
|
colors: colors
|
|
}
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
new Vue({
|
|
el: '.wrap',
|
|
components: {
|
|
apexchart: VueApexCharts,
|
|
},
|
|
data: {
|
|
seriesQuarter: [{
|
|
data: []
|
|
}],
|
|
seriesYear: [{
|
|
data: makeData()
|
|
}],
|
|
chartOptionsQuarter: {
|
|
chart: {
|
|
id: 'barQuarter',
|
|
height: 400,
|
|
width: '100%',
|
|
type: 'bar',
|
|
stacked: true
|
|
},
|
|
plotOptions: {
|
|
bar: {
|
|
columnWidth: '50%',
|
|
horizontal: false
|
|
}
|
|
},
|
|
|
|
legend: {
|
|
show: false
|
|
},
|
|
grid: {
|
|
yaxis: {
|
|
lines: {
|
|
show: false,
|
|
}
|
|
},
|
|
xaxis: {
|
|
lines: {
|
|
show: true,
|
|
}
|
|
}
|
|
},
|
|
yaxis: {
|
|
labels: {
|
|
show: false
|
|
}
|
|
},
|
|
title: {
|
|
text: 'Quarterly Results',
|
|
offsetX: 10
|
|
},
|
|
tooltip: {
|
|
x: {
|
|
formatter: function (val, opts) {
|
|
return opts.w.globals.seriesNames[opts.seriesIndex]
|
|
}
|
|
},
|
|
y: {
|
|
title: {
|
|
formatter: function (val, opts) {
|
|
return opts.w.globals.labels[opts.dataPointIndex]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
chartOptionsYear: {
|
|
chart: {
|
|
id: 'barYear',
|
|
height: 400,
|
|
width: '100%',
|
|
type: 'bar',
|
|
events: {
|
|
dataPointSelection: function (e, chart, opts) {
|
|
var quarterChartEl = document.querySelector("#chart-quarter");
|
|
var yearChartEl = document.querySelector("#chart-year");
|
|
|
|
if (opts.selectedDataPoints[0].length === 1) {
|
|
if (quarterChartEl.classList.contains("active")) {
|
|
updateQuarterChart(chart, 'barQuarter')
|
|
} else {
|
|
yearChartEl.classList.add("chart-quarter-activated")
|
|
quarterChartEl.classList.add("active");
|
|
updateQuarterChart(chart, 'barQuarter')
|
|
}
|
|
} else {
|
|
updateQuarterChart(chart, 'barQuarter')
|
|
}
|
|
|
|
if (opts.selectedDataPoints[0].length === 0) {
|
|
yearChartEl.classList.remove("chart-quarter-activated")
|
|
quarterChartEl.classList.remove("active");
|
|
}
|
|
|
|
},
|
|
updated: function (chart) {
|
|
updateQuarterChart(chart, 'barQuarter')
|
|
}
|
|
}
|
|
},
|
|
plotOptions: {
|
|
bar: {
|
|
distributed: true,
|
|
horizontal: true,
|
|
barHeight: '75%',
|
|
dataLabels: {
|
|
position: 'bottom'
|
|
}
|
|
}
|
|
},
|
|
dataLabels: {
|
|
enabled: true,
|
|
textAnchor: 'start',
|
|
style: {
|
|
colors: ['#fff']
|
|
},
|
|
formatter: function (val, opt) {
|
|
return opt.w.globals.labels[opt.dataPointIndex]
|
|
},
|
|
offsetX: 0,
|
|
dropShadow: {
|
|
enabled: true
|
|
}
|
|
},
|
|
|
|
colors: colors,
|
|
|
|
states: {
|
|
normal: {
|
|
filter: {
|
|
type: 'desaturate'
|
|
}
|
|
},
|
|
active: {
|
|
allowMultipleDataPointsSelection: true,
|
|
filter: {
|
|
type: 'darken',
|
|
value: 1
|
|
}
|
|
}
|
|
},
|
|
tooltip: {
|
|
x: {
|
|
show: false
|
|
},
|
|
y: {
|
|
title: {
|
|
formatter: function (val, opts) {
|
|
return opts.w.globals.labels[opts.dataPointIndex]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
title: {
|
|
text: 'Yearly Results',
|
|
offsetX: 15
|
|
},
|
|
subtitle: {
|
|
text: '(Click on bar to see details)',
|
|
offsetX: 15
|
|
},
|
|
yaxis: {
|
|
labels: {
|
|
show: false
|
|
}
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
changeData: function() {
|
|
this.$refs.chartYear.updateSeries([{
|
|
data: makeData()
|
|
}])
|
|
}
|
|
}
|
|
})
|
|
</script>
|
|
|
|
</body>
|
|
|
|
</html> |