avr39ripe

jsSortableTable

Apr 28th, 2021
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html lang="en" id="html">
  3.  
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <title>SortableTable</title>
  7.     <style>
  8.         body {
  9.             margin: 0;
  10.             padding: 0;
  11.             background-color: antiquewhite;
  12.             font-family: sans-serif;
  13.         }
  14.  
  15.         #container {
  16.             display: flex;
  17.             margin: auto;
  18.             margin-top: 80px;
  19.             align-items: center;
  20.             justify-content: center;
  21.             line-height: 40px;
  22.             font-size: 26px;
  23.             max-width: 50%;
  24.         }
  25.  
  26.         table,
  27.         th,
  28.         td {
  29.             border: 1px solid black;
  30.         }
  31.  
  32.         table {
  33.             border-collapse: collapse;
  34.         }
  35.  
  36.         td,
  37.         th {
  38.             padding: 10px 30px;
  39.         }
  40.     </style>
  41. </head>
  42. <body>
  43.     <div id="container" class="container">
  44.     </div>
  45.  
  46.     <script>
  47.         'use strict'
  48.  
  49.         class SortableTable {
  50.             constructor(arr, containerId) {
  51.                 this._containerId = containerId;
  52.                 this._arr = arr
  53.             }
  54.  
  55.             render() {
  56.                 let container = document.querySelector(`#${this._containerId}`);
  57.                 let table = document.createElement('table');
  58.                 table.id = `${this._containerId}Table`;
  59.                 let tbody = document.createElement('tbody');
  60.  
  61.                 // create header
  62.                 let tr = document.createElement("tr");
  63.                 tr.addEventListener('click', this.onClick);
  64.                 tbody.append(tr);
  65.                 let columnId = 0;
  66.  
  67.                 for (let headerName of this._arr[0]) {
  68.                     let th = document.createElement("th");
  69.                     th.textContent = headerName;
  70.                     th.setAttribute('data-columnId', columnId++);
  71.                     tr.append(th);
  72.                 }
  73.  
  74.                 // create rows
  75.                 for (let i = 1; i < this._arr.length; ++i) {
  76.                     tr = document.createElement("tr");
  77.                     tbody.append(tr);
  78.  
  79.                     for (let it of this._arr[i]) {
  80.                         let td = document.createElement("td");
  81.                         td.textContent = it;
  82.                         tr.append(td);
  83.                     }
  84.                 }
  85.  
  86.                 table.append(tbody);
  87.                 container.append(table);
  88.             }
  89.  
  90.             onClick(event) {
  91.                 this.dir = !this.dir;
  92.                 const sortPos = this.dir ? 1 : -1;
  93.                 const sortNeg = this.dir ? -1 : 1;
  94.  
  95.                 let table = event.target.closest('table')
  96.                 let rowsArr = Array.from(table.rows);
  97.                 let idx = event.target.dataset.columnid;
  98.  
  99.                 let sortTable = rowsArr.slice(1).sort((a, b) => a.cells[idx].textContent > b.cells[idx].textContent ? sortPos : sortNeg);
  100.  
  101.                 table.tBodies[0].append(...sortTable);
  102.             }
  103.         }
  104.  
  105.         {
  106.             let itPersons = [
  107.                 ["Firstname", "Lastname", "Age", "Company"],
  108.                 ["Mark", "Zuckerberg", "41", "Facebook"],
  109.                 ["Larry", "Page", "38", "Google"],
  110.                 ["Timothy", "Cook", "57", "Apple"],
  111.                 ["Bill", "Gates", "62", "Microsoft"]
  112.             ];
  113.  
  114.             let itPersonsTable = new SortableTable(itPersons, 'container');
  115.             itPersonsTable.render();
  116.         }
  117.     </script>
  118. </body>
  119.  
  120. </html>
Advertisement
Add Comment
Please, Sign In to add comment