class BrickTable { constructor(table, per_page) { const columns = [] const no_sort = []; const number = []; // Read the table header for parameters table.querySelectorAll('th').forEach((th, index) => { if (th.dataset.tableNoSort) { no_sort.push(index); } if (th.dataset.tableNumber) { number.push(index); } }); if (no_sort.length) { columns.push({ select: no_sort, sortable: false, searchable: false }); } if (number.length) { columns.push({ select: number, type: "number", searchable: false }); } this.table = new simpleDatatables.DataTable(`#${table.id}`, { columns: columns, pagerDelta: 1, perPage: per_page, perPageSelect: [10, 25, 50, 100, 500, 1000], searchable: true, searchMethod: (table => (terms, cell, row, column, source) => table.search(terms, cell, row, column, source))(this), searchQuerySeparator: "", tableRender: () => { baguetteBox.run("[data-lightbox]"); }, pagerRender: () => { baguetteBox.run("[data-lightbox]"); } }); } // Custom search method // Very simplistic but will exclude pill links search(terms, cell, row, column, source) { // Create a searchable string from the data stack ignoring data-search="exclude" const search = this.buildSearch(cell.data).filter(data => data != "").join(" "); // Search it for (const term of terms) { if (search.includes(term)) { return true; } } return false; } // Build the search string buildSearch(dataList) { let search = []; for (const data of dataList) { // Exclude if (data.attributes && data.attributes['data-search'] && data.attributes['data-search'] == 'exclude') { continue; } // Childnodes if (data.childNodes) { search = search.concat(this.buildSearch(data.childNodes)); } // Data if(data.data) { search.push(data.data.trim().toLowerCase()); } } return search; } } // Helper to setup the tables const setup_tables = (per_page) => document.querySelectorAll('table[data-table="true"]').forEach( el => new BrickTable(el, per_page) );