all repos — go-lift @ main

Lightweight workout tracker prototype..

static/table.js (view raw)

 1// Set up column visibility toggles
 2
 3let sortColumn = "name";
 4let sortDirection = "asc";
 5let data = [];
 6let columns = [];
 7
 8function setupColumnToggles(columns) {
 9  const togglesContainer = document.querySelector(".column-toggles");
10  columns.forEach((column) => {
11    const label = document.createElement("label");
12    const checkbox = document.createElement("input");
13    checkbox.type = "checkbox";
14    checkbox.checked = column.visible;
15    checkbox.dataset.column = column.id;
16    checkbox.addEventListener("change", function () {
17      columns.find((col) => col.id === column.id).visible = this.checked;
18      renderTable();
19    });
20
21    label.appendChild(checkbox);
22    label.appendChild(document.createTextNode(` ${column.label}`));
23    togglesContainer.appendChild(label);
24  });
25}
26
27// Sort function
28function sortData(columnId) {
29  if (sortColumn === columnId) {
30    sortDirection = sortDirection === "asc" ? "desc" : "asc";
31  } else {
32    sortColumn = columnId;
33    sortDirection = "asc";
34  }
35  renderTable();
36}
37
38function renderTable() {
39  const tableHead = document.querySelector("#data-table thead tr");
40  const tableBody = document.querySelector("#data-table tbody");
41  const searchTerm = document
42    .getElementById("search-input")
43    .value.toLowerCase();
44
45  // Clear existing content
46  tableHead.innerHTML = "";
47  tableBody.innerHTML = "";
48
49  // Add table headers
50  columns.forEach((column) => {
51    if (column.visible) {
52      const th = document.createElement("th");
53      th.textContent = column.label;
54      th.classList.add("sortable");
55      if (sortColumn === column.id) {
56        th.classList.add(sortDirection);
57      }
58      th.addEventListener("click", () => sortData(column.id));
59      tableHead.appendChild(th);
60    }
61  });
62
63  // Filter and sort data
64  const filteredData = data.filter((d) => {
65    return Object.values(d).some((value) =>
66      String(value).toLowerCase().includes(searchTerm)
67    );
68  });
69
70  const sortedData = [...filteredData].sort((a, b) => {
71    const valueA = String(a[sortColumn] || "");
72    const valueB = String(b[sortColumn] || "");
73
74    return sortDirection === "asc"
75      ? valueA.localeCompare(valueB)
76      : valueB.localeCompare(valueA);
77  });
78
79  // Populate table rows
80  sortedData.forEach((r) => {
81    const row = document.createElement("tr");
82
83    columns.forEach((column) => {
84      if (column.visible) {
85        const cell = document.createElement("td");
86        cell.textContent = r[column.id] || "";
87        row.appendChild(cell);
88      }
89    });
90
91    tableBody.appendChild(row);
92  });
93}