• Edit
  • Download
  • <!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;
    }