1

I have a JSON and I am loading JSON data in dataTable inside the bootstrap tabs. I have set a common width (i.e column 1 width=20% and column 2 width=80%) for all the tables but it is applying for the first table inside the first tab. Datatable initializations such as "width" should reflect across the tables inside the tabs. Please help! Thanks in advance!

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Dynamic Tabs</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <link rel="stylesheet" href="https://cdn.datatables.net/1.11.3/css/dataTables.bootstrap4.min.css">  
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>  
  <script src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script>
  <script src="https://cdn.datatables.net/1.11.3/js/dataTables.bootstrap4.min.js"></script>
</head>
<body>

<div class="container">
  <ul class="nav nav-tabs myTab"> </ul>
  <div class="tab-content myTabContent"> </div>
  
  <h3>Selected Data:</h3>
  <table class="selectedTableData table table-bordered table-hover">
    <thead>
      <tr>
        <th>ID</th>
        <th>TEXT</th>
        <th>ACTION</th>
      </tr>
    </thead>
    <tbody>
    </tbody>
 </table>
  
</div>

<script>
$(function() {
    var tempJson = {
        "edi": {
            "name": "EDI",
            "data": [{
                    "id": "1",
                    "text": "edi1"
                },{
                    "id": "2",
                    "text": "edi2"
                },{
                    "id": "3",
                    "text": "edi3"
                },{
                    "id": "4",
                    "text": "edi4"
                },{
                    "id": "5",
                    "text": "edi5"
                }]
        },
        "api": {
            "name": "API",
            "data": [{
                    "id": "01",
                    "text": "api1"
                },{
                    "id": "02",
                    "text": "api2"
                },{
                    "id": "03",
                    "text": "api3"
                }],

        },
        "supply": {
            "name": "SUPPLY",
            "data": [{
                    "id": "001",
                    "text": "supply1"
                },{
                    "id": "003",
                    "text": "supply3"
                }]
        },
        "test": {
            "name": "TEST",
            "data": [{
                    "id": "0001",
                    "text": "test1"
                },{
                    "id": "0002",
                    "text": "test2"
                },{
                    "id": "0003",
                    "text": "test3"
                },{
                    "id": "0004",
                    "text": "test4"
                },{
                    "id": "0005",
                    "text": "test5"
                },{
                    "id": "0006",
                    "text": "test6"
                },{
                    "id": "0007",
                    "text": "test7"
                },{
                    "id": "0008",
                    "text": "test8"
                },{
                    "id": "0009",
                    "text": "test9"
                }]
        }
    };

    var renderDatatable = function(tableId, data) {
        euffnDataTable = $("#" + tableId).DataTable({
            columns: [{ data: "id", width: "20%",
                    render: function(data, type, row) { 
                        if (type == 'display') {
                            return '<input type="checkbox" id="sel_' + row.id + '" class="editor-active template_checkbox" />';
                        }
                        return data;
                    },
                    className: 'selectFlow',
                },
                { data: "text", width: "80%" },
            ],
            data: data,
            dom: "Bfrtip",
            ordering: true,
            pageLength: 3,
            order: [ [0, "asc"] ],
            createdRow: function(row, data, dataIndex) {
                $(row).attr("template-id", data.id);
            }
        });
    }

    $.each(tempJson, function(k, v) {
        let tabList = '<li><a data-toggle="tab" href="#menu_' + k + '">' + v.name + '</a></li>';
        $(".myTab").append(tabList);
        let tabContent = '<div id="menu_' + k + '" class="tab-pane fade">' +
            '<table id="' + k + 'Table" class="bptable display table table-striped table-bordered table-sm lbp-table-grid-header order-column nowrap" style="width:100%; margin:0 !important;"><thead><tr><th>Select</th><th>Flow Name</th></tr></thead></table>' +
            '</div>';
        $(".myTabContent").append(tabContent);
        $(".myTab li:first-child").addClass("active");
        $(".myTabContent .tab-pane:first-child").addClass("in active");
        renderDatatable(k + "Table", v.data);
    });

    var rowArr = [];
    var table = $(".bptable").DataTable();
    $(".bptable").on("click", ".template_checkbox", function() {
        rowArr = [];
        $(this).closest("tr").toggleClass('selected');
        let rowData = table.rows(".selected").data();
        $.each(rowData, function(k, v) {
            rowArr.push(v);
        });        
        var uniqueRowArr = [...new Set(rowArr)];
        console.log(uniqueRowArr);
        $(".selectedTableData tbody").empty();
        $.each(uniqueRowArr, function(key, val) {
            $(".selectedTableData tbody").append('<tr selected-row-id="' + val.id + '"> <td>' + val.id + '</td> <td>' + val.text + '</td> <td><a class="removeData" href="javascript:;"><span class="glyphicon glyphicon-remove"></span></a></td></tr>');
        });
    });

    $(".selectedTableData").on("click", ".removeData", function() {
        var selectedRowId = $(this).closest("tr").attr("selected-row-id");
        $(".bptable tbody tr").each(function() {
            var templateId = $(this).attr("template-id");
            if (selectedRowId == templateId) {
                $(this).removeClass("selected");
                $(this).find(".template_checkbox").prop('checked', false);
            }
        });
        $(this).closest("tr").remove();
    });
    
    // TAB click event
    
    $('.myTab a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
        //console.log("tab clicked!");
        $(".bptable").DataTable().draw();
        
    });
    
    
});
</script>

</body>
</html>
Jagadheesh
  • 49
  • 6

1 Answers1

2

Data tables will calculate a px-width, based on the percentage you supply.

Check the first column in your first tab's table: in the snippet it's style="width: 89px;" on the th. When an element has style='width:.. and there's no evidence of this in the markup/js then it means some js is calculating this add setting it directly on the element.

The actual width value is calculated based on the container width - as the containers (tabs) are not visible at the time the table is rendered, the width is 0 - so datatables doesn't give them the calculated width at they get the default of (100 / number of columns) (50% for 2 columns).

If you remove the column definition widths (width: "20%",) then you can set the width's via css:

.tab-pane .dataTable td:first-child { width: 20%; }
.tab-pane .dataTable td:last-child { width: 80%; }

(you may prefer to use a more specific selector to a specific tab or different per tab/table depending on requirements)

Updated snippet:

$(function() {
  var tempJson = {
    "edi": {
      "name": "EDI",
      "data": [{
        "id": "1",
        "text": "edi1"
      }, {
        "id": "2",
        "text": "edi2"
      }, {
        "id": "3",
        "text": "edi3"
      }, {
        "id": "4",
        "text": "edi4"
      }, {
        "id": "5",
        "text": "edi5"
      }]
    },
    "api": {
      "name": "API",
      "data": [{
        "id": "01",
        "text": "api1"
      }, {
        "id": "02",
        "text": "api2"
      }, {
        "id": "03",
        "text": "api3"
      }],

    },
    "supply": {
      "name": "SUPPLY",
      "data": [{
        "id": "001",
        "text": "supply1"
      }, {
        "id": "003",
        "text": "supply3"
      }]
    },
    "test": {
      "name": "TEST",
      "data": [{
        "id": "0001",
        "text": "test1"
      }, {
        "id": "0002",
        "text": "test2"
      }, {
        "id": "0003",
        "text": "test3"
      }, {
        "id": "0004",
        "text": "test4"
      }, {
        "id": "0005",
        "text": "test5"
      }, {
        "id": "0006",
        "text": "test6"
      }, {
        "id": "0007",
        "text": "test7"
      }, {
        "id": "0008",
        "text": "test8"
      }, {
        "id": "0009",
        "text": "test9"
      }]
    }
  };

  var renderDatatable = function(tableId, data) {
    euffnDataTable = $("#" + tableId).DataTable({
      columns: [{
          data: "id",
          render: function(data, type, row) {
            if (type == 'display') {
              return '<input type="checkbox" id="sel_' + row.id + '" class="editor-active template_checkbox" />';
            }
            return data;
          },
          className: 'selectFlow',
        },
        {
          data: "text",
        },
      ],
      data: data,
      dom: "Bfrtip",
      ordering: true,
      pageLength: 3,
      order: [
        [0, "asc"]
      ],
      createdRow: function(row, data, dataIndex) {
        $(row).attr("template-id", data.id);
      }
    });
  }

  $.each(tempJson, function(k, v) {
    let tabList = '<li><a data-toggle="tab" href="#menu_' + k + '">' + v.name + '</a></li>';
    $(".myTab").append(tabList);
    let tabContent = '<div id="menu_' + k + '" class="tab-pane fade">' +
      '<table id="' + k + 'Table" class="bptable display table table-striped table-bordered table-sm lbp-table-grid-header order-column nowrap" style="width:100%; margin:0 !important;"><thead><tr><th>Select</th><th>Flow Name</th></tr></thead></table>' +
      '</div>';
    $(".myTabContent").append(tabContent);
    $(".myTab li:first-child").addClass("active");
    $(".myTabContent .tab-pane:first-child").addClass("in active");
    renderDatatable(k + "Table", v.data);
  });

  var rowArr = [];
  var table = $(".bptable").DataTable();
  $(".bptable").on("click", ".template_checkbox", function() {
    rowArr = [];
    $(this).closest("tr").toggleClass('selected');
    let rowData = table.rows(".selected").data();
    $.each(rowData, function(k, v) {
      rowArr.push(v);
    });
    var uniqueRowArr = [...new Set(rowArr)];
    console.log(uniqueRowArr);
    $(".selectedTableData tbody").empty();
    $.each(uniqueRowArr, function(key, val) {
      $(".selectedTableData tbody").append('<tr selected-row-id="' + val.id + '"> <td>' + val.id + '</td> <td>' + val.text + '</td> <td><a class="removeData" href="javascript:;"><span class="glyphicon glyphicon-remove"></span></a></td></tr>');
    });
  });

  $(".selectedTableData").on("click", ".removeData", function() {
    var selectedRowId = $(this).closest("tr").attr("selected-row-id");
    $(".bptable tbody tr").each(function() {
      var templateId = $(this).attr("template-id");
      if (selectedRowId == templateId) {
        $(this).removeClass("selected");
        $(this).find(".template_checkbox").prop('checked', false);
      }
    });
    $(this).closest("tr").remove();
  });

  // TAB click event

  $('.myTab a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
    //console.log("tab clicked!");
    $(".bptable").DataTable().draw();

  });


});
.dataTable td:first-child { width: 20%; }
.dataTable td:last-child { width: 80%; }
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.datatables.net/1.11.3/css/dataTables.bootstrap4.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.11.3/js/dataTables.bootstrap4.min.js"></script>
</head>

<div class="container">
  <ul class="nav nav-tabs myTab"> </ul>
  <div class="tab-content myTabContent"> </div>

  <h3>Selected Data:</h3>
  <table class="selectedTableData table table-bordered table-hover">
    <thead>
      <tr>
        <th>ID</th>
        <th>TEXT</th>
        <th>ACTION</th>
      </tr>
    </thead>
    <tbody>
    </tbody>
  </table>

</div>
freedomn-m
  • 27,664
  • 8
  • 35
  • 57
  • Thanks for the quick resolution, but I wonder how can we apply width for dynamically created columns. For instance, if we do not know how many columns will be added to the table how can we apply width? – Jagadheesh Oct 22 '21 at 08:38