skip to Main Content

I use this script to extend/expand rowGroups in Datatables.

var collapsedGroups = {}; //1

rowGroup: {
    // Uses the 'row group' plugin
    dataSrc: 'data',
    startRender: function(rows, group) {
        var collapsed = !!collapsedGroups[group]; //2
         
    //LOOP THREW EAH ROW
    rows.nodes().each(function (r) {
        //SET DISPLAY = NONE
        r.style.display = 'none';
        //IF COLLAPSED (OPEN)
        if (collapsed) {
          //SET DISPLAY = SHOW
          r.style.display = '';
        }
    });

   // Add category name to the <tr>. NOTE: Hardcoded colspan
  return $('<tr/>')
     .append('<td></td>')
     .attr('data-name', group)
     .toggleClass('collapsed', collapsed);
  }
},

//ON CLICK BTN EXPAND
$(document).on('click', 'i.fa-angle-down', function() {
    //GET TR DATA NAME
    var name = $(this).parent('td').parent('tr').data('name');
    //
    collapsedGroups[name] = !collapsedGroups[name]; //3
    //
    table.draw(false);
});

With this code, i’m able to have several groups open at the same time.
Now i’m trying to only let one group to be open at a time.

I’ve tried to change the obj collapsedGroups to a var:

var collapsedGroup; //1
var collapsed = collapsedGroup; //2
collapsedGroup = name; //3

But this did not work.
How can i change the code to only allow one open group at a time?

JS FIDDLE
https://jsfiddle.net/lbriquet/k2zr5Lws/1/

2

Answers


  1. You need to collect data-name of <tr> on finish draw event then on click <tr> change collapsedGroups of other name to false like:

    $(document).ready(function() {
      var collapsedGroups = {};
    
      var table = $('#example').DataTable({
        paging: false,
        order: [
          [2, 'asc']
        ],
        rowGroup: {
          // Uses the 'row group' plugin
          dataSrc: 2,
          startRender: function(rows, group) {
            var collapsed = !!collapsedGroups[group];
            rows.nodes().each(function(r) {
              r.style.display = 'none';
              if (collapsed) {
                r.style.display = '';
              }
            });
    
            // Add category name to the <tr>. NOTE: Hardcoded colspan
            return $('<tr/>')
              .append('<td colspan="8">' + group + ' (' + rows.count() + ')</td>')
              .attr('data-name', group)
              .toggleClass('collapsed', collapsed);
          }
        }
      });
      let namesTable = [];
      $('#example').on('draw.dt', function() {
        namesTable = [...document.querySelectorAll('#example tr[data-name]')].map(el => el.dataset.name);
      });
    
      $('#example tbody').on('click', 'tr.group-start', function() {
        var name = $(this).data('name');
        namesTable.forEach(el => {
          if (el !== name)
            collapsedGroups[el] = false;
        });
        collapsedGroups[name] = !collapsedGroups[name];
        table.draw(false);
      });
    
    });
    body {
      font: 90%/1.45em "Helvetica Neue", HelveticaNeue, Verdana, Arial, Helvetica, sans-serif;
      margin: 0;
      padding: 0;
      color: #333;
      background-color: #fff;
    }
    <script type="text/javascript" src="//code.jquery.com/jquery-1.9.1.js"></script>
    
    <link rel="stylesheet" type="text/css" href="/css/result-light.css">
    
    <link rel="stylesheet" type="text/css" href="//nightly.datatables.net/css/jquery.dataTables.css">
    <script type="text/javascript" src="//nightly.datatables.net/js/jquery.dataTables.js"></script>
    <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/rowgroup/1.0.2/css/rowGroup.dataTables.min.css">
    <script type="text/javascript" src="//cdn.datatables.net/rowgroup/1.0.2/js/dataTables.rowGroup.min.js"></script>
    <script type="text/javascript" src="https://cdn.datatables.net/buttons/1.2.2/js/buttons.html5.js"></script>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.32/pdfmake.min.js"></script>
    <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/buttons/1.5.1/css/buttons.dataTables.css">
    <script type="text/javascript" src="//cdn.datatables.net/buttons/1.5.1/js/dataTables.buttons.js"></script>
    <script type="text/javascript" src="//cdn.datatables.net/buttons/1.5.1/js/buttons.colVis.min.js"></script>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
    <script type="text/javascript" src="//cdn.datatables.net/buttons/1.5.1/js/buttons.colVis.min.js"></script>
    
    <div class="container">
      <table id="example" class="display" style="width:100%">
        <thead>
          <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td data-search="Tiger Nixon">T. Nixon</td>
            <td>System Architect</td>
            <td>Edinburgh</td>
            <td>61</td>
            <td data-order="1303689600">Mon 25th Apr 11</td>
            <td data-order="320800">$320,800/y</td>
          </tr>
          <tr>
            <td data-search="Garrett Winters">G. Winters</td>
            <td>Accountant</td>
            <td>Tokyo</td>
            <td>63</td>
            <td data-order="1311552000">Mon 25th Jul 11</td>
            <td data-order="170750">$170,750/y</td>
          </tr>
          <tr>
            <td data-search="Ashton Cox">A. Cox</td>
            <td>Junior Technical Author</td>
            <td>San Francisco</td>
            <td>66</td>
            <td data-order="1231718400">Mon 12th Jan 09</td>
            <td data-order="86000">$86,000/y</td>
          </tr>
          <tr>
            <td data-search="Cedric Kelly">C. Kelly</td>
            <td>Senior Javascript Developer</td>
            <td>Edinburgh</td>
            <td>22</td>
            <td data-order="1332979200">Thu 29th Mar 12</td>
            <td data-order="433060">$433,060/y</td>
          </tr>
          <tr>
            <td data-search="Airi Satou">A. Satou</td>
            <td>Accountant</td>
            <td>Tokyo</td>
            <td>33</td>
            <td data-order="1227830400">Fri 28th Nov 08</td>
            <td data-order="162700">$162,700/y</td>
          </tr>
          <tr>
            <td data-search="Brielle Williamson">B. Williamson</td>
            <td>Integration Specialist</td>
            <td>New York</td>
            <td>61</td>
            <td data-order="1354406400">Sun 2nd Dec 12</td>
            <td data-order="372000">$372,000/y</td>
          </tr>
          <tr>
            <td data-search="Herrod Chandler">H. Chandler</td>
            <td>Sales Assistant</td>
            <td>San Francisco</td>
            <td>59</td>
            <td data-order="1344211200">Mon 6th Aug 12</td>
            <td data-order="137500">$137,500/y</td>
          </tr>
          <tr>
            <td data-search="Rhona Davidson">R. Davidson</td>
            <td>Integration Specialist</td>
            <td>Tokyo</td>
            <td>55</td>
            <td data-order="1287014400">Thu 14th Oct 10</td>
            <td data-order="327900">$327,900/y</td>
          </tr>
          <tr>
            <td data-search="Colleen Hurst">C. Hurst</td>
            <td>Javascript Developer</td>
            <td>San Francisco</td>
            <td>39</td>
            <td data-order="1252972800">Tue 15th Sep 09</td>
            <td data-order="205500">$205,500/y</td>
          </tr>
          <tr>
            <td data-search="Sonya Frost">S. Frost</td>
            <td>Software Engineer</td>
            <td>Edinburgh</td>
            <td>23</td>
            <td data-order="1229126400">Sat 13th Dec 08</td>
            <td data-order="103600">$103,600/y</td>
          </tr>
          <tr>
            <td data-search="Jena Gaines">J. Gaines</td>
            <td>Office Manager</td>
            <td>London</td>
            <td>30</td>
            <td data-order="1229644800">Fri 19th Dec 08</td>
            <td data-order="90560">$90,560/y</td>
          </tr>
          <tr>
            <td data-search="Quinn Flynn">Q. Flynn</td>
            <td>Support Lead</td>
            <td>Edinburgh</td>
            <td>22</td>
            <td data-order="1362268800">Sun 3rd Mar 13</td>
            <td data-order="342000">$342,000/y</td>
          </tr>
          <tr>
            <td data-search="Charde Marshall">C. Marshall</td>
            <td>Regional Director</td>
            <td>San Francisco</td>
            <td>36</td>
            <td data-order="1224115200">Thu 16th Oct 08</td>
            <td data-order="470600">$470,600/y</td>
          </tr>
          <tr>
            <td data-search="Haley Kennedy">H. Kennedy</td>
            <td>Senior Marketing Designer</td>
            <td>London</td>
            <td>43</td>
            <td data-order="1355788800">Tue 18th Dec 12</td>
            <td data-order="313500">$313,500/y</td>
          </tr>
          <tr>
            <td data-search="Tatyana Fitzpatrick">T. Fitzpatrick</td>
            <td>Regional Director</td>
            <td>London</td>
            <td>19</td>
            <td data-order="1268784000">Wed 17th Mar 10</td>
            <td data-order="385750">$385,750/y</td>
          </tr>
          <tr>
            <td data-search="Michael Silva">M. Silva</td>
            <td>Marketing Designer</td>
            <td>London</td>
            <td>66</td>
            <td data-order="1353974400">Tue 27th Nov 12</td>
            <td data-order="198500">$198,500/y</td>
          </tr>
          <tr>
            <td data-search="Paul Byrd">P. Byrd</td>
            <td>Chief Financial Officer (CFO)</td>
            <td>New York</td>
            <td>64</td>
            <td data-order="1276041600">Wed 9th Jun 10</td>
            <td data-order="725000">$725,000/y</td>
          </tr>
          <tr>
            <td data-search="Gloria Little">G. Little</td>
            <td>Systems Administrator</td>
            <td>New York</td>
            <td>59</td>
            <td data-order="1239321600">Fri 10th Apr 09</td>
            <td data-order="237500">$237,500/y</td>
          </tr>
          <tr>
            <td data-search="Bradley Greer">B. Greer</td>
            <td>Software Engineer</td>
            <td>London</td>
            <td>41</td>
            <td data-order="1350086400">Sat 13th Oct 12</td>
            <td data-order="132000">$132,000/y</td>
          </tr>
          <tr>
            <td data-search="Dai Rios">D. Rios</td>
            <td>Personnel Lead</td>
            <td>Edinburgh</td>
            <td>35</td>
            <td data-order="1348617600">Wed 26th Sep 12</td>
            <td data-order="217500">$217,500/y</td>
          </tr>
          <tr>
            <td data-search="Jenette Caldwell">J. Caldwell</td>
            <td>Development Lead</td>
            <td>New York</td>
            <td>30</td>
            <td data-order="1315008000">Sat 3rd Sep 11</td>
            <td data-order="345000">$345,000/y</td>
          </tr>
          <tr>
            <td data-search="Yuri Berry">Y. Berry</td>
            <td>Chief Marketing Officer (CMO)</td>
            <td>New York</td>
            <td>40</td>
            <td data-order="1245888000">Thu 25th Jun 09</td>
            <td data-order="675000">$675,000/y</td>
          </tr>
          <tr>
            <td data-search="Caesar Vance">C. Vance</td>
            <td>Pre-Sales Support</td>
            <td>New York</td>
            <td>21</td>
            <td data-order="1323648000">Mon 12th Dec 11</td>
            <td data-order="106450">$106,450/y</td>
          </tr>
          <tr>
            <td data-search="Doris Wilder">D. Wilder</td>
            <td>Sales Assistant</td>
            <td>Sidney</td>
            <td>23</td>
            <td data-order="1284940800">Mon 20th Sep 10</td>
            <td data-order="85600">$85,600/y</td>
          </tr>
          <tr>
            <td data-search="Angelica Ramos">A. Ramos</td>
            <td>Chief Executive Officer (CEO)</td>
            <td>London</td>
            <td>47</td>
            <td data-order="1255046400">Fri 9th Oct 09</td>
            <td data-order="1200000">$1,200,000/y</td>
          </tr>
          <tr>
            <td data-search="Gavin Joyce">G. Joyce</td>
            <td>Developer</td>
            <td>Edinburgh</td>
            <td>42</td>
            <td data-order="1292976000">Wed 22nd Dec 10</td>
            <td data-order="92575">$92,575/y</td>
          </tr>
          <tr>
            <td data-search="Jennifer Chang">J. Chang</td>
            <td>Regional Director</td>
            <td>Singapore</td>
            <td>28</td>
            <td data-order="1289692800">Sun 14th Nov 10</td>
            <td data-order="357650">$357,650/y</td>
          </tr>
          <tr>
            <td data-search="Brenden Wagner">B. Wagner</td>
            <td>Software Engineer</td>
            <td>San Francisco</td>
            <td>28</td>
            <td data-order="1307404800">Tue 7th Jun 11</td>
            <td data-order="206850">$206,850/y</td>
          </tr>
          <tr>
            <td data-search="Fiona Green">F. Green</td>
            <td>Chief Operating Officer (COO)</td>
            <td>San Francisco</td>
            <td>48</td>
            <td data-order="1268265600">Thu 11th Mar 10</td>
            <td data-order="850000">$850,000/y</td>
          </tr>
          <tr>
            <td data-search="Shou Itou">S. Itou</td>
            <td>Regional Marketing</td>
            <td>Tokyo</td>
            <td>20</td>
            <td data-order="1313280000">Sun 14th Aug 11</td>
            <td data-order="163000">$163,000/y</td>
          </tr>
          <tr>
            <td data-search="Michelle House">M. House</td>
            <td>Integration Specialist</td>
            <td>Sidney</td>
            <td>37</td>
            <td data-order="1306972800">Thu 2nd Jun 11</td>
            <td data-order="95400">$95,400/y</td>
          </tr>
          <tr>
            <td data-search="Suki Burks">S. Burks</td>
            <td>Developer</td>
            <td>London</td>
            <td>53</td>
            <td data-order="1256169600">Thu 22nd Oct 09</td>
            <td data-order="114500">$114,500/y</td>
          </tr>
          <tr>
            <td data-search="Prescott Bartlett">P. Bartlett</td>
            <td>Technical Author</td>
            <td>London</td>
            <td>27</td>
            <td data-order="1304726400">Sat 7th May 11</td>
            <td data-order="145000">$145,000/y</td>
          </tr>
          <tr>
            <td data-search="Gavin Cortez">G. Cortez</td>
            <td>Team Leader</td>
            <td>San Francisco</td>
            <td>22</td>
            <td data-order="1224979200">Sun 26th Oct 08</td>
            <td data-order="235500">$235,500/y</td>
          </tr>
          <tr>
            <td data-search="Martena Mccray">M. Mccray</td>
            <td>Post-Sales support</td>
            <td>Edinburgh</td>
            <td>46</td>
            <td data-order="1299628800">Wed 9th Mar 11</td>
            <td data-order="324050">$324,050/y</td>
          </tr>
          <tr>
            <td data-search="Unity Butler">U. Butler</td>
            <td>Marketing Designer</td>
            <td>San Francisco</td>
            <td>47</td>
            <td data-order="1260316800">Wed 9th Dec 09</td>
            <td data-order="85675">$85,675/y</td>
          </tr>
          <tr>
            <td data-search="Howard Hatfield">H. Hatfield</td>
            <td>Office Manager</td>
            <td>San Francisco</td>
            <td>51</td>
            <td data-order="1229385600">Tue 16th Dec 08</td>
            <td data-order="164500">$164,500/y</td>
          </tr>
          <tr>
            <td data-search="Hope Fuentes">H. Fuentes</td>
            <td>Secretary</td>
            <td>San Francisco</td>
            <td>41</td>
            <td data-order="1265932800">Fri 12th Feb 10</td>
            <td data-order="109850">$109,850/y</td>
          </tr>
          <tr>
            <td data-search="Vivian Harrell">V. Harrell</td>
            <td>Financial Controller</td>
            <td>San Francisco</td>
            <td>62</td>
            <td data-order="1234569600">Sat 14th Feb 09</td>
            <td data-order="452500">$452,500/y</td>
          </tr>
          <tr>
            <td data-search="Timothy Mooney">T. Mooney</td>
            <td>Office Manager</td>
            <td>London</td>
            <td>37</td>
            <td data-order="1228953600">Thu 11th Dec 08</td>
            <td data-order="136200">$136,200/y</td>
          </tr>
          <tr>
            <td data-search="Jackson Bradshaw">J. Bradshaw</td>
            <td>Director</td>
            <td>New York</td>
            <td>65</td>
            <td data-order="1222387200">Fri 26th Sep 08</td>
            <td data-order="645750">$645,750/y</td>
          </tr>
          <tr>
            <td data-search="Olivia Liang">O. Liang</td>
            <td>Support Engineer</td>
            <td>Singapore</td>
            <td>64</td>
            <td data-order="1296691200">Thu 3rd Feb 11</td>
            <td data-order="234500">$234,500/y</td>
          </tr>
          <tr>
            <td data-search="Bruno Nash">B. Nash</td>
            <td>Software Engineer</td>
            <td>London</td>
            <td>38</td>
            <td data-order="1304380800">Tue 3rd May 11</td>
            <td data-order="163500">$163,500/y</td>
          </tr>
          <tr>
            <td data-search="Sakura Yamamoto">S. Yamamoto</td>
            <td>Support Engineer</td>
            <td>Tokyo</td>
            <td>37</td>
            <td data-order="1250640000">Wed 19th Aug 09</td>
            <td data-order="139575">$139,575/y</td>
          </tr>
          <tr>
            <td data-search="Thor Walton">T. Walton</td>
            <td>Developer</td>
            <td>New York</td>
            <td>61</td>
            <td data-order="1376179200">Sun 11th Aug 13</td>
            <td data-order="98540">$98,540/y</td>
          </tr>
          <tr>
            <td data-search="Finn Camacho">F. Camacho</td>
            <td>Support Engineer</td>
            <td>San Francisco</td>
            <td>47</td>
            <td data-order="1246924800">Tue 7th Jul 09</td>
            <td data-order="87500">$87,500/y</td>
          </tr>
          <tr>
            <td data-search="Serge Baldwin">S. Baldwin</td>
            <td>Data Coordinator</td>
            <td>Singapore</td>
            <td>64</td>
            <td data-order="1333929600">Mon 9th Apr 12</td>
            <td data-order="138575">$138,575/y</td>
          </tr>
          <tr>
            <td data-search="Zenaida Frank">Z. Frank</td>
            <td>Software Engineer</td>
            <td>New York</td>
            <td>63</td>
            <td data-order="1262563200">Mon 4th Jan 10</td>
            <td data-order="125250">$125,250/y</td>
          </tr>
          <tr>
            <td data-search="Zorita Serrano">Z. Serrano</td>
            <td>Software Engineer</td>
            <td>San Francisco</td>
            <td>56</td>
            <td data-order="1338508800">Fri 1st Jun 12</td>
            <td data-order="115000">$115,000/y</td>
          </tr>
          <tr>
            <td data-search="Jennifer Acosta">J. Acosta</td>
            <td>Junior Javascript Developer</td>
            <td>Edinburgh</td>
            <td>43</td>
            <td data-order="1359676800">Fri 1st Feb 13</td>
            <td data-order="75650">$75,650/y</td>
          </tr>
          <tr>
            <td data-search="Cara Stevens">C. Stevens</td>
            <td>Sales Assistant</td>
            <td>New York</td>
            <td>46</td>
            <td data-order="1323129600">Tue 6th Dec 11</td>
            <td data-order="145600">$145,600/y</td>
          </tr>
          <tr>
            <td data-search="Hermione Butler">H. Butler</td>
            <td>Regional Director</td>
            <td>London</td>
            <td>47</td>
            <td data-order="1300665600">Mon 21st Mar 11</td>
            <td data-order="356250">$356,250/y</td>
          </tr>
          <tr>
            <td data-search="Lael Greer">L. Greer</td>
            <td>Systems Administrator</td>
            <td>London</td>
            <td>21</td>
            <td data-order="1235692800">Fri 27th Feb 09</td>
            <td data-order="103500">$103,500/y</td>
          </tr>
          <tr>
            <td data-search="Jonas Alexander">J. Alexander</td>
            <td>Developer</td>
            <td>San Francisco</td>
            <td>30</td>
            <td data-order="1279065600">Wed 14th Jul 10</td>
            <td data-order="86500">$86,500/y</td>
          </tr>
          <tr>
            <td data-search="Shad Decker">S. Decker</td>
            <td>Regional Director</td>
            <td>Edinburgh</td>
            <td>51</td>
            <td data-order="1226534400">Thu 13th Nov 08</td>
            <td data-order="183000">$183,000/y</td>
          </tr>
          <tr>
            <td data-search="Michael Bruce">M. Bruce</td>
            <td>Javascript Developer</td>
            <td>Singapore</td>
            <td>29</td>
            <td data-order="1309132800">Mon 27th Jun 11</td>
            <td data-order="183000">$183,000/y</td>
          </tr>
          <tr>
            <td data-search="Donna Snider">D. Snider</td>
            <td>Customer Support</td>
            <td>New York</td>
            <td>27</td>
            <td data-order="1295913600">Tue 25th Jan 11</td>
            <td data-order="112000">$112,000/y</td>
          </tr>
        </tbody>
        <tfoot>
          <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
          </tr>
        </tfoot>
      </table>
    </div>

    I added the code with pure js (because i prefere it) but you can change it with jquery if you want.

    Login or Signup to reply.
  2. To change the Datatables rowGroup to only allow one open group at a time, you need to keep track of the currently open group and close the other when a different group opens. I hope the code I will share below will solve your problem.

    var currentOpenGroup = null;
    var collapsedGroups = {};
    
    $('#example').DataTable({
        rowGroup: {
            dataSrc: 'group',
            startRender: function(rows, group) {
                var collapsed = !!collapsedGroups[group];
    
                if (group === currentOpenGroup) {
                    collapsed = false;
                } else if (currentOpenGroup !== null && collapsedGroups[currentOpenGroup] === false) {
                    collapsedGroups[currentOpenGroup] = true;
                }
    
                rows.nodes().each(function (r) {
                    r.style.display = collapsed ? 'none' : '';
                });
    
                return $('<tr/>')
                    .append('<td></td>')
                    .attr('data-name', group)
                    .toggleClass('collapsed', collapsed);
            }
        }
    });
    
    $(document).on('click', 'i.fa-angle-down', function() {
        var name = $(this).parent('td').parent('tr').data('name');
    
        if (name === currentOpenGroup) {
            currentOpenGroup = null;
            collapsedGroups[name] = true;
        } else {
            currentOpenGroup = name;
            for (var group in collapsedGroups) {
                if (group !== name) {
                    collapsedGroups[group] = true;
                }
            }
            collapsedGroups[name] = false;
        }
    
        $('#example').DataTable().draw(false);
    });
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search