// This file initializes the tables for the show_trait page
// This variable is just created to get the column position of the first case attribute (if case attributes exist), since it's needed to set the row classes in createdRow for the DataTable
var attributeStartPos = 3;
if (js_data.se_exists) {
attributeStartPos += 2;
}
if (js_data.has_num_cases === true) {
attributeStartPos += 1;
}
buildColumns = function() {
let columnList = [
{
'data': null,
'orderDataType': "dom-checkbox",
'searchable' : false,
'targets': 0,
'width': "25px",
'render': function() {
return ' '
}
},
{
'title': "ID",
'type': "natural",
'searchable' : false,
'targets': 1,
'width': "35px",
'data': "this_id"
},
{
'title': "Sample",
'type': "natural",
'data': null,
'targets': 2,
'width': "60px",
'render': function(data) {
return '' + data.name + ' '
}
},
{
'title': "
Value
",
'orderDataType': "dom-input",
'type': "cust-txt",
'data': null,
'targets': 3,
'width': "60px",
'render': function(data) {
if (data.value == null) {
return ' '
} else {
if (js_data.no_decimal_place == false) {
return ' '
} else {
return ' '
}
}
}
}
];
attrStart = 4
if (js_data.se_exists) {
attrStart += 2
columnList.push(
{
'bSortable': false,
'type': "natural",
'data': null,
'targets': 4,
'searchable' : false,
'width': "25px",
'render': function() {
return '±'
}
},
{
'title': "SE
",
'orderDataType': "dom-input",
'type': "cust-txt",
'data': null,
'targets': 5,
'width': "60px",
'render': function(data) {
if (data.variance == null) {
return ' '
} else {
return ' '
}
}
}
);
if (js_data.has_num_cases === true) {
attrStart += 1
columnList.push(
{
'title': "N
",
'orderDataType': "dom-input",
'type': "cust-txt",
'data': null,
'targets': 6,
'width': "60px",
'render': function(data) {
if (data.num_cases == null || data.num_cases == undefined) {
return ' '
} else {
return ' '
}
}
}
);
}
}
else {
if (js_data.has_num_cases === true) {
attrStart += 1
columnList.push(
{
'title': "N
",
'orderDataType': "dom-input",
'type': "cust-txt",
'data': null,
'targets': 4,
'width': "60px",
'render': function(data) {
if (data.num_cases == null || data.num_cases == undefined) {
return ' '
} else {
return ' '
}
}
}
);
}
}
attrKeys = Object.keys(js_data.attributes).sort((a, b) => (js_data.attributes[a].id > js_data.attributes[b].id) ? 1 : -1)
for (i = 0; i < attrKeys.length; i++){
columnList.push(
{
'title': "" + js_data.attributes[attrKeys[i]].name + "
",
'type': "natural-minus-na",
'data': null,
'targets': attrStart + i,
'render': function(data, type, row, meta) {
attr_name = Object.keys(data.extra_attributes).sort((a, b) => (parseInt(a) > parseInt(b)) ? 1 : -1)[meta.col - data.first_attr_col]
if (attr_name != null && attr_name != undefined){
if (Array.isArray(data.extra_attributes[attr_name])){
return '' + data.extra_attributes[attr_name][0] + ' '
} else {
return data.extra_attributes[attr_name]
}
} else {
return ""
}
}
}
)
}
return columnList
}
columnDefs = buildColumns();
tableIds = ["samples_primary"]
if (js_data.sample_lists.length > 1) {
tableIds.push("samples_other")
}
for (var i = 0; i < tableIds.length; i++) {
tableId = tableIds[i]
if (tableId == "samples_primary"){
tableType = "Primary"
} else {
tableType = "Other"
}
tableSettings = {
"drawCallback": function( settings ) {
$('#' + tableId + ' tr').off().on("click", function(event) {
if (event.target.type !== 'checkbox' && event.target.tagName.toLowerCase() !== 'a') {
var obj =$(this).find('input');
obj.prop('checked', !obj.is(':checked'));
}
if ($(this).hasClass("selected") && event.target.tagName.toLowerCase() !== 'a'){
$(this).removeClass("selected")
} else if (event.target.tagName.toLowerCase() !== 'a') {
$(this).addClass("selected")
}
});
},
'createdRow': function ( row, data, index ) {
$(row).attr('id', tableType + "_" + data.this_id)
$(row).addClass("value_se");
if (data.outlier) {
$(row).addClass("outlier");
$(row).attr("style", "background-color: orange;");
}
$('td', row).eq(1).addClass("column_name-Index")
$('td', row).eq(2).addClass("column_name-Sample")
$('td', row).eq(3).addClass("column_name-Value")
if (js_data.se_exists) {
$('td', row).eq(5).addClass("column_name-SE")
if (js_data.has_num_cases === true) {
$('td', row).eq(6).addClass("column_name-num_cases")
} else {
if (js_data.has_num_cases === true) {
$('td', row).eq(4).addClass("column_name-num_cases")
}
}
} else {
if (js_data.has_num_cases === true) {
$('td', row).eq(4).addClass("column_name-num_cases")
}
}
for (j=0; j < attrKeys.length; j++) {
$('td', row).eq(attributeStartPos + j + 1).addClass("column_name-" + js_data.attributes[attrKeys[j]].name)
$('td', row).eq(attributeStartPos + j + 1).attr("style", "text-align: " + js_data.attributes[attrKeys[j]].alignment + "; padding-top: 2px; padding-bottom: 0px;")
}
}
}
create_table(tableId, js_data['sample_lists'][i], columnDefs, tableSettings);
// Enable mapping compute buttons and replace their text only after table has loaded
// This is because submitting the form prior to the table loading causes an error
$('button.submit_special').html(' Compute');
$('button.submit_special').prop('disabled', false);
}
primary_table = $('#samples_primary').DataTable();
$('#primary_searchbox').on( 'keyup', function () {
primary_table.search($(this).val()).draw();
} );
if ($('#samples_other').length) {
other_table = $('#samples_other').DataTable();
$('#other_searchbox').on( 'keyup', function () {
other_table.search($(this).val()).draw();
} );
}