]> git.giorgioravera.it Git - network-manager.git/commitdiff
Added table wrapper to improve mobile view
authorGiorgio Ravera <giorgio.ravera@gmail.com>
Tue, 9 Jun 2026 12:54:47 +0000 (14:54 +0200)
committerGiorgio Ravera <giorgio.ravera@gmail.com>
Tue, 9 Jun 2026 12:54:47 +0000 (14:54 +0200)
frontend/aliases.html
frontend/css/layout.css
frontend/devices.html
frontend/hosts.html
frontend/js/aliases.js
frontend/js/devices.js
frontend/js/hosts.js
frontend/js/leases.js
frontend/js/settings.js
frontend/leases.html
frontend/settings.html

index c7af665e2b9a5ae8904036f168bbe239307edc0a..303b02b9100da094baf61fac23983182947747dc 100644 (file)
         </div>
     </section>
 
-    <!-- Tabella -->
-    <table id="dataTable" class="table table-bordered table-hover align-middle d-none">
-        <thead class="table-light">
-            <tr>
-                <th data-type="string" data-sortable="true" data-sort="0">Alias      <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="1">Target     <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="2">Description<span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="3">Options    <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="false" data-sort="4">Actions   <span class="sort-arrow" aria-hidden="true"></span></th>
-            </tr>
-        </thead>
-        <tbody></tbody>
-    </table>
+    <!-- Tabella responsive -->
+    <div id="tableWrapper" class="table-responsive mobile-scroll d-none">
+        <table id="dataTable" class="table table-bordered table-hover align-middle">
+            <thead class="table-light">
+                <tr>
+                    <th data-type="string" data-sortable="true"  data-sort="0">Alias      <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="1">Target     <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="2">Description<span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="3">Options    <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="false" data-sort="4">Actions    <span class="sort-arrow" aria-hidden="true"></span></th>
+                </tr>
+            </thead>
+            <tbody></tbody>
+        </table>
+    </div>
 
     <!-- Loader -->
     <div id="loader" class="text-center my-3" style="display: none;">
index 289ff5b5852dcc31d005690dd8527c088183e881..cd67a28f36c026fc268bee7207fb4a3ed8959e4b 100644 (file)
@@ -9,8 +9,7 @@
 
 body {
     font-family: sans-serif;
-    margin: 20px;
-    padding-top: 60px; /* space for fixed topbar */
+    margin: 0;
     background-color: var(--bg-light);
     color: var(--text-dark);
 }
@@ -28,9 +27,8 @@ body {
     width: 100%;
     background: var(--bg-dark);
     border-bottom: 3px solid var(--accent);
-    position: fixed;
+    position: sticky;
     top: 0;
-    left: 0;
     z-index: 1000;
 }
 
@@ -41,6 +39,8 @@ body {
     display: flex;
     justify-content: space-between;
     align-items: center;
+    flex-wrap: wrap;
+    gap: 10px;
 }
 
 .topbar .navbar {
@@ -85,8 +85,8 @@ body {
     background-color: var(--bg-frame);
     border-left: 4px solid var(--accent);
     padding: 6px 14px;
-    margin-bottom: 25px;
     box-shadow: 0 3px 6px rgba(0,0,0,0.18);
+    margin: 20px 20px 25px 20px;
 }
 
 .page-frame h2 {
@@ -216,7 +216,7 @@ body {
     border: none;
     padding: 6px 14px;
     font-size: 0.95rem;
-    line-height: 1;
+    line-height: 1.2;
     vertical-align: middle;
     --icon-color: currentColor;
     transition: all 0.2s ease;
@@ -334,9 +334,8 @@ select.form-select:focus,
    ================================ */
 .icon,
 i.bi {
-    color: var(--icon-color);
-    display: inline-flex;
-    align-items: center;
+    color: var(--icon-color, currentColor);
+    vertical-align: middle;
 }
 
 .icon-static {
@@ -361,24 +360,45 @@ i.bi {
 /* ================================
    Table
    ================================ */
-.table {
-    background-color: #fff;
+.table-responsive {
+    position: relative;
+    margin: 20px;
+    width: calc(100% - 40px);
+    max-height: calc(100vh - 185px);
+    overflow-x: auto;
+    overflow-y: auto;
+    border-radius: 10px;
     box-shadow: 0 3px 6px rgba(0,0,0,0.18);
+    background-color: #fff;
+    -webkit-overflow-scrolling: touch;
+    border: 1px solid var(--border-light);
+}
+
+.table {
+    width: 100%;             /* desktop full width */
+    min-width: max-content;  /* mobile -> scroll */
+    margin: 0;
+    table-layout: auto;
     border-color: var(--border-light);
+    border-style: hidden;
 }
 
 .table th,
 .table td {
     vertical-align: middle;
     border-color: var(--border-light);
+    white-space: nowrap;   /* niente wrap */
 }
 
 .table thead th {
     background-color: #eee;
+    background-clip: padding-box;
     font-weight: 700;
     cursor: default;
     user-select: none;
-    position: relative;
+    position: sticky;
+    top: 0;
+    z-index: 2;
 }
 
 .table thead th:hover::after {
@@ -627,8 +647,46 @@ td.actions {
    Responsive
    ================================ */
 @media (max-width: 640px) {
-    body {
-        padding-top: 48px; /* topbar più compatta su mobile */
+
+    .topbar-inner {
+        flex-wrap: nowrap;
+    }
+
+    .topbar .navbar {
+        padding-left: 0;
+        padding-right: 0;
+    }
+
+    .logo span {
+        font-size: 1.1rem;
+        white-space: nowrap;
+    }
+
+    .page-frame {
+        margin: 10px 10px 15px 10px;
+    }
+
+    .table-responsive {
+        margin: 10px;
+        width: calc(100% - 20px);
+        max-height: calc(100dvh - 11.5rem);
+    }
+
+    .table {
+        font-size: 0.85rem;
+    }
+
+    .table th,
+    .table td {
+        padding: 0.45rem;
+    }
+
+    .btn {
+        padding-left: 0.6rem;
+        padding-right: 0.6rem;
+        display: inline-flex;
+        align-items: center;
+        justify-content: center;
     }
 
     /* Toolbar: su schermi molto stretti mostra solo le icone dei bottoni */
@@ -636,7 +694,8 @@ td.actions {
         display: none;
     }
 
-    .btn .icon {
+    .btn .icon,
+    .btn .bi {
         margin-right: 0;
     }
 }
index 2d2356d4d421efbb7957d4a6915312a6c43c55ac..6ca3e36beaae7954f85a38774155864de36058fd 100644 (file)
         </div>
     </section>
 
-    <!-- Tabella -->
-    <table id="dataTable" class="table table-bordered table-hover align-middle d-none">
-        <thead class="table-light">
-            <tr>
-                <th data-type="ipv4"   data-sortable="true" data-sort="0">IP Address <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="mac"    data-sortable="true" data-sort="1">MAC Address<span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="2">Hostname   <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="3">Description<span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="4">State      <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="5">Active     <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="false" data-sort="6">Actions   <span class="sort-arrow" aria-hidden="true"></span></th>
-            </tr>
-        </thead>
-        <tbody></tbody>
-    </table>
+    <!-- Tabella responsive -->
+    <div id="tableWrapper" class="table-responsive mobile-scroll d-none">
+        <table id="dataTable" class="table table-bordered table-hover align-middle">
+            <thead class="table-light">
+                <tr>
+                    <th data-type="ipv4"   data-sortable="true" data-sort="0">IP Address <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="mac"    data-sortable="true" data-sort="1">MAC Address<span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true" data-sort="2">Hostname   <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true" data-sort="3">Description<span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true" data-sort="4">State      <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true" data-sort="5">Active     <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="false" data-sort="6">Actions   <span class="sort-arrow" aria-hidden="true"></span></th>
+                </tr>
+            </thead>
+            <tbody></tbody>
+        </table>
+    </div>
 
     <!-- Loader -->
     <div id="loader" class="text-center my-3" style="display: none;">
index ba453439325cf78a390e13ce126c4c2c67897120..81951980dc32f5e44e2e9069f9e451879aca7412 100644 (file)
         </div>
     </section>
 
-    <!-- Tabella -->
-    <table id="dataTable" class="table table-bordered table-hover align-middle d-none">
-        <thead class="table-light">
-            <tr>
-                <th data-type="string" data-sortable="true" data-sort="0">Hostname   <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="ipv4"   data-sortable="true" data-sort="1">IP Address <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="mac"    data-sortable="true" data-sort="2">MAC Address<span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="3">Description<span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="4">Options    <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="false" data-sort="5">Actions    <span class="sort-arrow" aria-hidden="true"></span></th>
-            </tr>
-        </thead>
-        <tbody></tbody>
-    </table>
+    <!-- Tabella responsive -->
+    <div id="tableWrapper" class="table-responsive mobile-scroll d-none">
+        <table id="dataTable" class="table table-bordered table-hover align-middle">
+            <thead class="table-light">
+                <tr>
+                    <th data-type="string" data-sortable="true"  data-sort="0">Hostname    <span class="sort-arrow"></span></th>
+                    <th data-type="ipv4"   data-sortable="true"  data-sort="1">IP Address  <span class="sort-arrow"></span></th>
+                    <th data-type="mac"    data-sortable="true"  data-sort="2">MAC Address <span class="sort-arrow"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="3">Description <span class="sort-arrow"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="4">Options     <span class="sort-arrow"></span></th>
+                    <th data-type="string" data-sortable="false" data-sort="5">Actions     <span class="sort-arrow"></span></th>
+                </tr>
+            </thead>
+            <tbody></tbody>
+        </table>
+    </div>
 
     <!-- Loader -->
     <div id="loader" class="text-center my-3" style="display: none;">
index 50969581fd84cc2a4d4349d455e52da8fc8ff6ea..a5a0cd0dcd112db2813b572d81e82f40e40114e6 100644 (file)
@@ -16,10 +16,10 @@ const sortState = { sortDirection: {}, lastSort: null };
 // -----------------------------
 async function fetchAliases () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // hide table during loading to avoid flickering and show loader
-    dataTable.classList.add("d-none");
+    tableWrapper.classList.add("d-none");
 
     try {
         // Show loader
@@ -36,7 +36,7 @@ async function fetchAliases () {
         viewAliases = [];
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
     }
 }
 
@@ -45,7 +45,7 @@ async function fetchAliases () {
 // -----------------------------
 function updateTable () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // DOM Reference
     const tbody = document.querySelector("#dataTable tbody");
@@ -68,7 +68,7 @@ function updateTable () {
         tbody.appendChild(trEmpty);
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
         return;
     }
 
@@ -228,7 +228,7 @@ function updateTable () {
 
     // hide loader and show table
     loader.style.display = "none";
-    dataTable.classList.remove("d-none");
+    tableWrapper.classList.remove("d-none");
 
     // apply current search filter
     const searchInput = document.getElementById("searchInput");
index 0d7779a662c67d133995f63f06238cbea2919451..ad00407657e9e3961e225efa14fd94670f8b2e5c 100644 (file)
@@ -16,10 +16,10 @@ const sortState = { sortDirection: {}, lastSort: null };
 // -----------------------------
 async function fetchDevices () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // hide table during loading to avoid flickering and show loader
-    dataTable.classList.add("d-none");
+    tableWrapper.classList.add("d-none");
 
     try {
         // Show loader
@@ -36,7 +36,7 @@ async function fetchDevices () {
         viewDevices = [];
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
     }
 }
 
@@ -45,7 +45,7 @@ async function fetchDevices () {
 // -----------------------------
 function updateTable () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // DOM Reference
     const tbody = document.querySelector("#dataTable tbody");
@@ -68,7 +68,7 @@ function updateTable () {
         tbody.appendChild(trEmpty);
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
         return;
     }
 
@@ -289,7 +289,7 @@ function updateTable () {
 
     // hide loader and show table
     loader.style.display = "none";
-    dataTable.classList.remove("d-none");
+    tableWrapper.classList.remove("d-none");
 
     // apply current search filter
     const searchInput = document.getElementById("searchInput");
index 4ce2932714ac74eba94e6151dfcbc1227e9d1f92..e9b6d6ebca8d37a5b69b7f99bec5dfd17e24b1f0 100644 (file)
@@ -16,10 +16,10 @@ const sortState = { sortDirection: {}, lastSort: null };
 // -----------------------------
 async function fetchHosts () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // hide table during loading to avoid flickering and show loader
-    dataTable.classList.add("d-none");
+    tableWrapper.classList.add("d-none");
 
     try {
         // Show loader
@@ -36,7 +36,7 @@ async function fetchHosts () {
         viewHosts = [];
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
     }
 }
 
@@ -45,7 +45,7 @@ async function fetchHosts () {
 // -----------------------------
 function updateTable () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // DOM Reference
     const tbody = document.querySelector("#dataTable tbody");
@@ -68,7 +68,7 @@ function updateTable () {
         tbody.appendChild(trEmpty);
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
         return;
     }
 
@@ -238,7 +238,7 @@ function updateTable () {
 
     // hide loader and show table
     loader.style.display = "none";
-    dataTable.classList.remove("d-none");
+    tableWrapper.classList.remove("d-none");
 
     // apply current search filter
     const searchInput = document.getElementById("searchInput");
index 3e6b5b6d692a982b0746783192877ee58d9aea05..36b6daac67dd1a6daec47f23cbf1d837f3355663 100644 (file)
@@ -15,10 +15,10 @@ const sortState = { sortDirection: {}, lastSort: null };
 // -----------------------------
 async function fetchLeases () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // hide table during loading to avoid flickering and show loader
-    dataTable.classList.add("d-none");
+    tableWrapper.classList.add("d-none");
 
     try {
         // Show loader
@@ -35,7 +35,7 @@ async function fetchLeases () {
         viewLeases = [];
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
     }
 }
 
@@ -44,7 +44,7 @@ async function fetchLeases () {
 // -----------------------------
 function updateTable () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // DOM Reference
     const tbody = document.querySelector("#dataTable tbody");
@@ -67,7 +67,7 @@ function updateTable () {
         tbody.appendChild(trEmpty);
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
         return;
     }
 
@@ -253,7 +253,7 @@ function updateTable () {
 
     // hide loader and show table
     loader.style.display = "none";
-    dataTable.classList.remove("d-none");
+    tableWrapper.classList.remove("d-none");
 
     // apply current search filter
     const searchInput = document.getElementById("searchInput");
index 39b5aaa0cfafc4bc73115244121b003ea277ca08..a3a42f17e56c13dcd2aff8ce3bb3f0ba749f2bfa 100644 (file)
@@ -57,10 +57,10 @@ function getConfigValueFromForm() {
 // -----------------------------
 async function fetchConfigs () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
 
     // hide table during loading to avoid flickering and show loader
-    dataTable.classList.add("d-none");
+    tableWrapper.classList.add("d-none");
 
     try {
         // Show loader
@@ -77,7 +77,7 @@ async function fetchConfigs () {
         viewConfigs = [];
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
     }
 }
 
@@ -216,7 +216,7 @@ async function restartApp(button) {
 // -----------------------------
 function updateTable () {
     const loader = document.getElementById("loader");
-    const dataTable = document.getElementById("dataTable");
+    const tableWrapper = document.getElementById("tableWrapper");
     const searchInput = document.getElementById("searchInput");
     const term = searchInput?.value?.trim().toLowerCase();
     const hasSearch = !!term;
@@ -254,7 +254,7 @@ function updateTable () {
         tbody.appendChild(trEmpty);
         // hide loader and show table
         loader.style.display = "none";
-        dataTable.classList.remove("d-none");
+        tableWrapper.classList.remove("d-none");
         return;
     }
 
@@ -401,7 +401,7 @@ function updateTable () {
 
     // hide loader and show table
     loader.style.display = "none";
-    dataTable.classList.remove("d-none");
+    tableWrapper.classList.remove("d-none");
 }
 
 // -----------------------------
index 9ba53221eaa31b75a7febe87bf583d8565ac7384..ddcbebeeefcf07051ccca94f0c24dd166a4445f3 100644 (file)
         </div>
     </section>
 
-    <!-- Tabella -->
-    <table id="dataTable" class="table table-bordered table-hover align-middle d-none">
-        <thead class="table-light">
-            <tr>
-                <th data-type="ipv4"   data-sortable="true" data-sort="0">IP Address<span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="mac"    data-sortable="true" data-sort="1">MAC       <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="2">Hostname  <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="3">Start     <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="4">End       <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="true" data-sort="5">State     <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="false" data-sort="6">Actions  <span class="sort-arrow" aria-hidden="true"></span></th>
-            </tr>
-        </thead>
-        <tbody></tbody>
-    </table>
+    <!-- Tabella responsive -->
+    <div id="tableWrapper" class="table-responsive mobile-scroll d-none">
+        <table id="dataTable" class="table table-bordered table-hover align-middle">
+            <thead class="table-light">
+                <tr>
+                    <th data-type="ipv4"   data-sortable="true"  data-sort="0">IP Address<span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="mac"    data-sortable="true"  data-sort="1">MAC       <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="2">Hostname  <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="3">Start     <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="4">End       <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="true"  data-sort="5">State     <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="false" data-sort="6">Actions   <span class="sort-arrow" aria-hidden="true"></span></th>
+                </tr>
+            </thead>
+            <tbody></tbody>
+        </table>
+    </div>
 
     <!-- Loader -->
     <div id="loader" class="text-center my-3" style="display: none;">
index 46085c995b3cf8d5c3d1153fb332673b0f2c9632..43cd2a184d731df1ca6456c85f461c001de17d68 100644 (file)
         </div>
     </section>
 
-    <!-- Tabella -->
-    <table id="dataTable" class="table table-bordered table-hover align-middle d-none">
-        <thead class="table-light">
-            <tr>
-                <th data-type="string" data-sortable="false">Parameter  <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="false">Value      <span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="false">Description<span class="sort-arrow" aria-hidden="true"></span></th>
-                <th data-type="string" data-sortable="false">Actions   <span class="sort-arrow" aria-hidden="true"></span></th>
-            </tr>
-        </thead>
-        <tbody></tbody>
-    </table>
+    <!-- Tabella responsive -->
+    <div id="tableWrapper" class="table-responsive mobile-scroll d-none">
+        <table id="dataTable" class="table table-bordered table-hover align-middle">
+            <thead class="table-light">
+                <tr>
+                    <th data-type="string" data-sortable="false">Parameter  <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="false">Value      <span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="false">Description<span class="sort-arrow" aria-hidden="true"></span></th>
+                    <th data-type="string" data-sortable="false">Actions    <span class="sort-arrow" aria-hidden="true"></span></th>
+                </tr>
+            </thead>
+            <tbody></tbody>
+        </table>
+    </div>
 
     <!-- Loader -->
     <div id="loader" class="text-center my-3" style="display: none;">