• Edit
  • Download
  • <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="utf-8">
      <title>ZingSoft Demo</title>
    
      <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;
        }
      </style>
    </head>
    
    <body>
      <div id="myChart"></div>
      <script>
        ZC.LICENSE = ["569d52cefae586f634c54f86dc99e6a9", "b55b025e438fa8a98e32482b5f768ff5"];
        var barConfig = { // initial chart config
          type: 'bar',
          title: {
            text: 'Top Stocks Portfolio'
          },
          plot: {
            cursor: 'pointer',
            valueBox: {
              text: '%t'
            }
          },
          scaleX: {
            label: {
              text: 'Company Price Point'
            },
            item: {
              visible: false
            }
          },
          series: [{
              id: 'MSFT',
              text: 'MSFT',
              dataDescription: 'Microsoft Corporation',
              values: [61.25],
              dataUrl: 'https://cdn.zingchart.com/datasets/msft-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API
            },
            {
              id: 'NKE',
              text: 'NKE',
              dataDescription: 'Nike',
              values: [58.25],
              dataUrl: 'https://cdn.zingchart.com/datasets/nke-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
            },
            {
              id: 'AAPL',
              text: 'AAPL',
              dataDescription: 'Apple Inc',
              values: [148.25],
              dataUrl: 'https://cdn.zingchart.com/datasets/aapl-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
            },
            {
              id: 'INTC',
              text: 'INTC',
              dataDescription: 'Intel Corporation',
              values: [44.55],
              dataUrl: 'https://cdn.zingchart.com/datasets/intc-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
            },
            {
              id: 'MMM',
              text: 'MMM',
              dataDescription: '3M Company',
              values: [230.23],
              dataUrl: 'https://cdn.zingchart.com/datasets/mmm-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
            },
            {
              id: 'MCD',
              text: 'MCD',
              dataDescription: 'Macdonalds',
              values: [165.23],
              dataUrl: 'https://cdn.zingchart.com/datasets/mcd-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
            },
            {
              id: 'DIS',
              text: 'DIS',
              dataDescription: 'DIS Corporation',
              values: [107.67],
              dataUrl: 'https://cdn.zingchart.com/datasets/dis-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
            },
          ]
        };
    
        var drilldownConfig = { // second config for the drilldown
          type: 'line',
          utc: true,
          globals: {
            thousandsSeparator: ','
          },
          title: {
            text: 'Title Is N/A',
            adjustLayout: true
          },
          plot: {
            maxTrackers: 0,
            maxNodes: 0,
            exact: true
          },
          plotarea: {
            margin: 'dynamic',
            adjustLayout: true
          },
          legend: {
            toggleAction: 'hide',
            adjustLayout: true
          },
          scaleX: {
            zooming: true,
            transform: {
              type: 'date',
              all: "%Y/%m/%d"
            }
          },
          scaleY: {
    
          },
          scaleY2: {
            short: true,
            shortUnit: 'M',
            guide: {
              visible: false
            }
          },
          preview: {
            adjustLayout: true
          },
          crosshairX: {
            plotLabel: {
              fontSize: 14,
              borderRadius: 5,
              shadow: 1,
              headerText: '%kv <br><hr>',
              decimals: 2
            }
          },
          scrollX: {},
          series: [],
          labels: [{
            flat: false, // most important. Makes label register click event
            text: 'Go Back',
            backgroundColor: '#C4C4C4',
            borderRadius: 5,
            x: 45,
            y: 15,
            id: 'backwards',
            cursor: 'hand',
            padding: 5,
            hoverState: {
              backgroundColor: '#e0e0e0'
            }
          }]
        };
    
        zingchart.render({
          id: 'myChart',
          data: barConfig,
          height: '100%',
          width: '100%'
        });
    
        var oDataStructure = {}; // local variable cache
    
        /*
         * Retrieve the data. It will be in specific format that can be viewed in the
         * dataUrl property. We initally want to only show the first 4 plots and users can
         * toggle the rest on after load.
         *
         * Real url example: demos.zingchart.com/view/NKVZRE4U/google.json
         */
        function sortAndBindData(aColumnNames, aData, sPlotId) {
    
          /*
           * assign series attributes.
           * end result is an array of objects.
           * [{
           *   values:[],
           *   id: '',
           *   text: '',
           *   visible: true || false,
           *   scales: 'scale-x,scale-y' || 'scale-x,scale-y-2',
           *   short: false || true
           *   shortUnit: 'M' || ''
           * }]
           */
          for (var i = 1, j = 0; i < aColumnNames.length; i++, j++) {
            oDataStructure[sPlotId].series[j] = {}; // create series object
            oDataStructure[sPlotId].series[j].values = [];
            oDataStructure[sPlotId].series[j].id = aColumnNames[i];
            oDataStructure[sPlotId].series[j].text = aColumnNames[i];
            oDataStructure[sPlotId].series[j].visible = true;
            oDataStructure[sPlotId].series[j].scales = aColumnNames[i].includes('Volume') ? 'scale-x, scale-y-2' : 'scale-x, scale-y';
            oDataStructure[sPlotId].series[j].short = aColumnNames[i].includes('Volume') ? 'true' : 'false';
            oDataStructure[sPlotId].series[j].shortUnit = 'M';
          }
    
          /* 
           * force assign all values in one pass. This is the format expected from the xhr request
           * ["Date","Open","High","Low","Close","Volume","Ex-Dividend","Split Ratio","Adj. Open","Adj. High","Adj. Low","Adj. Close","Adj. Volume"]
           *
           * aData[i][1] will access "Open" value
           */
          for (var i = aData.length - 1; i >= 0; i--) {
            oDataStructure[sPlotId].series[0].values.push(aData[i][1]);
            oDataStructure[sPlotId].series[1].values.push(aData[i][2]);
            oDataStructure[sPlotId].series[2].values.push(aData[i][3]);
            oDataStructure[sPlotId].series[3].values.push(aData[i][4]);
            oDataStructure[sPlotId].series[4].values.push(aData[i][5]);
            oDataStructure[sPlotId].series[5].values.push(aData[i][6]);
            oDataStructure[sPlotId].series[6].values.push(aData[i][7]);
            oDataStructure[sPlotId].series[7].values.push(aData[i][8]);
            oDataStructure[sPlotId].series[8].values.push(aData[i][9]);
            oDataStructure[sPlotId].series[9].values.push(aData[i][10]);
            oDataStructure[sPlotId].series[10].values.push(aData[i][11]);
            oDataStructure[sPlotId].series[11].values.push(aData[i][12]);
          }
    
          // this will assign all the data to the chart at once
          zingchart.exec('myChart', 'setdata', {
            data: oDataStructure[sPlotId]
          });
        }
    
        /*
         * Set up the config that is going to be drilled into.
         */
        function renderStockDataFromQuandl(sUrl, sDescription, sPlotId) {
          fetch(sUrl)
            .then(req => {
              return req.json()
            })
            .then(data => {
              var aColumnNames = data.dataset['column_names'];
              var aData = data.dataset.data;
              oDataStructure[sPlotId] = JSON.parse(JSON.stringify(drilldownConfig));
              //oDataStructure[sPlotId].scaleX.minValue = Date.parse(data.dataset['start_date']);
              //oDataStructure[sPlotId].scaleX.maxValue = Date.parse(data.dataset['end_date']);
              oDataStructure[sPlotId].title.text = sDescription + ' Stock Data';
              sortAndBindData(aColumnNames, aData, sPlotId);
            });
        }
    
        /*
         * This evnet handler will either retrieve stock data from AJAX
         * or retrieve the structure from our local variable cache
         */
        function plotClickHandler(e) {
          if (e.xdata['url']) {
            if (!oDataStructure[e.plotid]) { // if doesn't exist in cache. Go get it
              oDataStructure[e.plotid] = {};
              renderStockDataFromQuandl(e.xdata['url'], e.xdata['description'], e.plotid);
            } else { // we already have the data. Render it
              zingchart.exec('myChart', 'setdata', {
                data: oDataStructure[e.plotid]
              });
            }
          }
        }
    
        /*
         * Handle history buttons. You can assign
         * shapes id's and based on id you can go 
         * 'forward' or 'backwards'. You could 
         * also handle this with HTML and register
         * click events to those DOM elements.
         */
        function labelClickHandler(p) {
          var labelId = p.labelid;
          switch (labelId) {
            case 'forwards':
            case 'backwards':
            case 'default':
              zingchart.exec('myChart', 'reload'); // reload loads original JSON packet (not modified packet)
              /* alternative way to reload chart
              zingchart.exec('myChart', 'destroy');
              zingchart.render({
              	id : 'myChart', 
              	data : barConfig, 
                height: '100%', 
              	width: '100%' 
              });
              */
              break;
          }
        }
    
        zingchart.bind('myChart', 'label_click', labelClickHandler);
        zingchart.bind('myChart', 'plot_click', plotClickHandler);
      </script>
    </body>
    
    </html>
    <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="utf-8">
      <title>ZingSoft Demo</title>
    
      <script src="https://cdn.zingchart.com/zingchart.min.js"></script>
    </head>
    
    <body>
      <div id="myChart"></div>
    </body>
    
    </html>
    html,
    body {
      height: 100%;
      width: 100%;
      margin: 0;
      padding: 0;
    }
    
    #myChart {
      height: 100%;
      width: 100%;
      min-height: 150px;
    }
    var barConfig = { // initial chart config
      type: 'bar',
      title: {
        text: 'Top Stocks Portfolio'
      },
      plot: {
        cursor: 'pointer',
        valueBox: {
          text: '%t'
        }
      },
      scaleX: {
        label: {
          text: 'Company Price Point'
        },
        item: {
          visible: false
        }
      },
      series: [{
          id: 'MSFT',
          text: 'MSFT',
          dataDescription: 'Microsoft Corporation',
          values: [61.25],
          dataUrl: 'https://cdn.zingchart.com/datasets/msft-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API
        },
        {
          id: 'NKE',
          text: 'NKE',
          dataDescription: 'Nike',
          values: [58.25],
          dataUrl: 'https://cdn.zingchart.com/datasets/nke-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
        },
        {
          id: 'AAPL',
          text: 'AAPL',
          dataDescription: 'Apple Inc',
          values: [148.25],
          dataUrl: 'https://cdn.zingchart.com/datasets/aapl-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
        },
        {
          id: 'INTC',
          text: 'INTC',
          dataDescription: 'Intel Corporation',
          values: [44.55],
          dataUrl: 'https://cdn.zingchart.com/datasets/intc-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
        },
        {
          id: 'MMM',
          text: 'MMM',
          dataDescription: '3M Company',
          values: [230.23],
          dataUrl: 'https://cdn.zingchart.com/datasets/mmm-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
        },
        {
          id: 'MCD',
          text: 'MCD',
          dataDescription: 'Macdonalds',
          values: [165.23],
          dataUrl: 'https://cdn.zingchart.com/datasets/mcd-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
        },
        {
          id: 'DIS',
          text: 'DIS',
          dataDescription: 'DIS Corporation',
          values: [107.67],
          dataUrl: 'https://cdn.zingchart.com/datasets/dis-stock-data.json' // retrieved from quandl and downloaded so our site demo is not dependent on their API' // retrieved from quandl and downloaded so our site demo is not dependent on their API
        },
      ]
    };
    
    var drilldownConfig = { // second config for the drilldown
      type: 'line',
      utc: true,
      globals: {
        thousandsSeparator: ','
      },
      title: {
        text: 'Title Is N/A',
        adjustLayout: true
      },
      plot: {
        maxTrackers: 0,
        maxNodes: 0,
        exact: true
      },
      plotarea: {
        margin: 'dynamic',
        adjustLayout: true
      },
      legend: {
        toggleAction: 'hide',
        adjustLayout: true
      },
      scaleX: {
        zooming: true,
        transform: {
          type: 'date',
          all: "%Y/%m/%d"
        }
      },
      scaleY: {
    
      },
      scaleY2: {
        short: true,
        shortUnit: 'M',
        guide: {
          visible: false
        }
      },
      preview: {
        adjustLayout: true
      },
      crosshairX: {
        plotLabel: {
          fontSize: 14,
          borderRadius: 5,
          shadow: 1,
          headerText: '%kv <br><hr>',
          decimals: 2
        }
      },
      scrollX: {},
      series: [],
      labels: [{
        flat: false, // most important. Makes label register click event
        text: 'Go Back',
        backgroundColor: '#C4C4C4',
        borderRadius: 5,
        x: 45,
        y: 15,
        id: 'backwards',
        cursor: 'hand',
        padding: 5,
        hoverState: {
          backgroundColor: '#e0e0e0'
        }
      }]
    };
    
    zingchart.render({
      id: 'myChart',
      data: barConfig,
      height: '100%',
      width: '100%'
    });
    
    var oDataStructure = {}; // local variable cache
    
    /*
     * Retrieve the data. It will be in specific format that can be viewed in the
     * dataUrl property. We initally want to only show the first 4 plots and users can
     * toggle the rest on after load.
     *
     * Real url example: demos.zingchart.com/view/NKVZRE4U/google.json
     */
    function sortAndBindData(aColumnNames, aData, sPlotId) {
    
      /*
       * assign series attributes.
       * end result is an array of objects.
       * [{
       *   values:[],
       *   id: '',
       *   text: '',
       *   visible: true || false,
       *   scales: 'scale-x,scale-y' || 'scale-x,scale-y-2',
       *   short: false || true
       *   shortUnit: 'M' || ''
       * }]
       */
      for (var i = 1, j = 0; i < aColumnNames.length; i++, j++) {
        oDataStructure[sPlotId].series[j] = {}; // create series object
        oDataStructure[sPlotId].series[j].values = [];
        oDataStructure[sPlotId].series[j].id = aColumnNames[i];
        oDataStructure[sPlotId].series[j].text = aColumnNames[i];
        oDataStructure[sPlotId].series[j].visible = true;
        oDataStructure[sPlotId].series[j].scales = aColumnNames[i].includes('Volume') ? 'scale-x, scale-y-2' : 'scale-x, scale-y';
        oDataStructure[sPlotId].series[j].short = aColumnNames[i].includes('Volume') ? 'true' : 'false';
        oDataStructure[sPlotId].series[j].shortUnit = 'M';
      }
    
      /* 
       * force assign all values in one pass. This is the format expected from the xhr request
       * ["Date","Open","High","Low","Close","Volume","Ex-Dividend","Split Ratio","Adj. Open","Adj. High","Adj. Low","Adj. Close","Adj. Volume"]
       *
       * aData[i][1] will access "Open" value
       */
      for (var i = aData.length - 1; i >= 0; i--) {
        oDataStructure[sPlotId].series[0].values.push(aData[i][1]);
        oDataStructure[sPlotId].series[1].values.push(aData[i][2]);
        oDataStructure[sPlotId].series[2].values.push(aData[i][3]);
        oDataStructure[sPlotId].series[3].values.push(aData[i][4]);
        oDataStructure[sPlotId].series[4].values.push(aData[i][5]);
        oDataStructure[sPlotId].series[5].values.push(aData[i][6]);
        oDataStructure[sPlotId].series[6].values.push(aData[i][7]);
        oDataStructure[sPlotId].series[7].values.push(aData[i][8]);
        oDataStructure[sPlotId].series[8].values.push(aData[i][9]);
        oDataStructure[sPlotId].series[9].values.push(aData[i][10]);
        oDataStructure[sPlotId].series[10].values.push(aData[i][11]);
        oDataStructure[sPlotId].series[11].values.push(aData[i][12]);
      }
    
      // this will assign all the data to the chart at once
      zingchart.exec('myChart', 'setdata', {
        data: oDataStructure[sPlotId]
      });
    }
    
    /*
     * Set up the config that is going to be drilled into.
     */
    function renderStockDataFromQuandl(sUrl, sDescription, sPlotId) {
      fetch(sUrl)
        .then(req => {
          return req.json()
        })
        .then(data => {
          var aColumnNames = data.dataset['column_names'];
          var aData = data.dataset.data;
          oDataStructure[sPlotId] = JSON.parse(JSON.stringify(drilldownConfig));
          //oDataStructure[sPlotId].scaleX.minValue = Date.parse(data.dataset['start_date']);
          //oDataStructure[sPlotId].scaleX.maxValue = Date.parse(data.dataset['end_date']);
          oDataStructure[sPlotId].title.text = sDescription + ' Stock Data';
          sortAndBindData(aColumnNames, aData, sPlotId);
        });
    }
    
    /*
     * This evnet handler will either retrieve stock data from AJAX
     * or retrieve the structure from our local variable cache
     */
    function plotClickHandler(e) {
      if (e.xdata['url']) {
        if (!oDataStructure[e.plotid]) { // if doesn't exist in cache. Go get it
          oDataStructure[e.plotid] = {};
          renderStockDataFromQuandl(e.xdata['url'], e.xdata['description'], e.plotid);
        } else { // we already have the data. Render it
          zingchart.exec('myChart', 'setdata', {
            data: oDataStructure[e.plotid]
          });
        }
      }
    }
    
    /*
     * Handle history buttons. You can assign
     * shapes id's and based on id you can go 
     * 'forward' or 'backwards'. You could 
     * also handle this with HTML and register
     * click events to those DOM elements.
     */
    function labelClickHandler(p) {
      var labelId = p.labelid;
      switch (labelId) {
        case 'forwards':
        case 'backwards':
        case 'default':
          zingchart.exec('myChart', 'reload'); // reload loads original JSON packet (not modified packet)
          /* alternative way to reload chart
          zingchart.exec('myChart', 'destroy');
          zingchart.render({
          	id : 'myChart', 
          	data : barConfig, 
            height: '100%', 
          	width: '100%' 
          });
          */
          break;
      }
    }
    
    zingchart.bind('myChart', 'label_click', labelClickHandler);
    zingchart.bind('myChart', 'plot_click', plotClickHandler);