/** 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, 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, /* == Scroller settings == */ scroller: true, paging: true, // MUST be true for scroller to work scrollY: "750px", deferRender: true, /* == END: Scroller settings == */ lengthMenu: defaultLengthMenu(data), language: { processing: "Processing… Please wait.", loadingRecords: "Loading table data… Please wait.", lengthMenu: "", info: "" }, data: data, columns: columns, drawCallback: (settings) => { $(this[0]).find("tbody tr").each((idx, row) => { var arow = $(row); var checkboxOrRadio = arow.find(".chk-row-select"); if (checkboxOrRadio) { if (arow.hasClass("selected")) { checkboxOrRadio.prop("checked", true); } else { checkboxOrRadio.prop("checked", false); } } }); } } var theDataTable = $(tableId).DataTable({ ...defaultSettings, ...userSettings }); theDataTable.on("select", (event, datatable, type, cell, originalEvent) => { datatable.rows({selected: true}).nodes().each((node, index) => { $(node).find(".chk-row-select").prop("checked", true) }); }); theDataTable.on("deselect", (event, datatable, type, cell, originalEvent) => { datatable.rows({selected: false}).nodes().each((node, index) => { $(node).find(".chk-row-select").prop("checked", false) }); }); return theDataTable; };