Search code examples
csshtml-tablenestedcategories

Html Table struct for nested categories layout


I have a table with many categories Currently, I am rendering them with tr tags, each category will be displayed in a child tag

enter image description here

But this causes the table layout to break when a parent cell has an increase in height

enter image description here

codepend: https://codepen.io/sayuto/pen/YzvPoBO

Where did I go wrong or does someone have a better idea how to do this? I have tried rendering a tr tag that will contain "parent" and "first child", "other children" will be rendered in the next tr, but this is very complicated, calculating rowspan is difficult.

I trying to find out the correct html table layout what I should to use to render table with nested categories

P/s: I am trying to render column by column (this makes it easier for us to gather data and load Building data structures and load data onto tables with default rendering (line by line) is a nightmare for both the writer and the maintainer (in this case - nested categories)


Solution

  • I made you this test code...

    const
      myTable = document.querySelector('#my-table')
    , depIn   = document.querySelector('input[type=range]')
    , depInV   = document.querySelector('input[type=range] + span')
      ;
    depIn.value = 1;
    depInV.textContent = depIn.value + ' X';
    
    depIn.oninput =_=>
      {
      depInV.textContent = depIn.value + ' X'
      myTable.rows[7].cells[0].innerHTML = Array( depIn.valueAsNumber ).fill('x').join('<br>')
      }
    body {
      font-family      : Arial, Helvetica, sans-serif;
      font-size        : 14px;
      }
    table {
      border-collapse  : separate;
      border-spacing   : 1px;
      background-color : darkblue;
      margin           : 1em;
      color            : black;
      font-size        : .8rem;
      }
    th {
      background-color : lightgrey;
      padding          : .6em;
      min-width        : 3.2em;
      }
    td {
      background-color : whitesmoke;
      padding          : .2em .6em;
      min-width        : 3.2em;
      min-height       : 1.5em;
      }
    <p> any X you need... <br>
      <input type="range" min="1" max="10" value="1"><span>1</span>   
    </p>
    <table id="my-table">
      <thead> <tr> <th>Compagny</th> <th>Department</th> <th>Group</th> <th>Team</th> <th>Unit</th> </tr> </thead>
      <tbody>
        <tr>
          <td rowspan="9">.</td> <!-- Compagny      -->
          <td rowspan="3">.</td> <!-- Department L.1 -->
          <td rowspan="2">.</td> <!-- Group      L.1 -->
          <td>.</td>  <!-- Team      L.1 -->
          <td>.</td>  <!-- Unit      L.1 -->
        </tr>
        <tr>
          <td>.</td>  <!-- Team      L.2 -->
          <td>.</td>  <!-- Unit      L.2 -->
        </tr>
        <tr>
          <td>.</td> <!-- Group      L.2 -->
          <td>.</td>  <!-- Team      L.3 -->
          <td>.</td>  <!-- Unit      L.3 -->
        </tr>
        <tr>
          <td rowspan="3">.</td> <!-- Department L.2 -->
          <td>.</td> <!-- Group      L.3 -->
          <td>.</td>  <!-- Team      L.4 -->
          <td>.</td>  <!-- Unit      L.4 -->
        </tr>
        <tr>
          <td rowspan="2">.</td> <!-- Group      L.4 -->
          <td>.</td>  <!-- Team      L.5 -->
          <td>.</td>  <!-- Unit      L.5 -->
        </tr>
        <tr>
          <td>.</td>  <!-- Team      L.6 -->
          <td>.</td>  <!-- Unit      L.6 -->
        </tr>
        <tr>
          <td rowspan="3"> x </td> <!-- Department L.3 -->
          <td>.</td> <!-- Group      L.5 -->
          <td>.</td>  <!-- Team      L.7 -->
          <td>.</td>  <!-- Unit      L.7 -->
        </tr>
        <tr>
          <td rowspan="2">.</td> <!-- Group      L.6 -->
          <td>.</td>  <!-- Team      L.8 -->
          <td>.</td>  <!-- Unit      L.8 -->
        </tr>
        <tr>
          <td>.</td>  <!-- Team      L.9 -->
          <td>.</td>  <!-- Unit      L.9 -->
        </tr>
      </tbody>
    </table>