• Edit
  • Download
  • <!DOCTYPE html>
    <html class="zc-html">
    
    <head>
      <meta charset="utf-8">
      <title>Row Grouping</title>
      <script nonce="undefined" src="https://cdn.zinggrid.com/zinggrid.min.js"></script>
      <style>
        zg-cell span.positive {
          color: green;
        }
    
        zg-cell span.negative {
          color: red;
        }
    
        zing-grid[loading] {
          height: 142px;
        }
      </style>
    </head>
    
    <body>
      <!-- The data for this grid is set via JavaScript -->
      <zing-grid caption="VoltVoyage eBike Financials 2018-2024">
        <!-- row-group combines rows based on the given indexes -->
        <!-- Comma separating indexes allows you to nest and further group -->
        <zg-column type="row-group" index="date.year,date.month"></zg-column>
        <!-- These columns are what will be shown when rows are expanded -->
        <zg-column index="date.day"></zg-column>
        <zg-column index="revenue" type="currency"></zg-column>
        <zg-column index="cost" type="currency"></zg-column>
        <!-- The aggregate column runs the "findProfit" function declared
               in JavaScript to find the value to display. Here I am using "sum"
               as the aggregate value but I will be computing my own and ignoring
              that "summed" value. -->
        <zg-column header="Profit" type="aggregate" type-aggregate-value="sum" renderer="findProfit"></zg-column>
      </zing-grid>
      <script>
        ZingGrid.setLicense(['26ccbfec16b8be9ee98c7d57bee6e498']);
        /**
         * Renderer function used by the "Profit" aggregate zg-column.
         * Finds the profit using the given revenue and cost entry metrics.
         * @param {Object} recordData - The key:val pair of the entire row
         * @param {Array} aggregateData - An array of just the rows values
         * @param {String} aggregateValue - The row's computed value (e.g. sum, avg, etc)
         * @returns {string} HTML string to be rendered in the cell
         */
        function findProfit(recordData, aggregateData, aggregateValue) {
          let profit = recordData.revenue - recordData.cost;
          return `
        <span class="${profit > 0 ? 'positive' : 'negative'}">
          $${profit.toFixed(2)}
        </span>
      `;
        }
    
        function generateData() {
          function _getRandomInt(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
          }
    
          function _daysInMonth(month, year) {
            return new Date(year, month, 0).getDate();
          }
          const startDate = new Date('January 1, 2018');
          const endDate = new Date('May 1, 2024');
          const months = [
            'January', 'February', 'March', 'April',
            'May', 'June', 'July', 'August', 'September',
            'October', 'November', 'December'
          ];
          const data = [];
          let currentDate = new Date(startDate);
          while (currentDate <= endDate) {
            const year = currentDate.getFullYear();
            const month = currentDate.getMonth();
            const days = _daysInMonth(month + 1, year);
            for (let day = 1; day <= days; day++) {
              const dateObj = {
                year,
                month: months[month],
                day
              };
              const dailyRevenue = (month >= 9 && month <= 11) ?
                (_getRandomInt(35000, 45000) / days).toFixed(2) :
                (_getRandomInt(18000, 32000) / days).toFixed(2);
              const dailyCost = (_getRandomInt(25000, 28000) / days).toFixed(2);
              data.push({
                date: dateObj,
                revenue: Number(dailyRevenue),
                cost: Number(dailyCost)
              });
            }
            currentDate.setMonth(currentDate.getMonth() + 1);
          }
          return data;
        }
        // Grab the zing-grid and insert the data (this demo has a lot of data)
        let zgRef = document.querySelector('zing-grid');
        zgRef.setData(generateData());
      </script>
    </body>
    
    </html>
    <!DOCTYPE html>
    <html class="zc-html">
    
    <head>
      <meta charset="utf-8">
      <title>Row Grouping</title>
      <script src="https://cdn.zinggrid.com/zinggrid.min.js"></script>
    </head>
    
    <body>
      <!-- The data for this grid is set via JavaScript -->
      <zing-grid caption="VoltVoyage eBike Financials 2018-2024">
        <!-- row-group combines rows based on the given indexes -->
        <!-- Comma separating indexes allows you to nest and further group -->
        <zg-column type="row-group" index="date.year,date.month"></zg-column>
        <!-- These columns are what will be shown when rows are expanded -->
        <zg-column index="date.day"></zg-column>
        <zg-column index="revenue" type="currency"></zg-column>
        <zg-column index="cost" type="currency"></zg-column>
        <!-- The aggregate column runs the "findProfit" function declared
               in JavaScript to find the value to display. Here I am using "sum"
               as the aggregate value but I will be computing my own and ignoring
              that "summed" value. -->
        <zg-column header="Profit" type="aggregate" type-aggregate-value="sum" renderer="findProfit"></zg-column>
      </zing-grid>
    </body>
    
    </html>
    zg-cell span.positive {
      color: green;
    }
    
    zg-cell span.negative {
      color: red;
    }
    /**
     * Renderer function used by the "Profit" aggregate zg-column.
     * Finds the profit using the given revenue and cost entry metrics.
     * @param {Object} recordData - The key:val pair of the entire row
     * @param {Array} aggregateData - An array of just the rows values
     * @param {String} aggregateValue - The row's computed value (e.g. sum, avg, etc)
     * @returns {string} HTML string to be rendered in the cell
     */
    function findProfit(recordData, aggregateData, aggregateValue) {
      let profit = recordData.revenue - recordData.cost;
      return `
        <span class="${profit > 0 ? 'positive' : 'negative'}">
          $${profit.toFixed(2)}
        </span>
      `;
    }
    
    function generateData() {
      function _getRandomInt(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
      }
    
      function _daysInMonth(month, year) {
        return new Date(year, month, 0).getDate();
      }
      const startDate = new Date('January 1, 2018');
      const endDate = new Date('May 1, 2024');
      const months = [
        'January', 'February', 'March', 'April',
        'May', 'June', 'July', 'August', 'September',
        'October', 'November', 'December'
      ];
      const data = [];
      let currentDate = new Date(startDate);
      while (currentDate <= endDate) {
        const year = currentDate.getFullYear();
        const month = currentDate.getMonth();
        const days = _daysInMonth(month + 1, year);
        for (let day = 1; day <= days; day++) {
          const dateObj = {
            year,
            month: months[month],
            day
          };
          const dailyRevenue = (month >= 9 && month <= 11) ?
            (_getRandomInt(35000, 45000) / days).toFixed(2) :
            (_getRandomInt(18000, 32000) / days).toFixed(2);
          const dailyCost = (_getRandomInt(25000, 28000) / days).toFixed(2);
          data.push({
            date: dateObj,
            revenue: Number(dailyRevenue),
            cost: Number(dailyCost)
          });
        }
        currentDate.setMonth(currentDate.getMonth() + 1);
      }
      return data;
    }
    // Grab the zing-grid and insert the data (this demo has a lot of data)
    let zgRef = document.querySelector('zing-grid');
    zgRef.setData(generateData());