/** Handlers for events in datatables **/ var addTableLength = (menuList, lengthToAdd, dataLength) => { if(dataLength >= lengthToAdd) { newList = structuredClone(menuList);//menuList.slice(0, menuList.length); // shallow copy newList.push(lengthToAdd); return newList; } return menuList; }; var defaultLengthMenu = (data) => { menuList = [] var lengths = [10, 25, 50, 100, 1000]; if(data.length > 1000) { lengths.push(data.length) } lengths.forEach((len) => { menuList = addTableLength(menuList, len, data.length); }); return menuList; }; var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => { var defaultSettings = { responsive: true, layout: { topStart: null, topEnd: null, bottomStart: null, bottomEnd: null, }, select: true, lengthMenu: defaultLengthMenu(data), language: { processing: "Processing… Please wait.", loadingRecords: "Loading table data… Please wait.", lengthMenu: "", info: "" }, drawCallback: function (settings) { var api = this.api(); api.rows({selected: true}).nodes().each((node, index) => { $(node).find('input[type="checkbox"]:checked') .prop("checked", true); }); api.rows({selected: false}).nodes().each((node, index) => { $(node).find('input[type="checkbox"]:not(:checked)') .prop("checked", false); }); } } var theDataTable = $(tableId).DataTable({ ...defaultSettings, ...userSettings, ...(data.length == 0 ? {} : {data: data}), ...(columns.length == 0 ? {} : {columns: columns}) }); theDataTable.on("select", (event, datatable, type, indexes) => { datatable .rows(indexes) .nodes() .each((node, index) => { $(node).find('input[type="checkbox"]:not(:checked)') .prop("checked", true); }); }); theDataTable.on("deselect", (event, datatable, type, indexes) => { datatable .rows(indexes) .nodes() .each(function(node, index) { $(node).find('input[type="checkbox"]:checked') .prop("checked", false); }); }); return theDataTable; };