Я использую этот скрипт для расширения/расширения групп строк в таблицах данных.
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);
});
С помощью этого кода я могу открыть несколько групп одновременно.
Теперь я стараюсь, чтобы одновременно была открыта только одна группа.
Я попытался изменить obj CollapdGroups на var:
var collapsedGroup; //1
var collapsed = collapsedGroup; //2
collapsedGroup = name; //3
Но это не сработало.
Как я могу изменить код, чтобы разрешить только одну открытую группу за раз?
Вам нужно собрать data-name
из <tr>
в событии завершения розыгрыша, а затем при нажатии <tr>
изменить collapsedGroups
другого имени на ложное, например:
$(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>
Я добавил код с чистым js (потому что я предпочитаю его), но вы можете изменить его с помощью jquery, если хотите.
Чтобы изменить группу строк Datatables, чтобы разрешить только одну открытую группу за раз, вам нужно отслеживать текущую открытую группу и закрывать другую, когда открывается другая группа. Я надеюсь, что код, которым я поделюсь ниже, решит вашу проблему.
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);
});
Ваш код не работает, проверьте его на скрипке.
Можете ли вы создать полный фрагмент с помощью инструмента
[<>]
?