recheckRows = function(theTable, checkedRows){
// This is meant to recheck checkboxes after columns are resized
checkCells = theTable.column(0).nodes().to$();
for (let i = 0; i < checkCells.length; i++) {
if (checkedRows.includes(i)){
checkCells[i].childNodes[0].checked = true;
}
}
checkRows = traitTable.rows().nodes();
for (let i =0; i < checkRows.length; i++) {
if (checkedRows.includes(i)){
checkRows[i].classList.add("selected")
}
}
}
getCheckedRows = function(tableId){
let checkedRows = []
$("#" + tableId + " input.checkbox").each(function(index){
if ($(this).prop("checked") == true){
checkedRows.push(index);
}
});
return checkedRows
}
function setUserColumnsDefWidths(tableId, columnDefs) {
var userColumnDef;
// Get the settings for this table from localStorage
var userColumnDefs = JSON.parse(localStorage.getItem(tableId)) || [];
if (userColumnDefs.length === 0 ) return;
columnDefs.forEach( function(columnDef) {
// Check if there is a width specified for this column
userColumnDef = userColumnDefs.find( function(column) {
return column.targets === columnDef.targets;
});
// If there is, set the width of this columnDef in px
if ( userColumnDef ) {
columnDef.sWidth = userColumnDef.width + 'px';
columnDef.width = userColumnDef.width + 'px';
$('.toggle-vis').each(function(){
if ($(this).attr('data-column') == columnDef.targets){
if ($(this).hasClass("active")){
columnDef.bVisible = false
} else {
columnDef.bVisible = true
}
}
})
}
});
return columnDefs
}
function saveColumnSettings(tableId, traitTable) {
var userColumnDefs = JSON.parse(localStorage.getItem(tableId)) || [];
var width, header, existingSetting;
traitTable.columns().every( function ( targets ) {
// Check if there is a setting for this column in localStorage
existingSetting = userColumnDefs.findIndex( function(column) { return column.targets === targets;});
// Get the width of this column
header = this.header();
width = $(header).width();
if ( existingSetting !== -1 ) {
// Update the width
userColumnDefs[existingSetting].width = width;
} else {
// Add the width for this column
userColumnDefs.push({
targets: targets,
width: width,
});
}
});
// Save (or update) the settings in localStorage
localStorage.setItem(tableId, JSON.stringify(userColumnDefs));
}
let naturalAsc = $.fn.dataTableExt.oSort["natural-ci-asc"]
let naturalDesc = $.fn.dataTableExt.oSort["natural-ci-desc"]
let na_equivalent_vals = ["N/A", "--", "", "NULL"]; //ZS: Since there are multiple values that should be treated the same as N/A
function extractInnerText(the_string){
var span = document.createElement('span');
span.innerHTML = the_string;
return span.textContent || span.innerText;
}
function sortNAs(a, b, sort_function){
if ( na_equivalent_vals.includes(a) && na_equivalent_vals.includes(b)) {
return 0;
}
if (na_equivalent_vals.includes(a)){
return 1
}
if (na_equivalent_vals.includes(b)) {
return -1;
}
return sort_function(a, b)
}
$.extend( $.fn.dataTableExt.oSort, {
"natural-minus-na-asc": function (a, b) {
return sortNAs(extractInnerText(a), extractInnerText(b), naturalAsc)
},
"natural-minus-na-desc": function (a, b) {
return sortNAs(extractInnerText(a), extractInnerText(b), naturalDesc)
}
});
$.fn.dataTable.ext.order['dom-checkbox'] = function ( settings, col )
{
return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
return $('input', td).prop('checked') ? '1' : '0';
} );
};
$.fn.dataTable.ext.order['dom-inner-text'] = function ( settings, col )
{
return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
return $(td).text();
} );
}