<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ZingSoft Demo</title>
<script nonce="undefined">
/* create fake cookie */
var globalSessionId = Math.floor(Math.random() * 9007199254740991);
if (localStorage) {
if (localStorage.getItem('zc-crud-demo-sessionId')) {
globalSessionId = localStorage.getItem('zc-crud-demo-sessionId');
} else {
localStorage.setItem('zc-crud-demo-sessionId', globalSessionId);
}
}
</script>
<script nonce="undefined" src="https://cdn.zingchart.com/zingchart.min.js"></script>
<style>
html,
body {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
#myChart {
height: 100%;
width: 100%;
min-height: 150px;
}
.zc-ref {
display: none;
}
#myChart button {
position: absolute;
top: 15px;
left: 10px;
z-index: 1000;
}
#myChart button:nth-child(3) {
position: absolute;
top: 55px;
left: 10px;
z-index: 1000;
}
/* Modal Styling */
#mask {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: #FFF;
z-index: 500;
opacity: .5;
visibility: hidden;
}
form {
background-color: #E0E0E0;
height: 70px;
width: 300px;
position: fixed;
top: calc(50% - 35px);
left: calc(50% - 150px);
z-index: 1000;
padding: 10px;
border-radius: 5px;
opacity: 1;
visibility: hidden;
}
#myChart button {
padding: 8px;
font-size: 16;
}
</style>
</head>
<body>
<!-- Overlay Mask -->
<div id="mask"></div>
<!-- Overlay form -->
<form>
<input type="hidden" id="plot-index">
<label>Plot text:</label>
<input type="text" id="plot-text">
<br>
<label>Plot Value:</label>
<input type="number" id="plot-value">
<hr>
<button onclick="return removePlot();">Delete</button>
<button onclick="return updatePlot();">Update/Add</button>
</form>
<!-- ZingChart Stuff -->
<div id="myChart">
<a class="zc-ref" href="https://www.zingchart.com">Powered by ZingChart</a>
<button onclick="window.parent.location.reload()">Reload iframe</button>
<button onclick="window.addPlot()">Add Plot</button>
</div>
<script>
ZC.LICENSE = ["569d52cefae586f634c54f86dc99e6a9", "b55b025e438fa8a98e32482b5f768ff5"]; // make the initial AJAX request to load chart data for user
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", renderFirstPlotInChart);
oReq.open("GET", "https://zingchart-rest-api.glitch.me/api/data/session/" + globalSessionId);
oReq.send();
// define chart JSON
var myConfig = {
type: 'pie',
title: {
text: 'Double click on a slice to edit',
fontSize: 32,
mediaRules: [{
maxWidth: 500,
fontSize: 15
}]
},
plot: {
cursor: 'pointer',
detach: false,
animation: {}, // add animation to make the chart look alive
tooltip: {
text: '%t <br> value: %v <br> percentage value: %npv'
},
animation: {}
},
tooltip: {
borderRadius: 5
},
legend: {
toggleAction: 'remove',
maxItems: 5,
overflow: 'scroll'
},
scaleY: {
values: '0:300:100' // this will prevent users from noticing the scale repaint
},
series: [{
values: [],
text: '',
}]
};
/*
* on double click event listener
* populate and display the form
*/
zingchart.bind('myChart', 'node_doubleclick', function(e) {
var formElem = document.querySelector('form');
var maskElem = document.getElementById('mask');
var plotIndex = formElem.querySelector('#plot-index');
var plotText = formElem.querySelector('#plot-text');
var plotValue = formElem.querySelector('#plot-value');
// get plotinformation
var plotInfo = zingchart.exec('myChart', 'getobjectinfo', {
object: 'plot',
plotindex: e.plotindex
});
// assign form elements
plotIndex.value = e.plotindex;
plotText.value = plotInfo.text;
plotValue.value = e.value;
// display form
maskElem.style.visibility = 'visible';
formElem.style.visibility = 'visible';
plotText.focus();
});
// once even has been fired, update db
zingchart.bind('myChart', 'plot_add', lazyUpdateDb);
zingchart.bind('myChart', 'plot_remove', lazyUpdateDb);
zingchart.bind('myChart', 'plot_modify', lazyUpdateDb);
/*
* add/update the plot from the chart
* and adjust the form fields. It is not an efficient
* update/add. It will always overwrite the db entry
*/
function lazyUpdateDb(e) {
//console.log('----updating db----',e);
setTimeout(function() {
var graphSeriesData = zingchart.exec(e.id, 'getseriesdata');
var dbArrayOfObjects = [];
// make db object
for (var i = 0; i < graphSeriesData.length; i++) {
dbArrayOfObjects.push({
text: graphSeriesData[i].text,
value: graphSeriesData[i].values[0]
});
}
if (graphSeriesData) { // if data and nothing went wrong. Update
oReq = new XMLHttpRequest();
//oReq.addEventListener("load", renderFirstPlotInChart);
oReq.open("POST", "https://zingchart-rest-api.glitch.me/api/data/session/" + globalSessionId);
oReq.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
oReq.send(JSON.stringify(dbArrayOfObjects));
} else {
//console.log('----failed to update db----');
}
}, 200);
}
/*
* callback for GET request is when we will render the chart
*/
function renderFirstPlotInChart() {
//console.log('----rendering chart----', globalSessionId);
var dbPlots = JSON.parse(this.responseText);
var seriesArray = [];
for (var i = 0; i < dbPlots.length; i++) {
seriesArray.push({
text: dbPlots[i].text,
values: [dbPlots[i].value],
})
}
myConfig.series = seriesArray; // assign series array of objects
zingchart.render({
id: 'myChart',
data: myConfig,
height: '100%',
width: '100%'
});
}
/*
* will add/update the plot from the chart
* and adjust the form fields.
*/
window.updatePlot = function(e) {
//console.log('----updating/adding plot----');
var formElem = document.querySelector('form');
var maskElem = document.getElementById('mask');
var plotIndex = formElem.querySelector('#plot-index');
var plotText = formElem.querySelector('#plot-text');
var plotValue = formElem.querySelector('#plot-value');
if (plotIndex.value) {
zingchart.exec('myChart', 'modifyplot', {
plotindex: plotIndex.value,
data: {
text: plotText.value,
values: [Number(plotValue.value)]
}
});
} else {
zingchart.exec('myChart', 'addplot', {
data: { // will automatically append data to the end of the chart
text: plotText.value || 'Default Text',
values: [Number(plotValue.value) || 35]
}
});
}
// clear all values
maskElem.style.visibility = 'hidden';
plotIndex.value = '';
plotText.value = '';
plotValue.value = '';
formElem.style.visibility = 'hidden';
// make sure form doesn't execute!
return false;
}
/*
* removePlot will remove the plot from the chart
* and adjust the form fields
*/
window.removePlot = function() {
//console.log('----removing plot----');
var formElem = document.querySelector('form');
var maskElem = document.getElementById('mask');
var plotIndex = formElem.querySelector('#plot-index');
var plotText = formElem.querySelector('#plot-text');
var plotValue = formElem.querySelector('#plot-value');
// remove only if valid id is provided
if (plotIndex.value) {
zingchart.exec('myChart', 'removeplot', {
plotindex: plotIndex.value
});
}
// clear all values
maskElem.style.visibility = 'hidden';
plotIndex.value = '';
plotText.value = '';
plotValue.value = '';
formElem.style.visibility = 'hidden';
// make sure form doesn't execute!
return false;
}
/*
* addplot pulls up the form overlay
*/
window.addPlot = function() {
var formElem = document.querySelector('form').style.visibility = 'visible';
var maskElem = document.getElementById('mask').style.visibility = 'visible';
var plotText = document.getElementById('plot-text');
var plotValue = document.getElementById('plot-value');
plotText.value = "Default Text";
plotValue.value = 25;
plotText.focus();
return false;
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ZingSoft Demo</title>
<script>
/* create fake cookie */
var globalSessionId = Math.floor(Math.random() * 9007199254740991);
if (localStorage) {
if (localStorage.getItem('zc-crud-demo-sessionId')) {
globalSessionId = localStorage.getItem('zc-crud-demo-sessionId');
} else {
localStorage.setItem('zc-crud-demo-sessionId', globalSessionId);
}
}
</script>
<script src="https://cdn.zingchart.com/zingchart.min.js"></script>
</head>
<body>
<!-- Overlay Mask -->
<div id="mask"></div>
<!-- Overlay form -->
<form>
<input type="hidden" id="plot-index">
<label>Plot text:</label>
<input type="text" id="plot-text">
<br>
<label>Plot Value:</label>
<input type="number" id="plot-value">
<hr>
<button onclick="return removePlot();">Delete</button>
<button onclick="return updatePlot();">Update/Add</button>
</form>
<!-- ZingChart Stuff -->
<div id="myChart">
<a class="zc-ref" href="https://www.zingchart.com">Powered by ZingChart</a>
<button onclick="window.parent.location.reload()">Reload iframe</button>
<button onclick="window.addPlot()">Add Plot</button>
</div>
</body>
</html>
html,
body {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
#myChart {
height: 100%;
width: 100%;
min-height: 150px;
}
.zc-ref {
display: none;
}
#myChart button {
position: absolute;
top: 15px;
left: 10px;
z-index: 1000;
}
#myChart button:nth-child(3) {
position: absolute;
top: 55px;
left: 10px;
z-index: 1000;
}
/* Modal Styling */
#mask {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: #FFF;
z-index: 500;
opacity: .5;
visibility: hidden;
}
form {
background-color: #E0E0E0;
height: 70px;
width: 300px;
position: fixed;
top: calc(50% - 35px);
left: calc(50% - 150px);
z-index: 1000;
padding: 10px;
border-radius: 5px;
opacity: 1;
visibility: hidden;
}
#myChart button {
padding: 8px;
font-size: 16;
}
// make the initial AJAX request to load chart data for user
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", renderFirstPlotInChart);
oReq.open("GET", "https://zingchart-rest-api.glitch.me/api/data/session/" + globalSessionId);
oReq.send();
// define chart JSON
var myConfig = {
type: 'pie',
title: {
text: 'Double click on a slice to edit',
fontSize: 32,
mediaRules: [{
maxWidth: 500,
fontSize: 15
}]
},
plot: {
cursor: 'pointer',
detach: false,
animation: {}, // add animation to make the chart look alive
tooltip: {
text: '%t <br> value: %v <br> percentage value: %npv'
},
animation: {}
},
tooltip: {
borderRadius: 5
},
legend: {
toggleAction: 'remove',
maxItems: 5,
overflow: 'scroll'
},
scaleY: {
values: '0:300:100' // this will prevent users from noticing the scale repaint
},
series: [{
values: [],
text: '',
}]
};
/*
* on double click event listener
* populate and display the form
*/
zingchart.bind('myChart', 'node_doubleclick', function(e) {
var formElem = document.querySelector('form');
var maskElem = document.getElementById('mask');
var plotIndex = formElem.querySelector('#plot-index');
var plotText = formElem.querySelector('#plot-text');
var plotValue = formElem.querySelector('#plot-value');
// get plotinformation
var plotInfo = zingchart.exec('myChart', 'getobjectinfo', {
object: 'plot',
plotindex: e.plotindex
});
// assign form elements
plotIndex.value = e.plotindex;
plotText.value = plotInfo.text;
plotValue.value = e.value;
// display form
maskElem.style.visibility = 'visible';
formElem.style.visibility = 'visible';
plotText.focus();
});
// once even has been fired, update db
zingchart.bind('myChart', 'plot_add', lazyUpdateDb);
zingchart.bind('myChart', 'plot_remove', lazyUpdateDb);
zingchart.bind('myChart', 'plot_modify', lazyUpdateDb);
/*
* add/update the plot from the chart
* and adjust the form fields. It is not an efficient
* update/add. It will always overwrite the db entry
*/
function lazyUpdateDb(e) {
//console.log('----updating db----',e);
setTimeout(function() {
var graphSeriesData = zingchart.exec(e.id, 'getseriesdata');
var dbArrayOfObjects = [];
// make db object
for (var i = 0; i < graphSeriesData.length; i++) {
dbArrayOfObjects.push({
text: graphSeriesData[i].text,
value: graphSeriesData[i].values[0]
});
}
if (graphSeriesData) { // if data and nothing went wrong. Update
oReq = new XMLHttpRequest();
//oReq.addEventListener("load", renderFirstPlotInChart);
oReq.open("POST", "https://zingchart-rest-api.glitch.me/api/data/session/" + globalSessionId);
oReq.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
oReq.send(JSON.stringify(dbArrayOfObjects));
} else {
//console.log('----failed to update db----');
}
}, 200);
}
/*
* callback for GET request is when we will render the chart
*/
function renderFirstPlotInChart() {
//console.log('----rendering chart----', globalSessionId);
var dbPlots = JSON.parse(this.responseText);
var seriesArray = [];
for (var i = 0; i < dbPlots.length; i++) {
seriesArray.push({
text: dbPlots[i].text,
values: [dbPlots[i].value],
})
}
myConfig.series = seriesArray; // assign series array of objects
zingchart.render({
id: 'myChart',
data: myConfig,
height: '100%',
width: '100%'
});
}
/*
* will add/update the plot from the chart
* and adjust the form fields.
*/
window.updatePlot = function(e) {
//console.log('----updating/adding plot----');
var formElem = document.querySelector('form');
var maskElem = document.getElementById('mask');
var plotIndex = formElem.querySelector('#plot-index');
var plotText = formElem.querySelector('#plot-text');
var plotValue = formElem.querySelector('#plot-value');
if (plotIndex.value) {
zingchart.exec('myChart', 'modifyplot', {
plotindex: plotIndex.value,
data: {
text: plotText.value,
values: [Number(plotValue.value)]
}
});
} else {
zingchart.exec('myChart', 'addplot', {
data: { // will automatically append data to the end of the chart
text: plotText.value || 'Default Text',
values: [Number(plotValue.value) || 35]
}
});
}
// clear all values
maskElem.style.visibility = 'hidden';
plotIndex.value = '';
plotText.value = '';
plotValue.value = '';
formElem.style.visibility = 'hidden';
// make sure form doesn't execute!
return false;
}
/*
* removePlot will remove the plot from the chart
* and adjust the form fields
*/
window.removePlot = function() {
//console.log('----removing plot----');
var formElem = document.querySelector('form');
var maskElem = document.getElementById('mask');
var plotIndex = formElem.querySelector('#plot-index');
var plotText = formElem.querySelector('#plot-text');
var plotValue = formElem.querySelector('#plot-value');
// remove only if valid id is provided
if (plotIndex.value) {
zingchart.exec('myChart', 'removeplot', {
plotindex: plotIndex.value
});
}
// clear all values
maskElem.style.visibility = 'hidden';
plotIndex.value = '';
plotText.value = '';
plotValue.value = '';
formElem.style.visibility = 'hidden';
// make sure form doesn't execute!
return false;
}
/*
* addplot pulls up the form overlay
*/
window.addPlot = function() {
var formElem = document.querySelector('form').style.visibility = 'visible';
var maskElem = document.getElementById('mask').style.visibility = 'visible';
var plotText = document.getElementById('plot-text');
var plotValue = document.getElementById('plot-value');
plotText.value = "Default Text";
plotValue.value = 25;
plotText.focus();
return false;
}